[maemo-commits] [maemo-commits] r11772 - in projects/haf/trunk/hildon-desktop: . libhildondesktop libhildonwm src

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Wed May 23 14:43:32 EEST 2007
Author: moimart
Date: 2007-05-23 14:43:30 +0300 (Wed, 23 May 2007)
New Revision: 11772

Modified:
   projects/haf/trunk/hildon-desktop/ChangeLog
   projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.c
   projects/haf/trunk/hildon-desktop/libhildonwm/hd-keys.c
   projects/haf/trunk/hildon-desktop/src/hd-switcher-menu-item.c
   projects/haf/trunk/hildon-desktop/src/hd-switcher-menu.c
Log:

	* src/hd-switcher-menu-item.c:
        - Inherits againg from GtkImageMenuItem.
        * src/hd-switcher-menu.c:
        - Implemented dettached menu button.
        * libhildondesktop/hildon-desktop-popup-menu.c:
        - Fixed two little memory leaks.
        * libhildonwm/hd-keys.c:
        - Changed applet name for search.
	* ChangeLog updated.



Modified: projects/haf/trunk/hildon-desktop/ChangeLog
===================================================================
--- projects/haf/trunk/hildon-desktop/ChangeLog	2007-05-23 11:34:46 UTC (rev 11771)
+++ projects/haf/trunk/hildon-desktop/ChangeLog	2007-05-23 11:43:30 UTC (rev 11772)
@@ -1,3 +1,14 @@
+2007-05-22  Moises Martinez  <moises.martinez at nokia.com>
+
+	* src/hd-switcher-menu-item.c:
+	- Inherits againg from GtkImageMenuItem.
+	* src/hd-switcher-menu.c:
+	- Implemented dettached menu button.
+	* libhildondesktop/hildon-desktop-popup-menu.c:
+	- Fixed two little memory leaks.
+	* libhildonwm/hd-keys.c:
+	- Changed applet name for search.
+
 2007-05-22  Lucas Rocha  <lucas.rocha at nokia.com>
 
 	* src/hn-app-button.c: don't show tooltip when tapping and holding on

Modified: projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.c
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.c	2007-05-23 11:34:46 UTC (rev 11771)
+++ projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.c	2007-05-23 11:43:30 UTC (rev 11772)
@@ -253,20 +253,20 @@
   HildonDesktopPopupMenuPrivate *priv;
   GtkRequisition child_requisition;
   GtkAllocation child_allocation;
-  GList *children;
+  GList *children, *iter;
   gint height = 0;
   
   menu = HILDON_DESKTOP_POPUP_MENU (widget);
   priv = menu->priv;
 
-  children = gtk_container_get_children (GTK_CONTAINER (priv->box_items));
+  iter = children = gtk_container_get_children (GTK_CONTAINER (priv->box_items));
   
-  while (children)
+  while (iter)
   {
     GtkWidget *child;
 
-    child = children->data;
-    children = children->next;
+    child = iter->data;
+    iter  = iter->next;
 
     if (GTK_WIDGET_VISIBLE (child))
     {
@@ -288,6 +288,8 @@
     }
   }
 
+  g_list_free (children);
+
   GTK_WIDGET_CLASS (hildon_desktop_popup_menu_parent_class)->size_allocate (widget, allocation);
 }
 
@@ -298,7 +300,7 @@
   HildonDesktopPopupMenuPrivate *priv;
   GtkRequisition child_requisition;
   guint max_toggle_size;
-  GList *children;
+  GList *children, *iter;
   
   g_return_if_fail (HILDON_DESKTOP_IS_POPUP_MENU (widget));
   g_return_if_fail (req != NULL);
@@ -308,15 +310,15 @@
   
   max_toggle_size = 0;
 
-  children = gtk_container_get_children (GTK_CONTAINER (priv->box_items));
+  iter = children = gtk_container_get_children (GTK_CONTAINER (priv->box_items));
 
