Added vertical scrolling using hw keys (Fixes NB#133627)
authorSergio Villar Senin <svillar@igalia.com>
Thu, 3 Sep 2009 11:11:41 +0000 (13:11 +0200)
committerSergio Villar Senin <svillar@igalia.com>
Thu, 3 Sep 2009 12:33:40 +0000 (14:33 +0200)
src/hildon2/modest-accounts-window.c
src/hildon2/modest-folder-window.c
src/hildon2/modest-header-window.c
src/hildon2/modest-maemo-utils.c
src/hildon2/modest-maemo-utils.h
src/hildon2/modest-mailboxes-window.c
src/hildon2/modest-msg-view-window.c

index 695b76e..345ee43 100644 (file)
@@ -83,6 +83,9 @@ static void on_row_deleted (GtkTreeModel *tree_model,
                            GtkTreePath  *path,
                            gpointer      user_data);
 static void row_count_changed (ModestAccountsWindow *self);
+static gboolean on_key_press(GtkWidget *widget,
+                               GdkEventKey *event,
+                               gpointer user_data);
 
 typedef struct _ModestAccountsWindowPrivate ModestAccountsWindowPrivate;
 struct _ModestAccountsWindowPrivate {
@@ -236,6 +239,10 @@ connect_signals (ModestAccountsWindow *self)
 
        /* we don't register this in sighandlers, as it should be run
         * after disconnecting all signals, in destroy stage */
+
+
+       g_signal_connect(G_OBJECT(self), "key-press-event",
+                       G_CALLBACK(on_key_press), self);
 }
 
 static ModestWindow *
@@ -668,3 +675,31 @@ modest_accounts_window_pre_create (void)
                pre_created_accounts_window = GTK_WIDGET (modest_accounts_window_new_real ());
        }
 }
+
+
+static gboolean
+on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+       ModestAccountsWindowPrivate *priv;
+       HildonPannableArea *pannable;
+
+       if (event->type == GDK_KEY_RELEASE)
+               return FALSE;
+
+       priv = MODEST_ACCOUNTS_WINDOW_GET_PRIVATE(user_data);
+
+       pannable = HILDON_PANNABLE_AREA (priv->pannable);
+
+       switch (event->keyval) {
+
+       case GDK_Up:
+               modest_maemo_utils_scroll_pannable(pannable, 0, -1);
+               break;
+
+       case GDK_Down:
+               modest_maemo_utils_scroll_pannable(pannable, 0, 1);
+               break;
+       }
+
+       return FALSE;
+}
index df05c43..ff85b6b 100644 (file)
@@ -106,6 +106,9 @@ static void on_visible_account_changed (ModestFolderView *folder_view,
 static void on_account_changed (TnyAccountStore *account_store,
                                TnyAccount *account,
                                gpointer user_data);
+static gboolean on_key_press(GtkWidget *widget,
+                               GdkEventKey *event,
+                               gpointer user_data);
 
 typedef struct _ModestFolderWindowPrivate ModestFolderWindowPrivate;
 struct _ModestFolderWindowPrivate {
@@ -262,6 +265,10 @@ connect_signals (ModestFolderWindow *self)
                                                       G_OBJECT (modest_runtime_get_account_store()),
                                                       "account-changed",
                                                       G_CALLBACK (on_account_changed), self);
+
+
+       g_signal_connect(G_OBJECT(self), "key-press-event",
+                       G_CALLBACK(on_key_press), self);
 }
 
 ModestWindow *
@@ -881,3 +888,31 @@ on_account_changed (TnyAccountStore *account_store,
        if (acc_id && visible && !g_utf8_collate (acc_id, visible))
                update_window_title (MODEST_FOLDER_WINDOW (user_data), account);
 }
