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

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Mon May 14 18:54:28 EEST 2007
Author: moimart
Date: 2007-05-14 18:54:25 +0300 (Mon, 14 May 2007)
New Revision: 11642

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/libhildondesktop/hildon-desktop-toggle-button.h
   projects/haf/trunk/hildon-desktop/src/hd-switcher-menu.c
Log:

	* src/hd-switcher-menu.c:
        - Fixed showing of menu button when notifications are added and there
        are no applications and the menu is closed afterwards.
        * libhildondesktop/hildon-desktop-popup-menu.[ch]:
        - Implemented basic scrolling support. To be improved, though.
        * libhildondesktop/hildon-desktop-toggle-button.h:
        - Fixed #define
	* ChangeLog updated.



Modified: projects/haf/trunk/hildon-desktop/ChangeLog
===================================================================
--- projects/haf/trunk/hildon-desktop/ChangeLog	2007-05-14 15:13:01 UTC (rev 11641)
+++ projects/haf/trunk/hildon-desktop/ChangeLog	2007-05-14 15:54:25 UTC (rev 11642)
@@ -1,3 +1,13 @@
+2007-05-13  Moises Martinez  <moises.martinez at nokia.com>
+
+	* src/hd-switcher-menu.c:
+	- Fixed showing of menu button when notifications are added and there
+	are no applications and the menu is closed afterwards.
+	* libhildondesktop/hildon-desktop-popup-menu.[ch]:
+	- Implemented basic scrolling support. To be improved, though.
+	* libhildondesktop/hildon-desktop-toggle-button.h:
+	- Fixed #define
+
 2007-05-11  Johan Bilien  <johan.bilien at nokia.com>
 
 	* configure.ac: 0.0.13

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-14 15:13:01 UTC (rev 11641)
+++ projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.c	2007-05-14 15:54:25 UTC (rev 11642)
@@ -198,8 +198,8 @@
   
   menu->priv->box_buttons = gtk_hbox_new (TRUE,0);
 
-  menu->priv->scroll_down = gtk_button_new_with_label ("down");
-  menu->priv->scroll_up   = gtk_button_new_with_label ("up");
+  menu->priv->scroll_down = gtk_button_new ();
+  menu->priv->scroll_up   = gtk_button_new ();
 
 
   g_signal_connect (menu->priv->scroll_down,
@@ -331,7 +331,7 @@
 hildon_desktop_popup_menu_scroll_cb (GtkWidget *widget, HildonDesktopPopupMenu *menu)
 {
   gdouble position;
-  gint delta = menu->priv->item_height;
+  gint delta = menu->priv->item_height + 16; /*FIXME: Check items aside the menu item */
   GtkAdjustment *adj = 
     gtk_viewport_get_vadjustment 
       (GTK_VIEWPORT (menu->priv->viewport));
@@ -356,7 +356,8 @@
     else
       gtk_adjustment_set_value (adj, upper_hack);	    
 
-    g_debug ("min: %lf max: %lf current: %lf upper_hack: %lf", adj->lower,adj->upper, adj->value, upper_hack);
+    /* NOTE: Don't remove this
+     * g_debug ("min: %lf max: %lf current: %lf upper_hack: %lf", adj->lower,adj->upper, adj->value, upper_hack);*/
  }
 }	
 
@@ -395,6 +396,35 @@
   return TRUE;
 }
 
+static void 
+hildon_desktop_menu_check_scroll_item (HildonDesktopPopupMenu *menu,
+				       GtkScrollType type)
+{
+  GtkAdjustment *adj;	
+  gint visible_y;
+  GtkWidget *view = GTK_WIDGET (menu->priv->selected_item);
+  gdouble upper_hack; 
+  GtkRequisition req;
+
+  GtkWidget *parent = gtk_widget_get_parent (GTK_WIDGET (menu));
+
+  gtk_widget_size_request (parent, &req);
+
+  adj = gtk_viewport_get_vadjustment (GTK_VIEWPORT (menu->priv->viewport));
+  
+  if (parent && GTK_IS_WINDOW (parent)) 
+    upper_hack = adj->upper - (req.height - menu->priv->item_height);
+  else
+    upper_hack = adj->upper;	  
+
+  visible_y = view->allocation.y + menu->priv->item_height;
+ 
+  if (visible_y < (req.height - menu->priv->item_height)) 
+    hildon_desktop_popup_menu_scroll_cb (menu->priv->scroll_up, menu);
+  else
+    hildon_desktop_popup_menu_scroll_cb (menu->priv->scroll_down, menu);
+}
+
 static gboolean 
 hildon_desktop_popup_menu_key_press_event (GtkWidget   *widget,
 					   GdkEventKey *event)
