diff src/conversation.c @ 3596:bb966d68f9e3

[gaim-migrate @ 3698] I like typing notifcation. I think I'll marry it. Also, if I'm going to go around mentioning gaim on resumes, I can't very well tell people to look for "KingAnt"... :-) committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Sun, 06 Oct 2002 05:01:50 +0000
parents bdd0bebd2d04
children bc87186a7478
line wrap: on
line diff
--- a/src/conversation.c	Sun Oct 06 03:08:47 2002 +0000
+++ b/src/conversation.c	Sun Oct 06 05:01:50 2002 +0000
@@ -284,6 +284,8 @@
 	g_list_free(c->send_history);
 	if (c->typing_timeout)
 		gtk_timeout_remove(c->typing_timeout);
+	if (c->type_again_timeout)
+		gtk_timeout_remove(c->type_again_timeout);
 	g_string_free(c->history, TRUE);
 	g_free(c);
 }
@@ -535,7 +537,8 @@
 
 	if (!c->is_chat) {
 		GSList *cn = connections;
-		serv_send_typing(c->gc, c->name, FALSE);
+		if (!(misc_options & OPT_MISC_STEALTH_TYPING))
+			serv_send_typing(c->gc, c->name, NOT_TYPING);
 		while (cn) {
 			struct gaim_connection *gc = cn->data;
 			cn = cn->next;
@@ -820,6 +823,16 @@
 		gtk_notebook_next_page(notebook);
 }
 
+gboolean send_typed(gpointer data)
+{
+	struct conversation *c = (struct conversation*)data;
+	if (c && c->gc && c->name) {
+		c->type_again = 1;
+		serv_send_typing(c->gc, c->name, TYPED);
+	}
+	return FALSE;
+}
+
 gboolean keypress_callback(GtkWidget *entry, GdkEventKey * event, struct conversation *c)
 {
 	int pos;
@@ -1066,23 +1079,34 @@
 
 	if (c && (!(misc_options & OPT_MISC_STEALTH_TYPING)) && !c->is_chat) {
 		char *txt = gtk_editable_get_chars(GTK_EDITABLE(c->entry), 0, -1);
-		if (gdk_keyval_to_unicode(event->keyval) && 
+		if (gdk_keyval_to_unicode(event->keyval) &&
 			(strlen(txt) == 0 || (c->type_again != 0 && time(NULL) > c->type_again))) {
-			int timeout = serv_send_typing(c->gc, c->name, TRUE);
+			int timeout = serv_send_typing(c->gc, c->name, TYPING);
 			if (timeout)
 				c->type_again = time(NULL) + timeout;
 			else
 				c->type_again = 0;
+
+			if (c && c->type_again_timeout)
+				gtk_timeout_remove(c->type_again_timeout);
+			/* send TYPED after 5 seconds of not typing */
+			c->type_again_timeout = gtk_timeout_add(5000, send_typed, (gpointer)c);
 		}
 		else if (strlen(txt) == 1) {
 			if ((GTK_OLD_EDITABLE(c->entry)->current_pos == 1 && event->keyval == GDK_BackSpace) ||
-			    (GTK_OLD_EDITABLE(c->entry)->current_pos == 0 && event->keyval == GDK_Delete))
-				serv_send_typing(c->gc, c->name, FALSE);
+			    (GTK_OLD_EDITABLE(c->entry)->current_pos == 0 && event->keyval == GDK_Delete)) {
+				if (c && c->type_again_timeout)
+					gtk_timeout_remove(c->type_again_timeout);
+				serv_send_typing(c->gc, c->name, NOT_TYPING);
+			}
 		} else if (GTK_OLD_EDITABLE(c->entry)->selection_start_pos == 0) {
 			if (GTK_OLD_EDITABLE(c->entry)->selection_end_pos == strlen(txt) &&
 				strlen(txt) > 0 &&
-			    (event->keyval == GDK_BackSpace || event->keyval == GDK_Delete))
-				serv_send_typing(c->gc, c->name, FALSE);
+			    (event->keyval == GDK_BackSpace || event->keyval == GDK_Delete)) {
+				if (c && c->type_again_timeout)
+					gtk_timeout_remove(c->type_again_timeout);
+				serv_send_typing(c->gc, c->name, NOT_TYPING);
+			}
 		}
 		g_free(txt);
 	}