]> git.wh0rd.org Git - nano.git/commitdiff
actually use statusbar_pww in the statusbar prompt code to cut down on
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Mon, 7 Nov 2005 21:45:44 +0000 (21:45 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Mon, 7 Nov 2005 21:45:44 +0000 (21:45 +0000)
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

ChangeLog
src/browser.c
src/files.c
src/nano.c
src/prompt.c
src/proto.h
src/search.c
src/text.c

index 8f7d69225dd6ca36fdeef84c9ea80eebe8d6b4b4..7ccd9613932b4e25f2910c3195a6a587c61a613c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
index 0fce1a59705085f37d031b09542e68e87b14c5bf..df997194bff12d0a9a583b86682be039cd68e378 100644 (file)
@@ -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
index 65d0b7bde145b3bc4d840908502ae02de7ac95e5..09f665b259355cdcc73f4bc3af79635554761e6a 100644 (file)
@@ -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;
index 80245d8b75d9afbe9ed1c15e230aa7fd1651c772..d430b2fffbcb6d56356df614cba402342962c82d 100644 (file)
@@ -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
index a293e4fb526de3f51b0b41b5a735a03e4cf9b791..c50c729e6f38e439a739b8128679baf32ff16ed2 100644 (file)
@@ -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. */
index 2b2b20ab511dd0844fecec002941e24c3481915e..7a4ff7db44d37100afd891895f1cd08d9bb859e5 100644 (file)
@@ -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
index a772b76a577a53c9e70ecae2eef94229b01c89c0..aa77f741b0739d0665512d54b4fdb6ccec7bed5b 100644 (file)
@@ -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
index 41c61994a8f11eeaccf8a00792fc8a5006ac3a76..642ce1e1bd9c57ab5cdcba7612881e7135ea102a 100644 (file)
@@ -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