[metacity/gnome-3-24] menu: fix build with gtk+ 3.20.x



commit 143ac97e8d50c9b9661f11a71de4f1f7017451ee
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Thu Apr 20 15:47:21 2017 +0300

    menu: fix build with gtk+ 3.20.x

 src/core/display.c     |    5 ++++
 src/core/keybindings.c |   10 ++++++++
 src/ui/frames.c        |   14 ++++++++++++
 src/ui/menu.c          |   55 ++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 84 insertions(+), 0 deletions(-)
---
diff --git a/src/core/display.c b/src/core/display.c
index feebea5..548a9fa 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -1764,8 +1764,13 @@ event_callback (XEvent   *event,
               if (meta_prefs_get_raise_on_click ())
                 meta_window_raise (window);
 
+#if GTK_CHECK_VERSION (3, 22, 0)
               rect.x = event->xbutton.x;
               rect.y = event->xbutton.y;
+#else
+              rect.x = event->xbutton.x_root;
+              rect.y = event->xbutton.y_root;
+#endif
               rect.width = 0;
               rect.height = 0;
 
diff --git a/src/core/keybindings.c b/src/core/keybindings.c
index 26788eb..49f934c 100644
--- a/src/core/keybindings.c
+++ b/src/core/keybindings.c
@@ -2813,10 +2813,20 @@ handle_activate_window_menu (MetaDisplay    *display,
       GdkRectangle rect;
       GdkEvent *gdk_event;
 
+#if GTK_CHECK_VERSION (3, 22, 0)
       rect.x = display->focus_window->rect.x;
       rect.y = display->focus_window->rect.y;
       rect.width = display->focus_window->rect.width;
       rect.height = 0;
+#else
+      meta_window_get_position (display->focus_window, &rect.x, &rect.y);
+
+      if (meta_ui_get_direction() == META_UI_DIRECTION_RTL)
+        rect.x += display->focus_window->rect.width;
+
+      rect.width = 0;
+      rect.height = 0;
+#endif
 
       gdk_event = key_press_event_new (event);
       meta_window_show_menu (display->focus_window, &rect, gdk_event);
diff --git a/src/ui/frames.c b/src/ui/frames.c
index 4187678..e9b8b57 100644
--- a/src/ui/frames.c
+++ b/src/ui/frames.c
@@ -1660,8 +1660,13 @@ meta_frame_titlebar_event (MetaFrames     *frames,
       {
         GdkRectangle rect;
 
+#if GTK_CHECK_VERSION (3, 22, 0)
         rect.x = event->x;
         rect.y = event->y;
+#else
+        rect.x = event->x_root;
+        rect.y = event->y_root;
+#endif
         rect.width = 0;
         rect.height = 0;
 
@@ -1831,6 +1836,15 @@ meta_frames_button_press_event (GtkWidget      *widget,
               return FALSE;
             }
 
+#if !GTK_CHECK_VERSION (3, 22, 0)
+          rect.x += event->x_root - event->x;
+          rect.y += rect.height + event->y_root - event->y;
+
+          /* Align to the right end of the menu rectangle if RTL */
+          if (meta_ui_get_direction() == META_UI_DIRECTION_RTL)
+            rect.x += rect.width;
+#endif
+
           frame->ignore_leave_notify = TRUE;
           meta_core_show_window_menu (frames->xdisplay,
                                       frame->xwindow,
diff --git a/src/ui/menu.c b/src/ui/menu.c
index e1bc016..308d0ad 100644
--- a/src/ui/menu.c
+++ b/src/ui/menu.c
@@ -450,11 +450,39 @@ meta_window_menu_new   (MetaFrames         *frames,
   return menu;
 }
 
+#if !GTK_CHECK_VERSION (3, 22, 0)
+static void
+popup_position_func (GtkMenu  *menu,
+                     gint     *x,
+                     gint     *y,
+                     gboolean *push_in,
+                     gpointer  user_data)
+{
+  GtkRequisition req;
+  GdkPoint *pos;
+
+  pos = user_data;
+
+  gtk_widget_get_preferred_size (GTK_WIDGET (menu), &req, NULL);
+
+  *x = pos->x;
+  *y = pos->y;
+
+  if (meta_ui_get_direction() == META_UI_DIRECTION_RTL)
+    *x = MAX (0, *x - req.width);
+
+  /* Ensure onscreen */
+  *x = CLAMP (*x, 0, MAX (0, gdk_screen_width () - req.width));
+  *y = CLAMP (*y, 0, MAX (0, gdk_screen_height () - req.height));
+}
+#endif
+
 void
 meta_window_menu_popup (MetaWindowMenu     *menu,
                         const GdkRectangle *rect,
                         const GdkEvent     *event)
 {
+#if GTK_CHECK_VERSION (3, 22, 0)
   GdkEventAny *any;
 
   any = (GdkEventAny *) event;
@@ -464,6 +492,33 @@ meta_window_menu_popup (MetaWindowMenu     *menu,
                           GDK_GRAVITY_SOUTH_WEST,
                           GDK_GRAVITY_NORTH_WEST,
                           event);
+#else
+  GdkPoint *pt;
+  gint button;
+  guint32 timestamp;
+
+  pt = g_new (GdkPoint, 1);
+
+  g_object_set_data_full (G_OBJECT (menu->menu), "destroy-point", pt, g_free);
+
+  pt->x = rect->x;
+  pt->y = rect->y;
+
+  if (event->type == GDK_KEY_PRESS)
+    {
+      button = 0;
+      timestamp = ((GdkEventKey *) event)->time;
+    }
+  else
+    {
+      button = ((GdkEventButton *) event)->button;
+      timestamp = ((GdkEventButton *) event)->time;
+    }
+
+  gtk_menu_popup (GTK_MENU (menu->menu), NULL, NULL,
+                  popup_position_func, pt,
+                  button, timestamp);
+#endif
 
   if (!gtk_widget_get_visible (menu->menu))
     meta_warning ("GtkMenu failed to grab the pointer\n");


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