# HG changeset patch # User Sean Egan # Date 1172476191 0 # Node ID f322fa6c5318846733a7bbe3b035745083639ff1 # Parent 72d66bc51c432291cd14604a1c5ca703a464883a Typing notification icon diff -r 72d66bc51c43 -r f322fa6c5318 pidgin/gtkconv.c --- a/pidgin/gtkconv.c Mon Feb 26 06:24:18 2007 +0000 +++ b/pidgin/gtkconv.c Mon Feb 26 07:49:51 2007 +0000 @@ -3105,6 +3105,40 @@ } } +static gboolean +typing_animation(gpointer data) { + PidginConversation *gtkconv = data; + const char *stock_id = NULL; + PidginWindow *gtkwin = gtkconv->win; + switch (rand() % 5) { + case 0: + stock_id = PIDGIN_STOCK_ANIMATION_TYPING0; + break; + case 1: + stock_id = PIDGIN_STOCK_ANIMATION_TYPING1; + break; + case 2: + stock_id = PIDGIN_STOCK_ANIMATION_TYPING2; + break; + case 3: + stock_id = PIDGIN_STOCK_ANIMATION_TYPING3; + break; + case 4: + stock_id = PIDGIN_STOCK_ANIMATION_TYPING4; + break; + } + if (gtkwin->menu.typing_icon == NULL) { + gtkwin->menu.typing_icon = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU); + pidgin_menu_tray_append(PIDGIN_MENU_TRAY(gtkwin->menu.tray), + gtkwin->menu.typing_icon, + _("User is typing...")); + } else { + gtk_image_set_from_stock(GTK_IMAGE(gtkwin->menu.typing_icon), stock_id, GTK_ICON_SIZE_MENU); + } + gtk_widget_show(gtkwin->menu.typing_icon); + return TRUE; +} + static void update_typing_icon(PidginConversation *gtkconv) { @@ -3123,19 +3157,27 @@ gtk_widget_hide(gtkwin->menu.typing_icon); } - if (!im || (gaim_conv_im_get_typing_state(im) == GAIM_NOT_TYPING)) + if (!im || (gaim_conv_im_get_typing_state(im) == GAIM_NOT_TYPING)) { + if (gtkconv->u.im->typing_timer != 0) + g_source_remove(gtkconv->u.im->typing_timer); return; + } if (gaim_conv_im_get_typing_state(im) == GAIM_TYPING) { - stock_id = PIDGIN_STOCK_TOOLBAR_TYPING; + if (gtkconv->u.im->typing_timer == 0) { + gtkconv->u.im->typing_timer = g_timeout_add(250, typing_animation, gtkconv); + } + stock_id = PIDGIN_STOCK_ANIMATION_TYPING1; tooltip = _("User is typing..."); } else { - stock_id = PIDGIN_STOCK_TYPED; + stock_id = PIDGIN_STOCK_ANIMATION_TYPING0; tooltip = _("User has typed something and stopped"); + g_source_remove(gtkconv->u.im->typing_timer); + gtkconv->u.im->typing_timer = 0; } if (gtkwin->menu.typing_icon == NULL) - { + { gtkwin->menu.typing_icon = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU); pidgin_menu_tray_append(PIDGIN_MENU_TRAY(gtkwin->menu.tray), gtkwin->menu.typing_icon, @@ -4398,6 +4440,7 @@ focus_chain = g_list_prepend(focus_chain, gtkconv->entry); gtk_container_set_focus_chain(GTK_CONTAINER(vbox2), focus_chain); + gtkconv->u.im->typing_timer = 0; return paned; } diff -r 72d66bc51c43 -r f322fa6c5318 pidgin/gtkconv.h --- a/pidgin/gtkconv.h Mon Feb 26 06:24:18 2007 +0000 +++ b/pidgin/gtkconv.h Mon Feb 26 07:49:51 2007 +0000 @@ -84,6 +84,7 @@ GtkWidget *sep2; GtkWidget *check; GtkWidget *progress; + guint32 typing_timer; /* Buddy icon stuff */ GtkWidget *icon_container;