How to find the X geometry of the root window that excludes any GNOME panels or other GNOME “things”?

StackOverflow https://stackoverflow.com/questions/8113764

  •  28-02-2021
  •  | 
  •  

Question

I need to find a way to obtain the geometry suitable to pass to some X window command's -geometry option so that it is guaranteed to cover all of the X root window that does not overlap with anything GNOME itself manages (e.g., the GNOME Panel window). This is not the same as the output of xwininfo -root which will return the geometry for the entire X root window, and will necessarily include the real estate consumed by the GNOME panel. I don't need the same to be true for KDE since I no longer use KDE.

I would preferably like to be able to obtain that geometry using X windows command line utilities and not have to resort to Xlib programming (i.e., I would like to do so from scripts). The scripts can be dependent upon GNOME command-line utilities.

Using basic math to "subtract" out the GNOME Panel would be an option, but only if I could have a guarantee that I would only need to account for the one and only GNOME Panel X window. But I suspect the GNOME Panel window is not the only one that needs to be considered. I say that because there is a window at the bottom that xwininfo reveals as "Bottom Expanded Edge Panel" that may or may not be in conflict real-estate-wise, since only displays when the mouse is moved to the very bottom of the X root window. But if the GNOME Panel really is the only one to consider, then that "subtraction" method might just be good enough.

My use case is this: I am using rdesktop to RDP into various Microsoft Windows desktops. The user needs to decide, before executing rdesktop, the dimensions on the X window, since it is not resizable after it is displayed. I need that window to consume the maximum amount of root window real-estate provided it doesn't conflict with the GNOME-managed windows like the GNOME Panel. What I am doing now is hardcoding the geometry for a specific desktop in my wrapper scripts that call rdesktop, but that fails to do what I want because I work from various desktops that necessarily vary in display hardware, with a resulting variation in the X root window geometry. Feeding the X root window's geometry to the rdesktop command results in a RDP window that extends past the visible area on the GNOME desktop since GNOME's window manager pushes the actual upper left corner down to avoid overlapping with the GNOME panel, with the result that a part of the RDP window is hidden from mouse manipulation.

I have tried using xwininfo -root -children to see if I could find some X window in the immediate descendents of the X root that would consistently be the window I could use to extract those dimensions, but the names look like they are implementation details of the GNOME desktop software (or the metacity WM), or both and might not be something I want to rely upon.

Was it helpful?

Solution

The window manager places several properties on the root window. One of the properties is for the "workarea" of each workspace, i.e. the area that is not obscured by panels and thingies.

Part of the output of "xprop -root" on my machine contains this:

_NET_CURRENT_DESKTOP(CARDINAL) = 0

_NET_WORKAREA(CARDINAL) = 0, 32, 1440, 838, 0, 32, 1440, 838, 0, 32, 1440, 838, 0, 32, 1440, 838

The _NET_CURRENT_DESKTOP property gives you the number of the current workspace.

The _NET_WORKAREA gives you, in groups of four, the (x, y, width, height) of the workarea for each workspace.

This is documented in the Extended Window Manager Hints Specification - http://standards.freedesktop.org/wm-spec/latest/ar01s03.html#id2568237

You'll probably need to subtract the area for the window's frame and title bar, but this should get you close. If you want to make it exact, with some extra coding, read about _NET_WM_REQUEST_FRAME_EXTENTS: http://standards.freedesktop.org/wm-spec/latest/ar01s04.html#id2568770

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top