return G_TYPE_INSTANCE_GET_PRIVATE (menu, GTK_TYPE_MENU, GtkMenuPrivate);
}
-G_DEFINE_TYPE (GtkMenu, gtk_menu, GTK_TYPE_MENU_SHELL);
+G_DEFINE_TYPE (GtkMenu, gtk_menu, GTK_TYPE_MENU_SHELL)
static void
menu_queue_resize (GtkMenu *menu)
menu = GTK_MENU (object);
- gtk_menu_stop_scrolling (menu);
+ gtk_menu_remove_scroll_timeout (menu);
data = g_object_get_data (G_OBJECT (object), attach_data_key);
if (data)
}
}
-static void
-attach_widget_hierarchy_changed (GtkWidget *attach_widget,
- GtkWidget *previous_toplevel,
- gpointer data)
-{
- GtkMenu *menu = GTK_MENU (data);
- GtkWidget *new_toplevel = gtk_widget_get_toplevel (attach_widget);
-
- if (g_object_get_data (G_OBJECT (menu), "gtk-menu-explicit-screen"))
- {
- /* If there is an explicit screen set, then don't set WM_TRANSIENT_FOR.
- * Because, what would happen if the attach widget moved to a different
- * screen on a different display? The menu wouldn't move along with it,
- * so we just make it the responsibility of whoever set the screen to
- * also set WM_TRANSIENT_FOR.
- */
- return;
- }
-
- if (menu->toplevel && !g_object_get_data (G_OBJECT (menu), "gtk-menu-explicit-screen") &&
- (!new_toplevel || GTK_IS_WINDOW (new_toplevel)))
- {
- gtk_window_set_transient_for (GTK_WINDOW (menu->toplevel),
- GTK_WINDOW (new_toplevel));
- }
-}
-
void
gtk_menu_attach_to_widget (GtkMenu *menu,
GtkWidget *attach_widget,
G_CALLBACK (attach_widget_screen_changed), menu);
attach_widget_screen_changed (attach_widget, NULL, menu);
- g_signal_connect (attach_widget, "hierarchy_changed",
- G_CALLBACK (attach_widget_hierarchy_changed), menu);
- attach_widget_hierarchy_changed (attach_widget, NULL, menu);
-
data->detacher = detacher;
g_object_set_data (G_OBJECT (menu), I_(attach_data_key), data);
list = g_object_steal_data (G_OBJECT (attach_widget), ATTACHED_MENUS);
g_signal_handlers_disconnect_by_func (data->attach_widget,
(gpointer) attach_widget_screen_changed,
menu);
- g_signal_handlers_disconnect_by_func (data->attach_widget,
- (gpointer) attach_widget_hierarchy_changed,
- menu);
- attach_widget_hierarchy_changed (data->attach_widget, NULL, menu);
if (data->detacher)
data->detacher (data->attach_widget, menu);
GtkMenuShell *menu_shell;
gboolean grab_keyboard;
GtkMenuPrivate *priv;
+ GtkWidget *parent_toplevel;
g_return_if_fail (GTK_IS_MENU (menu));
gtk_menu_reparent (menu, menu->toplevel, FALSE);
}
-
+
+ parent_toplevel = NULL;
if (parent_menu_shell)
+ parent_toplevel = gtk_widget_get_toplevel (parent_menu_shell);
+ else if (!g_object_get_data (G_OBJECT (menu), "gtk-menu-explicit-screen"))
{
- GtkWidget *toplevel;
-
- toplevel = gtk_widget_get_toplevel (parent_menu_shell);
- if (GTK_IS_WINDOW (toplevel))
- gtk_window_group_add_window (gtk_window_get_group (GTK_WINDOW (toplevel)),
- GTK_WINDOW (menu->toplevel));
+ GtkWidget *attach_widget = gtk_menu_get_attach_widget (menu);
+ if (attach_widget)
+ parent_toplevel = gtk_widget_get_toplevel (attach_widget);
}
+
+ /* Set transient for to get the right window group and parent relationship */
+ if (parent_toplevel && GTK_IS_WINDOW (parent_toplevel))
+ gtk_window_set_transient_for (GTK_WINDOW (menu->toplevel),
+ GTK_WINDOW (parent_toplevel));
menu->parent_menu_item = parent_menu_item;
menu->position_func = func;
menu_shell = GTK_MENU_SHELL (menu);
private = gtk_menu_get_private (menu);
-
+
menu_shell->parent_menu_shell = NULL;
menu_shell->active = FALSE;
menu_shell->ignore_enter = FALSE;
/* The X Grab, if present, will automatically be removed when we hide
* the window */
gtk_widget_hide (menu->toplevel);
- gtk_window_group_add_window (gtk_window_get_group (NULL), GTK_WINDOW (menu->toplevel));
+ gtk_window_set_transient_for (GTK_WINDOW (menu->toplevel), NULL);
if (menu->torn_off)
{
* @title: a string containing the title for the menu.
*
* Sets the title string for the menu. The title is displayed when the menu
- * is shown as a tearoff menu.
+ * is shown as a tearoff menu. If @title is %NULL, the menu will see if it is
+ * attached to a parent menu item, and if so it will try to use the same text as
+ * that menu item's label.
**/
-void
+void
gtk_menu_set_title (GtkMenu *menu,
const gchar *title)
{
GtkMenuPrivate *priv;
+ char *old_title;
g_return_if_fail (GTK_IS_MENU (menu));
priv = gtk_menu_get_private (menu);
- if (strcmp (title ? title : "", priv->title ? priv->title : "") != 0)
- {
- g_free (priv->title);
- priv->title = g_strdup (title);
+ old_title = priv->title;
+ priv->title = g_strdup (title);
+ g_free (old_title);
- gtk_menu_update_title (menu);
- g_object_notify (G_OBJECT (menu), "tearoff-title");
- }
+ gtk_menu_update_title (menu);
+ g_object_notify (G_OBJECT (menu), "tearoff-title");
}
/**
"gtk-can-change-accels", &can_change_accels,
NULL);
- if (accel)
+ if (accel && *accel)
{
guint keyval = 0;
GdkModifierType mods = 0;
* (basically, those items are accelerator-locked).
*/
/* g_print("item has no path or is locked, menu prefix: %s\n", menu->accel_path); */
- gdk_display_beep (display);
+ gtk_widget_error_bell (widget);
}
else
{
* locked already
*/
/* g_print("failed to change\n"); */
- gdk_display_beep (display);
+ gtk_widget_error_bell (widget);
}
}
}
GtkSettings *settings;
gboolean touchscreen_mode;
- GDK_THREADS_ENTER ();
-
menu = GTK_MENU (data);
settings = gtk_widget_get_settings (GTK_WIDGET (menu));
gtk_menu_do_timeout_scroll (menu, touchscreen_mode);
- GDK_THREADS_LEAVE ();
-
return TRUE;
}
guint timeout;
gboolean touchscreen_mode;
- GDK_THREADS_ENTER ();
-
menu = GTK_MENU (data);
settings = gtk_widget_get_settings (GTK_WIDGET (menu));
gtk_menu_remove_scroll_timeout (menu);
- menu->timeout_id = g_timeout_add (timeout, gtk_menu_scroll_timeout, menu);
-
- GDK_THREADS_LEAVE ();
+ menu->timeout_id = gdk_threads_add_timeout (timeout, gtk_menu_scroll_timeout, menu);
return FALSE;
}
gtk_menu_do_timeout_scroll (menu, touchscreen_mode);
- menu->timeout_id = g_timeout_add (timeout, gtk_menu_scroll_timeout_initial,
+ menu->timeout_id = gdk_threads_add_timeout (timeout, gtk_menu_scroll_timeout_initial,
menu);
}
-MENU_SCROLL_STEP2 : -MENU_SCROLL_STEP1;
menu->timeout_id =
- g_timeout_add (scroll_fast ?
+ gdk_threads_add_timeout (scroll_fast ?
MENU_SCROLL_TIMEOUT2 : MENU_SCROLL_TIMEOUT1,
gtk_menu_scroll_timeout, menu);
}
MENU_SCROLL_STEP2 : MENU_SCROLL_STEP1;
menu->timeout_id =
- g_timeout_add (scroll_fast ?
+ gdk_threads_add_timeout (scroll_fast ?
MENU_SCROLL_TIMEOUT2 : MENU_SCROLL_TIMEOUT1,
gtk_menu_scroll_timeout, menu);
}
GtkMenu *menu = user_data;
GdkWindow *child_window;
- GDK_THREADS_ENTER ();
-
gtk_menu_stop_navigating_submenu (menu);
if (GTK_WIDGET_REALIZED (menu))
}
}
- GDK_THREADS_LEAVE ();
-
return FALSE;
}
"gtk-menu-popdown-delay", &popdown_delay,
NULL);
- menu->navigation_timeout = g_timeout_add (popdown_delay,
+ menu->navigation_timeout = gdk_threads_add_timeout (popdown_delay,
gtk_menu_stop_navigating_submenu_cb, menu);
#ifdef DRAW_STAY_UP_TRIANGLE
gboolean touchscreen_mode;
gtk_menu_remove_scroll_timeout (menu);
-
+
g_object_get (G_OBJECT (settings),
- "gtk-touchscreen-mode", &touchscreen_mode,
- NULL);
-
+ "gtk-touchscreen-mode", &touchscreen_mode,
+ NULL);
+
if (!touchscreen_mode)
{
menu->upper_arrow_prelight = FALSE;