tFunctional scroll facility for curses client message window. - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit dbbbb4f9a3c6ce5c73a819dd91c641a3bfa498d7
 (DIR) parent 8c093126e4c298561cb3094be900d2f90d3d3054
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Sat,  4 Jan 2003 19:39:24 +0000
       
       Functional scroll facility for curses client message window.
       
       
       Diffstat:
         M ChangeLog                           |       4 ++++
         M TODO                                |       1 -
         M src/curses_client/curses_client.c   |      55 ++++++++++++++++++++++++++++---
       
       3 files changed, 54 insertions(+), 6 deletions(-)
       ---
 (DIR) diff --git a/ChangeLog b/ChangeLog
       t@@ -1,3 +1,7 @@
       +cvs
       +    - The messages window in the curses client can now be scrolled with the
       +      + and - keys
       +
        1.5.8   21-10-2002
            - Options dialog now allows sounds for all supported game events to be set
            - BindAddress config variable added, to allow the server to be bound to
 (DIR) diff --git a/TODO b/TODO
       t@@ -1,4 +1,3 @@
       -- Scrollbar in curses client "Messages" box
        - Better use of screen space in curses client for large xterms etc.
        - Preserve chat messages at end of game (so they aren't lost when looking at
          the high score list) ?
 (DIR) diff --git a/src/curses_client/curses_client.c b/src/curses_client/curses_client.c
       t@@ -44,9 +44,6 @@
        #include "sound.h"
        #include "tstring.h"
        
       -static void PrepareHighScoreScreen(void);
       -static void PrintHighScore(char *Data);
       -
        static int ResizedFlag;
        static SCREEN *cur_screen;
        
       t@@ -95,6 +92,11 @@ static void PrintMessage(const gchar *text);
        static void GunShop(Player *Play);
        static void LoanShark(Player *Play);
        static void Bank(Player *Play);
       +static void PrepareHighScoreScreen(void);
       +static void PrintHighScore(char *Data);
       +static void scroll_msg_area_up(void);
       +static void scroll_msg_area_down(void);
       +
        
        #ifdef NETWORKING
        static void HttpAuthFunc(HttpConnection *conn, gboolean proxyauth,
       t@@ -1515,6 +1517,14 @@ int GetKey(char *allowed, char *orig_allowed, gboolean AllowOther,
          do {
            ch = bgetch();
            ch = toupper(ch);
       +    /* Handle scrolling of message window */
       +    if (ch == '-') {
       +      scroll_msg_area_up();
       +      continue;
       +    } else if (ch == '+') {
       +      scroll_msg_area_down();
       +      continue;
       +    }
            for (AllowInd = 0; AllowInd < strlen(allowed); AllowInd++) {
              if (allowed[AllowInd] == ch) {
                addch((guint)ch | TextAttr);
       t@@ -1660,6 +1670,27 @@ static int get_msg_area_bottom(void)
          return 14;
        }
        
       +/* Number of lines that the message window is scrolled back by */
       +static int scrollpos = 0;
       +
       +/*
       + * Scrolls the message area up a page
       + */
       +static void scroll_msg_area_up(void)
       +{
       +  scrollpos += (get_msg_area_bottom() - get_msg_area_top() + 1);
       +  display_message("");
       +}
       +
       +/*
       + * Scrolls the message area down a page
       + */
       +static void scroll_msg_area_down(void)
       +{
       +  scrollpos -= (get_msg_area_bottom() - get_msg_area_top() + 1);
       +  display_message("");
       +}
       +
        /* 
         * Displays a network message "buf" in the message area
         * scrolling previous messages up.
       t@@ -1689,6 +1720,7 @@ void display_message(const char *buf)
            g_list_free(msgs);
            msgs = NULL;
            num_msgs = 0;
       +    scrollpos = 0;
            /* Display a blank message area */
            if (Network) {
              for (y = 0; y < depth; y++) {
       t@@ -1712,7 +1744,14 @@ void display_message(const char *buf)
            pt = NULL;
            data = NULL;
            if (nextpt) {
       -      int lines = 0, displines = depth;
       +      int lines = 0, displines, total_lines = 0;
       +      
       +      /* Correct for having scrolled down too far */
       +      if (scrollpos < 0) {
       +        scrollpos = 0;
       +      }
       +
       +      displines = depth + scrollpos;
              /* Find the message to display at the top of the message area */
              do {
                displines -= lines;
       t@@ -1720,7 +1759,13 @@ void display_message(const char *buf)
                nextpt = g_list_previous(pt);
                data = pt->data;
                lines = (strlen(data) + wid - 1) / wid;
       +        total_lines += lines;
              } while (displines > lines && nextpt);
       +      
       +      /* Correct for having scrolled up too far */
       +      if ((depth + scrollpos) > total_lines && total_lines > depth) {
       +        scrollpos = total_lines - depth;
       +      }
        
              /* Correct for the first line starting partway through a message */
              if (displines < lines) {
       t@@ -1818,7 +1863,7 @@ void print_status(Player *Play, gboolean DispDrug)
            addch(ACS_RTEE);
        
            /* Title of the "Messages" window in the curses client */
       -    mvaddstr(9, 15, _("Messages"));
       +    mvaddstr(9, 15, _("Messages (-/+ scrolls up/down)"));
        
            mvaddch(9, Width / 2, ACS_BTEE);
            mvaddch(15, 1, ACS_LLCORNER);