]> granicus.if.org Git - procps-ng/commitdiff
top: improve scroll coordinates message handling
authorJim Warner <james.warner@comcast.net>
Sat, 30 Jun 2012 05:00:22 +0000 (00:00 -0500)
committerCraig Small <csmall@enc.com.au>
Wed, 29 Aug 2012 07:28:53 +0000 (17:28 +1000)
With the introduction of intra-column scrolling, the
scroll coordinates message was enhanced to give some
hint of positioning within a scrolled column.

Rather than rebuild this somewhat costly string from
scratch with each frame, we'll now do the bulk of the
work only when column headers are constructed.

The only remaining per frame costs will then be the
addition of a few terminfo escapes and the current
Frame_maxtask count.

Signed-off-by: Jim Warner <james.warner@comcast.net>
top/top.c
top/top.h
top/top_nls.c

index 1f2ab2b3488c2f35e27f3b315ef73a18149577d7..1783ab383128b62a5d8860360de333ea0f3f5e20 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -102,6 +102,10 @@ static int Screen_cols, Screen_rows, Max_lines;
            stick the cursor between frames. */
 static int Msg_row;
 
+        /* The nearly complete scroll coordinates message for the current
+           window, built at the time column headers are constructed */
+static char Scroll_fmts [SMLBUFSIZ];
+
         /* Global/Non-windows mode stuff that is NOT persistent */
 static int No_ksyms = -1,       // set to '0' if ksym avail, '1' otherwise
            PSDBopen = 0,        // set to '1' if psdb opened (now postponed)
@@ -680,30 +684,9 @@ static int show_pmt (const char *str) {
          * Show a special coordinate message, in support of scrolling */
 static inline void show_scroll (void) {
    char tmp[SMLBUFSIZ];
-#ifndef SCROLLVAR_NO
-   char tmp2[SMLBUFSIZ];
-#endif
-   int totpflgs = Curwin->totpflgs;
-   int begpflgs = Curwin->begpflg + 1;
 
-#ifndef USE_X_COLHDR
-   if (CHKw(Curwin, Show_HICOLS)) {
-      totpflgs -= 2;
-      if (ENUpos(Curwin, Curwin->rc.sortindx) < Curwin->begpflg) begpflgs -= 2;
-   }
-#endif
-   if (1 > totpflgs) totpflgs = 1;
-   if (1 > begpflgs) begpflgs = 1;
-   snprintf(tmp, sizeof(tmp)
-      , N_fmt(SCROLL_coord_fmt)
-      , Curwin->begtask + 1, Frame_maxtask
-      , begpflgs, totpflgs);
-#ifndef SCROLLVAR_NO
-   snprintf(tmp2, sizeof(tmp2), Curwin->varcolbeg ? " + %d" : "", Curwin->varcolbeg);
-   PUTT("%s%s  %.*s%s%s", tg2(0, Msg_row), Caps_off, Screen_cols - 2, tmp, tmp2, Cap_clr_eol);
-#else
+   snprintf(tmp, sizeof(tmp), Scroll_fmts, Frame_maxtask);
    PUTT("%s%s  %.*s%s", tg2(0, Msg_row), Caps_off, Screen_cols - 2, tmp, Cap_clr_eol);
-#endif
    putp(tg2(0, Msg_row));
 } // end: show_scroll
 
@@ -796,6 +779,35 @@ static void show_special (int interact, const char *glob) {
       'fit-to-screen' thingy while also leaving room for the cursor... */
    if (*glob) PUTT("%.*s", Screen_cols -1, glob);
 } // end: show_special
+
+
+        /*
+         * Create a nearly complete scroll coordinates message, but still
+         * technically a format string since we're missing total tasks. */
+static void updt_scroll_msg (void) {
+#ifndef SCROLLVAR_NO
+   char tmp[SMLBUFSIZ];
+#endif
+   int totpflgs = Curwin->totpflgs;
+   int begpflgs = Curwin->begpflg + 1;
+
+#ifndef USE_X_COLHDR
+   if (CHKw(Curwin, Show_HICOLS)) {
+      totpflgs -= 2;
+      if (ENUpos(Curwin, Curwin->rc.sortindx) < Curwin->begpflg) begpflgs -= 2;
+   }
+#endif
+   if (1 > totpflgs) totpflgs = 1;
+   if (1 > begpflgs) begpflgs = 1;
+   snprintf(Scroll_fmts, sizeof(Scroll_fmts)
+      , N_fmt(SCROLL_coord_fmt)
+      , Curwin->begtask + 1
+      , begpflgs, totpflgs);
+#ifndef SCROLLVAR_NO
+   snprintf(tmp, sizeof(tmp), Curwin->varcolbeg ? " + %d" : "", Curwin->varcolbeg);
+   scat (Scroll_fmts, tmp);
+#endif
+} // end: updt_scroll_msg
 \f
 /*######  Low Level Memory/Keyboard support  #############################*/
 
@@ -1552,6 +1564,8 @@ static void calibrate_fields (void) {
    } while (w != Curwin);
 
    build_headers();
+   if (CHKw(Curwin, View_SCROLL))
+      updt_scroll_msg();
 
    Frames_resize = 0;
    if (-1 == sigprocmask(SIG_SETMASK, &oldss, NULL))
index 588f3bb311760151c7a0a7a6944641a16eaf317b..70072d5cfd1eb2795e5825131ae2df07f58840c7 100644 (file)
--- a/top/top.h
+++ b/top/top.h
@@ -588,6 +588,7 @@ typedef struct WIN_t {
 //atic int           show_pmt (const char *str);
 //atic inline void   show_scroll (void);
 //atic void          show_special (int interact, const char *glob);
+//atic void          updt_scroll_msg (void);
 /*------  Low Level Memory/Keyboard support  -----------------------------*/
 //atic void         *alloc_c (size_t num);
 //atic void         *alloc_r (void *ptr, size_t num);
index e31d4c4aeb47aaafee6e27ca73f0ef8b6141581f..b533674dd7e71c7d16ed3df5d1491bdfb0b2fec0 100644 (file)
@@ -221,7 +221,7 @@ static void build_norm_nlstab (void) {
    Norm_nlstab[HILIGHT_cant_txt] = _("Nothing to highlight!");
    Norm_nlstab[GET_user_ids_txt] = _("Which user (blank for all)");
    Norm_nlstab[UNKNOWN_cmds_txt] = _("Unknown command - try 'h' for help");
-   Norm_nlstab[SCROLL_coord_fmt] = _("scroll coordinates: y = %d/%d (tasks), x = %d/%d (fields)");
+   Norm_nlstab[SCROLL_coord_fmt] = _("scroll coordinates: y = %d/%%d (tasks), x = %d/%d (fields)");
    Norm_nlstab[FAIL_alloc_c_txt] = _("failed memory allocate");
    Norm_nlstab[FAIL_alloc_r_txt] = _("failed memory re-allocate");
    Norm_nlstab[BAD_numfloat_txt] = _("Unacceptable floating point");