Ian> Now I know why it behaves this way. In events.c, map_request(), Ian> add_window() is called first. That will aplly the matchers, but Ian> _then_ the check is made is initial_state == IconicState and if Ian> this is true the window is iconified. Ian> The right fix would seem to be to use the raw X ID and Ian> XIconifyWindow() instead of rep's Qiconify_window, and do it Ian> _before_ the add_window() call. Here's the patch. Sorry, I don't know how to post it in the wiki; can someone else please take care of that? Thanks.
diff -u --recur sawfish-1.3.5.1.old/src/events.c sawfish-1.3.5.1/src/events.c
--- sawfish-1.3.5.1.old/src/events.c 2008-11-19 12:45:08.000000000 -0800
+++ sawfish-1.3.5.1/src/events.c 2009-01-18 11:28:07.000000000 -0800
@@ -747,6 +747,19 @@
Lisp_Window *w = find_window_by_id (id);
if (w == 0)
{
+ /* The reason for doing this before the add is to give matchers
+ * a chance to do their thing and reverse the iconification,
+ * if the user desires. There's a minor downside: rep doesn't
+ * know about this, so any hooks that might be operative for
+ * iconification don't get run, and there's no iconify sound.
+ * But it can be argued that this is the Right Thing anyway,
+ * since the hint was set outside of rep's watch too. */
+ XWMHints* wmhints = XGetWMHints(dpy, id);
+ if (wmhints && (wmhints->flags & StateHint)
+ && wmhints->initial_state == IconicState)
+ XIconifyWindow(dpy, id, screen_num);
+ if (wmhints)
+ XFree(wmhints);
/* Also adds the frame. */
w = add_window (id);
if (w == 0)
@@ -754,12 +767,6 @@
fprintf (stderr, "warning: failed to allocate a window\n");
return;
}
- if (w->wmhints && w->wmhints->flags & StateHint
- && w->wmhints->initial_state == IconicState)
- {
- rep_call_lisp1 (module_symbol_value (rep_VAL (&iconify_mod),
- Qiconify_window), rep_VAL(w));
- }
}
else
{
Attachment:
signature.asc
Description: Dies ist ein digital signierter Nachrichtenteil