Re: Metacity changes to paint ARGB window titles correctly



Around 17 o'clock on Jun 19, Havoc Pennington wrote:

> So I think we need to go per-visual. There are two ways I can see to do
> that, maybe there are more.

(actually, it's per-colormap, so I had to be careful to create only one 
colormap per visual)...

I created a colormap per visual and then attached the frames style to each 
frame.  Reading the gtk_attach_style code, this should create only one 
style per visual.

I also noticed that the gtk_attach_style code did some "funky" things with 
reference counts, so I had to make sure they stayed correct with an extra 
ref/unref per frame.

Things seem a lot more stable now; I was getting crashes without that; one 
in front of a rather large group of people watching a presentation.  (Uh, 
sorry, but I don't have a window manager any longer)

Oh, and I think I've got the style switching working too; I figured I 
should re-attach the style to each frame.  Seems to work.

Here's the current patch; it's a lot less ugly than the last one.  Again, 
it needs the GDK patch I posted to gtk-devel-list to work right.

-keith

? changes
Index: src/compositor.c
===================================================================
RCS file: /cvs/gnome/metacity/src/compositor.c,v
retrieving revision 1.8
diff -u -r1.8 compositor.c
--- src/compositor.c	26 Dec 2003 02:42:38 -0000	1.8
+++ src/compositor.c	26 Jun 2004 18:28:39 -0000
@@ -194,7 +194,11 @@
   if (!(compositor->have_composite &&
         compositor->have_fixes &&
         compositor->have_render &&
-        compositor->have_damage))
+        compositor->have_damage &&
+#ifndef ENABLE_COMPOSITOR
+	0
+#endif
+	))
     {
       meta_topic (META_DEBUG_COMPOSITOR, "Failed to find all extensions needed for compositing manager, disabling compositing manager\n");
       g_assert (!compositor->enabled);
Index: src/frames.c
===================================================================
RCS file: /cvs/gnome/metacity/src/frames.c,v
retrieving revision 1.75
diff -u -r1.75 frames.c
--- src/frames.c	24 Nov 2003 18:09:47 -0000	1.75
+++ src/frames.c	26 Jun 2004 18:28:40 -0000
@@ -270,7 +270,7 @@
    * resize may not actually be needed so we always redraw
    * in case of color change.
    */
-  gtk_style_set_background (GTK_WIDGET (frames)->style,
+  gtk_style_set_background (frame->drawable.style,
                             frame->window, GTK_STATE_NORMAL);
   gdk_window_invalidate_rect (frame->window, NULL, FALSE);
   meta_core_queue_frame_resize (gdk_display,
@@ -315,7 +315,7 @@
    * resize may not actually be needed so we always redraw
    * in case of color change.
    */
-  gtk_style_set_background (GTK_WIDGET (frames)->style,
+  gtk_style_set_background (frame->drawable.style,
                             frame->window, GTK_STATE_NORMAL);
   gdk_window_invalidate_rect (frame->window, NULL, FALSE);
 }
@@ -332,11 +332,43 @@
                         GtkStyle  *prev_style)
 {
   MetaFrames *frames;
+  MetaUIFrame *frame;
+  GSList *winlist;
+  GSList *tmp;
 
   frames = META_FRAMES (widget);
 
   meta_frames_font_changed (frames);
 
+  winlist = NULL;
+  g_hash_table_foreach (frames->frames,
+                        listify_func,
+                        &winlist);
+  /* Copy new style to all frames */
+  tmp = winlist;
+  while (tmp != NULL)
+    {
+      MetaUIFrame *frame;
+
+      frame = tmp->data;
+
+      /*
+       * Detach and deref old style
+       */
+      gtk_style_detach (frame->drawable.style);
+      g_object_unref (frame->drawable.style);
+      
+      /*
+       * ref and attach new style
+       */
+      frame->drawable.style = g_object_ref (GTK_WIDGET(frames)->style);
+      frame->drawable.style = gtk_style_attach (frame->drawable.style,
+						frame->window);
+      
+      tmp = tmp->next;
+    }
+  g_slist_free (winlist);
+
   GTK_WIDGET_CLASS (parent_class)->style_set (widget, prev_style);
 }
 
@@ -388,8 +420,8 @@
       
       frame->layout = gtk_widget_create_pango_layout (widget, frame->title);
       
-      font_desc = meta_gtk_widget_get_font_desc (widget, scale,
-						 meta_prefs_get_titlebar_font ());
+      font_desc = meta_gtk_style_get_font_desc (frame->drawable.style, scale,
+						meta_prefs_get_titlebar_font ());
 
       size = pango_font_description_get_size (font_desc);
       
@@ -476,12 +508,24 @@
   
   frame->window = window;
 
+  frame->drawable.drawable = GDK_DRAWABLE(window);
+  /*
+   * Reference the parent style
+   */
+  frame->drawable.style = g_object_ref (GTK_WIDGET(frames)->style);
+  /*
+   * Re-realize the style for this visual 
+   * (or not, if the two visuals are the same)
+   */
+  frame->drawable.style = gtk_style_attach (frame->drawable.style,
+					    frame->window);
+  frame->drawable.widget = GTK_WIDGET(frames);
+  
   gdk_window_set_user_data (frame->window, frames);
-  gtk_style_set_background (GTK_WIDGET (frames)->style,
+  gtk_style_set_background (frame->drawable.style,
 			    frame->window, GTK_STATE_NORMAL);
 
   /* Don't set event mask here, it's in frame.c */
-  
   frame->xwindow = xwindow;
   frame->cache_style = NULL;
   frame->layout = NULL;
@@ -520,6 +564,10 @@
       
       g_hash_table_remove (frames->frames, &frame->xwindow);
 
+      gtk_style_detach (frame->drawable.style);
+
+      g_object_unref (frame->drawable.style);
+
       gdk_window_destroy (frame->window);
 
       if (frame->layout)
@@ -613,7 +661,7 @@
 
   frame = meta_frames_lookup_window (frames, xwindow);
   
-  gtk_style_set_background (widget->style, frame->window, GTK_STATE_NORMAL);
+  gtk_style_set_background (frame->drawable.style, frame->window, GTK_STATE_NORMAL);
 }
 
 static void
@@ -1870,8 +1918,7 @@
         gdk_window_begin_paint_rect (drawable, &areas[i]);
       
       meta_theme_draw_frame (meta_theme_get_current (),
-                             widget,
-                             drawable,
+			     &frame->drawable,
                              &areas[i],
                              0, 0,
                              type,
Index: src/frames.h
===================================================================
RCS file: /cvs/gnome/metacity/src/frames.h,v
retrieving revision 1.27
diff -u -r1.27 frames.h
--- src/frames.h	16 Aug 2003 16:32:10 -0000	1.27
+++ src/frames.h	26 Jun 2004 18:28:40 -0000
@@ -67,6 +67,7 @@
 {
   Window xwindow;
   GdkWindow *window;
+  MetaDrawable drawable;
   MetaFrameStyle *cache_style;
   PangoLayout *layout;
   int text_height;
Index: src/preview-widget.c
===================================================================
RCS file: /cvs/gnome/metacity/src/preview-widget.c,v
retrieving revision 1.3
diff -u -r1.3 preview-widget.c
--- src/preview-widget.c	4 Oct 2002 02:28:57 -0000	1.3
+++ src/preview-widget.c	26 Jun 2004 18:28:40 -0000
@@ -159,7 +159,7 @@
       preview->layout = gtk_widget_create_pango_layout (widget,
                                                         preview->title);
       
-      font_desc = meta_gtk_widget_get_font_desc (widget, scale, NULL);
+      font_desc = meta_gtk_style_get_font_desc (widget->style, scale, NULL);
       
       preview->text_height =
         meta_pango_font_desc_get_text_height (font_desc,
@@ -218,6 +218,7 @@
     META_BUTTON_STATE_NORMAL,
     META_BUTTON_STATE_NORMAL
   };
+  MetaDrawable drawable;
   
   g_return_val_if_fail (META_IS_PREVIEW (widget), FALSE);
   g_return_val_if_fail (event != NULL, FALSE);
@@ -240,9 +241,11 @@
     {
       border_width = GTK_CONTAINER (widget)->border_width;
       
+      drawable.drawable = GDK_DRAWABLE(widget->window);
+      drawable.style = widget->style;
+      drawable.widget = widget;
       meta_theme_draw_frame (preview->theme,
-                             widget,
-                             widget->window,
+			     &drawable,
                              &event->area,
                              widget->allocation.x + border_width,
                              widget->allocation.y + border_width,
Index: src/theme-viewer.c
===================================================================
RCS file: /cvs/gnome/metacity/src/theme-viewer.c,v
retrieving revision 1.16
diff -u -r1.16 theme-viewer.c
--- src/theme-viewer.c	15 Oct 2003 16:04:12 -0000	1.16
+++ src/theme-viewer.c	26 Jun 2004 18:28:40 -0000
@@ -974,6 +974,7 @@
   i = 0;
   while (i < ITERATIONS)
     {
+      MetaDrawable drawable;
       /* Creating the pixmap in the loop is right, since
        * GDK does the same with its double buffering.
        */
@@ -982,9 +983,11 @@
                                client_height + top_height + bottom_height,
                                -1);
 
+      drawable.drawable = GDK_DRAWABLE(pixmap);
+      drawable.style = widget->style;
+      drawable.widget = widget;
       meta_theme_draw_frame (global_theme,
-                             widget,
-                             pixmap,
+			     &drawable,
                              NULL,
                              0, 0,
                              META_FRAME_TYPE_NORMAL,
Index: src/theme.c
===================================================================
RCS file: /cvs/gnome/metacity/src/theme.c,v
retrieving revision 1.70
diff -u -r1.70 theme.c
--- src/theme.c	10 Jan 2004 17:16:06 -0000	1.70
+++ src/theme.c	26 Jun 2004 18:28:42 -0000
@@ -800,7 +800,7 @@
 
 GdkPixbuf*
 meta_gradient_spec_render (const MetaGradientSpec *spec,
-                           GtkWidget              *widget,
+			   MetaDrawable		  *drawable,
                            int                     width,
                            int                     height)
 {
@@ -821,7 +821,7 @@
   tmp = spec->color_specs;
   while (tmp != NULL)
     {
-      meta_color_spec_render (tmp->data, widget, &colors[i]);
+      meta_color_spec_render (tmp->data, drawable, &colors[i]);
 
       tmp = tmp->next;
       ++i;
@@ -1186,12 +1186,11 @@
 
 void
 meta_color_spec_render (MetaColorSpec *spec,
-                        GtkWidget     *widget,
+			MetaDrawable  *drawable,
                         GdkColor      *color)
 {
   g_return_if_fail (spec != NULL);
-  g_return_if_fail (GTK_IS_WIDGET (widget));
-  g_return_if_fail (widget->style != NULL);
+  g_return_if_fail (drawable->style != NULL);
 
   switch (spec->type)
     {
@@ -1203,28 +1202,28 @@
       switch (spec->data.gtk.component)
         {
         case META_GTK_COLOR_BG:
-          *color = widget->style->bg[spec->data.gtk.state];
+          *color = drawable->style->bg[spec->data.gtk.state];
           break;
         case META_GTK_COLOR_FG:
-          *color = widget->style->fg[spec->data.gtk.state];
+          *color = drawable->style->fg[spec->data.gtk.state];
           break;
         case META_GTK_COLOR_BASE:
-          *color = widget->style->base[spec->data.gtk.state];
+          *color = drawable->style->base[spec->data.gtk.state];
           break;
         case META_GTK_COLOR_TEXT:
-          *color = widget->style->text[spec->data.gtk.state];
+          *color = drawable->style->text[spec->data.gtk.state];
           break;
         case META_GTK_COLOR_LIGHT:
-          *color = widget->style->light[spec->data.gtk.state];
+          *color = drawable->style->light[spec->data.gtk.state];
           break;
         case META_GTK_COLOR_DARK:
-          *color = widget->style->dark[spec->data.gtk.state];
+          *color = drawable->style->dark[spec->data.gtk.state];
           break;
         case META_GTK_COLOR_MID:
-          *color = widget->style->mid[spec->data.gtk.state];
+          *color = drawable->style->mid[spec->data.gtk.state];
           break;
         case META_GTK_COLOR_TEXT_AA:
-          *color = widget->style->text_aa[spec->data.gtk.state];
+          *color = drawable->style->text_aa[spec->data.gtk.state];
           break;
         case META_GTK_COLOR_LAST:
           g_assert_not_reached ();
@@ -1236,8 +1235,8 @@
       {
         GdkColor bg, fg;
 
-        meta_color_spec_render (spec->data.blend.background, widget, &bg);
-        meta_color_spec_render (spec->data.blend.foreground, widget, &fg);
+        meta_color_spec_render (spec->data.blend.background, drawable, &bg);
+        meta_color_spec_render (spec->data.blend.foreground, drawable, &fg);
 
         color_composite (&bg, &fg, spec->data.blend.alpha, color);
       }
@@ -1247,7 +1246,7 @@
       {
         GdkColor base;
         
-        meta_color_spec_render (spec->data.shade.base, widget, &base);
+        meta_color_spec_render (spec->data.shade.base, drawable, &base);
         
         gtk_style_shade (&base, &base, spec->data.shade.factor);
 
@@ -2650,8 +2649,7 @@
 }
 
 static GdkGC*
-get_gc_for_primitive (GtkWidget          *widget,
-                      GdkDrawable        *drawable,
+get_gc_for_primitive (MetaDrawable	 *drawable,
                       MetaColorSpec      *color_spec,
                       const GdkRectangle *clip,
                       int                 line_width)
@@ -2660,13 +2658,13 @@
   GdkGCValues values;
   GdkColor color;
 
-  meta_color_spec_render (color_spec, widget, &color);
+  meta_color_spec_render (color_spec, drawable, &color);
 
   values.foreground = color;
-  gdk_rgb_find_color (widget->style->colormap, &values.foreground);
+  gdk_rgb_find_color (drawable->style->colormap, &values.foreground);
   values.line_width = line_width;
 
-  gc = gdk_gc_new_with_values (drawable, &values,
+  gc = gdk_gc_new_with_values (drawable->drawable, &values,
                                GDK_GC_FOREGROUND | GDK_GC_LINE_WIDTH);
 
   if (clip)
@@ -2982,7 +2980,7 @@
 
 static GdkPixbuf*
 draw_op_as_pixbuf (const MetaDrawOp    *op,
-                   GtkWidget           *widget,
+		   MetaDrawable	       *drawable,
                    const MetaDrawInfo  *info,
                    int                  width,
                    int                  height)
@@ -3006,7 +3004,7 @@
           GdkColor color;
 
           meta_color_spec_render (op->data.rectangle.color_spec,
-                                  widget,
+                                  drawable,
                                   &color);
 
           pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
@@ -3030,7 +3028,7 @@
         gboolean has_alpha;
 
         meta_color_spec_render (op->data.rectangle.color_spec,
-                                widget,
+                                drawable,
                                 &color);
 
         has_alpha =
@@ -3073,7 +3071,7 @@
     case META_DRAW_GRADIENT:
       {
         pixbuf = meta_gradient_spec_render (op->data.gradient.gradient_spec,
-                                            widget, width, height);
+                                            drawable, width, height);
 
         pixbuf = apply_alpha (pixbuf,
                               op->data.gradient.alpha_spec,
@@ -3089,7 +3087,7 @@
 	    GdkColor color;
 
             meta_color_spec_render (op->data.image.colorize_spec,
-                                    widget, &color);
+                                    drawable, &color);
             
             if (op->data.image.colorize_cache_pixbuf == NULL ||
                 op->data.image.colorize_cache_pixel != GDK_COLOR_RGB (color))
@@ -3205,8 +3203,7 @@
 
 static void
 meta_draw_op_draw_with_env (const MetaDrawOp    *op,
-                            GtkWidget           *widget,
-                            GdkDrawable         *drawable,
+			    MetaDrawable        *drawable,
                             const GdkRectangle  *clip,
                             const MetaDrawInfo  *info,
                             int                  x,
@@ -3223,7 +3220,7 @@
       {
         int x1, x2, y1, y2;
 
-        gc = get_gc_for_primitive (widget, drawable,
+        gc = get_gc_for_primitive (drawable,
                                    op->data.line.color_spec,
                                    clip,
                                    op->data.line.width);
@@ -3242,7 +3239,7 @@
         x2 = parse_x_position_unchecked (op->data.line.x2, env);
         y2 = parse_y_position_unchecked (op->data.line.y2, env);
 
-        gdk_draw_line (drawable, gc, x1, y1, x2, y2);
+        gdk_draw_line (drawable->drawable, gc, x1, y1, x2, y2);
 
         g_object_unref (G_OBJECT (gc));
       }
@@ -3252,7 +3249,7 @@
       {
         int rx, ry, rwidth, rheight;
 
-        gc = get_gc_for_primitive (widget, drawable,
+        gc = get_gc_for_primitive (drawable,
                                    op->data.rectangle.color_spec,
                                    clip, 0);
 
@@ -3261,7 +3258,7 @@
         rwidth = parse_size_unchecked (op->data.rectangle.width, env);
         rheight = parse_size_unchecked (op->data.rectangle.height, env);
 
-        gdk_draw_rectangle (drawable, gc,
+        gdk_draw_rectangle (drawable->drawable, gc,
                             op->data.rectangle.filled,
                             rx, ry, rwidth, rheight);
 
@@ -3273,7 +3270,7 @@
       {
         int rx, ry, rwidth, rheight;
 
-        gc = get_gc_for_primitive (widget, drawable,
+        gc = get_gc_for_primitive (drawable,
                                    op->data.arc.color_spec,
                                    clip, 0);
 
@@ -3282,7 +3279,7 @@
         rwidth = parse_size_unchecked (op->data.arc.width, env);
         rheight = parse_size_unchecked (op->data.arc.height, env);
 
-        gdk_draw_arc (drawable,
+        gdk_draw_arc (drawable->drawable,
                       gc,
                       op->data.arc.filled,
                       rx, ry, rwidth, rheight,
@@ -3313,11 +3310,11 @@
 
         if (!needs_alpha)
           {
-            gc = get_gc_for_primitive (widget, drawable,
+            gc = get_gc_for_primitive (drawable,
                                        op->data.tint.color_spec,
                                        clip, 0);
 
-            gdk_draw_rectangle (drawable, gc,
+            gdk_draw_rectangle (drawable->drawable, gc,
                                 TRUE,
                                 rx, ry, rwidth, rheight);
 
@@ -3327,12 +3324,12 @@
           {
             GdkPixbuf *pixbuf;
 
-            pixbuf = draw_op_as_pixbuf (op, widget, info,
+            pixbuf = draw_op_as_pixbuf (op, drawable, info,
                                         rwidth, rheight);
 
             if (pixbuf)
               {
-                render_pixbuf (drawable, clip, pixbuf, rx, ry);
+                render_pixbuf (drawable->drawable, clip, pixbuf, rx, ry);
 
                 g_object_unref (G_OBJECT (pixbuf));
               }
@@ -3350,12 +3347,12 @@
         rwidth = parse_size_unchecked (op->data.gradient.width, env);
         rheight = parse_size_unchecked (op->data.gradient.height, env);
 
-        pixbuf = draw_op_as_pixbuf (op, widget, info,
+        pixbuf = draw_op_as_pixbuf (op, drawable, info,
                                     rwidth, rheight);
 
         if (pixbuf)
           {
-            render_pixbuf (drawable, clip, pixbuf, rx, ry);
+            render_pixbuf (drawable->drawable, clip, pixbuf, rx, ry);
 
             g_object_unref (G_OBJECT (pixbuf));
           }
@@ -3376,7 +3373,7 @@
         rwidth = parse_size_unchecked (op->data.image.width, env);
         rheight = parse_size_unchecked (op->data.image.height, env);
         
-        pixbuf = draw_op_as_pixbuf (op, widget, info,
+        pixbuf = draw_op_as_pixbuf (op, drawable, info,
                                     rwidth, rheight);
 
         if (pixbuf)
@@ -3384,7 +3381,7 @@
             rx = parse_x_position_unchecked (op->data.image.x, env);
             ry = parse_y_position_unchecked (op->data.image.y, env);
 
-            render_pixbuf (drawable, clip, pixbuf, rx, ry);
+            render_pixbuf (drawable->drawable, clip, pixbuf, rx, ry);
 
             g_object_unref (G_OBJECT (pixbuf));
           }
@@ -3400,12 +3397,12 @@
         rwidth = parse_size_unchecked (op->data.gtk_arrow.width, env);
         rheight = parse_size_unchecked (op->data.gtk_arrow.height, env);
 
-        gtk_paint_arrow (widget->style,
-                         drawable,
+        gtk_paint_arrow (drawable->style,
+                         drawable->drawable,
                          op->data.gtk_arrow.state,
                          op->data.gtk_arrow.shadow,
                          (GdkRectangle*) clip,
-                         widget,
+                         drawable->widget,
                          "metacity",
                          op->data.gtk_arrow.arrow,
                          op->data.gtk_arrow.filled,
@@ -3422,12 +3419,12 @@
         rwidth = parse_size_unchecked (op->data.gtk_box.width, env);
         rheight = parse_size_unchecked (op->data.gtk_box.height, env);
 
-        gtk_paint_box (widget->style,
-                       drawable,
+        gtk_paint_box (drawable->style,
+                       drawable->drawable,
                        op->data.gtk_box.state,
                        op->data.gtk_box.shadow,
                        (GdkRectangle*) clip,
-                       widget,
+                       drawable->widget,
                        "metacity",
                        rx, ry, rwidth, rheight);
       }
@@ -3441,11 +3438,11 @@
         ry1 = parse_y_position_unchecked (op->data.gtk_vline.y1, env);
         ry2 = parse_y_position_unchecked (op->data.gtk_vline.y2, env);
         
-        gtk_paint_vline (widget->style,
-                         drawable,
+        gtk_paint_vline (drawable->style,
+                         drawable->drawable,
                          op->data.gtk_vline.state,
                          (GdkRectangle*) clip,
-                         widget,
+                         drawable->widget,
                          "metacity",
                          ry1, ry2, rx);
       }
@@ -3459,7 +3456,7 @@
         rwidth = parse_size_unchecked (op->data.icon.width, env);
         rheight = parse_size_unchecked (op->data.icon.height, env);
         
-        pixbuf = draw_op_as_pixbuf (op, widget, info,
+        pixbuf = draw_op_as_pixbuf (op, drawable, info,
                                     rwidth, rheight);
 
         if (pixbuf)
@@ -3467,7 +3464,7 @@
             rx = parse_x_position_unchecked (op->data.icon.x, env);
             ry = parse_y_position_unchecked (op->data.icon.y, env);
 
-            render_pixbuf (drawable, clip, pixbuf, rx, ry);
+            render_pixbuf (drawable->drawable, clip, pixbuf, rx, ry);
 
             g_object_unref (G_OBJECT (pixbuf));
           }
@@ -3479,14 +3476,14 @@
         {
           int rx, ry;
 
-          gc = get_gc_for_primitive (widget, drawable,
+          gc = get_gc_for_primitive (drawable,
                                      op->data.title.color_spec,
                                      clip, 0);
 
           rx = parse_x_position_unchecked (op->data.title.x, env);
           ry = parse_y_position_unchecked (op->data.title.y, env);
 
-          gdk_draw_layout (drawable, gc,
+          gdk_draw_layout (drawable->drawable, gc,
                            rx, ry,
                            info->title_layout);
 
@@ -3504,7 +3501,7 @@
         rheight = parse_size_unchecked (op->data.op_list.height, env);
 
         meta_draw_op_list_draw (op->data.op_list.op_list,
-                                widget, drawable, clip, info,
+                                drawable, clip, info,
                                 rx, ry, rwidth, rheight);
       }
       break;
@@ -3546,7 +3543,7 @@
                 while (tile_y < (ry + rheight))
                   {
                     meta_draw_op_list_draw (op->data.tile.op_list,
-                                            widget, drawable, &new_clip, info,
+                                            drawable, &new_clip, info,
                                             tile_x, tile_y, tile_width, tile_height);     
 
                     tile_y += tile_height;
@@ -3562,8 +3559,7 @@
 
 void
 meta_draw_op_draw (const MetaDrawOp    *op,
-                   GtkWidget           *widget,
-                   GdkDrawable         *drawable,
+		   MetaDrawable	       *drawable,
                    const GdkRectangle  *clip,
                    const MetaDrawInfo  *info,
                    int                  x,
@@ -3575,7 +3571,7 @@
 
   fill_env (&env, info, x, y, width, height);
 
-  meta_draw_op_draw_with_env (op, widget, drawable, clip,
+  meta_draw_op_draw_with_env (op, drawable, clip,
                               info, x, y, width, height,
                               &env);
 }
@@ -3633,8 +3629,7 @@
 
 void
 meta_draw_op_list_draw  (const MetaDrawOpList *op_list,
-                         GtkWidget            *widget,
-                         GdkDrawable          *drawable,
+			 MetaDrawable         *drawable,
                          const GdkRectangle   *clip,
                          const MetaDrawInfo   *info,
                          int                   x,
@@ -3693,7 +3688,7 @@
                active_clip.height > 0)
         {
           meta_draw_op_draw_with_env (op,
-                                      widget, drawable, &active_clip, info,
+                                      drawable, &active_clip, info,
                                       x, y, width, height,
                                       &env);
         }
@@ -3981,8 +3976,7 @@
 
 void
 meta_frame_style_draw (MetaFrameStyle          *style,
-                       GtkWidget               *widget,
-                       GdkDrawable             *drawable,
+		       MetaDrawable            *drawable,
                        int                      x_offset,
                        int                      y_offset,
                        const GdkRectangle      *clip,
@@ -4153,7 +4147,6 @@
 
           if (op_list)
             meta_draw_op_list_draw (op_list,
-                                    widget,
                                     drawable,
                                     &combined_clip,
                                     &draw_info,
@@ -4190,7 +4183,6 @@
                   
                   if (op_list)
                     meta_draw_op_list_draw (op_list,
-                                            widget,
                                             drawable,
                                             &combined_clip,
                                             &draw_info,
@@ -4807,8 +4799,7 @@
 
 void
 meta_theme_draw_frame (MetaTheme              *theme,
-                       GtkWidget              *widget,
-                       GdkDrawable            *drawable,
+		       MetaDrawable           *drawable,
                        const GdkRectangle     *clip,
                        int                     x_offset,
                        int                     y_offset,
@@ -4842,7 +4833,6 @@
                                    &fgeom);  
 
   meta_frame_style_draw (style,
-                         widget,
                          drawable,
                          x_offset, y_offset,
                          clip,
@@ -4856,8 +4846,7 @@
 
 void
 meta_theme_draw_menu_icon (MetaTheme          *theme,
-                           GtkWidget          *widget,
-                           GdkDrawable        *drawable,
+			   MetaDrawable	      *drawable,
                            const GdkRectangle *clip,
                            int                 x_offset,
                            int                 y_offset,
@@ -4871,7 +4860,7 @@
   g_return_if_fail (type < META_BUTTON_TYPE_LAST);  
 
   op_list = get_menu_icon (theme, type,
-                           GTK_WIDGET_STATE (widget));
+                           GTK_WIDGET_STATE (drawable->widget));
   
   info.mini_icon = NULL;
   info.icon = NULL;
@@ -4881,7 +4870,6 @@
   info.fgeom = NULL;
   
   meta_draw_op_list_draw (op_list,
-                          widget,
                           drawable,
                           clip,
                           &info,
@@ -5148,15 +5136,13 @@
 }
 
 PangoFontDescription*
-meta_gtk_widget_get_font_desc (GtkWidget *widget,
+meta_gtk_style_get_font_desc (GtkStyle *style,
                                double     scale,
 			       const PangoFontDescription *override)
 {
   PangoFontDescription *font_desc;
   
-  g_return_val_if_fail (GTK_WIDGET_REALIZED (widget), 0);
-
-  font_desc = pango_font_description_copy (widget->style->font_desc);
+  font_desc = pango_font_description_copy (style->font_desc);
 
   if (override)
     pango_font_description_merge (font_desc, override, TRUE);
Index: src/theme.h
===================================================================
RCS file: /cvs/gnome/metacity/src/theme.h,v
retrieving revision 1.37
diff -u -r1.37 theme.h
--- src/theme.h	10 Jan 2004 17:16:07 -0000	1.37
+++ src/theme.h	26 Jun 2004 18:28:42 -0000
@@ -103,6 +103,14 @@
   guint bottom_right_corner_rounded : 1;
 };
 
+/* Target for drawing */
+typedef struct _MetaDrawable
+{
+  GdkDrawable *drawable;
+  GtkStyle *style;
+  GtkWidget *widget;
+} MetaDrawable;
+ 
 /* Calculated actual geometry of the frame */
 struct _MetaFrameGeometry
 {
@@ -626,15 +634,14 @@
                                                 GtkStateType          state);
 void           meta_color_spec_free            (MetaColorSpec     *spec);
 void           meta_color_spec_render          (MetaColorSpec     *spec,
-                                                GtkWidget         *widget,
+                                                MetaDrawable      *drawable,
                                                 GdkColor          *color);
 
 
 MetaDrawOp*    meta_draw_op_new  (MetaDrawType        type);
 void           meta_draw_op_free (MetaDrawOp          *op);
 void           meta_draw_op_draw (const MetaDrawOp    *op,
-                                  GtkWidget           *widget,
-                                  GdkDrawable         *drawable,
+                                  MetaDrawable        *drawable,
                                   const GdkRectangle  *clip,
                                   const MetaDrawInfo  *info,
                                   /* logical region being drawn */
@@ -648,8 +655,7 @@
 void            meta_draw_op_list_ref   (MetaDrawOpList       *op_list);
 void            meta_draw_op_list_unref (MetaDrawOpList       *op_list);
 void            meta_draw_op_list_draw  (const MetaDrawOpList *op_list,
-                                         GtkWidget            *widget,
-                                         GdkDrawable          *drawable,
+					 MetaDrawable         *drawable,
                                          const GdkRectangle   *clip,
                                          const MetaDrawInfo  *info,
                                          int                   x,
@@ -666,7 +672,7 @@
 MetaGradientSpec* meta_gradient_spec_new    (MetaGradientType        type);
 void              meta_gradient_spec_free   (MetaGradientSpec       *desc);
 GdkPixbuf*        meta_gradient_spec_render (const MetaGradientSpec *desc,
-                                             GtkWidget              *widget,
+					     MetaDrawable           *drawable,
                                              int                     width,
                                              int                     height);
 gboolean          meta_gradient_spec_validate (MetaGradientSpec     *spec,
@@ -682,8 +688,7 @@
 void            meta_frame_style_unref (MetaFrameStyle *style);
 
 void meta_frame_style_draw (MetaFrameStyle          *style,
-                            GtkWidget               *widget,
-                            GdkDrawable             *drawable,
+			    MetaDrawable            *drawable,
                             int                      x_offset,
                             int                      y_offset,
                             const GdkRectangle      *clip,
@@ -728,8 +733,7 @@
                                    MetaFrameFlags flags);
 
 void meta_theme_draw_frame (MetaTheme              *theme,
-                            GtkWidget              *widget,
-                            GdkDrawable            *drawable,
+			    MetaDrawable           *drawable,
                             const GdkRectangle     *clip,
                             int                     x_offset,
                             int                     y_offset,
@@ -745,8 +749,7 @@
                             GdkPixbuf              *icon);
 
 void meta_theme_draw_menu_icon (MetaTheme          *theme,
-                                GtkWidget          *widget,
-                                GdkDrawable        *drawable,
+				MetaDrawable       *drawable,
                                 const GdkRectangle *clip,
                                 int                 x_offset,
                                 int                 y_offset,
@@ -813,6 +816,9 @@
 /* random stuff */
 
 PangoFontDescription* meta_gtk_widget_get_font_desc        (GtkWidget            *widget,
+                                                            double                scale,
+							    const PangoFontDescription *override);
+PangoFontDescription* meta_gtk_style_get_font_desc        (GtkStyle            *style,
                                                             double                scale,
 							    const PangoFontDescription *override);
 int                   meta_pango_font_desc_get_text_height (const PangoFontDescription *font_desc,
Index: src/ui.c
===================================================================
RCS file: /cvs/gnome/metacity/src/ui.c,v
retrieving revision 1.56
diff -u -r1.56 ui.c
--- src/ui.c	10 Jan 2004 17:16:07 -0000	1.56
+++ src/ui.c	26 Jun 2004 18:28:42 -0000
@@ -39,13 +39,39 @@
 
 static void meta_stock_icons_init (void);
 
+typedef struct _MetaUIColormap
+{
+  struct _MetaUIColormap  *next;
+  GdkScreen		  *screen;
+  GdkVisual		  *visual;
+  GdkColormap		  *cmap;
+} MetaUIColormap;
+
 struct _MetaUI
 {
   Display *xdisplay;
   Screen *xscreen;
   MetaFrames *frames;
+  MetaUIColormap *cmaps;
 };
 
+static GdkColormap *
+meta_ui_get_colormap (MetaUI *ui, GdkScreen *screen, GdkVisual *visual)
+{
+  MetaUIColormap *cmap;
+
+  for (cmap = ui->cmaps; cmap; cmap = cmap->next)
+    if (cmap->screen == screen && cmap->visual == visual)
+      return cmap->cmap;
+  cmap = g_new (MetaUIColormap, 1);
+  cmap->screen = screen;
+  cmap->visual = visual;
+  cmap->cmap = gdk_colormap_new (visual, FALSE);
+  cmap->next = ui->cmaps;
+  ui->cmaps = cmap;
+  return cmap->cmap;
+}
+
 void
 meta_ui_init (int *argc, char ***argv)
 {
@@ -140,6 +166,7 @@
   ui = g_new (MetaUI, 1);
   ui->xdisplay = xdisplay;
   ui->xscreen = screen;
+  ui->cmaps = 0;
 
   g_assert (xdisplay == gdk_display);
   ui->frames = meta_frames_new (XScreenNumberOfScreen (screen));
@@ -151,7 +178,16 @@
 void
 meta_ui_free (MetaUI *ui)
 {
+  MetaUIColormap *cmap;
+  
   gtk_widget_destroy (GTK_WIDGET (ui->frames));
+  
+  while ((cmap = ui->cmaps))
+  {
+    ui->cmaps = cmap->next;
+    g_object_unref (cmap->cmap);
+    g_free (cmap);
+  }
 
   g_free (ui);
 }
@@ -183,7 +219,7 @@
   gint attributes_mask;
   GdkWindow *window;
   GdkVisual *visual;
-  GdkColormap *cmap = gdk_screen_get_default_colormap (screen);
+  GdkColormap *cmap;
   
   /* Default depth/visual handles clients with weird visuals; they can
    * always be children of the root depth/visual obviously, but
@@ -191,13 +227,16 @@
    * visual as the client.
    */
   if (!xvisual)
+  {
     visual = gdk_screen_get_system_visual (screen);
+    cmap = gdk_screen_get_default_colormap (screen);
+  }
   else
-    {
-      visual = gdk_x11_screen_lookup_visual (screen,
-                                             XVisualIDFromVisual (xvisual));
-      cmap = gdk_colormap_new (visual, FALSE);
-    }
+  {
+    visual = gdk_x11_screen_lookup_visual (screen,
+					   XVisualIDFromVisual (xvisual));
+    cmap = meta_ui_get_colormap (ui, screen, visual);
+  }
 
   attrs.title = NULL;
 

Attachment: pgpyLEvmposIT.pgp
Description: PGP signature



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]