[virt-tools-list] [PATCH virt-viewer 2/4] window: use a menu item property for key combos

Marc-André Lureau marcandre.lureau at gmail.com
Mon Jul 22 17:51:57 UTC 2013


Allow to add dynamically generated key combos later on.

This also removes the extra combo lookup, which used to be problematic
due to translations etc.
---
 src/virt-viewer-window.c | 94 +++++++++++++++++++++++++++---------------------
 1 file changed, 53 insertions(+), 41 deletions(-)

diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c
index d5e8d64..cd30910 100644
--- a/src/virt-viewer-window.c
+++ b/src/virt-viewer-window.c
@@ -522,54 +522,73 @@ virt_viewer_window_enter_fullscreen(VirtViewerWindow *self, gint monitor)
     gtk_window_fullscreen(GTK_WINDOW(priv->window));
 }
 
-#define MAX_KEY_COMBO 3
-struct        keyComboDef {
+#define MAX_KEY_COMBO 4
+struct keyComboDef {
     guint keys[MAX_KEY_COMBO];
-    guint nkeys;
     const char *label;
 };
 
 static const struct keyComboDef keyCombos[] = {
-    { { GDK_Control_L, GDK_Alt_L, GDK_Delete }, 3, N_("Ctrl+Alt+_Del")},
-    { { GDK_Control_L, GDK_Alt_L, GDK_BackSpace }, 3, N_("Ctrl+Alt+_Backspace")},
-    { {}, 0, "" },
-    { { GDK_Control_L, GDK_Alt_L, GDK_F1 }, 3, N_("Ctrl+Alt+F_1")},
-    { { GDK_Control_L, GDK_Alt_L, GDK_F2 }, 3, N_("Ctrl+Alt+F_2")},
-    { { GDK_Control_L, GDK_Alt_L, GDK_F3 }, 3, N_("Ctrl+Alt+F_3")},
-    { { GDK_Control_L, GDK_Alt_L, GDK_F4 }, 3, N_("Ctrl+Alt+F_4")},
-    { { GDK_Control_L, GDK_Alt_L, GDK_F5 }, 3, N_("Ctrl+Alt+F_5")},
-    { { GDK_Control_L, GDK_Alt_L, GDK_F6 }, 3, N_("Ctrl+Alt+F_6")},
-    { { GDK_Control_L, GDK_Alt_L, GDK_F7 }, 3, N_("Ctrl+Alt+F_7")},
-    { { GDK_Control_L, GDK_Alt_L, GDK_F8 }, 3, N_("Ctrl+Alt+F_8")},
-    { { GDK_Control_L, GDK_Alt_L, GDK_F9 }, 3, N_("Ctrl+Alt+F_9")},
-    { { GDK_Control_L, GDK_Alt_L, GDK_F10 }, 3, N_("Ctrl+Alt+F1_0")},
-    { { GDK_Control_L, GDK_Alt_L, GDK_F11 }, 3, N_("Ctrl+Alt+F11")},
-    { { GDK_Control_L, GDK_Alt_L, GDK_F12 }, 3, N_("Ctrl+Alt+F12")},
-    { {}, 0, "" },
-    { { GDK_Print }, 1, "_PrintScreen"},
+    { { GDK_Control_L, GDK_Alt_L, GDK_Delete, GDK_VoidSymbol }, N_("Ctrl+Alt+_Del")},
+    { { GDK_Control_L, GDK_Alt_L, GDK_BackSpace, GDK_VoidSymbol }, N_("Ctrl+Alt+_Backspace")},
+    { { GDK_VoidSymbol }, "" },
+    { { GDK_Control_L, GDK_Alt_L, GDK_F1, GDK_VoidSymbol }, N_("Ctrl+Alt+F_1")},
+    { { GDK_Control_L, GDK_Alt_L, GDK_F2, GDK_VoidSymbol }, N_("Ctrl+Alt+F_2")},
+    { { GDK_Control_L, GDK_Alt_L, GDK_F3, GDK_VoidSymbol }, N_("Ctrl+Alt+F_3")},
+    { { GDK_Control_L, GDK_Alt_L, GDK_F4, GDK_VoidSymbol }, N_("Ctrl+Alt+F_4")},
+    { { GDK_Control_L, GDK_Alt_L, GDK_F5, GDK_VoidSymbol }, N_("Ctrl+Alt+F_5")},
+    { { GDK_Control_L, GDK_Alt_L, GDK_F6, GDK_VoidSymbol }, N_("Ctrl+Alt+F_6")},
+    { { GDK_Control_L, GDK_Alt_L, GDK_F7, GDK_VoidSymbol }, N_("Ctrl+Alt+F_7")},
+    { { GDK_Control_L, GDK_Alt_L, GDK_F8, GDK_VoidSymbol }, N_("Ctrl+Alt+F_8")},
+    { { GDK_Control_L, GDK_Alt_L, GDK_F9, GDK_VoidSymbol }, N_("Ctrl+Alt+F_9")},
+    { { GDK_Control_L, GDK_Alt_L, GDK_F10, GDK_VoidSymbol }, N_("Ctrl+Alt+F1_0")},
+    { { GDK_Control_L, GDK_Alt_L, GDK_F11, GDK_VoidSymbol }, N_("Ctrl+Alt+F11")},
+    { { GDK_Control_L, GDK_Alt_L, GDK_F12, GDK_VoidSymbol }, N_("Ctrl+Alt+F12")},
+    { { GDK_VoidSymbol }, "" },
+    { { GDK_Print, GDK_VoidSymbol }, "_PrintScreen"},
 };
 
+static guint
+get_nth_keys(const guint *keys)
+{
+    guint i;
+
+    for (i = 0; keys[i] != GDK_VoidSymbol; )
+        i++;
+
+    return i;
+}
+
 G_MODULE_EXPORT void
 virt_viewer_window_menu_send(GtkWidget *menu,
                              VirtViewerWindow *self)
 {
-    int i;
-    GtkWidget *label = gtk_bin_get_child(GTK_BIN(menu));
-    const char *text = gtk_label_get_label(GTK_LABEL(label));
     VirtViewerWindowPrivate *priv = self->priv;
 
     g_return_if_fail(priv->display != NULL);
+    guint *keys = g_object_get_data(G_OBJECT(menu), "vv-keys");
+    g_return_if_fail(keys != NULL);
 
-    for (i = 0 ; i < G_N_ELEMENTS(keyCombos) ; i++) {
-        if (!strcmp(text, _(keyCombos[i].label))) {
-            DEBUG_LOG("Sending key combo %s", gtk_label_get_text(GTK_LABEL(label)));
-            virt_viewer_display_send_keys(VIRT_VIEWER_DISPLAY(priv->display),
-                                          keyCombos[i].keys,
-                                          keyCombos[i].nkeys);
-            return;
-        }
+    virt_viewer_display_send_keys(VIRT_VIEWER_DISPLAY(priv->display),
+                                  keys, get_nth_keys(keys));
+}
+
+static void
+virt_viewer_menu_add_combo(VirtViewerWindow *self, GtkMenu *menu,
+                           const guint *keys, const gchar *label)
+{
+    GtkWidget *item;
+
+    if (keys == NULL || keys[0] == GDK_VoidSymbol) {
+        item = gtk_separator_menu_item_new();
+    } else {
+        item = gtk_menu_item_new_with_mnemonic(label);
+        guint *ckeys = g_memdup(keys, (get_nth_keys(keys) + 1) * sizeof(guint));
+        g_object_set_data_full(G_OBJECT(item), "vv-keys", ckeys, g_free);
+        g_signal_connect(item, "activate", G_CALLBACK(virt_viewer_window_menu_send), self);
     }
-    DEBUG_LOG("Failed to find key combo %s", gtk_label_get_text(GTK_LABEL(label)));
+
+    gtk_container_add(GTK_CONTAINER(menu), item);
 }
 
 static GtkMenu*
@@ -579,15 +598,8 @@ virt_viewer_window_get_keycombo_menu(VirtViewerWindow *self)
     VirtViewerWindowPrivate *priv = self->priv;
     GtkMenu *menu = GTK_MENU(gtk_menu_new());
 
-    for (i = 0 ; i < G_N_ELEMENTS(keyCombos) ; i++) {
-        GtkWidget *item;
-        if (keyCombos[i].nkeys == 0) {
-            item = gtk_separator_menu_item_new ();
-        } else {
-            item = gtk_menu_item_new_with_mnemonic(keyCombos[i].label);
-            g_signal_connect(item, "activate", G_CALLBACK(virt_viewer_window_menu_send), self);
-        }
-        gtk_container_add(GTK_CONTAINER(menu), item);
+    for (i = 0 ; i < G_N_ELEMENTS(keyCombos); i++) {
+        virt_viewer_menu_add_combo(self, menu, keyCombos[i].keys, keyCombos[i].label);
     }
 
     gtk_menu_attach_to_widget(menu, GTK_WIDGET(priv->window), NULL);
-- 
1.8.3.rc1.49.g8d97506




More information about the virt-tools-list mailing list