diff options
Diffstat (limited to 'src')
| -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 | 
