maximized state and normal frame size lost after hide/show

Thomas Lübking thomas.luebking at gmail.com
Fri Aug 14 12:48:17 PDT 2015


On Freitag, 14. August 2015 18:00:52 CEST, Cosmin Apreutesei wrote:

> Well, I'm using XWithdrawWindow() if it makes any difference, because
> XUnmapWindow() doesn't properly hide minimized windows (it doesn't
> send UnmapNotify).

Aha.

XWithdrawWindow() basically tells the windowmanager: "please forget about this window. I'll now re-use it for entirely different purposes"

> The fact that you're skeptical of this makes me think this is a bug in
> Unity.

Yesno. (Some) compositing windowmanagers (conditionally) do no unmap iconified (ie. "minimized") windows in order to keep the redirected windows updated (when showing previews in exposé clones or the taskbar tooltips etc.)



The correct solution depends on what you're trying to do, but if you want to know when a window was "minimized" (in a managed environment and that *is* supposed to work with compositing WMs as well) you'd rather track the WM_STATE¹ and/or _NET_WM_STATE² (for _NET_WM_STATE_HIDDEN) properties.

If you want to "minimize" the window, the "proper" approach is to ask³ the windowmanager to do so.

FYI, X11 is not an API but a protocol. APIs like Xlib or xcb implement it and user code would rather use toolkits like Qt, gtk, fltk, ... which more or less nicely abtract the usual tasks.

> function restore()
>    if minimized() then
>       unminimize()
>    elseif maximized() then
>       unmaximize()
>    end
> end
>
> If that's not provided by the API already, how can I possibly
> implement the above with an async API?

I'm not actually sure where you see an async problem in the above - "minimized" would query formentioned WM_STATE property (as "minimized" does *not* equal unmapped - notably windows can be unmapped w/o being tagged "iconified", eg. when being shaded; for "unmapped" use XGetWindowAttributes[4]) and "of course" X11 knows something like a blocking (not actually, though) process via XSync()[5] which will ensure at least the calls of your client have been processed (how other clients react to this is a different question - if you want to wait for a reaction of the window manager process, you obviously need to wait for that)

You're confusing things here in that X11 is, as mentioned, NOT an API and Xlib is a very low-level API. It's not meant to be "simple".
Also Wayland is like X, but unlike Mir, a protocol - (rather) not an API.

Doing what you suggested in an abstraction layer like eg. Qt is indeed /that/ simple as you wrote it down.


Cheers,
Thomas

[1] https://tronche.com/gui/x/icccm/sec-4.html
[2] http://standards.freedesktop.org/wm-spec/wm-spec-latest.html#idm140200472615568
[3] https://tronche.com/gui/x/xlib/ICC/client-to-window-manager/XIconifyWindow.html
[4] https://tronche.com/gui/x/xlib/window-information/XGetWindowAttributes.html
[5] https://tronche.com/gui/x/xlib/event-handling/XSync.html


More information about the xorg mailing list