Reliability fix wrt gtk+2 update, xfwm4 was badly locking.

- Tweak WANTLIB while here.
- Upstream bug report : http://bugzilla.xfce.org/show_bug.cgi?id=3346
- Thanks to Samuel Verstraete from Lunar-Linux for pointing me at the patch.
- feedback from steven@ and jasper@
"go ahead" jasper@
This commit is contained in:
landry 2007-10-26 11:16:32 +00:00
parent 0a48c9c773
commit 3d361c1191
6 changed files with 155 additions and 2 deletions

View File

@ -1,8 +1,9 @@
# $OpenBSD: Makefile,v 1.15 2007/09/15 20:04:27 merdely Exp $
# $OpenBSD: Makefile,v 1.16 2007/10/26 11:16:32 landry Exp $
COMMENT= xfce4 window manager
V= 4.4.1
DISTNAME= xfwm4-${V}
PKGNAME= ${DISTNAME}p0
HOMEPAGE= http://www.xfce.org/projects/xfwm4/
MAINTAINER= Landry Breuil <gaston@gcu.info>
@ -26,7 +27,7 @@ WANTLIB= ICE SM X11 Xcomposite Xdamage Xext Xfixes Xrandr freetype \
Xrender Xau Xdmcp expat Xcursor Xi Xinerama fontconfig \
atk-1.0 gdk-x11-2.0 gdk_pixbuf-2.0 glib-2.0 \
gmodule-2.0 gobject-2.0 gtk-x11-2.0 pango-1.0 \
pangoft2-1.0 startup-notification-1 \
pangoft2-1.0 startup-notification-1 pcre \
xfce4util.>=1 pangocairo-1.0 cairo glitz png z c m
.include <bsd.port.mk>

View File

@ -0,0 +1,27 @@
$OpenBSD: patch-src_client_c,v 1.1 2007/10/26 11:16:32 landry Exp $
--- src/client.c.orig Mon Apr 2 21:48:20 2007
+++ src/client.c Fri Oct 26 10:04:18 2007
@@ -4868,21 +4868,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)

View File

@ -0,0 +1,41 @@
$OpenBSD: patch-src_display_c,v 1.1 2007/10/26 11:16:32 landry Exp $
--- src/display.c.orig Mon Apr 2 21:32:01 2007
+++ src/display.c Fri Oct 26 10:04:18 2007
@@ -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)
{

View File

@ -0,0 +1,11 @@
$OpenBSD: patch-src_display_h,v 1.1 2007/10/26 11:16:32 landry Exp $
--- src/display.h.orig Mon Apr 2 21:32:01 2007
+++ src/display.h Fri Oct 26 10:04:18 2007
@@ -226,6 +226,7 @@ struct _DisplayInfo
gboolean quit;
gboolean reload;
+ Window timestamp_win;
Cursor busy_cursor;
Cursor move_cursor;
Cursor root_cursor;

View File

@ -0,0 +1,62 @@
$OpenBSD: patch-src_hints_c,v 1.1 2007/10/26 11:16:32 landry Exp $
--- src/hints.c.orig Sun Mar 11 14:44:43 2007
+++ src/hints.c Fri Oct 26 10:04:18 2007
@@ -1167,27 +1167,18 @@ setAtomIdManagerOwner (DisplayInfo *display_info, int
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 @@ 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);
}

View File

@ -0,0 +1,11 @@
$OpenBSD: patch-src_hints_h,v 1.1 2007/10/26 11:16:32 landry Exp $
--- src/hints.h.orig Sun Mar 11 14:44:43 2007
+++ src/hints.h Fri Oct 26 10:04:18 2007
@@ -269,6 +269,7 @@ gboolean setAtomIdManagerOwner
int,
Window ,
Window);
+void updateXserverTime (DisplayInfo *);
Time getXServerTime (DisplayInfo *);
#ifdef ENABLE_KDE_SYSTRAY_PROXY