]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkmenu.c
Replace a lot of idle and timeout calls by the new gdk_threads api.
[~andy/gtk] / gtk / gtkmenu.c
index 446592eda747b6ebddb27a03aa0921406d361119..70f9f9b4edcaea86e383dd3b4519b4e07fd3b96a 100644 (file)
@@ -254,7 +254,7 @@ gtk_menu_get_private (GtkMenu *menu)
   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)
@@ -910,7 +910,7 @@ gtk_menu_destroy (GtkObject *object)
 
   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)
@@ -1004,33 +1004,6 @@ attach_widget_screen_changed (GtkWidget *attach_widget,
     }
 }
 
-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,
@@ -1062,10 +1035,6 @@ gtk_menu_attach_to_widget (GtkMenu              *menu,
                    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);
@@ -1120,10 +1089,6 @@ gtk_menu_detach (GtkMenu *menu)
   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);
@@ -1307,6 +1272,7 @@ gtk_menu_popup (GtkMenu               *menu,
   GtkMenuShell *menu_shell;
   gboolean grab_keyboard;
   GtkMenuPrivate *priv;
+  GtkWidget *parent_toplevel;
 
   g_return_if_fail (GTK_IS_MENU (menu));
 
@@ -1413,16 +1379,21 @@ gtk_menu_popup (GtkMenu             *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;
@@ -1478,7 +1449,7 @@ gtk_menu_popdown (GtkMenu *menu)
   
   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;
@@ -1502,7 +1473,7 @@ gtk_menu_popdown (GtkMenu *menu)
   /* 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)
     {
@@ -1942,26 +1913,27 @@ gtk_menu_get_tearoff_state (GtkMenu *menu)
  * @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");
 }
 
 /**
@@ -2717,7 +2689,7 @@ gtk_menu_key_press (GtkWidget     *widget,
                "gtk-can-change-accels", &can_change_accels,
                 NULL);
 
-  if (accel)
+  if (accel && *accel)
     {
       guint keyval = 0;
       GdkModifierType mods = 0;
@@ -2785,7 +2757,7 @@ gtk_menu_key_press (GtkWidget     *widget,
           * (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
        {
@@ -2814,7 +2786,7 @@ gtk_menu_key_press (GtkWidget     *widget,
               * locked already
               */
              /* g_print("failed to change\n"); */
-             gdk_display_beep (display);
+             gtk_widget_error_bell (widget);
            }
        }
     }
@@ -3050,8 +3022,6 @@ gtk_menu_scroll_timeout (gpointer  data)
   GtkSettings *settings;
   gboolean     touchscreen_mode;
 
-  GDK_THREADS_ENTER ();
-
   menu = GTK_MENU (data);
 
   settings = gtk_widget_get_settings (GTK_WIDGET (menu));
@@ -3061,8 +3031,6 @@ gtk_menu_scroll_timeout (gpointer  data)
 
   gtk_menu_do_timeout_scroll (menu, touchscreen_mode);
 
-  GDK_THREADS_LEAVE ();
-
   return TRUE;
 }
 
@@ -3074,8 +3042,6 @@ gtk_menu_scroll_timeout_initial (gpointer data)
   guint        timeout;
   gboolean     touchscreen_mode;
 
-  GDK_THREADS_ENTER ();
-
   menu = GTK_MENU (data);
 
   settings = gtk_widget_get_settings (GTK_WIDGET (menu));
@@ -3088,9 +3054,7 @@ gtk_menu_scroll_timeout_initial (gpointer data)
 
   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;
 }
@@ -3110,7 +3074,7 @@ gtk_menu_start_scrolling (GtkMenu *menu)
 
   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);
 }
 
@@ -3256,7 +3220,7 @@ gtk_menu_handle_scrolling (GtkMenu *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);
                 }
@@ -3350,7 +3314,7 @@ gtk_menu_handle_scrolling (GtkMenu *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);
                 }
@@ -3513,8 +3477,6 @@ gtk_menu_stop_navigating_submenu_cb (gpointer user_data)
   GtkMenu *menu = user_data;
   GdkWindow *child_window;
 
-  GDK_THREADS_ENTER ();
-
   gtk_menu_stop_navigating_submenu (menu);
   
   if (GTK_WIDGET_REALIZED (menu))
@@ -3535,8 +3497,6 @@ gtk_menu_stop_navigating_submenu_cb (gpointer user_data)
        }
     }
 
-  GDK_THREADS_LEAVE ();
-
   return FALSE; 
 }
 
@@ -3710,7 +3670,7 @@ gtk_menu_set_submenu_navigation_region (GtkMenu          *menu,
                    "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
@@ -3987,11 +3947,11 @@ gtk_menu_stop_scrolling (GtkMenu *menu)
   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;