1 From e9dfba023f756801f8931a08644c23809cb38412 Mon Sep 17 00:00:00 2001
2 From: Carlos Garnacho <carlosg@gnome.org>
3 Date: Tue, 12 Feb 2013 13:59:09 +0100
4 Subject: [PATCH 56/68] iconfactory: Add _scaled() variants
6 These functions can be used to deal with stock icons
7 at sizes that are suitable for gdk_window_get_scale_factor()
9 gtk/gtkiconfactory.c | 173 +++++++++++++++++++++++++++++++++++++++-----------
10 gtk/gtkiconfactory.h | 14 +++-
11 2 files changed, 150 insertions(+), 37 deletions(-)
13 diff --git a/gtk/gtkiconfactory.c b/gtk/gtkiconfactory.c
14 index c4b6c9c..0dc31e6 100644
15 --- a/gtk/gtkiconfactory.c
16 +++ b/gtk/gtkiconfactory.c
17 @@ -801,6 +801,7 @@ icon_sizes_init_for_settings (GtkSettings *settings)
19 icon_size_lookup_intern (GtkSettings *settings,
25 @@ -840,10 +841,16 @@ icon_size_lookup_intern (GtkSettings *settings,
29 - *widthp = width_for_settings >= 0 ? width_for_settings : icon_sizes[size].width;
31 + *widthp = width_for_settings >= 0 ? width_for_settings : icon_sizes[size].width;
36 - *heightp = height_for_settings >= 0 ? height_for_settings : icon_sizes[size].height;
38 + *heightp = height_for_settings >= 0 ? height_for_settings : icon_sizes[size].height;
39 + (*heightp) *= scale;
44 @@ -879,7 +886,7 @@ gtk_icon_size_lookup_for_settings (GtkSettings *settings,
46 g_return_val_if_fail (GTK_IS_SETTINGS (settings), FALSE);
48 - return icon_size_lookup_intern (settings, size, width, height);
49 + return icon_size_lookup_intern (settings, size, 1, width, height);
53 @@ -914,6 +921,18 @@ gtk_icon_size_lookup (GtkIconSize size,
54 size, widthp, heightp);
58 +gtk_icon_size_lookup_scaled (GtkSettings *settings,
64 + g_return_val_if_fail (GTK_IS_SETTINGS (settings), FALSE);
66 + return icon_size_lookup_intern (settings, size, scale, width, height);
70 icon_size_register_intern (const gchar *name,
72 @@ -1000,7 +1019,7 @@ gtk_icon_size_register_alias (const gchar *alias,
76 - if (!icon_size_lookup_intern (NULL, target, NULL, NULL))
77 + if (!icon_size_lookup_intern (NULL, target, 1, NULL, NULL))
78 g_warning ("gtk_icon_size_register_alias: Icon size %u does not exist", target);
80 ia = g_hash_table_lookup (icon_aliases, alias);
81 @@ -1288,8 +1307,8 @@ sizes_equivalent (GtkIconSize lhs,
83 gint r_w, r_h, l_w, l_h;
85 - icon_size_lookup_intern (NULL, rhs, &r_w, &r_h);
86 - icon_size_lookup_intern (NULL, lhs, &l_w, &l_h);
87 + icon_size_lookup_intern (NULL, rhs, 1, &r_w, &r_h);
88 + icon_size_lookup_intern (NULL, lhs, 1, &l_w, &l_h);
90 return r_w == l_w && r_h == l_h;
92 @@ -1372,7 +1391,8 @@ render_icon_name_pixbuf (GtkIconSource *icon_source,
98 + gboolean scale_requested)
101 GdkPixbuf *tmp_pixbuf;
102 @@ -1383,6 +1403,7 @@ render_icon_name_pixbuf (GtkIconSource *icon_source,
103 gint width, height, pixel_size;
104 gint *sizes, *s, dist;
105 GError *error = NULL;
108 if (widget && gtk_widget_has_screen (widget))
109 screen = gtk_widget_get_screen (widget);
110 @@ -1398,6 +1419,14 @@ render_icon_name_pixbuf (GtkIconSource *icon_source,
111 icon_theme = gtk_icon_theme_get_for_screen (screen);
112 settings = gtk_settings_get_for_screen (screen);
114 + if (scale_requested && widget)
116 + if (!widget->window)
117 + gtk_widget_realize (widget);
119 + scale = gdk_window_get_scale_factor (widget->window);
122 if (!gtk_icon_size_lookup_for_settings (settings, size, &width, &height))
124 if (size == (GtkIconSize)-1)
125 @@ -1440,7 +1469,7 @@ render_icon_name_pixbuf (GtkIconSource *icon_source,
129 - pixel_size = MIN (width, height);
130 + pixel_size = MIN (width, height) * scale;
132 if (icon_source->direction != GTK_TEXT_DIR_NONE)
134 @@ -1504,7 +1533,8 @@ find_and_render_icon_source (GtkIconSet *icon_set,
138 - const char *detail)
139 + const char *detail,
140 + gboolean scale_requested)
142 GSList *failed = NULL;
143 GdkPixbuf *pixbuf = NULL;
144 @@ -1546,7 +1576,7 @@ find_and_render_icon_source (GtkIconSet *icon_set,
145 case GTK_ICON_SOURCE_STATIC_ICON_NAME:
146 pixbuf = render_icon_name_pixbuf (source, style,
147 direction, state, size,
149 + widget, detail, scale_requested);
151 failed = g_slist_prepend (failed, source);
153 @@ -1598,6 +1628,84 @@ render_fallback_image (GtkStyle *style,
158 +_get_real_scale (GtkWidget *widget,
163 + GtkSettings *settings;
167 + if (widget && gtk_widget_has_screen (widget))
168 + screen = gtk_widget_get_screen (widget);
169 + else if (style && style->colormap)
170 + screen = gdk_colormap_get_screen (style->colormap);
173 + screen = gdk_screen_get_default ();
174 + GTK_NOTE (MULTIHEAD,
175 + g_warning ("Using the default screen for gtk_icon_set_render_icon()"));
178 + settings = gtk_settings_get_for_screen (screen);
179 + gtk_icon_size_lookup_for_settings (settings, size, &icon_width, NULL);
181 + return (gdouble) gdk_pixbuf_get_width (icon) / icon_width;
185 +gtk_icon_set_render_icon_internal (GtkIconSet *icon_set,
187 + GtkTextDirection direction,
188 + GtkStateType state,
191 + const char *detail,
192 + gboolean scale_requested,
193 + gdouble *real_scale)
200 + if (icon_set->sources == NULL)
201 + return render_fallback_image (style, direction, state, size, widget, detail);
203 + if (detail == NULL)
205 + icon = find_in_cache (icon_set, style, direction,
210 + g_object_ref (icon);
212 + if (scale_requested && real_scale)
213 + *real_scale = _get_real_scale (widget, style, size, icon);
220 + icon = find_and_render_icon_source (icon_set, style, direction, state, size,
221 + widget, detail, scale_requested);
224 + icon = render_fallback_image (style, direction, state, size, widget, detail);
226 + if (detail == NULL)
227 + add_to_cache (icon_set, style, direction, state, size, icon);
229 + if (scale_requested && real_scale)
230 + *real_scale = _get_real_scale (widget, style, size, icon);
236 * gtk_icon_set_render_icon:
237 * @icon_set: a #GtkIconSet
238 @@ -1631,37 +1739,30 @@ gtk_icon_set_render_icon (GtkIconSet *icon_set,
244 g_return_val_if_fail (icon_set != NULL, NULL);
245 g_return_val_if_fail (style == NULL || GTK_IS_STYLE (style), NULL);
247 - if (icon_set->sources == NULL)
248 - return render_fallback_image (style, direction, state, size, widget, detail);
250 - if (detail == NULL)
252 - icon = find_in_cache (icon_set, style, direction,
257 - g_object_ref (icon);
263 - icon = find_and_render_icon_source (icon_set, style, direction, state, size,
267 - icon = render_fallback_image (style, direction, state, size, widget, detail);
268 + return gtk_icon_set_render_icon_internal (icon_set, style, direction,
269 + state, size, widget, detail,
273 - if (detail == NULL)
274 - add_to_cache (icon_set, style, direction, state, size, icon);
276 +gtk_icon_set_render_icon_scaled (GtkIconSet *icon_set,
278 + GtkTextDirection direction,
279 + GtkStateType state,
282 + const char *detail,
283 + gdouble *real_scale)
285 + g_return_val_if_fail (icon_set != NULL, NULL);
286 + g_return_val_if_fail (style == NULL || GTK_IS_STYLE (style), NULL);
289 + return gtk_icon_set_render_icon_internal (icon_set, style, direction,
290 + state, size, widget, detail,
294 /* Order sources by their "wildness", so that "wilder" sources are
295 diff --git a/gtk/gtkiconfactory.h b/gtk/gtkiconfactory.h
296 index ea97123..e38f8e6 100644
297 --- a/gtk/gtkiconfactory.h
298 +++ b/gtk/gtkiconfactory.h
299 @@ -105,6 +105,11 @@ gboolean gtk_icon_size_lookup_for_settings (GtkSettings *settings,
303 +gboolean gtk_icon_size_lookup_scaled (GtkSettings *settings,
309 GtkIconSize gtk_icon_size_register (const gchar *name,
311 @@ -134,7 +139,14 @@ GdkPixbuf* gtk_icon_set_render_icon (GtkIconSet *icon_set,
316 +GdkPixbuf* gtk_icon_set_render_icon_scaled (GtkIconSet *icon_set,
318 + GtkTextDirection direction,
319 + GtkStateType state,
322 + const char *detail,
323 + gdouble *real_scale);
325 void gtk_icon_set_add_source (GtkIconSet *icon_set,
326 const GtkIconSource *source);
328 1.7.10.2 (Apple Git-33)