diff --git a/vncviewer/OptionsDialog.cxx b/vncviewer/OptionsDialog.cxx
index b9752aa..f367840 100644
--- a/vncviewer/OptionsDialog.cxx
+++ b/vncviewer/OptionsDialog.cxx
@@ -724,9 +724,19 @@
 
   menuKeyChoice = new Fl_Choice(LBLLEFT(tx, ty, 150, CHOICE_HEIGHT, _("Menu key")));
 
-  menuKeyChoice->add(_("None"), 0, NULL, (void*)0, FL_MENU_DIVIDER);
+  Fl_Menu_Item items[getMenuKeySymbolCount() + 2];
+
+  memset(items, 0, sizeof(items));
+
+  items[0].text = strdup(_("None"));
+  items[0].flags = FL_MENU_DIVIDER;
+
   for (int i = 0; i < getMenuKeySymbolCount(); i++)
-    menuKeyChoice->add(getMenuKeySymbols()[i].name, 0, NULL, 0, 0);
+      items[i+1].text = strdup(getMenuKeySymbols()[i].name);
+
+  items[getMenuKeySymbolCount()+1].text = NULL;
+
+  menuKeyChoice->copy(items);
 
   ty += CHOICE_HEIGHT + TIGHT_MARGIN;
 
diff --git a/vncviewer/Viewport.cxx b/vncviewer/Viewport.cxx
index 33ba24f..918730e 100644
--- a/vncviewer/Viewport.cxx
+++ b/vncviewer/Viewport.cxx
@@ -24,6 +24,7 @@
 #include <assert.h>
 #include <stdio.h>
 #include <string.h>
+#include <stdint.h>
 
 #include <rfb/CMsgWriter.h>
 #include <rfb/LogWriter.h>
@@ -1060,41 +1061,80 @@
 
 void Viewport::initContextMenu()
 {
-  contextMenu->clear();
-
-  contextMenu->add(_("E&xit viewer"), 0, NULL, (void*)ID_EXIT, FL_MENU_DIVIDER);
+  size_t i;
+  Fl_Menu_Item items[] = {
+    { strdup(_("E&xit viewer")), 0, NULL, (void*)ID_EXIT, FL_MENU_DIVIDER },
 
 #ifdef HAVE_FLTK_FULLSCREEN
-  contextMenu->add(_("&Full screen"), 0, NULL, (void*)ID_FULLSCREEN, 
-		   FL_MENU_TOGGLE | (window()->fullscreen_active()?FL_MENU_VALUE:0));
+    { strdup(_("&Full screen")), 0, NULL, (void*)ID_FULLSCREEN, FL_MENU_TOGGLE },
 #endif
-  contextMenu->add(_("Resize &window to session"), 0, NULL, (void*)ID_RESIZE, 
+    { strdup(_("Resize &window to session")), 0, NULL, (void*)ID_RESIZE, FL_MENU_DIVIDER },
+
+    { strdup(_("&Ctrl")), 0, NULL, (void*)ID_CTRL, FL_MENU_TOGGLE },
+    { strdup(_("&Alt")), 0, NULL, (void*)ID_ALT, FL_MENU_TOGGLE },
+
+    { strdup("Menu key"), 0, NULL, (void*)ID_MENUKEY, 0 },
+    { strdup("Secret shortcut menu key"), menuKeyCode, NULL, (void*)ID_MENUKEY, FL_MENU_INVISIBLE },
+    { strdup(_("Send Ctrl-Alt-&Del")), 0, NULL, (void*)ID_CTRLALTDEL, FL_MENU_DIVIDER },
+
+    { strdup(_("&Refresh screen")), 0, NULL, (void*)ID_REFRESH, FL_MENU_DIVIDER },
+
+    { strdup(_("&Options...")), 0, NULL, (void*)ID_OPTIONS, 0 },
+    { strdup(_("Connection &info...")), 0, NULL, (void*)ID_INFO, 0 },
+    { strdup(_("About &TigerVNC viewer...")), 0, NULL, (void*)ID_ABOUT, FL_MENU_DIVIDER },
+
+    { strdup(_("Dismiss &menu")), 0, NULL, (void*)ID_DISMISS, 0 },
+
+    {0}
+  };
+
+  // Update any state
+  for (i = 0;i < sizeof(items)/sizeof(items[0]);i++) {
+    switch ((intptr_t)items[i].user_data_) {
 #ifdef HAVE_FLTK_FULLSCREEN
-       (window()->fullscreen_active()?FL_MENU_INACTIVE:0) |
+    case ID_FULLSCREEN:
+      if (window()->fullscreen_active())
+        items[i].flags |= FL_MENU_VALUE;
+      break;
+    case ID_RESIZE:
+      if (window()->fullscreen_active())
+        items[i].flags |= FL_MENU_INACTIVE;
+      break;
 #endif
-		   FL_MENU_DIVIDER);
-
-  contextMenu->add(_("&Ctrl"), 0, NULL, (void*)ID_CTRL, 
-		   FL_MENU_TOGGLE | (menuCtrlKey?FL_MENU_VALUE:0));
-  contextMenu->add(_("&Alt"), 0, NULL, (void*)ID_ALT,
-		   FL_MENU_TOGGLE | (menuAltKey?FL_MENU_VALUE:0));
-
-  if (menuKeySym) {
-    char sendMenuKey[64];
-    snprintf(sendMenuKey, 64, _("Send %s"), (const char *)menuKey);
-    contextMenu->add(sendMenuKey, 0, NULL, (void*)ID_MENUKEY, 0);
-    contextMenu->add("Secret shortcut menu key", menuKeyCode, NULL, (void*)ID_MENUKEY, FL_MENU_INVISIBLE);
+    case ID_CTRL:
+      if (menuCtrlKey)
+        items[i].flags |= FL_MENU_VALUE;
+      break;
+    case ID_ALT:
+      if (menuAltKey)
+        items[i].flags |= FL_MENU_VALUE;
+      break;
+    }
   }
 
-  contextMenu->add(_("Send Ctrl-Alt-&Del"), 0, NULL, (void*)ID_CTRLALTDEL, FL_MENU_DIVIDER);
+  // The menu key needs to have its fields updated, or the entries removed
+  for (i = 0;i < sizeof(items)/sizeof(items[0]);i++) {
+    char sendMenuKey[64];
 
-  contextMenu->add(_("&Refresh screen"), 0, NULL, (void*)ID_REFRESH, FL_MENU_DIVIDER);
+    if ((intptr_t)items[i].user_data_ != ID_MENUKEY)
+      continue;
 
-  contextMenu->add(_("&Options..."), 0, NULL, (void*)ID_OPTIONS, 0);
-  contextMenu->add(_("Connection &info..."), 0, NULL, (void*)ID_INFO, 0);
-  contextMenu->add(_("About &TigerVNC viewer..."), 0, NULL, (void*)ID_ABOUT, FL_MENU_DIVIDER);
+    if (!menuKeySym) {
+      memmove(items + i, items + i + 1,
+              sizeof(items) - (sizeof(items[0]) * (i+1)));
+      i--;
+      continue;
+    }
 
-  contextMenu->add(_("Dismiss &menu"), 0, NULL, (void*)ID_DISMISS, 0);
+    if (items[i].flags & FL_MENU_INVISIBLE)
+      continue;
+
+    snprintf(sendMenuKey, 64, _("Send %s"), (const char *)menuKey);
+    free((void*)items[i].text);
+    items[i].text = strdup(sendMenuKey);
+  }
+
+  contextMenu->copy(items);
 }
 
 
