[evolution/gnome-3-30] I#140 - Single key accelerator triggered in search box
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution/gnome-3-30] I#140 - Single key accelerator triggered in search box
- Date: Wed, 26 Sep 2018 17:21:11 +0000 (UTC)
commit 6b51a3a0072f2147e1ce14756f58b8299c48beec
Author: Milan Crha <mcrha redhat com>
Date: Wed Sep 26 19:15:26 2018 +0200
I#140 - Single key accelerator triggered in search box
Closes https://gitlab.gnome.org/GNOME/evolution/issues/140
src/modules/mail/e-mail-shell-view-private.c | 37 +++++++++++++++++++++++-----
src/shell/e-shell-window-private.c | 33 +++++++++++++++++++++++++
2 files changed, 64 insertions(+), 6 deletions(-)
---
diff --git a/src/modules/mail/e-mail-shell-view-private.c b/src/modules/mail/e-mail-shell-view-private.c
index d3dd552c4b..0b5ef35444 100644
--- a/src/modules/mail/e-mail-shell-view-private.c
+++ b/src/modules/mail/e-mail-shell-view-private.c
@@ -248,8 +248,9 @@ mail_shell_view_folder_tree_popup_event_cb (EShellView *shell_view,
}
static gboolean
-mail_shell_view_key_press_event_cb (EMailShellView *mail_shell_view,
- GdkEventKey *event)
+mail_shell_view_process_key_press_event (EMailShellView *mail_shell_view,
+ GdkEventKey *event,
+ gboolean pass_event)
{
EShellView *shell_view;
EShellWindow *shell_window;
@@ -270,6 +271,14 @@ mail_shell_view_key_press_event_cb (EMailShellView *mail_shell_view,
reader = E_MAIL_READER (mail_view);
mail_display = e_mail_reader_get_mail_display (reader);
+ if (e_web_view_get_need_input (E_WEB_VIEW (mail_display)) &&
+ gtk_widget_has_focus (GTK_WIDGET (mail_display))) {
+ if (pass_event)
+ gtk_widget_event (GTK_WIDGET (mail_display), (GdkEvent *) event);
+
+ return pass_event;
+ }
+
switch (event->keyval) {
case GDK_KEY_space:
action = ACTION (MAIL_SMART_FORWARD);
@@ -283,15 +292,26 @@ mail_shell_view_key_press_event_cb (EMailShellView *mail_shell_view,
return FALSE;
}
- if (e_web_view_get_need_input (E_WEB_VIEW (mail_display)) &&
- gtk_widget_has_focus (GTK_WIDGET (mail_display)))
- return FALSE;
-
gtk_action_activate (action);
return TRUE;
}
+static gboolean
+mail_shell_view_key_press_event_cb (EMailShellView *mail_shell_view,
+ GdkEventKey *event)
+{
+ return mail_shell_view_process_key_press_event (mail_shell_view, event, FALSE);
+}
+
+static gboolean
+mail_shell_window_key_press_event_cb (EMailShellView *mail_shell_view,
+ GdkEventKey *event,
+ EShellWindow *shell_window)
+{
+ return mail_shell_view_process_key_press_event (mail_shell_view, event, TRUE);
+}
+
static gboolean
mail_shell_view_message_list_key_press_cb (EMailShellView *mail_shell_view,
gint row,
@@ -655,6 +675,11 @@ e_mail_shell_view_private_constructed (EMailShellView *mail_shell_view)
G_CALLBACK (e_mail_shell_view_update_send_receive_menus),
mail_shell_view, G_CONNECT_AFTER | G_CONNECT_SWAPPED);
+ g_signal_connect_object (
+ shell_window, "key-press-event",
+ G_CALLBACK (mail_shell_window_key_press_event_cb),
+ mail_shell_view, G_CONNECT_SWAPPED);
+
/* Need to keep the handler ID so we can disconnect it in
* dispose(). The shell outlives us and we don't want it
* invoking callbacks on finalized shell views. */
diff --git a/src/shell/e-shell-window-private.c b/src/shell/e-shell-window-private.c
index 305516e88a..81432c5744 100644
--- a/src/shell/e-shell-window-private.c
+++ b/src/shell/e-shell-window-private.c
@@ -345,6 +345,36 @@ e_shell_window_event_after_cb (EShellWindow *shell_window,
}
}
+static gboolean
+e_shell_window_key_press_event_cb (GtkWidget *widget,
+ GdkEventKey *event)
+{
+ GtkWindow *window;
+ GtkWidget *focused;
+
+ g_return_val_if_fail (E_IS_SHELL_WINDOW (widget), FALSE);
+
+ window = GTK_WINDOW (widget);
+ focused = gtk_window_get_focus (window);
+
+ if ((event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK)) != 0 ||
+ event->keyval == GDK_KEY_Tab ||
+ event->keyval == GDK_KEY_Return ||
+ event->keyval == GDK_KEY_Escape ||
+ event->keyval == GDK_KEY_KP_Tab ||
+ event->keyval == GDK_KEY_KP_Enter)
+ return FALSE;
+
+ if (GTK_IS_ENTRY (focused) ||
+ GTK_IS_EDITABLE (focused) ||
+ (GTK_IS_TREE_VIEW (focused) && gtk_tree_view_get_search_column (GTK_TREE_VIEW (focused)) >= 0)) {
+ gtk_widget_event (focused, (GdkEvent *) event);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static gboolean
shell_window_check_is_main_instance (GtkApplication *application,
GtkWindow *window)
@@ -634,6 +664,9 @@ e_shell_window_private_constructed (EShellWindow *shell_window)
g_signal_connect (shell_window, "event-after",
G_CALLBACK (e_shell_window_event_after_cb), NULL);
+
+ g_signal_connect (shell_window, "key-press-event",
+ G_CALLBACK (e_shell_window_key_press_event_cb), NULL);
}
void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]