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