1 #if !defined(lint) && !defined(DOS)
2 static char rcsid
[] = "$Id: keymenu.c 1074 2008-06-04 00:08:43Z hubert@u.washington.edu $";
6 * ========================================================================
7 * Copyright 2013-2020 Eduardo Chappa
8 * Copyright 2006-2008 University of Washington
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * ========================================================================
24 #include "../pith/bitmap.h"
25 #include "../pith/conf.h"
26 #include "../pith/state.h"
30 * We put all of the keymenu definitions here so that it is easy to
31 * share them. The names are in keymenu.h, as well. Some of these
32 * aren't easily shareable because we modify them dynamically but
33 * here they are anyway. It's not altogether clear that this is a good idea.
34 * Perhaps it would be better to just define the keymenus multiple times
35 * in different source files even though they are the same, with static
38 * The key numbers are sometimes used symbolically, like OTHER_KEY. Those
39 * are in keymenu.h, too, and are hard to use. If you change a menu here
40 * be sure to check those key numbers that go with it in keymenu.h.
44 void configure_menu_items (struct key_menu
*, bitmap_t
);
49 * Macro to simplify instantiation of key_menu structs from key structs
51 #define INST_KEY_MENU(X, Y) struct key_menu X = \
52 {sizeof(Y)/(sizeof(Y[0])*12), 0, 0, Y}
54 struct key cancel_keys
[] =
56 {"^C",N_("Cancel"),{MC_NONE
},KS_NONE
},
67 INST_KEY_MENU(cancel_keymenu
, cancel_keys
);
71 * A bunch of these are NULL_MENU because we want to change them dynamically.
73 struct key ab_keys
[] =
78 /* TRANSLATORS: go to Previous Entry */
79 {"P", N_("PrevEntry"), {MC_PREVITEM
,1,{'p'}}, KS_NONE
},
80 /* TRANSLATORS: go to Next Entry */
81 {"N", N_("NextEntry"), {MC_NEXTITEM
,1,{'n'}}, KS_NONE
},
104 /* TRANSLATORS: Select this Entry */
105 {";",N_("Select"),{MC_SELECT
,1,{';'}},KS_NONE
},
106 /* TRANSLATORS: Apply a command to several objects at once */
107 {"A",N_("Apply"),{MC_APPLY
,1,{'a'}},KS_APPLY
},
108 /* TRANSLATORS: Select Current entry */
109 {":",N_("SelectCur"),{MC_SELCUR
,1,{':'}},KS_SELECTCUR
},
110 /* TRANSLATORS: Zoom refers to zooming in on a smaller set of
111 items, like with a camera zoom lense */
112 {"Z",N_("ZoomMode"),{MC_ZOOM
,1,{'z'}},KS_NONE
},
120 INST_KEY_MENU(ab_keymenu
, ab_keys
);
123 struct key abook_select_keys
[] =
126 {"E", N_("Exit"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
127 {"S", "[" N_("Select") "]", {MC_CHOICE
,3,{'s',ctrl('M'),ctrl('J')}}, KS_NONE
},
128 /* TRANSLATORS: go to Previous entry */
129 {"P", N_("Prev"), {MC_PREVITEM
, 1, {'p'}}, KS_NONE
},
130 {"N", N_("Next"), {MC_NEXTITEM
, 2, {'n', TAB
}}, KS_NONE
},
137 INST_KEY_MENU(abook_select_km
, abook_select_keys
);
140 struct key abook_view_keys
[] =
143 /* TRANSLATORS: Abook is an abbreviation for Address Book */
144 {"<",N_("Abook"),{MC_EXIT
,2,{'<',','}},KS_NONE
},
145 {"U",N_("Update"),{MC_EDIT
,1,{'u'}},KS_NONE
},
146 /* TRANSLATORS: ComposeTo means to start editing a new message to
147 this address book entry */
148 {"C",N_("ComposeTo"),{MC_COMPOSE
,1,{'c'}},KS_COMPOSER
},
154 /* TRANSLATORS: abbreviation for Forward as Email */
155 {"F", N_("Fwd Email"), {MC_FORWARD
, 1, {'f'}}, KS_FORWARD
},
160 /* TRANSLATORS: View the highlighted link, for example, a URL */
161 {"V",N_("ViewLink"),{MC_VIEW_HANDLE
,3,{'v',ctrl('m'),ctrl('j')}},KS_NONE
},
163 /* TRANSLATORS: go to the previous link, for example, the previous URL */
164 {"^B",N_("PrevLink"),{MC_PREV_HANDLE
,1,{ctrl('B')}},KS_NONE
},
165 {"^F",N_("NextLink"),{MC_NEXT_HANDLE
,1,{ctrl('F')}},KS_NONE
},
172 INST_KEY_MENU(abook_view_keymenu
, abook_view_keys
);
175 struct key abook_text_keys
[] =
178 {"E",N_("Exit Viewer"),{MC_EXIT
,1,{'e'}},KS_NONE
},
187 {"S", N_("Save"), {MC_SAVETEXT
,1,{'s'}}, KS_SAVE
}};
188 INST_KEY_MENU(abook_text_km
, abook_text_keys
);
191 struct key ldap_view_keys
[] =
194 /* TRANSLATORS: go back to the index of results instead of
195 viewing this particular entry */
196 {"<",N_("Results Index"),{MC_EXIT
,2,{'<',','}},KS_NONE
},
198 {"C", N_("ComposeTo"), {MC_COMPOSE
,1,{'c'}}, KS_COMPOSER
},
209 {"V",N_("ViewLink"),{MC_VIEW_HANDLE
,3,{'v',ctrl('m'),ctrl('j')}},KS_NONE
},
211 {"^B",N_("PrevLink"),{MC_PREV_HANDLE
,1,{ctrl('B')}},KS_NONE
},
212 {"^F",N_("NextLink"),{MC_NEXT_HANDLE
,1,{ctrl('F')}},KS_NONE
},
219 INST_KEY_MENU(ldap_view_keymenu
, ldap_view_keys
);
222 struct key context_mgr_keys
[] =
225 {"<", N_("Main Menu"), {MC_MAIN
,3,{'m','<',','}}, KS_EXITMODE
},
226 /* TRANSLATORS: View this Collection of folders */
227 {">", "[" N_("View Cltn") "]",
228 {MC_CHOICE
,5,{'v','>','.',ctrl('M'),ctrl('J')}}, KS_NONE
},
250 INST_KEY_MENU(c_mgr_km
, context_mgr_keys
);
253 struct key context_cfg_keys
[] =
256 {"E", N_("Exit Setup"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
257 {"C", "[" N_("Change") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
262 /* TRANSLATORS; Add a Collection of folders */
263 {"A", N_("Add Cltn"), {MC_ADD
,1,{'a'}}, KS_NONE
},
265 /* TRANSLATORS; Change the order of items in a list */
266 {"$", N_("Shuffle"), {MC_SHUFFLE
,1,{'$'}},KS_NONE
},
281 INST_KEY_MENU(c_cfg_km
, context_cfg_keys
);
284 struct key context_select_keys
[] =
286 {"E", N_("ExitSelect"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
288 /* TRANSLATORS: View this collection */
289 {">", "[" N_("View Cltn") "]",
290 {MC_CHOICE
, 5, {'v','>','.',ctrl('M'),ctrl('J')}}, KS_NONE
},
299 INST_KEY_MENU(c_sel_km
, context_select_keys
);
302 struct key context_fcc_keys
[] =
304 {"E", N_("ExitSelect"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
306 {">", "[" N_("View Cltn") "]",
307 {MC_CHOICE
, 5, {'v','>','.',ctrl('M'),ctrl('J')}}, KS_NONE
},
316 INST_KEY_MENU(c_fcc_km
, context_fcc_keys
);
318 struct key folder_keys
[] =
321 {"<", NULL
, {MC_EXIT
,2,{'<',','}}, KS_NONE
},
322 {">", NULL
, {MC_CHOICE
,2,{'>','.'}}, KS_NONE
},
327 /* TRANSLATORS: make an addition, for example add a new folder
328 or a new entry in an address book */
329 {"A",N_("Add"),{MC_ADDFLDR
,1,{'a'}},KS_NONE
},
331 /* TRANSLATORS: change the name of something */
332 {"R",N_("Rename"),{MC_RENAMEFLDR
,1,{'r'}}, KS_NONE
},
339 {"V", "[" N_("View Fldr") "]", {MC_OPENFLDR
}, KS_NONE
},
343 {"%", N_("Print"), {MC_PRINTFLDR
,1,{'%'}}, KS_PRINT
},
344 {"Z", N_("ZoomMode"), {MC_ZOOM
,1,{'z'}}, KS_NONE
},
345 {";",N_("Select"),{MC_SELECT
,1,{';'}},KS_SELECT
},
346 /* TRANSLATORS: Select current item */
347 {":",N_("SelectCur"),{MC_SELCUR
,1,{':'}},KS_SELECT
},
355 {"$", N_("Shuffle"), {MC_SHUFFLE
,1,{'$'}},KS_NONE
},
358 /* TRANSLATORS: Import refers to bringing something in from
359 outside of alpine's normal world */
360 {"U", N_("Import"), {MC_IMPORT
,1,{'u'}},KS_NONE
},
363 INST_KEY_MENU(folder_km
, folder_keys
);
366 struct key folder_sel_keys
[] =
368 {"E", N_("ExitSelect"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
370 {NULL
, NULL
, {MC_CHOICE
,0}, KS_NONE
},
375 {"S", N_("Select"), {MC_OPENFLDR
,1,{'s'}}, KS_NONE
},
392 INST_KEY_MENU(folder_sel_km
, folder_sel_keys
);
395 struct key folder_sela_keys
[] =
397 {"E", N_("ExitSelect"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
399 {NULL
, NULL
, {MC_CHOICE
,0}, KS_NONE
},
404 {"S", N_("Select"), {MC_OPENFLDR
,1,{'s'}}, KS_NONE
},
406 {"A", N_("AddNew"), {MC_ADD
,1,{'a'}}, KS_NONE
},
421 INST_KEY_MENU(folder_sela_km
, folder_sela_keys
);
424 struct key folder_sub_keys
[] =
426 /* TRANSLATORS: Subscribe to a news group */
427 {"S", N_("Subscribe"), {MC_CHOICE
,1,{'s'}}, KS_NONE
},
428 /* TRANSLATORS: Exit Subscribe screen */
429 {"E", N_("ExitSubscb"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
430 {NULL
, "[" N_("Select") "]", {MC_CHOICE
,3,{'s',ctrl('M'),ctrl('J')}}, KS_NONE
},
435 /* TRANSLATORS: List Mode in alpine is where you can select not just
436 one of something but you can select a whole list of something, for
437 example a whole list of addresses to send to. */
438 {"L", N_("List Mode"), {MC_LISTMODE
, 1, {'l'}}, KS_NONE
},
455 INST_KEY_MENU(folder_sub_km
, folder_sub_keys
);
458 struct key folder_post_keys
[] =
461 {"E", N_("ExitSelect"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
462 {"S", "[" N_("Select") "]", {MC_CHOICE
, 3, {'s',ctrl('M'),ctrl('J')}}, KS_NONE
},
471 INST_KEY_MENU(folder_post_km
, folder_post_keys
);
474 struct key help_keys
[] =
476 {NULL
,NULL
,{MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
477 {NULL
,NULL
,{MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
478 {NULL
,NULL
,{MC_VIEW_HANDLE
,3,{'v',ctrl('m'),ctrl('j')}},KS_NONE
},
479 {"^B",N_("PrevLink"),{MC_PREV_HANDLE
,1,{ctrl('B')}},KS_NONE
},
480 {"^F",N_("NextLink"),{MC_NEXT_HANDLE
,1,{ctrl('F')}},KS_NONE
},
484 {"Z",N_("Print All"),{MC_PRINTALL
,1,{'z'}},KS_NONE
},
485 {"N",N_("Name"),{MC_EXPORT
,1,{'n'}},KS_NONE
},
500 INST_KEY_MENU(help_keymenu
, help_keys
);
503 struct key rev_msg_keys
[] =
506 {"E",N_("Exit Viewer"),{MC_EXIT
,1,{'e'}},KS_EXITMODE
},
508 {"T",NULL
,{MC_TOGGLE
,1,{'t'}},KS_NONE
},
509 {"D",NULL
,{MC_JUMP
,1,{'d'}},KS_NONE
},
515 {"S", N_("Save"), {MC_SAVETEXT
,1,{'s'}}, KS_SAVE
},
529 INST_KEY_MENU(rev_msg_keymenu
, rev_msg_keys
);
532 struct key ans_certfail_keys
[] =
536 /* TRANSLATORS: Continue means to keep going. The user is paused to read
537 something and has to tell us to continue when they are finished. */
538 {"C","[" N_("Continue") "]",{MC_YES
,3,{'c',ctrl('J'),ctrl('M')}},KS_NONE
},
547 INST_KEY_MENU(ans_certfail_keymenu
, ans_certfail_keys
);
550 struct key ans_certquery_keys
[] =
553 {"Y",N_("Yes, continue"),{MC_YES
,1,{'y'}},KS_NONE
},
554 {"D","[" N_("Details") "]",{MC_VIEW_HANDLE
,3,{'d',ctrl('M'),ctrl('J')}},KS_NONE
},
555 {"N",N_("No"),{MC_NO
,1,{'n'}},KS_NONE
},
562 {"S", N_("Save"), {MC_SAVETEXT
,1,{'s'}}, KS_SAVE
}};
563 INST_KEY_MENU(ans_certquery_keymenu
, ans_certquery_keys
);
565 struct key oauth2_alpine_auth_keys
[] =
568 {"C",N_("Enter Code"),{MC_YES
,1,{'c'}},KS_NONE
},
569 {"V","[" N_("View URL") "]",{MC_VIEW_HANDLE
,3,{'v',ctrl('M'),ctrl('J')}},KS_NONE
},
570 {"E",N_("Exit"),{MC_NO
,1,{'e'}},KS_NONE
},
577 {"S", N_("Save"), {MC_SAVETEXT
,1,{'s'}}, KS_SAVE
}};
578 INST_KEY_MENU(oauth2_auth_keymenu
, oauth2_alpine_auth_keys
);
580 struct key oauth2_device_alpine_auth_keys
[] =
584 {"V","[" N_("View URL") "]",{MC_VIEW_HANDLE
,3,{'v',ctrl('M'),ctrl('J')}},KS_NONE
},
585 {"E",N_("Exit"),{MC_NO
,1,{'e'}},KS_NONE
},
592 {"S", N_("Save"), {MC_SAVETEXT
,1,{'s'}}, KS_SAVE
}};
593 INST_KEY_MENU(oauth2_device_auth_keymenu
, oauth2_alpine_auth_keys
);
595 struct key forge_keys
[] =
598 {"Y",N_("Yes, continue"),{MC_YES
,1,{'y'}},KS_NONE
},
599 {"N",N_("No"),{MC_NO
,1,{'n'}},KS_NONE
},
607 {"S", N_("Save"), {MC_SAVETEXT
,1,{'s'}}, KS_SAVE
}};
608 INST_KEY_MENU(forge_keymenu
, forge_keys
);
611 struct key listmgr_keys
[] =
614 /* TRANSLATORS: Exit Command List */
615 {"E",N_("Exit CmdList"),{MC_EXIT
,1,{'e'}},KS_EXITMODE
},
616 {"Ret","[" N_("Try Command") "]",{MC_VIEW_HANDLE
,3,
617 {ctrl('m'),ctrl('j'),KEY_RIGHT
}},KS_NONE
},
618 /* TRANSLATORS: go to Previous Command in list */
619 {"^B",N_("Prev Cmd"),{MC_PREV_HANDLE
,1,{ctrl('B')}},KS_NONE
},
620 /* TRANSLATORS: go to Next Command in list */
621 {"^F",N_("Next Cmd"),{MC_NEXT_HANDLE
,1,{ctrl('F')}},KS_NONE
},
628 INST_KEY_MENU(listmgr_keymenu
, listmgr_keys
);
631 struct key index_keys
[] =
634 {"<", NULL
, {MC_FOLDERS
,2,{'<',','}}, KS_NONE
},
660 {"X",NULL
,{MC_EXPUNGE
,1,{'x'}},KS_NONE
},
661 /* TRANSLATORS: this stands for unexclude which is the opposite
662 of the exclude command. Exclude eliminates some messages from
663 the view and unexclude gets them back. */
664 {"&",N_("unXclude"),{MC_UNEXCLUDE
,1,{'&'}},KS_NONE
},
665 {";",N_("Select"),{MC_SELECT
,1,{';'}},KS_SELECT
},
666 {"A",N_("Apply"),{MC_APPLY
,1,{'a'}},KS_APPLY
},
676 {":",N_("SelectCur"),{MC_SELCUR
,1,{':'}},KS_SELECTCUR
},
677 {"Z",N_("ZoomMode"),{MC_ZOOM
,1,{'z'}},KS_ZOOM
},
683 /* TRANSLATORS: toggles a collapsed view or an expanded view
684 of a message thread on and off */
685 {"/",N_("Collapse/Expand"),{MC_COLLAPSE
,1,{'/'}},KS_NONE
},
686 {"@", N_("Quota"), {MC_QUOTA
,1,{'@'}}, KS_NONE
},
688 INST_KEY_MENU(index_keymenu
, index_keys
);
691 struct key simple_index_keys
[] =
693 {"E",N_("ExitSelect"),{MC_EXIT
,1,{'e'}},KS_EXITMODE
},
695 {"S","[" N_("Select") "]",{MC_SELECT
,3,{'s',ctrl('M'),ctrl('J')}},KS_SELECT
},
704 INST_KEY_MENU(simple_index_keymenu
, simple_index_keys
);
707 struct key thread_keys
[] =
710 /* TRANSLATORS: go to the Folder List */
711 {"<", N_("FldrList"), {MC_FOLDERS
,2,{'<',','}}, KS_NONE
},
712 /* TRANSLATORS: View a Thread of messages */
713 {">", "[" N_("ViewThd") "]", {MC_VIEW_ENTRY
,5,{'v','.','>',ctrl('M'),ctrl('J')}},
715 /* TRANSLATORS: go to the Previous Thread */
716 {"P", N_("PrevThd"), {MC_PREVITEM
, 1, {'p'}}, KS_PREVMSG
},
717 /* TRANSLATORS: go to the Next Thread */
718 {"N", N_("NextThd"), {MC_NEXTITEM
, 1, {'n'}}, KS_NEXTMSG
},
741 {"X",NULL
,{MC_EXPUNGE
,1,{'x'}},KS_NONE
},
742 {"&",N_("unXclude"),{MC_UNEXCLUDE
,1,{'&'}},KS_NONE
},
743 {";",N_("Select"),{MC_SELECT
,1,{';'}},KS_SELECT
},
744 {"A",N_("Apply"),{MC_APPLY
,1,{'a'}},KS_APPLY
},
754 {":",N_("SelectCur"),{MC_SELCUR
,1,{':'}},KS_SELECTCUR
},
755 {"Z",N_("ZoomMode"),{MC_ZOOM
,1,{'z'}},KS_ZOOM
},
761 {"/",N_("Collapse/Expand"),{MC_COLLAPSE
,1,{'/'}},KS_NONE
},
762 {"@", N_("Quota"), {MC_QUOTA
,1,{'@'}}, KS_NONE
},
764 INST_KEY_MENU(thread_keymenu
, thread_keys
);
767 struct key att_index_keys
[] =
770 {"<",NULL
,{MC_EXIT
,2,{'<',','}},KS_EXITMODE
},
771 {">","[" N_("View") "]",{MC_VIEW_ATCH
,5,{'v','>','.',ctrl('M'),ctrl('J')}},
773 /* TRANSLATORS: go to Previous Attachment */
774 {"P", N_("PrevAttch"),{MC_PREVITEM
,4,{'p',ctrl('B'),ctrl('P'),KEY_UP
}},
776 /* TRANSLATORS: go to Next Attachment */
777 {"N", N_("NextAtch"),
778 {MC_NEXTITEM
, 5, {'n','\t',ctrl('F'),ctrl('N'), KEY_DOWN
}},
784 {"S", N_("Save"), {MC_SAVETEXT
,1,{'s'}}, KS_SAVE
},
785 {NULL
, NULL
, {MC_EXPORT
, 1, {'e'}}, KS_EXPORT
},
793 /* TRANSLATORS: About Attachment, a short description of the attachment */
794 {"A",N_("AboutAttch"),{MC_ABOUTATCH
,1,{'a'}},KS_NONE
},
796 {"%", N_("Print"), {MC_PRINTMSG
,1,{'%'}}, KS_PRINT
},
804 {"X",N_("eXternal"),{MC_EXTERNAL
,1,{'x'}},KS_NONE
},
813 INST_KEY_MENU(att_index_keymenu
, att_index_keys
);
816 struct key att_view_keys
[] =
819 {"<",NULL
,{MC_EXIT
,2,{'<',','}},KS_EXITMODE
},
820 /* TRANSLATORS: View highlighted URL */
821 {"Ret","[" N_("View Hilite") "]",{MC_VIEW_HANDLE
,3,
822 {ctrl('m'),ctrl('j'),KEY_RIGHT
}},KS_NONE
},
823 /* TRANSLATORS: go to Previous URL */
824 {"^B",N_("Prev URL"),{MC_PREV_HANDLE
,1,{ctrl('B')}},KS_NONE
},
825 /* TRANSLATORS: go to Next URL */
826 {"^F",N_("Next URL"),{MC_NEXT_HANDLE
,1,{ctrl('F')}},KS_NONE
},
842 {"%", N_("Print"), {MC_PRINTMSG
,1,{'%'}}, KS_PRINT
},
854 {"^D","Decrypt", {MC_DECRYPT
,1,{ctrl('d')}},KS_NONE
},
855 {"^E","Security", {MC_SECURITY
,1,{ctrl('e')}},KS_NONE
},
864 INST_KEY_MENU(att_view_keymenu
, att_view_keys
);
867 struct key view_keys
[] =
870 /* TRANSLATORS: go to Message Index */
871 {"<",N_("MsgIndex"),{MC_INDEX
,3,{'i','<',','}},KS_FLDRINDEX
},
872 /* TRANSLATORS: View the Attachment */
873 {">",N_("ViewAttch"),{MC_VIEW_ATCH
,3,{'v','>','.'}},KS_NONE
},
898 /* TRANSLATORS: View the highlighted URL */
899 {"Ret","[" N_("View Hilite") "]",{MC_VIEW_HANDLE
,3,
900 {ctrl('m'),ctrl('j'),KEY_RIGHT
}},KS_NONE
},
901 /* TRANSLATORS: Select the current item */
902 {":",N_("SelectCur"),{MC_SELCUR
,1,{':'}},KS_SELECTCUR
},
903 /* TRANSLATORS: go to previous URL */
904 {"^B",N_("Prev URL"),{MC_PREV_HANDLE
,1,{ctrl('B')}},KS_NONE
},
905 /* TRANSLATORS: go to next URL */
906 {"^F",N_("Next URL"),{MC_NEXT_HANDLE
,1,{ctrl('F')}},KS_NONE
},
919 {"A",N_("TogglePreferPlain"),{MC_TOGGLE
,1,{'a'}},KS_NONE
},
921 {"^D","Decrypt", {MC_DECRYPT
,1,{ctrl('d')}},KS_NONE
},
922 {"^E","Security", {MC_SECURITY
,1,{ctrl('e')}},KS_NONE
},
931 INST_KEY_MENU(view_keymenu
, view_keys
);
934 struct key simple_text_keys
[] =
937 {"E",N_("Exit Viewer"),{MC_EXIT
,1,{'e'}},KS_EXITMODE
},
946 {"S", N_("Save"), {MC_SAVETEXT
,1,{'s'}}, KS_SAVE
},
960 INST_KEY_MENU(simple_text_keymenu
, simple_text_keys
);
963 struct key oe_keys
[] =
964 {{"^G",N_("Help"),{MC_NONE
},KS_SCREENHELP
},
965 {"^C",N_("Cancel"),{MC_NONE
},KS_NONE
},
966 {"^T","xxx",{MC_NONE
},KS_NONE
},
967 /* TRANSLATORS: The user is entering characters, for example, the
968 name of a folder. Accept means the user is done and wants to
969 accept what is currently displayed. */
970 {"Ret",N_("Accept"),{MC_NONE
},KS_NONE
},
979 INST_KEY_MENU(oe_keymenu
, oe_keys
);
982 struct key choose_setup_keys
[] =
985 {"E",N_("Exit Setup"),{MC_EXIT
,2,{'e',ctrl('C')}},KS_EXITMODE
},
986 {"P",N_("Printer"),{MC_PRINTER
,1,{'p'}},KS_NONE
},
987 /* TRANSLATORS: Change password */
988 {"N",N_("Newpassword"),{MC_PASSWD
,1,{'n'}},KS_NONE
},
989 /* TRANSLATORS: Configure Alpine */
990 {"C",N_("Config"),{MC_CONFIG
,1,{'c'}},KS_NONE
},
991 /* TRANSLATORS: Edit signature block */
992 {"S",N_("Signature"),{MC_SIG
,1,{'s'}},KS_NONE
},
993 /* TRANSLATORS: configure address books */
994 {"A",N_("AddressBooks"),{MC_ABOOKS
,1,{'a'}},KS_NONE
},
995 /* TRANSLATORS: configure collection lists */
996 {"L",N_("collectionList"),{MC_CLISTS
,1,{'l'}},KS_NONE
},
997 /* TRANSLATORS: configure rules, an alpine concept */
998 {"R",N_("Rules"),{MC_RULES
,1,{'r'}},KS_NONE
},
999 /* TRANSLATORS: configure directory servers */
1000 {"D",N_("Directory"),{MC_DIRECTORY
,1,{'d'}},KS_NONE
},
1001 /* TRANSLATORS: configure color */
1002 {"K",N_("Kolor"),{MC_KOLOR
,1,{'k'}},KS_NONE
},
1007 /* TRANSLATORS: remote configuration setup */
1008 {"Z",N_("RemoteConfigSetup"),{MC_REMOTE
,1,{'z'}},KS_NONE
},
1009 /* TRANSLATORS: configure S/MIME */
1010 {"M",N_("S/Mime"),{MC_SECURITY
,1,{'m'}},KS_NONE
},
1011 {"U",N_("xoaUth2"),{MC_XOAUTH2
,1,{'u'}},KS_NONE
},
1018 INST_KEY_MENU(choose_setup_keymenu
, choose_setup_keys
);
1021 struct key main_keys
[] =
1026 /* TRANSLATORS: go to Previous Command in list */
1027 {"P",N_("PrevCmd"),{MC_PREVITEM
,3,{'p',ctrl('P'),KEY_UP
}},KS_NONE
},
1028 {"N",N_("NextCmd"),{MC_NEXTITEM
,3,{'n',ctrl('N'),KEY_DOWN
}},KS_NONE
},
1031 /* TRANSLATORS: show release notes */
1032 {"R",N_("RelNotes"),{MC_RELNOTES
,1,{'r'}},KS_NONE
},
1033 /* TRANSLATORS: lock keyboard */
1034 {"K",N_("KBLock"),{MC_KBLOCK
,1,{'k'}},KS_NONE
},
1044 {"I",N_("Index"),{MC_INDEX
,1,{'i'}},KS_FLDRINDEX
},
1045 /* TRANSLATORS: go to the Journal. The Journal shows past
1046 messages that alpine has shown the user. */
1047 {"J",N_("Journal"),{MC_JOURNAL
,1,{'j'}},KS_REVIEW
},
1048 /* TRANSLATORS: go to the Setup screen */
1049 {"S",N_("Setup"),{MC_SETUP
,1,{'s'}},KS_NONE
},
1050 /* TRANSLATORS: go to the address book screen */
1051 {"A",N_("AddrBook"),{MC_ADDRBOOK
,1,{'a'}},KS_ADDRBOOK
},
1054 INST_KEY_MENU(main_keymenu
, main_keys
);
1057 struct key simple_file_keys
[] =
1060 {"Q",N_("Quit Viewer"),{MC_EXIT
,1,{'q'}},KS_NONE
},
1069 {"S", N_("Save"), {MC_SAVETEXT
,1,{'s'}}, KS_SAVE
},
1083 INST_KEY_MENU(simple_file_keymenu
, simple_file_keys
);
1086 struct key nuov_keys
[] =
1089 {"E",NULL
,{MC_EXIT
,1,{'e'}},KS_NONE
},
1090 {"V",N_("ViewLink"),{MC_VIEW_HANDLE
,3,{'v',ctrl('m'),ctrl('j')}},KS_NONE
},
1097 /* TRANSLATORS: show release notes */
1098 {"R",N_("RelNotes"),{MC_RELNOTES
,1,{'r'}},KS_NONE
},
1113 INST_KEY_MENU(nuov_keymenu
, nuov_keys
);
1116 struct key modal_message_keys
[] =
1119 {"Ret",N_("Finished"),{MC_EXIT
,2,{ctrl('m'),ctrl('j')}},KS_NONE
},
1129 INST_KEY_MENU(modal_message_keymenu
, modal_message_keys
);
1132 struct key ta_keys_lm
[] =
1136 /* TRANSLATORS: Take this address into the address book */
1137 {"T", N_("Take"), {MC_TAKE
,1,{'t'}}, KS_NONE
},
1142 {"X","[" N_("Set/Unset") "]", {MC_CHOICE
,3,{'x',ctrl('M'),ctrl('J')}}, KS_NONE
},
1143 {"A", N_("SetAll"),{MC_SELALL
,1,{'a'}},KS_NONE
},
1144 {"U",N_("UnSetAll"),{MC_UNSELALL
,1,{'u'}},KS_NONE
},
1145 /* TRANSLATORS: The Take Address screen has a Single mode and a
1146 List mode. This command causes us to go into Single mode. */
1147 {"S",N_("SinglMode"),{MC_LISTMODE
,1,{'s'}},KS_NONE
}};
1148 INST_KEY_MENU(ta_keymenu_lm
, ta_keys_lm
);
1151 struct key ta_keys_sm
[] =
1155 {"T","[" N_("Take") "]",{MC_TAKE
,3,{'t',ctrl('M'),ctrl('J')}}, KS_NONE
},
1163 /* TRANSLATORS: The Take Address screen has a Single mode and a
1164 List mode. This command causes us to go into List mode. */
1165 {"L",N_("ListMode"),{MC_LISTMODE
,1,{'l'}},KS_NONE
}};
1166 INST_KEY_MENU(ta_keymenu_sm
, ta_keys_sm
);
1169 struct key pipe_cancel_keys
[] =
1171 {"^C",N_("Stop Waiting"),{MC_NONE
},KS_NONE
},
1182 INST_KEY_MENU(pipe_cancel_keymenu
, pipe_cancel_keys
);
1185 struct key color_pattern_keys
[] =
1189 /* TRANSLATORS: Change Value */
1190 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
1196 /* TRANSLATORS: Delete Value */
1197 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
1203 {"I", N_("IndxHdr"), {MC_ADDHEADER
,1,{'i'}}, KS_NONE
},
1213 INST_KEY_MENU(color_pattern_keymenu
, color_pattern_keys
);
1216 struct key hdr_color_checkbox_keys
[] =
1229 INST_KEY_MENU(hdr_color_checkbox_keymenu
, hdr_color_checkbox_keys
);
1232 struct key kw_color_checkbox_keys
[] =
1245 INST_KEY_MENU(kw_color_checkbox_keymenu
, kw_color_checkbox_keys
);
1248 struct key selectable_bold_checkbox_keys
[] =
1261 INST_KEY_MENU(selectable_bold_checkbox_keymenu
, selectable_bold_checkbox_keys
);
1264 struct key flag_keys
[] =
1266 {"A", N_("Add KW"), {MC_ADD
,1,{'a'}}, KS_NONE
},
1267 /* TRANSLATORS: Exit from the Flags screen */
1268 {"E", N_("Exit Flags"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
1278 INST_KEY_MENU(flag_keymenu
, flag_keys
);
1281 struct key addr_select_keys
[] =
1283 {"E", N_("ExitSelect"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
1285 {"S", "[" N_("Select") "]", {MC_CHOICE
,3,{'s',ctrl('M'),ctrl('J')}}, KS_NONE
},
1294 INST_KEY_MENU(addr_s_km
, addr_select_keys
);
1297 struct key addr_select_with_goback_keys
[] =
1300 /* TRANSLATORS: go to address book list */
1301 {"<", N_("AddressBkList"), {MC_ADDRBOOK
,2,{'<',','}}, KS_NONE
},
1302 {"S", "[" N_("Select") "]", {MC_CHOICE
,3,{'s',ctrl('M'),ctrl('J')}}, KS_NONE
},
1309 {"E", N_("ExitSelect"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
1311 INST_KEY_MENU(addr_s_km_with_goback
, addr_select_with_goback_keys
);
1313 static struct key addr_select_with_view_keys
[] =
1316 {"<", N_("AddressBkList"), {MC_ADDRBOOK
,2,{'<',','}}, KS_NONE
},
1317 {">", "[" N_("View") "]",
1318 {MC_VIEW_TEXT
,5,{'v','>','.',ctrl('M'),ctrl('J')}}, KS_NONE
},
1323 /* TRANSLATORS: compose a message to the current address */
1324 {"C", N_("ComposeTo"), {MC_COMPOSE
,1,{'c'}}, KS_COMPOSER
},
1341 INST_KEY_MENU(addr_s_km_with_view
, addr_select_with_view_keys
);
1344 struct key addr_select_for_url_keys
[] =
1347 {"<", N_("Exit Viewer"), {MC_ADDRBOOK
,3,{'<',',','e'}}, KS_NONE
},
1348 {">", "[" N_("View") "]",
1349 {MC_VIEW_TEXT
,5,{'v','>','.',ctrl('M'),ctrl('J')}}, KS_NONE
},
1354 {"C", N_("ComposeTo"), {MC_COMPOSE
,1,{'c'}}, KS_COMPOSER
},
1371 INST_KEY_MENU(addr_s_km_for_url
, addr_select_for_url_keys
);
1374 struct key addr_select_exit_keys
[] =
1377 {"E", "[" N_("Exit") "]", {MC_EXIT
,3,{'e',ctrl('M'),ctrl('J')}},
1388 INST_KEY_MENU(addr_s_km_exit
, addr_select_exit_keys
);
1391 struct key addr_select_goback_keys
[] =
1394 {"E", "[" N_("Exit") "]", {MC_ADDRBOOK
,3,{'e',ctrl('M'),ctrl('J')}},
1405 INST_KEY_MENU(addr_s_km_goback
, addr_select_goback_keys
);
1408 struct key config_text_keys
[] =
1412 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
1417 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
1418 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
1434 INST_KEY_MENU(config_text_keymenu
, config_text_keys
);
1436 struct key config_xoauth2_text_keys
[] =
1440 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
1445 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
1446 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
1452 {"^A", N_("Add Server"), {MC_XSADD
,1,{ctrl('A')}}, KS_NONE
},
1453 {"^D", N_("Del Server"), {MC_XSDELETE
,1,{ctrl('d')}}, KS_NONE
},
1455 {"^H", N_("Conf Help"), {MC_XSHELP
,1,{ctrl('h')}}, KS_NONE
},
1462 INST_KEY_MENU(config_xoauth2_text_keymenu
, config_xoauth2_text_keys
);
1465 struct key config_text_to_charsets_keys
[] =
1469 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
1474 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
1475 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
1483 /* TRANSLATORS: go to list of keywords */
1484 {"T", N_("ToCharsets"), {MC_CHOICE
, 2, {'t', ctrl('T')}}, KS_NONE
},
1492 INST_KEY_MENU(config_text_to_charsets_keymenu
, config_text_to_charsets_keys
);
1495 struct key direct_config_keys
[] =
1498 {"E", N_("Exit Setup"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
1499 {"C", "[" N_("Change") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
1500 /* TRANSLATORS: go to previous LDAP directory server in the list */
1501 {"P", N_("PrevDir"), {MC_PREVITEM
, 1, {'p'}}, KS_NONE
},
1502 {"N", N_("NextDir"), {MC_NEXTITEM
, 2, {'n', TAB
}}, KS_NONE
},
1505 /* TRANSLATORS: add a directory server to configuration */
1506 {"A", N_("Add Dir"), {MC_ADD
,1,{'a'}}, KS_NONE
},
1507 /* TRANSLATORS: delete a directory */
1508 {"D", N_("Del Dir"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
1509 {"$", N_("Shuffle"), {MC_SHUFFLE
,1,{'$'}}, KS_NONE
},
1524 INST_KEY_MENU(dir_conf_km
, direct_config_keys
);
1527 struct key sel_from_list_keys
[] =
1530 {"E", N_("Exit"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
1531 {"S", "[" N_("Select") "]", {MC_SELECT
,3,{'s',ctrl('J'),ctrl('M')}}, KS_NONE
},
1532 {"P", N_("Prev"), {MC_PREVITEM
, 1, {'p'}}, KS_NONE
},
1533 {"N", N_("Next"), {MC_NEXTITEM
, 2, {'n', TAB
}}, KS_NONE
},
1540 INST_KEY_MENU(sel_from_list
, sel_from_list_keys
);
1543 struct key sel_from_list_keys_ctrlc
[] =
1546 {"^C", N_("exit"), {MC_EXIT
,1,{ctrl('C')}}, KS_EXITMODE
},
1547 {"S", "[" N_("Select") "]", {MC_SELECT
,3,{'s',ctrl('J'),ctrl('M')}}, KS_NONE
},
1548 {"P", N_("Prev"), {MC_PREVITEM
, 1, {'p'}}, KS_NONE
},
1549 {"N", N_("Next"), {MC_NEXTITEM
, 2, {'n', TAB
}}, KS_NONE
},
1556 INST_KEY_MENU(sel_from_list_ctrlc
, sel_from_list_keys_ctrlc
);
1559 struct key sel_from_list_keys_sm
[] =
1562 {"E", N_("Exit"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
1563 {"S", "[" N_("Select") "]", {MC_SELECT
,3,{'s',ctrl('J'),ctrl('M')}}, KS_NONE
},
1564 {"P", N_("Prev"), {MC_PREVITEM
, 1, {'p'}}, KS_NONE
},
1565 {"N", N_("Next"), {MC_NEXTITEM
, 2, {'n', TAB
}}, KS_NONE
},
1569 {"L",N_("ListMode"),{MC_LISTMODE
,1,{'l'}},KS_NONE
},
1585 INST_KEY_MENU(sel_from_list_sm
, sel_from_list_keys_sm
);
1588 struct key sel_from_list_keys_sm_ctrlc
[] =
1591 {"^C", N_("exit"), {MC_EXIT
,1,{ctrl('C')}}, KS_EXITMODE
},
1592 {"S", "[" N_("Select") "]", {MC_SELECT
,3,{'s',ctrl('J'),ctrl('M')}}, KS_NONE
},
1593 {"P", N_("Prev"), {MC_PREVITEM
, 1, {'p'}}, KS_NONE
},
1594 {"N", N_("Next"), {MC_NEXTITEM
, 2, {'n', TAB
}}, KS_NONE
},
1598 {"L",N_("ListMode"),{MC_LISTMODE
,1,{'l'}},KS_NONE
},
1614 INST_KEY_MENU(sel_from_list_sm_ctrlc
, sel_from_list_keys_sm_ctrlc
);
1617 struct key sel_from_list_keys_lm
[] =
1620 {"E", N_("Exit"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
1621 {"S", "[" N_("Select") "]", {MC_SELECT
,3,{'s',ctrl('J'),ctrl('M')}}, KS_NONE
},
1622 {"P", N_("Prev"), {MC_PREVITEM
, 1, {'p'}}, KS_NONE
},
1623 {"N", N_("Next"), {MC_NEXTITEM
, 2, {'n', TAB
}}, KS_NONE
},
1626 {"X", N_("Set/Unset"), {MC_TOGGLE
,1,{'x'}}, KS_NONE
},
1627 {"1",N_("SinglMode"),{MC_LISTMODE
,1,{'1'}},KS_NONE
},
1643 INST_KEY_MENU(sel_from_list_lm
, sel_from_list_keys_lm
);
1646 struct key sel_from_list_keys_lm_ctrlc
[] =
1649 {"^C", N_("exit"), {MC_EXIT
,1,{ctrl('C')}}, KS_EXITMODE
},
1650 {"S", "[" N_("Select") "]", {MC_SELECT
,3,{'s',ctrl('J'),ctrl('M')}}, KS_NONE
},
1651 {"P", N_("Prev"), {MC_PREVITEM
, 1, {'p'}}, KS_NONE
},
1652 {"N", N_("Next"), {MC_NEXTITEM
, 2, {'n', TAB
}}, KS_NONE
},
1655 {"X", N_("Set/Unset"), {MC_TOGGLE
,1,{'x'}}, KS_NONE
},
1656 {"1",N_("SinglMode"),{MC_LISTMODE
,1,{'1'}},KS_NONE
},
1672 INST_KEY_MENU(sel_from_list_lm_ctrlc
, sel_from_list_keys_lm_ctrlc
);
1675 struct key sel_from_list_keys_olm
[] =
1678 {"E", N_("Exit"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
1679 {"S", "[" N_("Select") "]", {MC_SELECT
,3,{'s',ctrl('J'),ctrl('M')}}, KS_NONE
},
1680 {"P", N_("Prev"), {MC_PREVITEM
, 1, {'p'}}, KS_NONE
},
1681 {"N", N_("Next"), {MC_NEXTITEM
, 2, {'n', TAB
}}, KS_NONE
},
1684 {"X", N_("Set/Unset"), {MC_TOGGLE
,1,{'x'}}, KS_NONE
},
1701 INST_KEY_MENU(sel_from_list_olm
, sel_from_list_keys_olm
);
1704 struct key sel_from_list_keys_olm_ctrlc
[] =
1707 {"^C", N_("exit"), {MC_EXIT
,1,{ctrl('C')}}, KS_EXITMODE
},
1708 {"S", "[" N_("Select") "]", {MC_SELECT
,3,{'s',ctrl('J'),ctrl('M')}}, KS_NONE
},
1709 {"P", N_("Prev"), {MC_PREVITEM
, 1, {'p'}}, KS_NONE
},
1710 {"N", N_("Next"), {MC_NEXTITEM
, 2, {'n', TAB
}}, KS_NONE
},
1713 {"X", N_("Set/Unset"), {MC_TOGGLE
,1,{'x'}}, KS_NONE
},
1730 INST_KEY_MENU(sel_from_list_olm_ctrlc
, sel_from_list_keys_olm_ctrlc
);
1735 struct key printer_edit_keys
[] =
1739 {"S", "[" N_("Select") "]", {MC_CHOICE
,3,{'s',ctrl('M'),ctrl('J')}}, KS_NONE
},
1744 /* TRANSLATORS: add a printer to configuration */
1745 {"A", N_("Add Printer"), {MC_ADD
,1,{'a'}}, KS_NONE
},
1746 /* TRANSLATORS: delete a printer from configuration */
1747 {"D", N_("DeletePrint"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
1748 {"C", N_("Change"), {MC_EDIT
,1,{'c'}}, KS_NONE
},
1763 INST_KEY_MENU(printer_edit_keymenu
, printer_edit_keys
);
1766 struct key printer_select_keys
[] =
1770 {"S", "[" N_("Select") "]", {MC_CHOICE
,3,{'s',ctrl('M'),ctrl('J')}}, KS_NONE
},
1779 INST_KEY_MENU(printer_select_keymenu
, printer_select_keys
);
1784 struct key role_select_keys
[] =
1787 {"E", N_("Exit"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
1789 /* TRANSLATORS: go to previous Role in list */
1790 {"P", N_("PrevRole"), {MC_PREVITEM
, 1, {'p'}}, KS_NONE
},
1791 {"N", N_("NextRole"), {MC_NEXTITEM
, 2, {'n', TAB
}}, KS_NONE
},
1796 {"D", "", {MC_TOGGLE
, 1, {'d'}}, KS_NONE
},
1798 INST_KEY_MENU(role_select_km
, role_select_keys
);
1800 struct key xoauth2_flow_select_keys
[] =
1803 {"E", N_("Exit"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
1804 {"S", "[" N_("Select") "]", {MC_CHOICE
,3,{'s',ctrl('M'),ctrl('J')}}, KS_NONE
},
1805 {"P", N_("PrevFlow"), {MC_PREVITEM
, 1, {'p'}}, KS_NONE
},
1806 {"N", N_("NextFlow"), {MC_NEXTITEM
, 2, {'n', TAB
}}, KS_NONE
},
1813 INST_KEY_MENU(xoauth2_flow_select_km
, xoauth2_flow_select_keys
);
1815 struct key xoauth2_id_select_keys
[] =
1818 {"E", N_("Exit"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
1819 {"S", "[" N_("Select") "]", {MC_CHOICE
,3,{'s',ctrl('M'),ctrl('J')}}, KS_NONE
},
1820 {"P", N_("PrevID"), {MC_PREVITEM
, 1, {'p'}}, KS_NONE
},
1821 {"N", N_("NextID"), {MC_NEXTITEM
, 2, {'n', TAB
}}, KS_NONE
},
1828 INST_KEY_MENU(xoauth2_id_select_km
, xoauth2_id_select_keys
);
1831 struct key role_config_keys
[] =
1834 {"E", N_("Exit Setup"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
1835 {"C", "[" N_("Change") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
1836 /* TRANSLATORS: go to previous Rule in list */
1837 {"P", N_("PrevRule"), {MC_PREVITEM
, 1, {'p'}}, KS_NONE
},
1838 {"N", N_("NextRule"), {MC_NEXTITEM
, 2, {'n', TAB
}}, KS_NONE
},
1841 {"A", N_("Add"), {MC_ADD
,1,{'a'}}, KS_NONE
},
1842 {"D", N_("Delete"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
1843 {"$", N_("Shuffle"), {MC_SHUFFLE
,1,{'$'}}, KS_NONE
},
1850 /* TRANSLATORS: Include a File from filesystem */
1851 {"I", N_("IncludeFile"), {MC_ADDFILE
,1,{'i'}}, KS_NONE
},
1852 {"X", N_("eXcludeFile"), {MC_DELFILE
,1,{'x'}}, KS_NONE
},
1855 {"R", N_("Replicate"), {MC_COPY
,1,{'r'}}, KS_NONE
},
1859 INST_KEY_MENU(role_conf_km
, role_config_keys
);
1862 struct key config_text_wshuf_keys
[] =
1866 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
1871 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
1872 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
1880 {"$", N_("Shuffle"), {MC_SHUFFLE
,1,{'$'}}, KS_NONE
},
1888 INST_KEY_MENU(config_text_wshuf_keymenu
, config_text_wshuf_keys
);
1890 struct key config_xoauth2_wshuf_keys
[] =
1894 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
1899 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
1900 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
1906 {"^A", N_("Add Server"), {MC_XSADD
,1,{ctrl('A')}}, KS_NONE
},
1907 {"^D", N_("Del Server"), {MC_XSDELETE
,1,{ctrl('d')}}, KS_NONE
},
1908 {"$", N_("Shuffle"), {MC_SHUFFLE
,1,{'$'}}, KS_NONE
},
1909 {"^H", N_("Conf Help"), {MC_XSHELP
,1,{ctrl('h')}}, KS_NONE
},
1916 INST_KEY_MENU(config_xoauth2_wshuf_keymenu
, config_xoauth2_wshuf_keys
);
1918 struct key config_text_wshufandfldr_keys
[] =
1922 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
1927 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
1928 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
1936 {"$", N_("Shuffle"), {MC_SHUFFLE
,1,{'$'}}, KS_NONE
},
1937 {"T", N_("ToFldrs"), {MC_CHOICE
,2,{'t', ctrl('T')}}, KS_NONE
},
1944 INST_KEY_MENU(config_text_wshufandfldr_keymenu
, config_text_wshufandfldr_keys
);
1947 struct key config_role_file_keys
[] =
1951 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
1956 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
1957 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
1965 /* TRANSLATORS: go to list of Files */
1966 {"T", N_("ToFiles"), {MC_CHOICE
, 2, {'t', ctrl('T')}}, KS_NONE
},
1967 /* TRANSLATORS: edit a file */
1968 {"F", N_("editFile"), {MC_EDITFILE
, 1, {'f'}}, KS_NONE
},
1975 INST_KEY_MENU(config_role_file_keymenu
, config_role_file_keys
);
1978 struct key config_role_file_res_keys
[] =
1982 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
1987 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
1988 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
1996 {"T", N_("ToFiles"), {MC_CHOICE
, 2, {'t', ctrl('T')}}, KS_NONE
},
2004 INST_KEY_MENU(config_role_file_res_keymenu
, config_role_file_res_keys
);
2007 struct key config_role_keyword_keys
[] =
2011 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
2016 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
2017 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
2025 /* TRANSLATORS: go to list of keywords */
2026 {"T", N_("ToKeywords"), {MC_CHOICE
, 2, {'t', ctrl('T')}}, KS_NONE
},
2034 INST_KEY_MENU(config_role_keyword_keymenu
, config_role_keyword_keys
);
2037 struct key config_role_keyword_keys_not
[] =
2041 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
2046 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
2047 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
2055 {"T", N_("ToKeywords"), {MC_CHOICE
, 2, {'t', ctrl('T')}}, KS_NONE
},
2057 /* TRANSLATORS: toggle between NOT and not NOT, turn NOT on or off */
2058 {"!", N_("toggle NOT"), {MC_NOT
,1,{'!'}}, KS_NONE
},
2064 INST_KEY_MENU(config_role_keyword_keymenu_not
, config_role_keyword_keys_not
);
2067 struct key config_role_charset_keys_not
[] =
2071 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
2076 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
2077 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
2085 /* TRANSLATORS: go to list of character sets */
2086 {"T", N_("ToCharSets"), {MC_CHOICE
, 2, {'t', ctrl('T')}}, KS_NONE
},
2088 {"!", N_("toggle NOT"), {MC_NOT
,1,{'!'}}, KS_NONE
},
2094 INST_KEY_MENU(config_role_charset_keymenu_not
, config_role_charset_keys_not
);
2097 struct key config_role_keys
[] =
2101 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
2106 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
2107 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
2123 INST_KEY_MENU(config_role_keymenu
, config_role_keys
);
2126 struct key config_role_keys_not
[] =
2130 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
2135 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
2136 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
2145 /* TRANSLATORS: add extra headers to list */
2146 {"X", N_("eXtraHdr"), {MC_ADDHDR
, 1, {'x'}}, KS_NONE
},
2147 {"!", N_("toggle NOT"), {MC_NOT
,1,{'!'}}, KS_NONE
},
2153 INST_KEY_MENU(config_role_keymenu_not
, config_role_keys_not
);
2156 struct key config_role_keys_extra
[] =
2160 {"X", "[" N_("eXtraHdr") "]", {MC_ADDHDR
, 3,{'x',ctrl('M'),ctrl('J')}}, KS_NONE
},
2169 INST_KEY_MENU(config_role_keymenu_extra
, config_role_keys_extra
);
2172 struct key config_role_addr_pat_keys
[] =
2176 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
2181 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
2182 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
2190 /* TRANSLATORS: go to address book to get address */
2191 {"T", N_("ToAddrBk"), {MC_CHOICEB
, 2, {'t', ctrl('T')}}, KS_NONE
},
2192 {"X", N_("eXtraHdr"), {MC_ADDHDR
, 1, {'x'}}, KS_NONE
},
2193 {"!", N_("toggle NOT"), {MC_NOT
,1,{'!'}}, KS_NONE
},
2199 INST_KEY_MENU(config_role_addr_pat_keymenu
, config_role_addr_pat_keys
);
2202 struct key config_role_xtrahdr_keys
[] =
2206 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
2211 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
2212 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
2221 {"X", N_("eXtraHdr"), {MC_ADDHDR
, 1, {'x'}}, KS_NONE
},
2222 {"!", N_("toggle NOT"), {MC_NOT
,1,{'!'}}, KS_NONE
},
2224 /* TRANSLATORS: remove a header we previously added */
2225 {"R", N_("RemoveHdr"), {MC_DELHDR
, 1, {'r'}}, KS_NONE
},
2229 INST_KEY_MENU(config_role_xtrahdr_keymenu
, config_role_xtrahdr_keys
);
2232 struct key config_role_addr_act_keys
[] =
2236 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
2241 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
2242 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
2250 {"T", N_("ToAddrBk"), {MC_CHOICEC
, 2, {'t', ctrl('T')}}, KS_NONE
},
2258 INST_KEY_MENU(config_role_addr_act_keymenu
, config_role_addr_act_keys
);
2261 struct key config_role_patfolder_keys
[] =
2265 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
2270 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
2271 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
2279 /* TRANSLATORS: go to list of folders */
2280 {"T", N_("ToFldrs"), {MC_CHOICED
, 2, {'t', ctrl('T')}}, KS_NONE
},
2288 INST_KEY_MENU(config_role_patfolder_keymenu
, config_role_patfolder_keys
);
2291 struct key config_role_actionfolder_keys
[] =
2295 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
2300 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
2301 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
2309 {"T", N_("ToFldrs"), {MC_CHOICEE
, 2, {'t', ctrl('T')}}, KS_NONE
},
2317 INST_KEY_MENU(config_role_actionfolder_keymenu
, config_role_actionfolder_keys
);
2320 struct key config_role_inick_keys
[] =
2324 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
2329 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
2330 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
2338 /* TRANSLATORS: go to list of nicknames */
2339 {"T", N_("ToNicks"), {MC_CHOICE
, 2, {'t', ctrl('T')}}, KS_NONE
},
2347 INST_KEY_MENU(config_role_inick_keymenu
, config_role_inick_keys
);
2350 struct key config_role_afrom_keys
[] =
2354 {"C", "[" N_("Change Val") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
2359 {"A", N_("Add Value"), {MC_ADD
,1,{'a'}}, KS_NONE
},
2360 {"D", N_("Delete Val"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
2368 /* TRANSLATORS: go to list of address books */
2369 {"T", N_("ToAbookList"), {MC_CHOICE
, 2, {'t', ctrl('T')}}, KS_NONE
},
2377 INST_KEY_MENU(config_role_afrom_keymenu
, config_role_afrom_keys
);
2380 struct key config_checkbox_keys
[] =
2393 INST_KEY_MENU(config_checkbox_keymenu
, config_checkbox_keys
);
2396 struct key config_radiobutton_keys
[] =
2400 {"*", "[" N_("Select") "]", {MC_CHOICE
,3,{'*',ctrl('M'),ctrl('J')}}, KS_NONE
},
2409 INST_KEY_MENU(config_radiobutton_keymenu
, config_radiobutton_keys
);
2412 struct key config_yesno_keys
[] =
2416 {"C", "[" N_("Change") "]", {MC_TOGGLE
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
2425 INST_KEY_MENU(config_yesno_keymenu
, config_yesno_keys
);
2428 struct key color_changing_keys
[] =
2431 {"E", N_("To Colors"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
2432 {"*", "[" N_("Select") "]", {MC_CHOICE
,3,{'*',ctrl('M'),ctrl('J')}}, KS_NONE
},
2441 INST_KEY_MENU(color_changing_keymenu
, color_changing_keys
);
2444 struct key custom_color_changing_keys
[] =
2447 /* TRANSLATORS: go to color configuration screen */
2448 {"E", N_("To Colors"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
2449 {"*", "[" N_("Select") "]", {MC_CHOICEB
,3,{'*',ctrl('M'),ctrl('J')}}, KS_NONE
},
2458 INST_KEY_MENU(custom_color_changing_keymenu
, custom_color_changing_keys
);
2461 struct key kw_color_changing_keys
[] =
2464 {"E", N_("To Colors"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
2465 {"*", "[" N_("Select") "]", {MC_CHOICEC
,3,{'*',ctrl('M'),ctrl('J')}}, KS_NONE
},
2474 INST_KEY_MENU(kw_color_changing_keymenu
, kw_color_changing_keys
);
2479 struct key color_rgb_changing_keys
[] =
2482 {"E", N_("To Colors"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
2483 {"*", "[" N_("Select") "]", {MC_CHOICE
,3,{'*',ctrl('M'),ctrl('J')}}, KS_NONE
},
2488 {"C", N_("Customize"), {MC_RGB1
,1,{'c'}},KS_NONE
},
2505 INST_KEY_MENU(color_rgb_keymenu
, color_rgb_changing_keys
);
2508 struct key custom_rgb_changing_keys
[] =
2511 {"E", N_("To Colors"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
2512 {"*", "[" N_("Select") "]", {MC_CHOICEB
,3,{'*',ctrl('M'),ctrl('J')}}, KS_NONE
},
2517 {"C", N_("Customize"), {MC_RGB2
,1,{'c'}},KS_NONE
},
2534 INST_KEY_MENU(custom_rgb_keymenu
, custom_rgb_changing_keys
);
2537 struct key kw_rgb_changing_keys
[] =
2540 {"E", N_("To Colors"), {MC_EXIT
,1,{'e'}}, KS_EXITMODE
},
2541 {"*", "[" N_("Select") "]", {MC_CHOICEC
,3,{'*',ctrl('M'),ctrl('J')}}, KS_NONE
},
2546 {"C", N_("Customize"), {MC_RGB3
,1,{'c'}},KS_NONE
},
2563 INST_KEY_MENU(kw_rgb_keymenu
, kw_rgb_changing_keys
);
2568 struct key color_setting_keys
[] =
2572 {"C", "[" N_("Change") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
2577 {"A", N_("AddHeader"), {MC_ADD
,1,{'a'}}, KS_NONE
},
2578 /* TRANSLATORS: restore defaults */
2579 {"R", N_("RestoreDefs"), {MC_DEFAULT
,1,{'r'}}, KS_NONE
},
2585 {"I", N_("IndxHdr"), {MC_ADDHEADER
,1,{'i'}}, KS_NONE
},
2595 INST_KEY_MENU(color_setting_keymenu
, color_setting_keys
);
2598 struct key custom_color_setting_keys
[] =
2602 {"C", "[" N_("Change") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
2607 {"A", N_("AddHeader"), {MC_ADD
,1,{'a'}}, KS_NONE
},
2608 {"R", N_("RestoreDefs"), {MC_DEFAULT
,1,{'r'}}, KS_NONE
},
2614 {"I", N_("IndxHdr"), {MC_ADDHEADER
,1,{'i'}}, KS_NONE
},
2616 {"D", N_("DeleteHdr"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
2617 /* TRANSLATORS: shuffle headers (change the order of headers) */
2618 {"$", N_("ShuffleHdr"), {MC_SHUFFLE
,1,{'$'}}, KS_NONE
},
2625 INST_KEY_MENU(custom_color_setting_keymenu
, custom_color_setting_keys
);
2628 struct key role_color_setting_keys
[] =
2632 {"*", "[" N_("Select") "]", {MC_CHOICE
,3,{'*',ctrl('M'),ctrl('J')}}, KS_NONE
},
2641 INST_KEY_MENU(role_color_setting_keymenu
, role_color_setting_keys
);
2644 struct key kw_color_setting_keys
[] =
2648 {"C", "[" N_("Change") "]", {MC_EDIT
,3,{'c',ctrl('M'),ctrl('J')}}, KS_NONE
},
2653 {"A", N_("AddHeader"), {MC_ADD
,1,{'a'}}, KS_NONE
},
2654 {"R", N_("RestoreDefs"), {MC_DEFAULT
,1,{'r'}}, KS_NONE
},
2660 {"I", N_("IndxHdr"), {MC_ADDHEADER
,1,{'i'}}, KS_NONE
},
2670 INST_KEY_MENU(kw_color_setting_keymenu
, kw_color_setting_keys
);
2673 struct key take_export_keys_sm
[] =
2676 /* TRANSLATORS: exit the Take Address screen */
2677 {"<",N_("ExitTake"), {MC_EXIT
,4,{'e',ctrl('C'),'<',','}}, KS_EXITMODE
},
2678 {"T","[" N_("Take") "]",{MC_TAKE
,3,{'t',ctrl('M'),ctrl('J')}}, KS_NONE
},
2686 {"L",N_("ListMode"),{MC_LISTMODE
,1,{'l'}},KS_NONE
}};
2687 INST_KEY_MENU(take_export_keymenu_sm
, take_export_keys_sm
);
2690 struct key take_export_keys_lm
[] =
2693 {"<",N_("ExitTake"), {MC_EXIT
,4,{'e',ctrl('C'),'<',','}}, KS_EXITMODE
},
2694 {"T",N_("Take"), {MC_TAKE
,1,{'t'}}, KS_NONE
},
2699 {"X","[" N_("Set/Unset") "]", {MC_CHOICE
,3,{'x',ctrl('M'),ctrl('J')}}, KS_NONE
},
2700 {"A", N_("SetAll"),{MC_SELALL
,1,{'a'}},KS_NONE
},
2701 {"U",N_("UnSetAll"),{MC_UNSELALL
,1,{'u'}},KS_NONE
},
2702 {"S",N_("SinglMode"),{MC_LISTMODE
,1,{'s'}},KS_NONE
}};
2703 INST_KEY_MENU(take_export_keymenu_lm
, take_export_keys_lm
);
2706 struct key smime_info_keys
[] =
2709 {"<","Back",{MC_VIEW_TEXT
,2,{'<',','}},KS_EXITMODE
},
2732 INST_KEY_MENU(smime_info_keymenu
, smime_info_keys
);
2735 struct key config_smime_helper_keys
[] =
2739 {"T","[" N_("Transfer") "]", {MC_CHOICE
,3,{'t',ctrl('M'),ctrl('J')}}, KS_NONE
},
2748 INST_KEY_MENU(config_smime_helper_keymenu
, config_smime_helper_keys
);
2750 struct key config_smime_manage_certs_menu_keys
[] =
2754 {"S", "[" N_("Select") "]", {MC_CHOICE
,3,{'s',ctrl('M'),ctrl('J')}}, KS_NONE
},
2755 {"I", N_("Import Cert"), {MC_IMPORT
,1,{'i'}}, KS_NONE
},
2763 INST_KEY_MENU(config_smime_manage_certs_menu_keymenu
, config_smime_manage_certs_menu_keys
);
2765 struct key config_smime_add_certs_keys
[] =
2769 {"I", N_("Import Cert"), {MC_IMPORT
,3,{'i', ctrl('M'), ctrl('J')}}, KS_NONE
},
2778 INST_KEY_MENU(config_smime_add_certs_keymenu
, config_smime_add_certs_keys
);
2780 struct key config_smime_add_new_key
[] =
2784 {"I", N_("Import Key"), {MC_IMPORT
,3,{'i', ctrl('M'), ctrl('J')}}, KS_NONE
},
2785 {"C", N_("Create Key"), {MC_ADD
,1,{'c'}}, KS_NONE
},
2793 INST_KEY_MENU(config_smime_add_new_key_keymenu
, config_smime_add_new_key
);
2795 struct key config_smime_manage_certs_work_keys
[] =
2799 {"V", "[" N_("View Info") "]", {MC_CHOICE
,3,{'v',ctrl('M'),ctrl('J')}}, KS_NONE
},
2800 {"I", N_("Import Cert"), {MC_IMPORT
,1,{'i'}}, KS_NONE
},
2802 {"D", N_("Delete"), {MC_DELETE
,1,{'d'}}, KS_NONE
},
2803 {"U", N_("Undelete"), {MC_UNDELETE
,1,{'u'}}, KS_NONE
},
2804 {"X", N_("Expunge"), {MC_EXPUNGE
,1,{'x'}}, KS_NONE
},
2821 INST_KEY_MENU(config_smime_manage_certs_work_keymenu
, config_smime_manage_certs_work_keys
);
2823 struct key config_smime_view_cert
[] =
2827 {"V", "[" N_("View Info") "]", {MC_CHOICE
,3,{'v',ctrl('M'),ctrl('J')}}, KS_NONE
},
2828 {"D", N_("Delete pwd"), {MC_DELETE
,1,{'d'}},KS_NONE
},
2836 INST_KEY_MENU(config_smime_manage_view_cert_keymenu
, config_smime_view_cert
);
2838 struct key config_smime_view_cert_no_delete
[] =
2842 {"V", "[" N_("View Info") "]", {MC_CHOICE
,3,{'v',ctrl('M'),ctrl('J')}}, KS_NONE
},
2851 INST_KEY_MENU(config_smime_manage_view_cert_keymenu_no_delete
, config_smime_view_cert_no_delete
);
2853 struct key smime_certificate_info_keys
[] =
2856 {"E",N_("Exit Viewer"),{MC_EXIT
,1,{'e'}},KS_EXITMODE
},
2857 {"T",N_("Trust Cert"), {MC_TRUST
,1,{'t'}},KS_NONE
},
2858 {"D",N_("Delete"), {MC_DELETE
,1,{'d'}},KS_NONE
},
2859 {"U",N_("Undelete"), {MC_UNDELETE
,1,{'u'}},KS_NONE
},
2860 {"B",N_("Public Key"), {MC_PUBLIC
,1,{'b'}},KS_NONE
},
2861 {"R",N_("Private Key"),{MC_PRIVATE
,1,{'r'}},KS_NONE
},
2879 INST_KEY_MENU(smime_certificate_info_keymenu
, smime_certificate_info_keys
);
2882 struct key config_smime_manage_password_file_menu_keys
[] =
2886 {"S", "[" N_("Select") "]", {MC_CHOICE
,3,{'s',ctrl('M'),ctrl('J')}}, KS_NONE
},
2887 {"I", N_("Import Cert"), {MC_IMPORT
,1,{'i'}}, KS_NONE
},
2895 INST_KEY_MENU(config_smime_manage_password_file_menu_keymenu
, config_smime_manage_password_file_menu_keys
);
2900 * Internal prototypes
2902 void output_keymenu(struct key_menu
*, bitmap_t
, int, int);
2903 void format_keymenu(struct key_menu
*, bitmap_t
, int);
2904 void menu_clear_cmd_binding(struct key_menu
*, int);
2906 void print_inverted_label(int, MENUITEM
*);
2910 /* Saved key menu drawing state */
2912 struct key_menu
*km
;
2921 * Longest label that can be displayed in keymenu
2923 #define MAX_LABEL 40
2924 #define MAX_KEYNAME 3
2925 static struct key last_time_buf
[12];
2926 static int keymenu_is_dirty
= 1;
2929 mark_keymenu_dirty(void)
2931 keymenu_is_dirty
= 1;
2936 * Write an already formatted key_menu to the screen
2938 * Args: km -- key_menu structure
2939 * bm -- bitmap, 0's mean don't draw this key
2940 * row -- the row on the screen to begin on, negative values
2941 * are counted from the bottom of the screen up
2942 * column -- column on the screen to begin on
2944 * The bits in the bitmap are used from least significant to most significant,
2945 * not left to right. So, if you write out the bitmap in the normal way, for
2947 * bm[0] = 0x5, bm[1] = 0x8, bm[2] = 0x21, bm[3] = bm[4] = bm[5] = 0
2948 * 0000 0101 0000 1000 0010 0001 ...
2949 * means that menu item 0 (first row, first column) is set, item 1 (2nd row,
2950 * first column) is not set, item 2 is set, items 3-10 are not set, item 11
2951 * (2nd row, 6th and last column) is set. In the second menu (the second set
2952 * of 12 bits) items 0-3 are unset, 4 is set, 5-8 unset, 9 set, 10-11 unset.
2953 * That uses up bm[0] - bm[2].
2954 * Just to make sure, here it is drawn out for the first set of 12 items in
2955 * the first keymenu (0-11)
2956 * bm[0] x x x x x x x x bm[1] x x x x x x x x
2957 * 7 6 5 4 3 2 1 0 1110 9 8
2960 output_keymenu(struct key_menu
*km
, unsigned char *bm
, int row
, int column
)
2963 extern char term_name
[];
2965 register struct key
*k
;
2966 struct key
*last_time
;
2968 ufk
, /* using function keys */
2970 max_column
, /* number of columns on screen */
2971 off
; /* offset into keymap */
2972 struct variable
*vars
= ps_global
->vars
;
2973 COLOR_PAIR
*lastc
=NULL
, *label_color
=NULL
, *name_color
=NULL
;
2975 /* 6's are for UTF-8 */
2976 char keystr
[6*MAX_KEYNAME
+ 6*MAX_LABEL
+ 2];
2979 off
= km
->which
* 12;
2980 max_column
= ps_global
->ttyo
->screen_cols
;
2982 if((ps_global
->ttyo
->screen_rows
- FOOTER_ROWS(ps_global
)) < 0
2983 || max_column
<= 0){
2984 keymenu_is_dirty
= 1;
2989 real_row
= row
> 0 ? row
: ps_global
->ttyo
->screen_rows
+ row
;
2991 if(pico_usingcolor()){
2992 lastc
= pico_get_cur_color();
2993 if(lastc
&& VAR_KEYLABEL_FORE_COLOR
&& VAR_KEYLABEL_BACK_COLOR
&&
2994 pico_is_good_color(VAR_KEYLABEL_FORE_COLOR
) &&
2995 pico_is_good_color(VAR_KEYLABEL_BACK_COLOR
)){
2996 label_color
= new_color_pair(VAR_KEYLABEL_FORE_COLOR
,
2997 VAR_KEYLABEL_BACK_COLOR
);
2999 (void)pico_set_colorp(label_color
, PSC_NONE
);
3002 if(label_color
&& VAR_KEYNAME_FORE_COLOR
&& VAR_KEYNAME_BACK_COLOR
&&
3003 pico_is_good_color(VAR_KEYNAME_FORE_COLOR
) &&
3004 pico_is_good_color(VAR_KEYNAME_BACK_COLOR
)){
3005 name_color
= new_color_pair(VAR_KEYNAME_FORE_COLOR
,
3006 VAR_KEYNAME_BACK_COLOR
);
3010 if(keymenu_is_dirty
){
3011 ClearLines(real_row
, real_row
+1);
3012 keymenu_is_dirty
= 0;
3013 /* first time through, set up storage */
3014 if(!last_time_buf
[0].name
){
3015 for(i
= 0; i
< 12; i
++){
3016 last_time
= &last_time_buf
[i
];
3017 last_time
->name
= (char *) fs_get(6*MAX_KEYNAME
+ 1);
3018 last_time
->label
= (char *) fs_get(6*MAX_LABEL
+ 1);
3022 for(i
= 0; i
< 12; i
++)
3023 last_time_buf
[i
].column
= -1;
3026 for(i
= 0; i
< 12; i
++){
3030 dprint((9, "%2d %-7.7s %-10.10s %d\n", i
,
3031 km
== NULL
? "(no km)"
3032 : km
->keys
[e
].name
== NULL
? "(null)"
3034 km
== NULL
? "(no km)"
3035 : km
->keys
[e
].label
== NULL
? "(null)"
3036 : km
->keys
[e
].label
, km
? km
->keys
[e
].column
: 0));
3038 register_key(i
, NO_OP_COMMAND
, "", NULL
, 0, 0, 0, NULL
, NULL
);
3042 ufk
= F_ON(F_USE_FK
, ps_global
);
3043 dprint((9, "row: %d, real_row: %d, column: %d\n", row
,
3046 for(i
= 0; i
< 2; i
++){
3047 int c
, el
, empty
, fkey
, last_in_row
, fix_start
;
3049 char temp
[6*MAX_SCREEN_COLS
+1];
3050 char temp2
[6*MAX_SCREEN_COLS
+1];
3051 char this_label
[6*MAX_LABEL
+1];
3055 if(i
== 1 && !label_color
)
3057 if(i
== 1 && (!label_color
|| !struncmp(term_name
,"cygwin", 6)))
3059 max_column
--; /* Some terminals scroll if you write in the
3060 lower right hand corner. If user has a
3061 label_color set we'll take our chances.
3062 Otherwise, we'd get one cell of Normal. */
3065 * k is the key struct we're working on
3066 * c is the column number
3067 * el is an index into the whole keys array
3068 * Last_time_buf is ordered strangely. It goes row by row instead
3069 * of down each column like km does. J is an index into it.
3071 for(c
= 0, el
= off
+i
, k
= &km
->keys
[el
];
3072 k
< &km
->keys
[off
+12] && c
< max_column
;
3075 if(k
->column
> max_column
)
3080 fkey
= 1 + k
- &km
->keys
[off
];
3082 empty
= (!bitnset(el
,bm
) || !(k
->name
&& *k
->name
));
3083 last_time
= &last_time_buf
[j
];
3084 if(k
+2 < &km
->keys
[off
+12]){
3086 next_col
= last_time_buf
[j
+1].column
;
3087 fix_start
= (k
== &km
->keys
[off
] ||
3088 k
== &km
->keys
[off
+1]) ? k
->column
: 0;
3096 * Make sure there is a space between this label and
3097 * the next name. That is, we prefer a space to the
3098 * extra character of the label because the space
3099 * separates the commands and looks nicer.
3103 char tmp_label
[6*MAX_LABEL
+1];
3105 if(k
->label
[0] == '[' && k
->label
[(l
=strlen(k
->label
))-1] == ']' && l
> 2){
3107 * Can't write in k->label, which might be a constant array.
3109 strncpy(tmp_label
, &k
->label
[1], MIN(sizeof(tmp_label
),l
-2));
3110 tmp_label
[MIN(sizeof(tmp_label
)-1,l
-2)] = '\0';
3112 snprintf(this_label
, sizeof(this_label
), "[%s]", _(tmp_label
));
3115 strncpy(this_label
, _(k
->label
), sizeof(this_label
));
3117 this_label
[sizeof(this_label
)-1] = '\0';
3121 trunc
= (k
+2)->column
- k
->column
3122 - ((k
->name
? utf8_width(k
->name
) : 0) + 1);
3124 * trunc columns available for label but we don't want the label
3125 * to go all the way to the edge
3127 if(utf8_width(this_label
) >= trunc
){
3129 strncpy(tmp_label
, this_label
, sizeof(tmp_label
));
3130 tmp_label
[sizeof(tmp_label
)-1] = '\0';
3131 l
= utf8_pad_to_width(this_label
, tmp_label
, sizeof(this_label
)-2, trunc
-1, 1);
3132 this_label
[l
++] = SPACE
;
3133 this_label
[l
] = '\0';;
3136 this_label
[0] = SPACE
;
3138 this_label
[0] = '\0';
3140 this_label
[sizeof(this_label
)-1] = '\0';
3145 this_label
[0] = '\0';
3147 if(!(k
->column
== last_time
->column
3148 && (last_in_row
|| (k
+2)->column
<= next_col
)
3149 && ((empty
&& !*last_time
->label
&& !*last_time
->name
)
3151 && this_label
&& !strcmp(this_label
,last_time
->label
)
3152 && ((k
->name
&& !strcmp(k
->name
,last_time
->name
))
3155 /* blank out key with spaces */
3156 strncpy(temp
, repeat_char(
3157 ((last_in_row
|| (k
+2)->column
> max_column
)
3163 SPACE
), sizeof(temp
));
3164 temp
[sizeof(temp
)-1] = '\0';
3165 last_time
->column
= k
->column
;
3166 *last_time
->name
= '\0';
3167 *last_time
->label
= '\0';
3168 MoveCursor(real_row
+ i
, column
+ (fix_start
? 0 : k
->column
));
3169 Write_to_screen(temp
);
3170 c
= (fix_start
? 0 : k
->column
) + strlen(temp
);
3173 /* make sure extra space before key name is there */
3175 strncpy(temp
, repeat_char(k
->column
, SPACE
), sizeof(temp
));
3176 temp
[sizeof(temp
)-1] = '\0';
3177 MoveCursor(real_row
+ i
, column
+ 0);
3178 Write_to_screen(temp
);
3181 /* short name of the key */
3183 snprintf(temp
, sizeof(temp
), "F%d", fkey
);
3185 strncpy(temp
, k
->name
, sizeof(temp
));
3187 temp
[sizeof(temp
)-1] = '\0';
3188 last_time
->column
= k
->column
;
3189 strncpy(last_time
->name
, temp
, 6*MAX_KEYNAME
);
3190 last_time
->name
[6*MAX_KEYNAME
] = '\0';
3191 /* make sure name not too long */
3193 strncpy(keystr
, temp
, sizeof(keystr
));
3194 keystr
[sizeof(keystr
)-1] = '\0';
3196 MoveCursor(real_row
+ i
, column
+ k
->column
);
3199 (void)pico_set_colorp(name_color
, PSC_NONE
);
3204 Write_to_screen(temp
);
3205 c
= k
->column
+ utf8_width(temp
);
3211 /* now the space after the name and the label */
3216 strncat(temp
, this_label
, sizeof(temp
)-strlen(temp
)-1);
3218 /* Don't run over the right hand edge */
3219 if(utf8_width(temp
) > max_column
- c
){
3222 l
= utf8_pad_to_width(temp2
, temp
, sizeof(temp2
)-1, max_column
-c
, 1);
3224 strncpy(temp
, temp2
, sizeof(temp
));
3225 temp
[sizeof(temp
)-1] = '\0';
3228 c
+= utf8_width(temp
);
3232 strncat(keystr
, temp
, sizeof(keystr
)-strlen(keystr
)-1);
3233 keystr
[sizeof(keystr
)-1] = '\0';
3235 /* fill out rest of this key with spaces */
3238 strncat(temp
, repeat_char(max_column
- c
, SPACE
), sizeof(temp
)-strlen(temp
)-1);
3242 if(c
< (k
+2)->column
){
3244 repeat_char((k
+2)->column
- c
, SPACE
), sizeof(temp
)-strlen(temp
)-1);
3249 temp
[sizeof(temp
)-1] = '\0';
3252 strncpy(last_time
->label
, this_label
, 6*MAX_LABEL
);
3253 last_time
->label
[6*MAX_LABEL
] = '\0';
3255 (void)pico_set_colorp(label_color
, PSC_NONE
);
3257 Write_to_screen(temp
);
3262 /* fill in what register_key needs from cached data */
3263 snprintf(keystr
, sizeof(keystr
), "%s %s", last_time
->name
, last_time
->label
);
3269 * If label ends in space,
3270 * don't register the space part of label.
3272 len
= strlen(keystr
);
3273 while(keystr
[len
-1] == SPACE
)
3277 register_key(j
, ufk
? PF1
+ fkey
- 1
3278 : (k
->name
[0] == '^')
3280 : (!strucmp(k
->name
, "ret"))
3282 : (!strucmp(k
->name
, "tab"))
3284 : (!strucmp(k
->name
, "spc"))
3286 : (!strucmp(k
->name
, HISTORY_UP_KEYNAME
))
3288 : (!strucmp(k
->name
, HISTORY_DOWN_KEYNAME
))
3291 ? ((isascii((int) k
->bind
.ch
[0]) && islower((int) k
->bind
.ch
[0]))
3292 ? toupper((unsigned char) k
->bind
.ch
[0])
3295 keystr
, print_inverted_label
,
3296 real_row
+i
, k
->column
, len
,
3297 name_color
, label_color
);
3303 while(++j
< 6*(i
+1))
3304 last_time_buf
[j
].column
= -1;
3309 (void)pico_set_colorp(lastc
, PSC_NONE
);
3310 free_color_pair(&lastc
);
3312 free_color_pair(&label_color
);
3314 free_color_pair(&name_color
);
3320 * Clear the key menu lines.
3323 blank_keymenu(int row
, int column
)
3325 struct variable
*vars
= ps_global
->vars
;
3328 if(FOOTER_ROWS(ps_global
) > 1){
3329 km_state
.blanked
= 1;
3331 km_state
.column
= column
;
3332 MoveCursor(row
, column
);
3333 lastc
= pico_set_colors(VAR_KEYLABEL_FORE_COLOR
,
3334 VAR_KEYLABEL_BACK_COLOR
, PSC_NORM
|PSC_RET
);
3337 MoveCursor(row
+1, column
);
3341 (void)pico_set_colorp(lastc
, PSC_NONE
);
3342 free_color_pair(&lastc
);
3349 draw_cancel_keymenu(void)
3354 draw_keymenu(&cancel_keymenu
, bitmap
, ps_global
->ttyo
->screen_cols
,
3355 1-FOOTER_ROWS(ps_global
), 0, FirstMenu
);
3360 clearfooter(struct pine
*ps
)
3362 ClearLines(ps
->ttyo
->screen_rows
- 3, ps
->ttyo
->screen_rows
- 1);
3363 mark_keymenu_dirty();
3364 mark_status_unknown();
3369 * Calculate formatting for key menu at bottom of screen
3371 * Args: km -- The key_menu structure to format
3372 * bm -- Bitmap indicating which menu items should be displayed. If
3373 * an item is NULL, that also means it shouldn't be displayed.
3374 * Sometimes the bitmap will be turned on in that case and just
3375 * rely on the NULL entry.
3376 * width -- the screen width to format it at
3378 * If already formatted for this particular screen width and the requested
3379 * bitmap and formatted bitmap agree, return.
3381 * The formatting results in the column field in the key_menu being
3382 * filled in. The column field is the column to start the label at, the
3383 * name of the key; after that is the label for the key. The basic idea
3384 * is to line up the end of the names and beginning of the labels. If
3385 * the name is too long and shifting it left would run into previous
3386 * label, then shift the whole menu right, or at least that entry if
3387 * things following are short enough to fit back into the regular
3388 * spacing. This has to be calculated and not fixed so it can cope with
3392 format_keymenu(struct key_menu
*km
, unsigned char *bm
, int width
)
3394 int spacing
[7], w
[6], min_w
[6], tw
[6], extra
[6], ufk
, i
, set
;
3396 /* already formatted? */
3397 if(!km
|| (width
== km
->width
&&
3398 km
->how_many
<= km
->formatted_hm
&&
3399 !memcmp(km
->bitmap
, bm
, BM_SIZE
)))
3403 * If we're in the initial command sequence we may be using function
3404 * keys instead of alphas, or vice versa, so we want to recalculate
3405 * the formatting next time through.
3407 if((F_ON(F_USE_FK
,ps_global
) && ps_global
->orig_use_fkeys
) ||
3408 (F_OFF(F_USE_FK
,ps_global
) && !ps_global
->orig_use_fkeys
)){
3410 km
->formatted_hm
= km
->how_many
;
3411 memcpy(km
->bitmap
, bm
, BM_SIZE
);
3414 ufk
= F_ON(F_USE_FK
,ps_global
); /* ufk = "Using Function Keys" */
3416 /* set up "ideal" columns to start in, plus fake 7th column start */
3417 for(i
= 0; i
< 7; i
++)
3418 spacing
[i
] = (i
* width
) / 6;
3420 /* Loop thru each set of 12 menus */
3421 for(set
= 0; set
< km
->how_many
; set
++){
3422 int k_top
, k_bot
, top_name_width
, bot_name_width
,
3423 top_label_width
, bot_label_width
, done
, offset
, next_one
;
3424 struct key
*keytop
, *keybot
;
3426 offset
= set
* 12; /* offset into keymenu */
3429 * Find the required widths for each box.
3431 for(i
= 0; i
< 6; i
++){
3432 k_top
= offset
+ i
*2;
3434 keytop
= &km
->keys
[k_top
];
3435 keybot
= &km
->keys
[k_bot
];
3438 * The width of a box is the max width of top or bottom name,
3439 * plus 1 space, plus the max width of top or bottom label.
3443 * ||||||||||| = 2 + 1 + 8 = 11
3445 * Then we adjust that by adding one space after the box to
3446 * separate it from the next box. The last box doesn't need that
3447 * but we may need an extra space for last box to avoid putting
3448 * a character in the lower right hand cell of display.
3449 * We also have a minimum label width (if screen is really narrow)
3450 * of 3, so at least "Hel" and "Can" shows and the rest gets
3451 * truncated off right hand side.
3454 top_name_width
= (keytop
->name
&& bitnset(k_top
,bm
))
3455 ? (ufk
? (i
>= 5 ? 3 : 2)
3456 : utf8_width(keytop
->name
)) : 0;
3457 bot_name_width
= (keybot
->name
&& bitnset(k_bot
,bm
))
3458 ? (ufk
? (i
>= 4 ? 3 : 2)
3459 : utf8_width(keybot
->name
)) : 0;
3461 * Labels are complicated by the fact that we want to look
3462 * up their translation, but also by the fact that we surround
3463 * the word with brackets like [ViewMsg] when the command is
3464 * the default. We want to look up the translation of the
3465 * part inside the brackets, not the whole thing.
3467 if(keytop
->label
&& bitnset(k_top
,bm
)){
3468 char tmp_label
[6*MAX_LABEL
+1];
3471 if(keytop
->label
[0] == '[' && keytop
->label
[(l
=strlen(keytop
->label
))-1] == ']' && l
> 2){
3473 * Can't write in k->label, which might be a constant array.
3475 strncpy(tmp_label
, &keytop
->label
[1], MIN(sizeof(tmp_label
),l
-2));
3476 tmp_label
[MIN(sizeof(tmp_label
)-1,l
-2)] = '\0';
3478 top_label_width
= 2 + utf8_width(_(tmp_label
));
3481 top_label_width
= utf8_width(_(keytop
->label
));
3484 top_label_width
= 0;
3486 if(keybot
->label
&& bitnset(k_bot
,bm
)){
3487 char tmp_label
[6*MAX_LABEL
+1];
3490 if(keybot
->label
[0] == '[' && keybot
->label
[(l
=strlen(keybot
->label
))-1] == ']' && l
> 2){
3491 strncpy(tmp_label
, &keybot
->label
[1], MIN(sizeof(tmp_label
),l
-2));
3492 tmp_label
[MIN(sizeof(tmp_label
)-1,l
-2)] = '\0';
3494 bot_label_width
= 2 + utf8_width(_(tmp_label
));
3497 bot_label_width
= utf8_width(_(keybot
->label
));
3500 bot_label_width
= 0;
3503 * The 1 for i < 5 is the space between adjacent boxes.
3504 * The last 1 or 0 when i == 5 is so that we won't try to put
3505 * a character in the lower right cell of the display, since that
3506 * causes a linefeed on some terminals.
3508 w
[i
] = MAX(top_name_width
, bot_name_width
) + 1 +
3509 MAX(top_label_width
, bot_label_width
) +
3511 : ((bot_label_width
>= top_label_width
) ? 1 : 0));
3514 * The smallest we'll squeeze a column.
3516 * X ABCDEF we'll squeeze to X ABC
3519 min_w
[i
] = MAX(top_name_width
, bot_name_width
) + 1 +
3520 MIN(MAX(top_label_width
, bot_label_width
), 3) +
3522 : ((bot_label_width
>= top_label_width
) ? 1 : 0));
3524 /* init trial width */
3525 tw
[i
] = spacing
[i
+1] - spacing
[i
];
3526 extra
[i
] = tw
[i
] - w
[i
]; /* negative if it doesn't fit */
3530 * See if we can fit everything on the screen.
3534 int smallest_extra
, how_small
;
3536 /* Find smallest extra */
3537 smallest_extra
= -1;
3539 for(i
= 0; i
< 6; i
++){
3540 if(extra
[i
] < how_small
){
3542 how_small
= extra
[i
];
3546 if(how_small
>= 0) /* everything fits */
3549 int take_from
, how_close
;
3552 * Find the one that is closest to the ideal width
3553 * that has some extra to spare.
3557 for(i
= 0; i
< 6; i
++){
3559 ((spacing
[i
+1]-spacing
[i
]) - tw
[i
]) < how_close
){
3561 how_close
= (spacing
[i
+1]-spacing
[i
]) - tw
[i
];
3567 * Found one. Take one from take_from and add it
3568 * to the smallest_extra.
3570 tw
[smallest_extra
]++;
3571 extra
[smallest_extra
]++;
3579 * Oops. Not enough space to fit everything in.
3580 * Some of the labels are truncated. Some may even be
3581 * truncated past the minimum. We make sure that each
3582 * field is at least its minimum size, and then we cut
3583 * back those over the minimum until we can fit all the
3584 * minimal names on the screen (if possible).
3586 for(i
= 0; i
< 6; i
++)
3587 tw
[i
] = MAX(tw
[i
], min_w
[i
]);
3590 for(i
= 0; i
< 6; i
++)
3591 used_width
+= tw
[i
];
3593 while(used_width
> width
&& !done
){
3594 int candidate
, excess
;
3597 * Find the one with the most width over it's
3602 for(i
= 0; i
< 6; i
++){
3603 if(tw
[i
] - min_w
[i
] > excess
){
3605 excess
= tw
[i
] - min_w
[i
];
3623 * Assign the format we came up with to the keymenu.
3626 for(i
= 0; i
< 6; i
++){
3627 k_top
= offset
+ i
*2;
3629 keytop
= &km
->keys
[k_top
];
3630 keybot
= &km
->keys
[k_bot
];
3631 top_name_width
= (keytop
->name
&& bitnset(k_top
,bm
))
3632 ? (ufk
? (i
>= 5 ? 3 : 2)
3633 : utf8_width(keytop
->name
)) : 0;
3634 bot_name_width
= (keybot
->name
&& bitnset(k_bot
,bm
))
3635 ? (ufk
? (i
>= 4 ? 3 : 2)
3636 : utf8_width(keybot
->name
)) : 0;
3638 if(top_name_width
>= bot_name_width
){
3639 keytop
->column
= next_one
;
3640 keybot
->column
= next_one
+ (top_name_width
- bot_name_width
);
3643 keytop
->column
= next_one
+ (bot_name_width
- top_name_width
);
3644 keybot
->column
= next_one
;
3654 * Draw the key menu at bottom of screen
3656 * Args: km -- key_menu structure
3657 * bitmap -- which fields are active
3658 * width -- the screen width to format it at
3659 * row -- where to put it
3660 * column -- where to put it
3661 * what -- this is an enum telling us whether to display the
3662 * first menu (first set of 12 keys), or to display the same
3663 * one we displayed last time, or to display a particular
3664 * one (which), or to display the next one.
3666 * Fields are inactive if *either* the corresponding bitmap entry is 0 *or*
3667 * the actual entry in the key_menu is NULL. Therefore, it is sometimes
3668 * useful to just turn on all the bits in a bitmap and let the NULLs take
3669 * care of it. On the other hand, the bitmap gives a convenient method
3670 * for turning some keys on or off dynamically or due to options.
3671 * Both methods are used about equally.
3673 * Also saves the state for a possible redraw later.
3675 * Row should usually be a negative number. If row is 0, the menu is not
3679 draw_keymenu(struct key_menu
*km
, unsigned char *bitmap
, int width
, int row
,
3680 int column
, OtherMenu what
)
3683 configure_menu_items (km
, bitmap
);
3685 format_keymenu(km
, bitmap
, width
);
3687 /*--- save state for a possible redraw ---*/
3690 km_state
.column
= column
;
3691 memcpy(km_state
.bitmap
, bitmap
, BM_SIZE
);
3696 if(km_state
.blanked
)
3697 keymenu_is_dirty
= 1;
3699 if(what
== FirstMenu
|| what
== SecondMenu
|| what
== ThirdMenu
||
3700 what
== FourthMenu
|| what
== MenuNotSet
){
3701 if(what
== FirstMenu
|| what
== MenuNotSet
)
3703 else if(what
== SecondMenu
)
3705 else if(what
== ThirdMenu
)
3707 else if(what
== FourthMenu
)
3710 if(km
->which
>= km
->how_many
)
3713 else if(what
== NextMenu
)
3714 km
->which
= (km
->which
+ 1) % km
->how_many
;
3715 /* else what must be SameMenu */
3717 output_keymenu(km
, bitmap
, row
, column
);
3719 km_state
.blanked
= 0;
3724 redraw_keymenu(void)
3726 if(km_state
.blanked
)
3727 blank_keymenu(km_state
.row
, km_state
.column
);
3729 draw_keymenu(km_state
.km
, km_state
.bitmap
, ps_global
->ttyo
->screen_cols
,
3730 km_state
.row
, km_state
.column
, SameMenu
);
3735 * end_keymenu - free resources associated with keymenu display cache
3742 for(i
= 0; i
< 12; i
++){
3743 if(last_time_buf
[i
].name
)
3744 fs_give((void **) &last_time_buf
[i
].name
);
3746 if(last_time_buf
[i
].label
)
3747 fs_give((void **) &last_time_buf
[i
].label
);
3752 /*----------------------------------------------------------------------
3753 Reveal Keymenu to Pine Command mappings
3759 menu_command(UCS keystroke
, struct key_menu
*menu
)
3763 if(keystroke
== KEY_UTF8
|| keystroke
== KEY_UNKNOWN
)
3769 if(F_ON(F_USE_FK
,ps_global
)){
3770 /* No alpha commands permitted in function key mode */
3771 if(keystroke
< 0x80 && isalpha((unsigned char) keystroke
))
3774 /* Tres simple: compute offset, and test */
3775 if(keystroke
>= F1
&& keystroke
<= F12
){
3776 n
= (menu
->which
* 12) + (keystroke
- F1
);
3777 if(bitnset(n
, menu
->bitmap
))
3778 return(menu
->keys
[n
].bind
.cmd
);
3781 else if(keystroke
>= F1
&& keystroke
<= F12
)
3784 /* if ascii, coerce lower case */
3785 if(keystroke
< 0x80 && isupper((unsigned char) keystroke
))
3786 keystroke
= tolower((unsigned char) keystroke
);
3788 /* keep this here for Windows port */
3789 if((keystroke
= validatekeys(keystroke
)) == KEY_JUNK
)
3792 /* Scan the list for any keystroke/command binding */
3793 if(keystroke
!= NO_OP_COMMAND
)
3794 for(i
= (menu
->how_many
* 12) - 1; i
>= 0; i
--)
3795 if(bitnset(i
, menu
->bitmap
))
3796 for(n
= menu
->keys
[i
].bind
.nch
- 1; n
>= 0; n
--)
3797 if(keystroke
== menu
->keys
[i
].bind
.ch
[n
])
3798 return(menu
->keys
[i
].bind
.cmd
);
3801 * If explicit mapping failed, check feature mappings and
3802 * hardwired defaults...
3804 if(F_ON(F_ENABLE_PRYNT
,ps_global
)
3805 && (keystroke
== 'y' || keystroke
== 'Y')){
3806 /* SPECIAL CASE: Scan the list for print bindings */
3807 for(i
= (menu
->how_many
* 12) - 1; i
>= 0; i
--)
3808 if(bitnset(i
, menu
->bitmap
))
3809 if(menu
->keys
[i
].bind
.cmd
== MC_PRINTMSG
3810 || menu
->keys
[i
].bind
.cmd
== MC_PRINTTXT
)
3811 return(menu
->keys
[i
].bind
.cmd
);
3814 if(F_ON(F_ENABLE_LESSTHAN_EXIT
,ps_global
)
3815 && (keystroke
== '<' || keystroke
== ','
3816 || (F_ON(F_ARROW_NAV
,ps_global
) && keystroke
== KEY_LEFT
))){
3817 /* SPECIAL CASE: Scan the list for MC_EXIT bindings */
3818 for(i
= (menu
->how_many
* 12) - 1; i
>= 0; i
--)
3819 if(bitnset(i
, menu
->bitmap
))
3820 if(menu
->keys
[i
].bind
.cmd
== MC_EXIT
)
3825 * If no match after scanning bindings, try universally
3826 * bound keystrokes...
3838 return(MC_CHARDOWN
);
3842 return(MC_CHARRIGHT
);
3846 return(MC_CHARLEFT
);
3862 if(USER_INPUT_TIMEOUT(ps_global
))
3863 user_input_timeout_exit(ps_global
->hours_to_timeout
); /* no return */
3871 return(MC_UNKNOWN
); /* utter failure */
3876 /*----------------------------------------------------------------------
3877 Set up a binding for cmd, with one key bound to it.
3878 Use menu_add_binding to add more keys to this binding.
3880 Args: menu -- the keymenu
3881 key -- the initial key to bind to
3882 cmd -- the command to initialize to
3883 name -- a pointer to the string to point name to
3884 label -- a pointer to the string to point label to
3885 keynum -- which key in the keys array to initialize
3887 For translation purposes, the label in the calling routine
3888 should be wrapped in an N_() macro.
3892 menu_init_binding(struct key_menu
*menu
, UCS key
, int cmd
, char *name
, char *label
, int keynum
)
3894 /* if ascii, coerce to lower case */
3895 if(key
< 0x80 && isupper((unsigned char)key
))
3896 key
= tolower((unsigned char)key
);
3898 /* remove binding from any other key */
3899 menu_clear_cmd_binding(menu
, cmd
);
3901 menu
->keys
[keynum
].name
= name
;
3902 menu
->keys
[keynum
].label
= label
;
3903 menu
->keys
[keynum
].bind
.cmd
= cmd
;
3904 menu
->keys
[keynum
].bind
.nch
= 0;
3905 menu
->keys
[keynum
].bind
.ch
[menu
->keys
[keynum
].bind
.nch
++] = key
;
3909 /*----------------------------------------------------------------------
3910 Add a key/command binding to the given keymenu structure
3916 menu_add_binding(struct key_menu
*menu
, UCS key
, int cmd
)
3920 /* NOTE: cmd *MUST* already have had a binding */
3921 for(i
= (menu
->how_many
* 12) - 1; i
>= 0; i
--)
3922 if(menu
->keys
[i
].bind
.cmd
== cmd
){
3923 for(n
= menu
->keys
[i
].bind
.nch
- 1;
3924 n
>= 0 && key
!= menu
->keys
[i
].bind
.ch
[n
];
3928 /* if ascii, coerce to lower case */
3929 if(key
< 0x80 && isupper((unsigned char)key
))
3930 key
= tolower((unsigned char)key
);
3932 if(n
< 0) /* not already bound, bind it */
3933 menu
->keys
[i
].bind
.ch
[menu
->keys
[i
].bind
.nch
++] = key
;
3940 /*----------------------------------------------------------------------
3941 REMOVE a key/command binding from the given keymenu structure
3947 menu_clear_binding(struct key_menu
*menu
, UCS key
)
3951 /* if ascii, coerce to lower case */
3952 if(key
< 0x80 && isupper((unsigned char)key
))
3953 key
= tolower((unsigned char)key
);
3955 for(i
= (menu
->how_many
* 12) - 1; i
>= 0; i
--)
3956 for(n
= menu
->keys
[i
].bind
.nch
- 1; n
>= 0; n
--)
3957 if(key
== menu
->keys
[i
].bind
.ch
[n
]){
3958 int cmd
= menu
->keys
[i
].bind
.cmd
;
3960 for(--menu
->keys
[i
].bind
.nch
; n
< menu
->keys
[i
].bind
.nch
; n
++)
3961 menu
->keys
[i
].bind
.ch
[n
] = menu
->keys
[i
].bind
.ch
[n
+1];
3971 menu_clear_cmd_binding(struct key_menu
*menu
, int cmd
)
3975 for(i
= (menu
->how_many
* 12) - 1; i
>= 0; i
--){
3976 if(cmd
== menu
->keys
[i
].bind
.cmd
){
3977 menu
->keys
[i
].name
= NULL
;
3978 menu
->keys
[i
].label
= NULL
;
3979 menu
->keys
[i
].bind
.cmd
= 0;
3980 menu
->keys
[i
].bind
.nch
= 0;
3981 menu
->keys
[i
].bind
.ch
[0] = 0;
3988 menu_binding_index(struct key_menu
*menu
, int cmd
)
3992 for(i
= 0; i
< menu
->how_many
* 12; i
++)
3993 if(cmd
== menu
->keys
[i
].bind
.cmd
)
4002 * print_inverted_label - highlight the label of the given menu item.
4003 * (callback from pico mouse routines)
4005 * So far, this is only
4006 * ever called with the top left row equal to the bottom right row.
4007 * If you change that you probably need to fix it.
4010 print_inverted_label(int state
, MENUITEM
*m
)
4013 int col_offsetwid
, col_offsetchars
, do_color
= 0, skipwid
= 0, skipchars
= 0, len
, c
;
4016 char labelpart
[100];
4018 COLOR_PAIR
*name_color
= NULL
, *label_color
= NULL
, *lastc
= NULL
;
4019 struct variable
*vars
= ps_global
->vars
;
4021 if(m
->label
&& (lp
=strchr(m
->label
, ' '))){
4026 col_offsetwid
= utf8_width(m
->label
);
4027 col_offsetchars
= lp
- m
->label
;
4031 col_offsetwid
= col_offsetchars
= 0;
4033 if(pico_usingcolor() && ((VAR_KEYLABEL_FORE_COLOR
&&
4034 VAR_KEYLABEL_BACK_COLOR
) ||
4035 (VAR_KEYNAME_FORE_COLOR
&&
4036 VAR_KEYNAME_BACK_COLOR
))){
4037 lastc
= pico_get_cur_color();
4039 if(VAR_KEYNAME_FORE_COLOR
&& VAR_KEYNAME_BACK_COLOR
){
4040 name_color
= state
? new_color_pair(VAR_KEYNAME_BACK_COLOR
,
4041 VAR_KEYNAME_FORE_COLOR
)
4042 : new_color_pair(VAR_KEYNAME_FORE_COLOR
,
4043 VAR_KEYNAME_BACK_COLOR
);
4045 else if(VAR_REV_FORE_COLOR
&& VAR_REV_BACK_COLOR
)
4046 name_color
= new_color_pair(VAR_REV_FORE_COLOR
, VAR_REV_BACK_COLOR
);
4048 if(VAR_KEYLABEL_FORE_COLOR
&& VAR_KEYLABEL_BACK_COLOR
){
4049 label_color
= state
? new_color_pair(VAR_KEYLABEL_BACK_COLOR
,
4050 VAR_KEYLABEL_FORE_COLOR
)
4051 : new_color_pair(VAR_KEYLABEL_FORE_COLOR
,
4052 VAR_KEYLABEL_BACK_COLOR
);
4054 else if(VAR_REV_FORE_COLOR
&& VAR_REV_BACK_COLOR
){
4055 label_color
= state
? new_color_pair(VAR_REV_FORE_COLOR
,
4057 : new_color_pair(VAR_NORM_FORE_COLOR
,
4058 VAR_NORM_BACK_COLOR
);
4062 * See if we can grok all these colors. If not, we're going to
4063 * punt and pretend there are no colors at all.
4065 if(!pico_is_good_colorpair(name_color
) ||
4066 !pico_is_good_colorpair(label_color
)){
4068 free_color_pair(&name_color
);
4070 free_color_pair(&label_color
);
4072 free_color_pair(&lastc
);
4076 (void)pico_set_colorp(label_color
, PSC_NONE
);
4077 if(!(VAR_KEYLABEL_FORE_COLOR
&& VAR_KEYLABEL_BACK_COLOR
)){
4088 * Command name's already inverted, leave it.
4090 skipwid
= state
? 0 : col_offsetwid
;
4091 skipchars
= state
? 0 : col_offsetchars
;
4098 MoveCursor((int)(m
->tl
.r
), (int)(m
->tl
.c
) + skipwid
);
4100 label
= m
->label
? m
->label
: "";
4101 len
= strlen(label
);
4104 * this is a bit complicated by the fact that we have to keep track of
4105 * the screenwidth as we print the label, because the screenwidth might
4106 * not be the same as the number of characters.
4107 * UNTESTED SINCE switching to UTF-8 *
4109 for(i
= m
->tl
.r
; i
<= m
->br
.r
; i
++){
4110 /* collect part before name */
4111 for(k
=0, j
= m
->tl
.c
+ skipchars
; j
< MIN(m
->lbl
.c
,m
->br
.c
); j
++){
4112 if(k
< sizeof(prename
))
4116 if(k
< sizeof(prename
))
4119 /* collect name part */
4120 for(k
=0; j
< MIN(m
->lbl
.c
+col_offsetchars
,m
->br
.c
); j
++){
4121 c
= (i
== m
->lbl
.r
&&
4122 j
- m
->lbl
.c
< len
) ? label
[j
- m
->lbl
.c
] : ' ';
4123 if(k
< sizeof(namepart
))
4127 if(k
< sizeof(namepart
))
4130 /* collect label part */
4131 for(k
=0; j
<= m
->br
.c
; j
++){
4132 c
= (i
== m
->lbl
.r
&&
4133 j
- m
->lbl
.c
< len
) ? label
[j
- m
->lbl
.c
] : ' ';
4134 if(k
< sizeof(labelpart
))
4138 if(k
< sizeof(labelpart
))
4139 labelpart
[k
] = '\0';
4143 Write_to_screen(prename
);
4146 if(name_color
&& col_offsetchars
)
4147 (void) pico_set_colorp(name_color
, PSC_NONE
);
4149 Write_to_screen(namepart
);
4153 if(name_color
&& col_offsetchars
){
4155 (void) pico_set_colorp(label_color
, PSC_NONE
);
4164 Write_to_screen(labelpart
);
4169 (void)pico_set_colorp(lastc
, PSC_NONE
);
4170 free_color_pair(&lastc
);
4175 pico_set_normal_color();
4178 free_color_pair(&name_color
);
4180 free_color_pair(&label_color
);
4192 * This function scans the key menu and calls mswin.c functions
4193 * to build a corresponding windows menu.
4196 configure_menu_items (struct key_menu
*km
, bitmap_t bitmap
)
4202 mswin_menuitemclear ();
4207 for (i
= 0, k
= km
->keys
; i
< km
->how_many
* 12; i
++, k
++) {
4208 if (k
->name
!= NULL
&& k
->label
!= NULL
&& bitnset (i
, bitmap
) &&
4209 k
->menuitem
!= KS_NONE
) {
4211 if (k
->name
[0] == '^')
4212 key
= ctrl(k
->name
[1]);
4213 else if (strcmp(k
->name
, "Ret") == 0)
4215 else if (strcmp(k
->name
, "Spc") == 0)
4220 mswin_menuitemadd (key
, k
->label
, k
->menuitem
, 0);