1db854
This is a backport of https://github.com/emacs-mirror/emacs/commit/3f4c6d52d345999938bc2d4a53246af4c61ef176
1db854
with a part of https://github.com/emacs-mirror/emacs/commit/5a1d858bbc5410916d764e7f9c62b4e405fab592 (everything
1db854
related to (struct x_output).toolbar_is_packed).
1db854
1db854
Resolves: #1477745
1db854
1db854
diff --git a/lisp/term/x-win.el b/lisp/term/x-win.el
1db854
index 4cbcf767c0..a7e695da2a 100644
1db854
--- a/lisp/term/x-win.el
1db854
+++ b/lisp/term/x-win.el
1db854
@@ -1484,47 +1484,47 @@ This returns an error if any Emacs frames are X frames."
1db854
   (mapcar (lambda (arg)
1db854
 	    (cons (purecopy (car arg)) (purecopy (cdr arg))))
1db854
   '(
1db854
-    ("etc/images/new" . "gtk-new")
1db854
-    ("etc/images/open" . "gtk-open")
1db854
+    ("etc/images/new" . ("document-new" "gtk-new"))
1db854
+    ("etc/images/open" . ("document-open" "gtk-open"))
1db854
     ("etc/images/diropen" . "n:system-file-manager")
1db854
-    ("etc/images/close" . "gtk-close")
1db854
-    ("etc/images/save" . "gtk-save")
1db854
-    ("etc/images/saveas" . "gtk-save-as")
1db854
-    ("etc/images/undo" . "gtk-undo")
1db854
-    ("etc/images/cut" . "gtk-cut")
1db854
-    ("etc/images/copy" . "gtk-copy")
1db854
-    ("etc/images/paste" . "gtk-paste")
1db854
-    ("etc/images/search" . "gtk-find")
1db854
-    ("etc/images/print" . "gtk-print")
1db854
-    ("etc/images/preferences" . "gtk-preferences")
1db854
-    ("etc/images/help" . "gtk-help")
1db854
-    ("etc/images/left-arrow" . "gtk-go-back")
1db854
-    ("etc/images/right-arrow" . "gtk-go-forward")
1db854
-    ("etc/images/home" . "gtk-home")
1db854
-    ("etc/images/jump-to" . "gtk-jump-to")
1db854
+    ("etc/images/close" . ("window-close" "gtk-close"))
1db854
+    ("etc/images/save" . ("document-save" "gtk-save"))
1db854
+    ("etc/images/saveas" . ("document-save-as" "gtk-save-as"))
1db854
+    ("etc/images/undo" . ("edit-undo" "gtk-undo"))
1db854
+    ("etc/images/cut" . ("edit-cut" "gtk-cut"))
1db854
+    ("etc/images/copy" . ("edit-copy" "gtk-copy"))
1db854
+    ("etc/images/paste" . ("edit-paste" "gtk-paste"))
1db854
+    ("etc/images/search" . ("edit-find" "gtk-find"))
1db854
+    ("etc/images/print" . ("document-print" "gtk-print"))
1db854
+    ("etc/images/preferences" . ("preferences-system" "gtk-preferences"))
1db854
+    ("etc/images/help" . ("help-browser" "gtk-help"))
1db854
+    ("etc/images/left-arrow" . ("go-previous" "gtk-go-back"))
1db854
+    ("etc/images/right-arrow" . ("go-next" "gtk-go-forward"))
1db854
+    ("etc/images/home" . ("go-home" "gtk-home"))
1db854
+    ("etc/images/jump-to" . ("go-jump" "gtk-jump-to"))
1db854
     ("etc/images/index" . "gtk-index")
1db854
-    ("etc/images/search" . "gtk-find")
1db854
-    ("etc/images/exit" . "gtk-quit")
1db854
+    ("etc/images/exit" . ("application-exit" "gtk-quit"))
1db854
     ("etc/images/cancel" . "gtk-cancel")
1db854
-    ("etc/images/info" . "gtk-info")
1db854
+    ("etc/images/info" . ("dialog-information" "gtk-info"))
1db854
     ("etc/images/bookmark_add" . "n:bookmark_add")
1db854
     ;; Used in Gnus and/or MH-E:
1db854
     ("etc/images/attach" . "gtk-attach")
1db854
     ("etc/images/connect" . "gtk-connect")
1db854
     ("etc/images/contact" . "gtk-contact")
1db854
-    ("etc/images/delete" . "gtk-delete")
1db854
-    ("etc/images/describe" . "gtk-properties")
1db854
+    ("etc/images/delete" . ("edit-delete" "gtk-delete"))
1db854
+    ("etc/images/describe" . ("document-properties" "gtk-properties"))
1db854
     ("etc/images/disconnect" . "gtk-disconnect")
1db854
     ;; ("etc/images/exit" . "gtk-exit")
1db854
     ("etc/images/lock-broken" . "gtk-lock_broken")
1db854
     ("etc/images/lock-ok" . "gtk-lock_ok")
1db854
     ("etc/images/lock" . "gtk-lock")
1db854
     ("etc/images/next-page" . "gtk-next-page")
1db854
-    ("etc/images/refresh" . "gtk-refresh")
1db854
-    ("etc/images/sort-ascending" . "gtk-sort-ascending")
1db854
+    ("etc/images/refresh" . ("view-refresh" "gtk-refresh"))
1db854
+    ("etc/images/sort-ascending" . ("view-sort-ascending" "gtk-sort-ascending"))
1db854
     ("etc/images/sort-column-ascending" . "gtk-sort-column-ascending")
1db854
     ("etc/images/sort-criteria" . "gtk-sort-criteria")
1db854
-    ("etc/images/sort-descending" . "gtk-sort-descending")
1db854
+    ("etc/images/sort-descending" . ("view-sort-descending"
1db854
+				     "gtk-sort-descending"))
1db854
     ("etc/images/sort-row-ascending" . "gtk-sort-row-ascending")
1db854
     ("images/gnus/toggle-subscription" . "gtk-task-recurring")
1db854
     ("images/mail/compose" . "gtk-mail-compose")
1db854
@@ -1541,8 +1541,8 @@ This returns an error if any Emacs frames are X frames."
1db854
     ("images/mail/spam" . "gtk-spam")
1db854
     ;; Used for GDB Graphical Interface
1db854
     ("images/gud/break" . "gtk-no")
1db854
-    ("images/gud/recstart" . "gtk-media-record")
1db854
-    ("images/gud/recstop" . "gtk-media-stop")
1db854
+    ("images/gud/recstart" . ("media-record" "gtk-media-record"))
1db854
+    ("images/gud/recstop" . ("media-playback-stop" "gtk-media-stop"))
1db854
     ;; No themed versions available:
1db854
     ;; mail/preview (combining stock_mail and stock_zoom)
1db854
     ;; mail/save    (combining stock_mail, stock_save and stock_convert)
1db854
@@ -1551,9 +1551,12 @@ This returns an error if any Emacs frames are X frames."
1db854
 Emacs must be compiled with the Gtk+ toolkit for this to have any effect.
1db854
 A value that begins with n: denotes a named icon instead of a stock icon."
1db854
   :version "22.2"
1db854
-  :type '(choice (repeat (choice symbol
1db854
-				 (cons (string :tag "Emacs icon")
1db854
-				       (string :tag "Stock/named")))))
1db854
+  :type '(choice (repeat
1db854
+		  (choice symbol
1db854
+			  (cons (string :tag "Emacs icon")
1db854
+				(choice (group (string :tag "Named")
1db854
+					       (string :tag "Stock"))
1db854
+					(string :tag "Stock/named"))))))
1db854
   :group 'x)
