summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDaniel P. Berrange <berrange@redhat.com>2008-03-05 17:08:13 -0500
committerDaniel P. Berrange <berrange@redhat.com>2008-03-05 17:08:13 -0500
commit12a72a27d9c70b96ce9ecff089510fa856dcc9b5 (patch)
treeaee610de5c17dc9dd80ea2cd5500e4c84b8e3bfb /src
parentc0f869e0cf9221e275847d1db8103c96a123ec19 (diff)
Disable menu accelerators when keyboard is grabbed (Chris Lalancett)
Diffstat (limited to 'src')
-rw-r--r--src/main.c60
1 files 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);