diff mcabber/src/screen.c @ 990:35e7913affb7

Send events/chatstates notifications (JEP-22/JEP-85)
author Mikael Berthe <mikael@lilotux.net>
date Wed, 01 Nov 2006 00:57:56 +0100
parents f47e312560af
children ef10906691bb
line wrap: on
line diff
--- a/mcabber/src/screen.c	Tue Oct 31 20:30:29 2006 +0100
+++ b/mcabber/src/screen.c	Wed Nov 01 00:57:56 2006 +0100
@@ -95,6 +95,9 @@
 static GList *cmdhisto_cur;
 static char   cmdhisto_backup[INPUTLINE_LENGTH+1];
 
+static int    chatstate;
+static bool   lock_chatstate;
+
 #define MAX_KEYSEQ_LENGTH 8
 
 typedef struct {
@@ -1408,6 +1411,30 @@
   }
 }
 
+//  set_chatstate(state)
+// Set the current chat state (0=active, 1=composing, 2=paused)
+static inline void set_chatstate(int state)
+{
+#if defined JEP0022 || defined JEP0085
+  if (!chatmode)
+    state = 0;
+  if (state != chatstate) {
+    chatstate = state;
+    if (current_buddy &&
+        buddy_gettype(BUDDATA(current_buddy)) == ROSTER_TYPE_USER) {
+      guint jep_state;
+      if (chatstate == 1)
+        jep_state = ROSTER_EVENT_COMPOSING;
+      else if (chatstate == 2)
+        jep_state = ROSTER_EVENT_PAUSED;
+      else
+        jep_state = ROSTER_EVENT_ACTIVE;
+      jb_send_chatstate(BUDDATA(current_buddy), jep_state);
+    }
+  }
+#endif
+}
+
 //  set_current_buddy(newbuddy)
 // Set the current_buddy to newbuddy (if not NULL)
 // Lock the newbuddy, and unlock the previous current_buddy
@@ -1422,6 +1449,11 @@
   if (!current_buddy || !newbuddy)  return;
   if (newbuddy == current_buddy)    return;
 
+  // We're moving to another buddy.  We're thus inactive wrt current_buddy.
+  set_chatstate(0);
+  // We don't want the chatstate to be changed again right now.
+  lock_chatstate = true;
+
   prev_st = buddy_getstatus(BUDDATA(current_buddy), NULL);
   buddy_setflags(BUDDATA(current_buddy), ROSTER_FLAG_LOCK, FALSE);
   if (chatmode)
@@ -2530,6 +2562,8 @@
   int key = kcode.value;
   int display_char = FALSE;
 
+  lock_chatstate = false;
+
   switch (kcode.mcode) {
     case 0:
         break;
@@ -2753,6 +2787,13 @@
   if (completion_started && key != 9 && key != KEY_RESIZE)
     scr_end_current_completion();
   refresh_inputline();
+
+  if (!lock_chatstate) {
+    if (inputLine[0] == 0 || inputLine[0] == COMMAND_CHAR)
+      set_chatstate(0);
+    else
+      set_chatstate(1);
+  }
   return 0;
 }