# HG changeset patch # User Gary Kramlich # Date 1126926012 0 # Node ID 11d30825c1bb78eec61160557a7b384e2a94e191 # Parent 78aad676fdb2bacd1f4452ec0dc2b9950df0880b [gaim-migrate @ 13812] Source Forge patch 1273590 from Casey Harkins to move all sound playing events into gtksound.[ch] as well as a few other clean ups to make sure that all sounds are being played by the ui. committer: Tailor Script diff -r 78aad676fdb2 -r 11d30825c1bb COPYRIGHT --- a/COPYRIGHT Thu Sep 15 14:54:23 2005 +0000 +++ b/COPYRIGHT Sat Sep 17 03:00:12 2005 +0000 @@ -92,6 +92,7 @@ Christian Hammond Erick Hamness Fred Hampton +Casey Harkins Andy Harrison Andrew Hart (arhart) G. Sumner Hayes diff -r 78aad676fdb2 -r 11d30825c1bb src/conversation.c --- a/src/conversation.c Thu Sep 15 14:54:23 2005 +0000 +++ b/src/conversation.c Sat Sep 17 03:00:12 2005 +0000 @@ -54,30 +54,6 @@ static void conv_placement_last_created_win(GaimConversation *conv); static gboolean -find_nick(const char *nick, const char *message) -{ - char *msg, *who, *p; - int n; - gboolean ret = FALSE; - - msg = g_utf8_strdown(message, -1); - - who = g_utf8_strdown(nick, -1); - n = strlen(who); - - if ((p = strstr(msg, who)) != NULL) { - if ((p == msg || !isalnum(*(p - 1))) && !isalnum(*(p + n))) { - ret = TRUE; - } - } - - g_free(who); - g_free(msg); - - return ret; -} - -static gboolean reset_typing(gpointer data) { GaimConversation *c = (GaimConversation *)data; @@ -1907,7 +1883,7 @@ } else { flags |= GAIM_MESSAGE_RECV; - if (find_nick(chat->nick, message)) + if (gaim_utf8_has_word(message, chat->nick)) flags |= GAIM_MESSAGE_NICK; } diff -r 78aad676fdb2 -r 11d30825c1bb src/gtkconv.c --- a/src/gtkconv.c Thu Sep 15 14:54:23 2005 +0000 +++ b/src/gtkconv.c Sat Sep 17 03:00:12 2005 +0000 @@ -5036,33 +5036,9 @@ time_t mtime) { GaimGtkConversation *gtkconv; - GaimConvWindow *gaimwin; - GaimGtkWindow *gtkwin; - gboolean has_focus; gtkconv = GAIM_GTK_CONVERSATION(conv); gtkconv->active_conv = conv; - gaimwin = gaim_conversation_get_window(conv); - gtkwin = GAIM_GTK_WINDOW(gaimwin); - - g_object_get(G_OBJECT(gtkwin->window), "has-toplevel-focus", &has_focus, NULL); - - /* Play a sound, if specified in prefs. */ - if (gtkconv->make_sound && !((gaim_conv_window_get_active_conversation(gaimwin) == conv) && - !gaim_prefs_get_bool("/gaim/gtk/sound/conv_focus") && has_focus)) { - if (flags & GAIM_MESSAGE_RECV) { - if (gtkconv->u.im->a_virgin && - gaim_prefs_get_bool("/gaim/gtk/sound/enabled/first_im_recv")) { - - gaim_sound_play_event(GAIM_SOUND_FIRST_RECEIVE); - } - else - gaim_sound_play_event(GAIM_SOUND_RECEIVE); - } - else { - gaim_sound_play_event(GAIM_SOUND_SEND); - } - } gtkconv->u.im->a_virgin = FALSE; @@ -5074,35 +5050,9 @@ const char *message, GaimMessageFlags flags, time_t mtime) { GaimGtkConversation *gtkconv; - GaimConvWindow *gaimwin; - GaimGtkWindow *gtkwin; - gboolean has_focus; gtkconv = GAIM_GTK_CONVERSATION(conv); gtkconv->active_conv = conv; - gaimwin = gaim_conversation_get_window(conv); - gtkwin = GAIM_GTK_WINDOW(gaimwin); - - g_object_get(G_OBJECT(gtkwin->window), "has-toplevel-focus", &has_focus, NULL); - - /* Play a sound, if specified in prefs. */ - if (gtkconv->make_sound && !((gaim_conv_window_get_active_conversation(gaimwin) == conv) && - !gaim_prefs_get_bool("/gaim/gtk/sound/conv_focus") && has_focus) && - !(flags & GAIM_MESSAGE_DELAYED) && - !(flags & GAIM_MESSAGE_SYSTEM)) { - - if (!(flags & GAIM_MESSAGE_WHISPER) && (flags & GAIM_MESSAGE_SEND)) - gaim_sound_play_event(GAIM_SOUND_CHAT_YOU_SAY); - else if (flags & GAIM_MESSAGE_RECV) { - if ((flags & GAIM_MESSAGE_NICK) && - gaim_prefs_get_bool("/gaim/gtk/sound/enabled/nick_said")) { - - gaim_sound_play_event(GAIM_SOUND_CHAT_NICK); - } - else - gaim_sound_play_event(GAIM_SOUND_CHAT_SAY); - } - } flags |= GAIM_MESSAGE_COLORIZE; @@ -5564,8 +5514,6 @@ gtk_label_set_text(GTK_LABEL(gtkchat->count), tmp); - if (gtkconv->make_sound) - gaim_sound_play_event(GAIM_SOUND_CHAT_LEAVE); } static void diff -r 78aad676fdb2 -r 11d30825c1bb src/gtksound.c --- a/src/gtksound.c Thu Sep 15 14:54:23 2005 +0000 +++ b/src/gtksound.c Sat Sep 17 03:00:12 2005 +0000 @@ -42,6 +42,7 @@ #include "sound.h" #include "util.h" +#include "gtkconv.h" #include "gtksound.h" struct gaim_sound_event { @@ -83,6 +84,136 @@ return FALSE; } +static gboolean +chat_nick_matches_name(GaimConversation *conv, const char *aname) +{ + GaimConvChat *chat = NULL; + char *nick = NULL; + char *name = NULL; + gboolean ret = FALSE; + chat = gaim_conversation_get_chat_data(conv); + + if (chat==NULL) + return ret; + + nick = g_strdup(gaim_normalize(conv->account, chat->nick)); + name = g_strdup(gaim_normalize(conv->account, aname)); + + if (g_utf8_collate(nick, name) == 0) + ret = TRUE; + + g_free(nick); + g_free(name); + + return ret; +} + +/* + * play a sound event for a conversation, honoring make_sound flag + * of conversation and checking for focus if conv_focus pref is set + */ +static void +play_conv_event(GaimConversation *conv, GaimSoundEventID event) +{ + GaimGtkConversation *gtkconv; + GaimConvWindow *gaimwin; + GaimGtkWindow *gtkwin; + gboolean has_focus; + + if (conv==NULL) + gaim_sound_play_event(event); + + gtkconv = GAIM_GTK_CONVERSATION(conv); + gaimwin = gaim_conversation_get_window(conv); + gtkwin = GAIM_GTK_WINDOW(gaimwin); + + g_object_get(G_OBJECT(gtkwin->window), "has-toplevel-focus", + &has_focus, NULL); + + if (gtkconv->make_sound && + !((gaim_conv_window_get_active_conversation(gaimwin) == conv) && + !gaim_prefs_get_bool("/gaim/gtk/sound/conv_focus") && has_focus)) { + + gaim_sound_play_event(event); + } +} + +static void +buddy_state_cb(GaimBuddy *buddy, GaimSoundEventID event) +{ + gaim_sound_play_event(event); +} + +static void +im_msg_received_cb(GaimAccount *account, char *sender, + char *message, GaimConversation *conv, + int flags, GaimSoundEventID event) +{ + if (conv==NULL) + gaim_sound_play_event(GAIM_SOUND_FIRST_RECEIVE); + else + play_conv_event(conv, event); +} + +static void +im_msg_sent_cb(GaimAccount *account, const char *receiver, + const char *message, GaimSoundEventID event) +{ + GaimConversation *conv = gaim_find_conversation_with_account( + GAIM_CONV_TYPE_ANY, receiver, account); + play_conv_event(conv, event); +} + +static void +chat_buddy_join_cb(GaimConversation *conv, const char *name, + GaimConvChatBuddyFlags flags, GaimSoundEventID event) +{ + if (!chat_nick_matches_name(conv, name)) + play_conv_event(conv, event); +} + +static void +chat_buddy_left_cb(GaimConversation *conv, const char *name, + const char *reason, GaimSoundEventID event) +{ + if (!chat_nick_matches_name(conv, name)) + play_conv_event(conv, event); +} + +static void +chat_msg_sent_cb(GaimAccount *account, const char *message, + int id, GaimSoundEventID event) +{ + GaimConnection *conn = gaim_account_get_connection(account); + GaimConversation *conv = NULL; + + if (conn!=NULL) + conv = gaim_find_chat(conn,id); + + play_conv_event(conv, event); +} + +static void +chat_msg_received_cb(GaimAccount *account, char *sender, + char *message, GaimConversation *conv, + int flags, GaimSoundEventID event) +{ + GaimConvChat *chat; + + chat = gaim_conversation_get_chat_data(conv); + + if (chat!=NULL && gaim_conv_chat_is_user_ignored(chat, sender)) + return; + + if (chat_nick_matches_name(conv, sender)) + return; + + if (flags & GAIM_CONV_CHAT_ALERT || gaim_utf8_has_word(message, chat->nick)) + play_conv_event(conv, GAIM_SOUND_CHAT_NICK); + else + play_conv_event(conv, event); +} + /* * We mute sounds for the 10 seconds after you log in so that * you don't get flooded with sounds when the blist shows all @@ -155,6 +286,8 @@ gaim_gtk_sound_init(void) { void *gtk_sound_handle = gaim_gtk_sound_get_handle(); + void *blist_handle = gaim_blist_get_handle(); + void *conv_handle = gaim_conversations_get_handle(); gaim_signal_connect(gaim_connections_get_handle(), "signed-on", gtk_sound_handle, GAIM_CALLBACK(account_signon_cb), @@ -197,6 +330,31 @@ gaim_prefs_connect_callback(gaim_gtk_sound_get_handle(), "/gaim/gtk/sound/method", _pref_sound_method_changed, NULL); + + gaim_signal_connect(blist_handle, "buddy-signed-on", + gtk_sound_handle, GAIM_CALLBACK(buddy_state_cb), + GINT_TO_POINTER(GAIM_SOUND_BUDDY_ARRIVE)); + gaim_signal_connect(blist_handle, "buddy-signed-off", + gtk_sound_handle, GAIM_CALLBACK(buddy_state_cb), + GINT_TO_POINTER(GAIM_SOUND_BUDDY_LEAVE)); + gaim_signal_connect(conv_handle, "received-im-msg", + gtk_sound_handle, GAIM_CALLBACK(im_msg_received_cb), + GINT_TO_POINTER(GAIM_SOUND_RECEIVE)); + gaim_signal_connect(conv_handle, "sent-im-msg", + gtk_sound_handle, GAIM_CALLBACK(im_msg_sent_cb), + GINT_TO_POINTER(GAIM_SOUND_SEND)); + gaim_signal_connect(conv_handle, "chat-buddy-joined", + gtk_sound_handle, GAIM_CALLBACK(chat_buddy_join_cb), + GINT_TO_POINTER(GAIM_SOUND_CHAT_JOIN)); + gaim_signal_connect(conv_handle, "chat-buddy-left", + gtk_sound_handle, GAIM_CALLBACK(chat_buddy_left_cb), + GINT_TO_POINTER(GAIM_SOUND_CHAT_LEAVE)); + gaim_signal_connect(conv_handle, "sent-chat-msg", + gtk_sound_handle, GAIM_CALLBACK(chat_msg_sent_cb), + GINT_TO_POINTER(GAIM_SOUND_CHAT_YOU_SAY)); + gaim_signal_connect(conv_handle, "received-chat-msg", + gtk_sound_handle, GAIM_CALLBACK(chat_msg_received_cb), + GINT_TO_POINTER(GAIM_SOUND_CHAT_SAY)); } static void @@ -206,6 +364,8 @@ ao_shutdown(); #endif sound_initialized = FALSE; + + gaim_signals_disconnect_by_handle(gaim_gtk_sound_get_handle()); } #ifdef USE_AO diff -r 78aad676fdb2 -r 11d30825c1bb src/sound.c --- a/src/sound.c Thu Sep 15 14:54:23 2005 +0000 +++ b/src/sound.c Sat Sep 17 03:00:12 2005 +0000 @@ -54,12 +54,6 @@ sound_ui_ops->play_event(event); } -static void -sound_triggered_cb(GaimBuddy *buddy, GaimSoundEventID event) -{ - gaim_sound_play_event(event); -} - void gaim_sound_set_ui_ops(GaimSoundUiOps *ops) { @@ -94,12 +88,6 @@ gaim_prefs_add_none("/core/sound"); gaim_prefs_add_bool("/core/sound/while_away", FALSE); - gaim_signal_connect(blist_handle, "buddy-signed-on", - handle, GAIM_CALLBACK(sound_triggered_cb), - GINT_TO_POINTER(GAIM_SOUND_BUDDY_ARRIVE)); - gaim_signal_connect(blist_handle, "buddy-signed-off", - handle, GAIM_CALLBACK(sound_triggered_cb), - GINT_TO_POINTER(GAIM_SOUND_BUDDY_LEAVE)); } void diff -r 78aad676fdb2 -r 11d30825c1bb src/util.c --- a/src/util.c Thu Sep 15 14:54:23 2005 +0000 +++ b/src/util.c Sat Sep 17 03:00:12 2005 +0000 @@ -3373,6 +3373,31 @@ return ret; } +/* previously conversation::find_nick() */ +gboolean +gaim_utf8_has_word(const char *haystack, const char *needle) +{ + char *hay, *pin, *p; + int n; + gboolean ret = FALSE; + + hay = g_utf8_strdown(haystack, -1); + + pin = g_utf8_strdown(needle, -1); + n = strlen(pin); + + if ((p = strstr(hay, pin)) != NULL) { + if ((p == hay || !isalnum(*(p - 1))) && !isalnum(*(p + n))) { + ret = TRUE; + } + } + + g_free(pin); + g_free(hay); + + return ret; +} + gboolean gaim_message_meify(char *message, size_t len) { char *c; diff -r 78aad676fdb2 -r 11d30825c1bb src/util.h --- a/src/util.h Thu Sep 15 14:54:23 2005 +0000 +++ b/src/util.h Sat Sep 17 03:00:12 2005 +0000 @@ -796,6 +796,18 @@ int gaim_utf8_strcasecmp(const char *a, const char *b); /** + * Case insensitive search for a word in a string. The needle string + * must be contained in the haystack string and not be immediately + * preceded or immediately followed by another alpha-numeric character. + * + * @param haystack The string to search in. + * @param needle The substring to find. + * + * @return TRUE if haystack has the word, otherwise FALSE + */ +gboolean gaim_utf8_has_word(const char *haystack, const char *needle); + +/** * Checks for messages starting with "/me " * * @param message The message to check