convert ints to bools in the low-level input routines, and consolidate

the high-level input routines for the edit window


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1910 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
This commit is contained in:
David Lawrence Ramsey 2004-08-25 15:39:10 +00:00
parent 19420aac9d
commit a0b5ba2f7f
5 changed files with 304 additions and 245 deletions

View File

@ -1,9 +1,27 @@
CVS code - CVS code -
- General:
- Convert more ints that hold only TRUE and FALSE values to
bools. (DLR)
- Consolidate the code for finding a shortcut in a shortcut
list, the code for finding a toogle in a toggle list, and
the code for doing both of those and interpreting mouse clicks
in the edit window. Also move the code for do_mouse() to
get_edit_mouse() and tweak it to properly handle cases where a
shortcut isn't clicked. New functions get_shortcut(),
get_toggle(), get_edit_input(), and get_edit_mouse(); changes
to do_browser(), do_justify(), do_help(), and main(). (DLR)
- rcfile.c: - rcfile.c:
parse_rcfile() parse_rcfile()
- Add missing brackets around an if statement block so that - Add missing brackets around an if statement block so that
parsing the numeric argument after "tabsize" works properly parsing the numeric argument after "tabsize" works properly
again. (DLR, found by Mike Frysinger) again. (DLR, found by Mike Frysinger)
- winio.c:
get_mouseinput()
- Consolidate two if statements to increase efficiency. (DLR)
do_yesno()
- Don't bother assigning the value of get_mouseinput() to
anything. Since allow_shortcuts is FALSE, its return value
will always be FALSE. (DLR)
GNU nano 1.3.4 - 2004.08.17 GNU nano 1.3.4 - 2004.08.17
- General: - General:

View File

@ -2534,9 +2534,10 @@ char *do_browser(const char *inpath)
struct stat st; struct stat st;
char *foo, *retval = NULL; char *foo, *retval = NULL;
static char *path = NULL; static char *path = NULL;
int numents = 0, i = 0, j = 0, kbinput = ERR, meta_key, longest = 0; int numents = 0, i = 0, j = 0, longest = 0, abort = 0, col = 0;
int abort = 0, col = 0, selected = 0, editline = 0, width = 0; int selected = 0, editline = 0, width = 0, filecols = 0, lineno = 0;
int filecols = 0, lineno = 0; int kbinput = ERR;
bool meta_key;
char **filelist = (char **)NULL; char **filelist = (char **)NULL;
#ifndef DISABLE_MOUSE #ifndef DISABLE_MOUSE
MEVENT mevent; MEVENT mevent;
@ -2619,8 +2620,10 @@ char *do_browser(const char *inpath)
selected = numents - 1; selected = numents - 1;
else if (selectedbackup == selected) else if (selectedbackup == selected)
ungetch('s'); /* Unget the 'select' key */ ungetch('s'); /* Unget the 'select' key */
} else /* Must be clicking a shortcut */ } else { /* Must be clicking a shortcut */
do_mouse(); int mouse_x, mouse_y;
get_mouseinput(&mouse_x, &mouse_y, TRUE);
}
break; break;
#endif #endif

View File

