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

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Wed Aug 29 18:33:06 EEST 2007
Author: lucasr
Date: 2007-08-29 18:33:04 +0300 (Wed, 29 Aug 2007)
New Revision: 13472

Modified:
   projects/haf/trunk/hildon-desktop/ChangeLog
   projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.c
Log:
2007-08-29  Lucas Rocha  <lucas.rocha at nokia.com>

	* libhildondesktop/hildon-desktop-popup-menu.c
	(hildon_desktop_popup_menu_scroll_start,
	hildon_desktop_popup_menu_scroll_stop,
	hildon_desktop_popup_menu_scroll_step,
	hildon_desktop_popup_menu_scroll_cb,
	hildon_desktop_popup_menu_scroll_constructor): scroll continuously on
	button press on scroll buttons. Button click scrolls on step down/up.
	Fixes NB#66827.


Modified: projects/haf/trunk/hildon-desktop/ChangeLog
===================================================================
--- projects/haf/trunk/hildon-desktop/ChangeLog	2007-08-29 14:35:03 UTC (rev 13471)
+++ projects/haf/trunk/hildon-desktop/ChangeLog	2007-08-29 15:33:04 UTC (rev 13472)
@@ -1,5 +1,16 @@
 2007-08-29  Lucas Rocha  <lucas.rocha at nokia.com>
 
+	* libhildondesktop/hildon-desktop-popup-menu.c
+	(hildon_desktop_popup_menu_scroll_start,
+	hildon_desktop_popup_menu_scroll_stop,
+	hildon_desktop_popup_menu_scroll_step,
+	hildon_desktop_popup_menu_scroll_cb,
+	hildon_desktop_popup_menu_scroll_constructor): scroll continuously on
+	button press on scroll buttons. Button click scrolls on step down/up.
+	Fixes NB#66827.
+
+2007-08-29  Lucas Rocha  <lucas.rocha at nokia.com>
+
 	* src/hd-switcher-menu.c (hd_switcher_menu_changed_info_cb): correctly
 	calculate the position of an window in the stack in order to avoid
 	blinking window icons both in switcher are and switcher menu.

Modified: projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.c
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.c	2007-08-29 14:35:03 UTC (rev 13471)
+++ projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.c	2007-08-29 15:33:04 UTC (rev 13472)
@@ -55,6 +55,8 @@
 
 static gint signals[N_SIGNALS];
 
+#define MENU_SCROLL_TIMEOUT 40
+
 struct _HildonDesktopPopupMenuPrivate
 {
   GtkWidget    *parent;
@@ -78,6 +80,9 @@
   guint         toggle_size;
 
   gboolean      rtl;
+
+  gint          scroll_id;
+  gint          scroll_dir;
 };
 
 static GObject *hildon_desktop_popup_menu_constructor (GType gtype,
@@ -103,6 +108,8 @@
 static gboolean hildon_desktop_popup_menu_release_event (GtkWidget *widget, GdkEventButton *event);
 static gboolean hildon_desktop_popup_menu_key_press_event (GtkWidget *widget, GdkEventKey *event);
 static void hildon_desktop_popup_menu_scroll_cb (GtkWidget *widget, HildonDesktopPopupMenu *menu);
+static void hildon_desktop_popup_menu_scroll_start (GtkWidget *widget, HildonDesktopPopupMenu *menu);
+static void hildon_desktop_popup_menu_scroll_stop (GtkWidget *widget, HildonDesktopPopupMenu *menu);
 static void hildon_desktop_popup_menu_adjustment_changed (GtkAdjustment *adj, HildonDesktopPopupMenu *menu);
 
 static void 
@@ -278,11 +285,31 @@
 		    G_CALLBACK (hildon_desktop_popup_menu_scroll_cb),
 		    (gpointer)menu);
 
