[gtk+/resolution-independence: 6/24] port GtkBuilder, GtkIconFactory, the rc parser, GtkSizeGroup, GtkStyle to RI



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]