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

2017-05-05 Thread Victor Toso
Hi,

On Thu, May 04, 2017 at 01:43:43PM +0200, Pavel Grunt wrote:
> 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
> ---
>  configure.ac |  4 ++--
>  src/virt-viewer-window.c | 56 
> 
>  2 files changed, 58 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..0948d83 100644
> --- a/src/virt-viewer-window.c
> +++ b/src/virt-viewer-window.c
> @@ -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[] = {
> +{"zoom-in", action_zoom_in,},
> +{"zoom-out", action_zoom_out,},
> +{"zoom-reset", action_zoom_reset,},
> +};

You will need:

diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c
index 0948d83..f5448c6 100644
--- a/src/virt-viewer-window.c
+++ b/src/virt-viewer-window.c
@@ -719,9 +719,9 @@ action_zoom_reset(G_GNUC_UNUSED GSimpleAction
*action,

 /* 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,},
  +{ .name = "zoom-in", .activate = action_zoom_in },
  +{ .name = "zoom-out", .activate = action_zoom_out },
  +{ .name = "zoom-reset", .activate = action_zoom_reset },
   };

To avoid:

virt-viewer-window.c:722:5: warning: missing initializer for field
'parameter_type' of 'GActionEntry {aka const struct _GActionEntry}'
[-Wmissing-field-initializers]

Other than that, patch looks fine to me.
Reviewed-by: Victor Toso 

> +
> +static const gchar *const keypad_action_accels[][2] = {
> +/* numpad keys are not handled automatically by gtk, see bgo#699823 */
> +{"KP_Add", NULL},
> +{"KP_Subtract", NULL},
> +{"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_

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

2017-05-04 Thread Pavel Grunt
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
---
 configure.ac |  4 ++--
 src/virt-viewer-window.c | 56 
 2 files changed, 58 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..0948d83 100644
--- a/src/virt-viewer-window.c
+++ b/src/virt-viewer-window.c
@@ -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[] = {
+{"zoom-in", action_zoom_in,},
+{"zoom-out", action_zoom_out,},
+{"zoom-reset", action_zoom_reset,},
+};
+
+static const gchar *const keypad_action_accels[][2] = {
+/* numpad keys are not handled automatically by gtk, see bgo#699823 */
+{"KP_Add", NULL},
+{"KP_Subtract", NULL},
+{"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;
 }
 
-- 
2.12.2

___
virt-tools-list mailing list
virt-tools-list@redhat.com
https://www.redhat.com/mailman/listinfo/virt-tools-list