+
+
+static gboolean
+on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+       ModestFolderWindowPrivate *priv;
+       HildonPannableArea *pannable;
+
+       if (event->type == GDK_KEY_RELEASE)
+               return FALSE;
+
+       priv = MODEST_FOLDER_WINDOW_GET_PRIVATE (user_data);
+
+       pannable = HILDON_PANNABLE_AREA (gtk_widget_get_parent (priv->folder_view));
+
+       switch (event->keyval) {
+
+       case GDK_Up:
+               modest_maemo_utils_scroll_pannable(pannable, 0, -1);
+               break;
+
+       case GDK_Down:
+               modest_maemo_utils_scroll_pannable(pannable, 0, 1);
+               break;
+       }
+
+       return FALSE;
+}
index 76adeaa..9abe2b0 100644 (file)
@@ -175,6 +175,9 @@ static void on_horizontal_movement (HildonPannableArea *hildonpannable,
                                    gpointer            user_data);
 static void on_header_view_model_destroyed (gpointer user_data,
                                            GObject *model);
+static gboolean on_key_press(GtkWidget *widget,
+                                       GdkEventKey *event,
+                                       gpointer user_data);
 
 /* globals */
 static GtkWindowClass *parent_class = NULL;
@@ -411,6 +414,10 @@ connect_signals (ModestHeaderWindow *self)
                                                   G_CALLBACK (on_horizontal_movement),
                                                   self);
        }
+
+
+       g_signal_connect(G_OBJECT(self), "key-press-event",
+                       G_CALLBACK(on_key_press), self);
 }
 
 static void
@@ -1468,3 +1475,35 @@ on_horizontal_movement (HildonPannableArea *hildonpannable,
                g_object_unref (header);
        }
 }
+
+
+static gboolean
+on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+       ModestHeaderWindowPrivate *priv;
+       HildonPannableArea *pannable;
+       /* FIXME: set scroll_speed depends on for how long the key was pressed */
+       gint scroll_speed = 3;
+
+       if (event->type == GDK_KEY_RELEASE)
+               return FALSE;
+
+       priv = MODEST_HEADER_WINDOW_GET_PRIVATE(user_data);
+
+       pannable = HILDON_PANNABLE_AREA (priv->contents_view);
+
+       switch (event->keyval) {
+
+       case GDK_Up:
+               priv->autoscroll = FALSE;
+               modest_maemo_utils_scroll_pannable(pannable, 0, -scroll_speed);
+               break;
+
+       case GDK_Down:
+               priv->autoscroll = FALSE;
+               modest_maemo_utils_scroll_pannable(pannable, 0, scroll_speed);
+               break;
+       }
+
+       return FALSE;
+}
index 50edb3c..140e2f3 100644 (file)
@@ -583,3 +583,42 @@ modest_maemo_utils_in_usb_mode ()
        return modest_conf_get_bool (modest_runtime_get_conf (), INTERNAL_MMC_USB_MODE, NULL);
 }
 #endif
+
+void
+modest_maemo_utils_scroll_pannable (HildonPannableArea *pannable,
+                                   gint horizontal,
+                                   gint vertical)
+{
+       gint h_pos = -1;
+       gint v_pos = -1;
+
+       g_assert (pannable);
+       /* at atleast one of values have to be valid */
+       g_return_if_fail (h_pos == -1 && v_pos == -1);
+
+       if (horizontal != 0) {
+               GtkAdjustment *h_adj;
+
+               h_adj = hildon_pannable_area_get_hadjustment (pannable);
+               g_return_if_fail (h_adj);
+
+               h_pos = h_adj->value + h_adj->step_increment * horizontal;
+               if (horizontal > 0) {
+                       h_pos += h_adj->page_size;
+               }
+       }
+
+       if (vertical != 0) {
+               GtkAdjustment *v_adj;
+
+               v_adj = hildon_pannable_area_get_vadjustment (pannable);
+               g_return_if_fail (v_adj);
+
+               v_pos = v_adj->value + v_adj->step_increment * vertical;
+               if (vertical > 0) {
+                       v_pos += v_adj->page_size;
+               }
+       }
+
+       hildon_pannable_area_scroll_to (pannable, h_pos, v_pos);
+}
index 959227f..0066e54 100644 (file)
@@ -38,6 +38,7 @@
 #include "widgets/modest-global-settings-dialog.h"
 #include "widgets/modest-validating-entry.h"
 #include <hildon/hildon-gtk.h>
