changeset 2757:b91bc30d0e4a

GTK4: dw_menu_popup() coordinates are relative to the parent window. The coordinates in the context events in GTK4 had been relative to the container or tree widget, causing the menu to popup in offset locations. Added a function to convert from the widget coordinate to the window. The events now pass window relative coordinates so when passed to dw_menu_popup() the menu appears in about the right location.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 03 Jan 2022 15:45:15 +0000
parents 4f09bf72b391
children e1b5dbec0796
files gtk4/dw.c
diffstat 1 files changed, 35 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/gtk4/dw.c	Mon Jan 03 00:35:21 2022 +0000
+++ b/gtk4/dw.c	Mon Jan 03 15:45:15 2022 +0000
@@ -990,6 +990,38 @@
    return retval;
 }
 
+/* Convert coordinate system from the widget to the window */
+void _dw_event_coordinates_to_window(GtkWidget *widget, double *x, double *y)
+{
+   GtkRoot *root = (widget && GTK_IS_WIDGET(widget)) ? gtk_widget_get_root(widget) : NULL;
+   
+   if(root && GTK_IS_WIDGET(root))
+   {
+      GtkWidget *parent = GTK_WIDGET(root);
+      
+      /* If the parent is a window, try to use the box attached to it... */
+      if(GTK_IS_WINDOW(parent))
+      {
+         GtkWidget *box = g_object_get_data(G_OBJECT(parent), "_dw_grid");
+         
+         if(box && GTK_IS_GRID(box))
+            parent = box;
+      }
+            
+      graphene_point_t *treepoint = graphene_point_init(graphene_point_alloc(), (float)*x, (float)*y);
+      graphene_point_t *windowpoint = graphene_point_alloc();
+      
+      if(gtk_widget_compute_point(widget, GTK_WIDGET(root), treepoint, windowpoint))
+      {            
+         *x = (double)windowpoint->x;
+         *y = (double)windowpoint->y;
+      }
+      
+      graphene_point_free(treepoint);
+      graphene_point_free(windowpoint);
+   }
+}
+
 #define _DW_DATA_TYPE_STRING  0
 #define _DW_DATA_TYPE_POINTER 1
 
@@ -1008,7 +1040,9 @@
          char *text = NULL;
          void *itemdata = NULL;
          GtkWidget *widget = work.window;
-
+         
+         _dw_event_coordinates_to_window(widget, &x, &y);
+         
          /* Containers and trees are inside scrolled window widgets */
          if(GTK_IS_SCROLLED_WINDOW(widget))
             widget = GTK_WIDGET(g_object_get_data(G_OBJECT(widget), "_dw_user"));