KWindowSystem::workArea() and KWindowSystem::workArea(QList<WId>()) should return the same value, but the second call returned an incorrect value on multi-monitor HiDPI setups. The cause is that the former uses NETRootInfo::workArea() whereas the second one uses displayGeometr() to compuse base work area. displayGeometry() on X11 platform did not take into account the device pixel ratio.
Details
Diff Detail
- Repository
- R278 KWindowSystem
- Lint
Lint Skipped - Unit
Unit Tests Skipped
I would like to add some more details about my setup: I have a laptop with a 4K display and I use a second 4K external monitor. I have enabled the 200% scalling and xrandr -q | grep -E '\bconnected' gives
DP-0 connected 3840x2160+0+0 (normal left inverted right x axis y axis) 609mm x 349mm DP-2 connected primary 3840x2160+0+2160 (normal left inverted right x axis y axis) 344mm x 193mm
ie: the external monitor is set at 0,0 (on top) and the laptop monitor is set at 0,2160 (on bottom)
I created a minimal project that shows the problem in this setup https://github.com/printesoi/kwindowsystem-workarea-test and without the patch the results I get from the code above is (I have a 32px panel on the bottom of the primary (laptop) screen):
QRect KWindowSystemPrivateX11::workArea(int desktop): QRect(0,0 1920x2128) QRect KWindowSystemPrivateX11::workArea(const QList<WId> &exclude, int desktop): QRect(0,0 960x1588)
In general, it's better to use QScreen::availableGeometry() instead of KWindowSystem::workArea().
@zzag yes, but as per the https://doc.qt.io/qt-5/qscreen.html#availableGeometry-prop, it does not work on setups with multiple displays :)