Commit e347efb9 authored by Chris Allegretta's avatar Chris Allegretta
Browse files

More keybinding fixes

- Fix tiny mode compilation problems
- Fix F-keys not working (silly typo)
- Change file browser to use new backend
- global.c - new helper function sc_seq_or, makes logic simpler down in the functions than calling first_sc_for directly


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@4218 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
parent 9b422202
Showing with 292 additions and 253 deletions
+292 -253
......@@ -60,6 +60,8 @@ char *do_browser(char *path, DIR *dir)
/* The last answer the user typed at the statusbar prompt. */
size_t old_selected;
/* The selected file we had before the current selected file. */
const sc *s;
const subnfunc *f;
curs_set(0);
blank_statusbar();
......@@ -124,11 +126,15 @@ char *do_browser(char *path, DIR *dir)
kbinput = get_kbinput(edit, &meta_key, &func_key);
parse_browser_input(&kbinput, &meta_key, &func_key);
switch (kbinput) {
s = get_shortcut(MBROWSER, &kbinput, &meta_key, &func_key);
if (!s)
continue;
f = sctofunc((sc *) s);
if (!f)
break;
#ifndef DISABLE_MOUSE
case KEY_MOUSE:
{
if (f->scfunc == (void *) do_mouse) {
int mouse_x, mouse_y;
/* We can click on the edit window to select a
......@@ -158,55 +164,45 @@ char *do_browser(char *path, DIR *dir)
if (old_selected == selected)
unget_kbinput(NANO_ENTER_KEY, FALSE, FALSE);
}
}
break;
} else
#endif /* !DISABLE_MOUSE */
/* Redraw the screen. */
case NANO_REFRESH_KEY:
if (f->scfunc == total_refresh) {
total_redraw();
break;
case NANO_HELP_KEY:
} else if (f->scfunc == do_help_void) {
#ifndef DISABLE_HELP
do_browser_help();
curs_set(0);
#else
nano_disabled_msg();
#endif
break;
/* Search for a filename. */
case NANO_WHEREIS_KEY:
} else if (f->scfunc == do_search) {
curs_set(1);
do_filesearch();
curs_set(0);
break;
/* Search for another filename. */
case NANO_WHEREIS_NEXT_KEY:
} else if (f->scfunc == (void *) whereis_next_msg) {
do_fileresearch();
break;
case NANO_PREVPAGE_KEY:
} else if (f->scfunc == do_page_up) {
if (selected >= (editwinrows + fileline % editwinrows) *
width)
selected -= (editwinrows + fileline % editwinrows) *
width;
else
selected = 0;
break;
case NANO_NEXTPAGE_KEY:
} else if (f->scfunc == do_page_down) {
selected += (editwinrows - fileline % editwinrows) *
width;
if (selected > filelist_len - 1)
selected = filelist_len - 1;
break;
case NANO_FIRSTFILE_METAKEY:
} else if (f->scfunc == (void *) first_file_msg) {
if (meta_key)
selected = 0;
break;
case NANO_LASTFILE_METAKEY:
} else if (f->scfunc == (void *) last_file_msg) {
if (meta_key)
selected = filelist_len - 1;
break;
/* Go to a specific directory. */
case NANO_GOTODIR_KEY:
} else if (f->scfunc == (void *) goto_dir_msg) {
curs_set(1);
i = do_prompt(TRUE,
......@@ -285,23 +281,19 @@ char *do_browser(char *path, DIR *dir)
free(path);
path = new_path;
goto change_browser_directory;
case NANO_PREVLINE_KEY:
} else if (f->scfunc == do_up_void) {
if (selected >= width)
selected -= width;
break;
case NANO_BACK_KEY:
} else if (f->scfunc == do_left) {
if (selected > 0)
selected--;
break;
case NANO_NEXTLINE_KEY:
} else if (f->scfunc == do_down_void) {
if (selected + width <= filelist_len - 1)
selected += width;
break;
case NANO_FORWARD_KEY:
} else if (f->scfunc == do_right) {
if (selected < filelist_len - 1)
selected++;
break;
case NANO_ENTER_KEY:
} else if (f->scfunc == do_enter) {
/* We can't move up from "/". */
if (strcmp(filelist[selected], "/..") == 0) {
statusbar(_("Can't move up a directory"));
......@@ -359,12 +351,10 @@ char *do_browser(char *path, DIR *dir)
/* Start over again with the new path value. */
goto change_browser_directory;
/* Abort the file browser. */
case NANO_EXIT_KEY:
} else if (f->scfunc == do_exit) {
abort = TRUE;
break;
}
}
titlebar(NULL);
edit_refresh();
curs_set(1);
......@@ -558,31 +548,31 @@ void parse_browser_input(int *kbinput, bool *meta_key, bool *func_key)
if (!*meta_key) {
switch (*kbinput) {
case ' ':
*kbinput = NANO_NEXTPAGE_KEY;
*kbinput = sc_seq_or(do_page_down, 0);
break;
case '-':
*kbinput = NANO_PREVPAGE_KEY;
*kbinput = sc_seq_or(do_page_up, 0);
break;
case '?':
*kbinput = NANO_HELP_KEY;
*kbinput = sc_seq_or(do_help_void, 0);
break;
/* Cancel is equivalent to Exit here. */
/* Cancel equivalent to Exit here. */
case NANO_CANCEL_KEY:
case 'E':
case 'e':
*kbinput = NANO_EXIT_KEY;
*kbinput = sc_seq_or(do_exit, 0);
break;
case 'G':
case 'g':
*kbinput = NANO_GOTODIR_KEY;
*kbinput = sc_seq_or((void *) goto_dir_msg, 0);
break;
case 'S':
case 's':
*kbinput = NANO_ENTER_KEY;
*kbinput = sc_seq_or(do_enter, 0);
break;
case 'W':
case 'w':
*kbinput = NANO_WHEREIS_KEY;
*kbinput = sc_seq_or(do_search, 0);
break;
}
}
......
This diff is collapsed.
......@@ -129,10 +129,10 @@ void do_help(void (*refresh_func)(void))
kbinput = get_kbinput(edit, &meta_key, &func_key);
parse_help_input(&kbinput, &meta_key, &func_key);
s = get_shortcut(MMAIN, &kbinput, &meta_key, &func_key);
s = get_shortcut(MHELP, &kbinput, &meta_key, &func_key);
if (!s)
continue;
f = sctofunc(s);
f = sctofunc((sc *) s);
if (!f)
continue;
......
......@@ -779,6 +779,7 @@ int strtomenu(char *input);
void assign_keyinfo(sc *s);
void xon_complaint(void);
void xoff_complaint(void);
int sc_seq_or (void *func, int defaultval);
const char *cancel_msg;
......@@ -789,6 +790,10 @@ const char *backwards_msg;
const char *replace_msg;
const char *no_replace_msg;
const char *go_to_line_msg;
const char *whereis_next_msg;
const char *first_file_msg;
const char *last_file_msg;
const char *goto_dir_msg;
#ifdef HAVE_REGEX_H
const char *regexp_msg;
......
......@@ -423,8 +423,7 @@ void parse_keybinding(char *ptr)
we found for the same menu, then make this new new
beginning */
for (s = sclist; s != NULL; s = s->next) {
if (((s->menu & newsc->menu) || newsc->menu == MALL) &&
(s->seq == newsc->seq)) {
if (((s->menu & newsc->menu)) && s->seq == newsc->seq) {
s->menu &= ~newsc->menu;
#ifdef DEBUG
fprintf(stderr, "replaced menu entry %d\n", s->menu);
......@@ -934,6 +933,8 @@ void parse_rcfile(FILE *rcstream
fclose(rcstream);
lineno = 0;
check_vitals_mapped();
if (errors) {
errors = FALSE;
fprintf(stderr,
......@@ -1020,4 +1021,30 @@ void do_rcfile(void)
#endif
}
/* Check whether the user has unmapped every shortcut for a
sequence we consider 'vital', like the exit function */
int check_vitals_mapped(void)
{
subnfunc *f;
int v;
#define VITALS 5
void *vitals[VITALS] = { do_exit, do_exit, (void *) cancel_msg, (void *) cancel_msg, (void *) cancel_msg };
int inmenus[VITALS] = { MMAIN, MHELP, MWHEREIS, MREPLACE, MGOTOLINE };
for (v = 0; v < VITALS; v++) {
for (f = allfuncs; f != NULL; f = f->next) {
if (f->scfunc == vitals[v] && f->menus & inmenus[v]) {
const sc *s = first_sc_for(inmenus[v], f->scfunc);
if (!s) {
rcfile_error(N_("Fatal error: no keys mapped for function \"%s\""),
f->desc);
fprintf(stderr, N_("Exiting. Please use nano with the -I option if needed to adjust your nanorc settings\n"));
exit(1);
}
break;
}
}
}
}
#endif /* ENABLE_NANORC */
......@@ -490,44 +490,36 @@ int parse_kbinput(WINDOW *win, bool *meta_key, bool *func_key)
if (retval != ERR) {
switch (retval) {
case NANO_CONTROL_8:
retval = ISSET(REBIND_DELETE) ? NANO_DELETE_KEY :
NANO_BACKSPACE_KEY;
retval = ISSET(REBIND_DELETE) ? sc_seq_or(do_delete, 0) :
sc_seq_or(do_backspace, 0);
break;
case KEY_DOWN:
#ifdef KEY_SDOWN
/* ncurses and Slang don't support KEY_SDOWN. */
case KEY_SDOWN:
#endif
s = first_sc_for(currmenu, (void *) do_down_void);
if (s)
retval = s->seq;
retval = sc_seq_or((void *) do_down_void, *kbinput);
break;
case KEY_UP:
#ifdef KEY_SUP
/* ncurses and Slang don't support KEY_SUP. */
case KEY_SUP:
#endif
s = first_sc_for(currmenu, (void *) do_up_void);
if (s)
retval = s->seq;
retval = sc_seq_or((void *) do_up_void, *kbinput);
break;
case KEY_LEFT:
#ifdef KEY_SLEFT
/* Slang doesn't support KEY_SLEFT. */
case KEY_SLEFT:
#endif
s = first_sc_for(currmenu, (void *) do_up_void);
if (s)
retval = s->seq;
retval = sc_seq_or((void *) do_left, *kbinput);
break;
case KEY_RIGHT:
#ifdef KEY_SRIGHT
/* Slang doesn't support KEY_SRIGHT. */
case KEY_SRIGHT:
#endif
s = first_sc_for(currmenu, (void *) do_right);
if (s)
retval = s->seq;
retval = sc_seq_or((void *) do_right, *kbinput);
break;
#ifdef KEY_HOME
/* HP-UX 10-11 doesn't support KEY_HOME. */
......@@ -539,14 +531,10 @@ int parse_kbinput(WINDOW *win, bool *meta_key, bool *func_key)
#endif
case KEY_A1: /* Home (7) on numeric keypad with
* NumLock off. */
s = first_sc_for(currmenu, (void *) do_home);
if (s)
retval = s->seq;
retval = sc_seq_or((void *) do_home, *kbinput);
break;
case KEY_BACKSPACE:
s = first_sc_for(currmenu, (void *) do_backspace);
if (s)
retval = s->seq;
retval = sc_seq_or((void *) do_backspace, *kbinput);
break;
case KEY_DC:
#ifdef KEY_SDC
......@@ -554,40 +542,29 @@ int parse_kbinput(WINDOW *win, bool *meta_key, bool *func_key)
case KEY_SDC:
#endif
if (ISSET(REBIND_DELETE))
s = first_sc_for(currmenu, (void *) do_delete);
retval = sc_seq_or((void *) do_delete, *kbinput);
else
s = first_sc_for(currmenu, (void *) do_backspace);
if (s)
retval = s->seq;
retval = sc_seq_or((void *) do_backspace, *kbinput);
break;
case KEY_IC:
#ifdef KEY_SIC
/* Slang doesn't support KEY_SIC. */
case KEY_SIC:
#endif
s = first_sc_for(currmenu, (void *) do_insertfile_void);
if (s)
retval = s->seq;
retval = sc_seq_or((void *) do_insertfile_void, *kbinput);
break;
case KEY_NPAGE:
case KEY_C3: /* PageDown (4) on numeric keypad with
* NumLock off. */
s = first_sc_for(currmenu, (void *) do_page_down);
if (s)
retval = s->seq;
retval = sc_seq_or((void *) do_page_down, *kbinput);
break;
case KEY_PPAGE:
case KEY_A3: /* PageUp (9) on numeric keypad with
* NumLock off. */
s = first_sc_for(currmenu, (void *) do_page_up);
if (s)
retval = s->seq;
retval = sc_seq_or((void *) do_page_up, *kbinput);
break;
case KEY_ENTER:
s = first_sc_for(currmenu, (void *) do_enter);
if (s)
retval = s->seq;
retval = sc_seq_or((void *) do_enter, *kbinput);
break;
case KEY_B2: /* Center (5) on numeric keypad with
* NumLock off. */
......@@ -603,9 +580,7 @@ int parse_kbinput(WINDOW *win, bool *meta_key, bool *func_key)
/* HP-UX 10-11 and Slang don't support KEY_SEND. */
case KEY_SEND:
#endif
s = first_sc_for(currmenu, (void *) do_end);
if (s)
retval = s->seq;
retval = sc_seq_or((void *) do_end, *kbinput);
break;
#ifdef KEY_BEG
/* Slang doesn't support KEY_BEG. */
......@@ -788,15 +763,15 @@ int get_escape_seq_kbinput(const int *seq, size_t seq_len)
retval = KEY_B2;
break;
case 'F': /* Esc O F == End on xterm/Terminal. */
retval = NANO_END_KEY;
retval = sc_seq_or(do_end, 0);
break;
case 'H': /* Esc O H == Home on xterm/Terminal. */
retval = NANO_HOME_KEY;
retval = sc_seq_or(do_home, 0);;
break;
case 'M': /* Esc O M == Enter on numeric keypad with
* NumLock off on VT100/VT220/VT320/xterm/
* rxvt/Eterm. */
retval = NANO_ENTER_KEY;
retval = sc_seq_or(do_home, 0);;
break;
case 'P': /* Esc O P == F1 on VT100/VT220/VT320/Mach
* console. */
......@@ -861,7 +836,7 @@ int get_escape_seq_kbinput(const int *seq, size_t seq_len)
case 'n': /* Esc O n == Delete (.) on numeric keypad
* with NumLock off on VT100/VT220/VT320/
* xterm/rxvt/Eterm/Terminal. */
retval = NANO_DELETE_KEY;
retval = sc_seq_or(do_delete, 0);;
break;
case 'o': /* Esc O o == '/' on numeric keypad with
* NumLock off on VT100/VT220/VT320/xterm/
......@@ -871,27 +846,27 @@ int get_escape_seq_kbinput(const int *seq, size_t seq_len)
case 'p': /* Esc O p == Insert (0) on numeric keypad
* with NumLock off on VT100/VT220/VT320/
* rxvt/Eterm/Terminal. */
retval = NANO_INSERTFILE_KEY;
retval = sc_seq_or(do_insertfile_void, 0);;
break;
case 'q': /* Esc O q == End (1) on numeric keypad
* with NumLock off on VT100/VT220/VT320/
* rxvt/Eterm/Terminal. */
retval = NANO_END_KEY;
retval = sc_seq_or(do_end, 0);;
break;
case 'r': /* Esc O r == Down (2) on numeric keypad
* with NumLock off on VT100/VT220/VT320/
* rxvt/Eterm/Terminal. */
retval = NANO_NEXTLINE_KEY;
retval = sc_seq_or(do_down_void, 0);;
break;
case 's': /* Esc O s == PageDown (3) on numeric
* keypad with NumLock off on VT100/VT220/
* VT320/rxvt/Eterm/Terminal. */
retval = NANO_NEXTPAGE_KEY;
retval = sc_seq_or(do_page_down, 0);;
break;
case 't': /* Esc O t == Left (4) on numeric keypad
* with NumLock off on VT100/VT220/VT320/
* rxvt/Eterm/Terminal. */
retval = NANO_BACK_KEY;
retval = sc_seq_or(do_left, 0);;
break;
case 'u': /* Esc O u == Center (5) on numeric keypad
* with NumLock off on VT100/VT220/VT320/
......@@ -901,22 +876,22 @@ int get_escape_seq_kbinput(const int *seq, size_t seq_len)
case 'v': /* Esc O v == Right (6) on numeric keypad
* with NumLock off on VT100/VT220/VT320/
* rxvt/Eterm/Terminal. */
retval = NANO_FORWARD_KEY;
retval = sc_seq_or(do_right, 0);
break;
case 'w': /* Esc O w == Home (7) on numeric keypad
* with NumLock off on VT100/VT220/VT320/
* rxvt/Eterm/Terminal. */
retval = NANO_HOME_KEY;
retval = sc_seq_or(do_home, 0);;
break;
case 'x': /* Esc O x == Up (8) on numeric keypad
* with NumLock off on VT100/VT220/VT320/
* rxvt/Eterm/Terminal. */
retval = NANO_PREVLINE_KEY;
retval = sc_seq_or(do_up_void, 0);;
break;
case 'y': /* Esc O y == PageUp (9) on numeric keypad
* with NumLock off on VT100/VT220/VT320/
* rxvt/Eterm/Terminal. */
retval = NANO_PREVPAGE_KEY;
retval = sc_seq_or(do_up, 0);;
break;
}
break;
......@@ -1010,7 +985,7 @@ int get_escape_seq_kbinput(const int *seq, size_t seq_len)
break;
default: /* Esc [ 1 ~ == Home on
* VT320/Linux console. */
retval = NANO_HOME_KEY;
retval = sc_seq_or(do_home, 0);;
break;
}
}
......@@ -1061,40 +1036,40 @@ int get_escape_seq_kbinput(const int *seq, size_t seq_len)
default: /* Esc [ 2 ~ == Insert on
* VT220/VT320/Linux console/
* xterm/Terminal. */
retval = NANO_INSERTFILE_KEY;
retval = sc_seq_or(do_insertfile_void, 0);;
break;
}
}
break;
case '3': /* Esc [ 3 ~ == Delete on VT220/VT320/
* Linux console/xterm/Terminal. */
retval = NANO_DELETE_KEY;
retval = sc_seq_or(do_delete, 0);;
break;
case '4': /* Esc [ 4 ~ == End on VT220/VT320/Linux
* console/xterm. */
retval = NANO_END_KEY;
retval = sc_seq_or(do_end, 0);;
break;
case '5': /* Esc [ 5 ~ == PageUp on VT220/VT320/
* Linux console/xterm/Terminal;
* Esc [ 5 ^ == PageUp on Eterm. */
retval = NANO_PREVPAGE_KEY;
retval = sc_seq_or(do_page_up, 0);;
break;
case '6': /* Esc [ 6 ~ == PageDown on VT220/VT320/
* Linux console/xterm/Terminal;
* Esc [ 6 ^ == PageDown on Eterm. */
retval = NANO_NEXTPAGE_KEY;
retval = sc_seq_or(do_page_down, 0);;
break;
case '7': /* Esc [ 7 ~ == Home on rxvt. */
retval = NANO_HOME_KEY;
retval = sc_seq_or(do_home, 0);
break;
case '8': /* Esc [ 8 ~ == End on rxvt. */
retval = NANO_END_KEY;
retval = sc_seq_or(do_end, 0);
break;
case '9': /* Esc [ 9 == Delete on Mach console. */
retval = NANO_DELETE_KEY;
retval = sc_seq_or(do_delete, 0);;
break;
case '@': /* Esc [ @ == Insert on Mach console. */
retval = NANO_INSERTFILE_KEY;
retval = sc_seq_or(do_insertfile_void, 0);;
break;
case 'A': /* Esc [ A == Up on ANSI/VT220/Linux
* console/FreeBSD console/Mach console/
......@@ -1117,23 +1092,23 @@ int get_escape_seq_kbinput(const int *seq, size_t seq_len)
break;
case 'F': /* Esc [ F == End on FreeBSD
* console/Eterm. */
retval = NANO_END_KEY;
retval = sc_seq_or(do_end, 0);
break;
case 'G': /* Esc [ G == PageDown on FreeBSD
* console. */
retval = NANO_NEXTPAGE_KEY;
retval = sc_seq_or(do_page_down, 0);
break;
case 'H': /* Esc [ H == Home on ANSI/VT220/FreeBSD
* console/Mach console/Eterm. */
retval = NANO_HOME_KEY;
retval = sc_seq_or(do_home, 0);
break;
case 'I': /* Esc [ I == PageUp on FreeBSD
* console. */
retval = NANO_PREVPAGE_KEY;
retval = sc_seq_or(do_page_up, 0);
break;
case 'L': /* Esc [ L == Insert on ANSI/FreeBSD
* console. */
retval = NANO_INSERTFILE_KEY;
retval = sc_seq_or(do_insertfile_void, 0);
break;
case 'M': /* Esc [ M == F1 on FreeBSD console. */
retval = KEY_F(1);
......@@ -1181,10 +1156,10 @@ int get_escape_seq_kbinput(const int *seq, size_t seq_len)
retval = KEY_F(8);
break;
case 'U': /* Esc [ U == PageDown on Mach console. */
retval = NANO_NEXTPAGE_KEY;
retval = sc_seq_or(do_page_down, 0);
break;
case 'V': /* Esc [ V == PageUp on Mach console. */
retval = NANO_PREVPAGE_KEY;
retval = sc_seq_or(do_page_up, 0);
break;
case 'W': /* Esc [ W == F11 on FreeBSD console. */
retval = KEY_F(11);
......@@ -1193,7 +1168,7 @@ int get_escape_seq_kbinput(const int *seq, size_t seq_len)
retval = KEY_F(12);
break;
case 'Y': /* Esc [ Y == End on Mach console. */
retval = NANO_END_KEY;
retval = sc_seq_or(do_end, 0);
break;
case 'Z': /* Esc [ Z == F14 on FreeBSD console. */
retval = KEY_F(14);
......@@ -1250,13 +1225,13 @@ int get_escape_seq_abcd(int kbinput)
{
switch (tolower(kbinput)) {
case 'a':
return NANO_PREVLINE_KEY;
return sc_seq_or(do_up_void, 0);;
case 'b':
return NANO_NEXTLINE_KEY;
return sc_seq_or(do_down_void, 0);;
case 'c':
return NANO_FORWARD_KEY;
return sc_seq_or(do_right, 0);;
case 'd':
return NANO_BACK_KEY;
return sc_seq_or(do_left, 0);;
default:
return ERR;
}
......@@ -1766,7 +1741,7 @@ int get_mouseinput(int *mouse_x, int *mouse_y, bool allow_shortcuts)
* wheel is equivalent to moving down three lines. */
for (i = 0; i < 3; i++)
unget_kbinput((mevent.bstate & BUTTON4_PRESSED) ?
NANO_PREVLINE_KEY : NANO_NEXTLINE_KEY, FALSE,
sc_seq_or(do_up_void, 0) : sc_seq_or(do_down_void, 0);, FALSE,
FALSE);
return 1;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment