aboutsummaryrefslogtreecommitdiffstats
path: root/protocols
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2010-08-20 00:42:11 +0100
committerWilmer van der Gaast <wilmer@gaast.net>2010-08-20 00:42:11 +0100
commitbad41f567bd8b8e04d092e8e6771fee74b205032 (patch)
tree6895c70705eabfe0543835a0f012a373f527d1b6 /protocols
parentacd7959038aa74be7e4c05a206ba2882b15fd16b (diff)
libpurple: Fix typing notifications (in and out). Closes #671.
Diffstat (limited to 'protocols')
-rw-r--r--protocols/bee_user.c2
-rw-r--r--protocols/nogaim.h2
-rw-r--r--protocols/purple/purple.c50
3 files changed, 41 insertions, 13 deletions
diff --git a/protocols/bee_user.c b/protocols/bee_user.c
index 5acd5b83..db7842a0 100644
--- a/protocols/bee_user.c
+++ b/protocols/bee_user.c
@@ -240,7 +240,7 @@ void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, ui
imcb_log( ic, "Message from unknown handle %s:\n%s", handle, msg );
}
-void imcb_buddy_typing( struct im_connection *ic, char *handle, uint32_t flags )
+void imcb_buddy_typing( struct im_connection *ic, const char *handle, uint32_t flags )
{
bee_user_t *bu;
diff --git a/protocols/nogaim.h b/protocols/nogaim.h
index be67bb24..3407236f 100644
--- a/protocols/nogaim.h
+++ b/protocols/nogaim.h
@@ -309,7 +309,7 @@ G_MODULE_EXPORT struct buddy *imcb_find_buddy( struct im_connection *ic, char *h
G_MODULE_EXPORT void imcb_rename_buddy( struct im_connection *ic, const char *handle, const char *realname );
G_MODULE_EXPORT void imcb_buddy_nick_hint( struct im_connection *ic, const char *handle, const char *nick );
-G_MODULE_EXPORT void imcb_buddy_typing( struct im_connection *ic, char *handle, uint32_t flags );
+G_MODULE_EXPORT void imcb_buddy_typing( struct im_connection *ic, const char *handle, uint32_t flags );
G_MODULE_EXPORT struct bee_user *imcb_buddy_by_handle( struct im_connection *ic, const char *handle );
G_MODULE_EXPORT void imcb_clean_handle( struct im_connection *ic, char *handle );
diff --git a/protocols/purple/purple.c b/protocols/purple/purple.c
index c7cfcfda..5522c0fc 100644
--- a/protocols/purple/purple.c
+++ b/protocols/purple/purple.c
@@ -426,23 +426,16 @@ static void purple_keepalive( struct im_connection *ic )
static int purple_send_typing( struct im_connection *ic, char *who, int flags )
{
PurpleTypingState state = PURPLE_NOT_TYPING;
- PurpleConversation *conv;
+ PurpleAccount *pa = ic->proto_data;
if( flags & OPT_TYPING )
state = PURPLE_TYPING;
else if( flags & OPT_THINKING )
state = PURPLE_TYPED;
- if( ( conv = purple_find_conversation_with_account( PURPLE_CONV_TYPE_IM,
- who, ic->proto_data ) ) == NULL )
- {
- purple_conv_im_set_typing_state( purple_conversation_get_im_data( conv ), state );
- return 1;
- }
- else
- {
- return 0;
- }
+ serv_send_typing( purple_account_get_connection( pa ), who, state );
+
+ return 1;
}
static void purple_chat_msg( struct groupchat *gc, char *message, int flags )
@@ -808,6 +801,32 @@ static void prplcb_conv_im( PurpleConversation *conv, const char *who, const cha
imcb_buddy_msg( ic, (char*) who, (char*) message, 0, mtime );
}
+/* No, this is not a ui_op but a signal. */
+static void prplcb_buddy_typing( PurpleAccount *account, const char *who, gpointer null )
+{
+ PurpleConversation *conv;
+ PurpleConvIm *im;
+ int state;
+
+ if( ( conv = purple_find_conversation_with_account( PURPLE_CONV_TYPE_IM, who, account ) ) == NULL )
+ return;
+
+ im = PURPLE_CONV_IM(conv);
+ switch( purple_conv_im_get_typing_state( im ) )
+ {
+ case PURPLE_TYPING:
+ state = OPT_TYPING;
+ break;
+ case PURPLE_TYPED:
+ state = OPT_THINKING;
+ break;
+ default:
+ state = 0;
+ }
+
+ imcb_buddy_typing( purple_ic_by_pa( account ), who, state );
+}
+
static PurpleConversationUiOps bee_conv_uiops =
{
prplcb_conv_new, /* create_conversation */
@@ -1138,6 +1157,15 @@ void purple_initmodule()
/* Meh? */
purple_prefs_load();
+ /* No, really. So far there were ui_ops for everything, but now suddenly
+ one needs to use signals for typing notification stuff. :-( */
+ purple_signal_connect( purple_conversations_get_handle(), "buddy-typing",
+ &funcs, PURPLE_CALLBACK(prplcb_buddy_typing), NULL );
+ purple_signal_connect( purple_conversations_get_handle(), "buddy-typed",
+ &funcs, PURPLE_CALLBACK(prplcb_buddy_typing), NULL );
+ purple_signal_connect( purple_conversations_get_handle(), "buddy-typing-stopped",
+ &funcs, PURPLE_CALLBACK(prplcb_buddy_typing), NULL );
+
memset( &funcs, 0, sizeof( funcs ) );
funcs.login = purple_login;
funcs.init = purple_init;