[virt-tools-list] [PATCH virt-viewer 1/1] window: Allow to control zoom using keypad

Victor Toso lists at victortoso.com
Tue Apr 11 08:05:40 UTC 2017


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 at redhat.com>
> > 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 at redhat.com>

    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 at redhat.com
> > > https://www.redhat.com/mailman/listinfo/virt-tools-list
> > > 
> > 
> > -- 
> > Marc-André Lureau
> 
> _______________________________________________
> virt-tools-list mailing list
> virt-tools-list at redhat.com
> https://www.redhat.com/mailman/listinfo/virt-tools-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/virt-tools-list/attachments/20170411/529d48cb/attachment.sig>


More information about the virt-tools-list mailing list