[Xlib] Saving state before an unmap

Andrew Troschinetz ast at arlut.utexas.edu
Wed Feb 11 14:23:24 PST 2009

Hi all,

Basically I want to unmap a window, fiddle with it a bit (like  
removing the border, removing the maximize button, etc...) and then  
remap it. The problem I'm running into is that unmapping the window  
results in unintended side-effects. Take the _NET_WM_STATE property  
for example, it gets blown away if you unmap the window. This results  
in things like a window being kept-below before I fiddle with it, but  
then after I remap it, the window will no longer be kept-below anymore.

Is there a general Xlib idiom for saving all of a window's state  
before an unmap operation, and then restoring it after a subsequent re- 
map operation? The solution I came up with (no doubt sub-optimal) is  

1. Get the current _NET_WM_STATE property.
2. unmap the window and fiddle with it.
3. re-map the window.
4. use XChangeProperty() to change _NET_WM_STATE back to what it was  
before, Atom by Atom (see next step as to why I do it Atom by Atom).
5. Send out an ClientMessage XEvent for every Atom we just changed in  
_NET_WM_STATE (I think this is necessary because the union we get for  
a ClientMessage isn't big enough for us to send notification of all  
changed Atoms if there are many multiple Atoms set for the  
_NET_WM_STATE property).

There has to be a better way, right?

Alternatively, if there is a way to remove the close/minimize/maximize  
buttons or window-decorations from a window w/o unmapping it (or w/o  
losing the window's current _NET_WM_STATE property) that'd be awesome.  
It has to work on an already mapped window, as that is my intended use  

Essentially, I'm writing a "window-manager-lite on top of a real  
window manager" so that I can manipulate all the windows of all the  
disparate applications of the software suite I'm developing in various  
ways. It's a little complicated, but probably not as complicated as  
I'm making it sound. Essentially the use case is that the user may at  
any point command the window of another application to remove (or un- 
remove) its border/close-button/etc, and I need to respect as much of  
the current window state of the target window as possible (ie:  
_NET_WM_STATE and possibly other Extended Window Manager Hints  
properties that I haven't even thought of yet.)

Any ideas?

Andrew Troschinetz
Applied Research Laboratories

More information about the xorg mailing list