/** * shell_app_info_create_icon_texture: * * Look up the icon for this application, and create a #ClutterTexture * for it at the given size. * * Return value: (transfer none): A floating #ClutterActor */ ClutterActor * shell_app_info_create_icon_texture (ShellAppInfo *info, float size) { GIcon *icon; ClutterActor *ret; if (info->type == SHELL_APP_INFO_TYPE_WINDOW) { return st_texture_cache_bind_pixbuf_property (st_texture_cache_get_default (), G_OBJECT (info->window), "icon"); } icon = shell_app_info_get_icon (info); if (icon == NULL) { ret = clutter_texture_new (); g_object_set (ret, "opacity", 0, "width", size, "height", size, NULL); } else { ret = st_texture_cache_load_gicon (st_texture_cache_get_default (), icon, (int)size); g_object_unref (icon); } return ret; }
/** * cinnamon_app_create_icon_texture: * * Look up the icon for this application, and create a #ClutterTexture * for it at the given size. * * Return value: (transfer none): A floating #ClutterActor */ ClutterActor * cinnamon_app_create_icon_texture (CinnamonApp *app, int size) { GIcon *icon; ClutterActor *ret; ret = NULL; if (app->entry == NULL) return window_backed_app_get_icon (app, size); icon = g_app_info_get_icon (G_APP_INFO (gmenu_tree_entry_get_app_info (app->entry))); if (icon != NULL) ret = st_texture_cache_load_gicon (st_texture_cache_get_default (), NULL, icon, size); if (ret == NULL) { icon = g_themed_icon_new ("application-x-executable"); ret = st_texture_cache_load_gicon (st_texture_cache_get_default (), NULL, icon, size); g_object_unref (icon); } return ret; }
/** * shell_app_info_create_icon_texture: * * Look up the icon for this application, and create a #ClutterTexture * for it at the given size. * * Return value: (transfer none): A floating #ClutterActor */ ClutterActor * shell_app_info_create_icon_texture (ShellAppInfo *info, float size) { GIcon *icon; ClutterActor *ret; ret = NULL; if (info->type == SHELL_APP_INFO_TYPE_WINDOW) { ret = st_texture_cache_bind_pixbuf_property (st_texture_cache_get_default (), G_OBJECT (info->window), "icon"); } else { icon = shell_app_info_get_icon (info); if (icon != NULL) { ret = st_texture_cache_load_gicon (st_texture_cache_get_default (), NULL, icon, (int)size); g_object_unref (icon); } } if (ret == NULL) { icon = g_themed_icon_new ("application-x-executable"); ret = st_texture_cache_load_gicon (st_texture_cache_get_default (), NULL, icon, (int)size); g_object_unref (icon); } return ret; }
static ClutterActor * window_backed_app_get_icon (CinnamonApp *app, int size) { MetaWindow *window; ClutterActor *actor; gint scale; CinnamonGlobal *global; StThemeContext *context; global = cinnamon_global_get (); context = st_theme_context_get_for_stage (cinnamon_global_get_stage (global)); g_object_get (context, "scale-factor", &scale, NULL); size *= scale; /* During a state transition from running to not-running for * window-backend apps, it's possible we get a request for the icon. * Avoid asserting here and just return an empty image. */ if (app->running_state == NULL) { actor = clutter_texture_new (); g_object_set (actor, "opacity", 0, "width", (float) size, "height", (float) size, NULL); return actor; } window = window_backed_app_get_window (app); actor = st_texture_cache_bind_pixbuf_property (st_texture_cache_get_default (), G_OBJECT (window), "icon"); g_object_set (actor, "width", (float) size, "height", (float) size, NULL); return actor; }
static void _st_entry_set_icon_from_file (StEntry *entry, ClutterActor **icon, const gchar *filename) { ClutterActor *new_icon = NULL; if (filename) { StTextureCache *cache; GFile *file; gchar *uri; cache = st_texture_cache_get_default (); file = g_file_new_for_path (filename); uri = g_file_get_uri (file); g_object_unref (file); new_icon = (ClutterActor*) st_texture_cache_load_uri_async (cache, uri, -1, -1); g_free (uri); } _st_entry_set_icon (entry, icon, new_icon); }
/** * shell_startup_sequence_create_icon: * @sequence: * @size: Size in pixels of icon * * Returns: (transfer none): A new #ClutterTexture containing an icon for the sequence */ ClutterActor * shell_startup_sequence_create_icon (ShellStartupSequence *sequence, guint size) { GIcon *themed; const char *icon_name; ClutterActor *texture; gint scale; ShellGlobal *global; StThemeContext *context; global = shell_global_get (); context = st_theme_context_get_for_stage (shell_global_get_stage (global)); g_object_get (context, "scale-factor", &scale, NULL); icon_name = sn_startup_sequence_get_icon_name ((SnStartupSequence*)sequence); if (!icon_name) { texture = clutter_texture_new (); clutter_actor_set_size (texture, size * scale, size * scale); return texture; } themed = g_themed_icon_new (icon_name); texture = st_texture_cache_load_gicon (st_texture_cache_get_default (), NULL, themed, size, scale); g_object_unref (G_OBJECT (themed)); return texture; }
static void st_icon_update (StIcon *icon) { StIconPrivate *priv = icon->priv; StThemeNode *theme_node; StTextureCache *cache; if (priv->pending_texture) { clutter_actor_destroy (priv->pending_texture); g_object_unref (priv->pending_texture); priv->pending_texture = NULL; priv->opacity_handler_id = 0; } theme_node = st_widget_peek_theme_node (ST_WIDGET (icon)); if (theme_node == NULL) return; cache = st_texture_cache_get_default (); if (priv->gicon) { priv->pending_texture = st_texture_cache_load_gicon (cache, (priv->icon_type != ST_ICON_APPLICATION && priv->icon_type != ST_ICON_DOCUMENT) ? theme_node : NULL, priv->gicon, priv->icon_size); } else if (priv->icon_name) { priv->pending_texture = st_texture_cache_load_icon_name (cache, theme_node, priv->icon_name, priv->icon_type, priv->icon_size); } if (priv->pending_texture) { g_object_ref_sink (priv->pending_texture); if (clutter_actor_get_opacity (priv->pending_texture) != 0 || priv->icon_texture == NULL) { /* This icon is ready for showing, or nothing else is already showing */ st_icon_finish_update (icon); } else { /* Will be shown when fully loaded */ priv->opacity_handler_id = g_signal_connect (priv->pending_texture, "notify::opacity", G_CALLBACK (opacity_changed_cb), icon); } } else if (priv->icon_texture) { clutter_actor_destroy (priv->icon_texture); priv->icon_texture = NULL; } }
/** * cinnamon_app_get_faded_icon: * @app: A #CinnamonApp * @size: Size in pixels * * Return an actor with a horizontally faded look. * * Return value: (transfer none): A floating #ClutterActor, or %NULL if no icon */ ClutterActor * cinnamon_app_get_faded_icon (CinnamonApp *app, int size) { CoglHandle texture; ClutterActor *result; char *cache_key; CreateFadedIconData data; gint scale; CinnamonGlobal *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->entry) return window_backed_app_get_icon (app, size); global = cinnamon_global_get (); context = st_theme_context_get_for_stage (cinnamon_global_get_stage (global)); g_object_get (context, "scale-factor", &scale, NULL); cache_key = g_strdup_printf ("faded-icon:%s,size=%d,scale=%d", cinnamon_app_get_id (app), size, scale); data.app = app; data.size = size; data.scale = scale; texture = st_texture_cache_load (st_texture_cache_get_default (), cache_key, ST_TEXTURE_CACHE_POLICY_FOREVER, cinnamon_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; }
/** * shell_startup_sequence_create_icon: * @sequence: * @size: Size in pixels of icon * * Returns: (transfer none): A new #ClutterTexture containing an icon for the sequence */ ClutterActor * shell_startup_sequence_create_icon (ShellStartupSequence *sequence, guint size) { GIcon *themed; const char *icon_name; ClutterActor *texture; icon_name = sn_startup_sequence_get_icon_name ((SnStartupSequence*)sequence); if (!icon_name) { texture = clutter_texture_new (); clutter_actor_set_size (texture, size, size); return texture; } themed = g_themed_icon_new (icon_name); texture = st_texture_cache_load_gicon (st_texture_cache_get_default (), themed, size); g_object_unref (G_OBJECT (themed)); return texture; }
static void st_theme_context_init (StThemeContext *context) { context->font = pango_font_description_from_string (DEFAULT_FONT); g_signal_connect (st_texture_cache_get_default (), "icon-theme-changed", G_CALLBACK (on_icon_theme_changed), context); g_signal_connect_swapped (clutter_get_default_backend (), "resolution-changed", G_CALLBACK (st_theme_context_changed), context); context->nodes = g_hash_table_new_full ((GHashFunc) st_theme_node_hash, (GEqualFunc) st_theme_node_equal, g_object_unref, NULL); context->scale_factor = 1; }
static void st_theme_context_finalize (GObject *object) { StThemeContext *context = ST_THEME_CONTEXT (object); g_signal_handlers_disconnect_by_func (st_texture_cache_get_default (), (gpointer) on_icon_theme_changed, context); g_signal_handlers_disconnect_by_func (clutter_get_default_backend (), (gpointer) st_theme_context_changed, context); if (context->nodes) g_hash_table_unref (context->nodes); if (context->root_node) g_object_unref (context->root_node); if (context->theme) g_object_unref (context->theme); pango_font_description_free (context->font); G_OBJECT_CLASS (st_theme_context_parent_class)->finalize (object); }
static void st_icon_update (StIcon *icon) { StIconPrivate *priv = icon->priv; StThemeNode *theme_node; StTextureCache *cache; gint scale; ClutterActor *stage; StThemeContext *context; if (priv->pending_texture) { clutter_actor_destroy (priv->pending_texture); g_object_unref (priv->pending_texture); priv->pending_texture = NULL; priv->opacity_handler_id = 0; } theme_node = st_widget_peek_theme_node (ST_WIDGET (icon)); if (theme_node == NULL) return; stage = clutter_actor_get_stage (CLUTTER_ACTOR (icon)); context = st_theme_context_get_for_stage (CLUTTER_STAGE (stage)); g_object_get (context, "scale-factor", &scale, NULL); cache = st_texture_cache_get_default (); if (priv->gicon != NULL) priv->pending_texture = st_texture_cache_load_gicon (cache, theme_node, priv->gicon, priv->icon_size, scale); if (priv->pending_texture == NULL && priv->fallback_gicon != NULL) priv->pending_texture = st_texture_cache_load_gicon (cache, theme_node, priv->fallback_gicon, priv->icon_size, scale); if (priv->pending_texture) { g_object_ref_sink (priv->pending_texture); if (clutter_actor_get_opacity (priv->pending_texture) != 0 || priv->icon_texture == NULL) { /* This icon is ready for showing, or nothing else is already showing */ st_icon_finish_update (icon); } else { /* Will be shown when fully loaded */ priv->opacity_handler_id = g_signal_connect_object (priv->pending_texture, "notify::opacity", G_CALLBACK (opacity_changed_cb), icon, 0); } } else if (priv->icon_texture) { clutter_actor_destroy (priv->icon_texture); priv->icon_texture = NULL; } }