about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--input_win.c1
-rw-r--r--status_bar.c40
-rw-r--r--title_bar.c17
-rw-r--r--windows.c59
4 files changed, 102 insertions, 15 deletions
diff --git a/input_win.c b/input_win.c
index 0caa8264..1a895ebd 100644
--- a/input_win.c
+++ b/input_win.c
@@ -63,7 +63,6 @@ void inp_clear(void)
 {
     wclear(inp_win);
     wmove(inp_win, 0, 1);
-    touchwin(inp_win);
     wrefresh(inp_win);
 }
 
diff --git a/status_bar.c b/status_bar.c
index 34de6696..56cae9ce 100644
--- a/status_bar.c
+++ b/status_bar.c
@@ -20,6 +20,8 @@
  *
  */
 
+#include <string.h>
+
 #include <ncurses.h>
 #include "windows.h"
 #include "util.h"
@@ -27,6 +29,9 @@
 static WINDOW *status_bar;
 static char _active[29] = "[ ][ ][ ][ ][ ][ ][ ][ ][  ]";
 
+static int dirty;
+static char curr_time[80];
+
 static void _status_bar_update_time(void);
 
 void create_status_bar(void)
@@ -39,15 +44,27 @@ void create_status_bar(void)
     wattron(status_bar, COLOR_PAIR(4));
     mvwprintw(status_bar, 0, cols - 29, _active);
     wattroff(status_bar, COLOR_PAIR(4));
-    wrefresh(status_bar);
+
+    get_time(curr_time);
+    dirty = TRUE;
 }
 
 void status_bar_refresh(void)
 {
-    _status_bar_update_time();
-    touchwin(status_bar);
-    wrefresh(status_bar);
-    inp_put_back();
+    char new_time[80];
+    get_time(new_time);
+
+    if (strcmp(new_time, curr_time) != 0) {
+        dirty = TRUE;
+        strcpy(curr_time, new_time);
+    }
+
+    if (dirty) {
+        _status_bar_update_time();
+        wrefresh(status_bar);
+        inp_put_back();
+        dirty = FALSE;
+    }
 }
 
 void status_bar_inactive(int win)
@@ -60,6 +77,8 @@ void status_bar_inactive(int win)
     mvwaddch(status_bar, 0, cols - 29 + active_pos, ' ');
     if (win == 9)
         mvwaddch(status_bar, 0, cols - 29 + active_pos + 1, ' ');
+
+    dirty = TRUE;
 }
 
 void status_bar_active(int win)
@@ -73,16 +92,22 @@ void status_bar_active(int win)
         mvwprintw(status_bar, 0, cols - 29 + active_pos, "%d", win+1);
     else
         mvwprintw(status_bar, 0, cols - 29 + active_pos, "10");
+
+    dirty = TRUE;
 }
 
 void status_bar_get_password(void)
 {
     mvwprintw(status_bar, 0, 9, "Enter password:");
+
+    dirty = TRUE;
 }
 
 void status_bar_print_message(const char *msg)
 {
     mvwprintw(status_bar, 0, 9, msg);
+
+    dirty = TRUE;
 }
 
 void status_bar_clear(void)
@@ -94,6 +119,8 @@ void status_bar_clear(void)
     wattron(status_bar, COLOR_PAIR(4));
     mvwprintw(status_bar, 0, cols - 29, _active);
     wattroff(status_bar, COLOR_PAIR(4));
+
+    dirty = TRUE;
 }
 
 static void _status_bar_update_time(void)
@@ -110,6 +137,7 @@ static void _status_bar_update_time(void)
     wattron(status_bar, COLOR_PAIR(4));
     mvwaddch(status_bar, 0, 7, ']');
     wattroff(status_bar, COLOR_PAIR(4));
-    
+
+    dirty = TRUE;
 }
 
diff --git a/title_bar.c b/title_bar.c
index fb70e858..17e2df2a 100644
--- a/title_bar.c
+++ b/title_bar.c
@@ -24,6 +24,7 @@
 #include "windows.h"
 
 static WINDOW *title_bar;
