/* Finds the largest size at which the given image stock id is * available. This would not be useful for a normal application */ static GtkIconSize get_largest_size (const char *id) { GtkIconSet *set = gtk_icon_factory_lookup_default (id); GtkIconSize *sizes; gint n_sizes, i; GtkIconSize best_size = GTK_ICON_SIZE_INVALID; gint best_pixels = 0; gtk_icon_set_get_sizes (set, &sizes, &n_sizes); for (i = 0; i < n_sizes; i++) { gint width, height; gtk_icon_size_lookup (sizes[i], &width, &height); if (width * height > best_pixels) { best_size = sizes[i]; best_pixels = width * height; } } g_free (sizes); return best_size; }
static void check_visible_sizes (const gchar *stock_id, gboolean show_all) { GtkIconSet *icon_set; GtkIconSize *sizes; gint n_sizes, i, j; GtkWidget *option_menu, *menu; gboolean item_visible[G_N_ELEMENTS(GladeIconSizeValues)]; GList *children; for (j = 0; j < GladeIconSizeChoicesSize; j++) item_visible[j] = show_all; if (!show_all) { icon_set = gtk_icon_factory_lookup_default (stock_id); if (icon_set) { gtk_icon_set_get_sizes (icon_set, &sizes, &n_sizes); /* Figure out which of our choices should be visible. */ for (i = 0; i < n_sizes; i++) { for (j = 0; j < GladeIconSizeChoicesSize; j++) { if (sizes[i] == GladeIconSizeValues[j]) item_visible[j] = TRUE; } } g_free (sizes); } } /* Show or Hide the items as appropriate. */ option_menu = property_get_value_widget (IconSize); g_return_if_fail (GTK_IS_OPTION_MENU (option_menu)); menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (option_menu)); g_return_if_fail (GTK_IS_MENU (menu)); children = GTK_MENU_SHELL (menu)->children; for (j = 0; j < GladeIconSizeChoicesSize; j++) { GtkWidget *item; item = children->data; if (item_visible[j]) gtk_widget_show (item); else gtk_widget_hide (item); children = children->next; } }
static VALUE rg_sizes(VALUE self) { GtkIconSize *sizes; gint n_sizes; VALUE result; int n; gtk_icon_set_get_sizes(_SELF(self), &sizes, &n_sizes); result = rb_ary_new(); for(n=0; n<n_sizes; n++, sizes++) rb_ary_push(result, GENUM2RVAL(*sizes, GTK_TYPE_ICON_SIZE)); return result; }
/* Check the icon size is valid for the stock item, and if not pick the first valid size. */ static GtkIconSize check_icon_size (const gchar *stock_id, GtkIconSize icon_size) { GtkIconSet *icon_set; GtkIconSize *sizes, retval = GTK_ICON_SIZE_BUTTON; gint n_sizes, i; icon_set = gtk_icon_factory_lookup_default (stock_id); if (icon_set) { gtk_icon_set_get_sizes (icon_set, &sizes, &n_sizes); for (i = 0; i < n_sizes; i++) { if (sizes[i] == icon_size) return icon_size; } retval = sizes[0]; g_free (sizes); } return retval; }
GtkIconSize gimp_get_icon_size (GtkWidget *widget, const gchar *stock_id, GtkIconSize max_size, gint width, gint height) { GtkIconSet *icon_set; GtkIconSize *sizes; gint n_sizes; gint i; gint width_diff = 1024; gint height_diff = 1024; gint max_width; gint max_height; GtkIconSize icon_size = GTK_ICON_SIZE_MENU; GtkSettings *settings; g_return_val_if_fail (GTK_IS_WIDGET (widget), icon_size); g_return_val_if_fail (stock_id != NULL, icon_size); g_return_val_if_fail (width > 0, icon_size); g_return_val_if_fail (height > 0, icon_size); icon_set = gtk_style_lookup_icon_set (gtk_widget_get_style (widget), stock_id); if (! icon_set) return GTK_ICON_SIZE_INVALID; settings = gtk_widget_get_settings (widget); if (! gtk_icon_size_lookup_for_settings (settings, max_size, &max_width, &max_height)) { max_width = 1024; max_height = 1024; } gtk_icon_set_get_sizes (icon_set, &sizes, &n_sizes); for (i = 0; i < n_sizes; i++) { gint icon_width; gint icon_height; if (gtk_icon_size_lookup_for_settings (settings, sizes[i], &icon_width, &icon_height)) { if (icon_width <= width && icon_height <= height && icon_width <= max_width && icon_height <= max_height && ((width - icon_width) < width_diff || (height - icon_height) < height_diff)) { width_diff = width - icon_width; height_diff = height - icon_height; icon_size = sizes[i]; } } } g_free (sizes); return icon_size; }
static GtkTreeModel* create_model (void) { GtkListStore *store; GSList *ids; GSList *tmp_list; store = gtk_list_store_new (2, STOCK_ITEM_INFO_TYPE, G_TYPE_STRING); ids = gtk_stock_list_ids (); ids = g_slist_sort (ids, (GCompareFunc) strcmp); tmp_list = ids; while (tmp_list != NULL) { StockItemInfo info; GtkStockItem item; GtkTreeIter iter; GtkIconSet *icon_set; info.id = tmp_list->data; if (gtk_stock_lookup (info.id, &item)) { info.item = item; } else { info.item.label = NULL; info.item.stock_id = NULL; info.item.modifier = 0; info.item.keyval = 0; info.item.translation_domain = NULL; } /* only show icons for stock IDs that have default icons */ icon_set = gtk_icon_factory_lookup_default (info.id); if (icon_set) { GtkIconSize *sizes = NULL; gint n_sizes = 0; gint i; GtkIconSize size; /* See what sizes this stock icon really exists at */ gtk_icon_set_get_sizes (icon_set, &sizes, &n_sizes); /* Use menu size if it exists, otherwise first size found */ size = sizes[0]; i = 0; while (i < n_sizes) { if (sizes[i] == GTK_ICON_SIZE_MENU) { size = GTK_ICON_SIZE_MENU; break; } ++i; } g_free (sizes); info.small_icon = gtk_widget_render_icon (window, info.id, size, NULL); if (size != GTK_ICON_SIZE_MENU) { /* Make the result the proper size for our thumbnail */ gint w, h; GdkPixbuf *scaled; gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &w, &h); scaled = gdk_pixbuf_scale_simple (info.small_icon, w, h, GDK_INTERP_BILINEAR); g_object_unref (info.small_icon); info.small_icon = scaled; } } else info.small_icon = NULL; if (info.item.keyval != 0) { info.accel_str = gtk_accelerator_name (info.item.keyval, info.item.modifier); } else { info.accel_str = g_strdup (""); } info.macro = id_to_macro (info.id); gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, &info, 1, info.id, -1); g_free (info.macro); g_free (info.accel_str); if (info.small_icon) g_object_unref (info.small_icon); tmp_list = g_slist_next (tmp_list); } g_slist_foreach (ids, (GFunc)g_free, NULL); g_slist_free (ids); return GTK_TREE_MODEL (store); }