[evolution] Bug 754039 - Cannot scroll via keyboard in separate email window
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] Bug 754039 - Cannot scroll via keyboard in separate email window
- Date: Fri, 28 Aug 2015 10:18:36 +0000 (UTC)
commit 47aa717b8497808c2d4d0ac9edcfcf6b5ff30894
Author: Milan Crha <mcrha redhat com>
Date: Fri Aug 28 12:18:01 2015 +0200
Bug 754039 - Cannot scroll via keyboard in separate email window
mail/e-mail-browser.c | 44 +++++++++++++++++++++++++++--
mail/e-mail-display.c | 34 +++++++++++++++++++++++
mail/e-mail-display.h | 2 +
modules/mail/e-mail-shell-view-private.c | 36 +-----------------------
4 files changed, 79 insertions(+), 37 deletions(-)
---
diff --git a/mail/e-mail-browser.c b/mail/e-mail-browser.c
index 4c294a0..725f7e9 100644
--- a/mail/e-mail-browser.c
+++ b/mail/e-mail-browser.c
@@ -748,9 +748,47 @@ static gboolean
mail_browser_key_press_event (GtkWidget *widget,
GdkEventKey *event)
{
- if (event->keyval == GDK_KEY_Escape) {
- e_mail_browser_close (E_MAIL_BROWSER (widget));
- return TRUE;
+ EMailDisplay *mail_display;
+
+ g_return_val_if_fail (E_IS_MAIL_BROWSER (widget), FALSE);
+
+ mail_display = e_mail_reader_get_mail_display (E_MAIL_READER (widget));
+
+ switch (event->keyval) {
+ case GDK_KEY_Escape:
+ e_mail_browser_close (E_MAIL_BROWSER (widget));
+ return TRUE;
+
+ case GDK_KEY_Home:
+ case GDK_KEY_Left:
+ case GDK_KEY_Up:
+ case GDK_KEY_Right:
+ case GDK_KEY_Down:
+ case GDK_KEY_Next:
+ case GDK_KEY_End:
+ case GDK_KEY_Begin:
+ /* If Caret mode is enabled don't try to process these keys */
+ if (e_web_view_get_caret_mode (E_WEB_VIEW (mail_display)))
+ break;
+ case GDK_KEY_Prior:
+ if (!e_mail_display_needs_key (mail_display, FALSE) &&
+ webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (mail_display)) !=
+ webkit_web_view_get_focused_frame (WEBKIT_WEB_VIEW (mail_display))) {
+ WebKitDOMDocument *document;
+ WebKitDOMDOMWindow *window;
+
+ document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (mail_display));
+ window = webkit_dom_document_get_default_view (document);
+
+ /* Workaround WebKit bug for key navigation, when inner IFRAME is focused.
+ * EMailView's inner IFRAMEs have disabled scrolling, but WebKit doesn't post
+ * key navigation events to parent's frame, thus the view doesn't scroll.
+ * This is a poor workaround for this issue, the main frame is focused,
+ * which has scrolling enabled.
+ */
+ webkit_dom_dom_window_focus (window);
+ }
+ break;
}
/* Chain up to parent's key_press_event() method. */
diff --git a/mail/e-mail-display.c b/mail/e-mail-display.c
index 49478a0..9b4b628 100644
--- a/mail/e-mail-display.c
+++ b/mail/e-mail-display.c
@@ -2524,3 +2524,37 @@ e_mail_display_set_remote_content (EMailDisplay *display,
g_mutex_unlock (&display->priv->remote_content_lock);
}
+
+gboolean
+e_mail_display_needs_key (EMailDisplay *mail_display,
+ gboolean with_input)
+{
+ gboolean needs_key = FALSE;
+
+ g_return_val_if_fail (E_IS_MAIL_DISPLAY (mail_display), FALSE);
+
+ if (gtk_widget_has_focus (GTK_WIDGET (mail_display))) {
+ WebKitWebFrame *frame;
+ WebKitDOMDocument *dom;
+ WebKitDOMElement *element;
+ gchar *name = NULL;
+
+ frame = webkit_web_view_get_focused_frame (WEBKIT_WEB_VIEW (mail_display));
+ if (!frame)
+ return FALSE;
+ dom = webkit_web_frame_get_dom_document (frame);
+ element = webkit_dom_html_document_get_active_element (WEBKIT_DOM_HTML_DOCUMENT (dom));
+
+ if (element)
+ name = webkit_dom_node_get_node_name (WEBKIT_DOM_NODE (element));
+
+ /* if INPUT or TEXTAREA has focus, then any key press should go there */
+ if (name && ((with_input && g_ascii_strcasecmp (name, "INPUT") == 0) || g_ascii_strcasecmp
(name, "TEXTAREA") == 0)) {
+ needs_key = TRUE;
+ }
+
+ g_free (name);
+ }
+
+ return needs_key;
+}
diff --git a/mail/e-mail-display.h b/mail/e-mail-display.h
index 15e9986..893f172 100644
--- a/mail/e-mail-display.h
+++ b/mail/e-mail-display.h
@@ -104,6 +104,8 @@ EMailRemoteContent *
void e_mail_display_set_remote_content
(EMailDisplay *display,
EMailRemoteContent *remote_content);
+gboolean e_mail_display_needs_key (EMailDisplay *mail_display,
+ gboolean with_input);
G_END_DECLS
diff --git a/modules/mail/e-mail-shell-view-private.c b/modules/mail/e-mail-shell-view-private.c
index f506d00..3be96db 100644
--- a/modules/mail/e-mail-shell-view-private.c
+++ b/modules/mail/e-mail-shell-view-private.c
@@ -250,38 +250,6 @@ mail_shell_view_folder_tree_popup_event_cb (EShellView *shell_view,
}
static gboolean
-mail_shell_view_mail_display_needs_key (EMailDisplay *mail_display,
- gboolean with_input)
-{
- gboolean needs_key = FALSE;
-
- if (gtk_widget_has_focus (GTK_WIDGET (mail_display))) {
- WebKitWebFrame *frame;
- WebKitDOMDocument *dom;
- WebKitDOMElement *element;
- gchar *name = NULL;
-
- frame = webkit_web_view_get_focused_frame (WEBKIT_WEB_VIEW (mail_display));
- if (!frame)
- return FALSE;
- dom = webkit_web_frame_get_dom_document (frame);
- element = webkit_dom_html_document_get_active_element (WEBKIT_DOM_HTML_DOCUMENT (dom));
-
- if (element)
- name = webkit_dom_node_get_node_name (WEBKIT_DOM_NODE (element));
-
- /* if INPUT or TEXTAREA has focus, then any key press should go there */
- if (name && ((with_input && g_ascii_strcasecmp (name, "INPUT") == 0) || g_ascii_strcasecmp
(name, "TEXTAREA") == 0)) {
- needs_key = TRUE;
- }
-
- g_free (name);
- }
-
- return needs_key;
-}
-
-static gboolean
mail_shell_view_key_press_event_cb (EMailShellView *mail_shell_view,
GdkEventKey *event)
{
@@ -325,7 +293,7 @@ mail_shell_view_key_press_event_cb (EMailShellView *mail_shell_view,
if (e_web_view_get_caret_mode (E_WEB_VIEW (mail_display)))
return FALSE;
case GDK_KEY_Prior:
- if (!mail_shell_view_mail_display_needs_key (mail_display, FALSE) &&
+ if (!e_mail_display_needs_key (mail_display, FALSE) &&
webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (mail_display)) !=
webkit_web_view_get_focused_frame (WEBKIT_WEB_VIEW (mail_display))) {
WebKitDOMDocument *document;
@@ -348,7 +316,7 @@ mail_shell_view_key_press_event_cb (EMailShellView *mail_shell_view,
return FALSE;
}
- if (mail_shell_view_mail_display_needs_key (mail_display, TRUE))
+ if (e_mail_display_needs_key (mail_display, TRUE))
return FALSE;
gtk_action_activate (action);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]