1db854
 
1db854
 (defcustom icon-map-list '(x-gtk-stock-map)
1db854
diff --git a/src/xmenu.c b/src/xmenu.c
1db854
index e3f1a17fbc..eb783fe507 100644
1db854
--- a/src/xmenu.c
1db854
+++ b/src/xmenu.c
1db854
@@ -733,12 +733,6 @@ set_frame_menubar (struct frame *f, bool first_time, bool deep_p)
1db854
       f->output_data.x->saved_menu_event->type = 0;
1db854
     }
1db854
 
1db854
-#ifdef USE_GTK
1db854
-  /* If we have detached menus, we must update deep so detached menus
1db854
-     also gets updated.  */
1db854
-  deep_p = deep_p || xg_have_tear_offs ();
1db854
-#endif
1db854
-
1db854
   if (deep_p)
1db854
     {
1db854
       /* Make a widget-value tree representing the entire menu trees.  */
1db854
diff --git a/src/xterm.h b/src/xterm.h
1db854
index ed611f1d19..0842195f33 100644
1db854
--- a/src/xterm.h
1db854
+++ b/src/xterm.h
1db854
@@ -474,12 +474,11 @@ struct x_output
1db854
   GtkWidget *menubar_widget;
1db854
   /* The tool bar in this frame  */
1db854
   GtkWidget *toolbar_widget;
1db854
-  /* The handle box that makes the tool bar detachable.  */
1db854
-  GtkWidget *handlebox_widget;
1db854
   /* Non-zero if the tool bar is detached.  */
1db854
   int toolbar_detached;
1db854
   /* Non-zero if tool bar is packed into the hbox widget (i.e. vertical).  */
1db854
   int toolbar_in_hbox;
1db854
+  int toolbar_is_packed;
1db854
 
1db854
   /* The last size hints set.  */
1db854
   GdkGeometry size_hints;
1db854
diff --git a/src/gtkutil.c b/src/gtkutil.c
1db854
--- a/src/gtkutil.c
1db854
+++ b/src/gtkutil.c
1db854
@@ -2428,45 +2428,6 @@ make_menu_item (const char *utf8_label,
1db854
   return w;
1db854
 }
1db854
 
1db854
-static int xg_detached_menus;
1db854
-
1db854
-/* Return true if there are detached menus.  */
1db854
-
1db854
-bool
1db854
-xg_have_tear_offs (void)
1db854
-{
1db854
-  return xg_detached_menus > 0;
1db854
-}
1db854
-
1db854
-/* Callback invoked when a detached menu window is removed.  Here we
1db854
-   decrease the xg_detached_menus count.
1db854
-   WIDGET is the top level window that is removed (the parent of the menu).
1db854
-   CLIENT_DATA is not used.  */
1db854
-
1db854
-static void
1db854
-tearoff_remove (GtkWidget *widget, gpointer client_data)
1db854
-{
1db854
-  if (xg_detached_menus > 0) --xg_detached_menus;
1db854
-}
1db854
-
1db854
-/* Callback invoked when a menu is detached.  It increases the
1db854
-   xg_detached_menus count.
1db854
-   WIDGET is the GtkTearoffMenuItem.
1db854
-   CLIENT_DATA is not used.  */
1db854
-
1db854
-static void
1db854
-tearoff_activate (GtkWidget *widget, gpointer client_data)
1db854
-{
1db854
-  GtkWidget *menu = gtk_widget_get_parent (widget);
1db854
-  if (gtk_menu_get_tearoff_state (GTK_MENU (menu)))
1db854
-    {
1db854
-      ++xg_detached_menus;
1db854
-      g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (widget)),
1db854
-                        "destroy",
1db854
-                        G_CALLBACK (tearoff_remove), 0);
1db854
-    }
1db854
-}
1db854
-
1db854
 
