diff options
-rw-r--r-- | src/tools/marco-window-demo.c | 12 | ||||
-rw-r--r-- | src/ui/frames.c | 7 | ||||
-rw-r--r-- | src/ui/menu.c | 59 | ||||
-rw-r--r-- | src/ui/resizepopup.c | 4 |
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 |