-  while (children)
+  while (iter)
   {
     GtkMenuItem *child;
     gint toggle_size;
 
-    child = (GtkMenuItem *) children->data;
-    children = children->next;
+    child = (GtkMenuItem *) iter->data;
+    iter  = iter->next;
 
     if (GTK_WIDGET_VISIBLE (child))
     {
@@ -330,6 +332,8 @@
 
   priv->toggle_size = max_toggle_size;
 
+  g_list_free (children);
+
   GTK_WIDGET_CLASS (hildon_desktop_popup_menu_parent_class)->size_request (widget, req);
 }
 

Modified: projects/haf/trunk/hildon-desktop/libhildonwm/hd-keys.c
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildonwm/hd-keys.c	2007-05-23 11:34:46 UTC (rev 11771)
+++ projects/haf/trunk/hildon-desktop/libhildonwm/hd-keys.c	2007-05-23 11:43:30 UTC (rev 11772)
@@ -166,7 +166,7 @@
 hd_keys_launch_application (HDKeysConfig *keys,
 			    gpointer     *user_data)
 {
-  hd_wm_activate_service ("osso-global-search.desktop", NULL);
+  hd_wm_activate_service ("isearch-applet.desktop", NULL);
 }
 
 static void 

Modified: projects/haf/trunk/hildon-desktop/src/hd-switcher-menu-item.c
===================================================================
--- projects/haf/trunk/hildon-desktop/src/hd-switcher-menu-item.c	2007-05-23 11:34:46 UTC (rev 11771)
+++ projects/haf/trunk/hildon-desktop/src/hd-switcher-menu-item.c	2007-05-23 11:43:30 UTC (rev 11772)
@@ -129,7 +129,7 @@
   HildonDesktopNotificationManager *nm;
 };
 
-G_DEFINE_TYPE (HDSwitcherMenuItem, hd_switcher_menu_item, GTK_TYPE_MENU_ITEM);
+G_DEFINE_TYPE (HDSwitcherMenuItem, hd_switcher_menu_item, GTK_TYPE_IMAGE_MENU_ITEM);
 
 static void
 hd_switcher_menu_item_finalize (GObject *gobject)
@@ -298,7 +298,7 @@
   gtk_widget_show (hbox);
 
   priv->icon = gtk_image_new ();
-  gtk_box_pack_start (GTK_BOX (hbox), priv->icon, FALSE, FALSE, 0);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), priv->icon);
   gtk_widget_show (priv->icon);
 
   vbox = gtk_vbox_new (FALSE, 0);

Modified: projects/haf/trunk/hildon-desktop/src/hd-switcher-menu.c
===================================================================
--- projects/haf/trunk/hildon-desktop/src/hd-switcher-menu.c	2007-05-23 11:34:46 UTC (rev 11771)
+++ projects/haf/trunk/hildon-desktop/src/hd-switcher-menu.c	2007-05-23 11:43:30 UTC (rev 11772)
@@ -42,6 +42,7 @@
 #include <libhildondesktop/hildon-desktop-popup-window.h>
 #include <libhildondesktop/hildon-desktop-popup-menu.h>
 #include <libhildondesktop/hildon-desktop-toggle-button.h>
+#include <libhildondesktop/hildon-desktop-panel-window-dialog.h>
 
 /* Menu item strings */
 #define AS_HOME_ITEM 		_("tana_fi_home")
@@ -84,6 +85,8 @@
 
 #define SWITCHER_TOGGLE_BUTTON GTK_BIN(switcher)->child
 
