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

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