summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/tools/marco-window-demo.c12
-rw-r--r--src/ui/frames.c7
-rw-r--r--src/ui/menu.c59
-rw-r--r--src/ui/resizepopup.c4
4 files changed, 42 insertions, 40 deletions
diff --git a/src/tools/marco-window-demo.c b/src/tools/marco-window-demo.c
index 6b001cac..f0eb1b03 100644
--- a/src/tools/marco-window-demo.c
+++ b/src/tools/marco-window-demo.c
@@ -73,7 +73,7 @@ on_realize_set_struts (GtkWindow *window,
widget = GTK_WIDGET (window);
- g_return_if_fail (gtk_widget_get_realized (widget));
+ g_return_if_fail (gtk_widget_get_mapped (widget));
left = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (window), "meta-strut-left"));
right = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (window), "meta-strut-right"));
@@ -113,7 +113,7 @@ set_gtk_window_struts (GtkWidget *window,
G_CALLBACK (on_realize_set_struts),
NULL);
- if (gtk_widget_get_realized (widget))
+ if (gtk_widget_get_mapped (widget))
set_gdk_window_struts (gtk_widget_get_window (widget),
left, right, top, bottom);
}
@@ -141,7 +141,7 @@ on_realize_set_type (GtkWindow *window,
{
const char *type;
- g_return_if_fail (gtk_widget_get_realized (GTK_WIDGET (window)));
+ g_return_if_fail (gtk_widget_get_mapped (GTK_WIDGET (window)));
type = g_object_get_data (G_OBJECT (window), "meta-window-type");
@@ -170,7 +170,7 @@ set_gtk_window_type (GtkWindow *window,
G_CALLBACK (on_realize_set_type),
NULL);
- if (gtk_widget_get_realized (widget))
+ if (gtk_widget_get_mapped (widget))
set_gdk_window_type (gtk_widget_get_window (widget),
type);
}
@@ -189,7 +189,7 @@ on_realize_set_border_only (GtkWindow *window,
widget = GTK_WIDGET (window);
- g_return_if_fail (gtk_widget_get_realized (widget));
+ g_return_if_fail (gtk_widget_get_mapped (widget));
set_gdk_window_border_only (gtk_widget_get_window (widget));
}
@@ -210,7 +210,7 @@ GtkWidget *widget;
G_CALLBACK (on_realize_set_border_only),
NULL);
- if (gtk_widget_get_realized (widget))
+ if (gtk_widget_get_mapped (widget))
set_gdk_window_border_only (gtk_widget_get_window (widget));
}
diff --git a/src/ui/frames.c b/src/ui/frames.c
index ad7e10c8..19c14c56 100644
--- a/src/ui/frames.c
+++ b/src/ui/frames.c
@@ -504,7 +504,7 @@ meta_frames_ensure_layout (MetaFrames *frames,
MetaFrameType type;
MetaFrameStyle *style;
- g_return_if_fail (gtk_widget_get_realized (GTK_WIDGET (frames)));
+ g_return_if_fail (gtk_widget_get_mapped (GTK_WIDGET (frames)));
widget = GTK_WIDGET (frames);
@@ -1310,7 +1310,7 @@ meta_frames_repaint_frame (MetaFrames *frames,
/* repaint everything, so the other frame don't
* lag behind if they are exposed
*/
- gdk_window_process_all_updates ();
+ gdk_display_flush (gdk_display_get_default ());
}
static void
@@ -2970,8 +2970,7 @@ meta_frames_push_delay_exposes (MetaFrames *frames)
if (frames->expose_delay_count == 0)
{
/* Make sure we've repainted things */
- gdk_window_process_all_updates ();
- XFlush (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
+ gdk_display_flush (gdk_display_get_default ());
}
frames->expose_delay_count += 1;
diff --git a/src/ui/menu.c b/src/ui/menu.c
index 54429bf0..733e92ff 100644
--- a/src/ui/menu.c
+++ b/src/ui/menu.c
@@ -103,28 +103,6 @@ static MenuItem menuitems[] = {
{META_MENU_OP_DELETE, MENU_ITEM_IMAGE, MARCO_STOCK_DELETE, FALSE, N_("_Close")}
};
-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, WidthOfScreen (gdk_x11_screen_get_xscreen (gdk_screen_get_default ())) - req.width));
- *y = CLAMP (*y, 0, MAX(0, HeightOfScreen (gdk_x11_screen_get_xscreen (gdk_screen_get_default ())) - req.height));
-}
-
static void menu_closed(GtkMenu* widget, gpointer data)
{
MetaWindowMenu *menu;
@@ -493,16 +471,41 @@ meta_window_menu_new (MetaFrames *frames,
void meta_window_menu_popup(MetaWindowMenu* menu, int root_x, int root_y, int button, guint32 timestamp)
{
- GdkPoint* pt = g_new(GdkPoint, 1);
+ GtkRequisition req;
gint scale;
-
- g_object_set_data_full(G_OBJECT(menu->menu), "destroy-point", pt, g_free);
+ GdkRectangle rect;
+ GdkWindow *rect_window;
+ int window_x, window_y;
scale = gtk_widget_get_scale_factor (menu->menu);
- pt->x = root_x / scale;
- pt->y = root_y / scale;
+ rect_window = gtk_widget_get_window(GTK_WIDGET(menu->frames));
+
+ /* Convert absolute screen coordinates to coordinates relative to the frame window */
+ gdk_window_get_position(rect_window, &window_x, &window_y);
+ rect.x = (root_x / scale) - window_x;
+ rect.y = (root_y / scale) - window_y;
+ rect.width = 1;
+ rect.height = 1;
+
+ /* Calculate menu size for positioning */
+ gtk_widget_get_preferred_size (GTK_WIDGET (menu->menu), &req, NULL);
- gtk_menu_popup(GTK_MENU (menu->menu), NULL, NULL, popup_position_func, pt, button, timestamp);
+ /* Apply RTL adjustment */
+ if (meta_ui_get_direction() == META_UI_DIRECTION_RTL)
+ {
+ rect.x = MAX (0, rect.x - req.width);
+ }
+
+ /* Ensure onscreen */
+ rect.x = CLAMP (rect.x, 0, MAX(0, WidthOfScreen (gdk_x11_screen_get_xscreen (gdk_screen_get_default ())) - req.width));
+ rect.y = CLAMP (rect.y, 0, MAX(0, HeightOfScreen (gdk_x11_screen_get_xscreen (gdk_screen_get_default ())) - req.height));
+
+ /* Note: NULL trigger_event will cause a GTK warning when using
+ * keyboard shortcut. Not sure there's a way around this, but seems
+ * harmless. */
+ gtk_menu_popup_at_rect(GTK_MENU (menu->menu), rect_window, &rect,
+ GDK_GRAVITY_NORTH_WEST, GDK_GRAVITY_NORTH_WEST,
+ NULL);
if (!gtk_widget_get_visible (menu->menu))
meta_warning("GtkMenu failed to grab the pointer\n");
diff --git a/src/ui/resizepopup.c b/src/ui/resizepopup.c
index 1e57756d..4b416517 100644
--- a/src/ui/resizepopup.c
+++ b/src/ui/resizepopup.c
@@ -135,7 +135,7 @@ update_size_window (MetaResizePopup *popup)
y = y / scale;
}
- if (gtk_widget_get_realized (popup->size_window))
+ if (gtk_widget_get_mapped (popup->size_window))
{
/* using move_resize to avoid jumpiness */
gdk_window_move_resize (gtk_widget_get_window (popup->size_window),
@@ -157,7 +157,7 @@ sync_showing (MetaResizePopup *popup)
if (popup->size_window)
gtk_widget_show (popup->size_window);
- if (popup->size_window && gtk_widget_get_realized (popup->size_window))
+ if (popup->size_window && gtk_widget_get_mapped (popup->size_window))
gdk_window_raise (gtk_widget_get_window(GTK_WIDGET(popup->size_window)));
}
else