#include "proto.h"
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
static char *prompt = NULL;
static size_t statusbar_x = (size_t)-1;
static size_t statusbar_pww = (size_t)-1;
static size_t old_statusbar_x = (size_t)-1;
static size_t old_pww = (size_t)-1;
static bool reset_statusbar_x = FALSE;
int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
bool *ran_func, bool *finished, bool allow_funcs, void
(*refresh_func)(void))
{
int input;
static int *kbinput = NULL;
static size_t kbinput_len = 0;
const shortcut *s;
bool have_shortcut;
*s_or_t = FALSE;
*ran_func = FALSE;
*finished = FALSE;
input = get_kbinput(bottomwin, meta_key, func_key);
#ifndef DISABLE_MOUSE
if (allow_funcs) {
if (*func_key && input == KEY_MOUSE) {
if (do_statusbar_mouse())
input = get_kbinput(bottomwin, meta_key, func_key);
else {
*meta_key = FALSE;
*func_key = FALSE;
input = ERR;
}
}
}
#endif
s = get_shortcut(currshortcut, &input, meta_key, func_key);
have_shortcut = (s != NULL || input == NANO_TAB_KEY || input ==
NANO_ENTER_KEY || input == NANO_REFRESH_KEY || input ==
NANO_HOME_KEY || input == NANO_END_KEY || input ==
NANO_BACK_KEY || input == NANO_FORWARD_KEY || input ==
NANO_BACKSPACE_KEY || input == NANO_DELETE_KEY || input ==
NANO_CUT_KEY ||
#ifndef NANO_TINY
input == NANO_NEXTWORD_KEY ||
#endif
(*meta_key && (
#ifndef NANO_TINY
input == NANO_PREVWORD_KEY || input == NANO_BRACKET_KEY ||
#endif
input == NANO_VERBATIM_KEY)));
*s_or_t = have_shortcut;
if (!*s_or_t) {
if (is_ascii_cntrl_char(input) || *meta_key || *func_key) {
beep();
*meta_key = FALSE;
*func_key = FALSE;
input = ERR;
}
}
if (allow_funcs) {
if (input != ERR && !*s_or_t) {
if (!ISSET(RESTRICTED) || openfile->filename[0] == '\0' ||
currshortcut != writefile_list) {
kbinput_len++;
kbinput = (int *)nrealloc(kbinput, kbinput_len *
sizeof(int));
kbinput[kbinput_len - 1] = input;
}
}
if (*s_or_t || get_key_buffer_len() == 0) {
if (kbinput != NULL) {
char *output = charalloc(kbinput_len + 1);
size_t i;
bool got_enter;
for (i = 0; i < kbinput_len; i++)
output[i] = (char)kbinput[i];
output[i] = '\0';
do_statusbar_output(output, kbinput_len, &got_enter,
FALSE);
free(output);
kbinput_len = 0;
free(kbinput);
kbinput = NULL;
}
}
if (have_shortcut) {
switch (input) {
case NANO_TAB_KEY:
case NANO_ENTER_KEY:
break;
case NANO_REFRESH_KEY:
total_statusbar_refresh(refresh_func);
break;
case NANO_CUT_KEY:
if (!ISSET(RESTRICTED) || openfile->filename[0] ==
'\0' || currshortcut != writefile_list)
do_statusbar_cut_text();
break;
case NANO_FORWARD_KEY:
do_statusbar_right();
break;
case NANO_BACK_KEY:
do_statusbar_left();
break;
#ifndef NANO_TINY
case NANO_NEXTWORD_KEY:
do_statusbar_next_word(FALSE);
break;
case NANO_PREVWORD_KEY:
if (*meta_key)
do_statusbar_prev_word(FALSE);
break;
#endif
case NANO_HOME_KEY:
do_statusbar_home();
break;
case NANO_END_KEY:
do_statusbar_end();
break;
#ifndef NANO_TINY
case NANO_BRACKET_KEY:
if (*meta_key)
do_statusbar_find_bracket();
break;
#endif
case NANO_VERBATIM_KEY:
if (*meta_key) {
if (!ISSET(RESTRICTED) ||
openfile->filename[0] == '\0' ||
currshortcut != writefile_list) {
bool got_enter;
do_statusbar_verbatim_input(&got_enter);
if (got_enter) {
get_input(NULL, 1);
input = NANO_ENTER_KEY;
*finished = TRUE;
}
}
}
break;
case NANO_DELETE_KEY:
if (!ISSET(RESTRICTED) || openfile->filename[0] ==
'\0' || currshortcut != writefile_list)
do_statusbar_delete();
break;
case NANO_BACKSPACE_KEY:
if (!ISSET(RESTRICTED) || openfile->filename[0] ==
'\0' || currshortcut != writefile_list)
do_statusbar_backspace();
break;
default:
if (s->func != NULL) {
*ran_func = TRUE;
if (!ISSET(VIEW_MODE) || s->viewok)
s->func();
}
*finished = TRUE;
}
}
}
return input;
}
#ifndef DISABLE_MOUSE
bool do_statusbar_mouse(void)
{
int mouse_x, mouse_y;
bool retval = get_mouseinput(&mouse_x, &mouse_y, TRUE);
if (!retval) {
if (wenclose(bottomwin, mouse_y, mouse_x)) {
size_t start_col;
assert(prompt != NULL);
start_col = strlenpt(prompt) + 1;
mouse_y -= (2 - no_more_space()) + editwinrows;
if (mouse_x > start_col && mouse_y == 0) {
size_t pww_save = statusbar_pww;
statusbar_x = actual_x(answer,
get_statusbar_page_start(start_col, start_col +
statusbar_xplustabs()) + mouse_x - start_col -
1);
statusbar_pww = statusbar_xplustabs();
if (need_statusbar_horizontal_update(pww_save))
update_statusbar_line(answer, statusbar_x);
}
}
}
return retval;
}
#endif
void do_statusbar_output(char *output, size_t output_len, bool
*got_enter, bool allow_cntrls)
{
size_t answer_len, i = 0;
char *char_buf = charalloc(mb_cur_max());
int char_buf_len;
assert(answer != NULL);
answer_len = strlen(answer);
*got_enter = FALSE;
while (i < output_len) {
if (allow_cntrls) {
if (output[i] == '\0')
output[i] = '\n';
else if (output[i] == '\n') {
*got_enter = TRUE;
unparse_kbinput(output + i, output_len - i);
return;
}
}
char_buf_len = parse_mbchar(output + i, char_buf, NULL);
i += char_buf_len;
if (!allow_cntrls && is_ascii_cntrl_char(*(output + i -
char_buf_len)))
continue;
answer = charealloc(answer, answer_len + (char_buf_len * 2));
assert(statusbar_x <= answer_len);
charmove(answer + statusbar_x + char_buf_len,
answer + statusbar_x, answer_len - statusbar_x +
char_buf_len);
strncpy(answer + statusbar_x, char_buf, char_buf_len);
answer_len += char_buf_len;
statusbar_x += char_buf_len;
}
free(char_buf);
statusbar_pww = statusbar_xplustabs();
update_statusbar_line(answer, statusbar_x);
}
void do_statusbar_home(void)
{
size_t pww_save = statusbar_pww;
#ifndef NANO_TINY
if (ISSET(SMART_HOME)) {
size_t statusbar_x_save = statusbar_x;
statusbar_x = indent_length(answer);
if (statusbar_x == statusbar_x_save ||
statusbar_x == strlen(answer))
statusbar_x = 0;
statusbar_pww = statusbar_xplustabs();
} else {
#endif
statusbar_x = 0;
statusbar_pww = statusbar_xplustabs();
#ifndef NANO_TINY
}
#endif
if (need_statusbar_horizontal_update(pww_save))
update_statusbar_line(answer, statusbar_x);
}
void do_statusbar_end(void)
{
size_t pww_save = statusbar_pww;
statusbar_x = strlen(answer);
statusbar_pww = statusbar_xplustabs();
if (need_statusbar_horizontal_update(pww_save))
update_statusbar_line(answer, statusbar_x);
}
void do_statusbar_left(void)
{
if (statusbar_x > 0) {
size_t pww_save = statusbar_pww;
statusbar_x = move_mbleft(answer, statusbar_x);
statusbar_pww = statusbar_xplustabs();
if (need_statusbar_horizontal_update(pww_save))
update_statusbar_line(answer, statusbar_x);
}
}
void do_statusbar_right(void)
{
if (statusbar_x < strlen(answer)) {
size_t pww_save = statusbar_pww;
statusbar_x = move_mbright(answer, statusbar_x);
statusbar_pww = statusbar_xplustabs();
if (need_statusbar_horizontal_update(pww_save))
update_statusbar_line(answer, statusbar_x);
}
}
void do_statusbar_backspace(void)
{
if (statusbar_x > 0) {
do_statusbar_left();
do_statusbar_delete();
}
}
void do_statusbar_delete(void)
{
statusbar_pww = statusbar_xplustabs();
if (answer[statusbar_x] != '\0') {
int char_buf_len = parse_mbchar(answer + statusbar_x, NULL,
NULL);
size_t line_len = strlen(answer + statusbar_x);
assert(statusbar_x < strlen(answer));
charmove(answer + statusbar_x, answer + statusbar_x +
char_buf_len, strlen(answer) - statusbar_x -
char_buf_len + 1);
null_at(&answer, statusbar_x + line_len - char_buf_len);
update_statusbar_line(answer, statusbar_x);
}
}
void do_statusbar_cut_text(void)
{
assert(answer != NULL);
#ifndef NANO_TINY
if (ISSET(CUT_TO_END))
null_at(&answer, statusbar_x);
else {
#endif
null_at(&answer, 0);
statusbar_x = 0;
statusbar_pww = statusbar_xplustabs();
#ifndef NANO_TINY
}
#endif
update_statusbar_line(answer, statusbar_x);
}
#ifndef NANO_TINY
bool do_statusbar_next_word(bool allow_punct)
{
size_t pww_save = statusbar_pww;
char *char_mb;
int char_mb_len;
bool end_line = FALSE, started_on_word = FALSE;
assert(answer != NULL);
char_mb = charalloc(mb_cur_max());
while (!end_line) {
char_mb_len = parse_mbchar(answer + statusbar_x, char_mb, NULL);
if (!is_word_mbchar(char_mb, allow_punct))
break;
started_on_word = TRUE;
if (answer[statusbar_x] == '\0')
end_line = TRUE;
else
statusbar_x += char_mb_len;
}
if (answer[statusbar_x] == '\0')
end_line = TRUE;
else
statusbar_x += char_mb_len;
while (!end_line) {
char_mb_len = parse_mbchar(answer + statusbar_x, char_mb, NULL);
if (is_word_mbchar(char_mb, allow_punct))
break;
if (answer[statusbar_x] == '\0')
end_line = TRUE;
else
statusbar_x += char_mb_len;
}
free(char_mb);
statusbar_pww = statusbar_xplustabs();
if (need_statusbar_horizontal_update(pww_save))
update_statusbar_line(answer, statusbar_x);
return started_on_word;
}
bool do_statusbar_prev_word(bool allow_punct)
{
size_t pww_save = statusbar_pww;
char *char_mb;
int char_mb_len;
bool begin_line = FALSE, started_on_word = FALSE;
assert(answer != NULL);
char_mb = charalloc(mb_cur_max());
while (!begin_line) {
char_mb_len = parse_mbchar(answer + statusbar_x, char_mb, NULL);
if (!is_word_mbchar(char_mb, allow_punct))
break;
started_on_word = TRUE;
if (statusbar_x == 0)
begin_line = TRUE;
else
statusbar_x = move_mbleft(answer, statusbar_x);
}
if (statusbar_x == 0)
begin_line = TRUE;
else
statusbar_x = move_mbleft(answer, statusbar_x);
while (!begin_line) {
char_mb_len = parse_mbchar(answer + statusbar_x, char_mb, NULL);
if (is_word_mbchar(char_mb, allow_punct))
break;
if (statusbar_x == 0)
begin_line = TRUE;
else
statusbar_x = move_mbleft(answer, statusbar_x);
}
if (!begin_line) {
if (statusbar_x == 0)
begin_line = TRUE;
else
statusbar_x = move_mbleft(answer, statusbar_x);
while (!begin_line) {
char_mb_len = parse_mbchar(answer + statusbar_x, char_mb,
NULL);
if (!is_word_mbchar(char_mb, allow_punct))
break;
if (statusbar_x == 0)
begin_line = TRUE;
else
statusbar_x = move_mbleft(answer, statusbar_x);
}
if (!begin_line)
statusbar_x += char_mb_len;
}
free(char_mb);
statusbar_pww = statusbar_xplustabs();
if (need_statusbar_horizontal_update(pww_save))
update_statusbar_line(answer, statusbar_x);
return started_on_word;
}
#endif
void do_statusbar_verbatim_input(bool *got_enter)
{
int *kbinput;
size_t kbinput_len, i;
char *output;
*got_enter = FALSE;
kbinput = get_verbatim_kbinput(bottomwin, &kbinput_len);
output = charalloc(kbinput_len + 1);
for (i = 0; i < kbinput_len; i++)
output[i] = (char)kbinput[i];
output[i] = '\0';
do_statusbar_output(output, kbinput_len, got_enter, TRUE);
free(output);
}
#ifndef NANO_TINY
bool find_statusbar_bracket_match(bool reverse, const char
*bracket_set)
{
const char *rev_start = NULL, *found = NULL;
assert(mbstrlen(bracket_set) == 2);
rev_start = reverse ? answer + (statusbar_x - 1) : answer +
(statusbar_x + 1);
while (TRUE) {
found = ((rev_start > answer && *(rev_start - 1) == '\0') ||
rev_start < answer) ? NULL : (reverse ?
mbrevstrpbrk(answer, bracket_set, rev_start) :
mbstrpbrk(rev_start, bracket_set));
if (found != NULL)
break;
return FALSE;
}
statusbar_x = found - answer;
statusbar_pww = statusbar_xplustabs();
return TRUE;
}
void do_statusbar_find_bracket(void)
{
size_t statusbar_x_save, pww_save;
const char *ch;
int ch_len;
const char *wanted_ch;
int wanted_ch_len;
char *bracket_set;
size_t i;
size_t matchhalf;
size_t mbmatchhalf;
size_t count = 1;
bool reverse;
char *found_ch;
assert(mbstrlen(matchbrackets) % 2 == 0);
ch = answer + statusbar_x;
if (ch == '\0' || (ch = mbstrchr(matchbrackets, ch)) == NULL)
return;
statusbar_x_save = statusbar_x;
pww_save = statusbar_pww;
matchhalf = 0;
mbmatchhalf = mbstrlen(matchbrackets) / 2;
for (i = 0; i < mbmatchhalf; i++)
matchhalf += parse_mbchar(matchbrackets + matchhalf, NULL,
NULL);
reverse = ((ch - matchbrackets) >= matchhalf);
wanted_ch = ch;
while (mbmatchhalf > 0) {
if (reverse)
wanted_ch = matchbrackets + move_mbleft(matchbrackets,
wanted_ch - matchbrackets);
else
wanted_ch += move_mbright(wanted_ch, 0);
mbmatchhalf--;
}
ch_len = parse_mbchar(ch, NULL, NULL);
wanted_ch_len = parse_mbchar(wanted_ch, NULL, NULL);
bracket_set = charalloc((mb_cur_max() * 2) + 1);
strncpy(bracket_set, ch, ch_len);
strncpy(bracket_set + ch_len, wanted_ch, wanted_ch_len);
null_at(&bracket_set, ch_len + wanted_ch_len);
found_ch = charalloc(mb_cur_max() + 1);
while (TRUE) {
if (find_statusbar_bracket_match(reverse, bracket_set)) {
parse_mbchar(answer + statusbar_x, found_ch, NULL);
count += (strncmp(found_ch, ch, ch_len) == 0) ? 1 : -1;
if (count == 0) {
if (need_statusbar_horizontal_update(pww_save))
update_statusbar_line(answer, statusbar_x);
break;
}
} else {
statusbar_x = statusbar_x_save;
statusbar_pww = pww_save;
break;
}
}
free(bracket_set);
free(found_ch);
}
#endif
size_t statusbar_xplustabs(void)
{
return strnlenpt(answer, statusbar_x);
}
size_t get_statusbar_page_start(size_t start_col, size_t column)
{
if (column == start_col || column < COLS - 1)
return 0;
else
return column - start_col - (column - start_col) % (COLS -
start_col - 1);
}
void reset_statusbar_cursor(void)
{
size_t start_col = strlenpt(prompt) + 1;
size_t xpt = statusbar_xplustabs();
wmove(bottomwin, 0, start_col + 1 + xpt -
get_statusbar_page_start(start_col, start_col + xpt));
}
void update_statusbar_line(const char *curranswer, size_t index)
{
size_t start_col, page_start;
char *expanded;
assert(prompt != NULL && index <= strlen(curranswer));
start_col = strlenpt(prompt) + 1;
index = strnlenpt(curranswer, index);
page_start = get_statusbar_page_start(start_col, start_col + index);
wattron(bottomwin, reverse_attr);
blank_statusbar();
mvwaddnstr(bottomwin, 0, 0, prompt, actual_x(prompt, COLS - 2));
waddch(bottomwin, ':');
waddch(bottomwin, (page_start == 0) ? ' ' : '$');
expanded = display_string(curranswer, page_start, COLS - start_col -
1, FALSE);
waddstr(bottomwin, expanded);
free(expanded);
reset_statusbar_cursor();
wattroff(bottomwin, reverse_attr);
wnoutrefresh(bottomwin);
}
bool need_statusbar_horizontal_update(size_t pww_save)
{
size_t start_col = strlenpt(prompt) + 1;
return get_statusbar_page_start(start_col, start_col + pww_save) !=
get_statusbar_page_start(start_col, start_col + statusbar_pww);
}
void total_statusbar_refresh(void (*refresh_func)(void))
{
total_redraw();
refresh_func();
}
int get_prompt_string(bool allow_tabs,
#ifndef DISABLE_TABCOMP
bool allow_files,
#endif
const char *curranswer,
#ifndef NANO_TINY
filestruct **history_list,
#endif
void (*refresh_func)(void), const shortcut *s
#ifndef DISABLE_TABCOMP
, bool *list
#endif
)
{
int kbinput = ERR;
bool meta_key, func_key, s_or_t, ran_func, finished;
size_t curranswer_len;
#ifndef DISABLE_TABCOMP
bool tabbed = FALSE;
#endif
#ifndef NANO_TINY
char *history = NULL;
char *magichistory = NULL;
#ifndef DISABLE_TABCOMP
int last_kbinput = ERR;
size_t complete_len = 0;
#endif
#endif
answer = mallocstrcpy(answer, curranswer);
curranswer_len = strlen(answer);
if (reset_statusbar_x) {
statusbar_x = old_statusbar_x;
statusbar_pww = old_pww;
}
if (statusbar_x == (size_t)-1 || statusbar_x > curranswer_len) {
statusbar_x = curranswer_len;
statusbar_pww = statusbar_xplustabs();
}
currshortcut = s;
update_statusbar_line(answer, statusbar_x);
wnoutrefresh(edit);
wnoutrefresh(bottomwin);
while ((kbinput = do_statusbar_input(&meta_key, &func_key, &s_or_t,
&ran_func, &finished, TRUE, refresh_func)) != NANO_CANCEL_KEY &&
kbinput != NANO_ENTER_KEY) {
assert(statusbar_x <= strlen(answer));
#ifndef DISABLE_TABCOMP
if (kbinput != NANO_TAB_KEY)
tabbed = FALSE;
#endif
switch (kbinput) {
#ifndef DISABLE_TABCOMP
#ifndef NANO_TINY
case NANO_TAB_KEY:
if (history_list != NULL) {
if (last_kbinput != NANO_TAB_KEY)
complete_len = strlen(answer);
if (complete_len > 0) {
answer = mallocstrcpy(answer,
get_history_completion(history_list,
answer, complete_len));
statusbar_x = strlen(answer);
}
} else
#endif
if (allow_tabs)
answer = input_tab(answer, allow_files,
&statusbar_x, &tabbed, refresh_func, list);
update_statusbar_line(answer, statusbar_x);
break;
#endif
#ifndef NANO_TINY
case NANO_PREVLINE_KEY:
if (history_list != NULL) {
if ((*history_list)->next == NULL &&
answer[0] != '\0')
magichistory = mallocstrcpy(magichistory,
answer);
if ((history =
get_history_older(history_list)) != NULL) {
answer = mallocstrcpy(answer, history);
statusbar_x = strlen(answer);
}
update_statusbar_line(answer, statusbar_x);
finished = FALSE;
}
break;
case NANO_NEXTLINE_KEY:
if (history_list != NULL) {
if ((history =
get_history_newer(history_list)) != NULL) {
answer = mallocstrcpy(answer, history);
statusbar_x = strlen(answer);
}
if ((*history_list)->next == NULL &&
answer[0] == '\0' && magichistory != NULL) {
answer = mallocstrcpy(answer, magichistory);
statusbar_x = strlen(answer);
}
update_statusbar_line(answer, statusbar_x);
finished = FALSE;
}
break;
#endif
case NANO_HELP_KEY:
update_statusbar_line(answer, statusbar_x);
finished = FALSE;
break;
}
if (finished)
break;
#if !defined(NANO_TINY) && !defined(DISABLE_TABCOMP)
last_kbinput = kbinput;
#endif
reset_statusbar_cursor();
}
#ifndef NANO_TINY
if (history_list != NULL) {
history_reset(*history_list);
if (magichistory != NULL)
free(magichistory);
}
#endif
if (kbinput == NANO_CANCEL_KEY || kbinput == NANO_ENTER_KEY ||
ran_func) {
statusbar_x = old_statusbar_x;
statusbar_pww = old_pww;
if (!ran_func)
reset_statusbar_x = TRUE;
} else
reset_statusbar_x = FALSE;
return kbinput;
}
int do_prompt(bool allow_tabs,
#ifndef DISABLE_TABCOMP
bool allow_files,
#endif
const shortcut *s, const char *curranswer,
#ifndef NANO_TINY
filestruct **history_list,
#endif
void (*refresh_func)(void), const char *msg, ...)
{
va_list ap;
int retval;
#ifndef DISABLE_TABCOMP
bool list = FALSE;
#endif
if (prompt != NULL)
free(prompt);
prompt = charalloc(((COLS - 4) * mb_cur_max()) + 1);
bottombars(s);
va_start(ap, msg);
vsnprintf(prompt, (COLS - 4) * mb_cur_max(), msg, ap);
va_end(ap);
null_at(&prompt, actual_x(prompt, COLS - 4));
retval = get_prompt_string(allow_tabs,
#ifndef DISABLE_TABCOMP
allow_files,
#endif
curranswer,
#ifndef NANO_TINY
history_list,
#endif
refresh_func, s
#ifndef DISABLE_TABCOMP
, &list
#endif
);
free(prompt);
prompt = NULL;
old_statusbar_x = statusbar_x;
old_pww = statusbar_pww;
switch (retval) {
case NANO_CANCEL_KEY:
retval = -1;
break;
case NANO_ENTER_KEY:
retval = (answer[0] == '\0') ? -2 : 0;
break;
}
blank_statusbar();
wnoutrefresh(bottomwin);
#ifdef DEBUG
fprintf(stderr, "answer = \"%s\"\n", answer);
#endif
#ifndef DISABLE_TABCOMP
if (list)
refresh_func();
#endif
return retval;
}
void do_prompt_abort(void)
{
old_statusbar_x = (size_t)-1;
old_pww = (size_t)-1;
reset_statusbar_x = TRUE;
}
int do_yesno_prompt(bool all, const char *msg)
{
int ok = -2, width = 16;
const char *yesstr;
const char *nostr;
const char *allstr;
assert(msg != NULL);
yesstr = _("Yy");
nostr = _("Nn");
allstr = _("Aa");
if (!ISSET(NO_HELP)) {
char shortstr[3];
if (COLS < 32)
width = COLS / 2;
blank_bottombars();
sprintf(shortstr, " %c", yesstr[0]);
wmove(bottomwin, 1, 0);
onekey(shortstr, _("Yes"), width);
if (all) {
wmove(bottomwin, 1, width);
shortstr[1] = allstr[0];
onekey(shortstr, _("All"), width);
}
wmove(bottomwin, 2, 0);
shortstr[1] = nostr[0];
onekey(shortstr, _("No"), width);
wmove(bottomwin, 2, 16);
onekey("^C", _("Cancel"), width);
}
wattron(bottomwin, reverse_attr);
blank_statusbar();
mvwaddnstr(bottomwin, 0, 0, msg, actual_x(msg, COLS - 1));
wattroff(bottomwin, reverse_attr);
wnoutrefresh(edit);
wnoutrefresh(bottomwin);
do {
int kbinput;
bool meta_key, func_key;
#ifndef DISABLE_MOUSE
int mouse_x, mouse_y;
#endif
kbinput = get_kbinput(bottomwin, &meta_key, &func_key);
switch (kbinput) {
case NANO_CANCEL_KEY:
ok = -1;
break;
#ifndef DISABLE_MOUSE
case KEY_MOUSE:
get_mouseinput(&mouse_x, &mouse_y, FALSE);
if (wenclose(bottomwin, mouse_y, mouse_x) &&
!ISSET(NO_HELP) && mouse_x < (width * 2) &&
mouse_y - (2 - no_more_space()) -
editwinrows - 1 >= 0) {
int x = mouse_x / width;
int y = mouse_y - (2 - no_more_space()) -
editwinrows - 1;
assert(0 <= x && x <= 1 && 0 <= y && y <= 1);
ok = -2 * x * y + x - y + 1;
if (ok == 2 && !all)
ok = -2;
}
break;
#endif
case NANO_REFRESH_KEY:
total_redraw();
continue;
default:
if (strchr(yesstr, kbinput) != NULL)
ok = 1;
else if (strchr(nostr, kbinput) != NULL)
ok = 0;
else if (all && strchr(allstr, kbinput) != NULL)
ok = 2;
}
} while (ok == -2);
return ok;
}