Transfer the Mac SDK bockbuild profiles & resources inside the Mono repository.
[mono.git] / bockbuild / mac-sdk / patches / gtk / 0056-iconfactory-Add-_scaled-variants.patch
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
5
6 These functions can be used to deal with stock icons
7 at sizes that are suitable for gdk_window_get_scale_factor()
8 ---
9  gtk/gtkiconfactory.c |  173 +++++++++++++++++++++++++++++++++++++++-----------
10  gtk/gtkiconfactory.h |   14 +++-
11  2 files changed, 150 insertions(+), 37 deletions(-)
12
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)
18  static gboolean
19  icon_size_lookup_intern (GtkSettings *settings,
20                          GtkIconSize  size,
21 +                         gdouble      scale,
22                          gint        *widthp,
23                          gint        *heightp)
24  {
25 @@ -840,10 +841,16 @@ icon_size_lookup_intern (GtkSettings *settings,
26      }
27
28    if (widthp)
29 -    *widthp = width_for_settings >= 0 ? width_for_settings : icon_sizes[size].width;
30 +    {
31 +      *widthp = width_for_settings >= 0 ? width_for_settings : icon_sizes[size].width;
32 +      (*widthp) *= scale;
33 +    }
34
35    if (heightp)
36 -    *heightp = height_for_settings >= 0 ? height_for_settings : icon_sizes[size].height;
37 +    {
38 +      *heightp = height_for_settings >= 0 ? height_for_settings : icon_sizes[size].height;
39 +      (*heightp) *= scale;
40 +    }
41
42    return TRUE;
43  }
44 @@ -879,7 +886,7 @@ gtk_icon_size_lookup_for_settings (GtkSettings *settings,
45  {
46    g_return_val_if_fail (GTK_IS_SETTINGS (settings), FALSE);
47
48 -  return icon_size_lookup_intern (settings, size, width, height);
49 +  return icon_size_lookup_intern (settings, size, 1, width, height);
50  }
51
52  /**
53 @@ -914,6 +921,18 @@ gtk_icon_size_lookup (GtkIconSize  size,
54                                             size, widthp, heightp);
55  }
56
57 +gboolean
58 +gtk_icon_size_lookup_scaled (GtkSettings *settings,
59 +                             GtkIconSize  size,
60 +                             gdouble      scale,
61 +                             gint        *width,
62 +                             gint        *height)
63 +{
64 +  g_return_val_if_fail (GTK_IS_SETTINGS (settings), FALSE);
65 +
66 +  return icon_size_lookup_intern (settings, size, scale, width, height);
67 +}
68 +
69  static GtkIconSize
70  icon_size_register_intern (const gchar *name,
71                            gint         width,
72 @@ -1000,7 +1019,7 @@ gtk_icon_size_register_alias (const gchar *alias,
73
74    init_icon_sizes ();
75
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);
79
80    ia = g_hash_table_lookup (icon_aliases, alias);
81 @@ -1288,8 +1307,8 @@ sizes_equivalent (GtkIconSize lhs,
82
83    gint r_w, r_h, l_w, l_h;
84
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);
89
90    return r_w == l_w && r_h == l_h;
91  #endif
92 @@ -1372,7 +1391,8 @@ render_icon_name_pixbuf (GtkIconSource    *icon_source,
93                          GtkStateType      state,
94                          GtkIconSize       size,
95                          GtkWidget        *widget,
96 -                        const char       *detail)
97 +                        const char       *detail,
98 +                         gboolean          scale_requested)
99  {
100    GdkPixbuf *pixbuf;
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;
106 +  gdouble scale = 1;
107
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);
113
114 +  if (scale_requested && widget)
115 +    {
116 +      if (!widget->window)
117 +        gtk_widget_realize (widget);
118 +
119 +      scale = gdk_window_get_scale_factor (widget->window);
120 +    }
121 +
122    if (!gtk_icon_size_lookup_for_settings (settings, size, &width, &height))
123      {
124        if (size == (GtkIconSize)-1)
125 @@ -1440,7 +1469,7 @@ render_icon_name_pixbuf (GtkIconSource    *icon_source,
126         }
127      }
128
129 -  pixel_size = MIN (width, height);
130 +  pixel_size = MIN (width, height) * scale;
131
132    if (icon_source->direction != GTK_TEXT_DIR_NONE)
133      {
134 @@ -1504,7 +1533,8 @@ find_and_render_icon_source (GtkIconSet       *icon_set,
135                              GtkStateType      state,
136                              GtkIconSize       size,
137                              GtkWidget         *widget,
138 -                            const char        *detail)
139 +                            const char        *detail,
140 +                             gboolean           scale_requested)
141  {
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,
148 -                                           widget, detail);
149 +                                           widget, detail, scale_requested);
150           if (!pixbuf)
151             failed = g_slist_prepend (failed, source);
152           break;
153 @@ -1598,6 +1628,84 @@ render_fallback_image (GtkStyle          *style,
154                                  detail);
155  }
156
157 +static gdouble
158 +_get_real_scale (GtkWidget   *widget,
159 +                 GtkStyle    *style,
160 +                 GtkIconSize  size,
161 +                 GdkPixbuf   *icon)
162 +{
163 +  GtkSettings *settings;
164 +  GdkScreen *screen;
165 +  gint icon_width;
166 +
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);
171 +  else
172 +    {
173 +      screen = gdk_screen_get_default ();
174 +      GTK_NOTE (MULTIHEAD,
175 +                g_warning ("Using the default screen for gtk_icon_set_render_icon()"));
176 +    }
177 +
178 +  settings = gtk_settings_get_for_screen (screen);
179 +  gtk_icon_size_lookup_for_settings (settings, size, &icon_width, NULL);
180 +
181 +  return (gdouble) gdk_pixbuf_get_width (icon) / icon_width;
182 +}
183 +
184 +GdkPixbuf*
185 +gtk_icon_set_render_icon_internal (GtkIconSet        *icon_set,
186 +                                   GtkStyle          *style,
187 +                                   GtkTextDirection   direction,
188 +                                   GtkStateType       state,
189 +                                   GtkIconSize        size,
190 +                                   GtkWidget         *widget,
191 +                                   const char        *detail,
192 +                                   gboolean           scale_requested,
193 +                                   gdouble           *real_scale)
194 +{
195 +  GdkPixbuf *icon;
196 +
197 +  if (real_scale)
198 +    *real_scale = 1;
199 +
200 +  if (icon_set->sources == NULL)
201 +    return render_fallback_image (style, direction, state, size, widget, detail);
202 +
203 +  if (detail == NULL)
204 +    {
205 +      icon = find_in_cache (icon_set, style, direction,
206 +                        state, size);
207 +
208 +      if (icon)
209 +       {
210 +         g_object_ref (icon);
211 +
212 +          if (scale_requested && real_scale)
213 +            *real_scale = _get_real_scale (widget, style, size, icon);
214 +
215 +         return icon;
216 +       }
217 +    }
218 +
219 +
220 +  icon = find_and_render_icon_source (icon_set, style, direction, state, size,
221 +                                     widget, detail, scale_requested);
222 +
223 +  if (icon == NULL)
224 +    icon = render_fallback_image (style, direction, state, size, widget, detail);
225 +
226 +  if (detail == NULL)
227 +    add_to_cache (icon_set, style, direction, state, size, icon);
228 +
229 +  if (scale_requested && real_scale)
230 +    *real_scale = _get_real_scale (widget, style, size, icon);
231 +
232 +  return icon;
233 +}
234 +
235  /**
236   * gtk_icon_set_render_icon:
237   * @icon_set: a #GtkIconSet
238 @@ -1631,37 +1739,30 @@ gtk_icon_set_render_icon (GtkIconSet        *icon_set,
239                            GtkWidget         *widget,
240                            const char        *detail)
241  {
242 -  GdkPixbuf *icon;
243 -
244    g_return_val_if_fail (icon_set != NULL, NULL);
245    g_return_val_if_fail (style == NULL || GTK_IS_STYLE (style), NULL);
246
247 -  if (icon_set->sources == NULL)
248 -    return render_fallback_image (style, direction, state, size, widget, detail);
249 -
250 -  if (detail == NULL)
251 -    {
252 -      icon = find_in_cache (icon_set, style, direction,
253 -                        state, size);
254 -
255 -      if (icon)
256 -       {
257 -         g_object_ref (icon);
258 -         return icon;
259 -       }
260 -    }
261 -
262 -
263 -  icon = find_and_render_icon_source (icon_set, style, direction, state, size,
264 -                                     widget, detail);
265 -
266 -  if (icon == NULL)
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,
270 +                                            FALSE, NULL);
271 +}
272
273 -  if (detail == NULL)
274 -    add_to_cache (icon_set, style, direction, state, size, icon);
275 +GdkPixbuf*
276 +gtk_icon_set_render_icon_scaled (GtkIconSet        *icon_set,
277 +                                 GtkStyle          *style,
278 +                                 GtkTextDirection   direction,
279 +                                 GtkStateType       state,
280 +                                 GtkIconSize        size,
281 +                                 GtkWidget         *widget,
282 +                                 const char        *detail,
283 +                                 gdouble           *real_scale)
284 +{
285 +  g_return_val_if_fail (icon_set != NULL, NULL);
286 +  g_return_val_if_fail (style == NULL || GTK_IS_STYLE (style), NULL);
287
288 -  return icon;
289 +  return gtk_icon_set_render_icon_internal (icon_set, style, direction,
290 +                                            state, size, widget, detail,
291 +                                            TRUE, real_scale);
292  }
293
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,
300                                             GtkIconSize  size,
301                                             gint        *width,
302                                             gint        *height);
303 +gboolean gtk_icon_size_lookup_scaled       (GtkSettings *settings,
304 +                                            GtkIconSize  size,
305 +                                            gdouble      scale,
306 +                                            gint        *width,
307 +                                            gint        *height);
308
309  GtkIconSize           gtk_icon_size_register       (const gchar *name,
310                                                      gint         width,
311 @@ -134,7 +139,14 @@ GdkPixbuf*  gtk_icon_set_render_icon     (GtkIconSet      *icon_set,
312                                            GtkIconSize      size,
313                                            GtkWidget       *widget,
314                                            const char      *detail);
315 -
316 +GdkPixbuf* gtk_icon_set_render_icon_scaled (GtkIconSet        *icon_set,
317 +                                            GtkStyle          *style,
318 +                                            GtkTextDirection   direction,
319 +                                            GtkStateType       state,
320 +                                            GtkIconSize        size,
321 +                                            GtkWidget         *widget,
322 +                                            const char        *detail,
323 +                                            gdouble           *real_scale);
324
325  void           gtk_icon_set_add_source   (GtkIconSet          *icon_set,
326                                            const GtkIconSource *source);
327 --
328 1.7.10.2 (Apple Git-33)