mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/virt-viewer
synced 2025-12-27 06:23:42 +00:00
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:
parent
633441631a
commit
701d57742f
@ -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"
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user