Qt: Fix tooltip position
authorOlivier Fourdan <ofourdan@redhat.com>
Tue, 31 Jul 2018 08:55:45 +0000 (10:55 +0200)
committerHugo Beauzée-Luyssen <hugo@beauzee.fr>
Wed, 8 Aug 2018 16:12:47 +0000 (18:12 +0200)
commit 5815534 ("qt: make the time tooltip a tooltip") reintroduced the
bug fixed by previous commit ea99237 ("remove X11BypassWindowManagerHint
from time tooltip") meant to fix #17829.

The tooltip window is a shaped, override-redirect window which shows
when the pointer enters the slider and disappears when it leaves the
slider.

By placing the tooltip window too low, above the slider, vlc causes a
constant map/unmap of that window which will flood Xwayland and the
Wayland compositori.window manager and can up with a deadlock situation.

When the tooltip window is showing, the pointer will enter the tooltip
window and thus leave the slider, which will cause the tooltip to be
unmapped, which in turn causes the pointer to re-enter the slider area,
which will cause the tooltip to show again, so on and so forth.

On Wayland/Xwayland where the Wayland compositor (i.e. the display
server) is also the window manager, that can lead to a deadlock
situation because some X11 requests are blocking on rountrips to the
Xserver, which in the case of Xwayland is also a Wayland client, waiting
on the Wayland compositor for some operations, the Wayland compositor
being also a Window manager and an X11 client at the same time...

Avoid the issue by placing the tooltip so that it does not show up at
the same location where the slider is, without overlap, to avoid that
map/unmap requests storm.

Closes: https://gitlab.gnome.org/GNOME/mutter/issues/244
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Signed-off-by: Hugo Beauzée-Luyssen <hugo@beauzee.fr>
modules/gui/qt/util/timetooltip.cpp

index 1314b52..7a63a9d 100644 (file)
@@ -73,7 +73,7 @@ void TimeTooltip::adjustPosition()
 #if defined( Q_OS_WIN )
         mTarget.y() - 2 * size.height() - TIP_HEIGHT / 2 );
 #else
-        mTarget.y() - size.height() + TIP_HEIGHT / 2 );
+        mTarget.y() - size.height() - TIP_HEIGHT / 2 );
 #endif
 
     // Keep the tooltip on the same screen if possible