1
1

actually use statusbar_pww in the statusbar prompt code to cut down on

redundant updates, add related functions to do that, and rename a few of
the statusbar prompt functions for consistency


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@3099 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
Этот коммит содержится в:
David Lawrence Ramsey 2005-11-07 21:45:44 +00:00
родитель af3314c376
Коммит e19449ec50
8 изменённых файлов: 117 добавлений и 59 удалений

Просмотреть файл

@ -61,13 +61,18 @@ CVS code -
do_browser(), and do_browse_from() (all moved to browser.c).
(DLR)
- Add the statusbar prompt's equivalent of placewewant,
statusbar_pww, to prompt.c, and convert (most of) its
functions to use it. Changes to do_statusbar_mouse(),
do_statusbar_output(), do_statusbar_home(),
do_statusbar_end(), do_statusbar_right(), do_statusbar_left(),
do_statusbar_delete(), do_statusbar_cut_text(),
do_statusbar_next_word(), do_statusbar_prev_word(),
do_statusbar_verbatim_input(), and nanogetstr(). (DLR)
statusbar_pww, to prompt.c, and convert its functions to use
it. New functions reset_statusbar_cursor() and
need_statusbar_horizontal_update(); changes to
do_statusbar_mouse(), do_statusbar_output(),
do_statusbar_home(), do_statusbar_end(), do_statusbar_right(),
do_statusbar_left(), do_statusbar_delete(),
do_statusbar_cut_text(), do_statusbar_next_word(),
do_statusbar_prev_word(), do_statusbar_verbatim_input(),
nanoget_repaint() (renamed update_statusbar_line()),
nanogetstr() (renamed get_prompt_string()), statusq() (renamed
do_prompt()), statusq_abort() (renamed do_prompt_abort()), and
do_yesno() (renamed do_yesno_prompt()). (DLR)
- files.c:
read_file()
- Remove apparently unneeded logic to handle a case where

Просмотреть файл

