From 400c937247380756ab6fa56593edc07dc5c092fc Mon Sep 17 00:00:00 2001 From: Pavel Grunt Date: Tue, 9 May 2017 13:53:13 +0200 Subject: [PATCH virt-viewer 30/32] window: Allow to control zoom using keypad To: virt-tools-list@redhat.com Support for more than one key combo for accelerator is available since GTK 3.12 through GAction. It is currently not possible to use mnemonics also for numpad keys, for more info see: https://bugzilla.gnome.org/show_bug.cgi?id=699823 Resolves: rhbz#1337575 Reviewed-by: Victor Toso (cherry picked from commit 701d57742fad8edf40ae53bfcd41f81235fc5d90) --- configure.ac | 4 ++-- src/virt-viewer-window.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 3d03687..395659b 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..f5448c6 100644 --- a/src/virt-viewer-window.c +++ b/src/virt-viewer-window.c @@ -693,6 +693,45 @@ 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[] = { + { .name = "zoom-in", .activate = action_zoom_in }, + { .name = "zoom-out", .activate = action_zoom_out }, + { .name = "zoom-reset", .activate = action_zoom_reset }, +}; + +static const gchar *const keypad_action_accels[][2] = { + /* numpad keys are not handled automatically by gtk, see bgo#699823 */ + {"KP_Add", NULL}, + {"KP_Subtract", NULL}, + {"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 +739,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 +766,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 +779,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 +800,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