+  g_signal_connect (menu->priv->scroll_down,
+		    "pressed",
+		    G_CALLBACK (hildon_desktop_popup_menu_scroll_start),
+		    (gpointer)menu);
+
+  g_signal_connect (menu->priv->scroll_down,
+		    "released",
+		    G_CALLBACK (hildon_desktop_popup_menu_scroll_stop),
+		    (gpointer)menu);
+
   g_signal_connect (menu->priv->scroll_up,
                     "clicked",
                     G_CALLBACK (hildon_desktop_popup_menu_scroll_cb),
                     (gpointer)menu);		    
 
+  g_signal_connect (menu->priv->scroll_up,
+		    "pressed",
+		    G_CALLBACK (hildon_desktop_popup_menu_scroll_start),
+		    (gpointer)menu);
+
+  g_signal_connect (menu->priv->scroll_up,
+		    "released",
+		    G_CALLBACK (hildon_desktop_popup_menu_scroll_stop),
+		    (gpointer)menu);
+
   gtk_box_pack_start (GTK_BOX (menu->priv->box_buttons),
 		      menu->priv->scroll_up,
 		      TRUE, TRUE, 0);
@@ -535,32 +562,67 @@
   hildon_desktop_popup_menu_update_scroll_buttons (menu);
 }
 
-static void 
-hildon_desktop_popup_menu_scroll_cb (GtkWidget *widget, HildonDesktopPopupMenu *menu)
+static gboolean 
+hildon_desktop_popup_menu_scroll_step (gpointer data)
 {
-  GtkRequisition req;
+  HildonDesktopPopupMenu *menu = HILDON_DESKTOP_POPUP_MENU (data);
   GtkAdjustment *adj;
-  gdouble position;
   gint delta = menu->priv->item_height + 1;
  
   adj = gtk_viewport_get_vadjustment (GTK_VIEWPORT (menu->priv->viewport));
 
-  if (widget == menu->priv->scroll_up)
-    delta *= -1;
+  delta *= menu->priv->scroll_dir;
   
-  position = gtk_adjustment_get_value (adj);
+  if ((gint) (adj->value + (gdouble) delta) >= 0 &&
+      (gint) (adj->value + (gdouble) delta) <= adj->upper - adj->page_size)
+  {
+    adj->value += (gdouble) delta; 
+    gtk_adjustment_value_changed (adj);
+  }
+  else
+  {
+    if (delta > 0)
+      adj->value = adj->upper - adj->page_size;
+    else
+      adj->value = 0;
 
-  if (menu->priv->parent)
-  {		  
-    gtk_widget_size_request (menu->priv->parent, &req);
- 
-    if ((gint) (position + (gdouble) delta) <= adj->upper - adj->page_size)
-      gtk_adjustment_set_value (adj, position + (gdouble) delta); 
-    else
-      gtk_adjustment_set_value (adj, adj->upper - adj->page_size);
+    gtk_adjustment_value_changed (adj);
+    return FALSE;
   }
+
+  return TRUE;
 }
 
+static void 
+hildon_desktop_popup_menu_scroll_start (GtkWidget *widget, HildonDesktopPopupMenu *menu)
+{
+  if (widget == menu->priv->scroll_up)
+    menu->priv->scroll_dir = -1;
+  else
+    menu->priv->scroll_dir = 1;
+
+  menu->priv->scroll_id = 
+    g_timeout_add (MENU_SCROLL_TIMEOUT, hildon_desktop_popup_menu_scroll_step, menu);
+}
+
+static void 
+hildon_desktop_popup_menu_scroll_stop (GtkWidget *widget, HildonDesktopPopupMenu *menu)
+{
+  g_source_remove (menu->priv->scroll_id);
+  menu->priv->scroll_id = 0;
+}
+
+static void 
+hildon_desktop_popup_menu_scroll_cb (GtkWidget *widget, HildonDesktopPopupMenu *menu)
+{
+  if (widget == menu->priv->scroll_up)
+    menu->priv->scroll_dir = -1;
+  else
+    menu->priv->scroll_dir = 1;
+
+  hildon_desktop_popup_menu_scroll_step (menu);
+}
+
 static gboolean 
 hildon_desktop_popup_menu_release_event (GtkWidget      *widget,
                                          GdkEventButton *event)


More information about the maemo-commits mailing list