]> git.wh0rd.org Git - nano.git/commitdiff
at long last, properly handle mouse clicks on the statusbar prompt text
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Thu, 27 Oct 2005 04:51:41 +0000 (04:51 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Thu, 27 Oct 2005 04:51:41 +0000 (04:51 +0000)
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@3053 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
src/global.c
src/proto.h
src/winio.c

index a05ff095d54bdf9541690f272f5125c31e2431e9..a4b08ea1bbf8a8bec00e1406b4851c34b4e42fc2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,6 +5,10 @@ CVS code -
          is disabled when NANO_SMALL is defined.  New functions
          do_scroll_up() and do_scroll_down(); changes to
          shortcut_init(). (DLR, suggested by Mike Frysinger)
+       - Properly handle mouse clicks on the statusbar prompt text.
+         New function get_statusbar_page_start(); changes to
+         do_statusbar_mouse(), nanoget_repaint(), nanogetstr(), and
+         statusq(). (DLR)
        - Since the statusbar prompt code needs at least 4 columns in
          order to work properly, make that the minimum number of
          columns nano requires to run, and remove assertions and code
@@ -13,11 +17,6 @@ CVS code -
          get_page_start(). (DLR)
 - nano.h:
        - Readd MIN_EDITOR_COLS #define. (DLR)
-- winio.c:
-  nanoget_repaint()
-       - Move the code to determine the statusbar equivalent of
-         get_page_start() into the new function
-         get_statusbar_page_start(). (DLR)
 
 GNU nano 1.3.9 - 2005.10.23
 - General:
index fbd02ed012ece463b0871f591fd8844a9bf752c8..3326e5685887d149d49c92e0ceef39e2804e8ce6 100644 (file)
@@ -85,7 +85,10 @@ size_t quotelen;             /* strlen(quotestr) */
 char *backup_dir = NULL;       /* Backup directory. */
 #endif
 
-char *answer = NULL;           /* Answer str to many questions */
+char *prompt = NULL;           /* Answer string for statusbar
+                                * questions. */
+char *answer = NULL;           /* Answer string for statusbar
+                                * questions. */
 
 ssize_t tabsize = -1;          /* Our internal tabsize variable.  The
                                   default value is set in main(). */
index 01cb4ffdc5dda23819f01f30a341eb67abf31e05..b8370dc9931ecce6ad7af91d744f66774a39f32f 100644 (file)
@@ -58,7 +58,7 @@ extern char *backup_dir;
 #endif
 
 extern WINDOW *topwin, *edit, *bottomwin;
-extern char *answer;
+extern char *prompt, *answer;
 #ifndef DISABLE_HELP
 extern char *help_text;
 #endif
@@ -646,8 +646,8 @@ void blank_bottombars(void);
 void check_statusblank(void);
 char *display_string(const char *buf, size_t start_col, size_t len, bool
        dollars);
-void nanoget_repaint(const char *buf, const char *inputbuf, size_t x);
-int nanogetstr(bool allow_tabs, const char *buf, const char *curranswer,
+void nanoget_repaint(const char *inputbuf, size_t x);
+int nanogetstr(bool allow_tabs, const char *curranswer,
 #ifndef NANO_SMALL
        filestruct **history_list,
 #endif
index ba37ec2b34ec9c72d2a9a38dc6ec23013b6d7368..e395c008e56b6b68a32265624b4b394fc2d9878b 100644 (file)
@@ -1857,11 +1857,28 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
 #ifndef DISABLE_MOUSE
 bool do_statusbar_mouse(void)
 {
-    /* 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 this function. */
     int mouse_x, mouse_y;
-    return get_mouseinput(&mouse_x, &mouse_y, TRUE);
+    bool retval = get_mouseinput(&mouse_x, &mouse_y, TRUE);
+
+    if (!retval) {
+       /* We can click in the statusbar window text to move the
+        * cursor. */
+       if (wenclose(bottomwin, mouse_y, mouse_x)) {
+           size_t start_col = strlenpt(prompt) + 1;
+
+           /* Move to where the click occurred. */
+           if (mouse_x > start_col) {
+               size_t xpt = strnlenpt(answer, statusbar_x);
+
+               statusbar_x = actual_x(answer,
+                       get_statusbar_page_start(start_col, start_col +
+                       xpt) + mouse_x - start_col - 1);
+               nanoget_repaint(answer, statusbar_x);
+           }
+       }
+    }
+
+    return retval;
 }
 #endif
 
@@ -2469,14 +2486,14 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
 
 /* 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, const char *inputbuf, size_t x)
+void nanoget_repaint(const char *inputbuf, size_t x)
 {
     size_t start_col, xpt, page_start;
     char *expanded;
 
     assert(x <= strlen(inputbuf));
 
-    start_col = strlenpt(buf) + 1;
+    start_col = strlenpt(prompt) + 1;
     xpt = strnlenpt(inputbuf, x);
     page_start = get_statusbar_page_start(start_col, start_col + xpt);
 
@@ -2484,7 +2501,7 @@ void nanoget_repaint(const char *buf, const char *inputbuf, size_t x)
 
     blank_statusbar();
 
-    mvwaddnstr(bottomwin, 0, 0, buf, actual_x(buf, COLS - 2));
+    mvwaddnstr(bottomwin, 0, 0, prompt, actual_x(prompt, COLS - 2));
     waddch(bottomwin, ':');
     waddch(bottomwin, (page_start == 0) ? ' ' : '$');
 
@@ -2500,7 +2517,7 @@ void nanoget_repaint(const char *buf, const char *inputbuf, size_t x)
 
 /* Get the input from the keyboard; this should only be called from
  * statusq(). */
-int nanogetstr(bool allow_tabs, const char *buf, const char *curranswer,
+int nanogetstr(bool allow_tabs, const char *curranswer,
 #ifndef NANO_SMALL
        filestruct **history_list,
 #endif
@@ -2546,7 +2563,7 @@ int nanogetstr(bool allow_tabs, const char *buf, const char *curranswer,
 
     currshortcut = s;
 
-    nanoget_repaint(buf, answer, statusbar_x);
+    nanoget_repaint(answer, statusbar_x);
 
     /* Refresh the edit window and the statusbar before getting
      * input. */
@@ -2655,7 +2672,7 @@ int nanogetstr(bool allow_tabs, const char *buf, const char *curranswer,
        last_kbinput = kbinput;
 #endif
 
-       nanoget_repaint(buf, answer, statusbar_x);
+       nanoget_repaint(answer, statusbar_x);
        wnoutrefresh(bottomwin);
     }
 
@@ -2693,20 +2710,21 @@ int statusq(bool allow_tabs, const shortcut *s, const char *curranswer,
        const char *msg, ...)
 {
     va_list ap;
-    char *foo = charalloc(((COLS - 4) * mb_cur_max()) + 1);
     int retval;
 #ifndef DISABLE_TABCOMP
     bool list = FALSE;
 #endif
 
+    prompt = charealloc(prompt, ((COLS - 4) * mb_cur_max()) + 1);
+
     bottombars(s);
 
     va_start(ap, msg);
-    vsnprintf(foo, (COLS - 4) * mb_cur_max(), msg, ap);
+    vsnprintf(prompt, (COLS - 4) * mb_cur_max(), msg, ap);
     va_end(ap);
-    null_at(&foo, actual_x(foo, COLS - 4));
+    null_at(&prompt, actual_x(prompt, COLS - 4));
 
-    retval = nanogetstr(allow_tabs, foo, curranswer,
+    retval = nanogetstr(allow_tabs, curranswer,
 #ifndef NANO_SMALL
                history_list,
 #endif
@@ -2715,7 +2733,7 @@ int statusq(bool allow_tabs, const shortcut *s, const char *curranswer,
                , &list
 #endif
                );
-    free(foo);
+
     resetstatuspos = FALSE;
 
     switch (retval) {