[balsa/wip/gtk4: 81/351] Get pointer coords from the GdkEvent if possible



commit 383ee7827e955b4828a240b1f51cee7c25350a8e
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Sun Dec 3 10:36:43 2017 -0500

    Get pointer coords from the GdkEvent if possible
    
    If there is a current event and it can provide device coordinates, use
    them to decide if the device is over a URL link. If not, use
    gdk_window_get_device_position(); however, this currently seems to be a
    few pixels off, so we prefer the event route.

 src/balsa-mime-widget-text.c |   37 ++++++++++++++++++++++++++++---------
 1 files changed, 28 insertions(+), 9 deletions(-)
---
diff --git a/src/balsa-mime-widget-text.c b/src/balsa-mime-widget-text.c
index 92d49ce..6d7d7d4 100644
--- a/src/balsa-mime-widget-text.c
+++ b/src/balsa-mime-widget-text.c
@@ -462,12 +462,10 @@ static gboolean
 text_view_url_popup(GtkWidget *widget, GtkMenu *menu)
 {
     GList *url_list = g_object_get_data(G_OBJECT(widget), "url-list");
+    GdkEvent *event;
+    gboolean fetched = FALSE;
     message_url_t *url;
     gint x, y;
-    GdkWindow *window;
-    GdkDisplay *display;
-    GdkSeat *seat;
-    GdkDevice *device;
     GtkWidget *menu_item;
 
     /* no url list: no check... */
@@ -475,11 +473,32 @@ text_view_url_popup(GtkWidget *widget, GtkMenu *menu)
        return FALSE;
 
     /* check if we are over an url */
-    window = gtk_widget_get_window(widget);
-    display = gdk_window_get_display(window);
-    seat = gdk_display_get_default_seat(display);
-    device = gdk_seat_get_pointer(seat);
-    gdk_window_get_device_position(window, device, &x, &y, NULL);
+    event = gtk_get_current_event();
+    if (event != NULL) {
+        gdouble x_win;
+        gdouble y_win;
+
+        fetched = gdk_event_get_coords(event, &x_win, &y_win);
+        if (fetched) {
+            x = (gint) x_win;
+            y = (gint) y_win;
+        }
+        gdk_event_free(event);
+    }
+
+    if (!fetched) {
+        GdkWindow *window;
+        GdkDisplay *display;
+        GdkSeat *seat;
+        GdkDevice *device;
+
+        window = gtk_widget_get_window(widget);
+        display = gdk_window_get_display(window);
+        seat = gdk_display_get_default_seat(display);
+        device = gdk_seat_get_pointer(seat);
+        /* This seems to be off by a few pixels: */
+        gdk_window_get_device_position(window, device, &x, &y, NULL);
+    }
 
     url = find_url(widget, x, y, url_list);
     if (!url)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]