- winio.c:do_yesno() - Fix mouse interaction bugs with yes/no prompt (David Benbennick)

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1404 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
master
Chris Allegretta 2003-01-28 01:23:40 +00:00
parent d26ab913f1
commit db28e96f2c
2 changed files with 49 additions and 73 deletions

View File

@ -60,6 +60,8 @@ CVS Code -
bottombars()
- Change strcpy of gettext() "Up" string to strncpy of max
width 8, to stop stupid strcpy crash.
do_yesno()
- Fix mouse interaction bugs with yes/no prompt (David Benbennick).
- nanorc.sample:
- Change comment to say magenta instead of purple.

120
winio.c
View File

@ -1237,14 +1237,11 @@ int statusq(int tabs, const shortcut *s, const char *def,
int do_yesno(int all, int leavecursor, const char *msg, ...)
{
va_list ap;
char foo[133];
int kbinput, ok = -1, i;
char *foo;
int ok = -2;
const char *yesstr; /* String of yes characters accepted */
const char *nostr; /* Same for no */
const char *allstr; /* And all, surprise! */
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
MEVENT mevent;
#endif
/* Yes, no and all are strings of any length. Each string consists of
all characters accepted as a valid character for that value.
@ -1253,112 +1250,89 @@ int do_yesno(int all, int leavecursor, const char *msg, ...)
nostr = _("Nn");
allstr = _("Aa");
/* Write the bottom of the screen */
blank_bottomwin();
/* Remove gettext call for keybindings until we clear the thing up */
if (!ISSET(NO_HELP)) {
char shortstr[3]; /* Temp string for Y, N, A */
wmove(bottomwin, 1, 0);
/* Write the bottom of the screen */
blank_bottombars();
sprintf(shortstr, " %c", yesstr[0]);
wmove(bottomwin, 1, 0);
onekey(shortstr, _("Yes"), 16);
if (all) {
wmove(bottomwin, 1, 16);
shortstr[1] = allstr[0];
onekey(shortstr, _("All"), 16);
}
wmove(bottomwin, 2, 0);
wmove(bottomwin, 2, 0);
shortstr[1] = nostr[0];
onekey(shortstr, _("No"), 16);
wmove(bottomwin, 2, 16);
onekey("^C", _("Cancel"), 16);
}
foo = charalloc(COLS);
va_start(ap, msg);
vsnprintf(foo, 132, msg, ap);
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);
wattroff(bottomwin, A_REVERSE);
wrefresh(bottomwin);
if (leavecursor == 1)
reset_cursor();
while (ok == -1) {
kbinput = wgetch(edit);
switch (kbinput) {
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
case KEY_MOUSE:
/* Look ma! We get to duplicate lots of code from do_mouse!! */
if (getmouse(&mevent) == ERR)
break;
if (!wenclose(bottomwin, mevent.y, mevent.x) || ISSET(NO_HELP))
break;
mevent.y -= editwinrows + 3;
if (mevent.y < 0)
break;
else {
/* Rather than a bunch of if statements, set up a matrix
of possible return keystrokes based on the x and y
values */
char yesnosquare[2][2];
yesnosquare[0][0] = yesstr[0];
if (all)
yesnosquare[0][1] = allstr[0];
else
yesnosquare[0][1] = '\0';
yesnosquare[1][0] = nostr[0];
yesnosquare[1][1] = NANO_CONTROL_C;
ungetch(yesnosquare[mevent.y][mevent.x / (COLS / 6)]);
}
break;
do {
int kbinput = wgetch(edit);
#ifndef DISABLE_MOUSE
MEVENT mevent;
#endif
case NANO_CONTROL_C:
ok = -2;
break;
default:
/* Look for the kbinput in the yes, no and (optimally) all str */
for (i = 0; yesstr[i] != 0 && yesstr[i] != kbinput; i++);
if (yesstr[i] != 0) {
ok = 1;
break;
}
if (kbinput == NANO_CONTROL_C)
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? */
for (i = 0; nostr[i] != 0 && nostr[i] != kbinput; i++);
if (nostr[i] != 0) {
ok = 0;
break;
}
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 (all) {
for (i = 0; allstr[i] != 0 && allstr[i] != kbinput; i++);
if (allstr[i] != 0) {
ok = 2;
break;
}
}
if (ok == 2 && !all)
ok = -2;
}
}
#endif
/* Look for the kbinput in the yes, no and (optionally) all str */
else 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);
/* Then blank the screen */
/* Then blank the statusbar. */
blank_statusbar_refresh();
if (ok == -2)
return -1;
else
return ok;
return ok;
}
int total_refresh(void)