+static int dirty;
 
 void create_title_bar(void)
 {
@@ -34,12 +35,14 @@ void create_title_bar(void)
     wbkgd(title_bar, COLOR_PAIR(3));
     title_bar_title();
     title_bar_disconnected();
+    dirty = TRUE;
 }
 
 void title_bar_title()
 {
     char *title = "Profanity. Type /help for help information.";
     title_bar_show(title);
+    dirty = TRUE;
 }
 
 void title_bar_connected(void)
@@ -56,6 +59,8 @@ void title_bar_connected(void)
     wattron(title_bar, COLOR_PAIR(4));
     mvwaddch(title_bar, 0, cols - 2, ']');
     wattroff(title_bar, COLOR_PAIR(4));
+    
+    dirty = TRUE;
 }
 
 void title_bar_disconnected(void)
@@ -72,13 +77,17 @@ void title_bar_disconnected(void)
     wattron(title_bar, COLOR_PAIR(4));
     mvwaddch(title_bar, 0, cols - 2, ']');
     wattroff(title_bar, COLOR_PAIR(4));
+    
+    dirty = TRUE;
 }
 
 void title_bar_refresh(void)
 {
-    touchwin(title_bar);
-    wrefresh(title_bar);
-    inp_put_back();
+    if (dirty) {
+        wrefresh(title_bar);
+        inp_put_back();
+        dirty = FALSE;
+    }
 }
 
 void title_bar_show(char *title)
@@ -88,5 +97,7 @@ void title_bar_show(char *title)
     for (i = 0; i < 45; i++)
         waddch(title_bar, ' ');
     mvwprintw(title_bar, 0, 0, " %s", title);
+    
+    dirty = TRUE;
 }
 
diff --git a/windows.c b/windows.c
index 8b001032..82d7035a 100644
--- a/windows.c
+++ b/windows.c
@@ -39,6 +39,9 @@ static int _curr_prof_win = 0;
 // shortcut pointer to console window
 static WINDOW * _cons_win = NULL;
 
+// current window state
+static int dirty;
+
 static void _create_windows(void);
 static int _find_prof_win_index(char *contact);
 static int _new_prof_win(char *contact);
@@ -74,13 +77,20 @@ void gui_init(void)
     create_status_bar();
     create_input_window();
     _create_windows();
+
+    dirty = TRUE;
 }
 
 void gui_refresh(void)
 {
     title_bar_refresh();
     status_bar_refresh();
-    _current_window_refresh();
+
+    if (dirty) {
+        _current_window_refresh();
+        dirty = FALSE;
+    }
+
     inp_put_back();
 }
 
@@ -102,6 +112,8 @@ int win_close_win(void)
         // go back to console window
         _curr_prof_win = 0;
         title_bar_title();
+
+        dirty = TRUE;
     
         // success
         return 1;
@@ -141,6 +153,9 @@ void win_show_incomming_msg(char *from, char *message)
     _win_show_message(win, message);
 
     status_bar_active(win_index);
+
+    if (win_index == _curr_prof_win)
+        dirty = TRUE;
 }
 
 void win_show_outgoing_msg(char *from, char *to, char *message)
@@ -155,6 +170,9 @@ void win_show_outgoing_msg(char *from, char *to, char *message)
     _win_show_message(win, message);
     
     status_bar_active(win_index);
+    
+    if (win_index == _curr_prof_win)
+        dirty = TRUE;
 }
 
 void win_contact_online(char *from, char *show, char *status)
@@ -166,6 +184,9 @@ void win_contact_online(char *from, char *show, char *status)
         WINDOW *win = _wins[win_index].win;
         _show_status_string(win, from, show, status, "++", "online");
     }
+    
+    if (win_index == _curr_prof_win)
+        dirty = TRUE;
 }
 
 void win_contact_offline(char *from, char *show, char *status)
@@ -177,6 +198,9 @@ void win_contact_offline(char *from, char *show, char *status)
         WINDOW *win = _wins[win_index].win;
         _show_status_string(win, from, show, status, "--", "offline");
     }
