From 12a72a27d9c70b96ce9ecff089510fa856dcc9b5 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Wed, 5 Mar 2008 17:08:13 -0500 Subject: [PATCH] Disable menu accelerators when keyboard is grabbed (Chris Lalancett) --- src/main.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/src/main.c b/src/main.c index 2abc0b1..d52d923 100644 --- a/src/main.c +++ b/src/main.c @@ -69,6 +69,26 @@ static const struct keyComboDef keyCombos[] = { { { GDK_Print }, 1, "_PrintScreen"}, }; +enum menuNums { + FILE_MENU, + SEND_KEY_MENU, + HELP_MENU, + LAST_MENU // sentinel +}; + +struct menuItem { + guint menu; + GtkWidget *label; + const char *ungrabbed_text; + const char *grabbed_text; +}; + +static struct menuItem menuItems[] = { + { FILE_MENU, NULL, "_File", "File" }, + { SEND_KEY_MENU, NULL, "_Send Key", "Send Key" }, + { HELP_MENU, NULL, "_Help", "Help" } +}; + static void viewer_set_title(VncDisplay *vnc G_GNUC_UNUSED, GtkWidget *window, gboolean grabbed) { char title[1024]; @@ -87,12 +107,24 @@ static void viewer_set_title(VncDisplay *vnc G_GNUC_UNUSED, GtkWidget *window, g static void viewer_grab(GtkWidget *vnc, GtkWidget *window) { + int i; + viewer_set_title(VNC_DISPLAY(vnc), window, TRUE); + + for (i = 0 ; i < LAST_MENU; i++) { + gtk_label_set_text_with_mnemonic(GTK_LABEL(menuItems[i].label), menuItems[i].grabbed_text); + } } static void viewer_ungrab(GtkWidget *vnc, GtkWidget *window) { + int i; + viewer_set_title(VNC_DISPLAY(vnc), window, FALSE); + + for (i = 0 ; i < LAST_MENU; i++) { + gtk_label_set_text_with_mnemonic(GTK_LABEL(menuItems[i].label), menuItems[i].ungrabbed_text); + } } static void viewer_shutdown(GtkWidget *src G_GNUC_UNUSED, void *dummy G_GNUC_UNUSED, GtkWidget *vnc) @@ -317,6 +349,28 @@ static void viewer_about(GtkWidget *menu G_GNUC_UNUSED) gtk_widget_destroy(about); } +static GtkWidget *menu_item_new(int which_menu) +{ + GtkWidget *widget; + GtkWidget *label; + const char *text; + + text = menuItems[which_menu].ungrabbed_text; + + widget = gtk_menu_item_new(); + label = g_object_new(GTK_TYPE_ACCEL_LABEL, NULL); + gtk_label_set_text_with_mnemonic(GTK_LABEL(label), text); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + gtk_container_add(GTK_CONTAINER(widget), label); + gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(label), widget); + gtk_widget_show(label); + + menuItems[which_menu].label = label; + + return widget; +} + static GtkWidget *viewer_build_file_menu(VncDisplay *vnc) { GtkWidget *file; @@ -324,7 +378,7 @@ static GtkWidget *viewer_build_file_menu(VncDisplay *vnc) GtkWidget *quit; GtkWidget *screenshot; - file = gtk_menu_item_new_with_mnemonic("_File"); + file = menu_item_new(FILE_MENU); filemenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), filemenu); @@ -349,7 +403,7 @@ static GtkWidget *viewer_build_sendkey_menu(VncDisplay *vnc) GtkWidget *sendkeymenu; int i; - sendkey = gtk_menu_item_new_with_mnemonic("_Send Key"); + sendkey = menu_item_new(SEND_KEY_MENU); sendkeymenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(sendkey), sendkeymenu); @@ -375,7 +429,7 @@ static GtkWidget *viewer_build_help_menu(void) GtkWidget *helpmenu; GtkWidget *about; - help = gtk_menu_item_new_with_mnemonic("_Help"); + help = menu_item_new(HELP_MENU); helpmenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(help), helpmenu);