diff --git a/src/shell-app.c b/src/shell-app.c index 60be10042..818c901b8 100644 --- a/src/shell-app.c +++ b/src/shell-app.c @@ -240,190 +240,6 @@ typedef struct { StThemeNode *theme_node; } CreateFadedIconData; -static CoglHandle -shell_app_create_faded_icon_cpu (StTextureCache *cache, - const char *key, - void *datap, - GError **error) -{ - ClutterBackend *backend = clutter_get_default_backend (); - CoglContext *ctx = clutter_backend_get_cogl_context (backend); - CreateFadedIconData *data = datap; - ShellApp *app; - GdkPixbuf *pixbuf; - int size; - int scale; - CoglHandle texture; - gint width, height, rowstride; - guint8 n_channels; - gboolean have_alpha; - gint fade_start; - gint fade_end; - guint i, j; - guint pixbuf_byte_size; - guint8 *orig_pixels; - guint8 *pixels; - GIcon *icon; - GtkIconInfo *info; - GtkIconLookupFlags lookup_flags; - StIconStyle icon_style; - - app = data->app; - size = data->size; - scale = data->scale; - icon_style = st_theme_node_get_icon_style (data->theme_node); - - info = NULL; - - lookup_flags = GTK_ICON_LOOKUP_FORCE_SIZE; - if (icon_style == ST_ICON_STYLE_REGULAR) - lookup_flags |= GTK_ICON_LOOKUP_FORCE_REGULAR; - else if (icon_style == ST_ICON_STYLE_SYMBOLIC) - lookup_flags |= GTK_ICON_LOOKUP_FORCE_SYMBOLIC; - - icon = g_app_info_get_icon (G_APP_INFO (app->info)); - if (icon != NULL) - { - info = gtk_icon_theme_lookup_by_gicon_for_scale (gtk_icon_theme_get_default (), - icon, size, scale, - lookup_flags); - } - - if (info == NULL) - { - icon = g_themed_icon_new ("application-x-executable"); - info = gtk_icon_theme_lookup_by_gicon_for_scale (gtk_icon_theme_get_default (), - icon, size, scale, - lookup_flags); - g_object_unref (icon); - } - - if (info == NULL) - return COGL_INVALID_HANDLE; - - pixbuf = gtk_icon_info_load_icon (info, NULL); - g_object_unref (info); - - if (pixbuf == NULL) - return COGL_INVALID_HANDLE; - - width = gdk_pixbuf_get_width (pixbuf); - height = gdk_pixbuf_get_height (pixbuf); - rowstride = gdk_pixbuf_get_rowstride (pixbuf); - n_channels = gdk_pixbuf_get_n_channels (pixbuf); - orig_pixels = gdk_pixbuf_get_pixels (pixbuf); - have_alpha = gdk_pixbuf_get_has_alpha (pixbuf); - - pixbuf_byte_size = (height - 1) * rowstride + - + width * ((n_channels * gdk_pixbuf_get_bits_per_sample (pixbuf) + 7) / 8); - - pixels = g_malloc0 (rowstride * height); - memcpy (pixels, orig_pixels, pixbuf_byte_size); - - /* fade on the right side for LTR, left side for RTL */ - if (data->direction == CLUTTER_TEXT_DIRECTION_LTR) - { - fade_start = width / 2; - fade_end = width; - } - else - { - fade_start = 0; - fade_end = width / 2; - } - - for (i = fade_start; i < fade_end; i++) - { - for (j = 0; j < height; j++) - { - guchar *pixel = &pixels[j * rowstride + i * n_channels]; - float fade = ((float) i - fade_start) / (fade_end - fade_start); - if (data->direction == CLUTTER_TEXT_DIRECTION_LTR) - fade = 1.0 - fade; - pixel[0] = 0.5 + pixel[0] * fade; - pixel[1] = 0.5 + pixel[1] * fade; - pixel[2] = 0.5 + pixel[2] * fade; - if (have_alpha) - pixel[3] = 0.5 + pixel[3] * fade; - } - } - - texture = COGL_TEXTURE (cogl_texture_2d_new_from_data (ctx, width, height, - have_alpha ? COGL_PIXEL_FORMAT_RGBA_8888 : COGL_PIXEL_FORMAT_RGB_888, - rowstride, - pixels, - NULL)); - g_free (pixels); - g_object_unref (pixbuf); - - return texture; -} - -/** - * shell_app_get_faded_icon: - * @app: A #ShellApp - * @size: Size in pixels - * @direction: Whether to fade on the left or right - * - * Return an actor with a horizontally faded look. - * - * Return value: (transfer none): A floating #ClutterActor, or %NULL if no icon - */ -ClutterActor * -shell_app_get_faded_icon (ShellApp *app, int size, ClutterTextDirection direction) -{ - CoglHandle texture; - ClutterActor *result; - char *cache_key; - CreateFadedIconData data; - gint scale; - ShellGlobal *global; - StThemeContext *context; - - /* Don't fade for window backed apps for now...easier to reuse the - * property tracking bits, and this helps us visually distinguish - * app-tracked from not. - */ - if (!app->info) - return window_backed_app_get_icon (app, size); - - global = shell_global_get (); - context = st_theme_context_get_for_stage (shell_global_get_stage (global)); - g_object_get (context, "scale-factor", &scale, NULL); - - /* Use icon: prefix so that we get evicted from the cache on - * icon theme changes. */ - cache_key = g_strdup_printf ("icon:%s,size=%d,scale=%d,faded-%s", - shell_app_get_id (app), - size, scale, - direction == CLUTTER_TEXT_DIRECTION_RTL ? "rtl" : "ltr"); - data.app = app; - data.size = size; - data.scale = scale; - data.direction = direction; - data.theme_node = st_theme_context_get_root_node (context); - texture = st_texture_cache_load (st_texture_cache_get_default (), - cache_key, - ST_TEXTURE_CACHE_POLICY_FOREVER, - shell_app_create_faded_icon_cpu, - &data, - NULL); - g_free (cache_key); - - if (texture != COGL_INVALID_HANDLE) - { - result = clutter_texture_new (); - clutter_texture_set_cogl_texture (CLUTTER_TEXTURE (result), texture); - } - else - { - result = clutter_texture_new (); - g_object_set (result, "opacity", 0, "width", (float) size * scale, "height", (float) size * scale, NULL); - - } - return result; -} - const char * shell_app_get_name (ShellApp *app) { diff --git a/src/shell-app.h b/src/shell-app.h index 2916331cb..42594cb44 100644 --- a/src/shell-app.h +++ b/src/shell-app.h @@ -40,7 +40,6 @@ const char *shell_app_get_id (ShellApp *app); GDesktopAppInfo *shell_app_get_app_info (ShellApp *app); ClutterActor *shell_app_create_icon_texture (ShellApp *app, int size); -ClutterActor *shell_app_get_faded_icon (ShellApp *app, int size, ClutterTextDirection direction); const char *shell_app_get_name (ShellApp *app); const char *shell_app_get_description (ShellApp *app); gboolean shell_app_is_window_backed (ShellApp *app);