+#define SWITCHER_DETTACHED_TIMEOUT 5000
+
 enum 
 {
   PROP_MENU_NITEMS=1,
@@ -118,6 +121,9 @@
   GtkTreeIter		   *last_iter_added;
 
   HDEntryInfo		   *last_urgent_info;
+
+  GtkWidget		   *window_dialog;
+  GtkWidget		   *toggle_button;
 };
 
 static GObject *hd_switcher_menu_constructor (GType gtype,
@@ -167,6 +173,10 @@
 
 static void hd_switcher_menu_item_activated (GtkMenuItem *menuitem, HDSwitcherMenu *switcher);
 
+static void hd_switcher_menu_attach_button (HDSwitcherMenu *switcher);
+
+static void hd_switcher_menu_dettach_button (HDSwitcherMenu *switcher);
+
 static void 
 hd_switcher_menu_init (HDSwitcherMenu *switcher)
 {
@@ -276,7 +286,7 @@
     }
     else
     {
-      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (SWITCHER_TOGGLE_BUTTON), FALSE);
+      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (switcher->priv->toggle_button), FALSE);
 
       GdkWindow *window = gtk_widget_get_parent_window (GTK_WIDGET (switcher));
       gtk_widget_grab_focus (GTK_WIDGET (switcher));
@@ -347,9 +357,9 @@
       event->keyval == GDK_KP_Right)
   {
     gtk_toggle_button_set_active
-      (GTK_TOGGLE_BUTTON (SWITCHER_TOGGLE_BUTTON), TRUE);
+      (GTK_TOGGLE_BUTTON (switcher->priv->toggle_button), TRUE);
 	  
-    g_signal_emit_by_name (SWITCHER_TOGGLE_BUTTON, "toggled");
+    g_signal_emit_by_name (switcher->priv->toggle_button, "toggled");
   }	  
 
   return TRUE;
@@ -374,7 +384,7 @@
   }	  
 
   gtk_toggle_button_set_active 
-    (GTK_TOGGLE_BUTTON (SWITCHER_TOGGLE_BUTTON), FALSE);
+    (GTK_TOGGLE_BUTTON (switcher->priv->toggle_button), FALSE);
 
   g_list_free (children);
 }	
@@ -399,6 +409,8 @@
 
   button = hildon_desktop_toggle_button_new ();
 
+  switcher->priv->toggle_button = button;
+
   gtk_widget_set_name (button, AS_MENU_BUTTON_NAME);
   gtk_widget_set_size_request (button, -1, AS_MENU_BUTTON_HEIGHT);
 
@@ -611,11 +623,61 @@
   hd_switcher_menu_populate_notifications (switcher);
 
   hd_switcher_menu_check_content (switcher);
+
+  switcher->priv->window_dialog = NULL;
   
   return object;
 }
 
+static gboolean 
+hd_switcher_menu_force_move_window (GtkWidget *widget, HDSwitcherMenu *switcher)
+{
+  gint x,y;
+
+  g_object_get (widget, "x", &x, "y", &y, NULL);  
+	
+  gdk_window_move (widget->window, x, y);
+
+  return FALSE;
+}	
+
 static void 
