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

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Thu Sep 20 17:04:42 EEST 2007
Author: lucasr
Date: 2007-09-20 17:04:40 +0300 (Thu, 20 Sep 2007)
New Revision: 13951

Modified:
   projects/haf/trunk/hildon-desktop/ChangeLog
   projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.c
   projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.h
   projects/haf/trunk/hildon-desktop/src/hd-applications-menu.c
   projects/haf/trunk/hildon-desktop/src/hd-switcher-menu.c
Log:
2007-09-20  Lucas Rocha  <lucas.rocha at nokia.com>

	* src/hd-applications-menu.c (hd_applications_menu_activate_category):
	use new method for replacing items in popup menu.
	* src/hd-switcher-menu.c
	(hd_switcher_menu_create_clear_notifications_button,
	hd_switcher_menu_add_clear_notifications_button,
	hd_switcher_menu_get_icon_from_theme,
	hd_switcher_menu_add_notification_groups,
	hd_switcher_menu_create_notifications_menu): refactored the whole
	notification pane creation to use the new method for replacing
	items in popup menu.
	* libhildondesktop/hildon-desktop-popup-menu.c
	(hildon_desktop_popup_menu_add_items,
	hildon_desktop_popup_menu_remove_all,
	hildon_desktop_popup_menu_parent_size,
	hildon_desktop_popup_menu_replace_items): new method for replacing
	items in popup menu. Make sure the parent is resized before moving
	it to another position. Fixes: NB#65712.


Modified: projects/haf/trunk/hildon-desktop/ChangeLog
===================================================================
--- projects/haf/trunk/hildon-desktop/ChangeLog	2007-09-20 14:00:51 UTC (rev 13950)
+++ projects/haf/trunk/hildon-desktop/ChangeLog	2007-09-20 14:04:40 UTC (rev 13951)
@@ -1,3 +1,23 @@
+2007-09-20  Lucas Rocha  <lucas.rocha at nokia.com>
+
+	* src/hd-applications-menu.c (hd_applications_menu_activate_category):
+	use new method for replacing items in popup menu.
+	* src/hd-switcher-menu.c
+	(hd_switcher_menu_create_clear_notifications_button,
+	hd_switcher_menu_add_clear_notifications_button,
+	hd_switcher_menu_get_icon_from_theme,
+	hd_switcher_menu_add_notification_groups,
+	hd_switcher_menu_create_notifications_menu): refactored the whole
+	notification pane creation to use the new method for replacing
+	items in popup menu.
+	* libhildondesktop/hildon-desktop-popup-menu.c
+	(hildon_desktop_popup_menu_add_items,
+	hildon_desktop_popup_menu_remove_all,
+	hildon_desktop_popup_menu_parent_size,
+	hildon_desktop_popup_menu_replace_items): new method for replacing
+	items in popup menu. Make sure the parent is resized before moving
+	it to another position. Fixes: NB#65712.
+
 2007-09-20 Johan Bilien  <johan.bilien at nokia.com>
 
 	* src/hd-app-menu-settings-dialog.c: check for duplicate names

Modified: projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.c
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.c	2007-09-20 14:00:51 UTC (rev 13950)
+++ projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.c	2007-09-20 14:04:40 UTC (rev 13951)
@@ -865,21 +865,6 @@
     }
   }
 
-  if (show_scroll_controls)
-  {
-    hildon_desktop_popup_menu_show_controls (menu);	  
-    gtk_widget_set_size_request 
-       (menu->priv->viewport, -1, max_height - menu->priv->item_height - 9);
-  }
-  else
-  {
-    hildon_desktop_popup_menu_hide_controls (menu);
-    gtk_widget_set_size_request
-      (menu->priv->viewport, -1, d_height);
-  }
-
-  gtk_widget_queue_resize (menu->priv->viewport);
- 
   if (menu->priv->resize_parent && GTK_IS_WINDOW (menu->priv->parent))
   {
     gint border_width;
@@ -894,22 +879,37 @@
 				 max_height : 
 				 d_height + (2 * border_width));
 
-    if (GTK_WIDGET_MAPPED (menu->priv->parent))
-    {	    
-      g_signal_emit_by_name (menu, "popup-menu-resize");
-	    
-      gtk_widget_queue_resize (GTK_WIDGET (menu));    
-      gtk_widget_queue_resize (menu->priv->parent);
-    }
-    
     if (GTK_WIDGET_REALIZED (menu->priv->parent))
       gdk_window_resize (menu->priv->parent->window,
 		         parent_req.width,
 			 show_scroll_controls ? 
 			 max_height : 
 	                 d_height + (2 * border_width));