1db854
 /* Create a menu item widget, and connect the callbacks.
1db854
    ITEM describes the menu item.
1db854
@@ -2538,8 +2499,6 @@ xg_create_one_menuitem (widget_value *it
1db854
    HIGHLIGHT_CB is the callback to call when entering/leaving menu items.
1db854
    If POP_UP_P, create a popup menu.
1db854
    If MENU_BAR_P, create a menu bar.
1db854
-   If ADD_TEAROFF_P, add a tearoff menu item.  Ignored if MENU_BAR_P.
1db854
-   TOPMENU is the topmost GtkWidget that others shall be placed under.
1db854
    It may be NULL, in that case we create the appropriate widget
1db854
    (menu bar or menu item depending on POP_UP_P and MENU_BAR_P)
1db854
    CL_DATA is the callback data we shall use for this menu, or NULL
1db854
@@ -2560,7 +2519,6 @@ create_menus (widget_value *data,
1db854
               GCallback highlight_cb,
1db854
               bool pop_up_p,
1db854
               bool menu_bar_p,
1db854
-              bool add_tearoff_p,
1db854
               GtkWidget *topmenu,
1db854
               xg_menu_cb_data *cl_data,
1db854
               const char *name)
1db854
@@ -2611,15 +2569,6 @@ create_menus (widget_value *data,
1db854
                           "selection-done", deactivate_cb, 0);
1db854
     }
1db854
 
1db854
-  if (! menu_bar_p && add_tearoff_p)
1db854
-    {
1db854
-      GtkWidget *tearoff = gtk_tearoff_menu_item_new ();
1db854
-      gtk_menu_shell_append (GTK_MENU_SHELL (wmenu), tearoff);
1db854
-
1db854
-      g_signal_connect (G_OBJECT (tearoff), "activate",
1db854
-                        G_CALLBACK (tearoff_activate), 0);
1db854
-    }
1db854
-
1db854
   for (item = data; item; item = item->next)
1db854
     {
1db854
       GtkWidget *w;
1db854
@@ -2633,7 +2582,6 @@ create_menus (widget_value *data,
1db854
           group = NULL;
1db854
           utf8_label = get_utf8_string (item->name);
1db854
 
1db854
-          gtk_menu_set_title (GTK_MENU (wmenu), utf8_label);
1db854
           w = gtk_menu_item_new_with_label (utf8_label);
1db854
           gtk_widget_set_sensitive (w, FALSE);
1db854
           if (utf8_label) g_free (utf8_label);
1db854
@@ -2664,7 +2612,6 @@ create_menus (widget_value *data,
1db854
                                                  highlight_cb,
1db854
                                                  0,
1db854
                                                  0,
1db854
-                                                 add_tearoff_p,
1db854
                                                  0,
1db854
                                                  cl_data,
1db854
                                                  0);
1db854
@@ -2722,7 +2669,6 @@ xg_create_widget (const char *type, cons
1db854
                         highlight_cb,
1db854
                         pop_up_p,
1db854
                         menu_bar_p,
1db854
-                        menu_bar_p,
1db854
                         0,
1db854
                         0,
1db854
                         name);
1db854
@@ -2832,7 +2778,7 @@ xg_update_menubar (GtkWidget *menubar,
1db854
     {
1db854
       /* Item(s) added.  Add all new items in one call.  */
