Hi,

I have a new tentative patch, which seems to be working correctly. Would you
mind dropping it in debian/patches and checking whether the bug still applies?

Be aware that the patch is against the recently-released 0.9.6 version of
scrotwm; you can grab the source tree for an updated Debian package from the
usual location on bzr.debian.org.

Let me know how it goes.

-- 
Andrea Bolognani <e...@kiyuko.org>
Resistance is futile, you will be garbage collected.
Index: scrotwm/scrotwm.c
===================================================================
--- scrotwm.orig/scrotwm.c	2009-09-21 22:02:06.000000000 +0200
+++ scrotwm/scrotwm.c	2009-09-21 23:27:37.000000000 +0200
@@ -787,6 +787,36 @@
 	XSendEvent(display, win->id, False, StructureNotifyMask, (XEvent *)&ce);
 }
 
+void
+set_win_state(Window w, long state)
+{
+	long			data[] = {state, None};
+
+	DNPRINTF(SWM_D_EVENT, "set_win_state: window: %lu\n", w);
+
+	XChangeProperty(display, w, astate, astate, 32, PropModeReplace,
+	    (unsigned char *)data, 2);
+}
+
+long
+get_win_state(Window w)
+{
+	int			format, status;
+	long			result = -1;
+	unsigned char		*p = NULL;
+	unsigned long		n, extra;
+	Atom			real;
+
+	status = XGetWindowProperty(display, w, astate, 0L, 2L, False, astate,
+	    &real, &format, &n, &extra, (unsigned char **)&p);
+	if (status != Success)
+		return (-1);
+	if (n != 0)
+		result = *((long *)p);
+	XFree(p);
+	return (result);
+}
+
 int
 count_win(struct workspace *ws, int count_transient)
 {
@@ -1527,6 +1557,7 @@
 		adjust_font(win);
 		mask = CWX | CWY | CWWidth | CWHeight | CWBorderWidth;
 		XConfigureWindow(display, win->id, mask, &wc);
+		set_win_state(win->id, NormalState);
 		XMapRaised(display, win->id);
 
 		last_h = win_g.h;
@@ -1541,6 +1572,7 @@
 			continue;
 
 		stack_floater(win, ws->r);
+		set_win_state(win->id, NormalState);
 		XMapRaised(display, win->id);
 	}
 
@@ -1679,8 +1711,10 @@
 
 			if (win == ws->focus) {
 				XMapRaised(display, win->id);
-			} else
+			} else {
+				set_win_state(win->id, IconicState);
 				XUnmapWindow(display, win->id);
+			}
 		}
 	}
 
@@ -2628,17 +2662,6 @@
 			buttons[i].func(win, &buttons[i].args);
 }
 
-void
-set_win_state(struct ws_win *win, long state)
-{
-	long			data[] = {state, None};
-
-	DNPRINTF(SWM_D_EVENT, "set_win_state: window: %lu\n", win->id);
-
-	XChangeProperty(display, win->id, astate, astate, 32, PropModeReplace,
-	    (unsigned char *)data, 2);
-}
-
 const char *quirkname[] = {
 	"NONE",		/* config string for "no value" */
 	"FLOAT",
@@ -3139,7 +3162,7 @@
 	XSelectInput(display, id, EnterWindowMask | FocusChangeMask |
 	    PropertyChangeMask | StructureNotifyMask);
 
-	set_win_state(win, NormalState);
+	set_win_state(win->id, NormalState);
 
 	/* floaters need to be mapped if they are in the current workspace */
 	if (win->floating && (ws->idx == r->ws->idx))
@@ -3180,7 +3203,7 @@
 		ws->focus_prev = NULL;
 
 	TAILQ_REMOVE(&win->ws->winlist, win, entry);
-	set_win_state(win, WithdrawnState);
+	set_win_state(win->id, WithdrawnState);
 	if (win->ch.res_class)
 		XFree(win->ch.res_class);
 	if (win->ch.res_name)
@@ -3353,6 +3376,7 @@
 		return;
 	if (wa.override_redirect)
 		return;
+	set_win_state(e->xmaprequest.window, NormalState);
 	manage_window(e->xmaprequest.window);
 
 	stack();
@@ -3402,8 +3426,10 @@
 	DNPRINTF(SWM_D_EVENT, "unmapnotify: window: %lu\n", e->xunmap.window);
 
 	if ((win = find_window(ev->window)) != NULL)
-		if (win->transient)
+		if (get_win_state(win->id) != IconicState)
 			unmanage_window(win);
+
+	stack();
 }
 
 void
@@ -3453,25 +3479,6 @@
 	return (0);
 }
 
-long
-getstate(Window w)
-{
-	int			format, status;
-	long			result = -1;
-	unsigned char		*p = NULL;
-	unsigned long		n, extra;
-	Atom			real;
-
-	status = XGetWindowProperty(display, w, astate, 0L, 2L, False, astate,
-	    &real, &format, &n, &extra, (unsigned char **)&p);
-	if (status != Success)
-		return (-1);
-	if (n != 0)
-		result = *((long *)p);
-	XFree(p);
-	return (result);
-}
-
 void
 new_region(struct swm_screen *s, int x, int y, int w, int h)
 {
@@ -3709,7 +3716,7 @@
 				continue;
 
 			if (wa.map_state == IsViewable ||
-			    getstate(wins[j]) == NormalState)
+			    get_win_state(wins[j]) == NormalState)
 				manage_window(wins[j]);
 		}
 		/* transient windows */
@@ -3718,7 +3725,7 @@
 				continue;
 
 			if (XGetTransientForHint(display, wins[j], &d1) &&
-			    (wa.map_state == IsViewable || getstate(wins[j]) ==
+			    (wa.map_state == IsViewable || get_win_state(wins[j]) ==
 			    NormalState))
 				manage_window(wins[j]);
                 }

Attachment: signature.asc
Description: Digital signature

Reply via email to