@@ -426,6 +456,9 @@
         gtk_item_deselect (GTK_ITEM (l->data));
         gtk_item_select   (GTK_ITEM (item->data));
 	menu->priv->selected_item = GTK_MENU_ITEM (item->data);
+
+	hildon_desktop_menu_check_scroll_item (menu, GTK_SCROLL_STEP_UP);
+	
 	break;
       }
 
@@ -446,6 +479,9 @@
         gtk_item_deselect (GTK_ITEM (l->data));
         gtk_item_select   (GTK_ITEM (item->data));
 	menu->priv->selected_item = GTK_MENU_ITEM (item->data);
+
+	hildon_desktop_menu_check_scroll_item (menu, GTK_SCROLL_STEP_DOWN);
+	
 	break;
       }
 
@@ -727,3 +763,16 @@
 
   }
 }
+
+const GtkWidget *
+hildon_desktop_popup_menu_get_scroll_button_up (HildonDesktopPopupMenu *menu)
+{
+  return menu->priv->scroll_up;
+}	
+
+const GtkWidget *
+hildon_desktop_popup_menu_get_scroll_button_down (HildonDesktopPopupMenu *menu)
+{
+  return menu->priv->scroll_down;
+}	
+

Modified: projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.h
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.h	2007-05-14 15:13:01 UTC (rev 11641)
+++ projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.h	2007-05-14 15:54:25 UTC (rev 11642)
@@ -81,6 +81,12 @@
 void   
 hildon_desktop_popup_menu_scroll_to_selected (HildonDesktopPopupMenu *menu);
 
+const GtkWidget *
+hildon_desktop_popup_menu_get_scroll_button_up (HildonDesktopPopupMenu *menu);
+
+const GtkWidget *
+hildon_desktop_popup_menu_get_scroll_button_down (HildonDesktopPopupMenu *menu);
+
 G_BEGIN_DECLS
 
 #endif/*__HILDON_DESKTOP_POPUP_MENU_H__*/

Modified: projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-toggle-button.h
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-toggle-button.h	2007-05-14 15:13:01 UTC (rev 11641)
+++ projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-toggle-button.h	2007-05-14 15:54:25 UTC (rev 11642)
@@ -36,8 +36,8 @@
 #define HILDON_DESKTOP_TYPE_TOGGLE_BUTTON            (hildon_desktop_toggle_button_get_type ())
 #define HILDON_DESKTOP_TOGGLE_BUTTON(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), HILDON_DESKTOP_TYPE_TOGGLE_BUTTON, HildonDesktopToggleButton))
 #define HILDON_DESKTOP_TOGGLE_BUTTON_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  HILDON_DESKTOP_TYPE_TOGGLE_BUTTON, HildonDesktopToggleButtonClass))
-#define HD_IS_DESKTOP(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), HILDON_DESKTOP_TYPE_TOGGLE_BUTTON))
-#define HD_IS_DESKTOP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  HILDON_DESKTOP_TYPE_TOGGLE_BUTTON))
+#define HILDON_DESKTOP_IS_TOGGLE_BUTTON(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), HILDON_DESKTOP_TYPE_TOGGLE_BUTTON))
+#define HILDON_DESKTOP_IS_TOGGLE_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  HILDON_DESKTOP_TYPE_TOGGLE_BUTTON))
 #define HILDON_DESKTOP_TOGGLE_BUTTON_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  HILDON_DESKTOP_TYPE_TOGGLE_BUTTON, HildonDesktopToggleButtonClass))
 
 struct _HildonDesktopToggleButton

Modified: projects/haf/trunk/hildon-desktop/src/hd-switcher-menu.c
===================================================================
--- projects/haf/trunk/hildon-desktop/src/hd-switcher-menu.c	2007-05-14 15:13:01 UTC (rev 11641)
+++ projects/haf/trunk/hildon-desktop/src/hd-switcher-menu.c	2007-05-14 15:54:25 UTC (rev 11642)
@@ -58,6 +58,8 @@
 
 #define AS_MENU_BUTTON_NAME "hildon-navigator-small-button4"
 
+#define AS_MENU_BUTTON_HIGHLIGHTED "qgn_some_theme_to_be_defined"
+
 /* Hardcoded pixel perfecting values */
 #define AS_BUTTON_BORDER_WIDTH  0
 #define AS_MENU_BORDER_WIDTH    20
@@ -71,6 +73,15 @@
 #define AS_INTERNAL_PADDING     10
 #define AS_SEPARATOR_HEIGHT     10
 