@ -246,7 +246,7 @@ char *do_browser(char *path, DIR *dir)
case 'g':
curs_set(1);
j = statusq(FALSE, gotodir_list, "",
j = do_prompt(FALSE, gotodir_list, "",
#ifndef NANO_SMALL
NULL,
#endif

Просмотреть файл

@ -670,7 +670,7 @@ void do_insertfile(
}
#endif
i = statusq(TRUE,
i = do_prompt(TRUE,
#ifndef NANO_SMALL
execute ? extcmd_list :
#endif
@ -730,7 +730,7 @@ void do_insertfile(
/* We have a file now. Indicate this and get out of the
* statusbar prompt cleanly. */
i = 0;
statusq_abort();
do_prompt_abort();
}
#endif
@ -1699,7 +1699,7 @@ int do_writeout(bool exiting)
/* If we're using restricted mode, the filename isn't blank,
* and we're at the "Write File" prompt, disable tab
* completion. */
i = statusq(!ISSET(RESTRICTED) ||
i = do_prompt(!ISSET(RESTRICTED) ||
openfile->filename[0] == '\0', writefile_list, ans,
#ifndef NANO_SMALL
NULL, "%s%s%s", _(msg), formatstr, backupstr
@ -1729,7 +1729,7 @@ int do_writeout(bool exiting)
/* We have a file now. Get out of the statusbar prompt
* cleanly. */
statusq_abort();
do_prompt_abort();
} else
#endif /* !DISABLE_BROWSER */
#ifndef NANO_SMALL
@ -1772,7 +1772,8 @@ int do_writeout(bool exiting)
struct stat st;
if (!stat(answer, &st)) {
i = do_yesno(FALSE, _("File exists, OVERWRITE ? "));
i = do_yesno_prompt(FALSE,
_("File exists, OVERWRITE ? "));
if (i == 0 || i == -1)
continue;
/* If we're using restricted mode, we aren't allowed to
@ -1786,7 +1787,7 @@ int do_writeout(bool exiting)
&& (exiting || !openfile->mark_set)
#endif
) {
i = do_yesno(FALSE,
i = do_yesno_prompt(FALSE,
_("Save file under DIFFERENT NAME ? "));
if (i == 0 || i == -1)
continue;

Просмотреть файл

@ -905,11 +905,12 @@ void do_exit(void)
int i;
if (!openfile->modified)
i = 0; /* Pretend the user chose not to save. */
/* Pretend the user chose not to save. */
i = 0;
else if (ISSET(TEMP_FILE))
i = 1;
else
i = do_yesno(FALSE,
i = do_yesno_prompt(FALSE,
_("Save modified buffer (ANSWERING \"No\" WILL DESTROY CHANGES) ? "));
#ifdef DEBUG

Просмотреть файл

@ -253,12 +253,16 @@ bool do_statusbar_mouse(void)
/* Move to where the click occurred. */
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();
/*nanoget_repaint(answer, statusbar_x);*/
if (need_statusbar_horizontal_update(pww_save))
update_statusbar_line(answer, statusbar_x);
}
}
}
@ -328,11 +332,13 @@ void do_statusbar_output(char *output, size_t output_len, bool
statusbar_pww = statusbar_xplustabs();
/*nanoget_repaint(answer, statusbar_x);*/
update_statusbar_line(answer, statusbar_x);
}
void do_statusbar_home(void)
{
size_t pww_save = statusbar_pww;
#ifndef NANO_SMALL
if (ISSET(SMART_HOME)) {
size_t statusbar_x_save = statusbar_x;
@ -352,34 +358,44 @@ void do_statusbar_home(void)
}
#endif
/*nanoget_repaint(answer, statusbar_x);*/
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();
/*nanoget_repaint(answer, statusbar_x);*/
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();
/*nanoget_repaint(answer, statusbar_x);*/
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();
/*nanoget_repaint(answer, statusbar_x);*/
if (need_statusbar_horizontal_update(pww_save))
update_statusbar_line(answer, statusbar_x);
}
}
@ -407,6 +423,8 @@ void do_statusbar_delete(void)
char_buf_len + 1);
null_at(&answer, statusbar_x + line_len - char_buf_len);
update_statusbar_line(answer, statusbar_x);
}
}
@ -427,7 +445,7 @@ void do_statusbar_cut_text(void)
}
#endif
/*nanoget_repaint(answer, statusbar_x);*/
update_statusbar_line(answer, statusbar_x);
}
#ifndef NANO_SMALL
@ -436,6 +454,7 @@ void do_statusbar_cut_text(void)
* on a word, and FALSE otherwise. */
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;
@ -488,7 +507,8 @@ bool do_statusbar_next_word(bool allow_punct)
statusbar_pww = statusbar_xplustabs();
/*nanoget_repaint(answer, statusbar_x);*/
if (need_statusbar_horizontal_update(pww_save))
update_statusbar_line(answer, statusbar_x);
/* Return whether we started on a word. */
return started_on_word;
@ -499,6 +519,7 @@ bool do_statusbar_next_word(bool allow_punct)
* on a word, and FALSE otherwise. */
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;
@ -581,7 +602,8 @@ bool do_statusbar_prev_word(bool allow_punct)
statusbar_pww = statusbar_xplustabs();
/*nanoget_repaint(answer, statusbar_x);*/
if (need_statusbar_horizontal_update(pww_save))
update_statusbar_line(answer, statusbar_x);
/* Return whether we started on a word. */
return started_on_word;
@ -634,18 +656,20 @@ size_t get_statusbar_page_start(size_t start_col, size_t column)
start_col - 1);
}
/* Repaint the statusbar when getting a character in nanogetstr(). Note
* that we must turn on A_REVERSE here, since do_help() turns it off! */
void nanoget_repaint(const char *buf, size_t x)
/* Repaint the statusbar when getting a character in
* get_prompt_string(). The statusbar text line will be displayed
* starting with curranswer[index]. Assume the A_REVERSE attribute is
* turned off. */
void update_statusbar_line(const char *curranswer, size_t index)
{
size_t start_col, xpt, page_start;
size_t start_col, page_start;
char *expanded;
assert(prompt != NULL && x <= strlen(buf));
assert(prompt != NULL && index <= strlen(buf));
start_col = strlenpt(prompt) + 1;
xpt = strnlenpt(buf, x);
page_start = get_statusbar_page_start(start_col, start_col + xpt);
index = strnlenpt(curranswer, index);
page_start = get_statusbar_page_start(start_col, start_col + index);
wattron(bottomwin, A_REVERSE);
@ -655,19 +679,40 @@ void nanoget_repaint(const char *buf, size_t x)
waddch(bottomwin, ':');
waddch(bottomwin, (page_start == 0) ? ' ' : '$');
expanded = display_string(buf, page_start, COLS - start_col - 1,
FALSE);
expanded = display_string(curranswer, page_start, COLS - start_col -
1, FALSE);
waddstr(bottomwin, expanded);
free(expanded);
wmove(bottomwin, 0, start_col + xpt + 1 - page_start);
reset_statusbar_cursor();
wattroff(bottomwin, A_REVERSE);
}
/* Get the input from the keyboard. This should only be called from
* statusq(). */
int nanogetstr(bool allow_tabs, const char *curranswer,
/* Put the cursor in the statusbar prompt at statusbar_x. */
void reset_statusbar_cursor(void)
{
size_t start_col = strlenpt(prompt) + 1;
size_t page_start = get_statusbar_page_start(start_col,
start_col + statusbar_x);
wmove(bottomwin, 0, start_col + statusbar_x + 1 - page_start);
}
/* Return TRUE if we need an update after moving horizontally, and FALSE
* otherwise. We need one if old_pww and statusbar_pww are on different
* pages. */
bool need_statusbar_horizontal_update(size_t old_pww)
{
size_t start_col = strlenpt(prompt) + 1;
return get_statusbar_page_start(start_col, start_col + old_pww) !=
get_statusbar_page_start(start_col, start_col + statusbar_pww);
}
/* Get a string of input at the statusbar prompt. This should only be
* called from do_prompt(). */
int get_prompt_string(bool allow_tabs, const char *curranswer,
#ifndef NANO_SMALL
filestruct **history_list,
#endif
@ -715,7 +760,7 @@ int nanogetstr(bool allow_tabs, const char *curranswer,
currshortcut = s;
nanoget_repaint(answer, statusbar_x);
update_statusbar_line(answer, statusbar_x);
/* Refresh the edit window and the statusbar before getting
* input. */
@ -824,8 +869,7 @@ int nanogetstr(bool allow_tabs, const char *curranswer,
last_kbinput = kbinput;
#endif
nanoget_repaint(answer, statusbar_x);
wnoutrefresh(bottomwin);
reset_statusbar_cursor();
}
#ifndef NANO_SMALL
@ -850,15 +894,16 @@ int nanogetstr(bool allow_tabs, const char *curranswer,
return kbinput;
}
/* Ask a question on the statusbar. The prompt will be stored in
* the static prompt, which should be NULL initially, and the answer
* will be stored in the answer global. Returns -1 on aborted enter, -2
* on a blank string, and 0 otherwise, the valid shortcut key caught.
/* Ask a question on the statusbar. The prompt will be stored in the
* static prompt, which should be NULL initially, and the answer will be
* stored in the answer global. Returns -1 on aborted enter, -2 on a
* blank string, and 0 otherwise, the valid shortcut key caught.
* curranswer is any editable text that we want to put up by default.
*
* The allow_tabs parameter indicates whether we should allow tabs to be
* interpreted. */
int statusq(bool allow_tabs, const shortcut *s, const char *curranswer,
int do_prompt(bool allow_tabs, const shortcut *s, const char
*curranswer,
#ifndef NANO_SMALL
filestruct **history_list,
#endif
@ -884,7 +929,7 @@ int statusq(bool allow_tabs, const shortcut *s, const char *curranswer,
va_end(ap);
null_at(&prompt, actual_x(prompt, COLS - 4));
retval = nanogetstr(allow_tabs, curranswer,
retval = get_prompt_string(allow_tabs, curranswer,
#ifndef NANO_SMALL
history_list,
#endif
@ -928,7 +973,10 @@ int statusq(bool allow_tabs, const shortcut *s, const char *curranswer,
return retval;
}
void statusq_abort(void)
/* This function forces a reset of the statusbar cursor position. It
* should only be called after do_prompt(), and is only needed if the
* user leaves the prompt via something other than Enter or Cancel. */
void do_prompt_abort(void)
{
reset_statusbar_x = TRUE;
}
@ -936,7 +984,7 @@ void statusq_abort(void)
/* Ask a simple Yes/No (and optionally All) question, specified in msg,
* on the statusbar. Return 1 for Yes, 0 for No, 2 for All (if all is
* TRUE when passed in), and -1 for Cancel. */
int do_yesno(bool all, const char *msg)
int do_yesno_prompt(bool all, const char *msg)
{
int ok = -2, width = 16;
const char *yesstr; /* String of Yes characters accepted. */

Просмотреть файл

@ -440,8 +440,10 @@ bool do_statusbar_prev_word(bool allow_punct);
void do_statusbar_verbatim_input(bool *got_enter);
size_t statusbar_xplustabs(void);
size_t get_statusbar_page_start(size_t start_col, size_t column);
void nanoget_repaint(const char *buf, size_t x);
int nanogetstr(bool allow_tabs, const char *curranswer,
void update_statusbar_line(const char *curranswer, size_t index);
void reset_statusbar_cursor(void);
bool need_statusbar_horizontal_update(size_t old_pww);
int get_prompt_string(bool allow_tabs, const char *curranswer,
#ifndef NANO_SMALL
filestruct **history_list,
#endif
@ -450,13 +452,14 @@ int nanogetstr(bool allow_tabs, const char *curranswer,
, bool *list
#endif
);
int statusq(bool allow_tabs, const shortcut *s, const char *curranswer,
int do_prompt(bool allow_tabs, const shortcut *s, const char
*curranswer,
#ifndef NANO_SMALL
filestruct **history_list,
#endif
const char *msg, ...);
void statusq_abort(void);
int do_yesno(bool all, const char *msg);
void do_prompt_abort(void);
int do_yesno_prompt(bool all, const char *msg);
/* Public functions in rcfile.c. */
#ifdef ENABLE_NANORC

Просмотреть файл

@ -161,7 +161,7 @@ int search_init(bool replacing, bool use_answer)
buf = mallocstrcpy(NULL, "");
/* This is now one simple call. It just does a lot. */
i = statusq(FALSE, replacing ? replace_list : whereis_list,
i = do_prompt(FALSE, replacing ? replace_list : whereis_list,
backupstring,
#ifndef NANO_SMALL
&search_history,
@ -734,7 +734,7 @@ ssize_t do_replace_loop(const char *needle, const filestruct
do_replace_highlight(TRUE, exp_word);
i = do_yesno(TRUE, _("Replace this instance?"));
i = do_yesno_prompt(TRUE, _("Replace this instance?"));
do_replace_highlight(FALSE, exp_word);
@ -892,7 +892,7 @@ void do_replace(void)
last_replace = mallocstrcpy(last_replace, "");
i = statusq(FALSE, replace_list_2, last_replace,
i = do_prompt(FALSE, replace_list_2, last_replace,
#ifndef NANO_SMALL
&replace_history,
#endif
@ -953,7 +953,7 @@ void do_gotolinecolumn(ssize_t line, ssize_t column, bool use_answer,
char *ans = mallocstrcpy(NULL, answer);
/* Ask for it. */
int i = statusq(FALSE, gotoline_list, use_answer ? ans : "",
int i = do_prompt(FALSE, gotoline_list, use_answer ? ans : "",
#ifndef NANO_SMALL
NULL,
#endif

Просмотреть файл

@ -1564,7 +1564,7 @@ bool do_int_spell_fix(const char *word)
do_replace_highlight(TRUE, exp_word);
/* Allow all instances of the word to be corrected. */
canceled = (statusq(FALSE, spell_list, word,
canceled = (do_prompt(FALSE, spell_list, word,
#ifndef NANO_SMALL
NULL,
#endif