[Xfce4-commits] r25830 - xfwm4/trunk/src

Olivier Fourdan olivier at xfce.org
Fri Jun 22 00:21:10 CEST 2007


Author: olivier
Date: 2007-06-21 22:21:09 +0000 (Thu, 21 Jun 2007)
New Revision: 25830

Modified:
   xfwm4/trunk/src/client.c
   xfwm4/trunk/src/display.c
   xfwm4/trunk/src/display.h
   xfwm4/trunk/src/hints.c
   xfwm4/trunk/src/hints.h
   xfwm4/trunk/src/mypixmap.c
Log:
Fix xfwm4 hanging with gtk+-2.11.x (Bug #3346) - Patch based on a similar fix for Metacity, see gnome bug #354213

Modified: xfwm4/trunk/src/client.c
===================================================================
--- xfwm4/trunk/src/client.c	2007-06-21 09:45:16 UTC (rev 25829)
+++ xfwm4/trunk/src/client.c	2007-06-21 22:21:09 UTC (rev 25830)
@@ -4888,21 +4888,19 @@
 
     if (passdata.c)
     {
-        GdkPixbuf *icon;
-
         TRACE ("entering cycle loop");
         passdata.wireframe = wireframeCreate (passdata.c);
-        icon = getAppIcon (display_info, passdata.c->window, 32, 32);
         passdata.tabwin = tabwinCreate (passdata.c->screen_info->gscr, c,
                                         passdata.c, passdata.cycle_range,
                                         screen_info->params->cycle_workspaces);
         eventFilterPush (display_info->xfilter, clientCycleEventFilter, &passdata);
         gtk_main ();
         eventFilterPop (display_info->xfilter);
-        wireframeDelete (screen_info, passdata.wireframe);
         TRACE ("leaving cycle loop");
         tabwinDestroy (passdata.tabwin);
         g_free (passdata.tabwin);
+        wireframeDelete (screen_info, passdata.wireframe);
+        updateXserverTime (display_info);
     }
 
     if (passdata.c)

Modified: xfwm4/trunk/src/display.c
===================================================================
--- xfwm4/trunk/src/display.c	2007-06-21 09:45:16 UTC (rev 25829)
+++ xfwm4/trunk/src/display.c	2007-06-21 22:21:09 UTC (rev 25830)
@@ -178,6 +178,19 @@
                           FALSE, display_info->atoms) != 0);
 }
 
