Blame SOURCES/0030-window-Allow-to-control-zoom-using-keypad.patch

140d58
From 400c937247380756ab6fa56593edc07dc5c092fc Mon Sep 17 00:00:00 2001
140d58
From: Pavel Grunt <pgrunt@redhat.com>
140d58
Date: Tue, 9 May 2017 13:53:13 +0200
140d58
Subject: [PATCH virt-viewer 30/32] window: Allow to control zoom using keypad
140d58
To: virt-tools-list@redhat.com
140d58
140d58
Support for more than one key combo for accelerator is available
140d58
since GTK 3.12 through GAction. It is currently not possible to
140d58
use mnemonics also for numpad keys, for more info see:
140d58
 https://bugzilla.gnome.org/show_bug.cgi?id=699823
140d58
140d58
Resolves: rhbz#1337575
140d58
140d58
Reviewed-by: Victor Toso <victortoso@redhat.com>
140d58
(cherry picked from commit 701d57742fad8edf40ae53bfcd41f81235fc5d90)
140d58
---
140d58
 configure.ac             |  4 ++--
140d58
 src/virt-viewer-window.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++
140d58
 2 files changed, 58 insertions(+), 2 deletions(-)
140d58
140d58
diff --git a/configure.ac b/configure.ac
140d58
index 3d03687..395659b 100644
140d58
--- a/configure.ac
140d58
+++ b/configure.ac
140d58
@@ -17,8 +17,8 @@ GLIB2_REQUIRED="2.38"
140d58
 GLIB2_ENCODED_VERSION="GLIB_VERSION_2_38"
140d58
 
140d58
 # Keep these two definitions in agreement.
140d58
-GTK_REQUIRED="3.10"
140d58
-GTK_ENCODED_VERSION="GDK_VERSION_3_10"
140d58
+GTK_REQUIRED="3.12"
140d58
+GTK_ENCODED_VERSION="GDK_VERSION_3_12"
140d58
 
140d58
 LIBXML2_REQUIRED="2.6.0"
140d58
 LIBVIRT_REQUIRED="0.10.0"
140d58
diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c
140d58
index 867a7b0..f5448c6 100644
140d58
--- a/src/virt-viewer-window.c
140d58
+++ b/src/virt-viewer-window.c
140d58
@@ -693,6 +693,45 @@ virt_viewer_window_get_keycombo_menu(VirtViewerWindow *self)
140d58
     return menu;
140d58
 }
140d58
 
140d58
+static void
140d58
+action_zoom_in(G_GNUC_UNUSED GSimpleAction *action,
140d58
+               G_GNUC_UNUSED GVariant *state,
140d58
+               gpointer user_data)
140d58
+{
140d58
+    virt_viewer_window_menu_view_zoom_in(NULL, VIRT_VIEWER_WINDOW(user_data));
140d58
+}
140d58
+
140d58
+static void
140d58
+action_zoom_out(G_GNUC_UNUSED GSimpleAction *action,
140d58
+                G_GNUC_UNUSED GVariant *state,
140d58
+                gpointer user_data)
140d58
+{
140d58
+    virt_viewer_window_menu_view_zoom_out(NULL, VIRT_VIEWER_WINDOW(user_data));
140d58
+}
140d58
+
140d58
+static void
140d58
+action_zoom_reset(G_GNUC_UNUSED GSimpleAction *action,
140d58
+                  G_GNUC_UNUSED GVariant *state,
140d58
+                  gpointer user_data)
140d58
+{
140d58
+    virt_viewer_window_menu_view_zoom_reset(NULL, VIRT_VIEWER_WINDOW(user_data));
140d58
+}
140d58
+
140d58
+/* Keep keypad_action_entries and keypad_action_accels in sync */
140d58
+static const GActionEntry keypad_action_entries[] = {
140d58
+    { .name = "zoom-in", .activate = action_zoom_in },
140d58
+    { .name = "zoom-out", .activate = action_zoom_out },
140d58
+    { .name = "zoom-reset", .activate = action_zoom_reset },
140d58
+};
140d58
+
140d58
+static const gchar *const keypad_action_accels[][2] = {
140d58
+    /* numpad keys are not handled automatically by gtk, see bgo#699823 */
140d58
+    {"<control>KP_Add", NULL},
140d58
+    {"<control>KP_Subtract", NULL},
140d58
+    {"<control>KP_0", NULL},
140d58
+};
140d58
+G_STATIC_ASSERT(G_N_ELEMENTS(keypad_action_entries) == G_N_ELEMENTS(keypad_action_accels));
140d58
+
140d58
 void
140d58
 virt_viewer_window_disable_modifiers(VirtViewerWindow *self)
140d58
 {
140d58
@@ -700,6 +739,7 @@ virt_viewer_window_disable_modifiers(VirtViewerWindow *self)
140d58
     VirtViewerWindowPrivate *priv = self->priv;
140d58
     GValue empty;
140d58
     GSList *accels;
140d58
+    guint i;
140d58
 
140d58
     if (!priv->accel_enabled)
140d58
         return;
140d58
@@ -726,6 +766,10 @@ virt_viewer_window_disable_modifiers(VirtViewerWindow *self)
140d58
                  "gtk-enable-mnemonics", FALSE,
140d58
                  NULL);
140d58
 
140d58
+    for (i = 0; i < G_N_ELEMENTS(keypad_action_entries); i++) {
140d58
+        g_action_map_remove_action(G_ACTION_MAP(priv->window), keypad_action_entries[i].name);
140d58
+    }
140d58
+
140d58
     priv->accel_enabled = FALSE;
140d58
 }
140d58
 
140d58
@@ -735,6 +779,7 @@ virt_viewer_window_enable_modifiers(VirtViewerWindow *self)
140d58
     GtkSettings *settings = gtk_settings_get_default();
140d58
     VirtViewerWindowPrivate *priv = self->priv;
140d58
     GSList *accels;
140d58
+    guint i;
140d58
 
140d58
     if (priv->accel_enabled)
140d58
         return;
140d58
@@ -755,6 +800,17 @@ virt_viewer_window_enable_modifiers(VirtViewerWindow *self)
140d58
                  "gtk-enable-mnemonics", priv->enable_mnemonics_save,
140d58
                  NULL);
140d58
 
140d58
+    g_action_map_add_action_entries(G_ACTION_MAP(priv->window),
140d58
+                                    keypad_action_entries, G_N_ELEMENTS(keypad_action_entries),
140d58
+                                    self);
140d58
+    for (i = 0; i < G_N_ELEMENTS(keypad_action_entries); i++) {
140d58
+        gchar *detailed_name = g_strdup_printf("win.%s", keypad_action_entries[i].name);
140d58
+        gtk_application_set_accels_for_action(GTK_APPLICATION(priv->app),
140d58
+                                              detailed_name,
140d58
+                                              keypad_action_accels[i]);
140d58
+        g_free(detailed_name);
140d58
+    }
140d58
+
140d58
     priv->accel_enabled = TRUE;
140d58
 }
140d58
 
140d58
-- 
140d58
2.12.2
140d58