@ -876,59 +876,6 @@ bool open_pipe(const char *command)
} }
#endif /* !NANO_SMALL */ #endif /* !NANO_SMALL */
#ifndef DISABLE_MOUSE
void do_mouse(void)
{
int mouse_x, mouse_y;
if (!get_mouseinput(&mouse_x, &mouse_y, TRUE)) {
/* Click in the edit window to move the cursor, but only when
we're not in a subfunction. */
if (wenclose(edit, mouse_y, mouse_x) && currshortcut == main_list) {
bool sameline;
/* Did they click on the line with the cursor? If they
clicked on the cursor, we set the mark. */
size_t xcur;
/* The character they clicked on. */
/* Subtract out size of topwin. Perhaps we need a constant
somewhere? */
mouse_y -= 2;
sameline = (mouse_y == current_y);
/* Move to where the click occurred. */
for (; current_y < mouse_y && current->next != NULL; current_y++)
current = current->next;
for (; current_y > mouse_y && current->prev != NULL; current_y--)
current = current->prev;
xcur = actual_x(current->data, get_page_start(xplustabs()) +
mouse_x);
#ifndef NANO_SMALL
/* Selecting where the cursor is toggles the mark, as does
selecting beyond the line length with the cursor at the
end of the line. */
if (sameline && xcur == current_x) {
if (ISSET(VIEW_MODE)) {
print_view_warning();
return;
}
do_mark();
}
#endif
current_x = xcur;
placewewant = xplustabs();
edit_refresh();
}
}
/* FIXME: If we clicked on a location in the statusbar, the cursor
should move to the location we clicked on. */
}
#endif
/* The user typed a character; add it to the edit buffer. */ /* The user typed a character; add it to the edit buffer. */
void do_char(char ch) void do_char(char ch)
{ {
@ -2360,7 +2307,7 @@ void do_justify(bool full_justify)
int mark_beginx_save = mark_beginx; int mark_beginx_save = mark_beginx;
#endif #endif
int kbinput; int kbinput;
int meta_key; bool meta_key;
/* If we're justifying the entire file, start at the beginning. */ /* If we're justifying the entire file, start at the beginning. */
if (full_justify) if (full_justify)
@ -2620,26 +2567,10 @@ void do_justify(bool full_justify)
/* Now get a keystroke and see if it's unjustify; if not, unget the /* Now get a keystroke and see if it's unjustify; if not, unget the
* keystroke and return. */ * keystroke and return. */
kbinput = get_kbinput(edit, &meta_key); kbinput = get_edit_input(&meta_key, FALSE);
#ifndef DISABLE_MOUSE if (!meta_key && kbinput == NANO_UNJUSTIFY_KEY) {
/* If it was a mouse click, parse it with do_mouse() and it might /* Restore the justify we just did (ungrateful user!). */
* become the unjustify key. Else give it back to the input
* stream. */
if (kbinput == KEY_MOUSE) {
do_mouse();
kbinput = get_kbinput(edit, &meta_key);
}
#endif
if (meta_key || (kbinput != NANO_UNJUSTIFY_KEY &&
kbinput != NANO_UNJUSTIFY_FKEY)) {
ungetch(kbinput);
if (meta_key)
ungetch(NANO_CONTROL_3);
placewewant = 0;
} else {
/* Else restore the justify we just did (ungrateful user!). */
filestruct *cutbottom = get_cutbottom(); filestruct *cutbottom = get_cutbottom();
current = current_save; current = current_save;
@ -2676,6 +2607,11 @@ void do_justify(bool full_justify)
if (!ISSET(MODIFIED)) if (!ISSET(MODIFIED))
titlebar(NULL); titlebar(NULL);
edit_refresh(); edit_refresh();
} else {
placewewant = 0;
ungetch(kbinput);
if (meta_key)
ungetch(NANO_CONTROL_3);
} }
cutbuffer = cutbuffer_save; cutbuffer = cutbuffer_save;
@ -3007,14 +2943,8 @@ int main(int argc, char **argv)
#ifndef DISABLE_WRAPJUSTIFY #ifndef DISABLE_WRAPJUSTIFY
bool fill_flag_used = FALSE; /* Was the fill option used? */ bool fill_flag_used = FALSE; /* Was the fill option used? */
#endif #endif
const shortcut *s;
bool keyhandled = FALSE; /* Have we handled the keystroke yet? */
int kbinput; /* Input from keyboard */ int kbinput; /* Input from keyboard */
int meta_key; bool meta_key;
#ifndef NANO_SMALL
const toggle *t;
#endif
#ifdef HAVE_GETOPT_LONG #ifdef HAVE_GETOPT_LONG
const struct option long_options[] = { const struct option long_options[] = {
{"help", 0, 0, 'h'}, {"help", 0, 0, 'h'},
@ -3510,8 +3440,6 @@ int main(int argc, char **argv)
edit_refresh(); edit_refresh();
while (TRUE) { while (TRUE) {
keyhandled = FALSE;
reset_cursor(); reset_cursor();
if (ISSET(CONSTUPDATE)) if (ISSET(CONSTUPDATE))
do_cursorpos(TRUE); do_cursorpos(TRUE);
@ -3520,115 +3448,16 @@ int main(int argc, char **argv)
currshortcut = main_list; currshortcut = main_list;
#endif #endif
kbinput = get_kbinput(edit, &meta_key); kbinput = get_edit_input(&meta_key, TRUE);
#ifdef DEBUG
fprintf(stderr, "AHA! %c (%d)\n", kbinput, kbinput);
#endif
if (meta_key) {
/* Check for the metaval and miscval defs... */
for (s =
#if !defined(DISABLE_BROWSER) || !defined (DISABLE_HELP) || !defined(DISABLE_MOUSE)
currshortcut
#else
main_list
#endif
; s != NULL && !keyhandled; s = s->next) {
if ((s->metaval != NANO_NO_KEY && kbinput == s->metaval) ||
(s->miscval != NANO_NO_KEY && kbinput == s->miscval)) {
if (ISSET(VIEW_MODE) && !s->viewok)
print_view_warning();
else {
if (s->func != do_cut_text)
cutbuffer_reset();
s->func();
}
keyhandled = TRUE;
}
#ifndef NANO_SMALL
if (!keyhandled) {
/* And for toggle switches */
for (t = toggles; t != NULL; t = t->next) {
if (kbinput == t->val) {
cutbuffer_reset();
do_toggle(t);
keyhandled = TRUE;
}
}
}
#endif
}
#ifdef DEBUG
fprintf(stderr, "I got Alt-%c! (%d)\n", kbinput, kbinput);
#endif
}
/* Look through the main shortcut list to see if we've hit a /* Last gasp, stuff that's not in the main lists. */
shortcut key or function key */ if (kbinput != ERR && !is_cntrl_char(kbinput)) {
/* Don't stop unhandled sequences, so that people with odd
if (!keyhandled) { * character sets can type. */
for (s =
#if !defined(DISABLE_BROWSER) || !defined (DISABLE_HELP) || !defined(DISABLE_MOUSE)
currshortcut
#else
main_list
#endif
; s != NULL && !keyhandled; s = s->next) {
if ((s->ctrlval != NANO_NO_KEY && kbinput == s->ctrlval) ||
(s->funcval != NANO_NO_KEY && kbinput == s->funcval)) {
if (ISSET(VIEW_MODE) && !s->viewok)
print_view_warning();
else {
if (s->func != do_cut_text)
cutbuffer_reset();
s->func();
}
keyhandled = TRUE;
}
}
}
if (!keyhandled)
cutbuffer_reset();
/* Don't even think about changing this string */
if (kbinput == NANO_XON_KEY)
statusbar(_("XON ignored, mumble mumble."));
if (kbinput == NANO_XOFF_KEY)
statusbar(_("XOFF ignored, mumble mumble."));
if (kbinput == NANO_XON_KEY || kbinput == NANO_XOFF_KEY)
keyhandled = TRUE;
/* Catch ^Z by hand when triggered also */
if (kbinput == NANO_SUSPEND_KEY) {
if (ISSET(SUSPEND))
do_suspend(0);
keyhandled = TRUE;
}
/* Last gasp, stuff that's not in the main lists */
if (!keyhandled) {
switch (kbinput) {
#ifndef DISABLE_MOUSE
case KEY_MOUSE:
do_mouse();
break;
#endif
case NANO_CONTROL_3: /* Ctrl-[ (Esc), which should
* have been handled before we
* got here */
case NANO_CONTROL_5: /* Ctrl-] */
break;
default:
#ifdef DEBUG
fprintf(stderr, "I got %c (%d)!\n", kbinput, kbinput);
#endif
/* We no longer stop unhandled sequences so that
people with odd character sets can type... */
if (ISSET(VIEW_MODE)) if (ISSET(VIEW_MODE))
print_view_warning(); print_view_warning();
else else
do_char((char)kbinput); do_char(kbinput);
}
} }
} }
assert(FALSE); assert(FALSE);

View File

@ -303,9 +303,6 @@ void nano_disabled_msg(void);
RETSIGTYPE cancel_fork(int signal); RETSIGTYPE cancel_fork(int signal);
bool open_pipe(const char *command); bool open_pipe(const char *command);
#endif #endif
#ifndef DISABLE_MOUSE
void do_mouse(void);
#endif
void do_char(char ch); void do_char(char ch);
void do_verbatim_input(void); void do_verbatim_input(void);
void do_backspace(void); void do_backspace(void);
@ -494,31 +491,40 @@ int check_wildcard_match(const char *text, const char *pattern);
#ifndef NANO_SMALL #ifndef NANO_SMALL
void reset_kbinput(void); void reset_kbinput(void);
#endif #endif
int get_kbinput(WINDOW *win, int *meta_key); int get_kbinput(WINDOW *win, bool *meta_key);
int get_translated_kbinput(int kbinput, int *es int get_translated_kbinput(int kbinput, bool *es
#ifndef NANO_SMALL #ifndef NANO_SMALL
, int reset , bool reset
#endif #endif
); );
int get_ascii_kbinput(int kbinput, size_t ascii_digits int get_ascii_kbinput(int kbinput, size_t ascii_digits
#ifndef NANO_SMALL #ifndef NANO_SMALL
, int reset , bool reset
#endif #endif
); );
int get_control_kbinput(int kbinput); int get_control_kbinput(int kbinput);
int get_escape_seq_kbinput(int *escape_seq, size_t es_len, int int get_escape_seq_kbinput(int *escape_seq, size_t es_len, bool
*ignore_seq); *ignore_seq);
int get_escape_seq_abcd(int kbinput); int get_escape_seq_abcd(int kbinput);
int *get_verbatim_kbinput(WINDOW *win, int *v_kbinput, size_t *v_len, int *get_verbatim_kbinput(WINDOW *win, int *v_kbinput, size_t *v_len,
int allow_ascii); bool allow_ascii);
int get_untranslated_kbinput(int kbinput, size_t position, int int get_untranslated_kbinput(int kbinput, size_t position, bool
allow_ascii allow_ascii
#ifndef NANO_SMALL #ifndef NANO_SMALL
, int reset , bool reset
#endif #endif
); );
#ifndef DISABLE_MOUSE #ifndef DISABLE_MOUSE
int get_mouseinput(int *mouse_x, int *mouse_y, int allow_shortcuts); bool get_mouseinput(int *mouse_x, int *mouse_y, bool allow_shortcuts);
#endif
const shortcut *get_shortcut(const shortcut *s_list, int kbinput, bool
*meta_key);
#ifndef NANO_SMALL
const toggle *get_toggle(int kbinput, bool meta_key);
#endif
int get_edit_input(bool *meta_key, bool allow_funcs);
#ifndef DISABLE_MOUSE
bool get_edit_mouse(void);
#endif #endif
size_t xplustabs(void); size_t xplustabs(void);
size_t actual_x(const char *str, size_t xplus); size_t actual_x(const char *str, size_t xplus);
@ -567,7 +573,7 @@ int statusq(int allowtabs, const shortcut *s, const char *def,
int do_yesno(int all, const char *msg); int do_yesno(int all, const char *msg);
void total_refresh(void); void total_refresh(void);
void display_main_list(void); void display_main_list(void);
void do_cursorpos(int constant); void do_cursorpos(bool constant);
void do_cursorpos_void(void); void do_cursorpos_void(void);
#ifndef DISABLE_HELP #ifndef DISABLE_HELP
int help_line_len(const char *ptr); int help_line_len(const char *ptr);

View File

@ -107,9 +107,10 @@ void reset_kbinput(void)
* editing keypad (Insert, Delete, Home, End, PageUp, and PageDown), the * editing keypad (Insert, Delete, Home, End, PageUp, and PageDown), the
* function keypad (F1-F14), and the numeric keypad with NumLock off. * function keypad (F1-F14), and the numeric keypad with NumLock off.
* Assume nodelay(win) is FALSE. */ * Assume nodelay(win) is FALSE. */
int get_kbinput(WINDOW *win, int *meta_key) int get_kbinput(WINDOW *win, bool *meta_key)
{ {
int kbinput, es, retval = ERR; int kbinput, retval = ERR;
bool es;
#ifndef NANO_SMALL #ifndef NANO_SMALL
allow_pending_sigwinch(TRUE); allow_pending_sigwinch(TRUE);
@ -155,7 +156,7 @@ int get_kbinput(WINDOW *win, int *meta_key)
* sequence into the corresponding key value, and save * sequence into the corresponding key value, and save
* that as the result. */ * that as the result. */
if (es_len > 1) { if (es_len > 1) {
int ignore_seq; bool ignore_seq;
*meta_key = FALSE; *meta_key = FALSE;
retval = get_escape_seq_kbinput(escape_seq, es_len, retval = get_escape_seq_kbinput(escape_seq, es_len,
@ -174,7 +175,7 @@ int get_kbinput(WINDOW *win, int *meta_key)
} }
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "get_kbinput(): kbinput = %d, meta_key = %d\n", kbinput, *meta_key); fprintf(stderr, "get_kbinput(): kbinput = %d, meta_key = %d\n", kbinput, (int)*meta_key);
#endif #endif
#ifndef NANO_SMALL #ifndef NANO_SMALL
@ -187,9 +188,9 @@ int get_kbinput(WINDOW *win, int *meta_key)
/* Translate acceptable ASCII, extended keypad values, and escape /* Translate acceptable ASCII, extended keypad values, and escape
* sequences into their corresponding key values. Set es to TRUE when * sequences into their corresponding key values. Set es to TRUE when
* we get an escape sequence. Assume nodelay(win) is FALSE. */ * we get an escape sequence. Assume nodelay(win) is FALSE. */
int get_translated_kbinput(int kbinput, int *es int get_translated_kbinput(int kbinput, bool *es
#ifndef NANO_SMALL #ifndef NANO_SMALL
, int reset , bool reset
#endif #endif
) )
{ {
@ -416,7 +417,7 @@ int get_translated_kbinput(int kbinput, int *es
} }
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "get_translated_kbinput(): kbinput = %d, es = %d, escapes = %d, ascii_digits = %lu, retval = %d\n", kbinput, *es, escapes, (unsigned long)ascii_digits, retval); fprintf(stderr, "get_translated_kbinput(): kbinput = %d, es = %d, escapes = %d, ascii_digits = %lu, retval = %d\n", kbinput, (int)*es, escapes, (unsigned long)ascii_digits, retval);
#endif #endif
/* Return the result. */ /* Return the result. */
@ -427,7 +428,7 @@ int get_translated_kbinput(int kbinput, int *es
* ASCII code from 000-255 into its corresponding ASCII character. */ * ASCII code from 000-255 into its corresponding ASCII character. */
int get_ascii_kbinput(int kbinput, size_t ascii_digits int get_ascii_kbinput(int kbinput, size_t ascii_digits
#ifndef NANO_SMALL #ifndef NANO_SMALL
, int reset , bool reset
#endif #endif
) )
{ {
@ -564,7 +565,7 @@ int get_control_kbinput(int kbinput)
* ERR and set ignore_seq to TRUE; if it's unrecognized, return ERR and * ERR and set ignore_seq to TRUE; if it's unrecognized, return ERR and
* set ignore_seq to FALSE. Assume that Escape has already been read * set ignore_seq to FALSE. Assume that Escape has already been read
* in. */ * in. */
int get_escape_seq_kbinput(int *escape_seq, size_t es_len, int int get_escape_seq_kbinput(int *escape_seq, size_t es_len, bool
*ignore_seq) *ignore_seq)
{ {
int retval = ERR; int retval = ERR;
@ -1042,7 +1043,7 @@ int get_escape_seq_kbinput(int *escape_seq, size_t es_len, int
} }
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "get_escape_seq_kbinput(): retval = %d, ignore_seq = %d\n", retval, *ignore_seq); fprintf(stderr, "get_escape_seq_kbinput(): retval = %d, ignore_seq = %d\n", retval, (int)*ignore_seq);
#endif #endif
return retval; return retval;
@ -1071,7 +1072,7 @@ int get_escape_seq_abcd(int kbinput)
* verbatim. Store the string in v_kbinput and return the length * verbatim. Store the string in v_kbinput and return the length
* of the string in v_len. Assume nodelay(win) is FALSE. */ * of the string in v_len. Assume nodelay(win) is FALSE. */
int *get_verbatim_kbinput(WINDOW *win, int *v_kbinput, size_t *v_len, int *get_verbatim_kbinput(WINDOW *win, int *v_kbinput, size_t *v_len,
int allow_ascii) bool allow_ascii)
{ {
int kbinput; int kbinput;
size_t i = 0, v_newlen = 0; size_t i = 0, v_newlen = 0;
@ -1178,10 +1179,10 @@ int *get_verbatim_kbinput(WINDOW *win, int *v_kbinput, size_t *v_len,
return v_kbinput; return v_kbinput;
} }
int get_untranslated_kbinput(int kbinput, size_t position, int int get_untranslated_kbinput(int kbinput, size_t position, bool
allow_ascii allow_ascii
#ifndef NANO_SMALL #ifndef NANO_SMALL
, int reset , bool reset
#endif #endif
) )
{ {
@ -1246,7 +1247,7 @@ int get_untranslated_kbinput(int kbinput, size_t position, int
* equivalent keystroke(s). Return FALSE if no keystrokes were * equivalent keystroke(s). Return FALSE if no keystrokes were
* ungetch()ed, or TRUE if at least one was. Assume that KEY_MOUSE has * ungetch()ed, or TRUE if at least one was. Assume that KEY_MOUSE has
* already been read in. */ * already been read in. */
int get_mouseinput(int *mouse_x, int *mouse_y, int allow_shortcuts) bool get_mouseinput(int *mouse_x, int *mouse_y, bool allow_shortcuts)
{ {
MEVENT mevent; MEVENT mevent;
@ -1261,15 +1262,12 @@ int get_mouseinput(int *mouse_x, int *mouse_y, int allow_shortcuts)
*mouse_x = mevent.x; *mouse_x = mevent.x;
*mouse_y = mevent.y; *mouse_y = mevent.y;
/* If we're not allowing shortcuts' we're done now. */ /* If we're allowing shortcuts, the current shortcut list is being
if (!allow_shortcuts) * displayed on the last two lines of the screen, and the mouse
return FALSE; * event took place inside it, we need to figure out which shortcut
* was clicked and ungetch() the equivalent keystroke(s) for it. */
/* Otherwise, if the current shortcut list is being displayed on the if (allow_shortcuts && !ISSET(NO_HELP) && wenclose(bottomwin,
* last two lines of the screen and the mouse event took place *mouse_y, *mouse_x)) {
* 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 i, j;
size_t currslen; size_t currslen;
/* The number of shortcuts in the current shortcut list. */ /* The number of shortcuts in the current shortcut list. */
@ -1298,10 +1296,10 @@ int get_mouseinput(int *mouse_x, int *mouse_y, int allow_shortcuts)
* list, or beyond the end of a shortcut on the right side of * list, or beyond the end of a shortcut on the right side of
* the screen, don't do anything. */ * the screen, don't do anything. */
if (j < 0 || (*mouse_x / i) >= currslen) if (j < 0 || (*mouse_x / i) >= currslen)
return 0; return FALSE;
j = (*mouse_x / i) * 2 + j; j = (*mouse_x / i) * 2 + j;
if (j >= currslen) if (j >= currslen)
return 0; return FALSE;
/* Go through the shortcut list to determine which shortcut was /* Go through the shortcut list to determine which shortcut was
* clicked. */ * clicked. */
@ -1323,8 +1321,207 @@ int get_mouseinput(int *mouse_x, int *mouse_y, int allow_shortcuts)
} }
return FALSE; return FALSE;
} }
#endif /* !DISABLE_MOUSE */
const shortcut *get_shortcut(const shortcut *s_list, int kbinput, bool
*meta_key)
{
const shortcut *s = s_list;
size_t slen = length_of_list(s_list);
/* Check for shortcuts. */
for (; slen > 0; slen--) {
/* We've found a shortcut if:
*
* 1. The key exists.
* 2. The key is a control key in the shortcut list.
* 3. The key is a function key in the shortcut list.
* 4. meta_key is TRUE and the key is a meta sequence.
* 5. meta_key is TRUE and the key is the other meta sequence in
* the shortcut list. */
if (kbinput != NANO_NO_KEY && ((*meta_key == FALSE &&
((kbinput == s->ctrlval || kbinput == s->funcval))) ||
(*meta_key == TRUE && (kbinput == s->metaval ||
kbinput == s->miscval)))) {
break;
}
s = s->next;
}
/* Translate the shortcut to either its control key or its meta key
* equivalent. Assume that the shortcut has an equivalent control
* key, meta key, or both. */
if (slen > 0) {
if (s->ctrlval != NANO_NO_KEY) {
*meta_key = FALSE;
kbinput = s->ctrlval;
} else if (s->metaval != NANO_NO_KEY) {
*meta_key = TRUE;
kbinput = s->metaval;
}
return s;
}
return NULL;
}
#ifndef NANO_SMALL
const toggle *get_toggle(int kbinput, bool meta_key)
{
const toggle *t = toggles;
/* Check for toggles. */
for (; t != NULL; t = t->next) {
/* We've found a toggle if meta_key is TRUE and the key is in
* the meta toggle list. */
if (meta_key && kbinput == t->val)
break;
}
return t;
}
#endif /* !NANO_SMALL */
int get_edit_input(bool *meta_key, bool allow_funcs)
{
bool keyhandled = FALSE;
int kbinput, retval;
const shortcut *s;
#ifndef NANO_SMALL
const toggle *t;
#endif #endif
kbinput = get_kbinput(edit, meta_key);
/* Universal shortcuts. These aren't in any shortcut lists, but we
* should handle them anyway. */
switch (kbinput) {
case NANO_XON_KEY:
statusbar(_("XON ignored, mumble mumble."));
return ERR;
case NANO_XOFF_KEY:
statusbar(_("XOFF ignored, mumble mumble."));
return ERR;
#ifndef NANO_SMALL
case NANO_SUSPEND_KEY:
if (ISSET(SUSPEND))
do_suspend(0);
return ERR;
#endif
#ifndef DISABLE_MOUSE
case KEY_MOUSE:
if (get_edit_mouse()) {
kbinput = get_kbinput(edit, meta_key);
break;
} else
return ERR;
#endif
}
/* Check for a shortcut in the main list. */
s = get_shortcut(main_list, kbinput, meta_key);
if (s != NULL) {
/* We got a shortcut. Run the shortcut's corresponding function
* if it has one. */
if (s->func != do_cut_text)
cutbuffer_reset();
if (s->func != NULL) {
if (allow_funcs)
s->func();
keyhandled = TRUE;
}
}
#ifndef NANO_SMALL
else {
/* If we didn't get a shortcut, check for a toggle. */
t = get_toggle(kbinput, *meta_key);
/* We got a toggle. Switch the value of the toggle's
* corresponding flag. */
if (t != NULL) {
cutbuffer_reset();
if (allow_funcs)
do_toggle(t);
keyhandled = TRUE;
}
}
#endif
/* If we got a shortcut with a corresponding function or a toggle,
* reset meta_key and retval. If we didn't, keep the value of
* meta_key and return the key we got in retval. */
if (allow_funcs && keyhandled) {
*meta_key = FALSE;
retval = ERR;
} else {
cutbuffer_reset();
retval = kbinput;
}
return retval;
}
#ifndef DISABLE_MOUSE
bool get_edit_mouse(void)
{
int mouse_x, mouse_y;
bool retval;
retval = get_mouseinput(&mouse_x, &mouse_y, TRUE);
if (!retval) {
/* We can click in the edit window to move the cursor. */
if (wenclose(edit, mouse_y, mouse_x)) {
bool sameline;
/* Did they click on the line with the cursor? If they
* clicked on the cursor, we set the mark. */
size_t xcur;
/* The character they clicked on. */
/* Subtract out the size of topwin. Perhaps we need a
* constant somewhere? */
mouse_y -= 2;
sameline = (mouse_y == current_y);
/* Move to where the click occurred. */
for (; current_y < mouse_y && current->next != NULL; current_y++)
current = current->next;
for (; current_y > mouse_y && current->prev != NULL; current_y--)
current = current->prev;
xcur = actual_x(current->data, get_page_start(xplustabs()) +
mouse_x);
#ifndef NANO_SMALL
/* Clicking where the cursor is toggles the mark, as does
* clicking beyond the line length with the cursor at the
* end of the line. */
if (sameline && xcur == current_x) {
if (ISSET(VIEW_MODE)) {
print_view_warning();
return retval;
}
do_mark();
}
#endif
current_x = xcur;
placewewant = xplustabs();
edit_refresh();
}
}
/* FIXME: If we clicked on a location in the statusbar, the cursor
* should move to the location we clicked on. This functionality
* should be in get_statusbar_mouse() when it's written. */
return retval;
}
#endif /* !DISABLE_MOUSE */
/* Return the placewewant associated with current_x. That is, xplustabs /* Return the placewewant associated with current_x. That is, xplustabs
* is the zero-based column position of the cursor. Value is no smaller * is the zero-based column position of the cursor. Value is no smaller
* than current_x. */ * than current_x. */
@ -1541,7 +1738,7 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
) )
{ {
int kbinput; int kbinput;
int meta_key; bool meta_key;
static int x = -1; static int x = -1;
/* the cursor position in 'answer' */ /* the cursor position in 'answer' */
int xend; int xend;
@ -1635,7 +1832,10 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
switch (kbinput) { switch (kbinput) {
#ifndef DISABLE_MOUSE #ifndef DISABLE_MOUSE
case KEY_MOUSE: case KEY_MOUSE:
do_mouse(); {
int mouse_x, mouse_y;
get_mouseinput(&mouse_x, &mouse_y, TRUE);
}
break; break;
#endif #endif
case NANO_HOME_KEY: case NANO_HOME_KEY:
@ -2872,7 +3072,7 @@ int do_yesno(int all, const char *msg)
do { do {
int kbinput; int kbinput;
int meta_key; bool meta_key;
#ifndef DISABLE_MOUSE #ifndef DISABLE_MOUSE
int mouse_x, mouse_y; int mouse_x, mouse_y;
#endif #endif
@ -2883,14 +3083,13 @@ int do_yesno(int all, const char *msg)
ok = -1; ok = -1;
#ifndef DISABLE_MOUSE #ifndef DISABLE_MOUSE
/* Look ma! We get to duplicate lots of code from /* Look ma! We get to duplicate lots of code from
* do_mouse()!! */ * get_edit_mouse()!! */
else if (kbinput == KEY_MOUSE) { else if (kbinput == KEY_MOUSE) {
kbinput = get_mouseinput(&mouse_x, &mouse_y, FALSE); get_mouseinput(&mouse_x, &mouse_y, FALSE);
if (mouse_x != -1 && mouse_y != -1 && !ISSET(NO_HELP) && if (mouse_x != -1 && mouse_y != -1 && !ISSET(NO_HELP) &&
wenclose(bottomwin, mouse_y, mouse_x) && mouse_x < wenclose(bottomwin, mouse_y, mouse_x) && mouse_x <
(width * 2) && mouse_y >= editwinrows + 3) { (width * 2) && mouse_y >= editwinrows + 3) {
int x = mouse_x / width; int x = mouse_x / width;
/* Did we click in the first column of shortcuts, or /* Did we click in the first column of shortcuts, or
* the second? */ * the second? */
@ -2949,7 +3148,7 @@ void display_main_list(void)
* If constant is TRUE and DISABLE_CURPOS is set, we unset it and update * If constant is TRUE and DISABLE_CURPOS is set, we unset it and update
* old_i and old_totsize. That way, we leave the current statusbar * old_i and old_totsize. That way, we leave the current statusbar
* alone, but next time we will display. */ * alone, but next time we will display. */
void do_cursorpos(int constant) void do_cursorpos(bool constant)
{ {
const filestruct *fileptr; const filestruct *fileptr;
unsigned long i = 0; unsigned long i = 0;
@ -3038,12 +3237,13 @@ void do_help(void)
int line = 0; int line = 0;
/* The line number in help_text of the first displayed help line. /* The line number in help_text of the first displayed help line.
* This variable is zero-based. */ * This variable is zero-based. */
int no_more = 0; bool no_more = FALSE;
/* no_more means the end of the help text is shown, so don't go /* no_more means the end of the help text is shown, so don't go
* down any more. */ * down any more. */
int kbinput = ERR, meta_key; int kbinput = ERR;
bool meta_key;
int old_no_help = ISSET(NO_HELP); bool old_no_help = ISSET(NO_HELP);
#ifndef DISABLE_MOUSE #ifndef DISABLE_MOUSE
const shortcut *oldshortcut = currshortcut; const shortcut *oldshortcut = currshortcut;
/* We will set currshortcut to allow clicking on the help /* We will set currshortcut to allow clicking on the help
@ -3082,7 +3282,10 @@ void do_help(void)
switch (kbinput) { switch (kbinput) {
#ifndef DISABLE_MOUSE #ifndef DISABLE_MOUSE
case KEY_MOUSE: case KEY_MOUSE:
do_mouse(); {
int mouse_x, mouse_y;
get_mouseinput(&mouse_x, &mouse_y, TRUE);
}
break; break;
#endif #endif
case NANO_NEXTPAGE_KEY: case NANO_NEXTPAGE_KEY: