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

Marc-André Lureau marcandre.lureau at gmail.com
Fri Apr 7 14:57:18 UTC 2017


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

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.


> ---
> 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/virt-tools-list/attachments/20170407/16ab88f6/attachment.htm>


More information about the virt-tools-list mailing list