[gtk+/resolution-independence: 6/24] port GtkBuilder, GtkIconFactory, the rc parser, GtkSizeGroup, GtkStyle to RI
- From: Davyd Madeley <davyd src gnome org>
- To: svn-commits-list gnome org
- Subject: [gtk+/resolution-independence: 6/24] port GtkBuilder, GtkIconFactory, the rc parser, GtkSizeGroup, GtkStyle to RI
- Date: Sat, 2 May 2009 02:17:32 -0400 (EDT)
commit 32baa433b75685a76c9ef9143ae0c51fa24683d3
Author: David Zeuthen <davidz redhat com>
Date: Tue Aug 12 18:29:21 2008 -0400
port GtkBuilder, GtkIconFactory, the rc parser, GtkSizeGroup, GtkStyle to RI
---
docs/reference/gtk/gtk-sections.txt | 3 +
gtk/gtk.symbols | 3 +
gtk/gtkbuilder.c | 45 ++++++++++
gtk/gtkiconfactory.c | 159 +++++++++++++++++++++++++++++------
gtk/gtkiconfactory.h | 14 +++
gtk/gtkmain.c | 12 ++--
gtk/gtkrc.c | 46 +++++++++-
gtk/gtksizegroup.c | 8 +-
gtk/gtkstyle.c | 6 +-
9 files changed, 254 insertions(+), 42 deletions(-)
diff --git a/docs/reference/gtk/gtk-sections.txt b/docs/reference/gtk/gtk-sections.txt
index 85dde70..a81f357 100644
--- a/docs/reference/gtk/gtk-sections.txt
+++ b/docs/reference/gtk/gtk-sections.txt
@@ -6472,7 +6472,10 @@ gtk_icon_set_ref
gtk_icon_set_render_icon
gtk_icon_set_unref
gtk_icon_size_lookup
+gtk_icon_size_lookup_unit
gtk_icon_size_lookup_for_settings
+gtk_icon_size_lookup_for_settings_for_monitor
+gtk_icon_size_lookup_for_settings_unit
gtk_icon_size_register
gtk_icon_size_register_alias
gtk_icon_size_from_name
diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols
index 9b38b15..3f448b4 100644
--- a/gtk/gtk.symbols
+++ b/gtk/gtk.symbols
@@ -1839,7 +1839,10 @@ gtk_icon_factory_remove_default
gtk_icon_size_from_name
gtk_icon_size_get_name
gtk_icon_size_lookup
+gtk_icon_size_lookup_unit
gtk_icon_size_lookup_for_settings
+gtk_icon_size_lookup_for_settings_for_monitor
+gtk_icon_size_lookup_for_settings_unit
gtk_icon_size_register
gtk_icon_size_register_alias
gtk_icon_set_add_source
diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c
index 9dff20e..6565bda 100644
--- a/gtk/gtkbuilder.c
+++ b/gtk/gtkbuilder.c
@@ -1152,6 +1152,51 @@ gtk_builder_value_from_string (GtkBuilder *builder,
return TRUE;
}
+ /* GtkParamSpecUnit, GtkParamSpecUUnit have fundamental types
+ * G_TYPE_INT resp. G_TYPE_UINT so cannot handle in the switch;
+ * do it separately
+ */
+ if (GTK_IS_PARAM_SPEC_SIZE (pspec) || GTK_IS_PARAM_SPEC_USIZE (pspec))
+ {
+ gdouble val;
+ GtkSize size;
+ gchar *endptr;
+
+ errno = 0;
+ val = strtod (string, &endptr);
+ if (errno != 0 || endptr == string)
+ {
+ g_set_error (error,
+ GTK_BUILDER_ERROR,
+ GTK_BUILDER_ERROR_INVALID_VALUE,
+ "Could not parse %s `%s'",
+ GTK_IS_PARAM_SPEC_SIZE (pspec) ? "GtkSize" : "GtkUSize",
+ string);
+ return FALSE;
+ }
+
+ if (g_str_has_suffix (string, "em"))
+ size = gtk_size_em (val);
+ else if (g_str_has_suffix (string, "mm"))
+ size = gtk_size_mm (val);
+ else
+ size = (gint) val;
+
+ if (GTK_IS_PARAM_SPEC_SIZE (pspec))
+ {
+ g_value_init (value, G_TYPE_INT);
+ gtk_value_size_skip_conversion (value);
+ gtk_value_set_size (value, size, NULL);
+ }
+ else
+ {
+ g_value_init (value, G_TYPE_UINT);
+ gtk_value_usize_skip_conversion (value);
+ gtk_value_set_usize (value, size, NULL);
+ }
+ return TRUE;
+ }
+
return gtk_builder_value_from_string_type (builder,
G_PARAM_SPEC_VALUE_TYPE (pspec),
string, value, error);
diff --git a/gtk/gtkiconfactory.c b/gtk/gtkiconfactory.c
index cced110..3eeda05 100644
--- a/gtk/gtkiconfactory.c
+++ b/gtk/gtkiconfactory.c
@@ -607,33 +607,33 @@ init_icon_sizes (void)
icon_sizes[GTK_ICON_SIZE_MENU].size = GTK_ICON_SIZE_MENU;
icon_sizes[GTK_ICON_SIZE_MENU].name = "gtk-menu";
- icon_sizes[GTK_ICON_SIZE_MENU].width = 16;
- icon_sizes[GTK_ICON_SIZE_MENU].height = 16;
+ icon_sizes[GTK_ICON_SIZE_MENU].width = GTK_SIZE_ONE_TWELFTH_EM (16);
+ icon_sizes[GTK_ICON_SIZE_MENU].height = GTK_SIZE_ONE_TWELFTH_EM (16);
icon_sizes[GTK_ICON_SIZE_BUTTON].size = GTK_ICON_SIZE_BUTTON;
icon_sizes[GTK_ICON_SIZE_BUTTON].name = "gtk-button";
- icon_sizes[GTK_ICON_SIZE_BUTTON].width = 20;
- icon_sizes[GTK_ICON_SIZE_BUTTON].height = 20;
+ icon_sizes[GTK_ICON_SIZE_BUTTON].width = GTK_SIZE_ONE_TWELFTH_EM (20);
+ icon_sizes[GTK_ICON_SIZE_BUTTON].height = GTK_SIZE_ONE_TWELFTH_EM (20);
icon_sizes[GTK_ICON_SIZE_SMALL_TOOLBAR].size = GTK_ICON_SIZE_SMALL_TOOLBAR;
icon_sizes[GTK_ICON_SIZE_SMALL_TOOLBAR].name = "gtk-small-toolbar";
- icon_sizes[GTK_ICON_SIZE_SMALL_TOOLBAR].width = 18;
- icon_sizes[GTK_ICON_SIZE_SMALL_TOOLBAR].height = 18;
+ icon_sizes[GTK_ICON_SIZE_SMALL_TOOLBAR].width = GTK_SIZE_ONE_TWELFTH_EM (18);
+ icon_sizes[GTK_ICON_SIZE_SMALL_TOOLBAR].height = GTK_SIZE_ONE_TWELFTH_EM (18);
icon_sizes[GTK_ICON_SIZE_LARGE_TOOLBAR].size = GTK_ICON_SIZE_LARGE_TOOLBAR;
icon_sizes[GTK_ICON_SIZE_LARGE_TOOLBAR].name = "gtk-large-toolbar";
- icon_sizes[GTK_ICON_SIZE_LARGE_TOOLBAR].width = 24;
- icon_sizes[GTK_ICON_SIZE_LARGE_TOOLBAR].height = 24;
+ icon_sizes[GTK_ICON_SIZE_LARGE_TOOLBAR].width = GTK_SIZE_ONE_TWELFTH_EM (24);
+ icon_sizes[GTK_ICON_SIZE_LARGE_TOOLBAR].height = GTK_SIZE_ONE_TWELFTH_EM (24);
icon_sizes[GTK_ICON_SIZE_DND].size = GTK_ICON_SIZE_DND;
icon_sizes[GTK_ICON_SIZE_DND].name = "gtk-dnd";
- icon_sizes[GTK_ICON_SIZE_DND].width = 32;
- icon_sizes[GTK_ICON_SIZE_DND].height = 32;
+ icon_sizes[GTK_ICON_SIZE_DND].width = GTK_SIZE_ONE_TWELFTH_EM (32);
+ icon_sizes[GTK_ICON_SIZE_DND].height = GTK_SIZE_ONE_TWELFTH_EM (32);
icon_sizes[GTK_ICON_SIZE_DIALOG].size = GTK_ICON_SIZE_DIALOG;
icon_sizes[GTK_ICON_SIZE_DIALOG].name = "gtk-dialog";
- icon_sizes[GTK_ICON_SIZE_DIALOG].width = 48;
- icon_sizes[GTK_ICON_SIZE_DIALOG].height = 48;
+ icon_sizes[GTK_ICON_SIZE_DIALOG].width = GTK_SIZE_ONE_TWELFTH_EM (48);
+ icon_sizes[GTK_ICON_SIZE_DIALOG].height = GTK_SIZE_ONE_TWELFTH_EM (48);
g_assert ((GTK_ICON_SIZE_DIALOG + 1) == NUM_BUILTIN_SIZES);
@@ -839,6 +839,15 @@ icon_size_settings_changed (GtkSettings *settings,
}
static void
+monitors_changed (GtkSettings *settings,
+ GParamSpec *pspec)
+{
+ icon_size_set_all_from_settings (settings);
+
+ gtk_rc_reset_styles (settings);
+}
+
+static void
icon_sizes_init_for_settings (GtkSettings *settings)
{
g_signal_connect (settings,
@@ -851,9 +860,11 @@ icon_sizes_init_for_settings (GtkSettings *settings)
static gboolean
icon_size_lookup_intern (GtkSettings *settings,
+ gint monitor_num,
GtkIconSize size,
gint *widthp,
- gint *heightp)
+ gint *heightp,
+ gboolean preserve_unit)
{
GArray *settings_sizes;
gint width_for_settings = -1;
@@ -890,10 +901,12 @@ icon_size_lookup_intern (GtkSettings *settings,
}
if (widthp)
- *widthp = width_for_settings >= 0 ? width_for_settings : icon_sizes[size].width;
+ *widthp = preserve_unit ? (width_for_settings >= 0 ? width_for_settings : icon_sizes[size].width) :
+ gtk_size_to_pixel (settings->screen, monitor_num, width_for_settings >= 0 ? width_for_settings : icon_sizes[size].width);
if (heightp)
- *heightp = height_for_settings >= 0 ? height_for_settings : icon_sizes[size].height;
+ *heightp = preserve_unit ? (height_for_settings >= 0 ? height_for_settings : icon_sizes[size].height) :
+ gtk_size_to_pixel (settings->screen, monitor_num, height_for_settings >= 0 ? height_for_settings : icon_sizes[size].height);
return TRUE;
}
@@ -929,7 +942,63 @@ gtk_icon_size_lookup_for_settings (GtkSettings *settings,
{
g_return_val_if_fail (GTK_IS_SETTINGS (settings), FALSE);
- return icon_size_lookup_intern (settings, size, width, height);
+ /* choose the first monitor; should probably also deprecate this function - or make GtkSettings per monitor */
+ return icon_size_lookup_intern (settings, 0, size, width, height, FALSE);
+}
+
+/**
+ * gtk_icon_size_lookup_for_settings_for_monitor:
+ * @settings: a #GtkSettings object, used to determine
+ * which set of user preferences to used.
+ * @monitor_num: the monitor number or -1 to use default monitor
+ * @size: an icon size
+ * @width: location to store icon width
+ * @height: location to store icon height
+ *
+ * Like gtk_icon_size_lookup_for_settings() but takes a monitor number
+ * as well.
+ *
+ * Return value: %TRUE if @size was a valid size
+ *
+ * Since: 2.14
+ **/
+gboolean
+gtk_icon_size_lookup_for_settings_for_monitor (GtkSettings *settings,
+ gint monitor_num,
+ GtkIconSize size,
+ gint *width,
+ gint *height)
+{
+ g_return_val_if_fail (GTK_IS_SETTINGS (settings), FALSE);
+
+ return icon_size_lookup_intern (settings, monitor_num, size, width, height, FALSE);
+}
+
+/**
+ * gtk_icon_size_lookup_for_settings_unit:
+ * @settings: a #GtkSettings object, used to determine
+ * which set of user preferences to used.
+ * @monitor_num: the monitor number or -1 to use default monitor
+ * @size: an icon size
+ * @width: location to store icon width
+ * @height: location to store icon height
+ *
+ * Like gtk_icon_size_lookup_for_settings_for_monitor() but preserves the unit.
+ *
+ * Return value: %TRUE if @size was a valid size
+ *
+ * Since: 2.14
+ **/
+gboolean
+gtk_icon_size_lookup_for_settings_unit (GtkSettings *settings,
+ gint monitor_num,
+ GtkIconSize size,
+ GtkSize *width,
+ GtkSize *height)
+{
+ g_return_val_if_fail (GTK_IS_SETTINGS (settings), FALSE);
+
+ return icon_size_lookup_intern (settings, monitor_num, size, width, height, TRUE);
}
/**
@@ -964,6 +1033,31 @@ gtk_icon_size_lookup (GtkIconSize size,
size, widthp, heightp);
}
+/**
+ * gtk_icon_size_lookup_unit:
+ * @size: an icon size
+ * @width: location to store icon width
+ * @height: location to store icon height
+ *
+ * Like gtk_icon_size_lookup() but preserves the unit.
+ *
+ * Return value: %TRUE if @size was a valid size
+ *
+ * Since: 2.14
+ **/
+gboolean
+gtk_icon_size_lookup_unit (GtkIconSize size,
+ GtkSize *widthp,
+ GtkSize *heightp)
+{
+ GTK_NOTE (MULTIHEAD,
+ g_warning ("gtk_icon_size_lookup ()) is not multihead safe"));
+
+ return gtk_icon_size_lookup_for_settings_unit (gtk_settings_get_default (),
+ -1,
+ size, widthp, heightp);
+}
+
static GtkIconSize
icon_size_register_intern (const gchar *name,
gint width,
@@ -1052,7 +1146,7 @@ gtk_icon_size_register_alias (const gchar *alias,
init_icon_sizes ();
- if (!icon_size_lookup_intern (NULL, target, NULL, NULL))
+ if (!icon_size_lookup_intern (NULL, 0, target, NULL, NULL, FALSE))
g_warning ("gtk_icon_size_register_alias: Icon size %u does not exist", target);
ia = g_hash_table_lookup (icon_aliases, alias);
@@ -1125,12 +1219,14 @@ static GdkPixbuf *find_in_cache (GtkIconSet *icon_set,
GtkStyle *style,
GtkTextDirection direction,
GtkStateType state,
- GtkIconSize size);
+ GtkIconSize size,
+ gint monitor_num);
static void add_to_cache (GtkIconSet *icon_set,
GtkStyle *style,
GtkTextDirection direction,
GtkStateType state,
GtkIconSize size,
+ gint monitor_num,
GdkPixbuf *pixbuf);
/* Clear icon set contents, drop references to all contained
* GdkPixbuf objects and forget all GtkIconSources. Used to
@@ -1338,8 +1434,8 @@ sizes_equivalent (GtkIconSize lhs,
gint r_w, r_h, l_w, l_h;
- icon_size_lookup_intern (NULL, rhs, &r_w, &r_h);
- icon_size_lookup_intern (NULL, lhs, &l_w, &l_h);
+ icon_size_lookup_intern (NULL, 0, rhs, &r_w, &r_h, FALSE);
+ icon_size_lookup_intern (NULL, 0, lhs, &l_w, &l_h, FALSE);
return r_w == l_w && r_h == l_h;
#endif
@@ -1433,6 +1529,7 @@ render_icon_name_pixbuf (GtkIconSource *icon_source,
gint width, height, pixel_size;
gint *sizes, *s, dist;
GError *error = NULL;
+ gint monitor_num;
if (widget && gtk_widget_has_screen (widget))
screen = gtk_widget_get_screen (widget);
@@ -1448,7 +1545,8 @@ render_icon_name_pixbuf (GtkIconSource *icon_source,
icon_theme = gtk_icon_theme_get_for_screen (screen);
settings = gtk_settings_get_for_screen (screen);
- if (!gtk_icon_size_lookup_for_settings (settings, size, &width, &height))
+ monitor_num = widget != NULL ? gtk_widget_get_monitor_num (widget) : -1;
+ if (!gtk_icon_size_lookup_for_settings_for_monitor (settings, monitor_num, size, &width, &height))
{
if (size == (GtkIconSize)-1)
{
@@ -1656,6 +1754,7 @@ gtk_icon_set_render_icon (GtkIconSet *icon_set,
const char *detail)
{
GdkPixbuf *icon;
+ gint monitor_num;
g_return_val_if_fail (icon_set != NULL, NULL);
g_return_val_if_fail (style == NULL || GTK_IS_STYLE (style), NULL);
@@ -1663,10 +1762,14 @@ gtk_icon_set_render_icon (GtkIconSet *icon_set,
if (icon_set->sources == NULL)
return render_fallback_image (style, direction, state, size, widget, detail);
+ monitor_num = widget != NULL ? gtk_widget_get_monitor_num (widget) : -1;
+ if (monitor_num < 0)
+ monitor_num = 0;
+
if (detail == NULL)
{
icon = find_in_cache (icon_set, style, direction,
- state, size);
+ state, size, monitor_num);
if (icon)
{
@@ -1675,7 +1778,6 @@ gtk_icon_set_render_icon (GtkIconSet *icon_set,
}
}
-
icon = find_and_render_icon_source (icon_set, style, direction, state, size,
widget, detail);
@@ -1683,7 +1785,7 @@ gtk_icon_set_render_icon (GtkIconSet *icon_set,
icon = render_fallback_image (style, direction, state, size, widget, detail);
if (detail == NULL)
- add_to_cache (icon_set, style, direction, state, size, icon);
+ add_to_cache (icon_set, style, direction, state, size, monitor_num, icon);
return icon;
}
@@ -2427,6 +2529,7 @@ struct _CachedIcon
GtkTextDirection direction;
GtkStateType state;
GtkIconSize size;
+ gint monitor_num;
GdkPixbuf *pixbuf;
};
@@ -2457,7 +2560,8 @@ find_in_cache (GtkIconSet *icon_set,
GtkStyle *style,
GtkTextDirection direction,
GtkStateType state,
- GtkIconSize size)
+ GtkIconSize size,
+ gint monitor_num)
{
GSList *tmp_list;
GSList *prev;
@@ -2473,7 +2577,8 @@ find_in_cache (GtkIconSet *icon_set,
if (icon->style == style &&
icon->direction == direction &&
icon->state == state &&
- (size == (GtkIconSize)-1 || icon->size == size))
+ (size == (GtkIconSize)-1 || icon->size == size) &&
+ icon->monitor_num == monitor_num)
{
if (prev)
{
@@ -2499,6 +2604,7 @@ add_to_cache (GtkIconSet *icon_set,
GtkTextDirection direction,
GtkStateType state,
GtkIconSize size,
+ gint monitor_num,
GdkPixbuf *pixbuf)
{
CachedIcon *icon;
@@ -2523,6 +2629,7 @@ add_to_cache (GtkIconSet *icon_set,
icon->direction = direction;
icon->state = state;
icon->size = size;
+ icon->monitor_num = monitor_num;
icon->pixbuf = pixbuf;
if (icon->style)
diff --git a/gtk/gtkiconfactory.h b/gtk/gtkiconfactory.h
index 574b101..9e26322 100644
--- a/gtk/gtkiconfactory.h
+++ b/gtk/gtkiconfactory.h
@@ -33,6 +33,7 @@
#include <gdk/gdk.h>
#include <gtk/gtkrc.h>
+#include <gtk/gtksize.h>
G_BEGIN_DECLS
@@ -100,11 +101,24 @@ GtkIconSet* gtk_icon_factory_lookup_default (const gchar *stock_id);
gboolean gtk_icon_size_lookup (GtkIconSize size,
gint *width,
gint *height);
+gboolean gtk_icon_size_lookup_unit (GtkIconSize size,
+ GtkSize *width,
+ GtkSize *height);
#endif /* GDK_MULTIHEAD_SAFE */
gboolean gtk_icon_size_lookup_for_settings (GtkSettings *settings,
GtkIconSize size,
gint *width,
gint *height);
+gboolean gtk_icon_size_lookup_for_settings_for_monitor (GtkSettings *settings,
+ gint monitor_num,
+ GtkIconSize size,
+ gint *width,
+ gint *height);
+gboolean gtk_icon_size_lookup_for_settings_unit (GtkSettings *settings,
+ gint monitor_num,
+ GtkIconSize size,
+ GtkSize *width,
+ GtkSize *height);
GtkIconSize gtk_icon_size_register (const gchar *name,
gint width,
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
index 11aee08..133fba1 100644
--- a/gtk/gtkmain.c
+++ b/gtk/gtkmain.c
@@ -2465,15 +2465,15 @@ gtk_print (gchar *str)
gtk_widget_show (box1);
- box2 = gtk_vbox_new (FALSE, 10);
- gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
+ box2 = gtk_vbox_new (FALSE, GTK_SIZE_ONE_TWELFTH_EM (10));
+ gtk_container_set_border_width (GTK_CONTAINER (box2), GTK_SIZE_ONE_TWELFTH_EM (10));
gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
gtk_widget_show (box2);
table = gtk_table_new (2, 2, FALSE);
- gtk_table_set_row_spacing (GTK_TABLE (table), 0, 2);
- gtk_table_set_col_spacing (GTK_TABLE (table), 0, 2);
+ gtk_table_set_row_spacing (GTK_TABLE (table), 0, GTK_SIZE_ONE_TWELFTH_EM (2));
+ gtk_table_set_col_spacing (GTK_TABLE (table), 0, GTK_SIZE_ONE_TWELFTH_EM (2));
gtk_box_pack_start (GTK_BOX (box2), table, TRUE, TRUE, 0);
gtk_widget_show (table);
@@ -2498,8 +2498,8 @@ gtk_print (gchar *str)
gtk_widget_show (separator);
- box2 = gtk_vbox_new (FALSE, 10);
- gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
+ box2 = gtk_vbox_new (FALSE, GTK_SIZE_ONE_TWELFTH_EM (10));
+ gtk_container_set_border_width (GTK_CONTAINER (box2), GTK_SIZE_ONE_TWELFTH_EM (10));
gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
gtk_widget_show (box2);
diff --git a/gtk/gtkrc.c b/gtk/gtkrc.c
index a2ac58b..892afd8 100644
--- a/gtk/gtkrc.c
+++ b/gtk/gtkrc.c
@@ -2552,6 +2552,20 @@ rc_parse_token_or_compound (GScanner *scanner,
if (token != G_TOKEN_NONE)
return token;
break;
+ case '!':
+ if (g_scanner_peek_next_token (scanner) == G_TOKEN_FLOAT)
+ {
+ g_scanner_get_next_token (scanner);
+ g_warning ("baz: %g", scanner->value.v_float);
+ g_string_append_printf (gstring, " 0x%lx", (gulong) gtk_size_em (scanner->value.v_float));
+ }
+ else if (g_scanner_peek_next_token (scanner) == G_TOKEN_INT)
+ {
+ g_scanner_get_next_token (scanner);
+ g_warning ("baz2: %d", scanner->value.v_int);
+ g_string_append_printf (gstring, " 0x%lx", (gulong) gtk_size_em (scanner->value.v_int));
+ }
+ break;
case '@':
if (g_scanner_peek_next_token (scanner) == G_TOKEN_IDENTIFIER)
{
@@ -2620,6 +2634,7 @@ gtk_rc_parse_assignment (GScanner *scanner,
gboolean numbers_2_int = scanner->config->numbers_2_int;
gboolean negate = FALSE;
gboolean is_color = FALSE;
+ gboolean is_unit = FALSE;
guint token;
/* check that this is an assignment */
@@ -2633,6 +2648,7 @@ gtk_rc_parse_assignment (GScanner *scanner,
scanner->config->char_2_token = MY_CHAR_2_TOKEN;
scanner->config->scan_identifier_NULL = MY_SCAN_IDENTIFIER_NULL;
scanner->config->numbers_2_int = MY_NUMBERS_2_INT;
+ scanner->config->scan_float = TRUE;
/* record location */
if (g_getenv ("GTK_DEBUG"))
@@ -2647,6 +2663,13 @@ gtk_rc_parse_assignment (GScanner *scanner,
is_color = TRUE;
}
+ /* parse optional unit prefixes */
+ if (g_scanner_peek_next_token (scanner) == '!')
+ {
+ g_scanner_get_next_token (scanner); /* eat unit prefix */
+ is_unit = TRUE;
+ }
+
/* parse optional sign */
if (!is_color && g_scanner_peek_next_token (scanner) == '-')
{
@@ -2670,14 +2693,27 @@ gtk_rc_parse_assignment (GScanner *scanner,
case G_TOKEN_INT:
g_scanner_get_next_token (scanner);
g_value_init (&prop->value, G_TYPE_LONG);
- g_value_set_long (&prop->value, negate ? -scanner->value.v_int : scanner->value.v_int);
+ if (is_unit)
+ g_value_set_long (&prop->value, gtk_size_em (scanner->value.v_int));
+ else
+ g_value_set_long (&prop->value, negate ? -scanner->value.v_int : scanner->value.v_int);
token = G_TOKEN_NONE;
break;
case G_TOKEN_FLOAT:
- g_scanner_get_next_token (scanner);
- g_value_init (&prop->value, G_TYPE_DOUBLE);
- g_value_set_double (&prop->value, negate ? -scanner->value.v_float : scanner->value.v_float);
- token = G_TOKEN_NONE;
+ if (is_unit)
+ {
+ g_scanner_get_next_token (scanner);
+ g_value_init (&prop->value, G_TYPE_LONG);
+ g_value_set_long (&prop->value, gtk_size_em (scanner->value.v_float));
+ token = G_TOKEN_NONE;
+ }
+ else
+ {
+ g_scanner_get_next_token (scanner);
+ g_value_init (&prop->value, G_TYPE_DOUBLE);
+ g_value_set_double (&prop->value, negate ? -scanner->value.v_float : scanner->value.v_float);
+ token = G_TOKEN_NONE;
+ }
break;
case G_TOKEN_STRING:
g_scanner_get_next_token (scanner);
diff --git a/gtk/gtksizegroup.c b/gtk/gtksizegroup.c
index 5926b52..0d4f374 100644
--- a/gtk/gtksizegroup.c
+++ b/gtk/gtksizegroup.c
@@ -597,14 +597,14 @@ get_base_dimension (GtkWidget *widget,
if (mode == GTK_SIZE_GROUP_HORIZONTAL)
{
if (aux_info && aux_info->width > 0)
- return aux_info->width;
+ return gtk_widget_size_to_pixel (widget, aux_info->width);
else
return widget->requisition.width;
}
else
{
if (aux_info && aux_info->height > 0)
- return aux_info->height;
+ return gtk_widget_size_to_pixel (widget, aux_info->height);
else
return widget->requisition.height;
}
@@ -751,9 +751,9 @@ get_fast_child_requisition (GtkWidget *widget,
if (aux_info)
{
if (aux_info->width > 0)
- requisition->width = aux_info->width;
+ requisition->width = gtk_widget_size_to_pixel (widget, aux_info->width);
if (aux_info && aux_info->height > 0)
- requisition->height = aux_info->height;
+ requisition->height = gtk_widget_size_to_pixel (widget, aux_info->height);
}
}
diff --git a/gtk/gtkstyle.c b/gtk/gtkstyle.c
index 769fe79..8dd9ee6 100644
--- a/gtk/gtkstyle.c
+++ b/gtk/gtkstyle.c
@@ -2285,6 +2285,7 @@ gtk_default_render_icon (GtkStyle *style,
GdkPixbuf *base_pixbuf;
GdkScreen *screen;
GtkSettings *settings;
+ gint monitor_num;
/* Oddly, style can be NULL in this function, because
* GtkIconSet can be used without a style and if so
@@ -2299,21 +2300,24 @@ gtk_default_render_icon (GtkStyle *style,
{
screen = gtk_widget_get_screen (widget);
settings = gtk_settings_get_for_screen (screen);
+ monitor_num = gtk_widget_get_monitor_num (widget);
}
else if (style && style->colormap)
{
screen = gdk_colormap_get_screen (style->colormap);
settings = gtk_settings_get_for_screen (screen);
+ monitor_num = -1;
}
else
{
settings = gtk_settings_get_default ();
+ monitor_num = -1;
GTK_NOTE (MULTIHEAD,
g_warning ("Using the default screen for gtk_default_render_icon()"));
}
- if (size != (GtkIconSize) -1 && !gtk_icon_size_lookup_for_settings (settings, size, &width, &height))
+ if (size != (GtkIconSize) -1 && !gtk_icon_size_lookup_for_settings_for_monitor (settings, monitor_num, size, &width, &height))
{
g_warning (G_STRLOC ": invalid icon size '%d'", size);
return NULL;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]