]> Pileus Git - ~andy/gtk/commitdiff
Fix ordering of priorities so that priorities take precendence over the
authorOwen Taylor <otaylor@redhat.com>
Sat, 2 Feb 2002 00:44:52 +0000 (00:44 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Sat, 2 Feb 2002 00:44:52 +0000 (00:44 +0000)
Fri Feb  1 17:48:51 2002  Owen Taylor  <otaylor@redhat.com>

        * gtk/gtkrc.c (gtk_rc_get_style): Fix ordering of
        priorities so that priorities take precendence over
        the ordering by type. (#70205)

        * test/testgtkrc tests/testgtk.c (create_rc_file): Add
        some labels to test priorities in testgtkrc.

ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtkrc.c
tests/testgtk.c
tests/testgtkrc

index d6eff3cef2a3c8ad611221c8a4700a5b506e88d3..c20cf995b5211345febbaa61146d46f69da2ffbe 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Fri Feb  1 17:48:51 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkrc.c (gtk_rc_get_style): Fix ordering of
+       priorities so that priorities take precendence over
+       the ordering by type. (#70205)
+
+       * test/testgtkrc tests/testgtk.c (create_rc_file): Add 
+       some labels to test priorities in testgtkrc.
+
 Fri Feb  1 00:37:49 2002  Kristian Rietveld  <kris@gtk.org>
 
        * gtk/gtktreeview.c (gtk_tree_view_move_cursor_page_up_down): use
index d6eff3cef2a3c8ad611221c8a4700a5b506e88d3..c20cf995b5211345febbaa61146d46f69da2ffbe 100644 (file)
@@ -1,3 +1,12 @@
+Fri Feb  1 17:48:51 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkrc.c (gtk_rc_get_style): Fix ordering of
+       priorities so that priorities take precendence over
+       the ordering by type. (#70205)
+
+       * test/testgtkrc tests/testgtk.c (create_rc_file): Add 
+       some labels to test priorities in testgtkrc.
+
 Fri Feb  1 00:37:49 2002  Kristian Rietveld  <kris@gtk.org>
 
        * gtk/gtktreeview.c (gtk_tree_view_move_cursor_page_up_down): use
index d6eff3cef2a3c8ad611221c8a4700a5b506e88d3..c20cf995b5211345febbaa61146d46f69da2ffbe 100644 (file)
@@ -1,3 +1,12 @@
+Fri Feb  1 17:48:51 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkrc.c (gtk_rc_get_style): Fix ordering of
+       priorities so that priorities take precendence over
+       the ordering by type. (#70205)
+
+       * test/testgtkrc tests/testgtk.c (create_rc_file): Add 
+       some labels to test priorities in testgtkrc.
+
 Fri Feb  1 00:37:49 2002  Kristian Rietveld  <kris@gtk.org>
 
        * gtk/gtktreeview.c (gtk_tree_view_move_cursor_page_up_down): use
index d6eff3cef2a3c8ad611221c8a4700a5b506e88d3..c20cf995b5211345febbaa61146d46f69da2ffbe 100644 (file)
@@ -1,3 +1,12 @@
+Fri Feb  1 17:48:51 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkrc.c (gtk_rc_get_style): Fix ordering of
+       priorities so that priorities take precendence over
+       the ordering by type. (#70205)
+
+       * test/testgtkrc tests/testgtk.c (create_rc_file): Add 
+       some labels to test priorities in testgtkrc.
+
 Fri Feb  1 00:37:49 2002  Kristian Rietveld  <kris@gtk.org>
 
        * gtk/gtktreeview.c (gtk_tree_view_move_cursor_page_up_down): use
index d6eff3cef2a3c8ad611221c8a4700a5b506e88d3..c20cf995b5211345febbaa61146d46f69da2ffbe 100644 (file)
@@ -1,3 +1,12 @@
+Fri Feb  1 17:48:51 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkrc.c (gtk_rc_get_style): Fix ordering of
+       priorities so that priorities take precendence over
+       the ordering by type. (#70205)
+
+       * test/testgtkrc tests/testgtk.c (create_rc_file): Add 
+       some labels to test priorities in testgtkrc.
+
 Fri Feb  1 00:37:49 2002  Kristian Rietveld  <kris@gtk.org>
 
        * gtk/gtktreeview.c (gtk_tree_view_move_cursor_page_up_down): use
index d6eff3cef2a3c8ad611221c8a4700a5b506e88d3..c20cf995b5211345febbaa61146d46f69da2ffbe 100644 (file)
@@ -1,3 +1,12 @@
+Fri Feb  1 17:48:51 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkrc.c (gtk_rc_get_style): Fix ordering of
+       priorities so that priorities take precendence over
+       the ordering by type. (#70205)
+
+       * test/testgtkrc tests/testgtk.c (create_rc_file): Add 
+       some labels to test priorities in testgtkrc.
+
 Fri Feb  1 00:37:49 2002  Kristian Rietveld  <kris@gtk.org>
 
        * gtk/gtktreeview.c (gtk_tree_view_move_cursor_page_up_down): use
index d6eff3cef2a3c8ad611221c8a4700a5b506e88d3..c20cf995b5211345febbaa61146d46f69da2ffbe 100644 (file)
@@ -1,3 +1,12 @@
+Fri Feb  1 17:48:51 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkrc.c (gtk_rc_get_style): Fix ordering of
+       priorities so that priorities take precendence over
+       the ordering by type. (#70205)
+
+       * test/testgtkrc tests/testgtk.c (create_rc_file): Add 
+       some labels to test priorities in testgtkrc.
+
 Fri Feb  1 00:37:49 2002  Kristian Rietveld  <kris@gtk.org>
 
        * gtk/gtktreeview.c (gtk_tree_view_move_cursor_page_up_down): use
index 3324a79e1c09f811686df982ec4a1dcc16329c1e..3958add6e2ed6f3f2446f18ff370dd1891f8600e 100644 (file)
@@ -1441,12 +1441,54 @@ gtk_rc_styles_match (GSList       *rc_styles,
       sets = sets->next;
 
       if (g_pattern_match (rc_set->pspec, path_length, path, path_reversed))
-       rc_styles = g_slist_append (rc_styles, rc_set->rc_style);
+       rc_styles = g_slist_append (rc_styles, rc_set);
     }
   
   return rc_styles;
 }
 
+static gint
+rc_set_compare (gconstpointer a, gconstpointer b)
+{
+  const GtkRcSet *set_a = a;
+  const GtkRcSet *set_b = b;
+
+  return (set_a->priority < set_b->priority) ? 1 : (set_a->priority == set_b->priority ? 0 : -1);
+}
+
+static GSList *
+sort_and_dereference_sets (GSList *styles)
+{
+  GSList *tmp_list;
+  
+  /* At this point, the list of sets is ordered by:
+   *
+   * a) 'widget' patterns are earlier than 'widget_class' patterns
+   *    which are ealier than 'class' patterns.
+   * a) For two matches for class patterns, a match to a child type
+   *    is before a match to a parent type
+   * c) a match later in the RC file (or in a later RC file) is before a
+   *    match earlier in the RC file.
+   *
+   * With a) taking precedence over b) which takes precendence over c).
+   *
+   * Now sort by priority, which has the highest precendence for sort order
+   */
+  styles = g_slist_sort (styles, rc_set_compare);
+
+  /* Make styles->data = styles->data->rc_style
+   */
+  tmp_list = styles;
+  while (tmp_list)
+    {
+      GtkRcSet *set = tmp_list->data;
+      tmp_list->data = set->rc_style;
+      tmp_list = tmp_list->next;
+    }
+
+  return styles;
+}
+
 /**
  * gtk_rc_get_style:
  * @widget: a #GtkWidget
@@ -1481,12 +1523,6 @@ gtk_rc_get_style (GtkWidget *widget)
   if (!rc_style_key_id)
     rc_style_key_id = g_quark_from_static_string ("gtk-rc-style");
 
-  widget_rc_style = gtk_object_get_data_by_id (GTK_OBJECT (widget),
-                                              rc_style_key_id);
-
-  if (widget_rc_style)
-    rc_styles = g_slist_prepend (rc_styles, widget_rc_style);
-  
   if (context->rc_sets_widget)
     {
       gchar *path, *path_reversed;
@@ -1532,6 +1568,14 @@ gtk_rc_get_style (GtkWidget *widget)
        }
     }
   
+  rc_styles = sort_and_dereference_sets (rc_styles);
+  
+  widget_rc_style = gtk_object_get_data_by_id (GTK_OBJECT (widget),
+                                              rc_style_key_id);
+
+  if (widget_rc_style)
+    rc_styles = g_slist_prepend (rc_styles, widget_rc_style);
+
   if (rc_styles)
     return gtk_rc_init_style (rc_styles);
 
@@ -1628,6 +1672,8 @@ gtk_rc_get_style_by_paths (GtkSettings *settings,
          type = g_type_parent (type);
        }
     }
+  rc_styles = sort_and_dereference_sets (rc_styles);
   
   if (rc_styles)
     return gtk_rc_init_style (rc_styles);
@@ -3309,21 +3355,6 @@ gtk_rc_parse_module_path_string (const gchar *mod_path)
   gtk_rc_append_default_module_path();
 }
 
-static gint
-rc_set_compare (gconstpointer a, gconstpointer b)
-{
-  const GtkRcSet *set_a = a;
-  const GtkRcSet *set_b = b;
-
-  return (set_a->priority < set_b->priority) ? 1 : (set_a->priority == set_b->priority ? 0 : -1);
-}
-
-static GSList *
-insert_rc_set (GSList *list, GtkRcSet *set)
-{
-  return g_slist_insert_sorted (list, set, rc_set_compare);
-}
-
 static guint
 gtk_rc_parse_path_pattern (GtkRcContext *context,
                           GScanner     *scanner)
@@ -3415,11 +3446,11 @@ gtk_rc_parse_path_pattern (GtkRcContext *context,
       rc_set->priority = priority;
 
       if (path_type == GTK_PATH_WIDGET)
-       context->rc_sets_widget = insert_rc_set (context->rc_sets_widget, rc_set);
+       context->rc_sets_widget = g_slist_prepend (context->rc_sets_widget, rc_set);
       else if (path_type == GTK_PATH_WIDGET_CLASS)
-       context->rc_sets_widget_class = insert_rc_set (context->rc_sets_widget_class, rc_set);
+       context->rc_sets_widget_class = g_slist_prepend (context->rc_sets_widget_class, rc_set);
       else
-       context->rc_sets_class = insert_rc_set (context->rc_sets_class, rc_set);
+       context->rc_sets_class = g_slist_prepend (context->rc_sets_class, rc_set);
     }
 
   g_free (pattern);
index f60fd6fa58460de59a24438730c945fce2284bcd..fbd4af4c64f834a43f6f56849a986639e7f10502 100644 (file)
@@ -10573,6 +10573,9 @@ create_rc_file (void)
 {
   static GtkWidget *window = NULL;
   GtkWidget *button;
+  GtkWidget *frame;
+  GtkWidget *vbox;
+  GtkWidget *label;
 
   if (!window)
     {
@@ -10582,6 +10585,24 @@ create_rc_file (void)
                          GTK_SIGNAL_FUNC(destroy_idle_test),
                          &window);
 
+      frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
+      gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), frame, FALSE, FALSE, 0);
+
+      vbox = gtk_vbox_new (FALSE, 0);
+      gtk_container_add (GTK_CONTAINER (frame), vbox);
+      
+      label = gtk_label_new ("This label should be red");
+      gtk_widget_set_name (label, "testgtk-red-label");
+      gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+
+      label = gtk_label_new ("This label should be green");
+      gtk_widget_set_name (label, "testgtk-green-label");
+      gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+
+      label = gtk_label_new ("This label should be blue");
+      gtk_widget_set_name (label, "testgtk-blue-label");
+      gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+
       gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
       gtk_container_set_border_width (GTK_CONTAINER (window), 0);
 
@@ -10592,7 +10613,6 @@ create_rc_file (void)
       gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), 
                          button, TRUE, TRUE, 0);
       gtk_widget_grab_default (button);
-      gtk_widget_show (button);
 
       button = gtk_button_new_with_label ("Reload All");
       gtk_signal_connect (GTK_OBJECT (button), "clicked",
@@ -10600,7 +10620,6 @@ create_rc_file (void)
       GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
       gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), 
                          button, TRUE, TRUE, 0);
-      gtk_widget_show (button);
 
       button = gtk_button_new_with_label ("Close");
       gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
@@ -10609,12 +10628,10 @@ create_rc_file (void)
       GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
       gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), 
                          button, TRUE, TRUE, 0);
-      gtk_widget_show (button);
-
     }
 
   if (!GTK_WIDGET_VISIBLE (window))
-    gtk_widget_show (window);
+    gtk_widget_show_all (window);
   else
     gtk_widget_destroy (window);
 }
index 4b4cc574160559c08602ef24fa711c8174bef3b2..87c3c66a2b054a1d590b28c0897d5bda28edc9cc 100644 (file)
@@ -188,3 +188,26 @@ style "testthickness" {
 }
 
 #class "GtkFrame" style "testthickness"
+
+# Test ordering of RC file priorities
+
+style "testgtk-red-style" {
+  fg[NORMAL] = "red"
+}
+
+style "testgtk-green-style" {
+  fg[NORMAL] = "green"
+}
+
+style "testgtk-blue-style" {
+ fg[NORMAL] = "blue"
+}
+
+widget_class "*.GtkAspectFrame.*.GtkLabel" style "testgtk-green-style"
+widget_class "*.GtkAspectFrame.*.GtkLabel" style "testgtk-blue-style"  # override because it's later
+
+widget "*.testgtk-red-label" style "testgtk-red-style"  # override because it's widget, not widget_class
+
+widget "*.testgtk-green-label" style : highest "testgtk-green-style"
+# overrides the following, because it is higher priority
+widget "*.testgtk-green-label" style "testgtk-red-style"