<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Thu, Apr 6, 2017 at 4:07 PM Pavel Grunt <<a href="mailto:pgrunt@redhat.com">pgrunt@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Support for more than one key combo for accelerator is available<br class="gmail_msg">
since GTK 3.12 through GAction.<br class="gmail_msg">
<br class="gmail_msg">
Resolves: rhbz#1337575<br class="gmail_msg"></blockquote><div><br></div><div>That reminds me of this gtk bug: <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699823">https://bugzilla.gnome.org/show_bug.cgi?id=699823</a><br><br></div><div>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.<br> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
---<br class="gmail_msg">
Hello,<br class="gmail_msg">
<br class="gmail_msg">
this patch fixes an old bug we attempted to fix several times in the past<br class="gmail_msg">
when it was not possible to use more than a single key combo to do action.<br class="gmail_msg">
GTK 3.12 fixed the limitation by introducing GAction.<br class="gmail_msg">
<br class="gmail_msg">
My plan is to port "everything" to GAction. There were already some patches<br class="gmail_msg">
doing that (Headerbar series by Sagar).<br class="gmail_msg"></blockquote><div><br></div><div>I don't know how the API is evolving in gtk+, I hope you can sort it out!<br><br></div><div>thanks<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br class="gmail_msg">
Thanks,<br class="gmail_msg">
Pavel<br class="gmail_msg">
---<br class="gmail_msg">
 <a href="http://configure.ac" rel="noreferrer" class="gmail_msg" target="_blank">configure.ac</a>             |  4 ++--<br class="gmail_msg">
 src/virt-viewer-window.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++<br class="gmail_msg">
 2 files changed, 57 insertions(+), 2 deletions(-)<br class="gmail_msg">
<br class="gmail_msg">
diff --git a/<a href="http://configure.ac" rel="noreferrer" class="gmail_msg" target="_blank">configure.ac</a> b/<a href="http://configure.ac" rel="noreferrer" class="gmail_msg" target="_blank">configure.ac</a><br class="gmail_msg">
index 69e3708..d5eb258 100644<br class="gmail_msg">
--- a/<a href="http://configure.ac" rel="noreferrer" class="gmail_msg" target="_blank">configure.ac</a><br class="gmail_msg">
+++ b/<a href="http://configure.ac" rel="noreferrer" class="gmail_msg" target="_blank">configure.ac</a><br class="gmail_msg">
@@ -17,8 +17,8 @@ GLIB2_REQUIRED="2.38"<br class="gmail_msg">
 GLIB2_ENCODED_VERSION="GLIB_VERSION_2_38"<br class="gmail_msg">
<br class="gmail_msg">
 # Keep these two definitions in agreement.<br class="gmail_msg">
-GTK_REQUIRED="3.10"<br class="gmail_msg">
-GTK_ENCODED_VERSION="GDK_VERSION_3_10"<br class="gmail_msg">
+GTK_REQUIRED="3.12"<br class="gmail_msg">
+GTK_ENCODED_VERSION="GDK_VERSION_3_12"<br class="gmail_msg">
<br class="gmail_msg">
 LIBXML2_REQUIRED="2.6.0"<br class="gmail_msg">
 LIBVIRT_REQUIRED="0.10.0"<br class="gmail_msg">
diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c<br class="gmail_msg">
index 867a7b0..d191e49 100644<br class="gmail_msg">
--- a/src/virt-viewer-window.c<br class="gmail_msg">
+++ b/src/virt-viewer-window.c<br class="gmail_msg">
@@ -693,6 +693,44 @@ virt_viewer_window_get_keycombo_menu(VirtViewerWindow *self)<br class="gmail_msg">
     return menu;<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