+    
+    if (win_index == _curr_prof_win)
+        dirty = TRUE;
 }
 
 void cons_help(void)
@@ -197,6 +221,9 @@ void cons_help(void)
     cons_show("    UP, DOWN             : Navigate input history.");
     cons_show("    LEFT, RIGHT          : Edit current input.");
     cons_show("    PAGE UP, PAGE DOWN   : Page the chat window.");
+
+    if (_curr_prof_win == 0)
+        dirty = TRUE;
 }
 
 void cons_bad_show(char *msg)
@@ -205,18 +232,27 @@ void cons_bad_show(char *msg)
     wattron(_cons_win, COLOR_PAIR(6));
     wprintw(_cons_win, "%s\n", msg);
     wattroff(_cons_win, COLOR_PAIR(6));
+    
+    if (_curr_prof_win == 0)
+        dirty = TRUE;
 }
 
 void cons_show(char *msg)
 {
     _win_show_time(_cons_win);
     wprintw(_cons_win, "%s\n", msg); 
+    
+    if (_curr_prof_win == 0)
+        dirty = TRUE;
 }
 
 void cons_bad_command(char *cmd)
 {
     _win_show_time(_cons_win);
     wprintw(_cons_win, "Unknown command: %s\n", cmd);
+    
+    if (_curr_prof_win == 0)
+        dirty = TRUE;
 }
 
 void cons_bad_connect(void)
@@ -278,6 +314,8 @@ void win_page_off(void)
     _wins[_curr_prof_win].y_pos = y - (size - 1);
     if (_wins[_curr_prof_win].y_pos < 0)
         _wins[_curr_prof_win].y_pos = 0;
+
+    dirty = TRUE;
 }
 
 void win_handle_page(int *ch)
@@ -291,17 +329,26 @@ void win_handle_page(int *ch)
             _wins[_curr_prof_win].y_pos = 0;
        
         _wins[_curr_prof_win].paged = 1;
+        dirty = TRUE;
     } else if (*ch == KEY_NPAGE) {
         int rows, cols, y, x;
         getmaxyx(stdscr, rows, cols);
         getyx(_wins[_curr_prof_win].win, y, x);
 
         _wins[_curr_prof_win].y_pos = _wins[_curr_prof_win].y_pos + (rows - 4);
-        if (_wins[_curr_prof_win].y_pos >= y)
-            _wins[_curr_prof_win].y_pos = y - 1;
+
+        // only got half a screen, show full screen
+        if ((y - _wins[_curr_prof_win].y_pos) < (rows - 4))
+            _wins[_curr_prof_win].y_pos = y - (rows - 4);
+
+        // went past end, show full screen
+        else if (_wins[_curr_prof_win].y_pos >= y)
+            _wins[_curr_prof_win].y_pos = y - (rows - 4);
            
         _wins[_curr_prof_win].paged = 1;
+        dirty = TRUE;
     }
+
 }
 
 static void _create_windows(void)
@@ -323,8 +370,9 @@ static void _create_windows(void)
     wattrset(_cons_win, A_BOLD);
     _win_show_time(_cons_win);
     wprintw(_cons_win, "Welcome to Profanity.\n");
-    touchwin(_cons_win);
     prefresh(_cons_win, 0, 0, 1, 0, rows-3, cols-1);
+
+    dirty = TRUE;
     
     // create the chat windows
     int i;
@@ -377,6 +425,8 @@ static void _win_switch_if_active(int i)
         else
             title_bar_show(_wins[i].from);
     }
+
+    dirty = TRUE;
 }
 
 static void _win_show_time(WINDOW *win)
@@ -408,7 +458,6 @@ static void _current_window_refresh()
     getmaxyx(stdscr, rows, cols);
 
     WINDOW *current = _wins[_curr_prof_win].win;
-    touchwin(current);
     prefresh(current, _wins[_curr_prof_win].y_pos, 0, 1, 0, rows-3, cols-1);
 }