[virt-tools-list] [PATCH virt-viewer 4/4] window: auto-add hot key combos to "Send key" menu
Marc-André Lureau
marcandre.lureau at gmail.com
Mon Jul 22 17:51:59 UTC 2013
Auto-add hotkey combos to "Send key" menu. Because they are captured by
virt-viewer, there is currently no way to pass them to the guest.
https://bugzilla.redhat.com/show_bug.cgi?id=846006
---
src/virt-viewer-window.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 73 insertions(+)
diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c
index 6702365..231a124 100644
--- a/src/virt-viewer-window.c
+++ b/src/virt-viewer-window.c
@@ -619,6 +619,70 @@ virt_viewer_menu_add_combo(VirtViewerWindow *self, GtkMenu *menu,
gtk_container_add(GTK_CONTAINER(menu), item);
}
+static guint*
+accel_key_to_keys(const GtkAccelKey *key)
+{
+ guint val;
+ GArray *a = g_array_new(FALSE, FALSE, sizeof(guint));
+
+ val = key->accel_key;
+ g_array_append_val(a, val);
+
+ g_warn_if_fail((key->accel_mods &
+ ~(GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK)) == 0);
+
+ if (key->accel_mods & GDK_SHIFT_MASK) {
+ val = GDK_Shift_L;
+ g_array_append_val(a, val);
+ }
+
+ if (key->accel_mods & GDK_CONTROL_MASK) {
+ val = GDK_Control_L;
+ g_array_append_val(a, val);
+ }
+
+ if (key->accel_mods & GDK_MOD1_MASK) {
+ val = GDK_Alt_L;
+ g_array_append_val(a, val);
+ }
+
+ val = GDK_VoidSymbol;
+ g_array_append_val(a, val);
+
+ return g_array_free(a, FALSE);
+}
+
+struct accelCbData
+{
+ VirtViewerWindow *self;
+ GtkWidget *menu;
+};
+
+static void
+accel_map_item_cb(gpointer data,
+ const gchar *accel_path,
+ guint accel_key,
+ GdkModifierType accel_mods,
+ gboolean changed G_GNUC_UNUSED)
+{
+ struct accelCbData *d = data;
+ GtkAccelKey key = {
+ .accel_key = accel_key,
+ .accel_mods = accel_mods
+ };
+
+ if (!g_str_has_prefix(accel_path, "<virt-viewer>"))
+ return;
+ if (accel_key == GDK_VoidSymbol || accel_key == 0)
+ return;
+
+ guint *keys = accel_key_to_keys(&key);
+ gchar *label = gtk_accelerator_get_label(accel_key, accel_mods);
+ virt_viewer_menu_add_combo(d->self, d->menu, keys, label);
+ g_free(label);
+ g_free(keys);
+}
+
static GtkMenu*
virt_viewer_window_get_keycombo_menu(VirtViewerWindow *self)
{
@@ -630,6 +694,15 @@ virt_viewer_window_get_keycombo_menu(VirtViewerWindow *self)
virt_viewer_menu_add_combo(self, menu, keyCombos[i].keys, keyCombos[i].label);
}
+ if (virt_viewer_app_get_enable_accel(priv->app)) {
+ struct accelCbData d = {
+ .self = self,
+ .menu = menu
+ };
+
+ gtk_accel_map_foreach(&d, accel_map_item_cb);
+ }
+
gtk_widget_show_all(GTK_WIDGET(menu));
return menu;
}
--
1.8.3.rc1.49.g8d97506
More information about the virt-tools-list
mailing list