--- a/gtk/gtkmenu.c
+++ b/gtk/gtkmenu.c
@@ -1398,13 +1398,18 @@
                   gboolean            flipped_y,
                   GtkMenu            *menu)
 {
-  g_signal_emit (menu,
-                 menu_signals[POPPED_UP],
-                 0,
-                 flipped_rect,
-                 final_rect,
-                 flipped_x,
-                 flipped_y);
+	GtkMenuPrivate *priv = menu->priv;
+
+  gtk_window_fixate_size (GTK_WINDOW (priv->toplevel));
+
+  if (!priv->emulated_move_to_rect)
+    g_signal_emit (menu,
+                   menu_signals[POPPED_UP],
+                   0,
+                   flipped_rect,
+                   final_rect,
+                   flipped_x,
+                   flipped_y);
 }
 
 static void
@@ -5286,9 +5291,9 @@
 
   g_signal_handlers_disconnect_by_func (toplevel, moved_to_rect_cb, menu);
 
-  if (!emulated_move_to_rect)
-    g_signal_connect (toplevel, "moved-to-rect", G_CALLBACK (moved_to_rect_cb),
-                      menu);
+g_signal_connect (toplevel, "moved-to-rect", G_CALLBACK (moved_to_rect_cb),
+                    menu);
+  priv->emulated_move_to_rect = emulated_move_to_rect;
 
   gdk_window_move_to_rect (toplevel,
                            &rect,
--- a/gtk/gtkmenuprivate.h
+++ b/gtk/gtkmenuprivate.h
@@ -62,6 +62,7 @@
   gint               rect_anchor_dx;
   gint               rect_anchor_dy;
   GdkWindowTypeHint  menu_type_hint;
+  gboolean           emulated_move_to_rect;
 
   guint toggle_size;
   guint accel_size;
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -265,6 +265,7 @@
   guint    unlimited_guessed_size_x  : 1;
   guint    unlimited_guessed_size_y  : 1;
   guint    force_resize              : 1;
+  guint    fixate_size               : 1;
 
   guint    use_subsurface            : 1;
 
@@ -473,7 +474,6 @@
 static GtkWindowGeometryInfo* gtk_window_get_geometry_info         (GtkWindow    *window,
                                                                     gboolean      create);
 
-static void     gtk_window_move_resize               (GtkWindow    *window);
 static gboolean gtk_window_compare_hints             (GdkGeometry  *geometry_a,
                                                       guint         flags_a,
                                                       GdkGeometry  *geometry_b,
@@ -551,6 +551,10 @@
 static void gtk_window_state_flags_changed (GtkWidget     *widget,
                                             GtkStateFlags  previous_state);
 
+static void gtk_window_get_remembered_size (GtkWindow *window,
+                                            int       *width,
+                                            int       *height);
+
 static GSList      *toplevel_list = NULL;
 static guint        window_signals[LAST_SIGNAL] = { 0 };
 static GList       *default_icon_list = NULL;
@@ -6435,6 +6439,8 @@
    * size of the window, so it's remembered.
    */
   priv->need_default_position = TRUE;
+ 
+  priv->fixate_size = FALSE;
 
   info = gtk_window_get_geometry_info (window, FALSE);
   if (info)
@@ -6477,6 +6483,14 @@
   priv->force_resize = TRUE;
 }
 
+void
+gtk_window_fixate_size (GtkWindow *window)
+{
+  GtkWindowPrivate *priv = window->priv;
+
+  priv->fixate_size = TRUE;
+}
+
 /* (Note: Replace "size" with "width" or "height". Also, the request
  * mode is honoured.)
  * For selecting the default window size, the following conditions
@@ -6508,6 +6522,13 @@
   display = gtk_widget_get_display (widget);
   gdkwindow = _gtk_widget_get_window (widget);
 
+  if (window->priv->fixate_size)
+    {
+      g_assert (gdkwindow);
+      gtk_window_get_remembered_size (window, width, height);
+      return;
+    }
+
   if (gdkwindow)
     monitor = gdk_display_get_monitor_at_window (display, gdkwindow);
   else
@@ -9729,7 +9750,7 @@
     }
 }
 
-static void
+void
 gtk_window_move_resize (GtkWindow *window)
 {
   /* Overview:
--- a/gtk/gtkwindowprivate.h
+++ b/gtk/gtkwindowprivate.h
@@ -139,6 +139,8 @@
                                                   gboolean   x,
                                                   gboolean   y);
 void       gtk_window_force_resize (GtkWindow *window);
+void       gtk_window_fixate_size (GtkWindow *window);
+void       gtk_window_move_resize (GtkWindow *window);
 
 /* Exported handles */
 
