Bug: NETWM_CLIENT_LIST, NETWM_CLIENT_LIST_STACKING
Ava Arachne Jarvis
ajar at katanalynx.dyndns.org
Mon Dec 23 20:17:57 EST 2002
Openbox version 2.2.2 (and, as far as I know, all versions before that
which were NETWM compliant).
This is the bug that is tripping up libwnck operation, which affects the
GNOME2 desktop and other libwnck related utilities, like devilspie[1],
and I don't blame it. According to the NETWM specs:
http://www.freedesktop.org/standards/wm-spec/x107.html
3.2. _NET_CLIENT_LIST
_NET_CLIENT_LIST, WINDOW[]/32
_NET_CLIENT_LIST_STACKING, WINDOW[]/32
These arrays contain all X Windows managed by the Window Manager.
_NET_CLIENT_LIST has initial mapping order, starting with the oldest
window. _NET_CLIENT_LIST_STACKING has bottom-to-top stacking order.
These properties SHOULD be set and updated by the Window Manager.
However, while Openbox (and, I imagine, Blackbox and Fluxbox code as
well) do put all windows into NET_CLIENT_LIST, NET_CLIENT_LIST_STACKING
only contains windows with an associated workspace -- which excludes
iconified windows. Since these two lists are not the same in Openbox
when there are iconified windows, libwnck contains to wait for them to
be so (since a difference between the two lists is, by the specs, not a
stable state)[2].
That's why the pager/window list/devilspie/etc stop working when there's
something iconified in Openbox.
I would send in a patch, but I'm not sure how to fix this exactly. I
think the iconified windows should go in at the bottom of the stacking
list, if only because I can't think of anywhere else they should go that
would be sane.
[1] Devilspie is a NETWM-compliant daemon that takes care of
application-specific NETWM properties like stickiness, which
workspace(s) they're on, etc. Very nice. You can get read
a little more about it here:
http://www.burtonini.com/computing/devilspie
see the GNOME software map entry and download the tarball from here:
http://www.gnome.org/softwaremap/
and download Debian packages and source from here:
http://www.burtonini.com/debian/
[2] Relevant code bits:
- Screen.cc: updateClientList() versus updateStackingList()
in particular, updateStackingList() does this:
getCurrentWorkspace()->appendStackOrder(stack_order);
for (unsigned int i = 0; i < getWorkspaceCount(); ++i)
if (i != getCurrentWorkspaceID())
getWorkspace(i)->appendStackOrder(stack_order);
and never adds iconified windows separately.
- Window.cc: BlackboxWindow::iconify()
in particular, this line in this function
screen->getWorkspace(blackbox_attrib.workspace)->removeWindow(this);
which leaves iconified windows with no workspace, and thus they
are not added in updateStackingList().
--
| Some people carve careers, others chisel them.
More information about the openbox
mailing list