about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2012-08-16 21:43:52 +0100
committerJames Booth <boothj5@gmail.com>2012-08-16 21:43:52 +0100
commitd9c47c9b0d0b8bd75ab9458d381f2f73e682c9b8 (patch)
treec74f4953c777eb144c411d3f16befb3adbc5b425
parent46c9a5ed4babd0341b6b34321eaab192ad4aa2e4 (diff)
downloadprofani-tty-d9c47c9b0d0b8bd75ab9458d381f2f73e682c9b8.tar.gz
Moved typing notification from main chat to title bar
-rw-r--r--src/title_bar.c78
-rw-r--r--src/ui.h3
-rw-r--r--src/windows.c10
3 files changed, 86 insertions, 5 deletions
diff --git a/src/title_bar.c b/src/title_bar.c
index eb1b5d87..9fa184c0 100644
--- a/src/title_bar.c
+++ b/src/title_bar.c
@@ -24,11 +24,15 @@
 #include <string.h>
 #include <ncurses.h>
 
+#include <glib.h>
+
 #include "common.h"
 #include "ui.h"
 
 static WINDOW *title_bar;
 static char *current_title = NULL;
+static char *recipient = NULL;
+static GTimer *typing_elapsed;
 static int dirty;
 static jabber_presence_t current_status;
 
@@ -51,6 +55,8 @@ create_title_bar(void)
 void
 title_bar_title(void)
 {
+    recipient = NULL;
+    typing_elapsed = NULL;
     title_bar_show("Profanity. Type /help for help information.");
     dirty = TRUE;
 }
@@ -72,6 +78,27 @@ title_bar_resize(void)
 void
 title_bar_refresh(void)
 {
+    if (recipient != NULL) {
+
+        if (typing_elapsed != NULL) {
+            gdouble seconds = g_timer_elapsed(typing_elapsed, NULL);
+
+            if (seconds >= 10) {
+                
+                if (current_title != NULL) {
+                    free(current_title);
+                }
+
+                current_title = (char *) malloc((strlen(recipient) + 1) * sizeof(char));
+                strcpy(current_title, recipient);
+
+                title_bar_draw();
+    
+                dirty = TRUE;
+            }
+        }
+    }
+
     if (dirty) {
         wrefresh(title_bar);
         inp_put_back();
@@ -97,8 +124,57 @@ title_bar_set_status(jabber_presence_t status)
     _title_bar_draw_status();
 }
 
+void
+title_bar_set_recipient(char *from)
+{
+    typing_elapsed = NULL;
+    recipient = from;
+    
+    if (current_title != NULL) {
+        free(current_title);
+    }
+
+    current_title = (char *) malloc((strlen(from) + 1) * sizeof(char));
+    strcpy(current_title, from);
+
+    dirty = TRUE;
+}
+
+void
+title_bar_set_typing(gboolean is_typing)
+{
+    if (is_typing) {
+        if (typing_elapsed != NULL) {
+            g_timer_start(typing_elapsed);
+        } else {
+            typing_elapsed = g_timer_new();
+        }
+    }
+
+    if (current_title != NULL) {
+        free(current_title);
+    }
+
+    if (is_typing) {
+        current_title = (char *) malloc((strlen(recipient) + 13) * sizeof(char));
+        sprintf(current_title, "%s (typing...)", recipient);
+    } else {
+        current_title = (char *) malloc((strlen(recipient) + 1) * sizeof(char));
+        strcpy(current_title, recipient);
+    }
+    
+    dirty = TRUE;
+}
+
+void
+title_bar_draw(void)
+{
+    _title_bar_draw_status();
+    _title_bar_draw_title();
+}
+
 static void
-_title_bar_draw_status()
+_title_bar_draw_status(void)
 {
     int rows, cols;
     getmaxyx(stdscr, rows, cols);
diff --git a/src/ui.h b/src/ui.h
index b2bca2b1..5d0284e6 100644
--- a/src/ui.h
+++ b/src/ui.h
@@ -55,6 +55,9 @@ void title_bar_resize(void);
 void title_bar_show(const char * const title);
 void title_bar_title(void);
 void title_bar_set_status(jabber_presence_t status);
+void title_bar_set_recipient(char *from);
+void title_bar_set_typing(gboolean is_typing);
+void title_bar_draw(void);
 
 // main window actions
 int win_close_win(void);
diff --git a/src/windows.c b/src/windows.c
index 69ee5814..bcea4a93 100644
--- a/src/windows.c
+++ b/src/windows.c
@@ -208,9 +208,8 @@ win_show_typing(const char * const from)
 
     // in chat window with user
     } else {
-        WINDOW *win = _wins[win_index].win;
-        _win_show_time(win);
-        _win_show_typing(win, short_from);
+        title_bar_set_typing(TRUE);
+        title_bar_draw();
 
         status_bar_active(win_index);
         dirty = TRUE;
@@ -239,6 +238,8 @@ win_show_incomming_msg(const char * const from, const char * const message)
     _win_show_message(win, message);
     
     if (win_index == _curr_prof_win) {
+        title_bar_set_typing(FALSE);
+        title_bar_draw();
         status_bar_active(win_index);
         dirty = TRUE;
     } else {
@@ -713,7 +714,8 @@ _win_switch_if_active(const int i)
         if (i == 0) {
             title_bar_title();
         } else {
-            title_bar_show(_wins[i].from);
+            title_bar_set_recipient(_wins[i].from);
+            title_bar_draw();;
             status_bar_active(i);
         }
     }