+
+    if (GTK_WIDGET_MAPPED (menu->priv->parent))
+    {
+      g_signal_emit_by_name (menu, "popup-menu-resize");
+
+      gtk_widget_queue_resize (GTK_WIDGET (menu)); 
+      gtk_widget_queue_resize (menu->priv->parent);
+    }
   }
 
+  if (show_scroll_controls)
+  {
+    hildon_desktop_popup_menu_show_controls (menu);	  
+    gtk_widget_set_size_request 
+       (menu->priv->viewport, -1, max_height - menu->priv->item_height - 9);
+  }
+  else
+  {
+    hildon_desktop_popup_menu_hide_controls (menu);
+    gtk_widget_set_size_request
+      (menu->priv->viewport, -1, d_height);
+  }
+
+  gtk_widget_queue_resize (menu->priv->viewport);
+ 
   g_list_free (children);
 }	
 
@@ -986,6 +986,17 @@
   menu->priv->n_items++;
 }
 
+static void
+hildon_desktop_popup_menu_real_remove_item (HildonDesktopPopupMenu *menu, GtkMenuItem *item)
+{
+  if (menu->priv->selected_item == item)
+    hildon_desktop_popup_menu_deselect_item (menu, item);
+
+  gtk_container_remove (GTK_CONTAINER (menu->priv->box_items), GTK_WIDGET (item));
+ 
+  menu->priv->n_items--;
+}
+
 void
 hildon_desktop_popup_menu_add_item (HildonDesktopPopupMenu *menu, GtkMenuItem *item)
 {
@@ -1011,24 +1022,33 @@
 }
 
 void
-hildon_desktop_popup_menu_add_items (HildonDesktopPopupMenu *menu, GList *items)
+hildon_desktop_popup_menu_replace_items (HildonDesktopPopupMenu *menu, GList *items)
 {
   GtkRequisition req;
-  GList *l;
+  GList *children, *l;
   gint item_width = -1;
-  
-  g_return_if_fail (HILDON_DESKTOP_IS_POPUP_MENU (menu));
 
+  g_assert (HILDON_DESKTOP_IS_POPUP_MENU (menu));
+
   if (GTK_IS_WINDOW (menu->priv->parent))
   {
       gtk_widget_size_request (menu->priv->parent, &req);
       item_width = req.width;
   }
 
+  children = hildon_desktop_popup_menu_get_children (menu);
+ 
+  for (l = children; l != NULL; l = l->next)
+  {
+    GtkWidget *item = GTK_WIDGET (l->data);
+    
+    hildon_desktop_popup_menu_real_remove_item (menu, GTK_MENU_ITEM (item));
+  }
+ 
   for (l = items; l != NULL; l = l->next)
   {
     GtkWidget *item = GTK_WIDGET (l->data);
-	  
+
     if (GTK_IS_MENU_ITEM (item))
       hildon_desktop_popup_menu_real_add_item (menu, 
 		                               GTK_MENU_ITEM (item), 
@@ -1040,20 +1060,8 @@
 			       menu->priv->item_height + 2);
 
   hildon_desktop_popup_menu_parent_size (menu);
-
 }
 
-static void
-hildon_desktop_popup_menu_real_remove_item (HildonDesktopPopupMenu *menu, GtkMenuItem *item)
-{
-  if (menu->priv->selected_item == item)
-    hildon_desktop_popup_menu_deselect_item (menu, item);
-
-  gtk_container_remove (GTK_CONTAINER (menu->priv->box_items), GTK_WIDGET (item));
- 
-  menu->priv->n_items--;
-}
-
 void 
 hildon_desktop_popup_menu_remove_item (HildonDesktopPopupMenu *menu, GtkMenuItem *item)
 {
@@ -1066,32 +1074,13 @@
 
 }
 
-void 
-hildon_desktop_popup_menu_remove_all (HildonDesktopPopupMenu *menu)
-{
-  GList *children, *l;
-	
-  g_assert (HILDON_DESKTOP_IS_POPUP_MENU (menu));
-
-  children = hildon_desktop_popup_menu_get_children (menu);
-  
-  for (l = children; l != NULL; l = l->next)
-  {
-    GtkWidget *item = GTK_WIDGET (l->data);
-    
-    hildon_desktop_popup_menu_real_remove_item (menu, GTK_MENU_ITEM (item));
-  }
-  
-  hildon_desktop_popup_menu_parent_size (menu);
-}
-
 GList *
 hildon_desktop_popup_menu_get_children (HildonDesktopPopupMenu *menu)
 {
   g_return_val_if_fail (HILDON_DESKTOP_IS_POPUP_MENU (menu), NULL);
-	
+
   GList *list = gtk_container_get_children (GTK_CONTAINER (menu->priv->box_items));
-	
+
   return list;
 }
 

Modified: projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.h
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.h	2007-09-20 14:00:51 UTC (rev 13950)
+++ projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.h	2007-09-20 14:04:40 UTC (rev 13951)
@@ -62,16 +62,13 @@
 hildon_desktop_popup_menu_add_item (HildonDesktopPopupMenu *menu,
 				    GtkMenuItem            *item);
 
-void 
-hildon_desktop_popup_menu_add_items (HildonDesktopPopupMenu *menu,
-				     GList                  *items);
-
 void
 hildon_desktop_popup_menu_remove_item (HildonDesktopPopupMenu *menu,
 				       GtkMenuItem            *item);
 
 void
-hildon_desktop_popup_menu_remove_all (HildonDesktopPopupMenu *menu);
+hildon_desktop_popup_menu_replace_items (HildonDesktopPopupMenu *menu, 
+		                         GList *items);
 
 GList *
 hildon_desktop_popup_menu_get_children (HildonDesktopPopupMenu *menu);

Modified: projects/haf/trunk/hildon-desktop/src/hd-applications-menu.c
===================================================================
--- projects/haf/trunk/hildon-desktop/src/hd-applications-menu.c	2007-09-20 14:00:51 UTC (rev 13950)
+++ projects/haf/trunk/hildon-desktop/src/hd-applications-menu.c	2007-09-20 14:04:40 UTC (rev 13951)
@@ -385,15 +385,13 @@
       g_object_ref (child);
     }
 