+hd_switcher_create_external_window (HDSwitcherMenu *switcher)
+{
+  HildonDesktopPanelWindowOrientation orientation;
+  GtkWidget *top_level;
+	
+  if (switcher->priv->window_dialog)
+    return;	  
+
+  top_level = gtk_widget_get_toplevel (GTK_WIDGET (switcher));
+
+  if (HILDON_DESKTOP_IS_PANEL_WINDOW (top_level))
+    g_object_get (top_level, "orientation", &orientation, NULL);
+  else
+    orientation = HILDON_DESKTOP_PANEL_WINDOW_ORIENTATION_LEFT;	  
+  
+  switcher->priv->window_dialog =
+    GTK_WIDGET (g_object_new (HILDON_DESKTOP_TYPE_PANEL_WINDOW_DIALOG,
+                              "x", 0,
+                              "y", gdk_screen_height () - AS_BUTTON_HEIGHT*2,
+                              "width", GTK_WIDGET (switcher)->allocation.width,
+                              "height", AS_BUTTON_HEIGHT*2,
+                              "move", TRUE,
+                              "use-old-titlebar", FALSE,
+			      "orientation", orientation,
+                              NULL));
+
+  gtk_container_remove (GTK_CONTAINER (switcher->priv->window_dialog),
+                        GTK_BIN (switcher->priv->window_dialog)->child);
+
+  g_signal_connect (switcher->priv->window_dialog,
+		    "map-event",
+		    G_CALLBACK (hd_switcher_menu_force_move_window),
+		    (gpointer)switcher);
+}	
+
+static void 
 hd_switcher_menu_finalize (GObject *object)
 {
   HDSwitcherMenu *switcher = HD_SWITCHER_MENU (object);	
@@ -624,6 +686,9 @@
 
   gtk_widget_destroy (GTK_WIDGET (switcher->priv->popup_window));
 
+  if (switcher->priv->window_dialog)
+    gtk_widget_destroy (switcher->priv->window_dialog);	  
+
   g_object_unref (switcher->priv->icon_theme);
 	
   G_OBJECT_CLASS (hd_switcher_menu_parent_class)->finalize (object);
@@ -653,16 +718,16 @@
 
     if (image_blinking)
     {    
-      if (GTK_BIN (SWITCHER_TOGGLE_BUTTON)->child == switcher->priv->icon)   
+      if (GTK_BIN (switcher->priv->toggle_button)->child == switcher->priv->icon)   
       {	      
         g_object_ref (G_OBJECT (switcher->priv->icon));
-        gtk_container_remove (GTK_CONTAINER (SWITCHER_TOGGLE_BUTTON), GTK_WIDGET (switcher->priv->icon));
+        gtk_container_remove (GTK_CONTAINER (switcher->priv->toggle_button), GTK_WIDGET (switcher->priv->icon));
       }
       else
-       gtk_container_remove (GTK_CONTAINER (SWITCHER_TOGGLE_BUTTON), GTK_BIN (SWITCHER_TOGGLE_BUTTON)->child);	      
+       gtk_container_remove (GTK_CONTAINER (switcher->priv->toggle_button), GTK_BIN (switcher->priv->toggle_button)->child);	      
     }
 
-    gtk_container_add (GTK_CONTAINER (SWITCHER_TOGGLE_BUTTON), image_blinking);
+    gtk_container_add (GTK_CONTAINER (switcher->priv->toggle_button), image_blinking);
     gtk_widget_show (image_blinking);
   }
 }
@@ -675,7 +740,7 @@
       (switcher->priv->popup_window);
 
   gtk_toggle_button_set_active
-    (GTK_TOGGLE_BUTTON (SWITCHER_TOGGLE_BUTTON), FALSE);
+    (GTK_TOGGLE_BUTTON (switcher->priv->toggle_button), FALSE);
 }	
 
 static void 
@@ -697,12 +762,12 @@
   if (state)
   {
     gtk_widget_set_name (GTK_WIDGET (switcher), SWITCHER_HIGHLIGHTED_NAME);
-    gtk_widget_set_name (GTK_BIN (switcher)->child, SWITCHER_HIGHLIGHTED_NAME);    
+    gtk_widget_set_name (switcher->priv->toggle_button, SWITCHER_HIGHLIGHTED_NAME);    
   }	  
   else
   {
     gtk_widget_set_name (GTK_WIDGET (switcher), AS_MENU_BUTTON_NAME);
-    gtk_widget_set_name (GTK_BIN (switcher)->child, AS_MENU_BUTTON_NAME);
+    gtk_widget_set_name (switcher->priv->toggle_button, AS_MENU_BUTTON_NAME);
   }	  
 }
 
