[metacity/gnome-3-24] menu: fix build with gtk+ 3.20.x
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [metacity/gnome-3-24] menu: fix build with gtk+ 3.20.x
- Date: Thu, 20 Apr 2017 13:28:08 +0000 (UTC)
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]