-    hildon_desktop_popup_menu_remove_all (button->priv->menu_applications);
-    
     g_list_free (sub_items);
 
     sub_items = (GList *) g_object_get_data (G_OBJECT (item),
           	                             CATEGORY_SUB_ITEMS);
 
-    hildon_desktop_popup_menu_add_items (button->priv->menu_applications, 
-		    			 sub_items);
+    hildon_desktop_popup_menu_replace_items (button->priv->menu_applications, 
+		    		  	     sub_items);
   }
   else
   {

Modified: projects/haf/trunk/hildon-desktop/src/hd-switcher-menu.c
===================================================================
--- projects/haf/trunk/hildon-desktop/src/hd-switcher-menu.c	2007-09-20 14:00:51 UTC (rev 13950)
+++ projects/haf/trunk/hildon-desktop/src/hd-switcher-menu.c	2007-09-20 14:04:40 UTC (rev 13951)
@@ -198,7 +198,7 @@
 static void hd_switcher_menu_scroll_to (HildonDesktopPopupWindow *window,
 					HDSwitcherMenu *switcher);
 
-static void hd_switcher_menu_add_clear_notifications_button (HDSwitcherMenu *switcher);
+static void hd_switcher_menu_create_clear_notifications_button (HDSwitcherMenu *switcher);
 
 static void hd_switcher_menu_refresh_application_items (HDSwitcherMenu *switcher);
 static void hd_switcher_menu_refresh_notification_items (HDSwitcherMenu *switcher);
@@ -314,29 +314,32 @@
 }
 
 static GdkPixbuf *
