From 4eed73e6ad57291561801592a3d81f6d584c47e9 Mon Sep 17 00:00:00 2001 From: Sergio Villar Senin Date: Thu, 3 Sep 2009 13:11:41 +0200 Subject: [PATCH] Added vertical scrolling using hw keys (Fixes NB#133627) --- src/hildon2/modest-accounts-window.c | 35 +++++++++++++ src/hildon2/modest-folder-window.c | 35 +++++++++++++ src/hildon2/modest-header-window.c | 39 ++++++++++++++ src/hildon2/modest-maemo-utils.c | 39 ++++++++++++++ src/hildon2/modest-maemo-utils.h | 16 ++++++ src/hildon2/modest-mailboxes-window.c | 33 ++++++++++++ src/hildon2/modest-msg-view-window.c | 91 ++++++++++++++------------------- 7 files changed, 234 insertions(+), 54 deletions(-) diff --git a/src/hildon2/modest-accounts-window.c b/src/hildon2/modest-accounts-window.c index 695b76e..345ee43 100644 --- a/src/hildon2/modest-accounts-window.c +++ b/src/hildon2/modest-accounts-window.c @@ -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; +} diff --git a/src/hildon2/modest-folder-window.c b/src/hildon2/modest-folder-window.c index df05c43..ff85b6b 100644 --- a/src/hildon2/modest-folder-window.c +++ b/src/hildon2/modest-folder-window.c @@ -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; +} diff --git a/src/hildon2/modest-header-window.c b/src/hildon2/modest-header-window.c index 76adeaa..9abe2b0 100644 --- a/src/hildon2/modest-header-window.c +++ b/src/hildon2/modest-header-window.c @@ -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; +} diff --git a/src/hildon2/modest-maemo-utils.c b/src/hildon2/modest-maemo-utils.c index 50edb3c..140e2f3 100644 --- a/src/hildon2/modest-maemo-utils.c +++ b/src/hildon2/modest-maemo-utils.c @@ -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); +} diff --git a/src/hildon2/modest-maemo-utils.h b/src/hildon2/modest-maemo-utils.h index 959227f..0066e54 100644 --- a/src/hildon2/modest-maemo-utils.h +++ b/src/hildon2/modest-maemo-utils.h @@ -38,6 +38,7 @@ #include "widgets/modest-global-settings-dialog.h" #include "widgets/modest-validating-entry.h" #include +#include #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__*/ diff --git a/src/hildon2/modest-mailboxes-window.c b/src/hildon2/modest-mailboxes-window.c index 6b9e1b4..4df7ced 100644 --- a/src/hildon2/modest-mailboxes-window.c +++ b/src/hildon2/modest-mailboxes-window.c @@ -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; +} diff --git a/src/hildon2/modest-msg-view-window.c b/src/hildon2/modest-msg-view-window.c index c2bac92..8f481f0 100644 --- a/src/hildon2/modest-msg-view-window.c +++ b/src/hildon2/modest-msg-view-window.c @@ -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 -- 1.7.9.5