Add missing ChangeLog entry
[hildon] / hildon / hildon-window.c
index 8d8e2f5..2f02a38 100644 (file)
 
 /**
  * SECTION:hildon-window
- * @short_description: Widget representing a top-level window in the Hildon framework.
+ * @short_description: Top-level window in the Hildon framework.
  * @see_also: #HildonProgram, #HildonStackableWindow
  *
- * #HildonWindow is a GTK widget which represents a top-level
+ * #HildonWindow is a top-level
  * window in the Hildon framework. It is derived from #GtkWindow
  * and provides additional commodities specific to the Hildon
  * framework.
 
 #define                                         CAN_HIBERNATE_PROPERTY "_HILDON_ABLE_TO_HIBERNATE"
 
+#define                                         LEGACY_MENU_PROPERTY_NAME  "_HILDON_WM_WINDOW_TYPE"
+#define                                         LEGACY_MENU_PROPERTY_VALUE "_HILDON_WM_WINDOW_TYPE_LEGACY_MENU"
+
 #define TITLE_SEPARATOR                         " - "
 
 typedef void                                    (*HildonWindowSignal) (HildonWindow *, gint, gpointer);
@@ -689,45 +692,29 @@ static void
 hildon_window_size_request                      (GtkWidget *widget, 
                                                  GtkRequisition *requisition)
 {
+    GdkScreen *screen = gtk_widget_get_screen (widget);
     HildonWindowPrivate *priv = HILDON_WINDOW_GET_PRIVATE (widget);
+    GtkWidget *child;
+    GtkRequisition req;
     g_assert (priv);
 
-    GtkWidget *child = GTK_BIN (widget)->child;
-    GtkRequisition req2 = { 0 };
-    gint border_width = GTK_CONTAINER(widget)->border_width;
-
-    if (! priv->borders)
-    {
-        hildon_window_get_borders (HILDON_WINDOW (widget));
-    }
-
-    if (child)
-        gtk_widget_size_request (child, requisition);
+    child = gtk_bin_get_child (GTK_BIN (widget));
 
-    if (priv->vbox != NULL)
-        gtk_widget_size_request (priv->vbox, &req2);
+    if (child != NULL && GTK_WIDGET_VISIBLE (child))
+        gtk_widget_size_request (child, &req);
 
-    requisition->height += req2.height;
-    requisition->width = MAX (requisition->width, req2.width);
+    if (priv->vbox != NULL && GTK_WIDGET_VISIBLE (priv->vbox))
+        gtk_widget_size_request (priv->vbox, &req);
 
     if (priv->edit_toolbar != NULL && GTK_WIDGET_VISIBLE (priv->edit_toolbar))
-    {
-        GtkRequisition req;
         gtk_widget_size_request (priv->edit_toolbar, &req);
-        requisition->height += req.height;
-        requisition->width = MAX (requisition->width, req.width);
-    }
 
-    requisition->width  += 2 * border_width;
-    requisition->height += 2 * border_width;
+    /* Request the full size of the screen */
+    requisition->width = gdk_screen_get_width (screen);
+    requisition->height = gdk_screen_get_height (screen);
 
     if (! priv->fullscreen)
-    {
-        requisition->height += priv->borders->top;
-        if (req2.height == 0)
-            requisition->height += priv->borders->bottom;
-        requisition->width += priv->borders->left + priv->borders->right;
-    }
+        requisition->height -= HILDON_WINDOW_TITLEBAR_HEIGHT;
 }
 
 static void
@@ -1257,6 +1244,36 @@ hildon_window_focus_out_event                   (GtkWidget *widget,
   return GTK_WIDGET_CLASS (hildon_window_parent_class)->focus_out_event (widget, event);
 }
 
+static void
+set_legacy_menu_type                            (GtkMenu  *menu,
+                                                 gboolean  set)
+{
+    GdkWindow *gdkwin = GTK_WIDGET (menu->toplevel)->window;
+    GdkAtom property = gdk_atom_intern_static_string (LEGACY_MENU_PROPERTY_NAME);
+    if (set) {
+        GdkAtom type = gdk_x11_xatom_to_atom (XA_ATOM);
+        GdkAtom value = gdk_atom_intern_static_string (LEGACY_MENU_PROPERTY_VALUE);
+        gdk_property_change (gdkwin, property, type, 32,
+                             GDK_PROP_MODE_REPLACE, (const guchar *) &value, 1);
+    } else {
+        gdk_property_delete (gdkwin, property);
+    }
+}
+
+static void
+legacy_menu_realized                            (GtkMenu *menu)
+{
+    set_legacy_menu_type (menu, TRUE);
+    g_signal_handlers_disconnect_by_func (menu, legacy_menu_realized, NULL);
+}
+
+static void
+legacy_menu_unmapped                            (GtkMenu *menu)
+{
+    set_legacy_menu_type (menu, FALSE);
+    g_signal_handlers_disconnect_by_func (menu, legacy_menu_unmapped, NULL);
+}
+
 /*
  * The menu popuping needs a menu popup-function
  */
@@ -1561,6 +1578,18 @@ hildon_window_toggle_gtk_menu                   (HildonWindow *self,
             HildonWindowPrivate *priv = HILDON_WINDOW_GET_PRIVATE (self);
             g_list_free (menu_children);
 
+            /* Set the 'legacy app menu' property when the widget is realized */
+            if (GTK_WIDGET_REALIZED (menu)) {
+                set_legacy_menu_type (menu, TRUE);
+            } else {
+                g_signal_connect (menu, "realize",
+                                  G_CALLBACK (legacy_menu_realized), NULL);
+            }
+
+            /* Remove it when it's unmapped */
+            g_signal_connect (menu, "unmap",
+                              G_CALLBACK (legacy_menu_unmapped), NULL);
+
             /* Apply right theming */
             gtk_widget_set_name (GTK_WIDGET (menu), "menu_force_with_corners");
 
@@ -1876,7 +1905,7 @@ hildon_window_set_edit_toolbar                  (HildonWindow      *self,
  * hildon_window_get_main_menu:
  * @self: a #HildonWindow
  *
- * Gets the #GtkMenu assigned to the #HildonAppview. Note that the
+ * Gets the #GtkMenu assigned to the #HildonWindow. Note that the
  * window is still the owner of the menu.
  *
  * Note that if you're using a #HildonAppMenu rather than a #GtkMenu
@@ -1902,6 +1931,8 @@ hildon_window_get_main_menu                     (HildonWindow * self)
  * hildon_window_get_menu:
  * @self: a #HildonWindow
  *
+ * Gets the #GtkMenu assigned to @self
+ *
  * Return value: a #GtkMenu
  *
  * Deprecated: In Hildon 2.2 this function has been renamed to