-hd_switcher_menu_get_icon_from_theme (HDSwitcherMenu *switcher,
-                                     const gchar     *icon_name,
-                                     gint             size)
+hd_switcher_menu_get_icon_from_theme (const gchar     *icon_name,
+                                      gint             size)
 {
+  static GtkIconTheme *icon_theme = NULL;
+	
   GError *error;
   GdkPixbuf *retval;
 
+  if (!icon_theme)
+    icon_theme = gtk_icon_theme_get_default ();
+
   if (!icon_name)
     return NULL;
 
-  switcher->priv->icon_theme = gtk_icon_theme_get_default ();
+  g_return_val_if_fail (icon_theme, NULL);
 
-  g_return_val_if_fail (switcher->priv->icon_theme, NULL);
-
   if (!icon_name || icon_name[0] == '\0')
     return NULL;
 
   error = NULL;
-  retval = gtk_icon_theme_load_icon (switcher->priv->icon_theme,
+  retval = gtk_icon_theme_load_icon (icon_theme,
                                      icon_name,
                                      size == -1 ? AS_ICON_SIZE : size,
                                      0,
                                      &error);
+
   if (error)
   {
     g_warning ("Could not load icon '%s': %s\n",
@@ -687,10 +690,10 @@
 					 gpointer user_data)
 {
   HDSwitcherMenuNotificationGroup *ngroup;
-  HDSwitcherMenu *switcher;
+  GList **items;
   
   ngroup = (HDSwitcherMenuNotificationGroup *) value;
-  switcher = (HDSwitcherMenu *) user_data;	
+  items = (GList **) user_data;	
  
   if (ngroup->is_active)
   {
@@ -701,29 +704,26 @@
     summary = g_strdup_printf (_(ngroup->label), 
 		               g_list_length (ngroup->notifications));
     
-    icon = hd_switcher_menu_get_icon_from_theme (switcher, ngroup->icon, -1);
-    
-    hildon_desktop_popup_menu_add_item
-      (switcher->priv->menu_notifications,
-      GTK_MENU_ITEM (hd_switcher_menu_create_separator (FALSE)));
+    icon = hd_switcher_menu_get_icon_from_theme (ngroup->icon, -1);
 
+    *items = g_list_append (*items, hd_switcher_menu_create_separator (FALSE));
+
     menu_item = hd_switcher_menu_item_new_from_notification_group
       (ngroup->notifications, icon, summary, ngroup->dbus_callback, TRUE);
 
     gtk_widget_set_name (GTK_WIDGET (menu_item), 
       		         HD_SWITCHER_MENU_NOT_MENU_ITEM_NAME);
 
-    hildon_desktop_popup_menu_add_item
-     (switcher->priv->menu_notifications, GTK_MENU_ITEM (menu_item));
+    *items = g_list_append (*items, menu_item);
   }
 }
 
 static void
-hd_switcher_menu_add_notification_groups (HDSwitcherMenu *switcher)
+hd_switcher_menu_add_notification_groups (HDSwitcherMenu *switcher, GList **items)
 {
   g_hash_table_foreach (switcher->priv->notification_groups, 
 		        hd_switcher_menu_add_notification_group,
-			switcher);
+			items);
 }
 
 static void
@@ -926,7 +926,7 @@
   /*gtk_widget_set_size_request (button, -1, AS_MENU_BUTTON_HEIGHT);*/
   gtk_widget_set_size_request (GTK_WIDGET (switcher), -1, AS_MENU_BUTTON_HEIGHT);
 
-  pixbuf = hd_switcher_menu_get_icon_from_theme (switcher, AS_MENU_BUTTON_ICON, -1);
+  pixbuf = hd_switcher_menu_get_icon_from_theme (AS_MENU_BUTTON_ICON, -1);
   switcher->priv->icon = gtk_image_new_from_pixbuf (pixbuf);
   gtk_container_add (GTK_CONTAINER (button), switcher->priv->icon);
   gtk_widget_show (switcher->priv->icon);
@@ -1302,7 +1302,7 @@
 }
 	
 static void 
-hd_switcher_menu_add_clear_notifications_button (HDSwitcherMenu *switcher)
+hd_switcher_menu_create_clear_notifications_button (HDSwitcherMenu *switcher)
 {
   GtkWidget *hbox, *image, *label;
   GdkPixbuf *icon;
@@ -1311,9 +1311,7 @@
     
   hbox = gtk_hbox_new (FALSE, 0);
 
-  icon = hd_switcher_menu_get_icon_from_theme (switcher,
-        	  			         AS_CLEAR_ITEM_ICON, 
-      					 -1);
+  icon = hd_switcher_menu_get_icon_from_theme (AS_CLEAR_ITEM_ICON, -1);
   
   image = gtk_image_new_from_pixbuf (icon);
   
@@ -1343,9 +1341,8 @@
                           G_CALLBACK (hd_switcher_menu_clear_item_activated),
                           switcher);
 
-  hildon_desktop_popup_menu_add_item
-   (switcher->priv->menu_notifications, 
-    GTK_MENU_ITEM (switcher->priv->clear_events_menu_item));
+  gtk_widget_set_name (GTK_WIDGET (switcher->priv->clear_events_menu_item), 
+		       HD_SWITCHER_MENU_NOT_MENU_ITEM_NAME);
 }
 
 static void