+#define SWITCHER_HIGHLIGHTING_FREQ 1000
+#define SWITCHER_HIGHLIGHTED_NAME ""
+
+#define SWITCHER_BUTTON_SIZE 32
+#define SWITCHER_BUTTON_UP "qgn_list_tasknavigator_appswitcher"
+#define SWITCHER_BUTTON_DOWN "qgn_list_tasknavigator_appswitcher"
+
+#define SWITCHER_BUTTON_NAME ""
+
 #define SWITCHER_TOGGLE_BUTTON GTK_BIN(switcher)->child
 
 enum 
@@ -99,6 +110,8 @@
   gboolean 		    is_open;
   gboolean 		    fullscreen;
 
+  gint			    timeout;
+
   GtkIconTheme		   *icon_theme;
   GtkWidget		   *icon;
 
@@ -167,9 +180,11 @@
   switcher->priv->active_menu_item       =
   switcher->priv->clear_events_menu_item = NULL;
 
-  switcher->priv->is_open    = 
-  switcher->priv->fullscreen = FALSE;
+  switcher->priv->is_open     =  
+  switcher->priv->fullscreen  = FALSE;
 
+  switcher->priv->timeout = 0;
+  
   switcher->priv->last_iter_added = NULL;
 
   switcher->priv->last_urgent_info = NULL;
@@ -180,6 +195,8 @@
     HILDON_DESKTOP_NOTIFICATION_MANAGER 
      (hildon_desktop_notification_manager_get_singleton ());
 
+  switcher->priv->icon_theme = gtk_icon_theme_get_default ();
+
   g_object_ref (switcher->hdwm);
 }
 
@@ -211,8 +228,7 @@
   if (!icon_name)
     return NULL;
 
-  if (!switcher->priv->icon_theme)
-    switcher->priv->icon_theme = gtk_icon_theme_get_default ();
+  switcher->priv->icon_theme = gtk_icon_theme_get_default ();
 
   g_return_val_if_fail (switcher->priv->icon_theme, NULL);
 
@@ -359,6 +375,8 @@
 
   gtk_toggle_button_set_active 
     (GTK_TOGGLE_BUTTON (SWITCHER_TOGGLE_BUTTON), FALSE);
+
+  g_list_free (children);
 }	
 
 static GObject *
@@ -370,8 +388,7 @@
   HDSwitcherMenu *switcher;
   GtkWidget *button;
   HDWM *hdwm = hd_wm_get_singleton ();
