[Gambas-user] Test Screen.Available values

Benoit Minisini benoit.minisini at gambas-basic.org
Tue May 16 14:34:55 CEST 2023


Le 16/05/2023 à 12:00, Bruce Steers a écrit :
> Hi all.
> 
> I have a problem with a program that Benoit does not get the same bug 
> and wondered if some people could test this program.
> 
> the program is a simple screenshot program.
> I made it because I now use a laptop with 2 screens attached and with 
> the built-in screenshot programs it grabs the entire area of both 
> screens and i then have to crop the picture.
> 
> This application detects what screen the mouse is on via an addition to 
> Mouse.class (Mouse.Screen) and only grabs that screens area.
> 
> It also has an option to "hide panels" , if this is selected then is 
> uses the Screen.Available co'ords not the normal co'ords.
> like so...
> 
>    Dim s As Screen = Screens[Mouse.Screen]
> 
>    If NoPanels Then
>      hPic = Desktop.Screenshot(s.AvailableX, s.AvailableY, 
> s.AvailableWidth, s.AvailableHeight)
>    Else
>      hPic = Desktop.Screenshot(s.x, s.y, s.w, s.h)
>    Endif
> 
> 
> The problem....
> On my system this works as expected with GTK3 , if NoPanels is selected 
> the screenshot only includes the internal usable screen and not the 
> outer desktop panels.
> 
> (note: my config is the plug-in 1280x1024 monitor is default screen, 
> laptop built-in 1366x768 is secondary screen)
> 
 > [...]

For information: both QT and GTK components use the API provided by the 
toolkit to get the screen available dimensions.

So if it does not work, it should not be Gambas' fault.

The toolkit API is supposed to adapt to the underlying windowing system 
(X or Wayland) to get that information.

On X11, that information is provided by X11 properties attached to the 
root window by the window manager. These properties are computed by 
taking the screen size and removing the dimensions of top-level windows 
indicating (with other X11 properties) that they are desktop "panels".

Here is a comment from the QT source code :

----8<-----------------------------------------------------------

Using _NET_WORKAREA to calculate the available desktop geometry on 
multi-head systems (systems with more than one monitor) is unreliable. 
Different WMs have different interpretations of what _NET_WORKAREA means 
with multiple attached monitors. This gets worse when monitors have 
different dimensions and/or screens are not virtually aligned. In Qt we 
want the available geometry per monitor (QScreen), not desktop 
(represented by _NET_WORKAREA). WM specification does not have an atom 
for this. Thus, QScreen is limted by the lack of support from the 
underlying system.

One option could be that Qt does WM's job of calculating this by 
subtracting geometries of _NET_WM_STRUT_PARTIAL and windows where 
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK.

But this won't work on Gnome 3 shell as it seems that on this desktop 
environment the tool panel is painted directly on the root window. Maybe 
there is some Gnome/GTK API that could be used to get height of the 
panel, but I did not find one. Maybe other WMs have their own tricks, so 
the reliability of this approach is questionable.

----8<-----------------------------------------------------------

As for Wayland, no idea. I guess you can't have this information outside 
of a specific API implemented in your specific compositor. :-(

Regards,

-- 
Benoît Minisini.



More information about the User mailing list