@@ -716,25 +781,40 @@
   
   if ((hd_wm_get_applications (switcher->hdwm) != NULL) || children)
   {
-     gtk_widget_show (GTK_BIN (SWITCHER_TOGGLE_BUTTON)->child);
+     gtk_widget_show (GTK_BIN (switcher->priv->toggle_button)->child);
      
      if (children)
+     {	     
+       if (GTK_BIN (switcher->priv->toggle_button)->child != switcher->priv->icon)
+       {
+         if (switcher->priv->fullscreen)
+           hd_switcher_menu_dettach_button (switcher);
+         else
+           hd_switcher_menu_attach_button (switcher);	     
+       }	       
+	     
        hd_switcher_menu_update_highlighting (switcher, TRUE);
+     }
      else
+     {	     
        hd_switcher_menu_update_highlighting (switcher, FALSE);        
+     }
+
+     if (!switcher->priv->fullscreen)
+       hd_switcher_menu_attach_button (switcher);
   }
   else
   {	  
      hd_switcher_menu_update_highlighting (switcher, FALSE);
 	  
-     gtk_widget_hide (GTK_BIN (SWITCHER_TOGGLE_BUTTON)->child);	  
+     gtk_widget_hide (GTK_BIN (switcher->priv->toggle_button)->child);	  
 
      if (switcher->priv->is_open)
        hildon_desktop_popup_window_popdown 
          (switcher->priv->popup_window);	       
 
      gtk_toggle_button_set_active 
-       (GTK_TOGGLE_BUTTON (SWITCHER_TOGGLE_BUTTON), FALSE);
+       (GTK_TOGGLE_BUTTON (switcher->priv->toggle_button), FALSE);
   }
 
   g_list_free (children);
@@ -812,7 +892,14 @@
   HildonDesktopPanelWindowOrientation orientation =
       HILDON_DESKTOP_PANEL_WINDOW_ORIENTATION_LEFT;
   GtkWidget *button = GTK_BIN (switcher)->child;
+  gboolean dettached = FALSE;
 
+  if (!button)
+  {	  
+    button = GTK_BIN (switcher->priv->window_dialog)->child;	  
+    dettached = TRUE;
+  }
+  
   if (!GTK_WIDGET_REALIZED (GTK_WIDGET (data)))
     return;
 
@@ -834,14 +921,19 @@
   {
     case HILDON_DESKTOP_PANEL_WINDOW_ORIENTATION_LEFT:
       if (switcher->priv->fullscreen)
-        *x = 0;
+        *x = 0;	
       else      
-        *x = workarea.x;
-
+        *x = workarea.x;		
+      
       if (main_height - button->allocation.y < menu_height)
         *y = MAX (0, (main_height - menu_height));
       else
-        *y = button->allocation.y;
+      {
+        if (!dettached)	      
+          *y = button->allocation.y;
+	else
+          *y = main_height -menu_height;// button->requisition.height;
+      }
       break;
 
     case HILDON_DESKTOP_PANEL_WINDOW_ORIENTATION_RIGHT:
@@ -882,10 +974,10 @@
 static void 
 hd_switcher_menu_toggled_cb (GtkWidget *button, HDSwitcherMenu *switcher)
 {
-  if (!GTK_WIDGET_VISIBLE (GTK_BIN (SWITCHER_TOGGLE_BUTTON)->child))
+  if (!GTK_WIDGET_VISIBLE (GTK_BIN (switcher->priv->toggle_button)->child))
     return;
-	
-  if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (SWITCHER_TOGGLE_BUTTON)))
+
+  if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (switcher->priv->toggle_button)))
   {
     hildon_desktop_popup_window_popdown (switcher->priv->popup_window);
     return;
@@ -907,6 +999,9 @@
   hd_switcher_menu_reset_main_icon (switcher);
 
   hd_switcher_menu_check_content (switcher);
+
+  if (GTK_BIN (switcher->priv->toggle_button)->child == switcher->priv->icon)
+    hd_switcher_menu_attach_button (switcher);	  
 }	
 
 static void 
