Metacity changes to paint ARGB window titles correctly



For those of you who've tried them, Metacity generates some "interesting" 
images on the screen when painting the frame for an ARGB window.

I discovered the root cause and have kludged a partial fix.

The basic problem is that Metacity shares one single "widget" to hold the 
style for every frame.  A cheap hack, which works as long as every frame 
uses the same visual and colormap, which of course they do except for ARGB 
windows.

I think the correct solution is to give each frame its own style using 
gtk_style_attach from the shared frames style.

However, the problem is that the theme drawing code all passes around the 
frames widget as a handle to the style and (separately) the GdkDrawable 
representing the individual frame itself.

Instead of rewriting all of the drawing code, I kludged things by 
replacing the style in the shared frames widget with the frame's style.  
This actually worked, but it sure looks wrong in the code.

Here's the patches; I sent necessary fixes for gdk to gtk-devel-list.
This patch is almost certainly missing code necessary to get the per-frame 
styles updated when the shared frames style is changed.  I fear attempting 
that though.

-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	18 Jun 2004 23:09:38 -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	18 Jun 2004 23:09:38 -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->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->style,
                             frame->window, GTK_STATE_NORMAL);
   gdk_window_invalidate_rect (frame->window, NULL, FALSE);
 }
@@ -476,12 +476,13 @@
   
   frame->window = window;
 
+  frame->style = gtk_style_attach (GTK_WIDGET(frames)->style, frame->window);
+  
   gdk_window_set_user_data (frame->window, frames);
-  gtk_style_set_background (GTK_WIDGET (frames)->style,
+  gtk_style_set_background (frame->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;
@@ -613,7 +614,7 @@
 
   frame = meta_frames_lookup_window (frames, xwindow);
   
-  gtk_style_set_background (widget->style, frame->window, GTK_STATE_NORMAL);
+  gtk_style_set_background (frame->style, frame->window, GTK_STATE_NORMAL);
 }
 
 static void
@@ -1734,9 +1735,14 @@
   int screen_width, screen_height;
   MetaButtonLayout button_layout;
   MetaGrabOp grab_op;
+
+  GtkStyle *save_style;
   
   widget = GTK_WIDGET (frames);
 
+  save_style = widget->style;
+  widget->style = frame->style;
+
   i = 0;
   while (i < META_BUTTON_TYPE_LAST)
     {
@@ -1888,6 +1894,8 @@
       
       ++i;
     }
+
+  widget->style = save_style;
 
   gdk_region_destroy (edges);
   g_free (areas);
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	18 Jun 2004 23:09:38 -0000
@@ -67,6 +67,8 @@
 {
   Window xwindow;
   GdkWindow *window;
+  GtkStyle *style;
+  /* style of frame */
   MetaFrameStyle *cache_style;
   PangoLayout *layout;
   int text_height;
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	18 Jun 2004 23:09:39 -0000
@@ -183,7 +183,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 +191,16 @@
    * visual as the client.
    */
   if (!xvisual)
+  {
     visual = gdk_screen_get_system_visual (screen);
+    cmap = gdk_colormap_ref (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 = gdk_colormap_new (visual, FALSE);
+  }
 
   attrs.title = NULL;
 
@@ -224,6 +227,8 @@
   window =
     gdk_window_new (gdk_screen_get_root_window(screen),
 		    &attrs, attributes_mask);
+
+  g_object_unref (cmap);
 
   gdk_window_resize (window, width, height);
   

Attachment: pgpG1Mcst2yxN.pgp
Description: PGP signature



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