[metacity] menu: change event parameter back to timestamp



commit af0bbded4856cf7c81dc81b8313b4034f5b19d06
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Wed Aug 14 14:04:18 2019 +0300

    menu: change event parameter back to timestamp
    
    Commit 37fa0d19f35a replaced gtk_menu_popup with gtk_menu_popup_at_rect
    to avoid deprecated warning making it more complicated then needed.
    
    gtk_menu_popup_at_rect requires two parameters that are not always
    available. For example we don't have GdkWindow for CSD windows. And
    next commit will popup menu in response of ClientMessage event where
    we don't have any info about key and/or button press events.
    
    Simplify code by creating fake event in menu.c with minimal data
    needed for gtk_menu_popup_at_rect. GdkEvent is used to get GdkDevice,
    button and time. For GdkWindow we can use root window.

 src/core/core.c           | 12 ++++++------
 src/core/display.c        | 45 +++------------------------------------------
 src/core/keybindings.c    | 46 +++-------------------------------------------
 src/core/window-private.h |  2 +-
 src/core/window.c         |  4 ++--
 src/include/core.h        |  8 ++++----
 src/include/ui.h          |  2 +-
 src/ui/frames.c           | 12 ++++++++----
 src/ui/menu.c             | 22 ++++++++++++++++++----
 src/ui/menu.h             |  2 +-
 src/ui/ui.c               |  4 ++--
 11 files changed, 49 insertions(+), 110 deletions(-)
---
diff --git a/src/core/core.c b/src/core/core.c
index 563d184b..9b5cf841 100644
--- a/src/core/core.c
+++ b/src/core/core.c
@@ -472,18 +472,18 @@ meta_core_get_active_workspace (Screen *xscreen)
 }
 
 void
-meta_core_show_window_menu (Display              *xdisplay,
-                            Window                frame_xwindow,
-                            const GdkRectangle   *rect,
-                            const GdkEventButton *event)
+meta_core_show_window_menu (Display            *xdisplay,
+                            Window              frame_xwindow,
+                            const GdkRectangle *rect,
+                            guint32             timestamp)
 {
   MetaWindow *window = get_window (xdisplay, frame_xwindow);
 
   if (meta_prefs_get_raise_on_click ())
     meta_window_raise (window);
-  meta_window_focus (window, event->time);
+  meta_window_focus (window, timestamp);
 
-  meta_window_show_menu (window, rect, (GdkEvent *) event);
+  meta_window_show_menu (window, rect, timestamp);
 }
 
 void
diff --git a/src/core/display.c b/src/core/display.c
index d3ab6351..57029807 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -47,7 +47,6 @@
 #include "bell.h"
 #include "effects.h"
 #include "meta-compositor.h"
-#include <gdk/gdkx.h>
 #include <libmetacity/meta-frame-borders.h>
 #include <X11/Xatom.h>
 #include <X11/cursorfont.h>
@@ -1379,39 +1378,6 @@ meta_display_queue_autoraise_callback (MetaDisplay *display,
   display->autoraise_window = window;
 }
 
