summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2017-04-20 15:47:21 +0300
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2017-04-20 15:47:21 +0300
commit0bd6923d4ad02590eed12d6c1a6a0d26b6b02a64 (patch)
tree21aba28b51d41360d2af823cc8cb764ce9fba460
parent6b81655ed087951f2857b2da252a88557f5e2277 (diff)
downloadmetacity-0bd6923d4ad02590eed12d6c1a6a0d26b6b02a64.tar.gz
menu: fix build with gtk+ 3.20.x
-rw-r--r--src/core/display.c5
-rw-r--r--src/core/keybindings.c10
-rw-r--r--src/ui/frames.c14
-rw-r--r--src/ui/menu.c55
4 files changed, 84 insertions, 0 deletions
diff --git a/src/core/display.c b/src/core/display.c
index 1e56019b..1191433a 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -2024,8 +2024,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 847c972e..c7ea071e 100644
--- a/src/core/keybindings.c
+++ b/src/core/keybindings.c
@@ -2812,10 +2812,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 07f05fb3..9db27bf4 100644
--- a/src/ui/frames.c
+++ b/src/ui/frames.c
@@ -1655,8 +1655,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;
@@ -1826,6 +1831,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 cda60435..ee9c84d8 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))
{