Mercurial > pidgin
changeset 3768:f53370197bb9
[gaim-migrate @ 3907]
Tri-state typing notification (typing, typed, and no longer typing) by
Nathan D. Walp
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Sun, 20 Oct 2002 19:38:36 +0000 |
parents | 65e9ea5934c8 |
children | 303e40b66b96 |
files | src/conversation.c src/core.h src/protocols/jabber/jabber.c src/protocols/msn/msn.c src/protocols/oscar/oscar.c src/protocols/yahoo/yahoo.c src/server.c src/ui.h |
diffstat | 8 files changed, 67 insertions(+), 98 deletions(-) [+] |
line wrap: on
line diff
--- a/src/conversation.c Sun Oct 20 19:08:21 2002 +0000 +++ b/src/conversation.c Sun Oct 20 19:38:36 2002 +0000 @@ -2068,19 +2068,16 @@ if (!flags & WFLAG_NOLOG && ((c->is_chat && (chat_options & OPT_CHAT_POPUP)) || (!c->is_chat && (im_options & OPT_IM_POPUP)))) gdk_window_show(c->window->window); - if (flags & WFLAG_RECV) - reset_typing(g_strdup(c->name)); /* tab highlighting */ if (c->is_chat && !(chat_options & OPT_CHAT_ONE_WINDOW)) /* if chat but not tabbed chat */ return; - if (!c->is_chat && !(im_options & OPT_IM_ONE_WINDOW)) /* if convo but not tabbed convo */ - return; if (!(flags & WFLAG_RECV) && !(flags & WFLAG_SYSTEM)) return; if ((c->unseen == 2) || ((c->unseen == 1) && !(flags & WFLAG_NICK))) return; + if (c->is_chat) { int offs; if ((convo_options & OPT_CONVO_COMBINE) && (im_options & OPT_IM_ONE_WINDOW)) @@ -2095,41 +2092,15 @@ g_list_index(conversations, c)) unhighlight = 1; } - if ((c->unseen != -1) && unhighlight) /* If there's no typing message - and we're on the same tab, don't bother - changing the color. */ - return; - - { - GtkNotebook *notebook = GTK_NOTEBOOK(c->is_chat ? chat_notebook : convo_notebook); - int offs = ((convo_options & OPT_CONVO_COMBINE) && - (im_options & OPT_IM_ONE_WINDOW) && c->is_chat) ? - g_list_length(conversations) : 0; - GList *ws = (c->is_chat ? chats : conversations); - GtkWidget *label = gtk_notebook_get_tab_label(notebook, - gtk_notebook_get_nth_page(notebook, - offs + g_list_index(ws, c))); - GtkStyle *style; - style = gtk_style_new(); - if (!GTK_WIDGET_REALIZED(label)) - gtk_widget_realize(label); - gtk_style_set_font(style, gdk_font_ref(gtk_style_get_font(label->style))); - if (!unhighlight && flags & WFLAG_NICK) { - style->fg[0].red = 0x0000; - style->fg[0].green = 0x0000; - style->fg[0].blue = 0xcccc; - c->unseen = 2; - } else if (!unhighlight) { - style->fg[0].red = 0xcccc; - style->fg[0].green = 0x0000; - style->fg[0].blue = 0x0000; - c->unseen = 1; - } else { - c->unseen = 0; - } - gtk_widget_set_style(label, style); - gtk_style_unref(style); + + if (!unhighlight && flags & WFLAG_NICK) { + c->unseen = 2; + } else if (!unhighlight) { + c->unseen = 1; + } else { + c->unseen = 0; } + update_convo_status(c, FALSE); } void update_progress(struct conversation *c, float percent) { @@ -2682,10 +2653,10 @@ gtk_imhtml_to_bottom(c->text); } -void show_typing(struct conversation *c) { - - if (c->is_chat) /* We shouldn't be getting typing notifications from chats. */ +void update_convo_status(struct conversation *c, int typing_state) { + if(!c) return; + debug_printf("update_convo_status called for %s\n", c->name); if (im_options & OPT_IM_ONE_WINDOW) { /* We'll make the tab green */ GtkStyle *style; GtkNotebook *notebook = GTK_NOTEBOOK(c->is_chat ? chat_notebook : convo_notebook); @@ -2700,26 +2671,54 @@ if (!GTK_WIDGET_REALIZED(label)) gtk_widget_realize(label); gtk_style_set_font(style, gdk_font_ref(gtk_style_get_font(label->style))); - style->fg[0].red = 0x0000; - style->fg[0].green = 0x9999; - style->fg[0].blue = 0x0000; + if(typing_state == TYPING) { + style->fg[0].red = 0x0000; + style->fg[0].green = 0x9999; + style->fg[0].blue = 0x0000; + } else if(typing_state == TYPED) { + style->fg[0].red = 0xfffff; + style->fg[0].green = 0xbbbb; + style->fg[0].blue = 0x2222; + } else if(c->unseen == 2) { + style->fg[0].red = 0x0000; + style->fg[0].green = 0x0000; + style->fg[0].blue = 0xcccc; + } else if(c->unseen == 1) { + style->fg[0].red = 0xcccc; + style->fg[0].green = 0x0000; + style->fg[0].blue = 0x0000; + } gtk_widget_set_style(label, style); debug_printf("setting style\n"); gtk_style_unref(style); - c->unseen = -1; } else { GtkWindow *win = (GtkWindow *)c->window; - char *buf; - if (strstr(win->title, " [TYPING]")) - return; - buf = g_malloc(strlen(win->title) + strlen(" [TYPING]") + 1); - g_snprintf(buf, - strlen(win->title) + strlen(" [TYPING]") + 1, "%s [TYPING]", - win->title); + char *buf, *buf2; + int len; + if(strstr(win->title, _(" [TYPING]"))) { + debug_printf("title had TYPING in it\n"); + len = strlen(win->title) - strlen(_(" [TYPING]")); + } else if(strstr(win->title, _(" [TYPED]"))) { + debug_printf("title had TYPED in it\n"); + len = strlen(win->title) - strlen(_(" [TYPED]")); + } else { + debug_printf("title was free of typing information\n"); + len = strlen(win->title); + } + buf = g_malloc(len+1); + g_snprintf(buf, len+1, win->title); + if(typing_state == TYPING) { + buf2 = g_strconcat(buf,_(" [TYPING]")); + g_free(buf); + buf = buf2; + } else if(typing_state == TYPED) { + buf2 = g_strconcat(buf,_(" [TYPED]")); + g_free(buf); + buf = buf2; + } gtk_window_set_title(win, buf); g_free(buf); } - } /* This returns a boolean, so that it can timeout */ @@ -2729,40 +2728,10 @@ g_free(name); return FALSE; } - /* Reset the title (if necessary) */ - if (c->is_chat) { - g_free(name); - c->typing_timeout = 0; - return FALSE; - } - if (!(im_options & OPT_IM_ONE_WINDOW)) { - GtkWindow *win = (GtkWindow*)c->window; - char *new_title; - if (strstr(win->title, " [TYPING]")) { - new_title = g_malloc(strlen(win->title) - strlen("[TYPING]")); - g_snprintf(new_title, strlen(win->title) - strlen("[TYPING]"), win->title); - gtk_window_set_title(win, new_title); - g_free(new_title); - - } - } else if (c->unseen == -1) { - GtkNotebook *notebook = GTK_NOTEBOOK(convo_notebook); - int offs = ((convo_options & OPT_CONVO_COMBINE) && - (im_options & OPT_IM_ONE_WINDOW) && c->is_chat) ? - g_list_length(conversations) : 0; - GList *ws = (conversations); - GtkWidget *label = gtk_notebook_get_tab_label(notebook, - gtk_notebook_get_nth_page(notebook, - offs + g_list_index(ws, c))); - GtkStyle *style; - style = gtk_style_new(); - if (!GTK_WIDGET_REALIZED(label)) - gtk_widget_realize(label); - gtk_style_set_font(style, gdk_font_ref(gtk_style_get_font(label->style))); - c->unseen = 0; - gtk_widget_set_style(label, style); - gtk_style_unref(style); - } + + /* Reset the title (if necessary) */ + update_convo_status(c, FALSE); + g_free(name); c->typing_timeout = 0; return FALSE;
--- a/src/core.h Sun Oct 20 19:08:21 2002 +0000 +++ b/src/core.h Sun Oct 20 19:38:36 2002 +0000 @@ -233,7 +233,7 @@ /* Functions in server.c */ extern void serv_got_update(struct gaim_connection *, char *, int, int, time_t, time_t, int, guint); extern void serv_got_im(struct gaim_connection *, char *, char *, guint32, time_t, gint); -extern void serv_got_typing(struct gaim_connection *, char *, int); +extern void serv_got_typing(struct gaim_connection *, char *, int, int); extern void serv_got_typing_stopped(struct gaim_connection *, char *); extern void serv_got_eviled(struct gaim_connection *, char *, int); extern void serv_got_chat_invite(struct gaim_connection *, char *, char *, char *, GList *);
--- a/src/protocols/jabber/jabber.c Sun Oct 20 19:08:21 2002 +0000 +++ b/src/protocols/jabber/jabber.c Sun Oct 20 19:38:36 2002 +0000 @@ -1348,7 +1348,7 @@ /* a non-message message! */ from = g_strdup_printf("%s@%s", p->from->user, p->from->server); if(typing) - serv_got_typing(GJ_GC(gjc), from, 0); + serv_got_typing(GJ_GC(gjc), from, 0, TYPING); else serv_got_typing_stopped(GJ_GC(gjc), from); g_free(from);
--- a/src/protocols/msn/msn.c Sun Oct 20 19:08:21 2002 +0000 +++ b/src/protocols/msn/msn.c Sun Oct 20 19:38:36 2002 +0000 @@ -656,7 +656,7 @@ if (!g_strncasecmp(content, "Content-Type: text/x-msmsgscontrol\r\n", strlen( "Content-Type: text/x-msmsgscontrol\r\n"))) { if (strstr(content,"TypingUser: ") && !ms->chat) { - serv_got_typing(ms->gc, ms->msguser, MSN_TYPING_RECV_TIMEOUT); + serv_got_typing(ms->gc, ms->msguser, MSN_TYPING_RECV_TIMEOUT, TYPING); return; }
--- a/src/protocols/oscar/oscar.c Sun Oct 20 19:08:21 2002 +0000 +++ b/src/protocols/oscar/oscar.c Sun Oct 20 19:38:36 2002 +0000 @@ -2384,11 +2384,11 @@ } break; case 0x0001: { /* Paused typing */ - serv_got_typing_stopped(gc, sn); + serv_got_typing(gc, sn, 0, TYPED); } break; case 0x0002: { /* Typing */ - serv_got_typing(gc, sn, 0); + serv_got_typing(gc, sn, 0, TYPING); } break; default: { @@ -4323,7 +4323,7 @@ if (typing) { /* I had to leave this. It's just too funny. It reminds me of my sister. */ debug_printf("ohmigod! %s has started typing (DirectIM). He's going to send you a message! *squeal*\n", sn); - serv_got_typing(gc,sn,0); + serv_got_typing(gc,sn,0, TYPING); } else serv_got_typing_stopped(gc,sn); return 1;
--- a/src/protocols/yahoo/yahoo.c Sun Oct 20 19:08:21 2002 +0000 +++ b/src/protocols/yahoo/yahoo.c Sun Oct 20 19:38:36 2002 +0000 @@ -538,7 +538,7 @@ if (!g_strncasecmp(msg, "TYPING", strlen("TYPING"))) { if (*stat == '1') - serv_got_typing(gc, from, 0); + serv_got_typing(gc, from, 0, TYPING); else serv_got_typing_stopped(gc, from); } else if (!g_strncasecmp(msg, "GAME", strlen("GAME"))) {
--- a/src/server.c Sun Oct 20 19:08:21 2002 +0000 +++ b/src/server.c Sun Oct 20 19:38:36 2002 +0000 @@ -856,11 +856,11 @@ do_error_dialog(buf2, NULL, GAIM_INFO); } -void serv_got_typing(struct gaim_connection *gc, char *name, int timeout) { +void serv_got_typing(struct gaim_connection *gc, char *name, int timeout, int state) { struct conversation *cnv = find_conversation(name); if (cnv) { set_convo_gc(cnv, gc); - show_typing(cnv); + update_convo_status(cnv, state); } else return; plugin_event(event_got_typing, gc, name); do_pounce(gc, name, OPT_POUNCE_TYPING); @@ -877,7 +877,7 @@ if (c && c->typing_timeout) { gtk_timeout_remove (c->typing_timeout); } - reset_typing(g_strdup(name)); + update_convo_status(c, NOT_TYPING); } static void close_invite(GtkWidget *w, GtkWidget *w2)
--- a/src/ui.h Sun Oct 20 19:08:21 2002 +0000 +++ b/src/ui.h Sun Oct 20 19:38:36 2002 +0000 @@ -419,7 +419,7 @@ extern void set_hide_icons(); extern void set_convo_titles(); extern void update_progress(struct conversation *, float); -extern void show_typing(struct conversation *); +extern void update_convo_status(struct conversation *, int); extern gboolean reset_typing(char *); extern void set_anim();