From c12131ef30e745909a02bab6b3878465411fdbb0 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrangé" Date: Tue, 19 May 2020 17:48:28 +0100 Subject: fix handling of enter/leave events in full screen revealer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The current code is using a single event handler for leave/enter and looking at the mouse coordinates to decide whether it entered or left the widget. This logic is completely broken when the window is mimimized, because the mouse coordinates of the leave event are still within the window boundary. Switch to just have a separate handler for enter/leave events and stop looking at mouse coordinates entirely. Signed-off-by: Daniel P. Berrangé --- src/virt-viewer-timed-revealer.c | 41 ++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/src/virt-viewer-timed-revealer.c b/src/virt-viewer-timed-revealer.c index acc55fc..4ee053d 100644 --- a/src/virt-viewer-timed-revealer.c +++ b/src/virt-viewer-timed-revealer.c @@ -81,38 +81,39 @@ virt_viewer_timed_revealer_grab_notify(VirtViewerTimedRevealer *self, } static gboolean -virt_viewer_timed_revealer_enter_leave_notify(VirtViewerTimedRevealer *self, - GdkEventCrossing *event, - gpointer user_data G_GNUC_UNUSED) +virt_viewer_timed_revealer_enter_notify(VirtViewerTimedRevealer *self, + GdkEventCrossing *event G_GNUC_UNUSED, + gpointer user_data G_GNUC_UNUSED) { VirtViewerTimedRevealerPrivate *priv = self->priv; - GdkDevice *device; - GtkAllocation allocation; - gint x, y; - gboolean entered; if (!priv->fullscreen) return FALSE; - device = gdk_event_get_device((GdkEvent *)event); + virt_viewer_timed_revealer_unregister_timeout(self); + if (!gtk_revealer_get_reveal_child(GTK_REVEALER(priv->revealer))) { + gtk_revealer_set_reveal_child(GTK_REVEALER(priv->revealer), TRUE); + } + + return FALSE; +} - gdk_window_get_device_position(event->window, device, &x, &y, 0); - gtk_widget_get_allocation(GTK_WIDGET(self), &allocation); +static gboolean +virt_viewer_timed_revealer_leave_notify(VirtViewerTimedRevealer *self, + GdkEventCrossing *event G_GNUC_UNUSED, + gpointer user_data G_GNUC_UNUSED) +{ + VirtViewerTimedRevealerPrivate *priv = self->priv; - entered = !!(x >= 0 && y >= 0 && x < allocation.width && y < allocation.height); + if (!priv->fullscreen) + return FALSE; /* * Pointer exited the toolbar, and toolbar is revealed. Schedule * a timeout to close it, if one isn't already scheduled. */ - if (!entered && gtk_revealer_get_reveal_child(GTK_REVEALER(priv->revealer))) { + if (gtk_revealer_get_reveal_child(GTK_REVEALER(priv->revealer))) { virt_viewer_timed_revealer_schedule_unreveal_timeout(self, 1000); - return FALSE; - } - - virt_viewer_timed_revealer_unregister_timeout(self); - if (entered && !gtk_revealer_get_reveal_child(GTK_REVEALER(priv->revealer))) { - gtk_revealer_set_reveal_child(GTK_REVEALER(priv->revealer), TRUE); } return FALSE; @@ -183,11 +184,11 @@ virt_viewer_timed_revealer_new(GtkWidget *toolbar) NULL); g_signal_connect(self, "enter-notify-event", - G_CALLBACK(virt_viewer_timed_revealer_enter_leave_notify), + G_CALLBACK(virt_viewer_timed_revealer_enter_notify), NULL); g_signal_connect(self, "leave-notify-event", - G_CALLBACK(virt_viewer_timed_revealer_enter_leave_notify), + G_CALLBACK(virt_viewer_timed_revealer_leave_notify), NULL); return self; -- cgit v1.2.3