@@ -1687,15 +1684,13 @@
 {
   GtkWidget *menu_item = NULL, *first_item = NULL;
   GtkTreeModel *nm = GTK_TREE_MODEL (switcher->nm);
-  GList *children = NULL, *l;
+  GList *children = NULL;
   GtkTreeIter  iter;	
 
-  children =
-    hildon_desktop_popup_menu_get_children (switcher->priv->menu_notifications);
-
   if (gtk_tree_model_iter_n_children (nm, NULL) >= AS_ITEMS_LIMIT)
   {
-    hd_switcher_menu_add_clear_notifications_button (switcher);
+    hd_switcher_menu_create_clear_notifications_button (switcher);
+    children = g_list_append (children, switcher->priv->clear_events_menu_item);
     first_item = switcher->priv->clear_events_menu_item;
   }
   else
@@ -1707,14 +1702,6 @@
     }
   }
   
-  for (l = children; l != NULL; l = g_list_next (l))
-  {
-    if (l->data != switcher->priv->clear_events_menu_item)
-      gtk_widget_destroy (GTK_WIDGET (l->data));
-  }
-
-  g_list_free (children);
-
   if (gtk_tree_model_get_iter_first (nm, &iter))
   {
     GdkPixbuf *icon;
@@ -1755,7 +1742,7 @@
       }
       while (gtk_tree_model_iter_next (nm, &iter));
 
-      hd_switcher_menu_add_notification_groups (switcher);
+      hd_switcher_menu_add_notification_groups (switcher, &children);
 
       gtk_tree_model_get_iter_first (nm, &iter);
     }
@@ -1785,9 +1772,8 @@
       if (ngroup == NULL || !ngroup->is_active)
       {
         if (first_item)
-          hildon_desktop_popup_menu_add_item
-            (switcher->priv->menu_notifications,
-            GTK_MENU_ITEM (hd_switcher_menu_create_separator (FALSE)));
+	  children = g_list_append (children, 
+			            hd_switcher_menu_create_separator (FALSE));
 
         menu_item =
           hd_switcher_menu_item_new_from_notification
@@ -1804,21 +1790,19 @@
           		        G_CALLBACK (hd_switcher_menu_item_activated),
           		        switcher);
 
-        hildon_desktop_popup_menu_add_item
-         (switcher->priv->menu_notifications, GTK_MENU_ITEM (menu_item));
+	children = g_list_append (children, menu_item);
 
         if (!ack && !icon_is_set)
         {
 	  switcher->priv->blinking_notification = id;
 
           hd_switcher_menu_replace_blinking_icon (switcher, 
-			  			  hd_switcher_menu_get_icon_from_theme (switcher, 
-							  				icon_name,
+			  			  hd_switcher_menu_get_icon_from_theme (icon_name,
 											AS_ICON_SIZE));
 
           icon_is_set = TRUE;
 	}
-	  
+
         if (!first_item)
 	  first_item = menu_item;
       }
@@ -1829,6 +1813,10 @@
     }
     while (gtk_tree_model_iter_next (nm, &iter));
 
+    hildon_desktop_popup_menu_replace_items (switcher->priv->menu_notifications, children);
+  
+    g_list_free (children);
+    
     hd_switcher_menu_reset_notification_groups (switcher);
     
     hd_switcher_menu_scroll_to (NULL, switcher);
@@ -2042,7 +2030,7 @@
   {
     if (HD_IS_SWITCHER_MENU_ITEM (l->data))
     {
-      HDWMEntryInfo *info =	    
+      HDWMEntryInfo *info =
         hd_switcher_menu_item_get_entry_info (HD_SWITCHER_MENU_ITEM (l->data));
 
       hd_switcher_menu_item_set_entry_info (HD_SWITCHER_MENU_ITEM (l->data), info);
@@ -2057,7 +2045,7 @@
       {
         hd_switcher_menu_item_set_blinking (HD_SWITCHER_MENU_ITEM (l->data), FALSE);
       }
-    }	    
+    }
   } 
 }
 


More information about the maemo-commits mailing list