@@ -929,12 +1024,12 @@
 static void 
 hd_switcher_menu_reset_main_icon (HDSwitcherMenu *switcher)
 {
-  if (GTK_BIN (SWITCHER_TOGGLE_BUTTON)->child != switcher->priv->icon)
+  if (GTK_BIN (switcher->priv->toggle_button)->child != switcher->priv->icon)
   {
-    gtk_container_remove (GTK_CONTAINER (SWITCHER_TOGGLE_BUTTON),
-		    	  GTK_BIN (SWITCHER_TOGGLE_BUTTON)->child);
+    gtk_container_remove (GTK_CONTAINER (switcher->priv->toggle_button),
+		    	  GTK_BIN (switcher->priv->toggle_button)->child);
 
-    gtk_container_add (GTK_CONTAINER (SWITCHER_TOGGLE_BUTTON),
+    gtk_container_add (GTK_CONTAINER (switcher->priv->toggle_button),
 	               GTK_WIDGET (switcher->priv->icon));
     
     g_object_unref (G_OBJECT (switcher->priv->icon)); 
@@ -1266,21 +1361,76 @@
 hd_switcher_menu_show_menu_cb (HDWM *hdwm, HDSwitcherMenu *switcher)
 {
   gtk_toggle_button_set_active
-    (GTK_TOGGLE_BUTTON (SWITCHER_TOGGLE_BUTTON), TRUE);
+    (GTK_TOGGLE_BUTTON (switcher->priv->toggle_button), TRUE);
 
-  g_signal_emit_by_name (SWITCHER_TOGGLE_BUTTON, "toggled");
+  g_signal_emit_by_name (switcher->priv->toggle_button, "toggled");
 }
 
+static gboolean
+hd_switcher_menu_auto_attach (HDSwitcherMenu *switcher)
+{
+  hd_switcher_menu_attach_button (switcher);
+
+  return FALSE;
+}	
+
 static void 
+hd_switcher_menu_dettach_button (HDSwitcherMenu *switcher)
+{
+  if (SWITCHER_TOGGLE_BUTTON != NULL)
+  {
+    gtk_widget_reparent (switcher->priv->toggle_button, switcher->priv->window_dialog);	    
+    gtk_widget_show (switcher->priv->toggle_button);
+    
+    gtk_widget_show (GTK_WIDGET (switcher->priv->window_dialog));
+
+    SWITCHER_TOGGLE_BUTTON = NULL;
+
+    g_timeout_add (SWITCHER_DETTACHED_TIMEOUT,
+		   (GSourceFunc)hd_switcher_menu_auto_attach,
+		   (gpointer)switcher);
+  }
+}
+
+static void 
+hd_switcher_menu_attach_button (HDSwitcherMenu *switcher)
+{
+  if (SWITCHER_TOGGLE_BUTTON == NULL)
+  {
+    gtk_widget_reparent (switcher->priv->toggle_button, GTK_WIDGET (switcher));
+    gtk_widget_show (switcher->priv->toggle_button);
+    
+    gtk_widget_hide (switcher->priv->window_dialog); 	
+  }
+}	
+
+static void 
 hd_switcher_menu_fullscreen_cb (HDWM *hdwm, gboolean fullscreen, HDSwitcherMenu *switcher)
 {
   switcher->priv->fullscreen = fullscreen;
+
+  GList *children =
+    hildon_desktop_popup_menu_get_children (switcher->priv->menu_notifications);   	  
+
+  hd_switcher_create_external_window (switcher);
+  
+  if (children)  
+  {	  
+    if (fullscreen && GTK_BIN (switcher->priv->toggle_button)->child != switcher->priv->icon)
+      hd_switcher_menu_dettach_button (switcher);
+    else
+      hd_switcher_menu_attach_button (switcher);
+
+    g_list_free (children);    
+  }
+  
+  if (!fullscreen)
+    hd_switcher_menu_attach_button (switcher);	   
 }	
 
 static void 
 hd_switcher_menu_long_press_cb (HDWM *hdwm, HDSwitcherMenu *switcher)
 {
-  g_debug ("Heeeeeeeereeee");	
   if (switcher->priv->is_open)
   {
     hildon_desktop_popup_menu_activate_item 


More information about the maemo-commits mailing list