Hi, On Fri, Apr 07, 2017 at 06:41:55PM +0200, Pavel Grunt wrote: > Hi, > > On Fri, 2017-04-07 at 14:57 +0000, Marc-André Lureau wrote: > > > > > > On Thu, Apr 6, 2017 at 4:07 PM Pavel Grunt <pgrunt@xxxxxxxxxx> > > wrote: > > > Support for more than one key combo for accelerator is available > > > since GTK 3.12 through GAction. > > > > > > Resolves: rhbz#1337575 > > > > That reminds me of this gtk bug: > > https://bugzilla.gnome.org/show_bug.cgi?id=699823 > > yes, mnemonics must be solved at the toolkit level. > Strings like ".. _0 ..." should be activatable by both 0 and KP_0 > > Accelerators (key combos) are (may be) a different story for the > reasons mentioned in the bug > > > > Have you looked at solving this at the gtk+ level? I suppose most > > applications with the same binding would like it to work on keypad > > too. > > I agree that it would be easier for everyone... I can imagine a > solution similar to handling of left & right shift: <shift>, left & > right ctrl: <control> - something like 0 & KP_0: <0>, plus & KP_Add: > <plus> ... That would not break apps possibly relying on "plus" != > KP_ADD > > Looking at gtk code patching (terribly long) > gtk_accelerator_parse_with_keycode() should not be difficult. > > Considering rhbz#1337575 I'd go for GAction for now Makes sense to me. I'd add gtk#699823 in the commit log and a fixme somewhere in the code to make it harder to forget about it. It would also help our case to add a reference to this patch/mail in gtk#699823 as a potential user for that fix. With this, I think it would be great to have this fixed for now, close the rhbz bug and later on we can simply improve the code with new api if needed. Reviewed-by: Victor Toso <victortoso@xxxxxxxxxx> toso > > Thanks, > Pavel > > > > > > --- > > > 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). > > > > I don't know how the API is evolving in gtk+, I hope you can sort it > > out! > > > > thanks > > > 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 > > > > > > _______________________________________________ > > > virt-tools-list mailing list > > > virt-tools-list@xxxxxxxxxx > > > https://www.redhat.com/mailman/listinfo/virt-tools-list > > > > > > > -- > > Marc-André Lureau > > _______________________________________________ > virt-tools-list mailing list > virt-tools-list@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/virt-tools-list
Attachment:
signature.asc
Description: PGP signature
_______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list