window: Allow to control zoom using keypad

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 <victortoso@redhat.com>
This commit is contained in:
Pavel Grunt 2017-05-09 13:53:13 +02:00
parent 633441631a
commit 701d57742f
2 changed files with 58 additions and 2 deletions

View File

@ -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"

View File

@ -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 */
{"<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 +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;
}