-static GdkEvent *
-button_press_event_new (XEvent *xevent,
-                        gint    scale)
-{
-  GdkDisplay *display;
-  GdkSeat *seat;
-  GdkWindow *window;
-  GdkDevice *device;
-  GdkEvent *event;
-
-  display = gdk_display_get_default ();
-  seat = gdk_display_get_default_seat (display);
-
-  window = gdk_x11_window_lookup_for_display (display, xevent->xbutton.window);
-  device = gdk_seat_get_pointer (seat);
-
-  event = gdk_event_new (GDK_BUTTON_PRESS);
-
-  event->button.window = window ? g_object_ref (window) : NULL;
-  event->button.send_event = xevent->xbutton.send_event ? TRUE : FALSE;
-  event->button.time = xevent->xbutton.time;
-  event->button.x = xevent->xbutton.x / scale;
-  event->button.y = xevent->xbutton.y / scale;
-  event->button.state = (GdkModifierType) xevent->xbutton.state;
-  event->button.button = xevent->xbutton.button;
-  event->button.x_root = xevent->xbutton.x_root / scale;
-  event->button.y_root = xevent->xbutton.y_root / scale;
-
-  gdk_event_set_device (event, device);
-
-  return event;
-}
-
 static void
 update_focus_window (MetaDisplay *display,
                      MetaWindow  *window,
@@ -2001,21 +1967,16 @@ event_callback (XEvent   *event,
           else if (event->xbutton.button == meta_prefs_get_mouse_button_menu())
             {
               GdkRectangle rect;
-              gint scale;
-              GdkEvent *gdk_event;
 
               if (meta_prefs_get_raise_on_click ())
                 meta_window_raise (window);
 
-              rect.x = event->xbutton.x;
-              rect.y = event->xbutton.y;
+              rect.x = event->xbutton.x_root;
+              rect.y = event->xbutton.y_root;
               rect.width = 0;
               rect.height = 0;
 
-              scale = meta_ui_get_scale (display->screen->ui);
-              gdk_event = button_press_event_new (event, scale);
-              meta_window_show_menu (window, &rect, gdk_event);
-              gdk_event_free (gdk_event);
+              meta_window_show_menu (window, &rect, event->xbutton.time);
             }
 
           if (!frame_was_receiver && unmodified)
diff --git a/src/core/keybindings.c b/src/core/keybindings.c
index 87cdfd01..af61f7b0 100644
--- a/src/core/keybindings.c
+++ b/src/core/keybindings.c
@@ -36,7 +36,6 @@
 #include "effects.h"
 #include "util.h"
 
-#include <gdk/gdkx.h>
 #include <X11/keysym.h>
 #include <string.h>
 #include <stdio.h>
@@ -2760,34 +2759,6 @@ handle_panel (MetaDisplay    *display,
   meta_error_trap_pop (display);
 }
 
-static GdkEvent *
-key_press_event_new (XEvent *xevent)
-{
-  GdkDisplay *display;
-  GdkSeat *seat;
-  GdkWindow *window;
-  GdkDevice *device;
-  GdkEvent *event;
-
-  display = gdk_display_get_default ();
-  seat = gdk_display_get_default_seat (display);
-
-  window = gdk_x11_window_foreign_new_for_display (display, xevent->xkey.window);
-  device = gdk_seat_get_keyboard (seat);
-
-  event = gdk_event_new (GDK_KEY_PRESS);
-
-  event->key.window = window;
-  event->key.send_event = xevent->xkey.send_event ? TRUE : FALSE;
-  event->key.time = xevent->xkey.time;
-  event->key.state = (GdkModifierType) xevent->xkey.state;
-  event->key.hardware_keycode = xevent->xkey.keycode;
-
-  gdk_event_set_device (event, device);
-
-  return event;
-}
-
 static void
 handle_activate_window_menu (MetaDisplay    *display,
                       MetaScreen     *screen,
@@ -2798,18 +2769,9 @@ handle_activate_window_menu (MetaDisplay    *display,
   if (display->focus_window)
     {
       GdkRectangle rect;
-      GdkEvent *gdk_event;
 
-      if (display->focus_window->frame)
-        {
-          rect.x = display->focus_window->rect.x;
-          rect.y = display->focus_window->rect.y;
-        }
-      else
-        {
-          rect.x = 0;
-          rect.y = 0;
-        }
+      meta_window_get_position (display->focus_window,
+                                &rect.x, &rect.y);
 
       rect.width = display->focus_window->rect.width;
       rect.height = 0;
@@ -2823,9 +2785,7 @@ handle_activate_window_menu (MetaDisplay    *display,
                         display->focus_window->custom_frame_extents.right;
         }
 
-      gdk_event = key_press_event_new (event);
-      meta_window_show_menu (display->focus_window, &rect, gdk_event);
-      gdk_event_free (gdk_event);
+      meta_window_show_menu (display->focus_window, &rect, event->xkey.time);
     }
 }
 
diff --git a/src/core/window-private.h b/src/core/window-private.h
index f3ab63d8..faa546c7 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -601,7 +601,7 @@ unsigned long meta_window_get_net_wm_desktop (MetaWindow *window);
 
 void meta_window_show_menu (MetaWindow         *window,
                             const GdkRectangle *rect,
-                            const GdkEvent     *event);
+                            guint32             timestamp);
 
 gboolean meta_window_titlebar_is_onscreen    (MetaWindow *window);
 void     meta_window_shove_titlebar_onscreen (MetaWindow *window);
diff --git a/src/core/window.c b/src/core/window.c
index 6fae030b..8a9d3fad 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -7130,7 +7130,7 @@ menu_callback (MetaWindowMenu *menu,
 void
 meta_window_show_menu (MetaWindow         *window,
                        const GdkRectangle *rect,
-                       const GdkEvent     *event)
+                       guint32             timestamp)
 {
   MetaMenuOp ops;
   MetaMenuOp insensitive;
@@ -7253,7 +7253,7 @@ meta_window_show_menu (MetaWindow         *window,
 
   meta_verbose ("Popping up window menu for %s\n", window->desc);
 
-  meta_ui_window_menu_popup (menu, rect, event);
+  meta_ui_window_menu_popup (menu, rect, timestamp);
 }
 
 void
diff --git a/src/include/core.h b/src/include/core.h
index 364decc6..77a47be1 100644
--- a/src/include/core.h
+++ b/src/include/core.h
@@ -159,10 +159,10 @@ int meta_core_get_frame_workspace (Display *xdisplay,
 const char* meta_core_get_workspace_name_with_index (Display *xdisplay,
                                                      int    index);
 
-void meta_core_show_window_menu (Display              *xdisplay,
-                                 Window                frame_xwindow,
-                                 const GdkRectangle   *rect,
-                                 const GdkEventButton *event);
+void meta_core_show_window_menu (Display            *xdisplay,
+                                 Window              frame_xwindow,
+                                 const GdkRectangle *rect,
+                                 guint32             timestamp);
 
 void meta_core_get_menu_accelerator (MetaMenuOp           menu_op,
                                      int                  workspace,
diff --git a/src/include/ui.h b/src/include/ui.h
index 25d0bc1c..e032e6fe 100644
--- a/src/include/ui.h
+++ b/src/include/ui.h
@@ -134,7 +134,7 @@ MetaWindowMenu* meta_ui_window_menu_new   (MetaUI             *ui,
                                            gpointer            data);
 void            meta_ui_window_menu_popup (MetaWindowMenu     *menu,
                                            const GdkRectangle *rect,
-                                           const GdkEvent     *event);
+                                           guint32             timestamp);
 void            meta_ui_window_menu_free  (MetaWindowMenu     *menu);
 
 
diff --git a/src/ui/frames.c b/src/ui/frames.c
index ab7e0d8a..1a661d85 100644
--- a/src/ui/frames.c
+++ b/src/ui/frames.c
@@ -1663,13 +1663,13 @@ meta_frame_titlebar_event (MetaFrames     *frames,
       {
         GdkRectangle rect;
 
-        rect.x = event->x;
-        rect.y = event->y;
+        rect.x = event->x_root;
+        rect.y = event->y_root;
         rect.width = 0;
         rect.height = 0;
 
         meta_core_show_window_menu (frames->xdisplay, frame->xwindow,
-                                    &rect, event);
+                                    &rect, event->time);
       }
       break;
 
@@ -1834,10 +1834,14 @@ meta_frames_button_press_event (GtkWidget      *widget,
               return FALSE;
             }
 
+          /* convert to root coords */
+          rect.x += event->x_root - event->x;
+          rect.y += event->y_root - event->y;
+
           frame->ignore_leave_notify = TRUE;
           meta_core_show_window_menu (frames->xdisplay,
                                       frame->xwindow,
-                                      &rect, event);
+                                      &rect, event->time);
         }
     }
   else if (event->button == 1 &&
diff --git a/src/ui/menu.c b/src/ui/menu.c
index 7d946e18..1d30504c 100644
--- a/src/ui/menu.c
+++ b/src/ui/menu.c
@@ -454,14 +454,26 @@ meta_window_menu_new   (MetaFrames         *frames,
 void
 meta_window_menu_popup (MetaWindowMenu     *menu,
                         const GdkRectangle *rect,
-                        const GdkEvent     *event)
+                        guint32             timestamp)
 {
-  GdkEventAny *any;
+  GdkDisplay *display;
+  GdkEvent *event;
+  GdkWindow *window;
+  GdkDevice *device;
 
-  any = (GdkEventAny *) event;
+  display = gdk_display_get_default ();
+
+  event = gdk_event_new (GDK_BUTTON_PRESS);
+  event->button.time = timestamp;
+
+  window = gdk_screen_get_root_window (gdk_display_get_default_screen (display));
+  event->button.window = g_object_ref (window);
+
+  device = gdk_seat_get_pointer (gdk_display_get_default_seat (display));
+  gdk_event_set_device (event, device);
 
   gtk_menu_popup_at_rect (GTK_MENU (menu->menu),
-                          any->window, rect,
+                          event->any.window, rect,
                           GDK_GRAVITY_SOUTH_WEST,
                           GDK_GRAVITY_NORTH_WEST,
                           event);
@@ -470,6 +482,8 @@ meta_window_menu_popup (MetaWindowMenu     *menu,
     {
       g_warning ("GtkMenu failed to grab the pointer");
     }
+
+  gdk_event_free (event);
 }
 
 void
diff --git a/src/ui/menu.h b/src/ui/menu.h
index 183a0e2d..16f73422 100644
--- a/src/ui/menu.h
+++ b/src/ui/menu.h
@@ -46,7 +46,7 @@ MetaWindowMenu* meta_window_menu_new      (MetaFrames         *frames,
                                            gpointer            data);
 void            meta_window_menu_popup    (MetaWindowMenu     *menu,
                                            const GdkRectangle *rect,
-                                           const GdkEvent     *event);
+                                           guint32             timestamp);
 void            meta_window_menu_free     (MetaWindowMenu     *menu);
 
 
diff --git a/src/ui/ui.c b/src/ui/ui.c
index 73082858..eb75e00e 100644
--- a/src/ui/ui.c
+++ b/src/ui/ui.c
@@ -629,9 +629,9 @@ meta_ui_window_menu_new  (MetaUI             *ui,
 void
 meta_ui_window_menu_popup (MetaWindowMenu     *menu,
                            const GdkRectangle *rect,
-                           const GdkEvent     *event)
+                           guint32             timestamp)
 {
-  meta_window_menu_popup (menu, rect, event);
+  meta_window_menu_popup (menu, rect, timestamp);
 }
 
 void


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