[virt-tools-list] [PATCH virt-viewer 1/1] window: Allow to control zoom using keypad

Pavel Grunt pgrunt at redhat.com
Thu Apr 6 14:06:40 UTC 2017


Support for more than one key combo for accelerator is available
since GTK 3.12 through GAction.

Resolves: rhbz#1337575
---
Hello,

this patch fixes an old bug we attempted to fix several times in the past
when it was not possible to use more than a single key combo to do action.
GTK 3.12 fixed the limitation by introducing GAction.

My plan is to port "everything" to GAction. There were already some patches
doing that (Headerbar series by Sagar).

Thanks,
Pavel
---
 configure.ac             |  4 ++--
 src/virt-viewer-window.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 57 insertions(+), 2 deletions(-)

diff --git a/configure.ac b/configure.ac
index 69e3708..d5eb258 100644
--- a/configure.ac
+++ b/configure.ac
@@ -17,8 +17,8 @@ GLIB2_REQUIRED="2.38"
 GLIB2_ENCODED_VERSION="GLIB_VERSION_2_38"
 
 # Keep these two definitions in agreement.
-GTK_REQUIRED="3.10"
-GTK_ENCODED_VERSION="GDK_VERSION_3_10"
+GTK_REQUIRED="3.12"
+GTK_ENCODED_VERSION="GDK_VERSION_3_12"
 
 LIBXML2_REQUIRED="2.6.0"
 LIBVIRT_REQUIRED="0.10.0"
diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c
index 867a7b0..d191e49 100644
--- a/src/virt-viewer-window.c
+++ b/src/virt-viewer-window.c
@@ -693,6 +693,44 @@ virt_viewer_window_get_keycombo_menu(VirtViewerWindow *self)
     return menu;
 }
 
+static void
+action_zoom_in(G_GNUC_UNUSED GSimpleAction *action,
+               G_GNUC_UNUSED GVariant *state,
+               gpointer user_data)
+{
+    virt_viewer_window_menu_view_zoom_in(NULL, VIRT_VIEWER_WINDOW(user_data));
+}
+
+static void
+action_zoom_out(G_GNUC_UNUSED GSimpleAction *action,
+                G_GNUC_UNUSED GVariant *state,
+                gpointer user_data)
+{
+    virt_viewer_window_menu_view_zoom_out(NULL, VIRT_VIEWER_WINDOW(user_data));
+}
+
+static void
+action_zoom_reset(G_GNUC_UNUSED GSimpleAction *action,
+                  G_GNUC_UNUSED GVariant *state,
+                  gpointer user_data)
+{
+    virt_viewer_window_menu_view_zoom_reset(NULL, VIRT_VIEWER_WINDOW(user_data));
+}
+
+/* Keep keypad_action_entries and keypad_action_accels in sync */
+static const GActionEntry keypad_action_entries[] = {
+    {"zoom-in", action_zoom_in,},
+    {"zoom-out", action_zoom_out,},
+    {"zoom-reset", action_zoom_reset,},
+};
+
+static const gchar *const keypad_action_accels[][2] = {
+    {"<control>KP_Add", NULL},
+    {"<control>KP_Subtract", NULL},
+    {"<control>KP_0", NULL},
+};
+G_STATIC_ASSERT(G_N_ELEMENTS(keypad_action_entries) == G_N_ELEMENTS(keypad_action_accels));
+
 void
 virt_viewer_window_disable_modifiers(VirtViewerWindow *self)
 {
@@ -700,6 +738,7 @@ virt_viewer_window_disable_modifiers(VirtViewerWindow *self)
     VirtViewerWindowPrivate *priv = self->priv;
     GValue empty;
     GSList *accels;
+    guint i;
 
     if (!priv->accel_enabled)
         return;
@@ -726,6 +765,10 @@ virt_viewer_window_disable_modifiers(VirtViewerWindow *self)
                  "gtk-enable-mnemonics", FALSE,
                  NULL);
 
+    for (i = 0; i < G_N_ELEMENTS(keypad_action_entries); i++) {
+        g_action_map_remove_action(G_ACTION_MAP(priv->window), keypad_action_entries[i].name);
+    }
+
     priv->accel_enabled = FALSE;
 }
 
@@ -735,6 +778,7 @@ virt_viewer_window_enable_modifiers(VirtViewerWindow *self)
     GtkSettings *settings = gtk_settings_get_default();
     VirtViewerWindowPrivate *priv = self->priv;
     GSList *accels;
+    guint i;
 
     if (priv->accel_enabled)
         return;
@@ -755,6 +799,17 @@ virt_viewer_window_enable_modifiers(VirtViewerWindow *self)
                  "gtk-enable-mnemonics", priv->enable_mnemonics_save,
                  NULL);
 
+    g_action_map_add_action_entries(G_ACTION_MAP(priv->window),
+                                    keypad_action_entries, G_N_ELEMENTS(keypad_action_entries),
+                                    self);
+    for (i = 0; i < G_N_ELEMENTS(keypad_action_entries); i++) {
+        gchar *detailed_name = g_strdup_printf("win.%s", keypad_action_entries[i].name);
+        gtk_application_set_accels_for_action(GTK_APPLICATION(priv->app),
+                                              detailed_name,
+                                              keypad_action_accels[i]);
+        g_free(detailed_name);
+    }
+
     priv->accel_enabled = TRUE;
 }
 
-- 
2.12.2




More information about the virt-tools-list mailing list