From f42769440048dbd40666298a28169cccf3859840 Mon Sep 17 00:00:00 2001 From: David Lawrence Ramsey Date: Wed, 24 Dec 2003 03:33:09 +0000 Subject: [PATCH] the last of the low-level input overhaul: make the global shortcut list use NANO_NO_KEY to represent no key value, add the NANO_HISTORY_KEY sentinel value, add support for many more escape sequences for those terminals that generate them, add DB's extensibility tweaks to do_yesno(), make ASCII 128 act like Backspace when -d is used, add various cleanups to the low-level input functions, and make the last of the low-level input routines use the new low-level input functions git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1599 35c25a1d-7b9e-4130-9fde-d3aeb78583b8 --- ChangeLog | 63 ++++++- doc/nanorc.sample | 2 +- src/files.c | 32 ++-- src/global.c | 356 +++++++++++++++++++++---------------- src/nano.c | 80 ++++----- src/nano.h | 49 +++--- src/proto.h | 16 +- src/search.c | 2 +- src/winio.c | 435 ++++++++++++++++++++++++++++++++++------------ 9 files changed, 685 insertions(+), 350 deletions(-) diff --git a/ChangeLog b/ChangeLog index d3fcc6bb..a9eb0e12 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,7 +4,7 @@ CVS code - input, mostly adapted from the code in do_mouse() that handles clicking on the shortcut list. New function do_mouseinput(); changes to do_mouse(). (DLR) David Benbennick: Add a few - efficiency tweaks. + efficiency/extensibility tweaks. - Modify the shortcut structure so that instead of having two miscellaneous key values (misc1 and misc2), there is one key value reserved for function keys (func_key) and one @@ -18,18 +18,44 @@ CVS code - readability, and eliminate use of adding 32 to values when testing for toggles, as get_kbinput_accepted() converts toggle values to lowercase before returning them. (DLR) + - Remove the workarounds for missing KEY_UP and KEY_DOWN, as + they appear to be holdovers of the old way of denoting the + search history shortcuts; if they aren't defined, KEY_LEFT and + KEY_RIGHT probably shouldn't work either, and all four appear + to be standard keys in termcap/terminfo in any case. Add new + special sentinel key values NANO_NO_KEY (for no shortcut key) + and NANO_HISTORY_KEY (for search history keys, both Up and + Down), modify the shortcut list to use them, and modify the + shortcut display routines to handle them. Also modify the + shortcut list code to not treat non-control character values + of val as Meta-sequences, and fix dependencies on that + behavior. (DLR) - Hook up the verbatim input functions so that verbatim input can be used in the edit window. New function do_verbatim_input(); changes to do_char(). (DLR) Additional minor tweaks to do_char() by David Benbennick. + - Clarify the description of the --rebinddelete option. (DLR) - files.c: do_writeout() - Prompt the user if we're trying to save an existing file (and not just a selection of it) under a different name. (DLR; suggested by Jean-Philippe Guérard) + open_prevfile(), open_nextfile() + - For consistency with the rest of the multibuffer code, change + "No more open files" to "No more open file buffers". (DLR) + do_browser() + - Allow '?' to open the help browser, and readd the ability of + 'G'/'g' to open the "Go to Directory" prompt (which was + erroneously removed before), for compatibility with Pico. + (DLR) - global.c: shortcut_init() - Allow WHEREIS_NEXT_KEY to be used in view mode. (DLR) +- nano,c: + do_para_operation() + - Convert to use the new low-level input functions. (DLR) + main() + - Remove unused variable option_index. (DLR) - search.c: findnextstr(), do_replace_loop() - Fix potential infinite loops and other misbehavior when doing @@ -39,9 +65,40 @@ CVS code - that such regexes are only found once per line. (DLR; found by Mike Frysinger and DLR) - winio.c: + get_kbinput(), get_accepted_kbinput() + - Don't pass in the value of the REBIND_DELETE flag anymore. + Instead, handle it directly inside the functions. (DLR) get_accepted_kbinput() - - Translate Ctrl-8 into NANO_DELETE_KEY, since it apparently is - generated at the statusbar prompt sometimes on Linux. (DLR) + - Translate Ctrl-8 into NANO_DELETE_KEY (or NANO_BACKSPACE_KEY + if REBIND_DELETE is set), since it apparently is generated + sometimes even when keypad() is TRUE. (DLR) + - Translate KEY_SLEFT into NANO_BACK_KEY and KEY_SRIGHT into + NANO_FORWARD_KEY, since they are sometimes generated by + Shift-Left and Shift-Right. (DLR) + get_ascii_kbinput() + - Tweak to make it slightly more readable. (DLR) + get_verbatim_kbinput() + - Modify to take an extra parameter indicating if we should + interpret ASCII codes or not. (DLR) + get_escape_seq_kbinput() + - Expand to deal with more broken terminals that don't generate + keypad values. Support the escape sequences for Insert, + Delete, Home, End, PageUp, and PageDown, [arrow key], + Ctrl-[arrow key], and Shift-[arrow key] when needed in the + Linux console, the FreeBSD console, the Hurd console, xterm, + rxvt, and Eterm. Also, use get_verbatim_kbinput(), with ASCII + interpretation disabled, to read in the sequences. (DLR) + get_skip_tilde_kbinput() + - Removed, as it is unneeded due to the expansion of + get_escape_seq_kbinput(). (DLR) + get_mouseinput() + - Modify to take an extra parameter indicating if we should + ungetch() the key equivalents of shortcuts we click on or not. + (DLR) + do_yesno() + - Add a few efficiency/extensibility tweaks. (David Benbennick) + - Convert to use the new low-level input functions, and remove + two last hardcoded widths left after the above tweaks. (DLR) - configure.ac: - Check for glib 2.x and then 1.2.x if we need glib. (DLR) - nano.spec.in: diff --git a/doc/nanorc.sample b/doc/nanorc.sample index a1fdf61c..eee7cdb3 100644 --- a/doc/nanorc.sample +++ b/doc/nanorc.sample @@ -66,7 +66,7 @@ ## You can get old nano quoted-justify behavior via: # set quotestr "(> )+" -## Fix Backspace if it acts like Delete +## Fix Backspace/Delete confusion problem # set rebinddelete ## Do extended regular expression searches by default diff --git a/src/files.c b/src/files.c index 452cd660..46422a10 100644 --- a/src/files.c +++ b/src/files.c @@ -878,7 +878,7 @@ int open_prevfile(int closing_file) /* only one file open */ if (!closing_file) - statusbar(_("No more open files")); + statusbar(_("No more open file buffers")); return 1; } @@ -941,7 +941,7 @@ int open_nextfile(int closing_file) /* only one file open */ if (!closing_file) - statusbar(_("No more open files")); + statusbar(_("No more open file buffers")); return 1; } @@ -1835,7 +1835,7 @@ int do_writeout(const char *path, int exiting, int append) struct stat st; if (!stat(answer, &st)) { - i = do_yesno(0, 0, _("File exists, OVERWRITE ?")); + i = do_yesno(0, _("File exists, OVERWRITE ?")); if (i == 0 || i == -1) continue; } else if (filename[0] != '\0' @@ -1843,7 +1843,7 @@ int do_writeout(const char *path, int exiting, int append) && (!ISSET(MARK_ISSET) || exiting) #endif ) { - i = do_yesno(0, 0, _("Save file under DIFFERENT NAME ?")); + i = do_yesno(0, _("Save file under DIFFERENT NAME ?")); if (i == 0 || i == -1) continue; } @@ -2599,7 +2599,7 @@ char *do_browser(const char *inpath) break; case NANO_PREVPAGE_KEY: case NANO_PREVPAGE_FKEY: - case '-': + case '-': /* Pico compatibility */ if (selected >= (editwinrows + lineno % editwinrows) * width) selected -= (editwinrows + lineno % editwinrows) * width; else @@ -2607,18 +2607,19 @@ char *do_browser(const char *inpath) break; case NANO_NEXTPAGE_KEY: case NANO_NEXTPAGE_FKEY: - case ' ': + case ' ': /* Pico compatibility */ selected += (editwinrows - lineno % editwinrows) * width; if (selected >= numents) selected = numents - 1; break; case NANO_HELP_KEY: case NANO_HELP_FKEY: + case '?': /* Pico compatibility */ do_help(); break; case NANO_ENTER_KEY: - case 's': /* More Pico compatibility */ - case 'S': + case 'S': /* Pico compatibility */ + case 's': /* You can't cd up from / */ if (!strcmp(filelist[selected], "/..") && !strcmp(path, "/")) { statusbar(_("Can't move up a directory")); @@ -2627,10 +2628,9 @@ char *do_browser(const char *inpath) } #ifndef DISABLE_OPERATINGDIR - /* - * Note: the selected file can be outside the operating - * directory if it is .. or if it is a symlink to a directory - * outside the opdir. */ + /* Note: the selected file can be outside the operating + * directory if it is .. or if it is a symlink to + * directory outside the operating directory. */ if (check_operating_dir(filelist[selected], FALSE)) { statusbar(_("Can't go outside of %s in restricted mode"), operating_dir); beep(); @@ -2680,6 +2680,8 @@ char *do_browser(const char *inpath) /* Goto a specific directory */ case NANO_GOTO_KEY: case NANO_GOTO_FKEY: + case 'G': /* Pico compatibility */ + case 'g': curs_set(1); j = statusq(0, gotodir_list, "", #ifndef NANO_SMALL @@ -2724,11 +2726,11 @@ char *do_browser(const char *inpath) return do_browser(path); /* Stuff we want to abort the browser */ - case 'e': /* Pico compatibility, yeech */ - case 'E': case NANO_CANCEL_KEY: case NANO_EXIT_KEY: case NANO_EXIT_FKEY: + case 'E': /* Pico compatibility */ + case 'e': abort = 1; break; } @@ -2803,7 +2805,7 @@ char *do_browser(const char *inpath) } } wrefresh(edit); - } while ((kbinput = get_kbinput(edit, &meta, ISSET(REBIND_DELETE))) != NANO_EXIT_KEY && kbinput != NANO_EXIT_FKEY); + } while ((kbinput = get_kbinput(edit, &meta)) != NANO_EXIT_KEY && kbinput != NANO_EXIT_FKEY); curs_set(1); blank_edit(); titlebar(NULL); diff --git a/src/global.c b/src/global.c index 34a6589e..78da209c 100644 --- a/src/global.c +++ b/src/global.c @@ -432,38 +432,38 @@ void shortcut_init(int unjustify) /* Translators: try to keep this string under 10 characters long */ sc_init_one(&main_list, NANO_HELP_KEY, _("Get Help"), - IFHELP(nano_help_msg, 0), NANO_HELP_FKEY, - 0, VIEW, do_help); + IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY, + NANO_NO_KEY, VIEW, do_help); #ifdef ENABLE_MULTIBUFFER if (open_files != NULL && (open_files->prev != NULL || open_files->next != NULL)) /* Translators: try to keep this string under 10 characters long */ sc_init_one(&main_list, NANO_EXIT_KEY, _("Close"), - IFHELP(nano_exit_msg, 0), NANO_EXIT_FKEY, - 0, VIEW, do_exit); + IFHELP(nano_exit_msg, NANO_NO_KEY), NANO_EXIT_FKEY, + NANO_NO_KEY, VIEW, do_exit); else #endif /* Translators: try to keep this string under 10 characters long */ sc_init_one(&main_list, NANO_EXIT_KEY, _("Exit"), - IFHELP(nano_exit_msg, 0), NANO_EXIT_FKEY, - 0, VIEW, do_exit); + IFHELP(nano_exit_msg, NANO_NO_KEY), NANO_EXIT_FKEY, + NANO_NO_KEY, VIEW, do_exit); /* Translators: try to keep this string under 10 characters long */ sc_init_one(&main_list, NANO_WRITEOUT_KEY, _("WriteOut"), - IFHELP(nano_writeout_msg, 0), NANO_WRITEOUT_FKEY, - 0, NOVIEW, do_writeout_void); + IFHELP(nano_writeout_msg, NANO_NO_KEY), NANO_WRITEOUT_FKEY, + NANO_NO_KEY, NOVIEW, do_writeout_void); /* Translators: try to keep this string under 10 characters long */ sc_init_one(&main_list, NANO_JUSTIFY_KEY, _("Justify"), - IFHELP(nano_justify_msg, 0), NANO_JUSTIFY_FKEY, - 0, NOVIEW, do_justify); + IFHELP(nano_justify_msg, NANO_NO_KEY), + NANO_JUSTIFY_FKEY, NANO_NO_KEY, NOVIEW, do_justify); /* this is so we can view multiple files */ /* Translators: try to keep this string under 10 characters long */ sc_init_one(&main_list, NANO_INSERTFILE_KEY, _("Read File"), - IFHELP(nano_insert_msg, 0), NANO_INSERTFILE_FKEY, - 0, + IFHELP(nano_insert_msg, NANO_NO_KEY), NANO_INSERTFILE_FKEY, + NANO_NO_KEY, #ifdef ENABLE_MULTIBUFFER VIEW #else @@ -473,178 +473,201 @@ void shortcut_init(int unjustify) /* Translators: try to keep this string under 10 characters long */ sc_init_one(&main_list, NANO_WHEREIS_KEY, _("Where Is"), - IFHELP(nano_whereis_msg, 0), NANO_WHEREIS_FKEY, - 0, VIEW, do_search); + IFHELP(nano_whereis_msg, NANO_NO_KEY), NANO_WHEREIS_FKEY, + NANO_NO_KEY, VIEW, do_search); /* Translators: try to keep this string under 10 characters long */ sc_init_one(&main_list, NANO_PREVPAGE_KEY, _("Prev Page"), - IFHELP(nano_prevpage_msg, 0), NANO_PREVPAGE_FKEY, - 0, VIEW, do_page_up); + IFHELP(nano_prevpage_msg, NANO_NO_KEY), NANO_PREVPAGE_FKEY, + NANO_NO_KEY, VIEW, do_page_up); /* Translators: try to keep this string under 10 characters long */ sc_init_one(&main_list, NANO_NEXTPAGE_KEY, _("Next Page"), - IFHELP(nano_nextpage_msg, 0), NANO_NEXTPAGE_FKEY, - 0, VIEW, do_page_down); + IFHELP(nano_nextpage_msg, NANO_NO_KEY), NANO_NEXTPAGE_FKEY, + NANO_NO_KEY, VIEW, do_page_down); /* Translators: try to keep this string under 10 characters long */ sc_init_one(&main_list, NANO_CUT_KEY, _("Cut Text"), - IFHELP(nano_cut_msg, 0), NANO_CUT_FKEY, 0, NOVIEW, do_cut_text); + IFHELP(nano_cut_msg, NANO_NO_KEY), NANO_CUT_FKEY, + NANO_NO_KEY, NOVIEW, do_cut_text); if (unjustify) /* Translators: try to keep this string under 10 characters long */ sc_init_one(&main_list, NANO_UNJUSTIFY_KEY, _("UnJustify"), - IFHELP(nano_unjustify_msg, 0), 0, 0, NOVIEW, do_uncut_text); + IFHELP(nano_unjustify_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, NOVIEW, do_uncut_text); else /* Translators: try to keep this string under 10 characters long */ sc_init_one(&main_list, NANO_UNCUT_KEY, _("UnCut Txt"), - IFHELP(nano_uncut_msg, 0), NANO_UNCUT_FKEY, - 0, NOVIEW, do_uncut_text); + IFHELP(nano_uncut_msg, NANO_NO_KEY), NANO_UNCUT_FKEY, + NANO_NO_KEY, NOVIEW, do_uncut_text); /* Translators: try to keep this string under 10 characters long */ sc_init_one(&main_list, NANO_CURSORPOS_KEY, _("Cur Pos"), - IFHELP(nano_cursorpos_msg, 0), NANO_CURSORPOS_FKEY, - 0, VIEW, do_cursorpos_void); + IFHELP(nano_cursorpos_msg, NANO_NO_KEY), NANO_CURSORPOS_FKEY, + NANO_NO_KEY, VIEW, do_cursorpos_void); /* Translators: try to keep this string under 10 characters long */ sc_init_one(&main_list, NANO_SPELL_KEY, _("To Spell"), - IFHELP(nano_spell_msg, 0), NANO_SPELL_FKEY, - 0, NOVIEW, do_spell); + IFHELP(nano_spell_msg, NANO_NO_KEY), NANO_SPELL_FKEY, + NANO_NO_KEY, NOVIEW, do_spell); sc_init_one(&main_list, NANO_GOTO_KEY, _("Go To Line"), - IFHELP(nano_goto_msg, NANO_ALT_GOTO_KEY), - NANO_GOTO_FKEY, 0, VIEW, do_gotoline_void); + IFHELP(nano_goto_msg, NANO_ALT_GOTO_KEY), NANO_GOTO_FKEY, + NANO_NO_KEY, VIEW, do_gotoline_void); sc_init_one(&main_list, NANO_REPLACE_KEY, _("Replace"), - IFHELP(nano_replace_msg, NANO_ALT_REPLACE_KEY), - NANO_REPLACE_FKEY, 0, NOVIEW, do_replace); + IFHELP(nano_replace_msg, NANO_ALT_REPLACE_KEY), NANO_REPLACE_FKEY, + NANO_NO_KEY, NOVIEW, do_replace); sc_init_one(&main_list, NANO_UP_KEY, _("Up"), - IFHELP(nano_up_msg, 0), 0, 0, VIEW, do_up); + IFHELP(nano_up_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_up); sc_init_one(&main_list, NANO_DOWN_KEY, _("Down"), - IFHELP(nano_down_msg, 0), 0, 0, VIEW, do_down); + IFHELP(nano_down_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_down); sc_init_one(&main_list, NANO_FORWARD_KEY, _("Forward"), - IFHELP(nano_forward_msg, 0), 0, 0, VIEW, do_right); + IFHELP(nano_forward_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_right); sc_init_one(&main_list, NANO_BACK_KEY, _("Back"), - IFHELP(nano_back_msg, 0), 0, 0, VIEW, do_left); + IFHELP(nano_back_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_left); sc_init_one(&main_list, NANO_HOME_KEY, _("Home"), - IFHELP(nano_home_msg, 0), 0, 0, VIEW, do_home); + IFHELP(nano_home_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_home); sc_init_one(&main_list, NANO_END_KEY, _("End"), - IFHELP(nano_end_msg, 0), 0, 0, VIEW, do_end); + IFHELP(nano_end_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_end); sc_init_one(&main_list, NANO_REFRESH_KEY, _("Refresh"), - IFHELP(nano_refresh_msg, 0), 0, 0, VIEW, total_refresh); + IFHELP(nano_refresh_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, total_refresh); sc_init_one(&main_list, NANO_MARK_KEY, _("Mark Text"), IFHELP(nano_mark_msg, NANO_ALT_MARK_KEY), - 0, 0, NOVIEW, do_mark); + NANO_NO_KEY, NANO_NO_KEY, NOVIEW, do_mark); sc_init_one(&main_list, NANO_DELETE_KEY, _("Delete"), - IFHELP(nano_delete_msg, 0), 0, 0, NOVIEW, do_delete); + IFHELP(nano_delete_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, NOVIEW, do_delete); sc_init_one(&main_list, NANO_BACKSPACE_KEY, _("Backspace"), - IFHELP(nano_backspace_msg, 0), 0, 0, NOVIEW, do_backspace); + IFHELP(nano_backspace_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, NOVIEW, do_backspace); sc_init_one(&main_list, NANO_TAB_KEY, _("Tab"), - IFHELP(nano_tab_msg, 0), 0, 0, NOVIEW, do_tab); + IFHELP(nano_tab_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, NOVIEW, do_tab); sc_init_one(&main_list, NANO_ENTER_KEY, _("Enter"), - IFHELP(nano_enter_msg, 0), 0, 0, NOVIEW, do_enter); + IFHELP(nano_enter_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, NOVIEW, do_enter); #ifndef NANO_SMALL sc_init_one(&main_list, NANO_NEXTWORD_KEY, _("Next Word"), - IFHELP(nano_nextword_msg, 0), 0, 0, VIEW, do_next_word); + IFHELP(nano_nextword_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_next_word); - sc_init_one(&main_list, -1, _("Prev Word"), - IFHELP(nano_prevword_msg, NANO_PREVWORD_KEY), - 0, 0, VIEW, do_prev_word); + sc_init_one(&main_list, NANO_NO_KEY, _("Prev Word"), + IFHELP(nano_prevword_msg, NANO_PREVWORD_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_prev_word); #endif - sc_init_one(&main_list, -1, _("Verbatim Input"), - IFHELP(nano_verbatim_msg, NANO_VERBATIM_KEY), - 0, 0, VIEW, do_verbatim_input); + sc_init_one(&main_list, NANO_NO_KEY, _("Verbatim Input"), + IFHELP(nano_verbatim_msg, NANO_VERBATIM_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_verbatim_input); #ifdef ENABLE_MULTIBUFFER - sc_init_one(&main_list, -1, _("Previous File"), - IFHELP(nano_openprev_msg, NANO_OPENPREV_KEY), - 0, NANO_OPENPREV_ALTKEY, VIEW, open_prevfile_void); + sc_init_one(&main_list, NANO_NO_KEY, _("Previous File"), + IFHELP(nano_openprev_msg, NANO_OPENPREV_KEY), NANO_NO_KEY, + NANO_OPENPREV_ALTKEY, VIEW, open_prevfile_void); - sc_init_one(&main_list, -1, _("Next File"), - IFHELP(nano_opennext_msg, NANO_OPENNEXT_KEY), - 0, NANO_OPENNEXT_ALTKEY, VIEW, open_nextfile_void); + sc_init_one(&main_list, NANO_NO_KEY, _("Next File"), + IFHELP(nano_opennext_msg, NANO_OPENNEXT_KEY), NANO_NO_KEY, + NANO_OPENNEXT_ALTKEY, VIEW, open_nextfile_void); #endif #if !defined(NANO_SMALL) && defined(HAVE_REGEX_H) - sc_init_one(&main_list, -1, _("Find Other Bracket"), - IFHELP(nano_bracket_msg, NANO_BRACKET_KEY), - 0, 0, VIEW, do_find_bracket); + sc_init_one(&main_list, NANO_NO_KEY, _("Find Other Bracket"), + IFHELP(nano_bracket_msg, NANO_BRACKET_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_find_bracket); #endif - sc_init_one(&main_list, -1, _("Where Is Next"), + sc_init_one(&main_list, NANO_NO_KEY, _("Where Is Next"), IFHELP(nano_whereis_next_msg, NANO_WHEREIS_NEXT_KEY), - 0, 0, VIEW, do_research); + NANO_NO_KEY, NANO_NO_KEY, VIEW, do_research); free_shortcutage(&whereis_list); sc_init_one(&whereis_list, NANO_HELP_KEY, _("Get Help"), - IFHELP(nano_help_msg, 0), NANO_HELP_FKEY, - 0, VIEW, do_help); + IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY, + NANO_NO_KEY, VIEW, do_help); /* Translators: try to keep this string under 10 characters long */ sc_init_one(&whereis_list, NANO_CANCEL_KEY, _("Cancel"), - IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0); + IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, 0); /* Translators: try to keep this string under 10 characters long */ sc_init_one(&whereis_list, NANO_FIRSTLINE_KEY, _("First Line"), - IFHELP(nano_firstline_msg, 0), 0, 0, VIEW, do_first_line); + IFHELP(nano_firstline_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_first_line); /* Translators: try to keep this string under 10 characters long */ sc_init_one(&whereis_list, NANO_LASTLINE_KEY, _("Last Line"), - IFHELP(nano_lastline_msg, 0), 0, 0, VIEW, do_last_line); + IFHELP(nano_lastline_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_last_line); /* Translators: try to keep this string under 10 characters long */ sc_init_one(&whereis_list, NANO_OTHERSEARCH_KEY, _("Replace"), - IFHELP(nano_replace_msg, 0), NANO_REPLACE_FKEY, - 0, VIEW, do_replace); + IFHELP(nano_replace_msg, NANO_NO_KEY), NANO_REPLACE_FKEY, + NANO_NO_KEY, VIEW, do_replace); /* Translators: try to keep this string under 10 characters long */ sc_init_one(&whereis_list, NANO_FROMSEARCHTOGOTO_KEY, _("Go To Line"), - IFHELP(nano_goto_msg, 0), NANO_GOTO_FKEY, - 0, VIEW, do_gotoline_void); + IFHELP(nano_goto_msg, NANO_NO_KEY), NANO_GOTO_FKEY, + NANO_NO_KEY, VIEW, do_gotoline_void); #ifndef DISABLE_JUSTIFY /* Translators: try to keep this string under 10 characters long */ sc_init_one(&whereis_list, NANO_PARABEGIN_KEY, _("Beg of Par"), - IFHELP(nano_parabegin_msg, 0), 0, 0, VIEW, do_para_begin); + IFHELP(nano_parabegin_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_para_begin); /* Translators: try to keep this string under 10 characters long */ sc_init_one(&whereis_list, NANO_PARAEND_KEY, _("End of Par"), - IFHELP(nano_paraend_msg, 0), 0, 0, VIEW, do_para_end); + IFHELP(nano_paraend_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_para_end); #endif #ifndef NANO_SMALL /* Translators: try to keep this string under 10 characters long */ - sc_init_one(&whereis_list, TOGGLE_CASE_KEY, _("Case Sens"), - IFHELP(nano_case_msg, 0), 0, 0, VIEW, 0); + sc_init_one(&whereis_list, NANO_NO_KEY, _("Case Sens"), + IFHELP(nano_case_msg, TOGGLE_CASE_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, 0); /* Translators: try to keep this string under 10 characters long */ - sc_init_one(&whereis_list, TOGGLE_BACKWARDS_KEY, _("Direction"), - IFHELP(nano_reverse_msg, 0), 0, 0, VIEW, 0); + sc_init_one(&whereis_list, NANO_NO_KEY, _("Direction"), + IFHELP(nano_reverse_msg, TOGGLE_BACKWARDS_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, 0); #ifdef HAVE_REGEX_H /* Translators: try to keep this string under 10 characters long */ - sc_init_one(&whereis_list, TOGGLE_REGEXP_KEY, _("Regexp"), - IFHELP(nano_regexp_msg, 0), 0, 0, VIEW, 0); + sc_init_one(&whereis_list, NANO_NO_KEY, _("Regexp"), + IFHELP(nano_regexp_msg, TOGGLE_REGEXP_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, 0); #endif #ifndef NANO_SMALL /* Translators: try to keep this string under 10 characters long */ - sc_init_one(&whereis_list, NANO_UP_KEY, _("History"), - IFHELP(nano_editstr_msg, 0), 0, NANO_DOWN_KEY, VIEW, 0); + sc_init_one(&whereis_list, NANO_HISTORY_KEY, _("History"), + IFHELP(nano_editstr_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, 0); #endif #endif /* !NANO_SMALL */ @@ -652,156 +675,181 @@ void shortcut_init(int unjustify) free_shortcutage(&replace_list); sc_init_one(&replace_list, NANO_HELP_KEY, _("Get Help"), - IFHELP(nano_help_msg, 0), NANO_HELP_FKEY, - 0, VIEW, do_help); + IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY, + NANO_NO_KEY, VIEW, do_help); sc_init_one(&replace_list, NANO_CANCEL_KEY, _("Cancel"), - IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0); + IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, 0); sc_init_one(&replace_list, NANO_FIRSTLINE_KEY, _("First Line"), - IFHELP(nano_firstline_msg, 0), 0, 0, VIEW, do_first_line); + IFHELP(nano_firstline_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_first_line); sc_init_one(&replace_list, NANO_LASTLINE_KEY, _("Last Line"), - IFHELP(nano_lastline_msg, 0), 0, 0, VIEW, do_last_line); + IFHELP(nano_lastline_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_last_line); /* Translators: try to keep this string under 12 characters long */ sc_init_one(&replace_list, NANO_OTHERSEARCH_KEY, _("No Replace"), - IFHELP(nano_whereis_msg, 0), NANO_REPLACE_FKEY, - 0, VIEW, do_search); + IFHELP(nano_whereis_msg, NANO_NO_KEY), NANO_REPLACE_FKEY, + NANO_NO_KEY, VIEW, do_search); sc_init_one(&replace_list, NANO_FROMSEARCHTOGOTO_KEY, _("Go To Line"), - IFHELP(nano_goto_msg, 0), NANO_GOTO_FKEY, - 0, VIEW, do_gotoline_void); + IFHELP(nano_goto_msg, NANO_NO_KEY), NANO_GOTO_FKEY, + NANO_NO_KEY, VIEW, do_gotoline_void); #ifndef NANO_SMALL - sc_init_one(&replace_list, TOGGLE_CASE_KEY, _("Case Sens"), - IFHELP(nano_case_msg, 0), 0, 0, VIEW, 0); + sc_init_one(&replace_list, NANO_NO_KEY, _("Case Sens"), + IFHELP(nano_case_msg, TOGGLE_CASE_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, 0); - sc_init_one(&replace_list, TOGGLE_BACKWARDS_KEY, _("Direction"), - IFHELP(nano_reverse_msg, 0), 0, 0, VIEW, 0); + sc_init_one(&replace_list, NANO_NO_KEY, _("Direction"), + IFHELP(nano_reverse_msg, TOGGLE_BACKWARDS_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, 0); #ifdef HAVE_REGEX_H - sc_init_one(&replace_list, TOGGLE_REGEXP_KEY, _("Regexp"), - IFHELP(nano_regexp_msg, 0), 0, 0, VIEW, 0); + sc_init_one(&replace_list, NANO_NO_KEY, _("Regexp"), + IFHELP(nano_regexp_msg, TOGGLE_REGEXP_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, 0); #endif - sc_init_one(&replace_list, NANO_UP_KEY, _("History"), - IFHELP(nano_editstr_msg, 0), 0, NANO_DOWN_KEY, VIEW, 0); + sc_init_one(&replace_list, NANO_HISTORY_KEY, _("History"), + IFHELP(nano_editstr_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_DOWN_KEY, VIEW, 0); #endif /* !NANO_SMALL */ free_shortcutage(&replace_list_2); sc_init_one(&replace_list_2, NANO_HELP_KEY, _("Get Help"), - IFHELP(nano_help_msg, 0), NANO_HELP_FKEY, - 0, VIEW, do_help); + IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY, + NANO_NO_KEY, VIEW, do_help); sc_init_one(&replace_list_2, NANO_CANCEL_KEY, _("Cancel"), - IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0); + IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, 0); sc_init_one(&replace_list_2, NANO_FIRSTLINE_KEY, _("First Line"), - IFHELP(nano_firstline_msg, 0), 0, 0, VIEW, do_first_line); + IFHELP(nano_firstline_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_first_line); sc_init_one(&replace_list_2, NANO_LASTLINE_KEY, _("Last Line"), - IFHELP(nano_lastline_msg, 0), 0, 0, VIEW, do_last_line); + IFHELP(nano_lastline_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_last_line); #ifndef NANO_SMALL sc_init_one(&replace_list_2, NANO_UP_KEY, _("History"), - IFHELP(nano_editstr_msg, 0), 0, NANO_DOWN_KEY, VIEW, 0); + IFHELP(nano_editstr_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_DOWN_KEY, VIEW, 0); #endif free_shortcutage(&goto_list); sc_init_one(&goto_list, NANO_HELP_KEY, _("Get Help"), - IFHELP(nano_help_msg, 0), NANO_HELP_FKEY, - 0, VIEW, do_help); + IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY, + NANO_NO_KEY, VIEW, do_help); sc_init_one(&goto_list, NANO_CANCEL_KEY, _("Cancel"), - IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0); + IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, 0); sc_init_one(&goto_list, NANO_FIRSTLINE_KEY, _("First Line"), - IFHELP(nano_firstline_msg, 0), 0, 0, VIEW, do_first_line); + IFHELP(nano_firstline_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_first_line); sc_init_one(&goto_list, NANO_LASTLINE_KEY, _("Last Line"), - IFHELP(nano_lastline_msg, 0), 0, 0, VIEW, do_last_line); + IFHELP(nano_lastline_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, do_last_line); #ifndef DISABLE_HELP free_shortcutage(&help_list); sc_init_one(&help_list, NANO_PREVPAGE_KEY, _("Prev Page"), - IFHELP(nano_prevpage_msg, 0), NANO_PREVPAGE_FKEY, - 0, VIEW, do_page_up); + IFHELP(nano_prevpage_msg, NANO_NO_KEY), NANO_PREVPAGE_FKEY, + NANO_NO_KEY, VIEW, do_page_up); sc_init_one(&help_list, NANO_NEXTPAGE_KEY, _("Next Page"), - IFHELP(nano_nextpage_msg, 0), NANO_NEXTPAGE_FKEY, - 0, VIEW, do_page_down); + IFHELP(nano_nextpage_msg, NANO_NO_KEY), NANO_NEXTPAGE_FKEY, + NANO_NO_KEY, VIEW, do_page_down); sc_init_one(&help_list, NANO_EXIT_KEY, _("Exit"), - IFHELP(nano_exit_msg, 0), NANO_EXIT_FKEY, - 0, VIEW, do_exit); + IFHELP(nano_exit_msg, NANO_NO_KEY), NANO_EXIT_FKEY, + NANO_NO_KEY, VIEW, do_exit); #endif free_shortcutage(&writefile_list); sc_init_one(&writefile_list, NANO_HELP_KEY, _("Get Help"), - IFHELP(nano_help_msg, 0), NANO_HELP_FKEY, - 0, VIEW, do_help); + IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY, + NANO_NO_KEY, VIEW, do_help); #ifndef DISABLE_BROWSER /* Translators: try to keep this string under 16 characters long */ sc_init_one(&writefile_list, NANO_TOFILES_KEY, _("To Files"), - IFHELP(nano_tofiles_msg, 0), 0, 0, NOVIEW, 0); + IFHELP(nano_tofiles_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, NOVIEW, 0); #endif #ifndef NANO_SMALL /* Translators: try to keep this string under 16 characters long */ - sc_init_one(&writefile_list, TOGGLE_DOS_KEY, _("DOS Format"), - IFHELP(nano_dos_msg, 0), 0, 0, NOVIEW, 0); + sc_init_one(&writefile_list, NANO_NO_KEY, _("DOS Format"), + IFHELP(nano_dos_msg, TOGGLE_DOS_KEY), NANO_NO_KEY, + NANO_NO_KEY, NOVIEW, 0); /* Translators: try to keep this string under 16 characters long */ - sc_init_one(&writefile_list, TOGGLE_MAC_KEY, _("Mac Format"), - IFHELP(nano_mac_msg, 0), 0, 0, NOVIEW, 0); + sc_init_one(&writefile_list, NANO_NO_KEY, _("Mac Format"), + IFHELP(nano_mac_msg, TOGGLE_MAC_KEY), NANO_NO_KEY, + NANO_NO_KEY, NOVIEW, 0); #endif /* Translators: try to keep this string under 16 characters long */ - sc_init_one(&writefile_list, NANO_APPEND_KEY, _("Append"), - IFHELP(nano_append_msg, 0), 0, 0, NOVIEW, 0); + sc_init_one(&writefile_list, NANO_NO_KEY, _("Append"), + IFHELP(nano_append_msg, NANO_APPEND_KEY), NANO_NO_KEY, + NANO_NO_KEY, NOVIEW, 0); /* Translators: try to keep this string under 16 characters long */ - sc_init_one(&writefile_list, NANO_PREPEND_KEY, _("Prepend"), - IFHELP(nano_prepend_msg, 0), 0, 0, NOVIEW, 0); + sc_init_one(&writefile_list, NANO_NO_KEY, _("Prepend"), + IFHELP(nano_prepend_msg, NANO_PREPEND_KEY), NANO_NO_KEY, + NANO_NO_KEY, NOVIEW, 0); #ifndef NANO_SMALL /* Translators: try to keep this string under 16 characters long */ - sc_init_one(&writefile_list, TOGGLE_BACKUP_KEY, _("Backup File"), - IFHELP(nano_backup_msg, 0), 0, 0, NOVIEW, 0); + sc_init_one(&writefile_list, NANO_NO_KEY, _("Backup File"), + IFHELP(nano_backup_msg, TOGGLE_BACKUP_KEY), NANO_NO_KEY, + NANO_NO_KEY, NOVIEW, 0); #endif sc_init_one(&writefile_list, NANO_CANCEL_KEY, _("Cancel"), - IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0); + IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, 0); free_shortcutage(&insertfile_list); sc_init_one(&insertfile_list, NANO_HELP_KEY, _("Get Help"), - IFHELP(nano_help_msg, 0), NANO_HELP_FKEY, - 0, VIEW, do_help); + IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY, + NANO_NO_KEY, VIEW, do_help); sc_init_one(&insertfile_list, NANO_CANCEL_KEY, _("Cancel"), - IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0); + IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, 0); #ifndef DISABLE_BROWSER sc_init_one(&insertfile_list, NANO_TOFILES_KEY, _("To Files"), - IFHELP(nano_tofiles_msg, 0), 0, 0, NOVIEW, 0); + IFHELP(nano_tofiles_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, NOVIEW, 0); #endif #ifndef NANO_SMALL /* Translators: try to keep this string under 22 characters long */ sc_init_one(&insertfile_list, NANO_EXTCMD_KEY, _("Execute Command"), - IFHELP(nano_execute_msg, 0), 0, 0, NOVIEW, 0); + IFHELP(nano_execute_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, NOVIEW, 0); #ifdef ENABLE_MULTIBUFFER /* Translators: try to keep this string under 22 characters long */ - sc_init_one(&insertfile_list, TOGGLE_MULTIBUFFER_KEY, _("New Buffer"), - IFHELP(nano_multibuffer_msg, 0), 0, 0, NOVIEW, 0); + sc_init_one(&insertfile_list, NANO_NO_KEY, _("New Buffer"), + IFHELP(nano_multibuffer_msg, TOGGLE_MULTIBUFFER_KEY), NANO_NO_KEY, + NANO_NO_KEY, NOVIEW, 0); #endif #endif @@ -809,55 +857,59 @@ void shortcut_init(int unjustify) free_shortcutage(&spell_list); sc_init_one(&spell_list, NANO_HELP_KEY, _("Get Help"), - IFHELP(nano_help_msg, 0), NANO_HELP_FKEY, - 0, VIEW, do_help); + IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY, + NANO_NO_KEY, VIEW, do_help); sc_init_one(&spell_list, NANO_CANCEL_KEY, _("Cancel"), - IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0); + IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, 0); #endif #ifndef NANO_SMALL free_shortcutage(&extcmd_list); sc_init_one(&extcmd_list, NANO_HELP_KEY, _("Get Help"), - IFHELP(nano_help_msg, 0), NANO_HELP_FKEY, - 0, VIEW, do_help); + IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY, + NANO_NO_KEY, VIEW, do_help); sc_init_one(&extcmd_list, NANO_CANCEL_KEY, _("Cancel"), - IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0); + IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, 0); #endif #ifndef DISABLE_BROWSER free_shortcutage(&browser_list); sc_init_one(&browser_list, NANO_HELP_KEY, _("Get Help"), - IFHELP(nano_help_msg, 0), NANO_HELP_FKEY, - 0, VIEW, do_help); + IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY, + NANO_NO_KEY, VIEW, do_help); sc_init_one(&browser_list, NANO_CANCEL_KEY, _("Cancel"), - IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0); + IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, 0); sc_init_one(&browser_list, NANO_PREVPAGE_KEY, _("Prev Page"), - IFHELP(nano_prevpage_msg, 0), NANO_PREVPAGE_FKEY, - 0, VIEW, 0); + IFHELP(nano_prevpage_msg, NANO_NO_KEY), NANO_PREVPAGE_FKEY, + NANO_NO_KEY, VIEW, 0); sc_init_one(&browser_list, NANO_NEXTPAGE_KEY, _("Next Page"), - IFHELP(nano_nextpage_msg, 0), NANO_NEXTPAGE_FKEY, - 0, VIEW, 0); + IFHELP(nano_nextpage_msg, NANO_NO_KEY), NANO_NEXTPAGE_FKEY, + NANO_NO_KEY, VIEW, 0); /* Translators: try to keep this string under 22 characters long */ sc_init_one(&browser_list, NANO_GOTO_KEY, _("Go To Dir"), - IFHELP(nano_gotodir_msg, NANO_ALT_GOTO_KEY), - NANO_GOTO_FKEY, 0, VIEW, 0); + IFHELP(nano_gotodir_msg, NANO_ALT_GOTO_KEY), NANO_GOTO_FKEY, + NANO_NO_KEY, VIEW, 0); free_shortcutage(&gotodir_list); sc_init_one(&gotodir_list, NANO_HELP_KEY, _("Get Help"), - IFHELP(nano_help_msg, 0), NANO_HELP_FKEY, - 0, VIEW, do_help); + IFHELP(nano_help_msg, NANO_NO_KEY), NANO_HELP_FKEY, + NANO_NO_KEY, VIEW, do_help); sc_init_one(&gotodir_list, NANO_CANCEL_KEY, _("Cancel"), - IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0); + IFHELP(nano_cancel_msg, NANO_NO_KEY), NANO_NO_KEY, + NANO_NO_KEY, VIEW, 0); #endif #if !defined(DISABLE_BROWSER) || !defined(DISABLE_HELP) || !defined(DISABLE_MOUSE) diff --git a/src/nano.c b/src/nano.c index ef64e59c..cce32695 100644 --- a/src/nano.c +++ b/src/nano.c @@ -406,43 +406,39 @@ void help_init(void) /* true if the character in s->altval is shown in first column */ int meta_shortcut = 0; + if (s->val != NANO_NO_KEY) { #ifndef NANO_SMALL - if (s->val == NANO_UP_KEY && s->misc == NANO_DOWN_KEY) - ptr += sprintf(ptr, "%.2s", _("Up")); - else + if (s->val == NANO_HISTORY_KEY) + ptr += sprintf(ptr, "%.2s", _("Up")); + else #endif - if (is_cntrl_char(s->val)) { if (s->val == NANO_CONTROL_SPACE) - ptr += sprintf(ptr, "^%.6s", _("Space")); + ptr += sprintf(ptr, "^%.5s", _("Space")); else if (s->val == NANO_CONTROL_8) ptr += sprintf(ptr, "^?"); else ptr += sprintf(ptr, "^%c", s->val + 64); } #ifndef NANO_SMALL - else if (s->altval == NANO_ALT_SPACE) { + else if (s->altval != NANO_NO_KEY) { meta_shortcut = 1; - ptr += sprintf(ptr, "M-%.5s", _("Space")); + if (s->altval == NANO_ALT_SPACE) + ptr += snprintf(ptr, 8, "M-%.5s", _("Space")); + else + ptr += sprintf(ptr, "M-%c", toupper(s->altval)); } #endif - else if (s->val > 0) { - meta_shortcut = 1; - ptr += sprintf(ptr, "M-%c", toupper(s->val)); - } else if (s->altval > 0) { - meta_shortcut = 1; - ptr += sprintf(ptr, "M-%c", toupper(s->altval)); - } *(ptr++) = '\t'; - if (s->func_key > KEY_F0 && s->func_key <= KEY_F(64)) + if (s->func_key != NANO_NO_KEY) ptr += sprintf(ptr, "(F%d)", s->func_key - KEY_F0); *(ptr++) = '\t'; - if (!meta_shortcut && s->altval > 0) + if (!meta_shortcut && s->altval != NANO_NO_KEY) ptr += sprintf(ptr, "(M-%c)", toupper(s->altval)); - else if (meta_shortcut && s->misc > 0) + else if (meta_shortcut && s->misc != NANO_NO_KEY) ptr += sprintf(ptr, "(M-%c)", toupper(s->misc)); *(ptr++) = '\t'; @@ -663,7 +659,7 @@ void usage(void) #endif print1opt("-c", "--const", _("Constantly show cursor position")); #ifndef NANO_SMALL - print1opt("-d", "--rebinddelete", _("Fix Backspace if it acts like Delete")); + print1opt("-d", "--rebinddelete", _("Fix Backspace/Delete confusion problem")); print1opt("-i", "--autoindent", _("Automatically indent new lines")); print1opt("-k", "--cut", _("Let ^K cut from cursor to end of line")); #endif @@ -896,7 +892,7 @@ void do_mouse(void) { int mouse_x, mouse_y; - if (get_mouseinput(&mouse_x, &mouse_y) == 0) { + if (get_mouseinput(&mouse_x, &mouse_y, 1) == 0) { /* Click in the edit window to move the cursor, but only when we're not in a subfunction. */ @@ -1019,7 +1015,7 @@ int do_verbatim_input(void) signal_init(); statusbar(_("Verbatim input")); - verbatim_kbinput = get_verbatim_kbinput(edit, &verbatim_len); + verbatim_kbinput = get_verbatim_kbinput(edit, &verbatim_len, 1); /* Turn on DISABLE_CURPOS while inserting character(s) and turn it * off afterwards, so that if constant cursor position display is @@ -2238,8 +2234,7 @@ int do_para_operation(int operation) * * A contiguous set of lines is a "paragraph" if each line is part of * a paragraph and only the first line is the beginning of a - * paragraph. - */ + * paragraph. */ size_t quote_len; /* Length of the initial quotation of the paragraph we @@ -2656,17 +2651,22 @@ int do_para_operation(int operation) /* Now get a keystroke and see if it's unjustify; if not, unget the * keystroke and return. */ + { + int meta; + i = get_kbinput(edit, &meta); #ifndef DISABLE_MOUSE - /* If it was a mouse click, parse it with do_mouse() and it might - * become the unjustify key. Else give it back to the input - * stream. */ - if ((i = wgetch(edit)) == KEY_MOUSE) - do_mouse(); - else - ungetch(i); + /* If it was a mouse click, parse it with do_mouse() and it + * might become the unjustify key. Else give it back to the + * input stream. */ + if (i == KEY_MOUSE) + do_mouse(); + else + ungetch(i); + i = get_kbinput(edit, &meta); #endif + } - if ((i = wgetch(edit)) != NANO_UNJUSTIFY_KEY) { + if (i != NANO_UNJUSTIFY_KEY) { ungetch(i); /* Did we back up anything at all? */ if (cutbuffer != cutbuffer_save) @@ -2761,14 +2761,11 @@ int do_exit(void) finish(0); } - if (ISSET(TEMP_OPT)) { + if (ISSET(TEMP_OPT)) i = 1; - } else { - i = do_yesno(0, 0, - _ - ("Save modified buffer (ANSWERING \"No\" WILL DESTROY CHANGES) ? ")); - } - + else + i = do_yesno(0, _("Save modified buffer (ANSWERING \"No\" WILL DESTROY CHANGES) ? ")); + #ifdef DEBUG dump_buffer(fileage); #endif @@ -3066,7 +3063,6 @@ int main(int argc, char *argv[]) struct termios term; #endif #ifdef HAVE_GETOPT_LONG - int option_index = 0; const struct option long_options[] = { {"help", 0, 0, 'h'}, #ifdef ENABLE_MULTIBUFFER @@ -3140,7 +3136,7 @@ int main(int argc, char *argv[]) #ifdef HAVE_GETOPT_LONG while ((optchr = getopt_long(argc, argv, "h?BDFHIMNQ:RST:VY:abcdefgijklmo:pr:s:tvwxz", - long_options, &option_index)) != -1) { + long_options, NULL)) != -1) { #else while ((optchr = getopt(argc, argv, "h?BDFHIMNQ:RST:VY:abcdefgijklmo:pr:s:tvwxz")) != -1) { @@ -3515,7 +3511,7 @@ int main(int argc, char *argv[]) raw(); #endif - kbinput = get_kbinput(edit, &meta, ISSET(REBIND_DELETE)); + kbinput = get_kbinput(edit, &meta); #ifdef DEBUG fprintf(stderr, "AHA! %c (%d)\n", kbinput, kbinput); #endif @@ -3558,8 +3554,8 @@ int main(int argc, char *argv[]) #else for (s = main_list; s != NULL && !keyhandled; s = s->next) { #endif - if ((s->val >= 0 && kbinput == s->val) || - (s->func_key > 0 && kbinput == s->func_key)) { + if ((s->val != NANO_NO_KEY && kbinput == s->val) || + (s->func_key != NANO_NO_KEY && kbinput == s->func_key)) { if (ISSET(VIEW_MODE) && !s->viewok) print_view_warning(); else { diff --git a/src/nano.h b/src/nano.h index eaf1b8f3..44c23196 100644 --- a/src/nano.h +++ b/src/nano.h @@ -90,8 +90,9 @@ #endif /* Assume ERR is defined as -1. To avoid duplicate case values when - some key definitions are missing, we have to set these all to - different negative values other than -1. */ + some key definitions are missing, we have to set all of these, and + all of the special sentinel values below, to different negative + values other than -1. */ /* HP-UX 10 & 11 do not seem to support KEY_HOME and KEY_END */ #ifndef KEY_HOME @@ -107,18 +108,18 @@ #define KEY_RESIZE -4 #endif -/* Slang does not seem to support KEY_SUSPEND */ +/* Slang does not seem to support KEY_SUSPEND, KEY_SLEFT, or + KEY_SRIGHT */ #ifndef KEY_SUSPEND #define KEY_SUSPEND -5 #endif -/* Non-ncurses may not support KEY_UP and KEY_DOWN */ -#ifndef KEY_UP -#define KEY_UP -6 +#ifndef KEY_SLEFT +#define KEY_SLEFT -6 #endif -#ifndef KEY_DOWN -#define KEY_DOWN -7 +#ifndef KEY_SRIGHT +#define KEY_SRIGHT -7 #endif #define VERMSG "GNU nano " VERSION @@ -168,18 +169,19 @@ typedef struct openfilestruct { #endif typedef struct shortcut { - int val; /* Actual sequence that generates the keystroke, - or -1 for none */ - int altval; /* Alt key for this function, or 0 for none */ - int func_key; /* Function key we want bound */ - int misc; /* Other Alt key we want bound, or 0 for none */ - int viewok; /* is this function legal in view mode? */ - int (*func) (void); /* Function to call when we catch this key */ - const char *desc; /* Description, e.g. "Page Up" */ + /* Key values that aren't used should be set to NANO_NO_KEY */ + int val; /* Special sentinel key or control key we want + * bound */ + int altval; /* Alt key we want bound */ + int func_key; /* Function key we want bound */ + int misc; /* Other Alt key we want bound */ + int viewok; /* Is this function legal in view mode? */ + int (*func) (void); /* Function to call when we catch this key */ + const char *desc; /* Description, e.g. "Page Up" */ #ifndef DISABLE_HELP - const char *help; /* Help file entry text */ + const char *help; /* Help file entry text */ #endif - struct shortcut *next; + struct shortcut *next; } shortcut; #ifndef NANO_SMALL @@ -348,10 +350,17 @@ typedef struct historyheadtype { /* Some semi-changeable keybindings; don't play with unless you're sure you know what you're doing */ +/* No key at all. */ +#define NANO_NO_KEY -8 + +/* Special sentinel key. */ +#define NANO_HISTORY_KEY -9 + +/* Normal keys. */ #define NANO_INSERTFILE_KEY NANO_CONTROL_R #define NANO_INSERTFILE_FKEY KEY_F(5) -#define NANO_EXIT_KEY NANO_CONTROL_X -#define NANO_EXIT_FKEY KEY_F(2) +#define NANO_EXIT_KEY NANO_CONTROL_X +#define NANO_EXIT_FKEY KEY_F(2) #define NANO_WRITEOUT_KEY NANO_CONTROL_O #define NANO_WRITEOUT_FKEY KEY_F(3) #define NANO_GOTO_KEY NANO_CONTROL_7 diff --git a/src/proto.h b/src/proto.h index ea59974d..097588a5 100644 --- a/src/proto.h +++ b/src/proto.h @@ -436,15 +436,15 @@ int check_wildcard_match(const char *text, const char *pattern); #endif /* Public functions in winio.c */ -int get_kbinput(WINDOW *win, int *meta, int rebind_delete); -char *get_verbatim_kbinput(WINDOW *win, int *kbinput_len); +int get_kbinput(WINDOW *win, int *meta); +char *get_verbatim_kbinput(WINDOW *win, int *kbinput_len, + int allow_ascii); int get_ignored_kbinput(WINDOW *win); -int get_accepted_kbinput(WINDOW *win, int kbinput, int *meta, - int rebind_delete); +int get_accepted_kbinput(WINDOW *win, int kbinput, int *meta); int get_ascii_kbinput(WINDOW *win, int kbinput); -int get_escape_seq_kbinput(WINDOW *win, int kbinput); -int get_skip_tilde_kbinput(WINDOW *win, int errval, int retval); -int get_mouseinput(int *mouse_x, int *mouse_y); +int get_escape_seq_kbinput(WINDOW *win, char *escape_seq, int + escape_seq_len); +int get_mouseinput(int *mouse_x, int *mouse_y, int shortcut); int do_first_line(void); int do_last_line(void); int xpt(const filestruct *fileptr, int index); @@ -493,7 +493,7 @@ int statusq(int tabs, const shortcut *s, const char *def, historyheadtype *history_list, #endif const char *msg, ...); -int do_yesno(int all, int leavecursor, const char *msg, ...); +int do_yesno(int all, const char *msg); int total_refresh(void); void display_main_list(void); void statusbar(const char *msg, ...); diff --git a/src/search.c b/src/search.c index cbfa2986..ef1ea8f1 100644 --- a/src/search.c +++ b/src/search.c @@ -711,7 +711,7 @@ int do_replace_loop(const char *prevanswer, const filestruct *begin, curs_set(0); do_replace_highlight(TRUE, exp_word); - *i = do_yesno(1, 1, _("Replace this instance?")); + *i = do_yesno(1, _("Replace this instance?")); do_replace_highlight(FALSE, exp_word); free(exp_word); diff --git a/src/winio.c b/src/winio.c index 3428c0ba..24fec70c 100644 --- a/src/winio.c +++ b/src/winio.c @@ -37,12 +37,12 @@ static int statblank = 0; /* Number of keystrokes left after /* Read in a single input character. If it's ignored, swallow it and go * on. Otherwise, try to translate it from ASCII and extended (keypad) * input. Assume nodelay(win) is FALSE. */ -int get_kbinput(WINDOW *win, int *meta, int rebind_delete) +int get_kbinput(WINDOW *win, int *meta) { int kbinput, retval; kbinput = get_ignored_kbinput(win); - retval = get_accepted_kbinput(win, kbinput, meta, rebind_delete); + retval = get_accepted_kbinput(win, kbinput, meta); return retval; } @@ -50,7 +50,8 @@ int get_kbinput(WINDOW *win, int *meta, int rebind_delete) /* Read in a string of input characters (e. g. an escape sequence) * verbatim, and return the length of the string in kbinput_len. Assume * nodelay(win) is FALSE. */ -char *get_verbatim_kbinput(WINDOW *win, int *kbinput_len) +char *get_verbatim_kbinput(WINDOW *win, int *kbinput_len, + int allow_ascii) { char *verbatim_kbinput; int kbinput = wgetch(win); @@ -59,7 +60,7 @@ char *get_verbatim_kbinput(WINDOW *win, int *kbinput_len) verbatim_kbinput[0] = kbinput; *kbinput_len = 1; - if (kbinput >= '0' && kbinput <= '2') + if (allow_ascii && kbinput >= '0' && kbinput <= '2') /* Entering a three-digit decimal ASCII code from 000-255 in * verbatim mode will produce the corresponding ASCII * character. */ @@ -111,8 +112,7 @@ int get_ignored_kbinput(WINDOW *win) /* Translate acceptable ASCII and extended (keypad) input. Set meta to * 1 if we get a Meta sequence. Assume nodelay(win) is FALSE. */ -int get_accepted_kbinput(WINDOW *win, int kbinput, int *meta, - int rebind_delete) +int get_accepted_kbinput(WINDOW *win, int kbinput, int *meta) { *meta = 0; @@ -143,23 +143,33 @@ int get_accepted_kbinput(WINDOW *win, int kbinput, int *meta, else if (kbinput >= 'a' && kbinput <= '~') kbinput -= 96; break; + case 'O': + case 'o': /* Terminal breakage, part 1: We shouldn't get an escape * sequence here for terminals that support Delete, but * we do sometimes on FreeBSD. Thank you, Wouter van * Hemel. */ case '[': + { + int old_kbinput = kbinput, escape_seq_len; + char *escape_seq; nodelay(win, TRUE); kbinput = wgetch(win); switch (kbinput) { case ERR: - kbinput = '['; + kbinput = tolower(old_kbinput); *meta = 1; break; default: - kbinput = get_escape_seq_kbinput(win, kbinput); + ungetch(kbinput); + ungetch(old_kbinput); + escape_seq = get_verbatim_kbinput(win, &escape_seq_len, 0); + kbinput = get_escape_seq_kbinput(win, escape_seq, escape_seq_len); + free(escape_seq); } nodelay(win, FALSE); break; + } default: /* Esc [character] == Meta-[character] */ kbinput = tolower(kbinput); @@ -168,8 +178,8 @@ int get_accepted_kbinput(WINDOW *win, int kbinput, int *meta, break; case NANO_CONTROL_8: /* Terminal breakage, part 2: We shouldn't get Ctrl-8 - * (Ctrl-?) for Backspace, but we do sometimes on Linux. */ - kbinput = NANO_BACKSPACE_KEY; + * (Ctrl-?) for Backspace or Delete, but we do sometimes. */ + kbinput = ISSET(REBIND_DELETE) ? NANO_DELETE_KEY : NANO_BACKSPACE_KEY; break; case KEY_DOWN: kbinput = NANO_DOWN_KEY; @@ -193,7 +203,7 @@ int get_accepted_kbinput(WINDOW *win, int kbinput, int *meta, /* Terminal breakage, part 3: We should only get KEY_DC when * hitting Delete, but we get it when hitting Backspace * sometimes on FreeBSD. Thank you, Lee Nelson. */ - kbinput = (rebind_delete) ? NANO_BACKSPACE_KEY : NANO_DELETE_KEY; + kbinput = ISSET(REBIND_DELETE) ? NANO_BACKSPACE_KEY : NANO_DELETE_KEY; break; case KEY_IC: kbinput = NANO_INSERTFILE_KEY; @@ -213,6 +223,12 @@ int get_accepted_kbinput(WINDOW *win, int kbinput, int *meta, case KEY_SUSPEND: kbinput = NANO_SUSPEND_KEY; break; + case KEY_SLEFT: + kbinput = NANO_BACK_KEY; + break; + case KEY_SRIGHT: + kbinput = NANO_FORWARD_KEY; + break; } #ifdef DEBUG fprintf(stderr, "get_accepted_kbinput(): kbinput = %d, meta = %d\n", kbinput, *meta); @@ -230,7 +246,7 @@ int get_ascii_kbinput(WINDOW *win, int kbinput) case '0': case '1': case '2': - retval = (kbinput - 48) * 100; + retval = (kbinput - '0') * 100; break; default: return kbinput; @@ -244,14 +260,14 @@ int get_ascii_kbinput(WINDOW *win, int kbinput) case '3': case '4': case '5': - retval += (kbinput - 48) * 10; + retval += (kbinput - '0') * 10; break; case '6': case '7': case '8': case '9': if (retval < 200) { - retval += (kbinput - 48) * 10; + retval += (kbinput - '0') * 10; break; } default: @@ -266,14 +282,14 @@ int get_ascii_kbinput(WINDOW *win, int kbinput) case '3': case '4': case '5': - retval += kbinput - 48; + retval += kbinput - '0'; break; case '6': case '7': case '8': case '9': if (retval < 250) { - retval += kbinput - 48; + retval += kbinput - '0'; break; } default: @@ -287,45 +303,243 @@ int get_ascii_kbinput(WINDOW *win, int kbinput) } /* Translate common escape sequences for some keys. These are generated - * when the terminal doesn't support those keys. Assume nodelay(win) is - * TRUE. */ -int get_escape_seq_kbinput(WINDOW *win, int kbinput) + * when the terminal doesn't support those keys. Assume that Escape has + * already been read in, and that nodelay(win) is TRUE. */ +int get_escape_seq_kbinput(WINDOW *win, char *escape_seq, int + escape_seq_len) { - switch (kbinput) { - case '3': - /* Esc [ 3 ~ == kdch1 on many terminals. */ - kbinput = get_skip_tilde_kbinput(win, kbinput, NANO_DELETE_KEY); - break; + int kbinput = -1; + + if (escape_seq_len > 1) { + switch (escape_seq[0]) { + case 'O': + switch (escape_seq[1]) { + case 'A': /* Esc O A == Up on xterm. */ + kbinput = NANO_UP_KEY; + break; + case 'B': /* Esc O B == Down on xterm. */ + kbinput = NANO_DOWN_KEY; + break; + case 'C': /* Esc O C == Right on xterm. */ + kbinput = NANO_FORWARD_KEY; + break; + case 'D': /* Esc O D == Left on xterm. */ + kbinput = NANO_BACK_KEY; + break; + case 'F': /* Esc O F == End on xterm. */ + kbinput = NANO_END_KEY; + break; + case 'H': /* Esc O H == Home on xterm. */ + kbinput = NANO_HOME_KEY; + break; + case 'a': /* Esc O a == Ctrl-Up on rxvt. */ + kbinput = NANO_UP_KEY; + break; + case 'b': /* Esc O b == Ctrl-Down on rxvt. */ + kbinput = NANO_DOWN_KEY; + break; + case 'c': /* Esc O c == Ctrl-Right on rxvt. */ + kbinput = NANO_FORWARD_KEY; + break; + case 'd': /* Esc O d == Ctrl-Left on rxvt. */ + kbinput = NANO_BACK_KEY; + break; + } + break; + case 'o': + switch (escape_seq[1]) { + case 'a': /* Esc o a == Ctrl-Up on Eterm. */ + kbinput = NANO_UP_KEY; + break; + case 'b': /* Esc o b == Ctrl-Down on Eterm. */ + kbinput = NANO_DOWN_KEY; + break; + case 'c': /* Esc o c == Ctrl-Right on Eterm. */ + kbinput = NANO_FORWARD_KEY; + break; + case 'd': /* Esc o d == Ctrl-Left on Eterm. */ + kbinput = NANO_BACK_KEY; + break; + } + break; + case '[': + switch (escape_seq[1]) { + case '1': + if (escape_seq_len >= 5) { + if (!strncmp(escape_seq, "[1;2", 4)) { + switch (escape_seq[4]) { + case 'A': + /* Esc [ 1 ; 2 A == Shift-Up on + * xterm. */ + kbinput = NANO_UP_KEY; + break; + case 'B': + /* Esc [ 1 ; 2 B == Shift-Down + * on xterm. */ + kbinput = NANO_DOWN_KEY; + break; + case 'C': + /* Esc [ 1 ; 2 C == Shift-Right + * on xterm. */ + kbinput = NANO_FORWARD_KEY; + break; + case 'D': + /* Esc [ 1 ; 2 D == Shift-Left + * on xterm. */ + kbinput = NANO_BACK_KEY; + break; + } + } else if (!strncmp(escape_seq, "[1;5", 4)) { + switch (escape_seq[4]) { + case 'A': + /* Esc [ 1 ; 5 A == Ctrl-Up on + * xterm. */ + kbinput = NANO_UP_KEY; + break; + case 'B': + /* Esc [ 1 ; 5 B == Ctrl-Down on + * xterm. */ + kbinput = NANO_DOWN_KEY; + break; + case 'C': + /* Esc [ 1 ; 5 C == Ctrl-Right + * on xterm. */ + kbinput = NANO_FORWARD_KEY; + break; + case 'D': + /* Esc [ 1 ; 5 D == Ctrl-Left on + * xterm. */ + kbinput = NANO_BACK_KEY; + break; + } + } + break; + } else { + /* Esc [ 1 ~ == Home on Linux console. */ + kbinput = NANO_HOME_KEY; + break; + } + case '2': /* Esc [ 2 ~ == Insert on Linux + * console/xterm. */ + kbinput = NANO_INSERTFILE_KEY; + break; + case '3': /* Esc [ 3 ~ == Delete on Linux + * console/xterm. */ + kbinput = NANO_DELETE_KEY; + break; + case '4': /* Esc [ 4 ~ == End on Linux + * console/xterm. */ + kbinput = NANO_END_KEY; + break; + case '5': /* Esc [ 5 ~ == PageUp on Linux + * console/xterm, Esc [ 5 ^ == PageUp on + * Eterm. */ + kbinput = NANO_PREVPAGE_KEY; + break; + case '6': /* Esc [ 6 ~ == PageDown on Linux + * console/xterm, Esc [ 6 ^ == PageDown on + * Eterm. */ + kbinput = NANO_NEXTPAGE_KEY; + break; + case '7': /* Esc [ 7 ~ == Home on rxvt. */ + kbinput = NANO_HOME_KEY; + break; + case '8': /* Esc [ 8 ~ == End on rxvt. */ + kbinput = NANO_END_KEY; + break; + case '9': /* Esc [ 9 == Delete on Hurd console. */ + kbinput = NANO_DELETE_KEY; + break; + case '@': /* Esc [ @ == Insert on Hurd console. */ + kbinput = NANO_INSERTFILE_KEY; + break; + case 'A': /* Esc [ A == Up on Linux console/FreeBSD + * console/Hurd console/rxvt/Eterm. */ + kbinput = NANO_UP_KEY; + break; + case 'B': /* Esc [ B == Down on Linux + * console/FreeBSD console/Hurd + * console/rxvt/Eterm. */ + kbinput = NANO_DOWN_KEY; + break; + case 'C': /* Esc [ C == Right on Linux + * console/FreeBSD console/Hurd + * console/rxvt/Eterm. */ + kbinput = NANO_FORWARD_KEY; + break; + case 'D': /* Esc [ D == Left on Linux + * console/FreeBSD console/Hurd + * console/rxvt/Eterm. */ + kbinput = NANO_BACK_KEY; + break; + case 'F': /* Esc [ F == End on FreeBSD + * console/Eterm. */ + kbinput = NANO_END_KEY; + break; + case 'G': /* Esc [ G == PageDown on FreeBSD + * console. */ + kbinput = NANO_NEXTPAGE_KEY; + break; + case 'H': /* Esc [ H == Home on FreeBSD + * console/Hurd console/Eterm. */ + kbinput = NANO_HOME_KEY; + break; + case 'I': /* Esc [ I == PageUp on FreeBSD + * console. */ + kbinput = NANO_PREVPAGE_KEY; + break; + case 'L': /* Esc [ L == Insert on FreeBSD + * console. */ + kbinput = NANO_INSERTFILE_KEY; + break; + case 'U': /* Esc [ U == PageDown on Hurd console. */ + kbinput = NANO_NEXTPAGE_KEY; + break; + case 'V': /* Esc [ V == PageUp on Hurd console. */ + kbinput = NANO_PREVPAGE_KEY; + break; + case 'Y': /* Esc [ Y == End on Hurd console. */ + kbinput = NANO_END_KEY; + break; + case 'a': /* Esc [ a == Shift-Up on rxvt and + * Eterm. */ + kbinput = NANO_UP_KEY; + break; + case 'b': /* Esc [ b == Shift-Down on rxvt and + * Eterm. */ + kbinput = NANO_DOWN_KEY; + break; + case 'c': /* Esc [ c == Shift-Right on rxvt. */ + kbinput = NANO_FORWARD_KEY; + break; + case 'd': /* Esc [ d == Shift-Left on rxvt. */ + kbinput = NANO_BACK_KEY; + break; + } + break; + } } - return kbinput; -} -/* If there is no next character, return the passed-in error value. If - * the next character's a tilde, eat it and return the passed-in - * return value. Otherwise, return the next character. Assume - * nodelay(win) is TRUE. */ -int get_skip_tilde_kbinput(WINDOW *win, int errval, int retval) -{ - int kbinput = wgetch(win); - switch (kbinput) { - case ERR: - return errval; - case '~': - return retval; - default: - return kbinput; + if (kbinput == -1) { + /* This escape sequence is unrecognized; send it back. */ + for (; escape_seq_len > 1; escape_seq_len--) + ungetch(escape_seq[escape_seq_len - 1]); + kbinput = escape_seq[0]; } + + return kbinput; } #ifndef DISABLE_MOUSE -/* Check for a mouse event. If it took place on the shortcut list on - * the bottom two lines of the screen (assuming that the shortcut list is - * visible), figure out which shortcut was clicked and ungetch() the - * equivalent keystroke(s), otherwise do nothing. Return 0 if no - * keystrokes were ungetch()ed, or 1 if at least one was. Also, return - * the screen coordinates where the mouse event took place in *mouse_x - * and *mouse_y. Assume that KEY_MOUSE has already been read in. */ -int get_mouseinput(int *mouse_x, int *mouse_y) +/* Check for a mouse event, and if one's taken place, save the + * coordinates where it took place in mouse_x and mouse_y. After that, + * if allow_shortcuts is zero, return 0. Otherwise, if the mouse event + * took place on the shortcut list on the bottom two lines of the screen + * (assuming that the shortcut list is visible), figure out which + * shortcut was clicked and ungetch() the equivalent keystroke(s). + * Return 0 if no keystrokes were ungetch()ed, or 1 if at least one was. + * Assume that KEY_MOUSE has already been read in. */ +int get_mouseinput(int *mouse_x, int *mouse_y, int allow_shortcuts) { MEVENT mevent; @@ -340,10 +554,14 @@ int get_mouseinput(int *mouse_x, int *mouse_y) *mouse_x = mevent.x; *mouse_y = mevent.y; - /* If the current shortcut list is being displayed on the last two - * lines of the screen and the mouse event took place inside it, - * we need to figure out which shortcut was clicked and ungetch() - * the equivalent keystroke(s) for it. */ + /* If we're not allowing shortcuts' we're done now. */ + if (!allow_shortcuts) + return 0; + + /* Otherwise, if the current shortcut list is being displayed on the + * last two lines of the screen and the mouse event took place + * inside it, we need to figure out which shortcut was clicked and + * ungetch() the equivalent keystroke(s) for it. */ if (!ISSET(NO_HELP) && wenclose(bottomwin, *mouse_y, *mouse_x)) { int i, j; int currslen; @@ -679,7 +897,7 @@ int nanogetstr(int allowtabs, const char *buf, const char *def, input */ wrefresh(edit); - while ((kbinput = get_kbinput(bottomwin, &meta, ISSET(REBIND_DELETE))) != NANO_ENTER_KEY) { + while ((kbinput = get_kbinput(bottomwin, &meta)) != NANO_ENTER_KEY) { for (t = s; t != NULL; t = t->next) { #ifdef DEBUG fprintf(stderr, "Aha! \'%c\' (%d)\n", kbinput, kbinput); @@ -872,12 +1090,12 @@ int nanogetstr(int allowtabs, const char *buf, const char *def, fprintf(stderr, "Aha! \'%c\' (%d)\n", kbinput, kbinput); #endif - if (meta == 1 && kbinput == t->val) + if (meta == 1 && kbinput == t->altval) /* We hit an Alt key. Do like above. We don't just ungetch() the letter and let it get caught above cause that screws the keypad... */ - return t->val; + return t->altval; } if (is_cntrl_char(kbinput)) @@ -993,19 +1211,20 @@ void bottombars(const shortcut *s) wmove(bottomwin, 1 + j, i * (COLS / numcols)); /* Yucky sentinel values we can't handle a better way */ - if (s->val == NANO_CONTROL_SPACE) - strcpy(keystr, "^ "); + if (s->val != NANO_NO_KEY) { #ifndef NANO_SMALL - else if (s->val == NANO_UP_KEY && s->misc == NANO_DOWN_KEY) - strncpy(keystr, _("Up"), 8); -#endif /* NANO_SMALL */ - else if (s->val > 0) { - if (s->val < 64) - sprintf(keystr, "^%c", s->val + 64); + if (s->val == NANO_HISTORY_KEY) + strncpy(keystr, _("Up"), 8); + else +#endif + if (s->val == NANO_CONTROL_SPACE) + strcpy(keystr, "^ "); + else if (s->val == NANO_CONTROL_8) + strcpy(keystr, "^?"); else - sprintf(keystr, "M-%c", toupper(s->val)); - } else if (s->altval > 0) - sprintf(keystr, "M-%c", s->altval); + sprintf(keystr, "^%c", s->val + 64); + } else if (s->altval != NANO_NO_KEY) + sprintf(keystr, "M-%c", toupper(s->altval)); onekey(keystr, s->desc, COLS / numcols); @@ -1632,11 +1851,9 @@ int statusq(int tabs, const shortcut *s, const char *def, /* Ask a simple yes/no question on the statusbar. Returns 1 for Y, 0 * for N, 2 for All (if all is nonzero when passed in) and -1 for abort * (^C). */ -int do_yesno(int all, int leavecursor, const char *msg, ...) +int do_yesno(int all, const char *msg) { - va_list ap; - char *foo; - int ok = -2; + int ok = -2, width = 16; const char *yesstr; /* String of yes characters accepted */ const char *nostr; /* Same for no */ const char *allstr; /* And all, surprise! */ @@ -1653,70 +1870,75 @@ int do_yesno(int all, int leavecursor, const char *msg, ...) if (!ISSET(NO_HELP)) { char shortstr[3]; /* Temp string for Y, N, A. */ + if (COLS < 32) + width = COLS / 2; + /* Write the bottom of the screen. */ blank_bottombars(); sprintf(shortstr, " %c", yesstr[0]); wmove(bottomwin, 1, 0); - onekey(shortstr, _("Yes"), 16); + onekey(shortstr, _("Yes"), width); if (all) { - wmove(bottomwin, 1, 16); + wmove(bottomwin, 1, width); shortstr[1] = allstr[0]; - onekey(shortstr, _("All"), 16); + onekey(shortstr, _("All"), width); } wmove(bottomwin, 2, 0); shortstr[1] = nostr[0]; - onekey(shortstr, _("No"), 16); + onekey(shortstr, _("No"), width); wmove(bottomwin, 2, 16); - onekey("^C", _("Cancel"), 16); + onekey("^C", _("Cancel"), width); } - foo = charalloc(COLS); - va_start(ap, msg); - vsnprintf(foo, COLS, msg, ap); - va_end(ap); - foo[COLS - 1] = '\0'; - wattron(bottomwin, A_REVERSE); blank_statusbar(); - mvwaddstr(bottomwin, 0, 0, foo); - free(foo); + mvwaddnstr(bottomwin, 0, 0, msg, COLS - 1); wattroff(bottomwin, A_REVERSE); wrefresh(bottomwin); do { - int kbinput = wgetch(edit); + int kbinput; + int meta; #ifndef DISABLE_MOUSE - MEVENT mevent; + int mouse_x, mouse_y; #endif - if (kbinput == NANO_CONTROL_C) + kbinput = get_kbinput(edit, &meta); + + if (kbinput == NANO_CANCEL_KEY) ok = -1; #ifndef DISABLE_MOUSE - /* Look ma! We get to duplicate lots of code from do_mouse!! */ - else if (kbinput == KEY_MOUSE && getmouse(&mevent) != ERR && - wenclose(bottomwin, mevent.y, mevent.x) && - !ISSET(NO_HELP) && mevent.x < 32 && - mevent.y >= editwinrows + 3) { - int x = mevent.x /= 16; - /* Did we click in the first column of shortcuts, or the - * second? */ - int y = mevent.y - editwinrows - 3; - /* Did we click in the first row of shortcuts? */ - - assert(0 <= x && x <= 1 && 0 <= y && y <= 1); - /* x = 0 means they clicked Yes or No. - * y = 0 means Yes or All. */ - ok = -2 * x * y + x - y + 1; - - if (ok == 2 && !all) - ok = -2; + /* Look ma! We get to duplicate lots of code from + * do_mouse()!! */ + else if (kbinput == KEY_MOUSE) { + kbinput = get_mouseinput(&mouse_x, &mouse_y, 0); + + if (mouse_x != -1 && mouse_y != -1 && !ISSET(NO_HELP) && + wenclose(bottomwin, mouse_y, mouse_x) && mouse_x < + (width * 2) && mouse_y >= editwinrows + 3) { + + int x = mouse_x / width; + /* Did we click in the first column of shortcuts, or + * the second? */ + int y = mouse_y - editwinrows - 3; + /* Did we click in the first row of shortcuts? */ + + assert(0 <= x && x <= 1 && 0 <= y && y <= 1); + + /* x = 0 means they clicked Yes or No. + * y = 0 means Yes or All. */ + ok = -2 * x * y + x - y + 1; + + if (ok == 2 && !all) + ok = -2; + } } #endif /* Look for the kbinput in the yes, no and (optionally) all @@ -1729,9 +1951,6 @@ int do_yesno(int all, int leavecursor, const char *msg, ...) ok = 2; } while (ok == -2); - /* Then blank the statusbar. */ - blank_statusbar_refresh(); - return ok; } @@ -1974,7 +2193,7 @@ int do_help(void) no_more = 1; continue; } - } while ((kbinput = get_kbinput(edit, &meta, ISSET(REBIND_DELETE))) != NANO_EXIT_KEY && kbinput != NANO_EXIT_FKEY); + } while ((kbinput = get_kbinput(edit, &meta)) != NANO_EXIT_KEY && kbinput != NANO_EXIT_FKEY); currshortcut = oldshortcut; -- 2.39.5