summaryrefslogtreecommitdiff
path: root/alpine/keymenu.c
diff options
context:
space:
mode:
Diffstat (limited to 'alpine/keymenu.c')
-rw-r--r--alpine/keymenu.c3961
1 files changed, 3961 insertions, 0 deletions
diff --git a/alpine/keymenu.c b/alpine/keymenu.c
new file mode 100644
index 00000000..929e6ada
--- /dev/null
+++ b/alpine/keymenu.c
@@ -0,0 +1,3961 @@
+#if !defined(lint) && !defined(DOS)
+static char rcsid[] = "$Id: keymenu.c 1074 2008-06-04 00:08:43Z hubert@u.washington.edu $";
+#endif
+
+/*
+ * ========================================================================
+ * Copyright 2006-2008 University of Washington
+ * Copyright 2013 Eduardo Chappa
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * ========================================================================
+ */
+
+#include "headers.h"
+#include "keymenu.h"
+#include "mailcmd.h"
+#include "signal.h"
+#include "status.h"
+#include "../pith/bitmap.h"
+#include "../pith/conf.h"
+#include "../pith/state.h"
+
+
+/*
+ * We put all of the keymenu definitions here so that it is easy to
+ * share them. The names are in keymenu.h, as well. Some of these
+ * aren't easily shareable because we modify them dynamically but
+ * here they are anyway. It's not altogether clear that this is a good idea.
+ * Perhaps it would be better to just define the keymenus multiple times
+ * in different source files even though they are the same, with static
+ * declarations.
+ *
+ * The key numbers are sometimes used symbolically, like OTHER_KEY. Those
+ * are in keymenu.h, too, and are hard to use. If you change a menu here
+ * be sure to check those key numbers that go with it in keymenu.h.
+ */
+
+#ifdef _WINDOWS
+void configure_menu_items (struct key_menu *, bitmap_t);
+#endif
+
+
+/*
+ * Macro to simplify instantiation of key_menu structs from key structs
+ */
+#define INST_KEY_MENU(X, Y) struct key_menu X = \
+ {sizeof(Y)/(sizeof(Y[0])*12), 0, 0, Y}
+
+struct key cancel_keys[] =
+ {HELP_MENU,
+ {"^C",N_("Cancel"),{MC_NONE},KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU};
+INST_KEY_MENU(cancel_keymenu, cancel_keys);
+
+
+/*
+ * A bunch of these are NULL_MENU because we want to change them dynamically.
+ */
+struct key ab_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: go to Previous Entry */
+ {"P", N_("PrevEntry"), {MC_PREVITEM,1,{'p'}}, KS_NONE},
+ /* TRANSLATORS: go to Next Entry */
+ {"N", N_("NextEntry"), {MC_NEXTITEM,1,{'n'}}, KS_NONE},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ QUIT_MENU,
+ NULL_MENU,
+ LISTFLD_MENU,
+ GOTO_MENU,
+ INDEX_MENU,
+ RCOMPOSE_MENU,
+ PRYNTTXT_MENU,
+ NULL_MENU,
+ SAVE_MENU,
+ FORWARD_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ /* TRANSLATORS: Select this Entry */
+ {";",N_("Select"),{MC_SELECT,1,{';'}},KS_NONE},
+ /* TRANSLATORS: Apply a command to several objects at once */
+ {"A",N_("Apply"),{MC_APPLY,1,{'a'}},KS_APPLY},
+ /* TRANSLATORS: Select Current entry */
+ {":",N_("SelectCur"),{MC_SELCUR,1,{':'}},KS_SELECTCUR},
+ /* TRANSLATORS: Zoom refers to zooming in on a smaller set of
+ items, like with a camera zoom lense */
+ {"Z",N_("ZoomMode"),{MC_ZOOM,1,{'z'}},KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU};
+INST_KEY_MENU(ab_keymenu, ab_keys);
+
+
+struct key abook_select_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ {"E", N_("Exit"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ {"S", "[" N_("Select") "]", {MC_CHOICE,3,{'s',ctrl('M'),ctrl('J')}}, KS_NONE},
+ /* TRANSLATORS: go to Previous entry */
+ {"P", N_("Prev"), {MC_PREVITEM, 1, {'p'}}, KS_NONE},
+ {"N", N_("Next"), {MC_NEXTITEM, 2, {'n', TAB}}, KS_NONE},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ NULL_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(abook_select_km, abook_select_keys);
+
+
+struct key abook_view_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ /* TRANSLATORS: Abook is an abbreviation for Address Book */
+ {"<",N_("Abook"),{MC_EXIT,2,{'<',','}},KS_NONE},
+ {"U",N_("Update"),{MC_EDIT,1,{'u'}},KS_NONE},
+ /* TRANSLATORS: ComposeTo means to start editing a new message to
+ this address book entry */
+ {"C",N_("ComposeTo"),{MC_COMPOSE,1,{'c'}},KS_COMPOSER},
+ RCOMPOSE_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+ /* TRANSLATORS: abbreviation for Forward as Email */
+ {"F", N_("Fwd Email"), {MC_FORWARD, 1, {'f'}}, KS_FORWARD},
+ SAVE_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ /* TRANSLATORS: View the highlighted link, for example, a URL */
+ {"V",N_("ViewLink"),{MC_VIEW_HANDLE,3,{'v',ctrl('m'),ctrl('j')}},KS_NONE},
+ NULL_MENU,
+ /* TRANSLATORS: go to the previous link, for example, the previous URL */
+ {"^B",N_("PrevLink"),{MC_PREV_HANDLE,1,{ctrl('B')}},KS_NONE},
+ {"^F",N_("NextLink"),{MC_NEXT_HANDLE,1,{ctrl('F')}},KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU};
+INST_KEY_MENU(abook_view_keymenu, abook_view_keys);
+
+
+struct key abook_text_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ {"E",N_("Exit Viewer"),{MC_EXIT,1,{'e'}},KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+ FWDEMAIL_MENU,
+ {"S", N_("Save"), {MC_SAVETEXT,1,{'s'}}, KS_SAVE}};
+INST_KEY_MENU(abook_text_km, abook_text_keys);
+
+
+struct key ldap_view_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ /* TRANSLATORS: go back to the index of results instead of
+ viewing this particular entry */
+ {"<",N_("Results Index"),{MC_EXIT,2,{'<',','}},KS_NONE},
+ NULL_MENU,
+ {"C", N_("ComposeTo"), {MC_COMPOSE,1,{'c'}}, KS_COMPOSER},
+ RCOMPOSE_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+ FWDEMAIL_MENU,
+ SAVE_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ {"V",N_("ViewLink"),{MC_VIEW_HANDLE,3,{'v',ctrl('m'),ctrl('j')}},KS_NONE},
+ NULL_MENU,
+ {"^B",N_("PrevLink"),{MC_PREV_HANDLE,1,{ctrl('B')}},KS_NONE},
+ {"^F",N_("NextLink"),{MC_NEXT_HANDLE,1,{ctrl('F')}},KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(ldap_view_keymenu, ldap_view_keys);
+
+
+struct key context_mgr_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"<", N_("Main Menu"), {MC_MAIN,3,{'m','<',','}}, KS_EXITMODE},
+ /* TRANSLATORS: View this Collection of folders */
+ {">", "[" N_("View Cltn") "]",
+ {MC_CHOICE,5,{'v','>','.',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREVC_MENU,
+ NEXTC_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ QUIT_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ GOTO_MENU,
+ CIND_MENU,
+ COMPOSE_MENU,
+ PRYNTTXT_MENU,
+ RCOMPOSE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(c_mgr_km, context_mgr_keys);
+
+
+struct key context_cfg_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"E", N_("Exit Setup"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ {"C", "[" N_("Change") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREVC_MENU,
+ NEXTC_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ /* TRANSLATORS; Add a Collection of folders */
+ {"A", N_("Add Cltn"), {MC_ADD,1,{'a'}}, KS_NONE},
+ DELC_MENU,
+ /* TRANSLATORS; Change the order of items in a list */
+ {"$", N_("Shuffle"), {MC_SHUFFLE,1,{'$'}},KS_NONE},
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ PRYNTTXT_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(c_cfg_km, context_cfg_keys);
+
+
+struct key context_select_keys[] =
+ {HELP_MENU,
+ {"E", N_("ExitSelect"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ NULL_MENU,
+ /* TRANSLATORS: View this collection */
+ {">", "[" N_("View Cltn") "]",
+ {MC_CHOICE, 5, {'v','>','.',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREVC_MENU,
+ NEXTC_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ NULL_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(c_sel_km, context_select_keys);
+
+
+struct key context_fcc_keys[] =
+ {HELP_MENU,
+ {"E", N_("ExitSelect"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ NULL_MENU,
+ {">", "[" N_("View Cltn") "]",
+ {MC_CHOICE, 5, {'v','>','.',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREVC_MENU,
+ NEXTC_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ NULL_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(c_fcc_km, context_fcc_keys);
+
+static struct key quota_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ {"E","Exit",{MC_EXIT,3,{'e','i',ctrl('C')}},KS_EXITMODE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU};
+INST_KEY_MENU(pine_quota_keymenu, quota_keys);
+
+struct key folder_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"<", NULL, {MC_EXIT,2,{'<',','}}, KS_NONE},
+ {">", NULL, {MC_CHOICE,2,{'>','.'}}, KS_NONE},
+ PREVF_MENU,
+ NEXTF_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ /* TRANSLATORS: make an addition, for example add a new folder
+ or a new entry in an address book */
+ {"A",N_("Add"),{MC_ADDFLDR,1,{'a'}},KS_NONE},
+ DELETE_MENU,
+ /* TRANSLATORS: change the name of something */
+ {"R",N_("Rename"),{MC_RENAMEFLDR,1,{'r'}}, KS_NONE},
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ QUIT_MENU,
+ MAIN_MENU,
+ {"V", "[" N_("View Fldr") "]", {MC_OPENFLDR}, KS_NONE},
+ GOTO_MENU,
+ CIND_MENU,
+ COMPOSE_MENU,
+ {"%", N_("Print"), {MC_PRINTFLDR,1,{'%'}}, KS_PRINT},
+ {"Z", N_("ZoomMode"), {MC_ZOOM,1,{'z'}}, KS_NONE},
+ {";",N_("Select"),{MC_SELECT,1,{';'}},KS_SELECT},
+ /* TRANSLATORS: Select current item */
+ {":",N_("SelectCur"),{MC_SELCUR,1,{':'}},KS_SELECT},
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ {"$", N_("Shuffle"), {MC_SHUFFLE,1,{'$'}},KS_NONE},
+ RCOMPOSE_MENU,
+ EXPORT_MENU,
+ /* TRANSLATORS: Import refers to bringing something in from
+ outside of alpine's normal world */
+ {"U", N_("Import"), {MC_IMPORT,1,{'u'}},KS_NONE},
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(folder_km, folder_keys);
+
+
+struct key folder_sel_keys[] =
+ {HELP_MENU,
+ {"E", N_("ExitSelect"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ NULL_MENU,
+ {NULL, NULL, {MC_CHOICE,0}, KS_NONE},
+ PREVF_MENU,
+ NEXTF_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"S", N_("Select"), {MC_OPENFLDR,1,{'s'}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(folder_sel_km, folder_sel_keys);
+
+
+struct key folder_sela_keys[] =
+ {HELP_MENU,
+ {"E", N_("ExitSelect"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ NULL_MENU,
+ {NULL, NULL, {MC_CHOICE,0}, KS_NONE},
+ PREVF_MENU,
+ NEXTF_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"S", N_("Select"), {MC_OPENFLDR,1,{'s'}}, KS_NONE},
+ NULL_MENU,
+ {"A", N_("AddNew"), {MC_ADD,1,{'a'}}, KS_NONE},
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(folder_sela_km, folder_sela_keys);
+
+
+struct key folder_sub_keys[] =
+ {HELP_MENU,
+ /* TRANSLATORS: Subscribe to a news group */
+ {"S", N_("Subscribe"), {MC_CHOICE,1,{'s'}}, KS_NONE},
+ /* TRANSLATORS: Exit Subscribe screen */
+ {"E", N_("ExitSubscb"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ {NULL, "[" N_("Select") "]", {MC_CHOICE,3,{'s',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREVF_MENU,
+ NEXTF_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ /* TRANSLATORS: List Mode in alpine is where you can select not just
+ one of something but you can select a whole list of something, for
+ example a whole list of addresses to send to. */
+ {"L", N_("List Mode"), {MC_LISTMODE, 1, {'l'}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(folder_sub_km, folder_sub_keys);
+
+
+struct key folder_post_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ {"E", N_("ExitSelect"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ {"S", "[" N_("Select") "]", {MC_CHOICE, 3, {'s',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREVF_MENU,
+ NEXTF_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ NULL_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(folder_post_km, folder_post_keys);
+
+
+struct key help_keys[] =
+ {MAIN_MENU,
+ {NULL,NULL,{MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ {NULL,NULL,{MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ {NULL,NULL,{MC_VIEW_HANDLE,3,{'v',ctrl('m'),ctrl('j')}},KS_NONE},
+ {"^B",N_("PrevLink"),{MC_PREV_HANDLE,1,{ctrl('B')}},KS_NONE},
+ {"^F",N_("NextLink"),{MC_NEXT_HANDLE,1,{ctrl('F')}},KS_NONE},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ PRYNTMSG_MENU,
+ {"Z",N_("Print All"),{MC_PRINTALL,1,{'z'}},KS_NONE},
+ {"N",N_("Name"),{MC_EXPORT,1,{'n'}},KS_NONE},
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(help_keymenu, help_keys);
+
+
+struct key rev_msg_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"E",N_("Exit Viewer"),{MC_EXIT,1,{'e'}},KS_EXITMODE},
+ NULL_MENU,
+ {"T",NULL,{MC_TOGGLE,1,{'t'}},KS_NONE},
+ {"D",NULL,{MC_JUMP,1,{'d'}},KS_NONE},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+ FWDEMAIL_MENU,
+ {"S", N_("Save"), {MC_SAVETEXT,1,{'s'}}, KS_SAVE},
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(rev_msg_keymenu, rev_msg_keys);
+
+
+struct key ans_certfail_keys[] =
+ {NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: Continue means to keep going. The user is paused to read
+ something and has to tell us to continue when they are finished. */
+ {"C","[" N_("Continue") "]",{MC_YES,3,{'c',ctrl('J'),ctrl('M')}},KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU};
+INST_KEY_MENU(ans_certfail_keymenu, ans_certfail_keys);
+
+
+struct key ans_certquery_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ {"Y",N_("Yes, continue"),{MC_YES,1,{'y'}},KS_NONE},
+ {"D","[" N_("Details") "]",{MC_VIEW_HANDLE,3,{'d',ctrl('M'),ctrl('J')}},KS_NONE},
+ {"N",N_("No"),{MC_NO,1,{'n'}},KS_NONE},
+ NULL_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+ FWDEMAIL_MENU,
+ {"S", N_("Save"), {MC_SAVETEXT,1,{'s'}}, KS_SAVE}};
+INST_KEY_MENU(ans_certquery_keymenu, ans_certquery_keys);
+
+
+struct key forge_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ {"Y",N_("Yes, continue"),{MC_YES,1,{'y'}},KS_NONE},
+ {"N",N_("No"),{MC_NO,1,{'n'}},KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+ FWDEMAIL_MENU,
+ {"S", N_("Save"), {MC_SAVETEXT,1,{'s'}}, KS_SAVE}};
+INST_KEY_MENU(forge_keymenu, forge_keys);
+
+
+struct key listmgr_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: Exit Command List */
+ {"E",N_("Exit CmdList"),{MC_EXIT,1,{'e'}},KS_EXITMODE},
+ {"Ret","[" N_("Try Command") "]",{MC_VIEW_HANDLE,3,
+ {ctrl('m'),ctrl('j'),KEY_RIGHT}},KS_NONE},
+ /* TRANSLATORS: go to Previous Command in list */
+ {"^B",N_("Prev Cmd"),{MC_PREV_HANDLE,1,{ctrl('B')}},KS_NONE},
+ /* TRANSLATORS: go to Next Command in list */
+ {"^F",N_("Next Cmd"),{MC_NEXT_HANDLE,1,{ctrl('F')}},KS_NONE},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(listmgr_keymenu, listmgr_keys);
+
+
+struct key index_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"<", NULL, {MC_FOLDERS,2,{'<',','}}, KS_NONE},
+ VIEWMSG_MENU,
+ PREVMSG_MENU,
+ NEXTMSG_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ DELETE_MENU,
+ UNDELETE_MENU,
+ REPLY_MENU,
+ FORWARD_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ MAIN_MENU,
+ QUIT_MENU,
+ COMPOSE_MENU,
+ GOTO_MENU,
+ TAB_MENU,
+ WHEREIS_MENU,
+ PRYNTMSG_MENU,
+ TAKE_MENU,
+ SAVE_MENU,
+ EXPORT_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ {"X",NULL,{MC_EXPUNGE,1,{'x'}},KS_NONE},
+ /* TRANSLATORS: this stands for unexclude which is the opposite
+ of the exclude command. Exclude eliminates some messages from
+ the view and unexclude gets them back. */
+ {"&",N_("unXclude"),{MC_UNEXCLUDE,1,{'&'}},KS_NONE},
+ {";",N_("Select"),{MC_SELECT,1,{';'}},KS_SELECT},
+ {"A",N_("Apply"),{MC_APPLY,1,{'a'}},KS_APPLY},
+ FLDRSORT_MENU,
+ JUMP_MENU,
+ HDRMODE_MENU,
+ BOUNCE_MENU,
+ FLAG_MENU,
+ PIPE_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ {":",N_("SelectCur"),{MC_SELCUR,1,{':'}},KS_SELECTCUR},
+ {"Z",N_("ZoomMode"),{MC_ZOOM,1,{'z'}},KS_ZOOM},
+ LISTFLD_MENU,
+ RCOMPOSE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: toggles a collapsed view or an expanded view
+ of a message thread on and off */
+ {"/",N_("Collapse/Expand"),{MC_COLLAPSE,1,{'/'}},KS_NONE},
+ {"@", N_("Quota"), {MC_QUOTA,1,{'@'}}, KS_NONE},
+ NULL_MENU};
+INST_KEY_MENU(index_keymenu, index_keys);
+
+
+struct key simple_index_keys[] =
+ {HELP_MENU,
+ {"E",N_("ExitSelect"),{MC_EXIT,1,{'e'}},KS_EXITMODE},
+ NULL_MENU,
+ {"S","[" N_("Select") "]",{MC_SELECT,3,{'s',ctrl('M'),ctrl('J')}},KS_SELECT},
+ PREVMSG_MENU,
+ NEXTMSG_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ DELETE_MENU,
+ UNDELETE_MENU,
+ WHEREIS_MENU,
+ NULL_MENU};
+INST_KEY_MENU(simple_index_keymenu, simple_index_keys);
+
+
+struct key thread_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ /* TRANSLATORS: go to the Folder List */
+ {"<", N_("FldrList"), {MC_FOLDERS,2,{'<',','}}, KS_NONE},
+ /* TRANSLATORS: View a Thread of messages */
+ {">", "[" N_("ViewThd") "]", {MC_VIEW_ENTRY,5,{'v','.','>',ctrl('M'),ctrl('J')}},
+ KS_VIEW},
+ /* TRANSLATORS: go to the Previous Thread */
+ {"P", N_("PrevThd"), {MC_PREVITEM, 1, {'p'}}, KS_PREVMSG},
+ /* TRANSLATORS: go to the Next Thread */
+ {"N", N_("NextThd"), {MC_NEXTITEM, 1, {'n'}}, KS_NEXTMSG},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ DELETE_MENU,
+ UNDELETE_MENU,
+ REPLY_MENU,
+ FORWARD_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ MAIN_MENU,
+ QUIT_MENU,
+ COMPOSE_MENU,
+ GOTO_MENU,
+ TAB_MENU,
+ WHEREIS_MENU,
+ PRYNTMSG_MENU,
+ TAKE_MENU,
+ SAVE_MENU,
+ EXPORT_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ {"X",NULL,{MC_EXPUNGE,1,{'x'}},KS_NONE},
+ {"&",N_("unXclude"),{MC_UNEXCLUDE,1,{'&'}},KS_NONE},
+ {";",N_("Select"),{MC_SELECT,1,{';'}},KS_SELECT},
+ {"A",N_("Apply"),{MC_APPLY,1,{'a'}},KS_APPLY},
+ FLDRSORT_MENU,
+ JUMP_MENU,
+ HDRMODE_MENU,
+ BOUNCE_MENU,
+ FLAG_MENU,
+ PIPE_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ {":",N_("SelectCur"),{MC_SELCUR,1,{':'}},KS_SELECTCUR},
+ {"Z",N_("ZoomMode"),{MC_ZOOM,1,{'z'}},KS_ZOOM},
+ LISTFLD_MENU,
+ RCOMPOSE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ NULL_MENU,
+ {"/",N_("Collapse/Expand"),{MC_COLLAPSE,1,{'/'}},KS_NONE},
+ {"@", N_("Quota"), {MC_QUOTA,1,{'@'}}, KS_NONE},
+ NULL_MENU};
+INST_KEY_MENU(thread_keymenu, thread_keys);
+
+
+struct key att_index_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"<",NULL,{MC_EXIT,2,{'<',','}},KS_EXITMODE},
+ {">","[" N_("View") "]",{MC_VIEW_ATCH,5,{'v','>','.',ctrl('M'),ctrl('J')}},
+ KS_VIEW},
+ /* TRANSLATORS: go to Previous Attachment */
+ {"P", N_("PrevAttch"),{MC_PREVITEM,4,{'p',ctrl('B'),ctrl('P'),KEY_UP}},
+ KS_PREVMSG},
+ /* TRANSLATORS: go to Next Attachment */
+ {"N", N_("NextAtch"),
+ {MC_NEXTITEM, 5, {'n','\t',ctrl('F'),ctrl('N'), KEY_DOWN}},
+ KS_NEXTMSG},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ DELETE_MENU,
+ UNDELETE_MENU,
+ {"S", N_("Save"), {MC_SAVETEXT,1,{'s'}}, KS_SAVE},
+ {NULL, NULL, {MC_EXPORT, 1, {'e'}}, KS_EXPORT},
+
+ HELP_MENU,
+ OTHER_MENU,
+ MAIN_MENU,
+ QUIT_MENU,
+ PIPE_MENU,
+ BOUNCE_MENU,
+ /* TRANSLATORS: About Attachment, a short description of the attachment */
+ {"A",N_("AboutAttch"),{MC_ABOUTATCH,1,{'a'}},KS_NONE},
+ WHEREIS_MENU,
+ {"%", N_("Print"), {MC_PRINTMSG,1,{'%'}}, KS_PRINT},
+ INDEX_MENU,
+ REPLY_MENU,
+ FORWARD_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ HDRMODE_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU};
+INST_KEY_MENU(att_index_keymenu, att_index_keys);
+
+
+struct key att_view_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"<",NULL,{MC_EXIT,2,{'<',','}},KS_EXITMODE},
+ /* TRANSLATORS: View highlighted URL */
+ {"Ret","[" N_("View Hilite") "]",{MC_VIEW_HANDLE,3,
+ {ctrl('m'),ctrl('j'),KEY_RIGHT}},KS_NONE},
+ /* TRANSLATORS: go to Previous URL */
+ {"^B",N_("Prev URL"),{MC_PREV_HANDLE,1,{ctrl('B')}},KS_NONE},
+ /* TRANSLATORS: go to Next URL */
+ {"^F",N_("Next URL"),{MC_NEXT_HANDLE,1,{ctrl('F')}},KS_NONE},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ DELETE_MENU,
+ UNDELETE_MENU,
+ SAVE_MENU,
+ EXPORT_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ MAIN_MENU,
+ QUIT_MENU,
+ PIPE_MENU,
+ BOUNCE_MENU,
+ HDRMODE_MENU,
+ WHEREIS_MENU,
+ {"%", N_("Print"), {MC_PRINTMSG,1,{'%'}}, KS_PRINT},
+ NULL_MENU,
+ REPLY_MENU,
+ FORWARD_MENU};
+INST_KEY_MENU(att_view_keymenu, att_view_keys);
+
+
+struct key view_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ /* TRANSLATORS: go to Message Index */
+ {"<",N_("MsgIndex"),{MC_INDEX,3,{'i','<',','}},KS_FLDRINDEX},
+ /* TRANSLATORS: View the Attachment */
+ {">",N_("ViewAttch"),{MC_VIEW_ATCH,3,{'v','>','.'}},KS_NONE},
+ PREVMSG_MENU,
+ NEXTMSG_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ DELETE_MENU,
+ UNDELETE_MENU,
+ REPLY_MENU,
+ FORWARD_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ MAIN_MENU,
+ QUIT_MENU,
+ LISTFLD_MENU,
+ GOTO_MENU,
+ COMPOSE_MENU,
+ WHEREIS_MENU,
+ PRYNTMSG_MENU,
+ TAKE_MENU,
+ SAVE_MENU,
+ EXPORT_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ /* TRANSLATORS: View the highlighted URL */
+ {"Ret","[" N_("View Hilite") "]",{MC_VIEW_HANDLE,3,
+ {ctrl('m'),ctrl('j'),KEY_RIGHT}},KS_NONE},
+ /* TRANSLATORS: Select the current item */
+ {":",N_("SelectCur"),{MC_SELCUR,1,{':'}},KS_SELECTCUR},
+ /* TRANSLATORS: go to previous URL */
+ {"^B",N_("Prev URL"),{MC_PREV_HANDLE,1,{ctrl('B')}},KS_NONE},
+ /* TRANSLATORS: go to next URL */
+ {"^F",N_("Next URL"),{MC_NEXT_HANDLE,1,{ctrl('F')}},KS_NONE},
+ JUMP_MENU,
+ TAB_MENU,
+ HDRMODE_MENU,
+ BOUNCE_MENU,
+ FLAG_MENU,
+ PIPE_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ RCOMPOSE_MENU,
+ {"A",N_("TogglePreferPlain"),{MC_TOGGLE,1,{'a'}},KS_NONE},
+#ifdef SMIME
+ {"^D","Decrypt", {MC_DECRYPT,1,{ctrl('d')},KS_NONE}},
+ {"^E","Security", {MC_SECURITY,1,{ctrl('e')},KS_NONE}},
+#else
+ NULL_MENU,
+ NULL_MENU,
+#endif
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU};
+INST_KEY_MENU(view_keymenu, view_keys);
+
+
+struct key simple_text_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"E",N_("Exit Viewer"),{MC_EXIT,1,{'e'}},KS_EXITMODE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+ FWDEMAIL_MENU,
+ {"S", N_("Save"), {MC_SAVETEXT,1,{'s'}}, KS_SAVE},
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(simple_text_keymenu, simple_text_keys);
+
+
+struct key oe_keys[] =
+ {{"^G",N_("Help"),{MC_NONE},KS_SCREENHELP},
+ {"^C",N_("Cancel"),{MC_NONE},KS_NONE},
+ {"^T","xxx",{MC_NONE},KS_NONE},
+ /* TRANSLATORS: The user is entering characters, for example, the
+ name of a folder. Accept means the user is done and wants to
+ accept what is currently displayed. */
+ {"Ret",N_("Accept"),{MC_NONE},KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU};
+INST_KEY_MENU(oe_keymenu, oe_keys);
+
+
+struct key choose_setup_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"E",N_("Exit Setup"),{MC_EXIT,2,{'e',ctrl('C')}},KS_EXITMODE},
+ {"P",N_("Printer"),{MC_PRINTER,1,{'p'}},KS_NONE},
+ /* TRANSLATORS: Change password */
+ {"N",N_("Newpassword"),{MC_PASSWD,1,{'n'}},KS_NONE},
+ /* TRANSLATORS: Configure Alpine */
+ {"C",N_("Config"),{MC_CONFIG,1,{'c'}},KS_NONE},
+ /* TRANSLATORS: Edit signature block */
+ {"S",N_("Signature"),{MC_SIG,1,{'s'}},KS_NONE},
+ /* TRANSLATORS: configure address books */
+ {"A",N_("AddressBooks"),{MC_ABOOKS,1,{'a'}},KS_NONE},
+ /* TRANSLATORS: configure collection lists */
+ {"L",N_("collectionList"),{MC_CLISTS,1,{'l'}},KS_NONE},
+ /* TRANSLATORS: configure rules, an alpine concept */
+ {"R",N_("Rules"),{MC_RULES,1,{'r'}},KS_NONE},
+ /* TRANSLATORS: configure directory servers */
+ {"D",N_("Directory"),{MC_DIRECTORY,1,{'d'}},KS_NONE},
+ /* TRANSLATORS: configure color */
+ {"K",N_("Kolor"),{MC_KOLOR,1,{'k'}},KS_NONE},
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: remote configuration setup */
+ {"Z",N_("RemoteConfigSetup"),{MC_REMOTE,1,{'z'}},KS_NONE},
+ /* TRANSLATORS: configure S/MIME */
+ {"M",N_("S/Mime"),{MC_SECURITY,1,{'m'}},KS_NONE},
+ NULL_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(choose_setup_keymenu, choose_setup_keys);
+
+
+struct key main_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: go to Previous Command in list */
+ {"P",N_("PrevCmd"),{MC_PREVITEM,3,{'p',ctrl('P'),KEY_UP}},KS_NONE},
+ {"N",N_("NextCmd"),{MC_NEXTITEM,3,{'n',ctrl('N'),KEY_DOWN}},KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: show release notes */
+ {"R",N_("RelNotes"),{MC_RELNOTES,1,{'r'}},KS_NONE},
+ /* TRANSLATORS: lock keyboard */
+ {"K",N_("KBLock"),{MC_KBLOCK,1,{'k'}},KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ QUIT_MENU,
+ COMPOSE_MENU,
+ LISTFLD_MENU,
+ GOTO_MENU,
+ {"I",N_("Index"),{MC_INDEX,1,{'i'}},KS_FLDRINDEX},
+ /* TRANSLATORS: go to the Journal. The Journal shows past
+ messages that alpine has shown the user. */
+ {"J",N_("Journal"),{MC_JOURNAL,1,{'j'}},KS_REVIEW},
+ /* TRANSLATORS: go to the Setup screen */
+ {"S",N_("Setup"),{MC_SETUP,1,{'s'}},KS_NONE},
+ /* TRANSLATORS: go to the address book screen */
+ {"A",N_("AddrBook"),{MC_ADDRBOOK,1,{'a'}},KS_ADDRBOOK},
+ RCOMPOSE_MENU,
+ NULL_MENU};
+INST_KEY_MENU(main_keymenu, main_keys);
+
+
+struct key simple_file_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"Q",N_("Quit Viewer"),{MC_EXIT,1,{'q'}},KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+ FWDEMAIL_MENU,
+ {"S", N_("Save"), {MC_SAVETEXT,1,{'s'}}, KS_SAVE},
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(simple_file_keymenu, simple_file_keys);
+
+
+struct key nuov_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"E",NULL,{MC_EXIT,1,{'e',ctrl('M'),ctrl('J')}},KS_NONE},
+ /* TRANSLATORS: Alpine asks the user to be counted when they
+ first start using alpine. */
+ {"Ret","[" N_("Be Counted!") "]",{MC_VIEW_HANDLE,2,{ctrl('M'),ctrl('J')}},KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ PRYNTMSG_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: show release notes */
+ {"R",N_("RelNotes"),{MC_RELNOTES,1,{'r'}},KS_NONE},
+ NULL_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(nuov_keymenu, nuov_keys);
+
+
+struct key modal_message_keys[] =
+ {NULL_MENU,
+ NULL_MENU,
+ {"Ret",N_("Finished"),{MC_EXIT,2,{ctrl('m'),ctrl('j')}},KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(modal_message_keymenu, modal_message_keys);
+
+
+struct key ta_keys_lm[] =
+ {HELP_MENU,
+ WHEREIS_MENU,
+ TA_EXIT_MENU,
+ /* TRANSLATORS: Take this address into the address book */
+ {"T", N_("Take"), {MC_TAKE,1,{'t'}}, KS_NONE},
+ TA_PREV_MENU,
+ TA_NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"X","[" N_("Set/Unset") "]", {MC_CHOICE,3,{'x',ctrl('M'),ctrl('J')}}, KS_NONE},
+ {"A", N_("SetAll"),{MC_SELALL,1,{'a'}},KS_NONE},
+ {"U",N_("UnSetAll"),{MC_UNSELALL,1,{'u'}},KS_NONE},
+ /* TRANSLATORS: The Take Address screen has a Single mode and a
+ List mode. This command causes us to go into Single mode. */
+ {"S",N_("SinglMode"),{MC_LISTMODE,1,{'s'}},KS_NONE}};
+INST_KEY_MENU(ta_keymenu_lm, ta_keys_lm);
+
+
+struct key ta_keys_sm[] =
+ {HELP_MENU,
+ WHEREIS_MENU,
+ TA_EXIT_MENU,
+ {"T","[" N_("Take") "]",{MC_TAKE,3,{'t',ctrl('M'),ctrl('J')}}, KS_NONE},
+ TA_PREV_MENU,
+ TA_NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: The Take Address screen has a Single mode and a
+ List mode. This command causes us to go into List mode. */
+ {"L",N_("ListMode"),{MC_LISTMODE,1,{'l'}},KS_NONE}};
+INST_KEY_MENU(ta_keymenu_sm, ta_keys_sm);
+
+
+struct key pipe_cancel_keys[] =
+ {NULL_MENU,
+ {"^C",N_("Stop Waiting"),{MC_NONE},KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU};
+INST_KEY_MENU(pipe_cancel_keymenu, pipe_cancel_keys);
+
+
+struct key color_pattern_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ /* TRANSLATORS: Change Value */
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: Delete Value */
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(color_pattern_keymenu, color_pattern_keys);
+
+
+struct key hdr_color_checkbox_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ EXIT_SETUP_MENU,
+ TOGGLEB_MENU,
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(hdr_color_checkbox_keymenu, hdr_color_checkbox_keys);
+
+
+struct key kw_color_checkbox_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ EXIT_SETUP_MENU,
+ TOGGLEC_MENU,
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(kw_color_checkbox_keymenu, kw_color_checkbox_keys);
+
+
+struct key selectable_bold_checkbox_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ EXIT_SETUP_MENU,
+ TOGGLED_MENU,
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(selectable_bold_checkbox_keymenu, selectable_bold_checkbox_keys);
+
+
+struct key flag_keys[] =
+ {HELP_MENU,
+ {"A", N_("Add KW"), {MC_ADD,1,{'a'}}, KS_NONE},
+ /* TRANSLATORS: Exit from the Flags screen */
+ {"E", N_("Exit Flags"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ TOGGLE_MENU,
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(flag_keymenu, flag_keys);
+
+
+struct key addr_select_keys[] =
+ {HELP_MENU,
+ {"E", N_("ExitSelect"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ NULL_MENU,
+ {"S", "[" N_("Select") "]", {MC_CHOICE,3,{'s',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ NULL_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(addr_s_km, addr_select_keys);
+
+
+struct key addr_select_with_goback_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: go to address book list */
+ {"<", N_("AddressBkList"), {MC_ADDRBOOK,2,{'<',','}}, KS_NONE},
+ {"S", "[" N_("Select") "]", {MC_CHOICE,3,{'s',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ {"E", N_("ExitSelect"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ WHEREIS_MENU};
+INST_KEY_MENU(addr_s_km_with_goback, addr_select_with_goback_keys);
+
+static struct key addr_select_with_view_keys[] =
+ {HELP_MENU,
+ RCOMPOSE_MENU,
+ {"<", N_("AddressBkList"), {MC_ADDRBOOK,2,{'<',','}}, KS_NONE},
+ {">", "[" N_("View") "]",
+ {MC_VIEW_TEXT,5,{'v','>','.',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ /* TRANSLATORS: compose a message to the current address */
+ {"C", N_("ComposeTo"), {MC_COMPOSE,1,{'c'}}, KS_COMPOSER},
+ FWDEMAIL_MENU,
+ SAVE_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(addr_s_km_with_view, addr_select_with_view_keys);
+
+
+struct key addr_select_for_url_keys[] =
+ {HELP_MENU,
+ RCOMPOSE_MENU,
+ {"<", N_("Exit Viewer"), {MC_ADDRBOOK,3,{'<',',','e'}}, KS_NONE},
+ {">", "[" N_("View") "]",
+ {MC_VIEW_TEXT,5,{'v','>','.',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"C", N_("ComposeTo"), {MC_COMPOSE,1,{'c'}}, KS_COMPOSER},
+ FWDEMAIL_MENU,
+ SAVE_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(addr_s_km_for_url, addr_select_for_url_keys);
+
+
+struct key addr_select_exit_keys[] =
+ {NULL_MENU,
+ NULL_MENU,
+ {"E", "[" N_("Exit") "]", {MC_EXIT,3,{'e',ctrl('M'),ctrl('J')}},
+ KS_EXITMODE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU};
+INST_KEY_MENU(addr_s_km_exit, addr_select_exit_keys);
+
+
+struct key addr_select_goback_keys[] =
+ {NULL_MENU,
+ NULL_MENU,
+ {"E", "[" N_("Exit") "]", {MC_ADDRBOOK,3,{'e',ctrl('M'),ctrl('J')}},
+ KS_EXITMODE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU};
+INST_KEY_MENU(addr_s_km_goback, addr_select_goback_keys);
+
+
+struct key config_text_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add Value"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_text_keymenu, config_text_keys);
+
+
+struct key config_text_to_charsets_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add Value"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: go to list of keywords */
+ {"T", N_("ToCharsets"), {MC_CHOICE, 2, {'t', ctrl('T')}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_text_to_charsets_keymenu, config_text_to_charsets_keys);
+
+
+struct key direct_config_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ {"E", N_("Exit Setup"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ {"C", "[" N_("Change") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ /* TRANSLATORS: go to previous LDAP directory server in the list */
+ {"P", N_("PrevDir"), {MC_PREVITEM, 1, {'p'}}, KS_NONE},
+ {"N", N_("NextDir"), {MC_NEXTITEM, 2, {'n', TAB}}, KS_NONE},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ /* TRANSLATORS: add a directory server to configuration */
+ {"A", N_("Add Dir"), {MC_ADD,1,{'a'}}, KS_NONE},
+ /* TRANSLATORS: delete a directory */
+ {"D", N_("Del Dir"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ {"$", N_("Shuffle"), {MC_SHUFFLE,1,{'$'}}, KS_NONE},
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(dir_conf_km, direct_config_keys);
+
+
+struct key sel_from_list_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ {"E", N_("Exit"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ {"S", "[" N_("Select") "]", {MC_SELECT,3,{'s',ctrl('J'),ctrl('M')}}, KS_NONE},
+ {"P", N_("Prev"), {MC_PREVITEM, 1, {'p'}}, KS_NONE},
+ {"N", N_("Next"), {MC_NEXTITEM, 2, {'n', TAB}}, KS_NONE},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(sel_from_list, sel_from_list_keys);
+
+
+struct key sel_from_list_keys_ctrlc[] =
+ {HELP_MENU,
+ NULL_MENU,
+ {"^C", N_("exit"), {MC_EXIT,1,{ctrl('C')}}, KS_EXITMODE},
+ {"S", "[" N_("Select") "]", {MC_SELECT,3,{'s',ctrl('J'),ctrl('M')}}, KS_NONE},
+ {"P", N_("Prev"), {MC_PREVITEM, 1, {'p'}}, KS_NONE},
+ {"N", N_("Next"), {MC_NEXTITEM, 2, {'n', TAB}}, KS_NONE},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(sel_from_list_ctrlc, sel_from_list_keys_ctrlc);
+
+
+struct key sel_from_list_keys_sm[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"E", N_("Exit"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ {"S", "[" N_("Select") "]", {MC_SELECT,3,{'s',ctrl('J'),ctrl('M')}}, KS_NONE},
+ {"P", N_("Prev"), {MC_PREVITEM, 1, {'p'}}, KS_NONE},
+ {"N", N_("Next"), {MC_NEXTITEM, 2, {'n', TAB}}, KS_NONE},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ NULL_MENU,
+ {"L",N_("ListMode"),{MC_LISTMODE,1,{'l'}},KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(sel_from_list_sm, sel_from_list_keys_sm);
+
+
+struct key sel_from_list_keys_sm_ctrlc[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"^C", N_("exit"), {MC_EXIT,1,{ctrl('C')}}, KS_EXITMODE},
+ {"S", "[" N_("Select") "]", {MC_SELECT,3,{'s',ctrl('J'),ctrl('M')}}, KS_NONE},
+ {"P", N_("Prev"), {MC_PREVITEM, 1, {'p'}}, KS_NONE},
+ {"N", N_("Next"), {MC_NEXTITEM, 2, {'n', TAB}}, KS_NONE},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ NULL_MENU,
+ {"L",N_("ListMode"),{MC_LISTMODE,1,{'l'}},KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(sel_from_list_sm_ctrlc, sel_from_list_keys_sm_ctrlc);
+
+
+struct key sel_from_list_keys_lm[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"E", N_("Exit"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ {"S", "[" N_("Select") "]", {MC_SELECT,3,{'s',ctrl('J'),ctrl('M')}}, KS_NONE},
+ {"P", N_("Prev"), {MC_PREVITEM, 1, {'p'}}, KS_NONE},
+ {"N", N_("Next"), {MC_NEXTITEM, 2, {'n', TAB}}, KS_NONE},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"X", N_("Set/Unset"), {MC_TOGGLE,1,{'x'}}, KS_NONE},
+ {"1",N_("SinglMode"),{MC_LISTMODE,1,{'1'}},KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(sel_from_list_lm, sel_from_list_keys_lm);
+
+
+struct key sel_from_list_keys_lm_ctrlc[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"^C", N_("exit"), {MC_EXIT,1,{ctrl('C')}}, KS_EXITMODE},
+ {"S", "[" N_("Select") "]", {MC_SELECT,3,{'s',ctrl('J'),ctrl('M')}}, KS_NONE},
+ {"P", N_("Prev"), {MC_PREVITEM, 1, {'p'}}, KS_NONE},
+ {"N", N_("Next"), {MC_NEXTITEM, 2, {'n', TAB}}, KS_NONE},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"X", N_("Set/Unset"), {MC_TOGGLE,1,{'x'}}, KS_NONE},
+ {"1",N_("SinglMode"),{MC_LISTMODE,1,{'1'}},KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(sel_from_list_lm_ctrlc, sel_from_list_keys_lm_ctrlc);
+
+
+struct key sel_from_list_keys_olm[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"E", N_("Exit"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ {"S", "[" N_("Select") "]", {MC_SELECT,3,{'s',ctrl('J'),ctrl('M')}}, KS_NONE},
+ {"P", N_("Prev"), {MC_PREVITEM, 1, {'p'}}, KS_NONE},
+ {"N", N_("Next"), {MC_NEXTITEM, 2, {'n', TAB}}, KS_NONE},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"X", N_("Set/Unset"), {MC_TOGGLE,1,{'x'}}, KS_NONE},
+ NULL_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(sel_from_list_olm, sel_from_list_keys_olm);
+
+
+struct key sel_from_list_keys_olm_ctrlc[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"^C", N_("exit"), {MC_EXIT,1,{ctrl('C')}}, KS_EXITMODE},
+ {"S", "[" N_("Select") "]", {MC_SELECT,3,{'s',ctrl('J'),ctrl('M')}}, KS_NONE},
+ {"P", N_("Prev"), {MC_PREVITEM, 1, {'p'}}, KS_NONE},
+ {"N", N_("Next"), {MC_NEXTITEM, 2, {'n', TAB}}, KS_NONE},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"X", N_("Set/Unset"), {MC_TOGGLE,1,{'x'}}, KS_NONE},
+ NULL_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(sel_from_list_olm_ctrlc, sel_from_list_keys_olm_ctrlc);
+
+
+#ifndef DOS
+
+struct key printer_edit_keys[] =
+ {HELP_MENU,
+ PRYNTTXT_MENU,
+ EXIT_SETUP_MENU,
+ {"S", "[" N_("Select") "]", {MC_CHOICE,3,{'s',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ /* TRANSLATORS: add a printer to configuration */
+ {"A", N_("Add Printer"), {MC_ADD,1,{'a'}}, KS_NONE},
+ /* TRANSLATORS: delete a printer from configuration */
+ {"D", N_("DeletePrint"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ {"C", N_("Change"), {MC_EDIT,1,{'c'}}, KS_NONE},
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(printer_edit_keymenu, printer_edit_keys);
+
+
+struct key printer_select_keys[] =
+ {HELP_MENU,
+ PRYNTTXT_MENU,
+ EXIT_SETUP_MENU,
+ {"S", "[" N_("Select") "]", {MC_CHOICE,3,{'s',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ NULL_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(printer_select_keymenu, printer_select_keys);
+
+#endif /* !DOS */
+
+
+struct key role_select_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ {"E", N_("Exit"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ NULL_MENU,
+ /* TRANSLATORS: go to previous Role in list */
+ {"P", N_("PrevRole"), {MC_PREVITEM, 1, {'p'}}, KS_NONE},
+ {"N", N_("NextRole"), {MC_NEXTITEM, 2, {'n', TAB}}, KS_NONE},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ {"D", "", {MC_TOGGLE, 1, {'d'}}, KS_NONE},
+ WHEREIS_MENU};
+INST_KEY_MENU(role_select_km, role_select_keys);
+
+
+struct key role_config_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"E", N_("Exit Setup"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ {"C", "[" N_("Change") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ /* TRANSLATORS: go to previous Rule in list */
+ {"P", N_("PrevRule"), {MC_PREVITEM, 1, {'p'}}, KS_NONE},
+ {"N", N_("NextRule"), {MC_NEXTITEM, 2, {'n', TAB}}, KS_NONE},
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ {"$", N_("Shuffle"), {MC_SHUFFLE,1,{'$'}}, KS_NONE},
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: Include a File from filesystem */
+ {"I", N_("IncludeFile"), {MC_ADDFILE,1,{'i'}}, KS_NONE},
+ {"X", N_("eXcludeFile"), {MC_DELFILE,1,{'x'}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ {"R", N_("Replicate"), {MC_COPY,1,{'r'}}, KS_NONE},
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(role_conf_km, role_config_keys);
+
+
+struct key config_text_wshuf_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add Value"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ {"$", N_("Shuffle"), {MC_SHUFFLE,1,{'$'}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_text_wshuf_keymenu, config_text_wshuf_keys);
+
+
+struct key config_text_wshufandfldr_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add Value"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ {"$", N_("Shuffle"), {MC_SHUFFLE,1,{'$'}}, KS_NONE},
+ {"T", N_("ToFldrs"), {MC_CHOICE,2,{'t', ctrl('T')}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_text_wshufandfldr_keymenu, config_text_wshufandfldr_keys);
+
+
+struct key config_role_file_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add Value"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: go to list of Files */
+ {"T", N_("ToFiles"), {MC_CHOICE, 2, {'t', ctrl('T')}}, KS_NONE},
+ /* TRANSLATORS: edit a file */
+ {"F", N_("editFile"), {MC_EDITFILE, 1, {'f'}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_role_file_keymenu, config_role_file_keys);
+
+
+struct key config_role_file_res_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add Value"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ {"T", N_("ToFiles"), {MC_CHOICE, 2, {'t', ctrl('T')}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_role_file_res_keymenu, config_role_file_res_keys);
+
+
+struct key config_role_keyword_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add Value"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: go to list of keywords */
+ {"T", N_("ToKeywords"), {MC_CHOICE, 2, {'t', ctrl('T')}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_role_keyword_keymenu, config_role_keyword_keys);
+
+
+struct key config_role_keyword_keys_not[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add Value"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ {"T", N_("ToKeywords"), {MC_CHOICE, 2, {'t', ctrl('T')}}, KS_NONE},
+ NULL_MENU,
+ /* TRANSLATORS: toggle between NOT and not NOT, turn NOT on or off */
+ {"!", N_("toggle NOT"), {MC_NOT,1,{'!'}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_role_keyword_keymenu_not, config_role_keyword_keys_not);
+
+
+struct key config_role_charset_keys_not[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add Value"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: go to list of character sets */
+ {"T", N_("ToCharSets"), {MC_CHOICE, 2, {'t', ctrl('T')}}, KS_NONE},
+ NULL_MENU,
+ {"!", N_("toggle NOT"), {MC_NOT,1,{'!'}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_role_charset_keymenu_not, config_role_charset_keys_not);
+
+
+struct key config_role_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add Value"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_role_keymenu, config_role_keys);
+
+
+struct key config_role_keys_not[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add Value"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: add extra headers to list */
+ {"X", N_("eXtraHdr"), {MC_ADDHDR, 1, {'x'}}, KS_NONE},
+ {"!", N_("toggle NOT"), {MC_NOT,1,{'!'}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_role_keymenu_not, config_role_keys_not);
+
+
+struct key config_role_keys_extra[] =
+ {HELP_MENU,
+ NULL_MENU,
+ EXIT_SETUP_MENU,
+ {"X", "[" N_("eXtraHdr") "]", {MC_ADDHDR, 3,{'x',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(config_role_keymenu_extra, config_role_keys_extra);
+
+
+struct key config_role_addr_pat_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add Value"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: go to address book to get address */
+ {"T", N_("ToAddrBk"), {MC_CHOICEB, 2, {'t', ctrl('T')}}, KS_NONE},
+ {"X", N_("eXtraHdr"), {MC_ADDHDR, 1, {'x'}}, KS_NONE},
+ {"!", N_("toggle NOT"), {MC_NOT,1,{'!'}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_role_addr_pat_keymenu, config_role_addr_pat_keys);
+
+
+struct key config_role_xtrahdr_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add Value"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ {"X", N_("eXtraHdr"), {MC_ADDHDR, 1, {'x'}}, KS_NONE},
+ {"!", N_("toggle NOT"), {MC_NOT,1,{'!'}}, KS_NONE},
+ NULL_MENU,
+ /* TRANSLATORS: remove a header we previously added */
+ {"R", N_("RemoveHdr"), {MC_DELHDR, 1, {'r'}}, KS_NONE},
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_role_xtrahdr_keymenu, config_role_xtrahdr_keys);
+
+
+struct key config_role_addr_act_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add Value"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ {"T", N_("ToAddrBk"), {MC_CHOICEC, 2, {'t', ctrl('T')}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_role_addr_act_keymenu, config_role_addr_act_keys);
+
+
+struct key config_role_patfolder_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add Value"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: go to list of folders */
+ {"T", N_("ToFldrs"), {MC_CHOICED, 2, {'t', ctrl('T')}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_role_patfolder_keymenu, config_role_patfolder_keys);
+
+
+struct key config_role_actionfolder_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add Value"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ {"T", N_("ToFldrs"), {MC_CHOICEE, 2, {'t', ctrl('T')}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_role_actionfolder_keymenu, config_role_actionfolder_keys);
+
+
+struct key config_role_inick_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add Value"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: go to list of nicknames */
+ {"T", N_("ToNicks"), {MC_CHOICE, 2, {'t', ctrl('T')}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_role_inick_keymenu, config_role_inick_keys);
+
+
+struct key config_role_afrom_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change Val") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("Add Value"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"D", N_("Delete Val"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: go to list of address books */
+ {"T", N_("ToAbookList"), {MC_CHOICE, 2, {'t', ctrl('T')}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_role_afrom_keymenu, config_role_afrom_keys);
+
+
+struct key config_checkbox_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ EXIT_SETUP_MENU,
+ TOGGLE_MENU,
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(config_checkbox_keymenu, config_checkbox_keys);
+
+
+struct key config_radiobutton_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ EXIT_SETUP_MENU,
+ {"*", "[" N_("Select") "]", {MC_CHOICE,3,{'*',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(config_radiobutton_keymenu, config_radiobutton_keys);
+
+
+struct key config_yesno_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change") "]", {MC_TOGGLE,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(config_yesno_keymenu, config_yesno_keys);
+
+
+struct key color_changing_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ {"E", N_("To Colors"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ {"*", "[" N_("Select") "]", {MC_CHOICE,3,{'*',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(color_changing_keymenu, color_changing_keys);
+
+
+struct key custom_color_changing_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ /* TRANSLATORS: go to color configuration screen */
+ {"E", N_("To Colors"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ {"*", "[" N_("Select") "]", {MC_CHOICEB,3,{'*',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(custom_color_changing_keymenu, custom_color_changing_keys);
+
+
+struct key kw_color_changing_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ {"E", N_("To Colors"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ {"*", "[" N_("Select") "]", {MC_CHOICEC,3,{'*',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(kw_color_changing_keymenu, kw_color_changing_keys);
+
+
+#ifdef _WINDOWS
+
+struct key color_rgb_changing_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"E", N_("To Colors"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ {"*", "[" N_("Select") "]", {MC_CHOICE,3,{'*',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"C", N_("Customize"), {MC_RGB1,1,{'c'}},KS_NONE},
+ NULL_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(color_rgb_keymenu, color_rgb_changing_keys);
+
+
+struct key custom_rgb_changing_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"E", N_("To Colors"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ {"*", "[" N_("Select") "]", {MC_CHOICEB,3,{'*',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"C", N_("Customize"), {MC_RGB2,1,{'c'}},KS_NONE},
+ NULL_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(custom_rgb_keymenu, custom_rgb_changing_keys);
+
+
+struct key kw_rgb_changing_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"E", N_("To Colors"), {MC_EXIT,1,{'e'}}, KS_EXITMODE},
+ {"*", "[" N_("Select") "]", {MC_CHOICEC,3,{'*',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"C", N_("Customize"), {MC_RGB3,1,{'c'}},KS_NONE},
+ NULL_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(kw_rgb_keymenu, kw_rgb_changing_keys);
+
+#endif
+
+
+struct key color_setting_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("AddHeader"), {MC_ADD,1,{'a'}}, KS_NONE},
+ /* TRANSLATORS: restore defaults */
+ {"R", N_("RestoreDefs"), {MC_DEFAULT,1,{'r'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(color_setting_keymenu, color_setting_keys);
+
+
+struct key custom_color_setting_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("AddHeader"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"R", N_("RestoreDefs"), {MC_DEFAULT,1,{'r'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ {"D", N_("DeleteHdr"), {MC_DELETE,1,{'d'}}, KS_NONE},
+ /* TRANSLATORS: shuffle headers (change the order of headers) */
+ {"$", N_("ShuffleHdr"), {MC_SHUFFLE,1,{'$'}}, KS_NONE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(custom_color_setting_keymenu, custom_color_setting_keys);
+
+
+struct key role_color_setting_keys[] =
+ {HELP_MENU,
+ NULL_MENU,
+ EXIT_SETUP_MENU,
+ {"*", "[" N_("Select") "]", {MC_CHOICE,3,{'*',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU,
+ PRYNTTXT_MENU,
+ WHEREIS_MENU};
+INST_KEY_MENU(role_color_setting_keymenu, role_color_setting_keys);
+
+
+struct key kw_color_setting_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ EXIT_SETUP_MENU,
+ {"C", "[" N_("Change") "]", {MC_EDIT,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"A", N_("AddHeader"), {MC_ADD,1,{'a'}}, KS_NONE},
+ {"R", N_("RestoreDefs"), {MC_DEFAULT,1,{'r'}}, KS_NONE},
+ PRYNTTXT_MENU,
+ WHEREIS_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(kw_color_setting_keymenu, kw_color_setting_keys);
+
+
+struct key take_export_keys_sm[] =
+ {HELP_MENU,
+ WHEREIS_MENU,
+ /* TRANSLATORS: exit the Take Address screen */
+ {"<",N_("ExitTake"), {MC_EXIT,4,{'e',ctrl('C'),'<',','}}, KS_EXITMODE},
+ {"T","[" N_("Take") "]",{MC_TAKE,3,{'t',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ {"L",N_("ListMode"),{MC_LISTMODE,1,{'l'}},KS_NONE}};
+INST_KEY_MENU(take_export_keymenu_sm, take_export_keys_sm);
+
+
+struct key take_export_keys_lm[] =
+ {HELP_MENU,
+ WHEREIS_MENU,
+ {"<",N_("ExitTake"), {MC_EXIT,4,{'e',ctrl('C'),'<',','}}, KS_EXITMODE},
+ {"T",N_("Take"), {MC_TAKE,1,{'t'}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ {"X","[" N_("Set/Unset") "]", {MC_CHOICE,3,{'x',ctrl('M'),ctrl('J')}}, KS_NONE},
+ {"A", N_("SetAll"),{MC_SELALL,1,{'a'}},KS_NONE},
+ {"U",N_("UnSetAll"),{MC_UNSELALL,1,{'u'}},KS_NONE},
+ {"S",N_("SinglMode"),{MC_LISTMODE,1,{'s'}},KS_NONE}};
+INST_KEY_MENU(take_export_keymenu_lm, take_export_keys_lm);
+
+
+struct key smime_info_keys[] =
+ {HELP_MENU,
+ OTHER_MENU,
+ {"<","Back",{MC_VIEW_TEXT,2,{'<',','}},KS_EXITMODE},
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+
+ HELP_MENU,
+ OTHER_MENU,
+ MAIN_MENU,
+ QUIT_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ INDEX_MENU,
+ NULL_MENU,
+ NULL_MENU};
+INST_KEY_MENU(smime_info_keymenu, smime_info_keys);
+
+
+struct key config_smime_helper_keys[] =
+ {HELP_MENU,
+ WHEREIS_MENU,
+ EXIT_SETUP_MENU,
+ {"T","[" N_("Transfer") "]", {MC_CHOICE,3,{'t',ctrl('M'),ctrl('J')}}, KS_NONE},
+ PREV_MENU,
+ NEXT_MENU,
+ PREVPAGE_MENU,
+ NEXTPAGE_MENU,
+ NULL_MENU,
+ NULL_MENU,
+ HOMEKEY_MENU,
+ ENDKEY_MENU};
+INST_KEY_MENU(config_smime_helper_keymenu, config_smime_helper_keys);
+
+
+/*
+ * Internal prototypes
+ */
+void output_keymenu(struct key_menu *, bitmap_t, int, int);
+void format_keymenu(struct key_menu *, bitmap_t, int);
+void menu_clear_cmd_binding(struct key_menu *, int);
+#ifdef MOUSE
+void print_inverted_label(int, MENUITEM *);
+#endif
+
+
+/* Saved key menu drawing state */
+static struct {
+ struct key_menu *km;
+ int row,
+ column,
+ blanked;
+ bitmap_t bitmap;
+} km_state;
+
+
+/*
+ * Longest label that can be displayed in keymenu
+ */
+#define MAX_LABEL 40
+#define MAX_KEYNAME 3
+static struct key last_time_buf[12];
+static int keymenu_is_dirty = 1;
+
+void
+mark_keymenu_dirty(void)
+{
+ keymenu_is_dirty = 1;
+}
+
+
+/*
+ * Write an already formatted key_menu to the screen
+ *
+ * Args: km -- key_menu structure
+ * bm -- bitmap, 0's mean don't draw this key
+ * row -- the row on the screen to begin on, negative values
+ * are counted from the bottom of the screen up
+ * column -- column on the screen to begin on
+ *
+ * The bits in the bitmap are used from least significant to most significant,
+ * not left to right. So, if you write out the bitmap in the normal way, for
+ * example,
+ * bm[0] = 0x5, bm[1] = 0x8, bm[2] = 0x21, bm[3] = bm[4] = bm[5] = 0
+ * 0000 0101 0000 1000 0010 0001 ...
+ * means that menu item 0 (first row, first column) is set, item 1 (2nd row,
+ * first column) is not set, item 2 is set, items 3-10 are not set, item 11
+ * (2nd row, 6th and last column) is set. In the second menu (the second set
+ * of 12 bits) items 0-3 are unset, 4 is set, 5-8 unset, 9 set, 10-11 unset.
+ * That uses up bm[0] - bm[2].
+ * Just to make sure, here it is drawn out for the first set of 12 items in
+ * the first keymenu (0-11)
+ * bm[0] x x x x x x x x bm[1] x x x x x x x x
+ * 7 6 5 4 3 2 1 0 1110 9 8
+ */
+void
+output_keymenu(struct key_menu *km, unsigned char *bm, int row, int column)
+{
+#ifdef __CYGWIN__
+ extern char term_name[];
+#endif
+ register struct key *k;
+ struct key *last_time;
+ int i, j,
+ ufk, /* using function keys */
+ real_row,
+ max_column, /* number of columns on screen */
+ off; /* offset into keymap */
+ struct variable *vars = ps_global->vars;
+ COLOR_PAIR *lastc=NULL, *label_color=NULL, *name_color=NULL;
+#ifdef MOUSE
+ /* 6's are for UTF-8 */
+ char keystr[6*MAX_KEYNAME + 6*MAX_LABEL + 2];
+#endif
+
+ off = km->which * 12;
+ max_column = ps_global->ttyo->screen_cols;
+
+ if((ps_global->ttyo->screen_rows - FOOTER_ROWS(ps_global)) < 0
+ || max_column <= 0){
+ keymenu_is_dirty = 1;
+ return;
+ }
+
+
+ real_row = row > 0 ? row : ps_global->ttyo->screen_rows + row;
+
+ if(pico_usingcolor()){
+ lastc = pico_get_cur_color();
+ if(lastc && VAR_KEYLABEL_FORE_COLOR && VAR_KEYLABEL_BACK_COLOR &&
+ pico_is_good_color(VAR_KEYLABEL_FORE_COLOR) &&
+ pico_is_good_color(VAR_KEYLABEL_BACK_COLOR)){
+ label_color = new_color_pair(VAR_KEYLABEL_FORE_COLOR,
+ VAR_KEYLABEL_BACK_COLOR);
+ if(label_color)
+ (void)pico_set_colorp(label_color, PSC_NONE);
+ }
+
+ if(label_color && VAR_KEYNAME_FORE_COLOR && VAR_KEYNAME_BACK_COLOR &&
+ pico_is_good_color(VAR_KEYNAME_FORE_COLOR) &&
+ pico_is_good_color(VAR_KEYNAME_BACK_COLOR)){
+ name_color = new_color_pair(VAR_KEYNAME_FORE_COLOR,
+ VAR_KEYNAME_BACK_COLOR);
+ }
+ }
+
+ if(keymenu_is_dirty){
+ ClearLines(real_row, real_row+1);
+ keymenu_is_dirty = 0;
+ /* first time through, set up storage */
+ if(!last_time_buf[0].name){
+ for(i = 0; i < 12; i++){
+ last_time = &last_time_buf[i];
+ last_time->name = (char *) fs_get(6*MAX_KEYNAME + 1);
+ last_time->label = (char *) fs_get(6*MAX_LABEL + 1);
+ }
+ }
+
+ for(i = 0; i < 12; i++)
+ last_time_buf[i].column = -1;
+ }
+
+ for(i = 0; i < 12; i++){
+ int e;
+
+ e = off + i;
+ dprint((9, "%2d %-7.7s %-10.10s %d\n", i,
+ km == NULL ? "(no km)"
+ : km->keys[e].name == NULL ? "(null)"
+ : km->keys[e].name,
+ km == NULL ? "(no km)"
+ : km->keys[e].label == NULL ? "(null)"
+ : km->keys[e].label, km ? km->keys[e].column : 0));
+#ifdef MOUSE
+ register_key(i, NO_OP_COMMAND, "", NULL, 0, 0, 0, NULL, NULL);
+#endif
+ }
+
+ ufk = F_ON(F_USE_FK, ps_global);
+ dprint((9, "row: %d, real_row: %d, column: %d\n", row,
+ real_row, column));
+
+ for(i = 0; i < 2; i++){
+ int c, el, empty, fkey, last_in_row, fix_start;
+ short next_col;
+ char temp[6*MAX_SCREEN_COLS+1];
+ char temp2[6*MAX_SCREEN_COLS+1];
+ char this_label[6*MAX_LABEL+1];
+
+ j = 6*i - 1;
+#ifndef __CYGWIN__
+ if(i == 1 && !label_color)
+#else
+ if(i == 1 && (!label_color || !struncmp(term_name,"cygwin", 6)))
+#endif
+ max_column--; /* Some terminals scroll if you write in the
+ lower right hand corner. If user has a
+ label_color set we'll take our chances.
+ Otherwise, we'd get one cell of Normal. */
+
+ /*
+ * k is the key struct we're working on
+ * c is the column number
+ * el is an index into the whole keys array
+ * Last_time_buf is ordered strangely. It goes row by row instead
+ * of down each column like km does. J is an index into it.
+ */
+ for(c = 0, el = off+i, k = &km->keys[el];
+ k < &km->keys[off+12] && c < max_column;
+ k += 2, el += 2){
+
+ if(k->column > max_column)
+ break;
+
+ j++;
+ if(ufk)
+ fkey = 1 + k - &km->keys[off];
+
+ empty = (!bitnset(el,bm) || !(k->name && *k->name));
+ last_time = &last_time_buf[j];
+ if(k+2 < &km->keys[off+12]){
+ last_in_row = 0;
+ next_col = last_time_buf[j+1].column;
+ fix_start = (k == &km->keys[off] ||
+ k == &km->keys[off+1]) ? k->column : 0;
+ }
+ else{
+ last_in_row = 1;
+ fix_start = 0;
+ }
+
+ /*
+ * Make sure there is a space between this label and
+ * the next name. That is, we prefer a space to the
+ * extra character of the label because the space
+ * separates the commands and looks nicer.
+ */
+ if(k->label){
+ size_t l;
+ char tmp_label[6*MAX_LABEL+1];
+
+ if(k->label[0] == '[' && k->label[(l=strlen(k->label))-1] == ']' && l > 2){
+ /*
+ * Can't write in k->label, which might be a constant array.
+ */
+ strncpy(tmp_label, &k->label[1], MIN(sizeof(tmp_label),l-2));
+ tmp_label[MIN(sizeof(tmp_label)-1,l-2)] = '\0';
+
+ snprintf(this_label, sizeof(this_label), "[%s]", _(tmp_label));
+ }
+ else
+ strncpy(this_label, _(k->label), sizeof(this_label));
+
+ this_label[sizeof(this_label)-1] = '\0';
+ if(!last_in_row){
+ int trunc;
+
+ trunc = (k+2)->column - k->column
+ - ((k->name ? utf8_width(k->name) : 0) + 1);
+ /*
+ * trunc columns available for label but we don't want the label
+ * to go all the way to the edge
+ */
+ if(utf8_width(this_label) >= trunc){
+ if(trunc > 1){
+ strncpy(tmp_label, this_label, sizeof(tmp_label));
+ tmp_label[sizeof(tmp_label)-1] = '\0';
+ l = utf8_pad_to_width(this_label, tmp_label, sizeof(this_label)-2, trunc-1, 1);
+ this_label[l++] = SPACE;
+ this_label[l] = '\0';;
+ }
+ else if(trunc == 1)
+ this_label[0] = SPACE;
+ else
+ this_label[0] = '\0';
+
+ this_label[sizeof(this_label)-1] = '\0';
+ }
+ }
+ }
+ else
+ this_label[0] = '\0';
+
+ if(!(k->column == last_time->column
+ && (last_in_row || (k+2)->column <= next_col)
+ && ((empty && !*last_time->label && !*last_time->name)
+ || (!empty
+ && this_label && !strcmp(this_label,last_time->label)
+ && ((k->name && !strcmp(k->name,last_time->name))
+ || ufk))))){
+ if(empty){
+ /* blank out key with spaces */
+ strncpy(temp, repeat_char(
+ ((last_in_row || (k+2)->column > max_column)
+ ? max_column
+ : (k+2)->column) -
+ (fix_start
+ ? 0
+ : k->column),
+ SPACE), sizeof(temp));
+ temp[sizeof(temp)-1] = '\0';
+ last_time->column = k->column;
+ *last_time->name = '\0';
+ *last_time->label = '\0';
+ MoveCursor(real_row + i, column + (fix_start ? 0 : k->column));
+ Write_to_screen(temp);
+ c = (fix_start ? 0 : k->column) + strlen(temp);
+ }
+ else{
+ /* make sure extra space before key name is there */
+ if(fix_start){
+ strncpy(temp, repeat_char(k->column, SPACE), sizeof(temp));
+ temp[sizeof(temp)-1] = '\0';
+ MoveCursor(real_row + i, column + 0);
+ Write_to_screen(temp);
+ }
+
+ /* short name of the key */
+ if(ufk)
+ snprintf(temp, sizeof(temp), "F%d", fkey);
+ else
+ strncpy(temp, k->name, sizeof(temp));
+
+ temp[sizeof(temp)-1] = '\0';
+ last_time->column = k->column;
+ strncpy(last_time->name, temp, 6*MAX_KEYNAME);
+ last_time->name[6*MAX_KEYNAME] = '\0';
+ /* make sure name not too long */
+#ifdef MOUSE
+ strncpy(keystr, temp, sizeof(keystr));
+ keystr[sizeof(keystr)-1] = '\0';
+#endif
+ MoveCursor(real_row + i, column + k->column);
+ if(!empty){
+ if(name_color)
+ (void)pico_set_colorp(name_color, PSC_NONE);
+ else
+ StartInverse();
+ }
+
+ Write_to_screen(temp);
+ c = k->column + utf8_width(temp);
+ if(!empty){
+ if(!name_color)
+ EndInverse();
+ }
+
+ /* now the space after the name and the label */
+ temp[0] = '\0';
+ if(c < max_column){
+ temp[0] = SPACE;
+ temp[1] = '\0';
+ strncat(temp, this_label, sizeof(temp)-strlen(temp)-1);
+
+ /* Don't run over the right hand edge */
+ if(utf8_width(temp) > max_column - c){
+ size_t l;
+
+ l = utf8_pad_to_width(temp2, temp, sizeof(temp2)-1, max_column-c, 1);
+ temp2[l] = '\0';
+ strncpy(temp, temp2, sizeof(temp));
+ temp[sizeof(temp)-1] = '\0';
+ }
+
+ c += utf8_width(temp);
+ }
+
+#ifdef MOUSE
+ strncat(keystr, temp, sizeof(keystr)-strlen(keystr)-1);
+ keystr[sizeof(keystr)-1] = '\0';
+#endif
+ /* fill out rest of this key with spaces */
+ if(c < max_column){
+ if(last_in_row){
+ strncat(temp, repeat_char(max_column - c, SPACE), sizeof(temp)-strlen(temp)-1);
+ c = max_column;
+ }
+ else{
+ if(c < (k+2)->column){
+ strncat(temp,
+ repeat_char((k+2)->column - c, SPACE), sizeof(temp)-strlen(temp)-1);
+ c = (k+2)->column;
+ }
+ }
+
+ temp[sizeof(temp)-1] = '\0';
+ }
+
+ strncpy(last_time->label, this_label, 6*MAX_LABEL);
+ last_time->label[6*MAX_LABEL] = '\0';
+ if(label_color)
+ (void)pico_set_colorp(label_color, PSC_NONE);
+
+ Write_to_screen(temp);
+ }
+ }
+#ifdef MOUSE
+ else if(!empty)
+ /* fill in what register_key needs from cached data */
+ snprintf(keystr, sizeof(keystr), "%s %s", last_time->name, last_time->label);
+
+ if(!empty){
+ int len;
+
+ /*
+ * If label ends in space,
+ * don't register the space part of label.
+ */
+ len = strlen(keystr);
+ while(keystr[len-1] == SPACE)
+ len--;
+ len--;
+
+ register_key(j, ufk ? PF1 + fkey - 1
+ : (k->name[0] == '^')
+ ? ctrl(k->name[1])
+ : (!strucmp(k->name, "ret"))
+ ? ctrl('M')
+ : (!strucmp(k->name, "tab"))
+ ? '\t'
+ : (!strucmp(k->name, "spc"))
+ ? SPACE
+ : (!strucmp(k->name, HISTORY_UP_KEYNAME))
+ ? KEY_UP
+ : (!strucmp(k->name, HISTORY_DOWN_KEYNAME))
+ ? KEY_DOWN
+ : (k->bind.nch)
+ ? ((isascii((int) k->bind.ch[0]) && islower((int) k->bind.ch[0]))
+ ? toupper((unsigned char) k->bind.ch[0])
+ : k->bind.ch[0])
+ : k->name[0],
+ keystr, print_inverted_label,
+ real_row+i, k->column, len,
+ name_color, label_color);
+ }
+#endif
+
+ }
+
+ while(++j < 6*(i+1))
+ last_time_buf[j].column = -1;
+ }
+
+ fflush(stdout);
+ if(lastc){
+ (void)pico_set_colorp(lastc, PSC_NONE);
+ free_color_pair(&lastc);
+ if(label_color)
+ free_color_pair(&label_color);
+ if(name_color)
+ free_color_pair(&name_color);
+ }
+}
+
+
+/*
+ * Clear the key menu lines.
+ */
+void
+blank_keymenu(int row, int column)
+{
+ struct variable *vars = ps_global->vars;
+ COLOR_PAIR *lastc;
+
+ if(FOOTER_ROWS(ps_global) > 1){
+ km_state.blanked = 1;
+ km_state.row = row;
+ km_state.column = column;
+ MoveCursor(row, column);
+ lastc = pico_set_colors(VAR_KEYLABEL_FORE_COLOR,
+ VAR_KEYLABEL_BACK_COLOR, PSC_NORM|PSC_RET);
+
+ CleartoEOLN();
+ MoveCursor(row+1, column);
+ CleartoEOLN();
+ fflush(stdout);
+ if(lastc){
+ (void)pico_set_colorp(lastc, PSC_NONE);
+ free_color_pair(&lastc);
+ }
+ }
+}
+
+
+void
+draw_cancel_keymenu(void)
+{
+ bitmap_t bitmap;
+
+ setbitmap(bitmap);
+ draw_keymenu(&cancel_keymenu, bitmap, ps_global->ttyo->screen_cols,
+ 1-FOOTER_ROWS(ps_global), 0, FirstMenu);
+}
+
+
+void
+clearfooter(struct pine *ps)
+{
+ ClearLines(ps->ttyo->screen_rows - 3, ps->ttyo->screen_rows - 1);
+ mark_keymenu_dirty();
+ mark_status_unknown();
+}
+
+
+/*
+ * Calculate formatting for key menu at bottom of screen
+ *
+ * Args: km -- The key_menu structure to format
+ * bm -- Bitmap indicating which menu items should be displayed. If
+ * an item is NULL, that also means it shouldn't be displayed.
+ * Sometimes the bitmap will be turned on in that case and just
+ * rely on the NULL entry.
+ * width -- the screen width to format it at
+ *
+ * If already formatted for this particular screen width and the requested
+ * bitmap and formatted bitmap agree, return.
+ *
+ * The formatting results in the column field in the key_menu being
+ * filled in. The column field is the column to start the label at, the
+ * name of the key; after that is the label for the key. The basic idea
+ * is to line up the end of the names and beginning of the labels. If
+ * the name is too long and shifting it left would run into previous
+ * label, then shift the whole menu right, or at least that entry if
+ * things following are short enough to fit back into the regular
+ * spacing. This has to be calculated and not fixed so it can cope with
+ * screen resize.
+ */
+void
+format_keymenu(struct key_menu *km, unsigned char *bm, int width)
+{
+ int spacing[7], w[6], min_w[6], tw[6], extra[6], ufk, i, set;
+
+ /* already formatted? */
+ if(!km || (width == km->width &&
+ km->how_many <= km->formatted_hm &&
+ !memcmp(km->bitmap, bm, BM_SIZE)))
+ return;
+
+ /*
+ * If we're in the initial command sequence we may be using function
+ * keys instead of alphas, or vice versa, so we want to recalculate
+ * the formatting next time through.
+ */
+ if((F_ON(F_USE_FK,ps_global) && ps_global->orig_use_fkeys) ||
+ (F_OFF(F_USE_FK,ps_global) && !ps_global->orig_use_fkeys)){
+ km->width = width;
+ km->formatted_hm = km->how_many;
+ memcpy(km->bitmap, bm, BM_SIZE);
+ }
+
+ ufk = F_ON(F_USE_FK,ps_global); /* ufk = "Using Function Keys" */
+
+ /* set up "ideal" columns to start in, plus fake 7th column start */
+ for(i = 0; i < 7; i++)
+ spacing[i] = (i * width) / 6;
+
+ /* Loop thru each set of 12 menus */
+ for(set = 0; set < km->how_many; set++){
+ int k_top, k_bot, top_name_width, bot_name_width,
+ top_label_width, bot_label_width, done, offset, next_one;
+ struct key *keytop, *keybot;
+
+ offset = set * 12; /* offset into keymenu */
+
+ /*
+ * Find the required widths for each box.
+ */
+ for(i = 0; i < 6; i++){
+ k_top = offset + i*2;
+ k_bot = k_top + 1;
+ keytop = &km->keys[k_top];
+ keybot = &km->keys[k_bot];
+
+ /*
+ * The width of a box is the max width of top or bottom name,
+ * plus 1 space, plus the max width of top or bottom label.
+ *
+ * ? HelpInfo
+ * ^C Cancel
+ * ||||||||||| = 2 + 1 + 8 = 11
+ *
+ * Then we adjust that by adding one space after the box to
+ * separate it from the next box. The last box doesn't need that
+ * but we may need an extra space for last box to avoid putting
+ * a character in the lower right hand cell of display.
+ * We also have a minimum label width (if screen is really narrow)
+ * of 3, so at least "Hel" and "Can" shows and the rest gets
+ * truncated off right hand side.
+ */
+
+ top_name_width = (keytop->name && bitnset(k_top,bm))
+ ? (ufk ? (i >= 5 ? 3 : 2)
+ : utf8_width(keytop->name)) : 0;
+ bot_name_width = (keybot->name && bitnset(k_bot,bm))
+ ? (ufk ? (i >= 4 ? 3 : 2)
+ : utf8_width(keybot->name)) : 0;
+ /*
+ * Labels are complicated by the fact that we want to look
+ * up their translation, but also by the fact that we surround
+ * the word with brackets like [ViewMsg] when the command is
+ * the default. We want to look up the translation of the
+ * part inside the brackets, not the whole thing.
+ */
+ if(keytop->label && bitnset(k_top,bm)){
+ char tmp_label[6*MAX_LABEL+1];
+ size_t l;
+
+ if(keytop->label[0] == '[' && keytop->label[(l=strlen(keytop->label))-1] == ']' && l > 2){
+ /*
+ * Can't write in k->label, which might be a constant array.
+ */
+ strncpy(tmp_label, &keytop->label[1], MIN(sizeof(tmp_label),l-2));
+ tmp_label[MIN(sizeof(tmp_label)-1,l-2)] = '\0';
+
+ top_label_width = 2 + utf8_width(_(tmp_label));
+ }
+ else
+ top_label_width = utf8_width(_(keytop->label));
+ }
+ else
+ top_label_width = 0;
+
+ if(keybot->label && bitnset(k_bot,bm)){
+ char tmp_label[6*MAX_LABEL+1];
+ size_t l;
+
+ if(keybot->label[0] == '[' && keybot->label[(l=strlen(keybot->label))-1] == ']' && l > 2){
+ strncpy(tmp_label, &keybot->label[1], MIN(sizeof(tmp_label),l-2));
+ tmp_label[MIN(sizeof(tmp_label)-1,l-2)] = '\0';
+
+ bot_label_width = 2 + utf8_width(_(tmp_label));
+ }
+ else
+ bot_label_width = utf8_width(_(keybot->label));
+ }
+ else
+ bot_label_width = 0;
+
+ /*
+ * The 1 for i < 5 is the space between adjacent boxes.
+ * The last 1 or 0 when i == 5 is so that we won't try to put
+ * a character in the lower right cell of the display, since that
+ * causes a linefeed on some terminals.
+ */
+ w[i] = MAX(top_name_width, bot_name_width) + 1 +
+ MAX(top_label_width, bot_label_width) +
+ ((i < 5) ? 1
+ : ((bot_label_width >= top_label_width) ? 1 : 0));
+
+ /*
+ * The smallest we'll squeeze a column.
+ *
+ * X ABCDEF we'll squeeze to X ABC
+ * YZ GHIJ YZ GHI
+ */
+ min_w[i] = MAX(top_name_width, bot_name_width) + 1 +
+ MIN(MAX(top_label_width, bot_label_width), 3) +
+ ((i < 5) ? 1
+ : ((bot_label_width >= top_label_width) ? 1 : 0));
+
+ /* init trial width */
+ tw[i] = spacing[i+1] - spacing[i];
+ extra[i] = tw[i] - w[i]; /* negative if it doesn't fit */
+ }
+
+ /*
+ * See if we can fit everything on the screen.
+ */
+ done = 0;
+ while(!done){
+ int smallest_extra, how_small;
+
+ /* Find smallest extra */
+ smallest_extra = -1;
+ how_small = 100;
+ for(i = 0; i < 6; i++){
+ if(extra[i] < how_small){
+ smallest_extra = i;
+ how_small = extra[i];
+ }
+ }
+
+ if(how_small >= 0) /* everything fits */
+ done++;
+ else{
+ int take_from, how_close;
+
+ /*
+ * Find the one that is closest to the ideal width
+ * that has some extra to spare.
+ */
+ take_from = -1;
+ how_close = 100;
+ for(i = 0; i < 6; i++){
+ if(extra[i] > 0 &&
+ ((spacing[i+1]-spacing[i]) - tw[i]) < how_close){
+ take_from = i;
+ how_close = (spacing[i+1]-spacing[i]) - tw[i];
+ }
+ }
+
+ if(take_from >= 0){
+ /*
+ * Found one. Take one from take_from and add it
+ * to the smallest_extra.
+ */
+ tw[smallest_extra]++;
+ extra[smallest_extra]++;
+ tw[take_from]--;
+ extra[take_from]--;
+ }
+ else{
+ int used_width;
+
+ /*
+ * Oops. Not enough space to fit everything in.
+ * Some of the labels are truncated. Some may even be
+ * truncated past the minimum. We make sure that each
+ * field is at least its minimum size, and then we cut
+ * back those over the minimum until we can fit all the
+ * minimal names on the screen (if possible).
+ */
+ for(i = 0; i < 6; i++)
+ tw[i] = MAX(tw[i], min_w[i]);
+
+ used_width = 0;
+ for(i = 0; i < 6; i++)
+ used_width += tw[i];
+
+ while(used_width > width && !done){
+ int candidate, excess;
+
+ /*
+ * Find the one with the most width over it's
+ * minimum width.
+ */
+ candidate = -1;
+ excess = -100;
+ for(i = 0; i < 6; i++){
+ if(tw[i] - min_w[i] > excess){
+ candidate = i;
+ excess = tw[i] - min_w[i];
+ }
+ }
+
+ if(excess > 0){
+ tw[candidate]--;
+ used_width--;
+ }
+ else
+ done++;
+ }
+
+ done++;
+ }
+ }
+ }
+
+ /*
+ * Assign the format we came up with to the keymenu.
+ */
+ next_one = 0;
+ for(i = 0; i < 6; i++){
+ k_top = offset + i*2;
+ k_bot = k_top + 1;
+ keytop = &km->keys[k_top];
+ keybot = &km->keys[k_bot];
+ top_name_width = (keytop->name && bitnset(k_top,bm))
+ ? (ufk ? (i >= 5 ? 3 : 2)
+ : utf8_width(keytop->name)) : 0;
+ bot_name_width = (keybot->name && bitnset(k_bot,bm))
+ ? (ufk ? (i >= 4 ? 3 : 2)
+ : utf8_width(keybot->name)) : 0;
+
+ if(top_name_width >= bot_name_width){
+ keytop->column = next_one;
+ keybot->column = next_one + (top_name_width - bot_name_width);
+ }
+ else{
+ keytop->column = next_one + (bot_name_width - top_name_width);
+ keybot->column = next_one;
+ }
+
+ next_one += tw[i];
+ }
+ }
+}
+
+
+/*
+ * Draw the key menu at bottom of screen
+ *
+ * Args: km -- key_menu structure
+ * bitmap -- which fields are active
+ * width -- the screen width to format it at
+ * row -- where to put it
+ * column -- where to put it
+ * what -- this is an enum telling us whether to display the
+ * first menu (first set of 12 keys), or to display the same
+ * one we displayed last time, or to display a particular
+ * one (which), or to display the next one.
+ *
+ * Fields are inactive if *either* the corresponding bitmap entry is 0 *or*
+ * the actual entry in the key_menu is NULL. Therefore, it is sometimes
+ * useful to just turn on all the bits in a bitmap and let the NULLs take
+ * care of it. On the other hand, the bitmap gives a convenient method
+ * for turning some keys on or off dynamically or due to options.
+ * Both methods are used about equally.
+ *
+ * Also saves the state for a possible redraw later.
+ *
+ * Row should usually be a negative number. If row is 0, the menu is not
+ * drawn.
+ */
+void
+draw_keymenu(struct key_menu *km, unsigned char *bitmap, int width, int row,
+ int column, OtherMenu what)
+{
+#ifdef _WINDOWS
+ configure_menu_items (km, bitmap);
+#endif
+ format_keymenu(km, bitmap, width);
+
+ /*--- save state for a possible redraw ---*/
+ km_state.km = km;
+ km_state.row = row;
+ km_state.column = column;
+ memcpy(km_state.bitmap, bitmap, BM_SIZE);
+
+ if(row == 0)
+ return;
+
+ if(km_state.blanked)
+ keymenu_is_dirty = 1;
+
+ if(what == FirstMenu || what == SecondMenu || what == ThirdMenu ||
+ what == FourthMenu || what == MenuNotSet){
+ if(what == FirstMenu || what == MenuNotSet)
+ km->which = 0;
+ else if(what == SecondMenu)
+ km->which = 1;
+ else if(what == ThirdMenu)
+ km->which = 2;
+ else if(what == FourthMenu)
+ km->which = 3;
+
+ if(km->which >= km->how_many)
+ km->which = 0;
+ }
+ else if(what == NextMenu)
+ km->which = (km->which + 1) % km->how_many;
+ /* else what must be SameMenu */
+
+ output_keymenu(km, bitmap, row, column);
+
+ km_state.blanked = 0;
+}
+
+
+void
+redraw_keymenu(void)
+{
+ if(km_state.blanked)
+ blank_keymenu(km_state.row, km_state.column);
+ else
+ draw_keymenu(km_state.km, km_state.bitmap, ps_global->ttyo->screen_cols,
+ km_state.row, km_state.column, SameMenu);
+}
+
+
+/*
+ * end_keymenu - free resources associated with keymenu display cache
+ */
+void
+end_keymenu(void)
+{
+ int i;
+
+ for(i = 0; i < 12; i++){
+ if(last_time_buf[i].name)
+ fs_give((void **) &last_time_buf[i].name);
+
+ if(last_time_buf[i].label)
+ fs_give((void **) &last_time_buf[i].label);
+ }
+}
+
+
+/*----------------------------------------------------------------------
+ Reveal Keymenu to Pine Command mappings
+
+ Args:
+
+ ----*/
+int
+menu_command(UCS keystroke, struct key_menu *menu)
+{
+ int i, n;
+
+ if(keystroke == KEY_UTF8 || keystroke == KEY_UNKNOWN)
+ return(MC_UTF8);
+
+ if(!menu)
+ return(MC_UNKNOWN);
+
+ if(F_ON(F_USE_FK,ps_global)){
+ /* No alpha commands permitted in function key mode */
+ if(keystroke < 0x80 && isalpha((unsigned char) keystroke))
+ return(MC_UNKNOWN);
+
+ /* Tres simple: compute offset, and test */
+ if(keystroke >= F1 && keystroke <= F12){
+ n = (menu->which * 12) + (keystroke - F1);
+ if(bitnset(n, menu->bitmap))
+ return(menu->keys[n].bind.cmd);
+ }
+ }
+ else if(keystroke >= F1 && keystroke <= F12)
+ return(MC_UNKNOWN);
+
+ /* if ascii, coerce lower case */
+ if(keystroke < 0x80 && isupper((unsigned char) keystroke))
+ keystroke = tolower((unsigned char) keystroke);
+
+ /* keep this here for Windows port */
+ if((keystroke = validatekeys(keystroke)) == KEY_JUNK)
+ return(MC_UNKNOWN);
+
+ /* Scan the list for any keystroke/command binding */
+ if(keystroke != NO_OP_COMMAND)
+ for(i = (menu->how_many * 12) - 1; i >= 0; i--)
+ if(bitnset(i, menu->bitmap))
+ for(n = menu->keys[i].bind.nch - 1; n >= 0; n--)
+ if(keystroke == menu->keys[i].bind.ch[n])
+ return(menu->keys[i].bind.cmd);
+
+ /*
+ * If explicit mapping failed, check feature mappings and
+ * hardwired defaults...
+ */
+ if(F_ON(F_ENABLE_PRYNT,ps_global)
+ && (keystroke == 'y' || keystroke == 'Y')){
+ /* SPECIAL CASE: Scan the list for print bindings */
+ for(i = (menu->how_many * 12) - 1; i >= 0; i--)
+ if(bitnset(i, menu->bitmap))
+ if(menu->keys[i].bind.cmd == MC_PRINTMSG
+ || menu->keys[i].bind.cmd == MC_PRINTTXT)
+ return(menu->keys[i].bind.cmd);
+ }
+
+ if(F_ON(F_ENABLE_LESSTHAN_EXIT,ps_global)
+ && (keystroke == '<' || keystroke == ','
+ || (F_ON(F_ARROW_NAV,ps_global) && keystroke == KEY_LEFT))){
+ /* SPECIAL CASE: Scan the list for MC_EXIT bindings */
+ for(i = (menu->how_many * 12) - 1; i >= 0; i--)
+ if(bitnset(i, menu->bitmap))
+ if(menu->keys[i].bind.cmd == MC_EXIT)
+ return(MC_EXIT);
+ }
+
+ /*
+ * If no match after scanning bindings, try universally
+ * bound keystrokes...
+ */
+ switch(keystroke){
+ case KEY_MOUSE :
+ return(MC_MOUSE);
+
+ case ctrl('P') :
+ case KEY_UP :
+ return(MC_CHARUP);
+
+ case ctrl('N') :
+ case KEY_DOWN :
+ return(MC_CHARDOWN);
+
+ case ctrl('F') :
+ case KEY_RIGHT :
+ return(MC_CHARRIGHT);
+
+ case ctrl('B') :
+ case KEY_LEFT :
+ return(MC_CHARLEFT);
+
+ case ctrl('A') :
+ return(MC_GOTOBOL);
+
+ case ctrl('E') :
+ return(MC_GOTOEOL);
+
+ case ctrl('L') :
+ return(MC_REPAINT);
+
+ case KEY_RESIZE :
+ return(MC_RESIZE);
+
+ case NO_OP_IDLE:
+ case NO_OP_COMMAND:
+ if(USER_INPUT_TIMEOUT(ps_global))
+ user_input_timeout_exit(ps_global->hours_to_timeout); /* no return */
+
+ return(MC_NONE);
+
+ default :
+ break;
+ }
+
+ return(MC_UNKNOWN); /* utter failure */
+}
+
+
+
+/*----------------------------------------------------------------------
+ Set up a binding for cmd, with one key bound to it.
+ Use menu_add_binding to add more keys to this binding.
+
+ Args: menu -- the keymenu
+ key -- the initial key to bind to
+ cmd -- the command to initialize to
+ name -- a pointer to the string to point name to
+ label -- a pointer to the string to point label to
+ keynum -- which key in the keys array to initialize
+
+ For translation purposes, the label in the calling routine
+ should be wrapped in an N_() macro.
+
+ ----*/
+void
+menu_init_binding(struct key_menu *menu, UCS key, int cmd, char *name, char *label, int keynum)
+{
+ /* if ascii, coerce to lower case */
+ if(key < 0x80 && isupper((unsigned char)key))
+ key = tolower((unsigned char)key);
+
+ /* remove binding from any other key */
+ menu_clear_cmd_binding(menu, cmd);
+
+ menu->keys[keynum].name = name;
+ menu->keys[keynum].label = label;
+ menu->keys[keynum].bind.cmd = cmd;
+ menu->keys[keynum].bind.nch = 0;
+ menu->keys[keynum].bind.ch[menu->keys[keynum].bind.nch++] = key;
+}
+
+
+/*----------------------------------------------------------------------
+ Add a key/command binding to the given keymenu structure
+
+ Args:
+
+ ----*/
+void
+menu_add_binding(struct key_menu *menu, UCS key, int cmd)
+{
+ int i, n;
+
+ /* NOTE: cmd *MUST* already have had a binding */
+ for(i = (menu->how_many * 12) - 1; i >= 0; i--)
+ if(menu->keys[i].bind.cmd == cmd){
+ for(n = menu->keys[i].bind.nch - 1;
+ n >= 0 && key != menu->keys[i].bind.ch[n];
+ n--)
+ ;
+
+ /* if ascii, coerce to lower case */
+ if(key < 0x80 && isupper((unsigned char)key))
+ key = tolower((unsigned char)key);
+
+ if(n < 0) /* not already bound, bind it */
+ menu->keys[i].bind.ch[menu->keys[i].bind.nch++] = key;
+
+ break;
+ }
+}
+
+
+/*----------------------------------------------------------------------
+ REMOVE a key/command binding from the given keymenu structure
+
+ Args:
+
+ ----*/
+int
+menu_clear_binding(struct key_menu *menu, UCS key)
+{
+ int i, n;
+
+ /* if ascii, coerce to lower case */
+ if(key < 0x80 && isupper((unsigned char)key))
+ key = tolower((unsigned char)key);
+
+ for(i = (menu->how_many * 12) - 1; i >= 0; i--)
+ for(n = menu->keys[i].bind.nch - 1; n >= 0; n--)
+ if(key == menu->keys[i].bind.ch[n]){
+ int cmd = menu->keys[i].bind.cmd;
+
+ for(--menu->keys[i].bind.nch; n < menu->keys[i].bind.nch; n++)
+ menu->keys[i].bind.ch[n] = menu->keys[i].bind.ch[n+1];
+
+ return(cmd);
+ }
+
+ return(MC_UNKNOWN);
+}
+
+
+void
+menu_clear_cmd_binding(struct key_menu *menu, int cmd)
+{
+ int i;
+
+ for(i = (menu->how_many * 12) - 1; i >= 0; i--){
+ if(cmd == menu->keys[i].bind.cmd){
+ menu->keys[i].name = NULL;
+ menu->keys[i].label = NULL;
+ menu->keys[i].bind.cmd = 0;
+ menu->keys[i].bind.nch = 0;
+ menu->keys[i].bind.ch[0] = 0;
+ }
+ }
+}
+
+
+int
+menu_binding_index(struct key_menu *menu, int cmd)
+{
+ int i;
+
+ for(i = 0; i < menu->how_many * 12; i++)
+ if(cmd == menu->keys[i].bind.cmd)
+ return(i);
+
+ return(-1);
+}
+
+
+#ifdef MOUSE
+/*
+ * print_inverted_label - highlight the label of the given menu item.
+ * (callback from pico mouse routines)
+ *
+ * So far, this is only
+ * ever called with the top left row equal to the bottom right row.
+ * If you change that you probably need to fix it.
+ */
+void
+print_inverted_label(int state, MENUITEM *m)
+{
+ unsigned i, j, k;
+ int col_offsetwid, col_offsetchars, do_color = 0, skipwid = 0, skipchars = 0, len, c;
+ char prename[100];
+ char namepart[100];
+ char labelpart[100];
+ char *lp, *label;
+ COLOR_PAIR *name_color = NULL, *label_color = NULL, *lastc = NULL;
+ struct variable *vars = ps_global->vars;
+
+ if(m->label && (lp=strchr(m->label, ' '))){
+ char save;
+
+ save = *lp;
+ *lp = '\0';
+ col_offsetwid = utf8_width(m->label);
+ col_offsetchars = lp - m->label;
+ *lp = save;
+ }
+ else
+ col_offsetwid = col_offsetchars = 0;
+
+ if(pico_usingcolor() && ((VAR_KEYLABEL_FORE_COLOR &&
+ VAR_KEYLABEL_BACK_COLOR) ||
+ (VAR_KEYNAME_FORE_COLOR &&
+ VAR_KEYNAME_BACK_COLOR))){
+ lastc = pico_get_cur_color();
+
+ if(VAR_KEYNAME_FORE_COLOR && VAR_KEYNAME_BACK_COLOR){
+ name_color = state ? new_color_pair(VAR_KEYNAME_BACK_COLOR,
+ VAR_KEYNAME_FORE_COLOR)
+ : new_color_pair(VAR_KEYNAME_FORE_COLOR,
+ VAR_KEYNAME_BACK_COLOR);
+ }
+ else if(VAR_REV_FORE_COLOR && VAR_REV_BACK_COLOR)
+ name_color = new_color_pair(VAR_REV_FORE_COLOR, VAR_REV_BACK_COLOR);
+
+ if(VAR_KEYLABEL_FORE_COLOR && VAR_KEYLABEL_BACK_COLOR){
+ label_color = state ? new_color_pair(VAR_KEYLABEL_BACK_COLOR,
+ VAR_KEYLABEL_FORE_COLOR)
+ : new_color_pair(VAR_KEYLABEL_FORE_COLOR,
+ VAR_KEYLABEL_BACK_COLOR);
+ }
+ else if(VAR_REV_FORE_COLOR && VAR_REV_BACK_COLOR){
+ label_color = state ? new_color_pair(VAR_REV_FORE_COLOR,
+ VAR_REV_BACK_COLOR)
+ : new_color_pair(VAR_NORM_FORE_COLOR,
+ VAR_NORM_BACK_COLOR);
+ }
+
+ /*
+ * See if we can grok all these colors. If not, we're going to
+ * punt and pretend there are no colors at all.
+ */
+ if(!pico_is_good_colorpair(name_color) ||
+ !pico_is_good_colorpair(label_color)){
+ if(name_color)
+ free_color_pair(&name_color);
+ if(label_color)
+ free_color_pair(&label_color);
+ if(lastc)
+ free_color_pair(&lastc);
+ }
+ else{
+ do_color++;
+ (void)pico_set_colorp(label_color, PSC_NONE);
+ if(!(VAR_KEYLABEL_FORE_COLOR && VAR_KEYLABEL_BACK_COLOR)){
+ if(state)
+ StartInverse();
+ else
+ EndInverse();
+ }
+ }
+ }
+
+ if(!do_color){
+ /*
+ * Command name's already inverted, leave it.
+ */
+ skipwid = state ? 0 : col_offsetwid;
+ skipchars = state ? 0 : col_offsetchars;
+ if(state)
+ StartInverse();
+ else
+ EndInverse();
+ }
+
+ MoveCursor((int)(m->tl.r), (int)(m->tl.c) + skipwid);
+
+ label = m->label ? m->label : "";
+ len = strlen(label);
+
+ /*
+ * this is a bit complicated by the fact that we have to keep track of
+ * the screenwidth as we print the label, because the screenwidth might
+ * not be the same as the number of characters.
+* UNTESTED SINCE switching to UTF-8 *
+ */
+ for(i = m->tl.r; i <= m->br.r; i++){
+ /* collect part before name */
+ for(k=0, j = m->tl.c + skipchars; j < MIN(m->lbl.c,m->br.c); j++){
+ if(k < sizeof(prename))
+ prename[k++] = ' ';
+ }
+
+ if(k < sizeof(prename))
+ prename[k] = '\0';
+
+ /* collect name part */
+ for(k=0; j < MIN(m->lbl.c+col_offsetchars,m->br.c); j++){
+ c = (i == m->lbl.r &&
+ j - m->lbl.c < len) ? label[j - m->lbl.c] : ' ';
+ if(k < sizeof(namepart))
+ namepart[k++] = c;
+ }
+
+ if(k < sizeof(namepart))
+ namepart[k] = '\0';
+
+ /* collect label part */
+ for(k=0; j <= m->br.c; j++){
+ c = (i == m->lbl.r &&
+ j - m->lbl.c < len) ? label[j - m->lbl.c] : ' ';
+ if(k < sizeof(labelpart))
+ labelpart[k++] = c;
+ }
+
+ if(k < sizeof(labelpart))
+ labelpart[k] = '\0';
+ }
+
+ if(prename)
+ Write_to_screen(prename);
+
+ if(namepart){
+ if(name_color && col_offsetchars)
+ (void) pico_set_colorp(name_color, PSC_NONE);
+
+ Write_to_screen(namepart);
+ }
+
+ if(labelpart){
+ if(name_color && col_offsetchars){
+ if(label_color)
+ (void) pico_set_colorp(label_color, PSC_NONE);
+ else{
+ if(state)
+ StartInverse();
+ else
+ EndInverse();
+ }
+ }
+
+ Write_to_screen(labelpart);
+ }
+
+ if(do_color){
+ if(lastc){
+ (void)pico_set_colorp(lastc, PSC_NONE);
+ free_color_pair(&lastc);
+ }
+ else if(state)
+ EndInverse();
+ else
+ pico_set_normal_color();
+
+ if(name_color)
+ free_color_pair(&name_color);
+ if(label_color)
+ free_color_pair(&label_color);
+ }
+ else{
+ if(state)
+ EndInverse();
+ }
+}
+#endif /* MOUSE */
+
+
+#ifdef _WINDOWS
+/*
+ * This function scans the key menu and calls mswin.c functions
+ * to build a corresponding windows menu.
+ */
+void
+configure_menu_items (struct key_menu *km, bitmap_t bitmap)
+{
+ int i;
+ struct key *k;
+ UCS key;
+
+ mswin_menuitemclear ();
+
+ if(!km)
+ return;
+
+ for (i = 0, k = km->keys ; i < km->how_many * 12; i++, k++) {
+ if (k->name != NULL && k->label != NULL && bitnset (i, bitmap) &&
+ k->menuitem != KS_NONE) {
+
+ if (k->name[0] == '^')
+ key = ctrl(k->name[1]);
+ else if (strcmp(k->name, "Ret") == 0)
+ key = '\r';
+ else if (strcmp(k->name, "Spc") == 0)
+ key = ' ';
+ else
+ key = k->name[0];
+
+ mswin_menuitemadd (key, k->label, k->menuitem, 0);
+ }
+ }
+}
+#endif