1db854
       create_menus (val, f, select_cb, deactivate_cb, highlight_cb,
1db854
-                    0, 1, 0, menubar, cl_data, 0);
1db854
+                    0, 1, menubar, cl_data, 0);
1db854
 
1db854
       /* All updated.  */
1db854
       val = 0;
1db854
@@ -2909,12 +2855,6 @@ xg_update_menubar (GtkWidget *menubar,
1db854
 
1db854
           gtk_label_set_text (wlabel, utf8_label);
1db854
 
1db854
-          /* If this item has a submenu that has been detached, change
1db854
-             the title in the WM decorations also.  */
1db854
-          if (submenu && gtk_menu_get_tearoff_state (GTK_MENU (submenu)))
1db854
-            /* Set the title of the detached window.  */
1db854
-            gtk_menu_set_title (GTK_MENU (submenu), utf8_label);
1db854
-
1db854
           if (utf8_label) g_free (utf8_label);
1db854
           iter = g_list_next (iter);
1db854
           val = val->next;
1db854
@@ -2941,7 +2881,7 @@ xg_update_menubar (GtkWidget *menubar,
1db854
           GtkWidget *submenu = create_menus (NULL, f,
1db854
                                              select_cb, deactivate_cb,
1db854
                                              highlight_cb,
1db854
-                                             0, 0, 0, 0, cl_data, 0);
1db854
+                                             0, 0, 0, cl_data, 0);
1db854
           gtk_widget_set_name (w, MENU_ITEM_NAME);
1db854
           gtk_menu_shell_insert (GTK_MENU_SHELL (menubar), w, pos);
1db854
           gtk_menu_item_set_submenu (GTK_MENU_ITEM (w), submenu);
1db854
@@ -3141,15 +3081,6 @@ xg_update_submenu (GtkWidget *submenu,
1db854
   {
1db854
     GtkWidget *w = GTK_WIDGET (iter->data);
1db854
 
1db854
-    /* Skip tearoff items, they have no counterpart in val.  */
1db854
-    if (GTK_IS_TEAROFF_MENU_ITEM (w))
1db854
-      {
1db854
-        has_tearoff_p = 1;
1db854
-        iter = g_list_next (iter);
1db854
-        if (iter) w = GTK_WIDGET (iter->data);
1db854
-        else break;
1db854
-      }
1db854
-
1db854
     /* Remember first radio button in a group.  If we get a mismatch in
1db854
        a radio group we must rebuild the whole group so that the connections
1db854
        in GTK becomes correct.  */
1db854
@@ -3237,7 +3168,6 @@ xg_update_submenu (GtkWidget *submenu,
1db854
                              highlight_cb,
1db854
                              0,
1db854
                              0,
1db854
-                             ! has_tearoff_p,
1db854
                              submenu,
1db854
                              cl_data,
1db854
                              0);
1db854
@@ -4026,186 +3956,6 @@ xg_get_tool_bar_widgets (GtkWidget *vb,
1db854
 }
1db854
 
1db854
 
1db854
-/* This callback is called when a tool item should create a proxy item,
1db854
-   such as for the overflow menu.  Also called when the tool bar is detached.
1db854
-   If we don't create a proxy menu item, the detached tool bar will be
1db854
-   blank.  */
1db854
-
1db854
-static gboolean
1db854
-xg_tool_bar_menu_proxy (GtkToolItem *toolitem, gpointer user_data)
1db854
-{
1db854
-  GtkButton *wbutton = GTK_BUTTON (XG_BIN_CHILD (XG_BIN_CHILD (toolitem)));
1db854
-  GtkWidget *vb = XG_BIN_CHILD (wbutton);
1db854
-  GtkWidget *c1;
1db854
-  GtkLabel *wlbl = GTK_LABEL (xg_get_tool_bar_widgets (vb, &c1));
1db854
-  GtkImage *wimage = GTK_IMAGE (c1);
1db854
-  GtkWidget *wmenuitem = gtk_image_menu_item_new_with_label
1db854
-    (wlbl ? gtk_label_get_text (wlbl) : "");
1db854
-  GtkWidget *wmenuimage;
1db854
-
1db854
-
1db854
-  if (gtk_button_get_use_stock (wbutton))
1db854
-    wmenuimage = gtk_image_new_from_stock (gtk_button_get_label (wbutton),
1db854
-                                           GTK_ICON_SIZE_MENU);
1db854
-  else
1db854
-    {
1db854
-      GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (wbutton));
1db854
-      GtkImageType store_type = gtk_image_get_storage_type (wimage);
1db854
-
1db854
-      g_object_set (G_OBJECT (settings), "gtk-menu-images", TRUE, NULL);
1db854
-
1db854
-      if (store_type == GTK_IMAGE_STOCK)
1db854
-        {
1db854
-          gchar *stock_id;
1db854
-          gtk_image_get_stock (wimage, &stock_id, NULL);
1db854
-          wmenuimage = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU);
1db854
-        }
1db854
-      else if (store_type == GTK_IMAGE_ICON_SET)
1db854
-        {
1db854
-          GtkIconSet *icon_set;
1db854
-          gtk_image_get_icon_set (wimage, &icon_set, NULL);
1db854
-          wmenuimage = gtk_image_new_from_icon_set (icon_set,
1db854
-                                                    GTK_ICON_SIZE_MENU);
1db854
-        }
1db854
-      else if (store_type == GTK_IMAGE_PIXBUF)
1db854
-        {
1db854
-          gint width, height;
1db854
-
1db854
-          if (settings &&
1db854
-              gtk_icon_size_lookup_for_settings (settings, GTK_ICON_SIZE_MENU,
1db854
-                                                 &width, &height))
1db854
-            {
1db854
-              GdkPixbuf *src_pixbuf, *dest_pixbuf;
1db854
-
1db854
-              src_pixbuf = gtk_image_get_pixbuf (wimage);
1db854
-              dest_pixbuf = gdk_pixbuf_scale_simple (src_pixbuf, width, height,
1db854
-                                                     GDK_INTERP_BILINEAR);
1db854
-
1db854
-              wmenuimage = gtk_image_new_from_pixbuf (dest_pixbuf);
1db854
-            }
1db854
-          else
1db854
-            {
1db854
-              fprintf (stderr, "internal error: GTK_IMAGE_PIXBUF failed\n");
1db854
-              emacs_abort ();
1db854
-            }
1db854
-        }
1db854
-      else if (store_type == GTK_IMAGE_ICON_NAME)
1db854
-        {
1db854
-          const gchar *icon_name;
1db854
-          GtkIconSize icon_size;
1db854
-
1db854
-          gtk_image_get_icon_name (wimage, &icon_name, &icon_size);
1db854
-          wmenuimage = gtk_image_new_from_icon_name (icon_name,
1db854
-                                                     GTK_ICON_SIZE_MENU);
1db854
-        }
1db854
-      else
1db854
-        {
1db854
-          fprintf (stderr, "internal error: store_type is %d\n", store_type);
1db854
-          emacs_abort ();
1db854
-        }
1db854
-    }
1db854
-  if (wmenuimage)
1db854
-    gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (wmenuitem), wmenuimage);
1db854
-
1db854
-  g_signal_connect (G_OBJECT (wmenuitem),
1db854
-                    "activate",
1db854
-                    G_CALLBACK (xg_tool_bar_proxy_callback),
1db854
-                    user_data);
1db854
-
1db854
-
1db854
-  g_object_set_data (G_OBJECT (wmenuitem), XG_TOOL_BAR_PROXY_BUTTON,
1db854
-                     (gpointer) wbutton);
1db854
-  gtk_tool_item_set_proxy_menu_item (toolitem, "Emacs toolbar item", wmenuitem);
1db854
-  gtk_widget_set_sensitive (wmenuitem,
1db854
-                            gtk_widget_get_sensitive (GTK_WIDGET (wbutton)));
1db854
-
1db854
-  /* Use enter/leave notify to show help.  We use the events
1db854
-     rather than the GtkButton specific signals "enter" and
1db854
-     "leave", so we can have only one callback.  The event
1db854
-     will tell us what kind of event it is.  */
1db854
-  g_signal_connect (G_OBJECT (wmenuitem),
1db854
-                    "enter-notify-event",
1db854
-                    G_CALLBACK (xg_tool_bar_proxy_help_callback),
1db854
-                    user_data);
1db854
-  g_signal_connect (G_OBJECT (wmenuitem),
1db854
-                    "leave-notify-event",
1db854
-                    G_CALLBACK (xg_tool_bar_proxy_help_callback),
1db854
-                    user_data);
1db854
-
1db854
-  return TRUE;
1db854
-}
1db854
-
1db854
-/* This callback is called when a tool bar is detached.  We must set
1db854
-   the height of the tool bar to zero when this happens so frame sizes
1db854
-   are correctly calculated.
1db854
-   WBOX is the handle box widget that enables detach/attach of the tool bar.
1db854
-   W is the tool bar widget.
1db854
-   CLIENT_DATA is a pointer to the frame the tool bar belongs to.  */
1db854
-
1db854
-static void
1db854
-xg_tool_bar_detach_callback (GtkHandleBox *wbox,
1db854
-                             GtkWidget *w,
1db854
-                             gpointer client_data)
1db854
-{
1db854
-  FRAME_PTR f = (FRAME_PTR) client_data;
1db854
-
1db854
-  g_object_set (G_OBJECT (w), "show-arrow", !x_gtk_whole_detached_tool_bar,
1db854
-		NULL);
1db854
-
1db854
-  if (f)
1db854
-    {
1db854
-      GtkRequisition req, req2;
1db854
-      FRAME_X_OUTPUT (f)->toolbar_detached = 1;
1db854
-      gtk_widget_get_preferred_size (GTK_WIDGET (wbox), NULL, &req;;
1db854
-      gtk_widget_get_preferred_size (w, NULL, &req2);
1db854
-      req.width -= req2.width;
1db854
-      req.height -= req2.height;
1db854
-      if (FRAME_TOOLBAR_TOP_HEIGHT (f) != 0)
1db854
-        FRAME_TOOLBAR_TOP_HEIGHT (f) = req.height;
1db854
-      else if (FRAME_TOOLBAR_BOTTOM_HEIGHT (f) != 0)
1db854
-        FRAME_TOOLBAR_BOTTOM_HEIGHT (f) = req.height;
1db854
-      else if (FRAME_TOOLBAR_RIGHT_WIDTH (f) != 0)
1db854
-        FRAME_TOOLBAR_RIGHT_WIDTH (f) = req.width;
1db854
-      else if (FRAME_TOOLBAR_LEFT_WIDTH (f) != 0)
1db854
-        FRAME_TOOLBAR_LEFT_WIDTH (f) = req.width;
1db854
-      xg_height_or_width_changed (f);
1db854
-    }
1db854
-}
1db854
-
1db854
-/* This callback is called when a tool bar is reattached.  We must set
1db854
-   the height of the tool bar when this happens so frame sizes
1db854
-   are correctly calculated.
1db854
-   WBOX is the handle box widget that enables detach/attach of the tool bar.
1db854
-   W is the tool bar widget.
1db854
-   CLIENT_DATA is a pointer to the frame the tool bar belongs to.  */
1db854
-
1db854
-static void
1db854
-xg_tool_bar_attach_callback (GtkHandleBox *wbox,
1db854
-                             GtkWidget *w,
1db854
-                             gpointer client_data)
1db854
-{
1db854
-  FRAME_PTR f = (FRAME_PTR) client_data;
1db854
-  g_object_set (G_OBJECT (w), "show-arrow", TRUE, NULL);
1db854
-
1db854
-  if (f)
1db854
-    {
1db854
-      GtkRequisition req, req2;
1db854
-      FRAME_X_OUTPUT (f)->toolbar_detached = 0;
1db854
-      gtk_widget_get_preferred_size (GTK_WIDGET (wbox), NULL, &req;;
1db854
-      gtk_widget_get_preferred_size (w, NULL, &req2);
1db854
-      req.width += req2.width;
1db854
-      req.height += req2.height;
1db854
-      if (FRAME_TOOLBAR_TOP_HEIGHT (f) != 0)
1db854
-        FRAME_TOOLBAR_TOP_HEIGHT (f) = req.height;
1db854
-      else if (FRAME_TOOLBAR_BOTTOM_HEIGHT (f) != 0)
1db854
-        FRAME_TOOLBAR_BOTTOM_HEIGHT (f) = req.height;
1db854
-      else if (FRAME_TOOLBAR_RIGHT_WIDTH (f) != 0)
1db854
-        FRAME_TOOLBAR_RIGHT_WIDTH (f) = req.width;
1db854
-      else if (FRAME_TOOLBAR_LEFT_WIDTH (f) != 0)
1db854
-        FRAME_TOOLBAR_LEFT_WIDTH (f) = req.width;
1db854
-      xg_height_or_width_changed (f);
1db854
-    }
1db854
-}
1db854
 
1db854
 /* This callback is called when the mouse enters or leaves a tool bar item.
1db854
    It is used for displaying and hiding the help text.
1db854
@@ -4298,44 +4048,30 @@ xg_pack_tool_bar (FRAME_PTR f, Lisp_Obje
1db854
                            into_hbox
1db854
                            ? GTK_ORIENTATION_VERTICAL
1db854
                            : GTK_ORIENTATION_HORIZONTAL);
1db854
-  if (!x->handlebox_widget)
1db854
-    {
1db854
-      x->handlebox_widget = gtk_handle_box_new ();
1db854
-      g_signal_connect (G_OBJECT (x->handlebox_widget), "child-detached",
1db854
-                        G_CALLBACK (xg_tool_bar_detach_callback), f);
1db854
-      g_signal_connect (G_OBJECT (x->handlebox_widget), "child-attached",
1db854
-                        G_CALLBACK (xg_tool_bar_attach_callback), f);
1db854
-      gtk_container_add (GTK_CONTAINER (x->handlebox_widget),
1db854
-                         x->toolbar_widget);
1db854
-    }
1db854
-
1db854
   if (into_hbox)
1db854
     {
1db854
-      gtk_handle_box_set_handle_position (GTK_HANDLE_BOX (x->handlebox_widget),
1db854
-                                          GTK_POS_TOP);
1db854
-      gtk_box_pack_start (GTK_BOX (x->hbox_widget), x->handlebox_widget,
1db854
+      gtk_box_pack_start (GTK_BOX (x->hbox_widget), x->toolbar_widget,
1db854
                           FALSE, FALSE, 0);
1db854
 
1db854
       if (EQ (pos, Qleft))
1db854
         gtk_box_reorder_child (GTK_BOX (x->hbox_widget),
1db854
-                               x->handlebox_widget,
1db854
+                               x->toolbar_widget,
1db854
                                0);
1db854
       x->toolbar_in_hbox = 1;
1db854
     }
1db854
   else
1db854
     {
1db854
       bool vbox_pos = x->menubar_widget != 0;
1db854
-      gtk_handle_box_set_handle_position (GTK_HANDLE_BOX (x->handlebox_widget),
1db854
-                                          GTK_POS_LEFT);
1db854
-      gtk_box_pack_start (GTK_BOX (x->vbox_widget), x->handlebox_widget,
1db854
+      gtk_box_pack_start (GTK_BOX (x->vbox_widget), x->toolbar_widget,
1db854
                           FALSE, FALSE, 0);
1db854
 
1db854
       if (EQ (pos, Qtop))
1db854
         gtk_box_reorder_child (GTK_BOX (x->vbox_widget),
1db854
-                               x->handlebox_widget,
1db854
+                               x->toolbar_widget,
1db854
                                vbox_pos);
1db854
       x->toolbar_in_hbox = 0;
1db854
     }
1db854
+  x->toolbar_is_packed = 1;
1db854
 }
1db854
 
1db854
 /* Create a tool bar for frame F.  */
1db854
@@ -4462,10 +4198,6 @@ xg_make_tool_item (FRAME_PTR f,
1db854
       intptr_t ii = i;
1db854
       gpointer gi = (gpointer) ii;
1db854
 
1db854
-      g_signal_connect (G_OBJECT (ti), "create-menu-proxy",
1db854
-                        G_CALLBACK (xg_tool_bar_menu_proxy),
1db854
-                        gi);
1db854
-
1db854
       g_signal_connect (G_OBJECT (wb), "clicked",
1db854
                         G_CALLBACK (xg_tool_bar_callback),
1db854
                         gi);
1db854
@@ -4580,12 +4312,12 @@ xg_update_tool_bar_sizes (FRAME_PTR f)
1db854
   GtkRequisition req;
1db854
   int nl = 0, nr = 0, nt = 0, nb = 0;
1db854
 
1db854
-  gtk_widget_get_preferred_size (GTK_WIDGET (x->handlebox_widget), NULL, &req;;
1db854
+  gtk_widget_get_preferred_size (GTK_WIDGET (x->toolbar_widget), NULL, &req;;
1db854
   if (x->toolbar_in_hbox)
1db854
     {
1db854
       int pos;
1db854
       gtk_container_child_get (GTK_CONTAINER (x->hbox_widget),
1db854
-                               x->handlebox_widget,
1db854
+                               x->toolbar_widget,
1db854
                                "position", &pos, NULL);
1db854
       if (pos == 0) nl = req.width;
1db854
       else nr = req.width;
1db854
@@ -4594,7 +4326,7 @@ xg_update_tool_bar_sizes (FRAME_PTR f)
1db854
     {
1db854
       int pos;
1db854
       gtk_container_child_get (GTK_CONTAINER (x->vbox_widget),
1db854
-                               x->handlebox_widget,
1db854
+                               x->toolbar_widget,
1db854
                                "position", &pos, NULL);
1db854
       if (pos == 0 || (pos == 1 && x->menubar_widget)) nt = req.height;
1db854
       else nb = req.height;
1db854
@@ -4665,7 +4397,6 @@ update_frame_tool_bar (FRAME_PTR f)
1db854
   GtkToolbar *wtoolbar;
1db854
   GtkToolItem *ti;
1db854
   GtkTextDirection dir;
1db854
-  bool pack_tool_bar = x->handlebox_widget == NULL;
1db854
   Lisp_Object style;
1db854
   bool text_image, horiz;
1db854
   struct xg_frame_tb_info *tbinfo;
1db854
@@ -4924,9 +4655,9 @@ update_frame_tool_bar (FRAME_PTR f)
1db854
 
1db854
   if (f->n_tool_bar_items != 0)
1db854
     {
1db854
-      if (pack_tool_bar)
1db854
+      if (! x->toolbar_is_packed)
1db854
         xg_pack_tool_bar (f, f->tool_bar_position);
1db854
-      gtk_widget_show_all (GTK_WIDGET (x->handlebox_widget));
1db854
+      gtk_widget_show_all (GTK_WIDGET (x->toolbar_widget));
1db854
       if (xg_update_tool_bar_sizes (f))
1db854
         xg_height_or_width_changed (f);
1db854
     }
1db854
@@ -4945,24 +4676,21 @@ free_frame_tool_bar (FRAME_PTR f)
1db854
   if (x->toolbar_widget)
1db854
     {
1db854
       struct xg_frame_tb_info *tbinfo;
1db854
-      bool is_packed = x->handlebox_widget != 0;
1db854
       block_input ();
1db854
-      /* We may have created the toolbar_widget in xg_create_tool_bar, but
1db854
-         not the x->handlebox_widget which is created in xg_pack_tool_bar.  */
1db854
-      if (is_packed)
1db854
+      if (x->toolbar_is_packed)
1db854
         {
1db854
           if (x->toolbar_in_hbox)
1db854
             gtk_container_remove (GTK_CONTAINER (x->hbox_widget),
1db854
-                                  x->handlebox_widget);
1db854
+                                  x->toolbar_widget);
1db854
           else
1db854
             gtk_container_remove (GTK_CONTAINER (x->vbox_widget),
1db854
-                                  x->handlebox_widget);
1db854
+                                  x->toolbar_widget);
1db854
         }
1db854
       else
1db854
         gtk_widget_destroy (x->toolbar_widget);
1db854
 
1db854
       x->toolbar_widget = 0;
1db854
-      x->handlebox_widget = 0;
1db854
+      x->toolbar_is_packed = 0;
1db854
       FRAME_TOOLBAR_TOP_HEIGHT (f) = FRAME_TOOLBAR_BOTTOM_HEIGHT (f) = 0;
1db854
       FRAME_TOOLBAR_LEFT_WIDTH (f) = FRAME_TOOLBAR_RIGHT_WIDTH (f) = 0;
1db854
 
1db854
@@ -4987,19 +4715,22 @@ xg_change_toolbar_position (FRAME_PTR f,
1db854
 {
1db854
   struct x_output *x = f->output_data.x;
1db854
 
1db854
-  if (! x->toolbar_widget || ! x->handlebox_widget)
1db854
+  if (! x->toolbar_widget)
1db854
     return;
1db854
 
1db854
   block_input ();
1db854
-  g_object_ref (x->handlebox_widget);
1db854
-  if (x->toolbar_in_hbox)
1db854
-    gtk_container_remove (GTK_CONTAINER (x->hbox_widget),
1db854
-                          x->handlebox_widget);
1db854
-  else
1db854
-    gtk_container_remove (GTK_CONTAINER (x->vbox_widget),
1db854
-                          x->handlebox_widget);
1db854
+  g_object_ref (x->toolbar_widget);
1db854
+  if (x->toolbar_is_packed)
1db854
+    {
1db854
+      if (x->toolbar_in_hbox)
1db854
+        gtk_container_remove (GTK_CONTAINER (x->hbox_widget),
1db854
+                              x->toolbar_widget);
1db854
+      else
1db854
+        gtk_container_remove (GTK_CONTAINER (x->vbox_widget),
1db854
+                              x->toolbar_widget);
1db854
+    }
1db854
   xg_pack_tool_bar (f, pos);
1db854
-  g_object_unref (x->handlebox_widget);
1db854
+  g_object_unref (x->toolbar_widget);
1db854
   if (xg_update_tool_bar_sizes (f))
1db854
     xg_height_or_width_changed (f);
1db854
 
1db854
@@ -5025,7 +4756,6 @@ xg_initialize (void)
1db854
 
1db854
   gdpy_def = NULL;
1db854
   xg_ignore_gtk_scrollbar = 0;
1db854
-  xg_detached_menus = 0;
1db854
   xg_menu_cb_list.prev = xg_menu_cb_list.next =
1db854
     xg_menu_item_cb_list.prev = xg_menu_item_cb_list.next = 0;
1db854