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..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; }