-  GdkPixbuf *pixbuf;
- 
+  GdkPixbuf *pixbuf, *icon_up = NULL, *icon_down = NULL;
 
   object = G_OBJECT_CLASS (hd_switcher_menu_parent_class)->constructor (gtype,
            	                                                        n_params,
@@ -425,6 +442,54 @@
   gtk_widget_show (GTK_WIDGET (switcher->priv->menu_applications));
   gtk_widget_show (GTK_WIDGET (switcher->priv->menu_notifications));
 
+  icon_up = 
+    hd_switcher_menu_get_icon_from_theme (switcher,
+		                          SWITCHER_BUTTON_UP,
+		    			  -1);
+
+  icon_down = 
+    hd_switcher_menu_get_icon_from_theme (switcher,
+		    			  SWITCHER_BUTTON_DOWN,
+		    			  -1);
+	  
+  if (icon_up && icon_down)
+  {
+    const GtkWidget *button_up, *button_down;
+    GtkWidget *image_up, *image_down;
+
+    button_up = 
+      hildon_desktop_popup_menu_get_scroll_button_up (switcher->priv->menu_applications);
+    button_down =
+      hildon_desktop_popup_menu_get_scroll_button_down (switcher->priv->menu_applications);
+
+    gtk_widget_set_name (GTK_WIDGET (button_up), SWITCHER_BUTTON_NAME);
+    gtk_widget_set_name (GTK_WIDGET (button_down), SWITCHER_BUTTON_NAME);
+    
+    image_up   = gtk_image_new_from_pixbuf (icon_up);
+    image_down = gtk_image_new_from_pixbuf (icon_down);
+    
+    gtk_container_add (GTK_CONTAINER (button_up),   image_up);
+    gtk_container_add (GTK_CONTAINER (button_down), image_down);
+    gtk_widget_show (image_up);
+    gtk_widget_show (image_down);
+    
+    button_up = 
+      hildon_desktop_popup_menu_get_scroll_button_up (switcher->priv->menu_notifications);
+    button_down =
+      hildon_desktop_popup_menu_get_scroll_button_down (switcher->priv->menu_notifications);
+
+    gtk_widget_set_name (GTK_WIDGET (button_up), SWITCHER_BUTTON_NAME);
+    gtk_widget_set_name (GTK_WIDGET (button_down), SWITCHER_BUTTON_NAME);
+
+    image_up   = gtk_image_new_from_pixbuf (icon_up);
+    image_down = gtk_image_new_from_pixbuf (icon_down);
+
+    gtk_container_add (GTK_CONTAINER (button_up),   image_up);
+    gtk_container_add (GTK_CONTAINER (button_down), image_down);
+    gtk_widget_show (image_up);
+    gtk_widget_show (image_down);
+  } 
+
   g_signal_connect (switcher->priv->popup_window,
 		    "key-press-event",
 		    G_CALLBACK (hd_switcher_menu_popup_window_keypress_cb),
@@ -553,6 +618,8 @@
   g_object_unref (switcher->hdwm);
 
   gtk_widget_destroy (GTK_WIDGET (switcher->priv->popup_window));
+
+  g_object_unref (switcher->priv->icon_theme);
 	
   G_OBJECT_CLASS (hd_switcher_menu_parent_class)->finalize (object);
 }
@@ -609,24 +676,52 @@
 static void 
 hd_switcher_menu_style_set (GtkWidget *widget, GtkStyle *style, gpointer data)
 {
-	
-  gtk_widget_set_name (widget, AS_MENU_BUTTON_NAME);	
-  gtk_widget_set_name (GTK_BIN (widget)->child, AS_MENU_BUTTON_NAME);
+  static gboolean first_run = FALSE; /* FIXME: WTF????? Do it better. Highlighting the item will call this handler */
+  
+  if (!first_run)
+  {
+    gtk_widget_set_name (widget, AS_MENU_BUTTON_NAME);	
+    gtk_widget_set_name (GTK_BIN (widget)->child, AS_MENU_BUTTON_NAME);
+    first_run = TRUE;
+  }
 }
 
+static void
+hd_switcher_menu_update_highlighting (HDSwitcherMenu *switcher, gboolean state)
+{
+  if (state)
+  {
+    gtk_widget_set_name (GTK_WIDGET (switcher), SWITCHER_HIGHLIGHTED_NAME);
+    gtk_widget_set_name (GTK_BIN (switcher)->child, 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);
+  }	  
+}
+
 static void 
 hd_switcher_menu_check_content (HDSwitcherMenu *switcher)
 {
   GList *children = NULL;
-	
-  if ((hd_wm_get_applications (switcher->hdwm) != NULL) ||
-      (children = hildon_desktop_popup_menu_get_children 
-        (switcher->priv->menu_notifications)) != NULL)
+
+  children = 
+    hildon_desktop_popup_menu_get_children (switcher->priv->menu_notifications);
+  
+  if ((hd_wm_get_applications (switcher->hdwm) != NULL) || children)
   {
      gtk_widget_show (GTK_BIN (SWITCHER_TOGGLE_BUTTON)->child);
+     
+     if (children)
+       hd_switcher_menu_update_highlighting (switcher, TRUE);
+     else
+       hd_switcher_menu_update_highlighting (switcher, FALSE);        
   }
   else
   {	  
+     hd_switcher_menu_update_highlighting (switcher, FALSE);
+	  
      gtk_widget_hide (GTK_BIN (SWITCHER_TOGGLE_BUTTON)->child);	  
 
      if (switcher->priv->is_open)
@@ -805,6 +900,8 @@
   switcher->priv->is_open = TRUE;
 
   hd_switcher_menu_reset_main_icon (switcher);
+
+  hd_switcher_menu_check_content (switcher);
 }	
 
 static void 
@@ -969,7 +1066,7 @@
 }
 
 static GdkPixbuf *
-hd_switcher_get_default_icon_from_entry_info (HDEntryInfo *info)
+hd_switcher_get_default_icon_from_entry_info (HDSwitcherMenu *switcher, HDEntryInfo *info)
 {
   GdkPixbuf *app_pixbuf = hd_entry_info_get_icon (info);
  
@@ -985,9 +1082,7 @@
       g_error_free (error);
       error = NULL;
       
-      GtkIconTheme *icon_theme = gtk_icon_theme_get_default ();
-
-      app_pixbuf = gtk_icon_theme_load_icon (icon_theme,
+      app_pixbuf = gtk_icon_theme_load_icon (switcher->priv->icon_theme,
                                              AS_MENU_DEFAULT_APP_ICON,
                                              AS_ICON_THUMB_SIZE,
                                              GTK_ICON_LOOKUP_NO_SVG,
@@ -1000,8 +1095,6 @@
                    error->message);
         g_error_free (error);
       }
-
-      g_object_unref (icon_theme);
     }
   }
 
@@ -1128,7 +1221,7 @@
       if (make_it_blink)
       {	      
         hd_switcher_menu_replace_blinking_icon 
-  	  (switcher, hd_switcher_get_default_icon_from_entry_info (info));
+  	  (switcher, hd_switcher_get_default_icon_from_entry_info (switcher,info));
 	
 	switcher->priv->last_urgent_info = info;
       }


More information about the maemo-commits mailing list