From e9c3fed4db4386999369033aeb07db7297611c04 Mon Sep 17 00:00:00 2001 From: Olivier Fourdan <fourdan.olivier@wanadoo.fr> Date: Thu, 21 Jun 2007 22:21:09 +0000 Subject: [PATCH] Fix xfwm4 hanging with gtk+-2.11.x (Bug #3346) - Patch based on a similar fix for Metacity, see gnome bug #354213 (Old svn revision: 25830) --- src/client.c | 6 ++---- src/display.c | 17 +++++++++++++++++ src/display.h | 1 + src/hints.c | 34 ++++++++++------------------------ src/hints.h | 1 + src/mypixmap.c | 7 +------ 6 files changed, 32 insertions(+), 34 deletions(-) diff --git a/src/client.c b/src/client.c index f6d4375fb..1eb933826 100644 --- a/src/client.c +++ b/src/client.c @@ -4888,21 +4888,19 @@ clientCycle (Client * c, XEvent * ev) 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) diff --git a/src/display.c b/src/display.c index f5562dc49..69d4a646e 100644 --- a/src/display.c +++ b/src/display.c @@ -178,6 +178,19 @@ myDisplayInitAtoms (DisplayInfo *display_info) 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 @@ myDisplayInit (GdkDisplay *gdisplay) 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 @@ myDisplayClose (DisplayInfo *display) 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) { diff --git a/src/display.h b/src/display.h index 38876d2fa..0cc06eeda 100644 --- a/src/display.h +++ b/src/display.h @@ -272,6 +272,7 @@ struct _DisplayInfo gboolean quit; gboolean reload; + Window timestamp_win; Cursor busy_cursor; Cursor move_cursor; Cursor root_cursor; diff --git a/src/hints.c b/src/hints.c index 4e0d31951..c6da99859 100644 --- a/src/hints.c +++ b/src/hints.c @@ -1167,27 +1167,18 @@ setAtomIdManagerOwner (DisplayInfo *display_info, int atom_id, Window root, Wind 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); - - screen_info = myDisplayGetDefaultScreen (display_info); - g_return_val_if_fail (screen_info, FALSE); + g_return_if_fail (display_info); - 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 @@ getXServerTime (DisplayInfo *display_info) 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 @@ getXServerTime (DisplayInfo *display_info) 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); } diff --git a/src/hints.h b/src/hints.h index 562808206..8f8ed182f 100644 --- a/src/hints.h +++ b/src/hints.h @@ -269,6 +269,7 @@ gboolean setAtomIdManagerOwner (DisplayInfo *, int, Window , Window); +void updateXserverTime (DisplayInfo *); Time getXServerTime (DisplayInfo *); #ifdef ENABLE_KDE_SYSTRAY_PROXY diff --git a/src/mypixmap.c b/src/mypixmap.c index 13c22d54d..78b30146c 100644 --- a/src/mypixmap.c +++ b/src/mypixmap.c @@ -941,12 +941,7 @@ xfwmPixmapLoad (ScreenInfo * screen_info, xfwmPixmap * pm, gchar * dir, gchar * 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 -- GitLab