+static void
+myDisplayCreateTimestampWin (DisplayInfo *display_info)
+{
+    XSetWindowAttributes attributes;
+
+    attributes.event_mask = PropertyChangeMask;
+    attributes.override_redirect = TRUE;
+    display_info->timestamp_win = 
+        XCreateWindow (display_info->dpy, DefaultRootWindow (display_info->dpy),
+                       -100, -100, 10, 10, 0, 0, CopyFromParent, CopyFromParent,
+                       CWEventMask | CWOverrideRedirect, &attributes);
+}
+
 DisplayInfo *
 myDisplayInit (GdkDisplay *gdisplay)
 {
@@ -309,6 +322,8 @@
     display->resize_cursor[CORNER_COUNT + SIDE_BOTTOM] =
         XCreateFontCursor (display->dpy, XC_bottom_side);
 
+    myDisplayCreateTimestampWin (display);
+
     display->xfilter = NULL;
     display->screens = NULL;
     display->clients = NULL;
@@ -340,6 +355,8 @@
     display->move_cursor = None;
     XFreeCursor (display->dpy, display->root_cursor);
     display->root_cursor = None;
+    XDestroyWindow (display->dpy, display->timestamp_win);
+    display->timestamp_win = None;
 
     if (display->hostname)
     {

Modified: xfwm4/trunk/src/display.h
===================================================================
--- xfwm4/trunk/src/display.h	2007-06-21 09:45:16 UTC (rev 25829)
+++ xfwm4/trunk/src/display.h	2007-06-21 22:21:09 UTC (rev 25830)
@@ -272,6 +272,7 @@
     gboolean quit;
     gboolean reload;
 
+    Window timestamp_win;
     Cursor busy_cursor;
     Cursor move_cursor;
     Cursor root_cursor;

Modified: xfwm4/trunk/src/hints.c
===================================================================
--- xfwm4/trunk/src/hints.c	2007-06-21 09:45:16 UTC (rev 25829)
+++ xfwm4/trunk/src/hints.c	2007-06-21 22:21:09 UTC (rev 25830)
@@ -1167,27 +1167,18 @@
     return setXAtomManagerOwner(display_info, display_info->atoms[atom_id], root, w);
 }
 
-
-static Bool
-checkPropEvent (Display *display, XEvent *xevent, XPointer arg)
+void
+updateXserverTime (DisplayInfo *display_info)
 {
-    DisplayInfo *display_info;
     ScreenInfo *screen_info;
+    char c = '\0';
 
-    display_info = (DisplayInfo *) arg;
-    g_return_val_if_fail (display_info, FALSE);
+    g_return_if_fail (display_info);
 
-    screen_info = myDisplayGetDefaultScreen (display_info);
-    g_return_val_if_fail (screen_info, FALSE);
-
-    if ((xevent->type == PropertyNotify) &&
-        (xevent->xproperty.window == screen_info->xfwm4_win) &&
-        (xevent->xproperty.atom == display_info->atoms[XFWM4_TIMESTAMP_PROP]))
-    {
-        return TRUE;
-    }
-
-    return FALSE;
+    XChangeProperty (display_info->dpy, display_info->timestamp_win,
+                     display_info->atoms[XFWM4_TIMESTAMP_PROP],
+                     display_info->atoms[XFWM4_TIMESTAMP_PROP],
+                     8, PropModeReplace, (unsigned char *) &c, 1);
 }
 
 Time
@@ -1196,7 +1187,6 @@
     ScreenInfo *screen_info;
     XEvent xevent;
     Time timestamp;
-    char c = '\0';
 
     g_return_val_if_fail (display_info, (Time) CurrentTime);
     timestamp = myDisplayGetCurrentTime (display_info);
@@ -1206,12 +1196,8 @@
         g_return_val_if_fail (screen_info,  (Time) CurrentTime);
 
         TRACE ("getXServerTime: Using X server roundtrip");
-        XChangeProperty (display_info->dpy, screen_info->xfwm4_win,
-                         display_info->atoms[XFWM4_TIMESTAMP_PROP],
-                         display_info->atoms[XFWM4_TIMESTAMP_PROP],
-                         8, PropModeReplace, (unsigned char *) &c, 1);
-        XIfEvent (display_info->dpy, &xevent, checkPropEvent, (XPointer) display_info);
-
+        updateXserverTime (display_info);
+        XWindowEvent (display_info->dpy, display_info->timestamp_win, PropertyChangeMask, &xevent);
         timestamp = (Time) myDisplayUpdateCurrentTime (display_info, &xevent);
     }
 

Modified: xfwm4/trunk/src/hints.h
===================================================================
--- xfwm4/trunk/src/hints.h	2007-06-21 09:45:16 UTC (rev 25829)
+++ xfwm4/trunk/src/hints.h	2007-06-21 22:21:09 UTC (rev 25830)
@@ -269,6 +269,7 @@
                                                                  int,
                                                                  Window ,
                                                                  Window);
+void                     updateXserverTime                      (DisplayInfo *);
 Time                     getXServerTime                         (DisplayInfo *);
 
 #ifdef ENABLE_KDE_SYSTRAY_PROXY

Modified: xfwm4/trunk/src/mypixmap.c
===================================================================
--- xfwm4/trunk/src/mypixmap.c	2007-06-21 09:45:16 UTC (rev 25829)
+++ xfwm4/trunk/src/mypixmap.c	2007-06-21 22:21:09 UTC (rev 25830)
@@ -941,12 +941,7 @@
     g_return_val_if_fail (dir != NULL, FALSE);
     g_return_val_if_fail (file != NULL, FALSE);
 
-    pm->screen_info = screen_info;
-    pm->pixmap = None;
-    pm->mask = None;
-    pm->width = 1;
-    pm->height = 1;
-
+    xfwmPixmapInit (screen_info, pm);
     /*
      * Always try to load the XPM first, using our own routine
      * that supports XPM color symbol susbstitution (used to



More information about the Xfce4-commits mailing list