1 /* 2 * Project : tin - a Usenet reader 3 * Module : keymap.h 4 * Author : J. Faultless, D. Nimmich 5 * Created : 1999 6 * Updated : 2020-06-10 7 * Notes : 8 * 9 * Copyright (c) 1999-2021 Jason Faultless <jason@altarstone.com> 10 * All rights reserved. 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 16 * 1. Redistributions of source code must retain the above copyright notice, 17 * this list of conditions and the following disclaimer. 18 * 19 * 2. Redistributions in binary form must reproduce the above copyright 20 * notice, this list of conditions and the following disclaimer in the 21 * documentation and/or other materials provided with the distribution. 22 * 23 * 3. Neither the name of the copyright holder nor the names of its 24 * contributors may be used to endorse or promote products derived from 25 * this software without specific prior written permission. 26 * 27 * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 28 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 30 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 31 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 * POSSIBILITY OF SUCH DAMAGE. 38 */ 39 40 41 #ifndef KEYMAP_H 42 # define KEYMAP_H 1 43 44 /* Revised 9 October 1996 by Branden Robinson in ASCII order 45 * 46 * Oct Dec Hex Char Oct Dec Hex Char 47 * ------------------------------------------------------------ 48 * 000 0 00 NUL '\0' 100 64 40 @ 49 * 001 1 01 SOH ^A 101 65 41 A 50 * 002 2 02 STX ^B 102 66 42 B 51 * 003 3 03 ETX ^C 103 67 43 C 52 * 004 4 04 EOT ^D 104 68 44 D 53 * 005 5 05 ENQ ^E 105 69 45 E 54 * 006 6 06 ACK ^F 106 70 46 F 55 * 007 7 07 BEL '\a' ^G 107 71 47 G 56 * 010 8 08 BS '\b' ^H 110 72 48 H 57 * 011 9 09 HT '\t' ^I 111 73 49 I 58 * 012 10 0A LF '\n' ^J 112 74 4A J 59 * 013 11 0B VT '\v' ^K 113 75 4B K 60 * 014 12 0C FF '\f' ^L 114 76 4C L 61 * 015 13 0D CR '\r' ^M 115 77 4D M 62 * 016 14 0E SO ^N 116 78 4E N 63 * 017 15 0F SI ^O 117 79 4F O 64 * 020 16 10 DLE ^P 120 80 50 P 65 * 021 17 11 DC1 ^Q 121 81 51 Q 66 * 022 18 12 DC2 ^R 122 82 52 R 67 * 023 19 13 DC3 ^S 123 83 53 S 68 * 024 20 14 DC4 ^T 124 84 54 T 69 * 025 21 15 NAK ^U 125 85 55 U 70 * 026 22 16 SYN ^V 126 86 56 V 71 * 027 23 17 ETB ^W 127 87 57 W 72 * 030 24 18 CAN ^X 130 88 58 X 73 * 031 25 19 EM ^Y 131 89 59 Y 74 * 032 26 1A SUB ^Z 132 90 5A Z 75 * 033 27 1B ESC 133 91 5B [ 76 * 034 28 1C FS 134 92 5C \ '\\' 77 * 035 29 1D GS 135 93 5D ] 78 * 036 30 1E RS 136 94 5E ^ 79 * 037 31 1F US 137 95 5F _ 80 * 040 32 20 SPACE 140 96 60 ` 81 * 041 33 21 ! 141 97 61 a 82 * 042 34 22 " 142 98 62 b 83 * 043 35 23 # 143 99 63 c 84 * 044 36 24 $ 144 100 64 d 85 * 045 37 25 % 145 101 65 e 86 * 046 38 26 & 146 102 66 f 87 * 047 39 27 ' 147 103 67 g 88 * 050 40 28 ( 150 104 68 h 89 * 051 41 29 ) 151 105 69 i 90 * 052 42 2A * 152 106 6A j 91 * 053 43 2B + 153 107 6B k 92 * 054 44 2C , 154 108 6C l 93 * 055 45 2D - 155 109 6D m 94 * 056 46 2E . 156 110 6E n 95 * 057 47 2F / 157 111 6F o 96 * 060 48 30 0 160 112 70 p 97 * 061 49 31 1 161 113 71 q 98 * 062 50 32 2 162 114 72 r 99 * 063 51 33 3 163 115 73 s 100 * 064 52 34 4 164 116 74 t 101 * 065 53 35 5 165 117 75 u 102 * 066 54 36 6 166 118 76 v 103 * 067 55 37 7 167 119 77 w 104 * 070 56 38 8 170 120 78 x 105 * 071 57 39 9 171 121 79 y 106 * 072 58 3A : 172 122 7A z 107 * 073 59 3B ; 173 123 7B { 108 * 074 60 3C < 174 124 7C | 109 * 075 61 3D = 175 125 7D } 110 * 076 62 3E > 176 126 7E ~ 111 * 077 63 3F ? 177 127 7F DEL 112 * 113 * Above chart reprinted from Linux manual page. 114 * 115 * When adding key functionality, be aware of key functions in the "big five" 116 * levels of tin operation: top (group selection), group, thread, article 117 * (pager), and help. If possible, when adding a key to any of these levels, 118 * check the others to make sure that the key doesn't do something 119 * non-analogous elsewhere. For instance, having "^R" map to "redraw screen" 120 * at article level and "reset .newsrc" (a drastic and unreversible action) 121 * at top level is a bad idea. 122 * 123 * [make emacs happy: "] 124 */ 125 126 /* 127 * Maximum chars (including null byte) needed to print a key name 128 * A multibyte character can use up to MB_CUR_MAX chars. But as MB_CUR_MAX 129 * can't be used here, use MB_LEN_MAX instead. 130 * Some values for MB_LEN_MAX: 131 * - glibc 2.3.5: 16 132 * - gcc 4.0: 1 133 * - icc 8.0/9.0: 8 134 * Use the largest + 1 to be on the safe side. 135 */ 136 #define MAXKEYLEN 17 137 138 /* TODO: permanently move here from tin.h */ 139 #define ctrl(c) ((c) & 0x1F) 140 #define ESC 27 141 142 /* TODO: get rid of these remaining #define */ 143 #define iKeyAbort ESC 144 #define iKeyQuitTin 'Q' 145 #define iKeyQuit 'q' 146 147 /* complete list of functions which can be associated with keys */ 148 enum defined_functions { 149 NOT_ASSIGNED = 0, 150 DIGIT_0, 151 DIGIT_1, 152 DIGIT_2, 153 DIGIT_3, 154 DIGIT_4, 155 DIGIT_5, 156 DIGIT_6, 157 DIGIT_7, 158 DIGIT_8, 159 DIGIT_9, 160 ATTACHMENT_PIPE, 161 ATTACHMENT_SAVE, 162 ATTACHMENT_SELECT, 163 ATTACHMENT_TAG, 164 ATTACHMENT_TAG_PATTERN, 165 ATTACHMENT_TOGGLE_TAGGED, 166 ATTACHMENT_UNTAG, 167 SPECIAL_CATCHUP_LEFT, 168 SPECIAL_MOUSE_TOGGLE, 169 CATCHUP, 170 CATCHUP_NEXT_UNREAD, 171 CONFIG_RESET_ATTRIB, 172 CONFIG_SCOPE_MENU, 173 CONFIG_SELECT, 174 CONFIG_NO_SAVE, 175 CONFIG_TOGGLE_ATTRIB, 176 FEED_ARTICLE, 177 FEED_THREAD, 178 FEED_HOT, 179 FEED_PATTERN, 180 FEED_RANGE, 181 FEED_TAGGED, 182 FEED_KEY_REPOST, 183 FEED_SUPERSEDE, 184 FILTER_EDIT, 185 FILTER_SAVE, 186 GLOBAL_ABORT, 187 GLOBAL_BUGREPORT, 188 GLOBAL_DISPLAY_POST_HISTORY, 189 GLOBAL_EDIT_FILTER, 190 GLOBAL_FIRST_PAGE, 191 GLOBAL_HELP, 192 GLOBAL_LAST_PAGE, 193 GLOBAL_LAST_VIEWED, 194 GLOBAL_LINE_DOWN, 195 GLOBAL_LINE_UP, 196 GLOBAL_LOOKUP_MESSAGEID, 197 GLOBAL_MENU_FILTER_KILL, 198 GLOBAL_MENU_FILTER_SELECT, 199 GLOBAL_OPTION_MENU, 200 GLOBAL_PAGE_DOWN, 201 GLOBAL_PAGE_UP, 202 GLOBAL_PIPE, 203 GLOBAL_POST, 204 GLOBAL_POSTPONED, 205 #ifndef DISABLE_PRINTING 206 GLOBAL_PRINT, 207 #endif /* !DISABLE_PRINTING */ 208 GLOBAL_QUICK_FILTER_KILL, 209 GLOBAL_QUICK_FILTER_SELECT, 210 GLOBAL_QUIT, 211 GLOBAL_QUIT_TIN, 212 GLOBAL_REDRAW_SCREEN, 213 GLOBAL_SCROLL_DOWN, 214 GLOBAL_SCROLL_UP, 215 GLOBAL_SEARCH_BODY, 216 GLOBAL_SEARCH_REPEAT, 217 GLOBAL_SEARCH_AUTHOR_BACKWARD, 218 GLOBAL_SEARCH_AUTHOR_FORWARD, 219 GLOBAL_SEARCH_SUBJECT_BACKWARD, 220 GLOBAL_SEARCH_SUBJECT_FORWARD, 221 GLOBAL_SET_RANGE, 222 #ifndef NO_SHELL_ESCAPE 223 GLOBAL_SHELL_ESCAPE, 224 #endif /* !NO_SHELL_ESCAPE */ 225 #ifdef HAVE_COLOR 226 GLOBAL_TOGGLE_COLOR, 227 #endif /* HAVE_COLOR */ 228 GLOBAL_TOGGLE_HELP_DISPLAY, 229 GLOBAL_TOGGLE_INFO_LAST_LINE, 230 GLOBAL_TOGGLE_INVERSE_VIDEO, 231 GLOBAL_VERSION, 232 GROUP_AUTOSAVE, 233 GROUP_CANCEL, 234 GROUP_DO_AUTOSELECT, 235 GROUP_GOTO, 236 GROUP_LIST_THREAD, 237 GROUP_MAIL, 238 GROUP_MARK_THREAD_READ, 239 GROUP_MARK_UNSELECTED_ARTICLES_READ, 240 GROUP_NEXT_GROUP, 241 GROUP_NEXT_UNREAD_ARTICLE, 242 GROUP_NEXT_UNREAD_ARTICLE_OR_GROUP, 243 GROUP_PREVIOUS_GROUP, 244 GROUP_PREVIOUS_UNREAD_ARTICLE, 245 GROUP_READ_BASENOTE, 246 GROUP_REPOST, 247 GROUP_REVERSE_SELECTIONS, 248 GROUP_SAVE, 249 GROUP_SELECT_PATTERN, 250 GROUP_SELECT_THREAD, 251 GROUP_SELECT_THREAD_IF_UNREAD_SELECTED, 252 GROUP_TAG, 253 GROUP_TAG_PARTS, 254 GROUP_TOGGLE_GET_ARTICLES_LIMIT, 255 GROUP_TOGGLE_READ_UNREAD, 256 GROUP_TOGGLE_SUBJECT_DISPLAY, 257 GROUP_TOGGLE_SELECT_THREAD, 258 GROUP_TOGGLE_THREADING, 259 GROUP_UNDO_SELECTIONS, 260 GROUP_UNTAG, 261 MARK_ARTICLE_UNREAD, 262 MARK_THREAD_UNREAD, 263 MARK_FEED_READ, 264 MARK_FEED_UNREAD, 265 PAGE_AUTOSAVE, 266 PAGE_BOTTOM_THREAD, 267 PAGE_CANCEL, 268 PAGE_EDIT_ARTICLE, 269 PAGE_FOLLOWUP, 270 PAGE_FOLLOWUP_QUOTE, 271 PAGE_FOLLOWUP_QUOTE_HEADERS, 272 PAGE_GOTO_PARENT, 273 PAGE_GROUP_SELECT, 274 PAGE_LIST_THREAD, 275 PAGE_MAIL, 276 PAGE_MARK_THREAD_READ, 277 PAGE_NEXT_ARTICLE, 278 PAGE_NEXT_THREAD, 279 PAGE_NEXT_UNREAD, 280 PAGE_NEXT_UNREAD_ARTICLE, 281 #ifdef HAVE_PGP_GPG 282 PAGE_PGP_CHECK_ARTICLE, 283 #endif /* HAVE_PGP_GPG */ 284 PAGE_PREVIOUS_ARTICLE, 285 PAGE_PREVIOUS_UNREAD_ARTICLE, 286 PAGE_REVEAL, 287 PAGE_REPLY, 288 PAGE_REPLY_QUOTE, 289 PAGE_REPLY_QUOTE_HEADERS, 290 PAGE_REPOST, 291 PAGE_SAVE, 292 PAGE_SKIP_INCLUDED_TEXT, 293 PAGE_TAG, 294 PAGE_TOGGLE_HEADERS, 295 PAGE_TOGGLE_HIGHLIGHTING, 296 PAGE_TOGGLE_RAW, 297 PAGE_TOGGLE_ROT13, 298 PAGE_TOGGLE_TABS, 299 PAGE_TOGGLE_TEX2ISO, 300 PAGE_TOGGLE_UUE, 301 PAGE_TOP_THREAD, 302 PAGE_VIEW_ATTACHMENTS, 303 PAGE_VIEW_URL, 304 #ifdef HAVE_PGP_GPG 305 PGP_KEY_ENCRYPT, 306 PGP_KEY_ENCRYPT_SIGN, 307 PGP_INCLUDE_KEY, 308 PGP_KEY_SIGN, 309 #endif /* HAVE_PGP_GPG */ 310 POST_ABORT, 311 POST_CANCEL, 312 POST_CONTINUE, 313 POST_EDIT, 314 POST_IGNORE_FUPTO, 315 #ifdef HAVE_ISPELL 316 POST_ISPELL, 317 #endif /* HAVE_ISPELL */ 318 POST_MAIL, 319 #ifdef HAVE_PGP_GPG 320 POST_PGP, 321 #endif /* HAVE_PGP_GPG */ 322 POST_POSTPONE, 323 POST_SEND, 324 POST_SUPERSEDE, 325 POSTPONE_ALL, 326 POSTPONE_OVERRIDE, 327 POSTPROCESS_NO, 328 POSTPROCESS_SHAR, 329 POSTPROCESS_YES, 330 PROMPT_NO, 331 PROMPT_YES, 332 SAVE_APPEND_FILE, 333 SAVE_OVERWRITE_FILE, 334 SCOPE_ADD, 335 SCOPE_DELETE, 336 SCOPE_EDIT_ATTRIBUTES_FILE, 337 SCOPE_MOVE, 338 SCOPE_RENAME, 339 SCOPE_SELECT, 340 SELECT_ENTER_GROUP, 341 SELECT_ENTER_NEXT_UNREAD_GROUP, 342 SELECT_GOTO, 343 SELECT_MARK_GROUP_UNREAD, 344 SELECT_MOVE_GROUP, 345 SELECT_NEXT_UNREAD_GROUP, 346 SELECT_RESET_NEWSRC, 347 SELECT_SORT_ACTIVE, 348 SELECT_SUBSCRIBE, 349 SELECT_SUBSCRIBE_PATTERN, 350 SELECT_SYNC_WITH_ACTIVE, 351 SELECT_TOGGLE_DESCRIPTIONS, 352 SELECT_TOGGLE_READ_DISPLAY, 353 SELECT_UNSUBSCRIBE, 354 SELECT_UNSUBSCRIBE_PATTERN, 355 SELECT_QUIT_NO_WRITE, 356 SELECT_YANK_ACTIVE, 357 THREAD_AUTOSAVE, 358 THREAD_CANCEL, 359 THREAD_MAIL, 360 THREAD_MARK_ARTICLE_READ, 361 THREAD_READ_NEXT_ARTICLE_OR_THREAD, 362 THREAD_READ_ARTICLE, 363 THREAD_REVERSE_SELECTIONS, 364 THREAD_SAVE, 365 THREAD_SELECT_ARTICLE, 366 THREAD_TAG, 367 THREAD_TAG_PARTS, 368 THREAD_TOGGLE_ARTICLE_SELECTION, 369 THREAD_TOGGLE_SUBJECT_DISPLAY, 370 THREAD_UNDO_SELECTIONS, 371 THREAD_UNTAG, 372 URL_SELECT 373 }; 374 typedef enum defined_functions t_function; 375 376 377 struct keynode { 378 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE) 379 wchar_t key; 380 #else 381 char key; 382 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */ 383 t_function function; 384 }; 385 386 387 struct keylist { 388 struct keynode *list; 389 size_t used; 390 size_t max; 391 }; 392 393 394 extern struct keylist attachment_keys; 395 extern struct keylist feed_post_process_keys; 396 extern struct keylist feed_supersede_article_keys; 397 extern struct keylist feed_type_keys; 398 extern struct keylist filter_keys; 399 extern struct keylist group_keys; 400 extern struct keylist info_keys; 401 extern struct keylist option_menu_keys; 402 extern struct keylist page_keys; 403 #ifdef HAVE_PGP_GPG 404 extern struct keylist pgp_mail_keys; 405 extern struct keylist pgp_news_keys; 406 #endif /* HAVE_PGP_GPG */ 407 extern struct keylist post_cancel_keys; 408 extern struct keylist post_continue_keys; 409 extern struct keylist post_delete_keys; 410 extern struct keylist post_edit_keys; 411 extern struct keylist post_edit_ext_keys; 412 extern struct keylist post_ignore_fupto_keys; 413 extern struct keylist post_mail_fup_keys; 414 extern struct keylist post_post_keys; 415 extern struct keylist post_postpone_keys; 416 extern struct keylist post_send_keys; 417 extern struct keylist prompt_keys; 418 extern struct keylist save_append_overwrite_keys; 419 extern struct keylist scope_keys; 420 extern struct keylist select_keys; 421 extern struct keylist thread_keys; 422 extern struct keylist url_keys; 423 424 425 extern t_function global_mouse_action(t_function (*left_action) (void), t_function (*right_action) (void)); 426 extern t_function handle_keypad( 427 t_function (*left_action) (void), 428 t_function (*right_action) (void), 429 t_function (*mouse_action) ( 430 t_function (*left_action) (void), 431 t_function (*right_action) (void)), 432 const struct keylist keys); 433 extern t_function prompt_slk_response(t_function default_func, const struct keylist keys, const char *fmt, ...); 434 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE) 435 extern char *printascii(char *buf, wint_t ch); 436 extern wchar_t func_to_key(t_function func, const struct keylist keys); 437 extern t_function key_to_func(const wchar_t key, const struct keylist keys); 438 #else 439 extern char *printascii(char *buf, int ch); 440 extern char func_to_key (t_function func, const struct keylist keys); 441 extern t_function key_to_func (const char key, const struct keylist keys); 442 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */ 443 #endif /* !KEYMAP_H */ 444