+#include <hildon/hildon-pannable-area.h>
 
 #define MODEST_MAEMO_UTILS_MYDOCS_ENV "MYDOCSDIR"
 #define MODEST_MAEMO_UTILS_DEFAULT_IMAGE_FOLDER ".images"
@@ -158,4 +159,19 @@ gboolean   modest_maemo_utils_select_attachments (GtkWindow *window, TnyList *at
 gboolean modest_maemo_utils_in_usb_mode ();
 #endif
 
+/**
+ * modest_maemo_utils_scroll_pannable:
+ * @pannable: a #HildonPannableArea
+ * @horizontal: the amount to scroll in horizontal direction
+ * @vertical: the amount to scroll in vertical direction
+ *
+ * Performs some scrolling over a pannable area. The amount of
+ * scrolling is expressed in step_increments of the pannable area
+ * GtkAdjustments
+ **/
+void
+modest_maemo_utils_scroll_pannable(HildonPannableArea *pannable,
+                                  gint horizontal,
+                                  gint vertical);
+
 #endif /*__MODEST_MAEMO_UTILS_H__*/
index 6b9e1b4..4df7ced 100644 (file)
@@ -79,6 +79,9 @@ static void on_queue_changed    (ModestMailOperationQueue *queue,
 static void on_activity_changed (ModestFolderView *view,
                                 gboolean activity,
                                 ModestMailboxesWindow *folder_window);
+static gboolean on_key_press(GtkWidget *widget,
+                               GdkEventKey *event,
+                               gpointer user_data);
 
 typedef struct _ModestMailboxesWindowPrivate ModestMailboxesWindowPrivate;
 struct _ModestMailboxesWindowPrivate {
@@ -257,6 +260,9 @@ connect_signals (ModestMailboxesWindow *self)
                                           "clicked",
                                           G_CALLBACK (modest_ui_actions_on_new_msg), self);
 
+       /* connect window keys -> priv->folder_view scroll here? */
+       g_signal_connect(G_OBJECT(self), "key-press-event",
+                       G_CALLBACK(on_key_press), self);
 }
 
 ModestWindow *
@@ -614,3 +620,30 @@ on_activity_changed (ModestFolderView *view,
        update_progress_hint (self);
 }
 
+
+static gboolean
+on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+       ModestMailboxesWindowPrivate *priv;
+       HildonPannableArea *pannable;
+
+       if (event->type == GDK_KEY_RELEASE)
+               return FALSE;
+
+       priv = MODEST_MAILBOXES_WINDOW_GET_PRIVATE(user_data);
+
+       pannable = HILDON_PANNABLE_AREA (gtk_widget_get_parent (priv->folder_view));
+
+       switch (event->keyval) {
+
+       case GDK_Up:
+               modest_maemo_utils_scroll_pannable(pannable, 0, -1);
+               break;
+
+       case GDK_Down:
+               modest_maemo_utils_scroll_pannable(pannable, 0, 1);
+               break;
+       }
+
+       return FALSE;
+}
index c2bac92..8f481f0 100644 (file)
@@ -230,7 +230,6 @@ static gboolean _modest_msg_view_window_map_event (GtkWidget *widget,
                                                   gpointer userdata);
 static void update_branding (ModestMsgViewWindow *self);
 
