GdkPixbuf *CreateStockIcon(const char *stockid, GtkIconSize size) { // FIXME: This code is not 100% correct, because stock pixmap are // context-dependent and may be affected by theme engine, the // correct value can only be obtained for given GtkWidget object. // // Fool-proof implementation of stock bitmaps would extend wxBitmap // with "stock-id" representation (in addition to pixmap and pixbuf // ones) and would convert it to pixbuf when rendered. GtkWidget* widget = wxGTKPrivate::GetButtonWidget(); #ifdef __WXGTK3__ GtkStyleContext* sc = gtk_widget_get_style_context(widget); GtkIconSet* iconset = gtk_style_context_lookup_icon_set(sc, stockid); GdkPixbuf* pixbuf = NULL; if (iconset) pixbuf = gtk_icon_set_render_icon_pixbuf(iconset, sc, size); return pixbuf; #else GtkStyle* style = gtk_widget_get_style(widget); GtkIconSet* iconset = gtk_style_lookup_icon_set(style, stockid); if (!iconset) return NULL; return gtk_icon_set_render_icon(iconset, style, gtk_widget_get_default_direction(), GTK_STATE_NORMAL, size, NULL, NULL); #endif }
static void ensure_stated_surface_from_info (GtkIconHelper *self, GtkStyleContext *context, GtkIconInfo *info, int scale) { GdkPixbuf *destination = NULL; cairo_surface_t *surface; gboolean symbolic; symbolic = FALSE; if (info) destination = gtk_icon_info_load_symbolic_for_context (info, context, &symbolic, NULL); if (destination == NULL) { GtkIconSet *icon_set; G_GNUC_BEGIN_IGNORE_DEPRECATIONS; icon_set = gtk_style_context_lookup_icon_set (context, GTK_STOCK_MISSING_IMAGE); destination = gtk_icon_set_render_icon_pixbuf (icon_set, context, self->priv->icon_size); G_GNUC_END_IGNORE_DEPRECATIONS; } else if (!symbolic) { GdkPixbuf *rendered; rendered = ensure_stated_pixbuf_from_pixbuf (self, context, destination); g_object_unref (destination); destination = rendered; } surface = NULL; if (destination) { surface = gdk_cairo_surface_create_from_pixbuf (destination, scale, self->priv->window); self->priv->rendered_surface_width = (gdk_pixbuf_get_width (destination) + scale - 1) / scale; self->priv->rendered_surface_height = (gdk_pixbuf_get_height (destination) + scale - 1) / scale; g_object_unref (destination); } self->priv->rendered_surface = surface; }
cairo_surface_t * _gtk_icon_helper_ensure_surface (GtkIconHelper *self, GtkStyleContext *context) { cairo_surface_t *surface = NULL; GtkIconSet *icon_set; switch (self->priv->storage_type) { case GTK_IMAGE_SURFACE: ensure_surface_from_surface (self, context); break; case GTK_IMAGE_PIXBUF: ensure_surface_from_pixbuf (self, context); break; case GTK_IMAGE_STOCK: G_GNUC_BEGIN_IGNORE_DEPRECATIONS; icon_set = gtk_style_context_lookup_icon_set (context, self->priv->stock_id); if (icon_set != NULL) ensure_surface_for_icon_set (self, context, icon_set); else surface = NULL; G_GNUC_END_IGNORE_DEPRECATIONS; break; case GTK_IMAGE_ICON_SET: icon_set = self->priv->icon_set; ensure_surface_for_icon_set (self, context, icon_set); break; case GTK_IMAGE_ICON_NAME: case GTK_IMAGE_GICON: ensure_surface_for_icon_name_or_gicon (self, context); break; case GTK_IMAGE_ANIMATION: case GTK_IMAGE_EMPTY: default: surface = NULL; break; } if (surface == NULL && self->priv->rendered_surface != NULL) surface = cairo_surface_reference (self->priv->rendered_surface); return surface; }
GdkPixbuf * _gtk_icon_helper_ensure_pixbuf (GtkIconHelper *self, GtkStyleContext *context) { GdkPixbuf *pixbuf = NULL; GtkIconSet *icon_set; switch (self->priv->storage_type) { case GTK_IMAGE_SURFACE: ensure_pixbuf_from_surface (self, context); break; case GTK_IMAGE_PIXBUF: ensure_pixbuf_at_size (self, context); break; case GTK_IMAGE_STOCK: G_GNUC_BEGIN_IGNORE_DEPRECATIONS; icon_set = gtk_style_context_lookup_icon_set (context, self->priv->stock_id); if (icon_set != NULL) ensure_pixbuf_for_icon_set (self, context, icon_set); else pixbuf = NULL; G_GNUC_END_IGNORE_DEPRECATIONS; break; case GTK_IMAGE_ICON_SET: icon_set = self->priv->icon_set; ensure_pixbuf_for_icon_set (self, context, icon_set); break; case GTK_IMAGE_ICON_NAME: case GTK_IMAGE_GICON: ensure_pixbuf_for_icon_name_or_gicon (self, context); break; case GTK_IMAGE_ANIMATION: case GTK_IMAGE_EMPTY: default: pixbuf = NULL; break; } if (pixbuf == NULL && self->priv->rendered_pixbuf != NULL) pixbuf = g_object_ref (self->priv->rendered_pixbuf); return pixbuf; }
static GdkPixbuf * ensure_stated_icon_from_info (GtkIconHelper *self, GtkStyleContext *context, GtkIconInfo *info) { GdkPixbuf *destination = NULL; gboolean symbolic; symbolic = FALSE; if (info) destination = gtk_icon_info_load_symbolic_for_context (info, context, &symbolic, NULL); if (destination == NULL) { GtkIconSet *icon_set; icon_set = gtk_style_context_lookup_icon_set (context, GTK_STOCK_MISSING_IMAGE); destination = gtk_icon_set_render_icon_pixbuf (icon_set, context, self->priv->icon_size); } else if (!symbolic) { GtkIconSource *source; GdkPixbuf *rendered; source = gtk_icon_source_new (); gtk_icon_source_set_pixbuf (source, destination); /* The size here is arbitrary; since size isn't * wildcarded in the source, it isn't supposed to be * scaled by the engine function */ gtk_icon_source_set_size (source, GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_icon_source_set_size_wildcarded (source, FALSE); rendered = gtk_render_icon_pixbuf (context, source, (GtkIconSize) -1); gtk_icon_source_free (source); g_object_unref (destination); destination = rendered; } return destination; }
GdkPixbuf * _gtk_icon_helper_ensure_pixbuf (GtkIconHelper *self, GtkStyleContext *context) { GdkPixbuf *pixbuf = NULL; GtkIconSet *icon_set; switch (self->priv->storage_type) { case GTK_IMAGE_PIXBUF: pixbuf = g_object_ref (self->priv->orig_pixbuf); break; case GTK_IMAGE_STOCK: icon_set = gtk_style_context_lookup_icon_set (context, self->priv->stock_id); ensure_pixbuf_for_icon_set (self, context, icon_set); break; case GTK_IMAGE_ICON_SET: icon_set = self->priv->icon_set; ensure_pixbuf_for_icon_set (self, context, icon_set); break; case GTK_IMAGE_ICON_NAME: case GTK_IMAGE_GICON: ensure_pixbuf_for_icon_name_or_gicon (self, context); break; case GTK_IMAGE_ANIMATION: case GTK_IMAGE_EMPTY: default: pixbuf = NULL; break; } if (pixbuf == NULL && self->priv->rendered_pixbuf != NULL) pixbuf = g_object_ref (self->priv->rendered_pixbuf); return pixbuf; }
void pidgin_stock_load_stock_icon_theme(PidginStockIconTheme *theme) { GtkIconFactory *icon_factory; gsize i; GtkWidget *win; if (theme != NULL) { purple_prefs_set_string(PIDGIN_PREFS_ROOT "/stock/icon-theme", purple_theme_get_name(PURPLE_THEME(theme))); purple_prefs_set_path(PIDGIN_PREFS_ROOT "/stock/icon-theme-dir", purple_theme_get_dir(PURPLE_THEME(theme))); } else { purple_prefs_set_string(PIDGIN_PREFS_ROOT "/stock/icon-theme", ""); purple_prefs_set_path(PIDGIN_PREFS_ROOT "/stock/icon-theme-dir", ""); } icon_factory = gtk_icon_factory_new(); gtk_icon_factory_add_default(icon_factory); win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_realize(win); /* All non-sized icons */ for (i = 0; i < G_N_ELEMENTS(stock_icons); i++) { GtkIconSource *source; GtkIconSet *iconset; gchar *filename; if (stock_icons[i].dir == NULL) { /* GTK+ Stock icon */ iconset = gtk_style_context_lookup_icon_set(gtk_widget_get_style_context(win), stock_icons[i].filename); } else { filename = find_file(stock_icons[i].dir, stock_icons[i].filename); if (filename == NULL) continue; source = gtk_icon_source_new(); gtk_icon_source_set_filename(source, filename); gtk_icon_source_set_direction_wildcarded(source, TRUE); gtk_icon_source_set_size_wildcarded(source, TRUE); gtk_icon_source_set_state_wildcarded(source, TRUE); iconset = gtk_icon_set_new(); gtk_icon_set_add_source(iconset, source); gtk_icon_source_free(source); g_free(filename); } gtk_icon_factory_add(icon_factory, stock_icons[i].name, iconset); gtk_icon_set_unref(iconset); } /* All non-status sized icons */ for (i = 0; i < G_N_ELEMENTS(sized_stock_icons); i++) { GtkIconSet *iconset = gtk_icon_set_new(); #define ADD_SIZED_ICON(name, size) \ if (sized_stock_icons[i].name) \ add_sized_icon(iconset, name, PIDGIN_ICON_THEME(theme), size, sized_stock_icons[i], FALSE); ADD_SIZED_ICON(microscopic, "11"); ADD_SIZED_ICON(extra_small, "16"); ADD_SIZED_ICON(small, "22"); ADD_SIZED_ICON(medium, "32"); ADD_SIZED_ICON(large, "48"); ADD_SIZED_ICON(huge, "64"); #undef ADD_SIZED_ICON gtk_icon_factory_add(icon_factory, sized_stock_icons[i].name, iconset); gtk_icon_set_unref(iconset); } gtk_widget_destroy(win); g_object_unref(G_OBJECT(icon_factory)); reload_settings(); }