changeset 111746:62613ed5d53d

Fix bug 7425. NOTE: When merging to trunk: xg_height_changed is xg_height_or_width_changed in trunk. * src/gtkutil.c (menubar_map_cb): New function. (xg_update_frame_menubar): Connect signal map to menubar_map_cb. Use 23 as menubar height if 0. (Bug#7425).
author Jan D. <jan.h.d@swipnet.se>
date Sat, 20 Nov 2010 14:50:55 +0100
parents c392bf1fd90c
children 70ad6f6f15c7
files src/ChangeLog src/gtkutil.c
diffstat 2 files changed, 34 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Fri Nov 19 11:25:09 2010 -0500
+++ b/src/ChangeLog	Sat Nov 20 14:50:55 2010 +0100
@@ -1,3 +1,9 @@
+2010-11-20  Jan Djärv  <jan.h.d@swipnet.se>
+
+	* gtkutil.c (menubar_map_cb): New function (Bug#7425).
+	(xg_update_frame_menubar): Connect signal map to menubar_map_cb.
+	Use 23 as menubar height if 0. (Bug#7425).
+
 2010-11-14  Jan Djärv  <jan.h.d@swipnet.se>
 
 	* xsettings.c (init_gconf): Check HAVE_G_TYPE_INIT.
--- a/src/gtkutil.c	Fri Nov 19 11:25:09 2010 -0500
+++ b/src/gtkutil.c	Sat Nov 20 14:50:55 2010 +0100
@@ -2936,6 +2936,23 @@
   gtk_widget_show_all (menubar);
 }
 
+/* Callback called when the menu bar W is mapped.
+   Used to find the height of the menu bar if we didn't get it
+   after showing the widget.  */
+
+static void
+menubar_map_cb (GtkWidget *w, gpointer user_data)
+{
+  GtkRequisition req;
+  FRAME_PTR f = (FRAME_PTR) user_data;
+  gtk_widget_size_request (w, &req);
+  if (FRAME_MENUBAR_HEIGHT (f) != req.height) 
+    {
+      FRAME_MENUBAR_HEIGHT (f) = req.height;
+      xg_height_changed (f);
+    }
+}
+
 /* Recompute all the widgets of frame F, when the menu bar has been
    changed.  Value is non-zero if widgets were updated.  */
 
@@ -2958,10 +2975,19 @@
                       FALSE, FALSE, 0);
   gtk_box_reorder_child (GTK_BOX (x->vbox_widget), x->menubar_widget, 0);
 
+  g_signal_connect (x->menubar_widget, "map", G_CALLBACK (menubar_map_cb), f);
   gtk_widget_show_all (x->menubar_widget);
   gtk_widget_size_request (x->menubar_widget, &req);
-  FRAME_MENUBAR_HEIGHT (f) = req.height;
-  xg_height_changed (f);
+  /* If menu bar doesn't know its height yet, cheat a little so the frame
+     doesn't jump so much when resized later in menubar_map_cb.  */
+  if (req.height == 0)
+    req.height = 23;
+
+  if (FRAME_MENUBAR_HEIGHT (f) != req.height)
+    {
+      FRAME_MENUBAR_HEIGHT (f) = req.height;
+      xg_height_changed (f);
+    }
   UNBLOCK_INPUT;
 
   return 1;