-
 /* list my signals */
 enum {
        MSG_CHANGED_SIGNAL,
@@ -290,22 +289,48 @@ static void
 save_state (ModestWindow *self)
 {
        modest_widget_memory_save (modest_runtime_get_conf (),
-                                  G_OBJECT(self), 
+                                  G_OBJECT(self),
                                   MODEST_CONF_MSG_VIEW_WINDOW_KEY);
 }
 
-static 
-gboolean modest_msg_view_window_scroll_child (ModestMsgViewWindow *self,
-                                             GtkScrollType scroll_type,
-                                             gboolean horizontal,
-                                             gpointer userdata)
+static gboolean
+modest_msg_view_window_scroll_child (ModestMsgViewWindow *self,
+                                    GtkScrollType scroll_type,
+                                    gboolean horizontal,
+                                    gpointer userdata)
 {
        ModestMsgViewWindowPrivate *priv;
-       gboolean return_value;
+       gint step = 0;
 
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
-       g_signal_emit_by_name (priv->main_scroll, "scroll-child", scroll_type, horizontal, &return_value);
-       return return_value;
+
+       switch (scroll_type) {
+       case GTK_SCROLL_STEP_UP:
+               step = -1;
+               break;
+       case GTK_SCROLL_STEP_DOWN:
+               step = +1;
+               break;
+       case GTK_SCROLL_PAGE_UP:
+               step = -6;
+               break;
+       case GTK_SCROLL_PAGE_DOWN:
+               step = +6;
+               break;
+       case GTK_SCROLL_START:
+               step = -100;
+               break;
+       case GTK_SCROLL_END:
+               step = +100;
+               break;
+       default:
+               step = 0;
+       }
+
+       if (step)
+               modest_maemo_utils_scroll_pannable((HildonPannableArea *) priv->main_scroll, 0, step);
+
+       return (gboolean) step;
 }
 
 static void
@@ -314,7 +339,7 @@ add_scroll_binding (GtkBindingSet *binding_set,
                    GtkScrollType scroll)
 {
        guint keypad_keyval = keyval - GDK_Left + GDK_KP_Left;
-       
+
        gtk_binding_entry_add_signal (binding_set, keyval, 0,
                                      "scroll_child", 2,
                                      GTK_TYPE_SCROLL_TYPE, scroll,
@@ -1686,7 +1711,6 @@ modest_msg_view_window_zoom_minus (ModestWindow *window)
        modest_zoomable_set_zoom (MODEST_ZOOMABLE (priv->msg_view), zoom_level);
 
        return TRUE;
-       
 }
 
 static gboolean
@@ -1706,52 +1730,11 @@ modest_msg_view_window_key_event (GtkWidget *window,
                        gtk_widget_event (focus, copy);
                        gdk_event_free (copy);
                        return TRUE;
-               } else 
-                       return FALSE;
-       }
-       if (event->keyval == GDK_Up || event->keyval == GDK_KP_Up ||
-           event->keyval == GDK_Down || event->keyval == GDK_KP_Down ||
-           event->keyval == GDK_Page_Up || event->keyval == GDK_KP_Page_Up ||
-           event->keyval == GDK_Page_Down || event->keyval == GDK_KP_Page_Down ||
-           event->keyval == GDK_Home || event->keyval == GDK_KP_Home ||
-           event->keyval == GDK_End || event->keyval == GDK_KP_End) {
-               /* ModestMsgViewWindowPrivate *priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window); */
-               /* gboolean return_value; */
-
-               if (event->type == GDK_KEY_PRESS) {
-                       GtkScrollType scroll_type;
-
-                       switch (event->keyval) {
-                       case GDK_Up: 
-                       case GDK_KP_Up:
-                               scroll_type = GTK_SCROLL_STEP_UP; break;
-                       case GDK_Down: 
-                       case GDK_KP_Down:
-                               scroll_type = GTK_SCROLL_STEP_DOWN; break;
-                       case GDK_Page_Up:
-                       case GDK_KP_Page_Up:
-                               scroll_type = GTK_SCROLL_PAGE_UP; break;
-                       case GDK_Page_Down:
-                       case GDK_KP_Page_Down:
-                               scroll_type = GTK_SCROLL_PAGE_DOWN; break;
-                       case GDK_Home:
-                       case GDK_KP_Home:
-                               scroll_type = GTK_SCROLL_START; break;
-                       case GDK_End:
-                       case GDK_KP_End:
-                               scroll_type = GTK_SCROLL_END; break;
-                       default: scroll_type = GTK_SCROLL_NONE;
-                       }
-
-                       /* g_signal_emit_by_name (G_OBJECT (priv->main_scroll), "scroll-child",  */
-                       /*                     scroll_type, FALSE, &return_value); */
-                       return FALSE;
                } else {
                        return FALSE;
                }
-       } else {
-               return FALSE;
        }
+       return FALSE;
 }
 
 gboolean