linux-packaging-mono/external/bockbuild/packages/patches/gtk/0059-iconfactory-Add-scale-info-to-GtkIconSource.patch
Xamarin Public Jenkins (auto-signing) 6bdd276d05 Imported Upstream version 5.0.0.42
Former-commit-id: fd56571888259555122d8a0f58c68838229cea2b
2017-04-10 11:41:01 +00:00

481 lines
18 KiB
Diff

From 431d1225b153c1a1389686920aed1d26ff3218b2 Mon Sep 17 00:00:00 2001
From: Carlos Garnacho <carlos@lanedo.com>
Date: Fri, 10 May 2013 18:24:26 +0200
Subject: [PATCH 59/68] iconfactory: Add scale info to GtkIconSource
GtkIconSource now has notions knows about scale, so it can correctly
fetch the icon at the right scale for ICON_NAME source types.
All default stock icons have been made to have a wildcarded scale,
so it's up to the GtkIconTheme to do the scaling business.
---
gtk/gtkiconfactory.c | 140 ++++++++++++++++++++++++++++++++------------------
gtk/gtkiconfactory.h | 7 ++-
2 files changed, 97 insertions(+), 50 deletions(-)
diff --git a/gtk/gtkiconfactory.c b/gtk/gtkiconfactory.c
index 0dc31e6..41d1ee7 100644
--- a/gtk/gtkiconfactory.c
+++ b/gtk/gtkiconfactory.c
@@ -66,6 +66,7 @@ struct _GtkIconSource
GtkTextDirection direction;
GtkStateType state;
GtkIconSize size;
+ gdouble scale;
/* If TRUE, then the parameter is wildcarded, and the above
* fields should be ignored. If FALSE, the parameter is
@@ -74,6 +75,7 @@ struct _GtkIconSource
guint any_direction : 1;
guint any_state : 1;
guint any_size : 1;
+ guint any_scale : 1;
#if defined (G_OS_WIN32) && !defined (_WIN64)
/* System codepage version of filename, for DLL ABI backward
@@ -106,10 +108,10 @@ static GtkIconSize icon_size_register_intern (const gchar *name,
gint width,
gint height);
-#define GTK_ICON_SOURCE_INIT(any_direction, any_state, any_size) \
+#define GTK_ICON_SOURCE_INIT(any_direction, any_state, any_size, any_scale) \
{ GTK_ICON_SOURCE_EMPTY, { NULL }, NULL, \
- 0, 0, 0, \
- any_direction, any_state, any_size }
+ 0, 0, 0, 1, \
+ any_direction, any_state, any_size, any_scale }
G_DEFINE_TYPE_WITH_CODE (GtkIconFactory, gtk_icon_factory, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
@@ -349,7 +351,7 @@ register_stock_icon (GtkIconFactory *factory,
const gchar *icon_name)
{
GtkIconSet *set = gtk_icon_set_new ();
- GtkIconSource source = GTK_ICON_SOURCE_INIT (TRUE, TRUE, TRUE);
+ GtkIconSource source = GTK_ICON_SOURCE_INIT (TRUE, TRUE, TRUE, TRUE);
source.type = GTK_ICON_SOURCE_STATIC_ICON_NAME;
source.source.icon_name = (gchar *)icon_name;
@@ -366,7 +368,7 @@ register_bidi_stock_icon (GtkIconFactory *factory,
const gchar *icon_name)
{
GtkIconSet *set = gtk_icon_set_new ();
- GtkIconSource source = GTK_ICON_SOURCE_INIT (FALSE, TRUE, TRUE);
+ GtkIconSource source = GTK_ICON_SOURCE_INIT (FALSE, TRUE, TRUE, TRUE);
source.type = GTK_ICON_SOURCE_STATIC_ICON_NAME;
source.source.icon_name = (gchar *)icon_name;
@@ -1094,12 +1096,14 @@ static GdkPixbuf *find_in_cache (GtkIconSet *icon_set,
GtkStyle *style,
GtkTextDirection direction,
GtkStateType state,
- GtkIconSize size);
+ GtkIconSize size,
+ gdouble scale);
static void add_to_cache (GtkIconSet *icon_set,
GtkStyle *style,
GtkTextDirection direction,
GtkStateType state,
GtkIconSize size,
+ gdouble scale,
GdkPixbuf *pixbuf);
/* Clear icon set contents, drop references to all contained
* GdkPixbuf objects and forget all GtkIconSources. Used to
@@ -1179,7 +1183,7 @@ gtk_icon_set_new_from_pixbuf (GdkPixbuf *pixbuf)
{
GtkIconSet *set;
- GtkIconSource source = GTK_ICON_SOURCE_INIT (TRUE, TRUE, TRUE);
+ GtkIconSource source = GTK_ICON_SOURCE_INIT (TRUE, TRUE, TRUE, TRUE);
g_return_val_if_fail (pixbuf != NULL, NULL);
@@ -1319,6 +1323,7 @@ find_best_matching_source (GtkIconSet *icon_set,
GtkTextDirection direction,
GtkStateType state,
GtkIconSize size,
+ gdouble scale,
GSList *failed)
{
GtkIconSource *source;
@@ -1340,7 +1345,8 @@ find_best_matching_source (GtkIconSet *icon_set,
if ((s->any_direction || (s->direction == direction)) &&
(s->any_state || (s->state == state)) &&
- (s->any_size || size == (GtkIconSize)-1 || (sizes_equivalent (size, s->size))))
+ (s->any_size || size == (GtkIconSize)-1 || (sizes_equivalent (size, s->size))) &&
+ (s->any_scale || (s->scale == scale)))
{
if (!g_slist_find (failed, s))
{
@@ -1392,7 +1398,7 @@ render_icon_name_pixbuf (GtkIconSource *icon_source,
GtkIconSize size,
GtkWidget *widget,
const char *detail,
- gboolean scale_requested)
+ gdouble scale)
{
GdkPixbuf *pixbuf;
GdkPixbuf *tmp_pixbuf;
@@ -1403,7 +1409,6 @@ render_icon_name_pixbuf (GtkIconSource *icon_source,
gint width, height, pixel_size;
gint *sizes, *s, dist;
GError *error = NULL;
- gdouble scale = 1;
if (widget && gtk_widget_has_screen (widget))
screen = gtk_widget_get_screen (widget);
@@ -1419,14 +1424,6 @@ render_icon_name_pixbuf (GtkIconSource *icon_source,
icon_theme = gtk_icon_theme_get_for_screen (screen);
settings = gtk_settings_get_for_screen (screen);
- if (scale_requested && widget)
- {
- if (!widget->window)
- gtk_widget_realize (widget);
-
- scale = gdk_window_get_scale_factor (widget->window);
- }
-
if (!gtk_icon_size_lookup_for_settings (settings, size, &width, &height))
{
if (size == (GtkIconSize)-1)
@@ -1469,7 +1466,7 @@ render_icon_name_pixbuf (GtkIconSource *icon_source,
}
}
- pixel_size = MIN (width, height) * scale;
+ pixel_size = MIN (width, height);
if (icon_source->direction != GTK_TEXT_DIR_NONE)
{
@@ -1483,9 +1480,10 @@ render_icon_name_pixbuf (GtkIconSource *icon_source,
names[1] = icon_source->source.icon_name;
names[2] = NULL;
- info = gtk_icon_theme_choose_icon (icon_theme,
- names,
- pixel_size, GTK_ICON_LOOKUP_USE_BUILTIN);
+ info = gtk_icon_theme_choose_icon_for_scale (icon_theme,
+ names,
+ pixel_size, scale,
+ GTK_ICON_LOOKUP_USE_BUILTIN);
g_free (name_with_dir);
if (info)
{
@@ -1495,10 +1493,10 @@ render_icon_name_pixbuf (GtkIconSource *icon_source,
}
else
{
- tmp_pixbuf = gtk_icon_theme_load_icon (icon_theme,
- icon_source->source.icon_name,
- pixel_size, 0,
- &error);
+ tmp_pixbuf = gtk_icon_theme_load_icon_for_scale (icon_theme,
+ icon_source->source.icon_name,
+ pixel_size, scale, 0,
+ &error);
}
if (!tmp_pixbuf)
@@ -1534,7 +1532,7 @@ find_and_render_icon_source (GtkIconSet *icon_set,
GtkIconSize size,
GtkWidget *widget,
const char *detail,
- gboolean scale_requested)
+ gdouble scale)
{
GSList *failed = NULL;
GdkPixbuf *pixbuf = NULL;
@@ -1551,7 +1549,7 @@ find_and_render_icon_source (GtkIconSet *icon_set,
*/
while (pixbuf == NULL)
{
- GtkIconSource *source = find_best_matching_source (icon_set, direction, state, size, failed);
+ GtkIconSource *source = find_best_matching_source (icon_set, direction, state, size, scale, failed);
if (source == NULL)
break;
@@ -1576,7 +1574,7 @@ find_and_render_icon_source (GtkIconSet *icon_set,
case GTK_ICON_SOURCE_STATIC_ICON_NAME:
pixbuf = render_icon_name_pixbuf (source, style,
direction, state, size,
- widget, detail, scale_requested);
+ widget, detail, scale);
if (!pixbuf)
failed = g_slist_prepend (failed, source);
break;
@@ -1601,7 +1599,7 @@ render_fallback_image (GtkStyle *style,
const char *detail)
{
/* This icon can be used for any direction/state/size */
- static GtkIconSource fallback_source = GTK_ICON_SOURCE_INIT (TRUE, TRUE, TRUE);
+ static GtkIconSource fallback_source = GTK_ICON_SOURCE_INIT (TRUE, TRUE, TRUE, TRUE);
if (fallback_source.type == GTK_ICON_SOURCE_EMPTY)
{
@@ -1652,7 +1650,7 @@ _get_real_scale (GtkWidget *widget,
settings = gtk_settings_get_for_screen (screen);
gtk_icon_size_lookup_for_settings (settings, size, &icon_width, NULL);
- return (gdouble) gdk_pixbuf_get_width (icon) / icon_width;
+ return round ((gdouble) gdk_pixbuf_get_width (icon) / icon_width);
}
GdkPixbuf*
@@ -1663,28 +1661,23 @@ gtk_icon_set_render_icon_internal (GtkIconSet *icon_set,
GtkIconSize size,
GtkWidget *widget,
const char *detail,
- gboolean scale_requested,
- gdouble *real_scale)
+ gdouble *scale)
{
GdkPixbuf *icon;
- if (real_scale)
- *real_scale = 1;
-
if (icon_set->sources == NULL)
return render_fallback_image (style, direction, state, size, widget, detail);
if (detail == NULL)
{
icon = find_in_cache (icon_set, style, direction,
- state, size);
+ state, size, *scale);
if (icon)
{
g_object_ref (icon);
- if (scale_requested && real_scale)
- *real_scale = _get_real_scale (widget, style, size, icon);
+ *scale = _get_real_scale (widget, style, size, icon);
return icon;
}
@@ -1692,16 +1685,15 @@ gtk_icon_set_render_icon_internal (GtkIconSet *icon_set,
icon = find_and_render_icon_source (icon_set, style, direction, state, size,
- widget, detail, scale_requested);
+ widget, detail, *scale);
if (icon == NULL)
icon = render_fallback_image (style, direction, state, size, widget, detail);
- if (detail == NULL)
- add_to_cache (icon_set, style, direction, state, size, icon);
+ *scale = _get_real_scale (widget, style, size, icon);
- if (scale_requested && real_scale)
- *real_scale = _get_real_scale (widget, style, size, icon);
+ if (detail == NULL)
+ add_to_cache (icon_set, style, direction, state, size, *scale, icon);
return icon;
}
@@ -1739,12 +1731,14 @@ gtk_icon_set_render_icon (GtkIconSet *icon_set,
GtkWidget *widget,
const char *detail)
{
+ gdouble scale = 1;
+
g_return_val_if_fail (icon_set != NULL, NULL);
g_return_val_if_fail (style == NULL || GTK_IS_STYLE (style), NULL);
return gtk_icon_set_render_icon_internal (icon_set, style, direction,
state, size, widget, detail,
- FALSE, NULL);
+ &scale);
}
GdkPixbuf*
@@ -1755,19 +1749,22 @@ gtk_icon_set_render_icon_scaled (GtkIconSet *icon_set,
GtkIconSize size,
GtkWidget *widget,
const char *detail,
- gdouble *real_scale)
+ gdouble *scale)
{
g_return_val_if_fail (icon_set != NULL, NULL);
g_return_val_if_fail (style == NULL || GTK_IS_STYLE (style), NULL);
+ g_return_val_if_fail (scale != NULL, NULL);
+
+ *scale = MAX (*scale, 1);
return gtk_icon_set_render_icon_internal (icon_set, style, direction,
state, size, widget, detail,
- TRUE, real_scale);
+ scale);
}
/* Order sources by their "wildness", so that "wilder" sources are
* greater than "specific" sources; for determining ordering,
- * direction beats state beats size.
+ * direction beats state beats size beats scale.
*/
static int
@@ -1788,6 +1785,10 @@ icon_source_compare (gconstpointer ap, gconstpointer bp)
return -1;
else if (a->any_size && !b->any_size)
return 1;
+ else if (!a->any_scale && b->any_scale)
+ return -1;
+ else if (a->any_scale && !b->any_scale)
+ return 1;
else
return 0;
}
@@ -1965,10 +1966,12 @@ gtk_icon_source_new (void)
src->direction = GTK_TEXT_DIR_NONE;
src->size = GTK_ICON_SIZE_INVALID;
src->state = GTK_STATE_NORMAL;
+ src->scale = 1;
src->any_direction = TRUE;
src->any_state = TRUE;
src->any_size = TRUE;
+ src->any_scale = TRUE;
return src;
}
@@ -2319,6 +2322,15 @@ gtk_icon_source_set_size_wildcarded (GtkIconSource *source,
source->any_size = setting != FALSE;
}
+void
+gtk_icon_source_set_scale_wildcarded (GtkIconSource *source,
+ gboolean setting)
+{
+ g_return_if_fail (source != NULL);
+
+ source->any_scale = setting != FALSE;
+}
+
/**
* gtk_icon_source_get_size_wildcarded:
* @source: a #GtkIconSource
@@ -2367,6 +2379,14 @@ gtk_icon_source_get_direction_wildcarded (const GtkIconSource *source)
return source->any_direction;
}
+gboolean
+gtk_icon_source_get_scale_wildcarded (const GtkIconSource *source)
+{
+ g_return_val_if_fail (source != NULL, TRUE);
+
+ return source->any_scale;
+}
+
/**
* gtk_icon_source_set_direction:
* @source: a #GtkIconSource
@@ -2433,6 +2453,15 @@ gtk_icon_source_set_size (GtkIconSource *source,
source->size = size;
}
+void
+gtk_icon_source_set_scale (GtkIconSource *source,
+ gdouble scale)
+{
+ g_return_if_fail (source != NULL);
+
+ source->scale = scale;
+}
+
/**
* gtk_icon_source_get_direction:
* @source: a #GtkIconSource
@@ -2486,6 +2515,14 @@ gtk_icon_source_get_size (const GtkIconSource *source)
return source->size;
}
+gdouble
+gtk_icon_source_get_scale (const GtkIconSource *source)
+{
+ g_return_val_if_fail (source != NULL, 0);
+
+ return source->scale;
+}
+
#define NUM_CACHED_ICONS 8
typedef struct _CachedIcon CachedIcon;
@@ -2499,6 +2536,7 @@ struct _CachedIcon
GtkTextDirection direction;
GtkStateType state;
GtkIconSize size;
+ gdouble scale;
GdkPixbuf *pixbuf;
};
@@ -2529,7 +2567,8 @@ find_in_cache (GtkIconSet *icon_set,
GtkStyle *style,
GtkTextDirection direction,
GtkStateType state,
- GtkIconSize size)
+ GtkIconSize size,
+ gdouble scale)
{
GSList *tmp_list;
GSList *prev;
@@ -2545,6 +2584,7 @@ find_in_cache (GtkIconSet *icon_set,
if (icon->style == style &&
icon->direction == direction &&
icon->state == state &&
+ icon->scale == scale &&
(size == (GtkIconSize)-1 || icon->size == size))
{
if (prev)
@@ -2571,6 +2611,7 @@ add_to_cache (GtkIconSet *icon_set,
GtkTextDirection direction,
GtkStateType state,
GtkIconSize size,
+ gdouble scale,
GdkPixbuf *pixbuf)
{
CachedIcon *icon;
@@ -2595,6 +2636,7 @@ add_to_cache (GtkIconSet *icon_set,
icon->direction = direction;
icon->state = state;
icon->size = size;
+ icon->scale = scale;
icon->pixbuf = pixbuf;
if (icon->style)
diff --git a/gtk/gtkiconfactory.h b/gtk/gtkiconfactory.h
index e38f8e6..d646ed9 100644
--- a/gtk/gtkiconfactory.h
+++ b/gtk/gtkiconfactory.h
@@ -177,19 +177,24 @@ void gtk_icon_source_set_state_wildcarded (GtkIconSource *
gboolean setting);
void gtk_icon_source_set_size_wildcarded (GtkIconSource *source,
gboolean setting);
+void gtk_icon_source_set_scale_wildcarded (GtkIconSource *source,
+ gboolean setting);
gboolean gtk_icon_source_get_size_wildcarded (const GtkIconSource *source);
gboolean gtk_icon_source_get_state_wildcarded (const GtkIconSource *source);
gboolean gtk_icon_source_get_direction_wildcarded (const GtkIconSource *source);
+gboolean gtk_icon_source_get_scale_wildcarded (const GtkIconSource *source);
void gtk_icon_source_set_direction (GtkIconSource *source,
GtkTextDirection direction);
void gtk_icon_source_set_state (GtkIconSource *source,
GtkStateType state);
void gtk_icon_source_set_size (GtkIconSource *source,
GtkIconSize size);
+void gtk_icon_source_set_scale (GtkIconSource *source,
+ gdouble scale);
GtkTextDirection gtk_icon_source_get_direction (const GtkIconSource *source);
GtkStateType gtk_icon_source_get_state (const GtkIconSource *source);
GtkIconSize gtk_icon_source_get_size (const GtkIconSource *source);
-
+gdouble gtk_icon_source_get_scale (const GtkIconSource *source);
/* ignore this */
void _gtk_icon_set_invalidate_caches (void);
--
1.7.10.2 (Apple Git-33)