+static void<br class="gmail_msg">
+action_zoom_in(G_GNUC_UNUSED GSimpleAction *action,<br class="gmail_msg">
+               G_GNUC_UNUSED GVariant *state,<br class="gmail_msg">
+               gpointer user_data)<br class="gmail_msg">
+{<br class="gmail_msg">
+    virt_viewer_window_menu_view_zoom_in(NULL, VIRT_VIEWER_WINDOW(user_data));<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+static void<br class="gmail_msg">
+action_zoom_out(G_GNUC_UNUSED GSimpleAction *action,<br class="gmail_msg">
+                G_GNUC_UNUSED GVariant *state,<br class="gmail_msg">
+                gpointer user_data)<br class="gmail_msg">
+{<br class="gmail_msg">
+    virt_viewer_window_menu_view_zoom_out(NULL, VIRT_VIEWER_WINDOW(user_data));<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+static void<br class="gmail_msg">
+action_zoom_reset(G_GNUC_UNUSED GSimpleAction *action,<br class="gmail_msg">
+                  G_GNUC_UNUSED GVariant *state,<br class="gmail_msg">
+                  gpointer user_data)<br class="gmail_msg">
+{<br class="gmail_msg">
+    virt_viewer_window_menu_view_zoom_reset(NULL, VIRT_VIEWER_WINDOW(user_data));<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+/* Keep keypad_action_entries and keypad_action_accels in sync */<br class="gmail_msg">
+static const GActionEntry keypad_action_entries[] = {<br class="gmail_msg">
+    {"zoom-in", action_zoom_in,},<br class="gmail_msg">
+    {"zoom-out", action_zoom_out,},<br class="gmail_msg">
+    {"zoom-reset", action_zoom_reset,},<br class="gmail_msg">
+};<br class="gmail_msg">
+<br class="gmail_msg">
+static const gchar *const keypad_action_accels[][2] = {<br class="gmail_msg">
+    {"<control>KP_Add", NULL},<br class="gmail_msg">
+    {"<control>KP_Subtract", NULL},<br class="gmail_msg">
+    {"<control>KP_0", NULL},<br class="gmail_msg">
+};<br class="gmail_msg">
+G_STATIC_ASSERT(G_N_ELEMENTS(keypad_action_entries) == G_N_ELEMENTS(keypad_action_accels));<br class="gmail_msg">
+<br class="gmail_msg">
 void<br class="gmail_msg">
 virt_viewer_window_disable_modifiers(VirtViewerWindow *self)<br class="gmail_msg">
 {<br class="gmail_msg">
@@ -700,6 +738,7 @@ virt_viewer_window_disable_modifiers(VirtViewerWindow *self)<br class="gmail_msg">
     VirtViewerWindowPrivate *priv = self->priv;<br class="gmail_msg">
     GValue empty;<br class="gmail_msg">
     GSList *accels;<br class="gmail_msg">
+    guint i;<br class="gmail_msg">
<br class="gmail_msg">
     if (!priv->accel_enabled)<br class="gmail_msg">
         return;<br class="gmail_msg">
@@ -726,6 +765,10 @@ virt_viewer_window_disable_modifiers(VirtViewerWindow *self)<br class="gmail_msg">
                  "gtk-enable-mnemonics", FALSE,<br class="gmail_msg">
                  NULL);<br class="gmail_msg">
<br class="gmail_msg">
+    for (i = 0; i < G_N_ELEMENTS(keypad_action_entries); i++) {<br class="gmail_msg">
+        g_action_map_remove_action(G_ACTION_MAP(priv->window), keypad_action_entries[i].name);<br class="gmail_msg">
+    }<br class="gmail_msg">
+<br class="gmail_msg">
     priv->accel_enabled = FALSE;<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
@@ -735,6 +778,7 @@ virt_viewer_window_enable_modifiers(VirtViewerWindow *self)<br class="gmail_msg">
     GtkSettings *settings = gtk_settings_get_default();<br class="gmail_msg">
     VirtViewerWindowPrivate *priv = self->priv;<br class="gmail_msg">
     GSList *accels;<br class="gmail_msg">
+    guint i;<br class="gmail_msg">
<br class="gmail_msg">
     if (priv->accel_enabled)<br class="gmail_msg">
         return;<br class="gmail_msg">
@@ -755,6 +799,17 @@ virt_viewer_window_enable_modifiers(VirtViewerWindow *self)<br class="gmail_msg">
                  "gtk-enable-mnemonics", priv->enable_mnemonics_save,<br class="gmail_msg">
                  NULL);<br class="gmail_msg">
<br class="gmail_msg">
+    g_action_map_add_action_entries(G_ACTION_MAP(priv->window),<br class="gmail_msg">
+                                    keypad_action_entries, G_N_ELEMENTS(keypad_action_entries),<br class="gmail_msg">
+                                    self);<br class="gmail_msg">
+    for (i = 0; i < G_N_ELEMENTS(keypad_action_entries); i++) {<br class="gmail_msg">
+        gchar *detailed_name = g_strdup_printf("win.%s", keypad_action_entries[i].name);<br class="gmail_msg">
+        gtk_application_set_accels_for_action(GTK_APPLICATION(priv->app),<br class="gmail_msg">
+                                              detailed_name,<br class="gmail_msg">
+                                              keypad_action_accels[i]);<br class="gmail_msg">
+        g_free(detailed_name);<br class="gmail_msg">
+    }<br class="gmail_msg">
+<br class="gmail_msg">
     priv->accel_enabled = TRUE;<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
--<br class="gmail_msg">
2.12.2<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
virt-tools-list mailing list<br class="gmail_msg">
<a href="mailto:virt-tools-list@redhat.com" class="gmail_msg" target="_blank">virt-tools-list@redhat.com</a><br class="gmail_msg">
<a href="https://www.redhat.com/mailman/listinfo/virt-tools-list" rel="noreferrer" class="gmail_msg" target="_blank">https://www.redhat.com/mailman/listinfo/virt-tools-list</a><br class="gmail_msg">
</blockquote></div></div><div dir="ltr">-- <br></div><div data-smartmail="gmail_signature"><div dir="ltr">Marc-André Lureau<br></div></div>