# HG changeset patch # User Marcus Lundblad # Date 1246902006 0 # Node ID 42360009f2e510d5617e1a0b7f795da26a06e75d # Parent ca66c299dbbf277cb6dccb548b330247db5ec5a6# Parent 8b17877d3294c7c72d37bd974395ca5efce10e82 propagate from branch 'im.pidgin.pidgin' (head 6836b6429243a0b1f36354530521dda81b509fb5) to branch 'im.pidgin.cpw.attention_ui' (head fef03d6a94e8ed3398f8e3590ad8fca7916e2a32) diff -r ca66c299dbbf -r 42360009f2e5 libpurple/connection.h --- a/libpurple/connection.h Mon Jul 06 16:23:10 2009 +0000 +++ b/libpurple/connection.h Mon Jul 06 17:40:06 2009 +0000 @@ -45,7 +45,7 @@ PURPLE_CONNECTION_NO_URLDESC = 0x0040, /**< Connection does not support descriptions with links */ PURPLE_CONNECTION_NO_IMAGES = 0x0080, /**< Connection does not support sending of images */ PURPLE_CONNECTION_ALLOW_CUSTOM_SMILEY = 0x0100 /**< Connection supports sending and receiving custom smileys */ - + } PurpleConnectionFlags; typedef enum diff -r ca66c299dbbf -r 42360009f2e5 libpurple/conversation.c --- a/libpurple/conversation.c Mon Jul 06 16:23:10 2009 +0000 +++ b/libpurple/conversation.c Mon Jul 06 17:40:06 2009 +0000 @@ -959,6 +959,16 @@ g_free(displayed); } +void +purple_conversation_attention(PurpleConversation *conv, const char *who, + guint type, PurpleMessageFlags flags, time_t mtime) +{ + PurpleAccount *account = purple_conversation_get_account(conv); + purple_signal_emit(purple_conversations_get_handle(), + flags == PURPLE_MESSAGE_SEND ? "sent-attention" : "got-attention", + account, who, conv, type); +} + gboolean purple_conversation_has_focus(PurpleConversation *conv) { @@ -2240,7 +2250,27 @@ purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONVERSATION), purple_value_new(PURPLE_TYPE_UINT)); - + + purple_signal_register(handle, "sent-attention", + purple_marshal_VOID__POINTER_POINTER_POINTER_UINT, + NULL, 4, + purple_value_new(PURPLE_TYPE_SUBTYPE, + PURPLE_SUBTYPE_ACCOUNT), + purple_value_new(PURPLE_TYPE_STRING), + purple_value_new(PURPLE_TYPE_SUBTYPE, + PURPLE_SUBTYPE_CONVERSATION), + purple_value_new(PURPLE_TYPE_UINT)); + + purple_signal_register(handle, "got-attention", + purple_marshal_VOID__POINTER_POINTER_POINTER_UINT, + NULL, 4, + purple_value_new(PURPLE_TYPE_SUBTYPE, + PURPLE_SUBTYPE_ACCOUNT), + purple_value_new(PURPLE_TYPE_STRING), + purple_value_new(PURPLE_TYPE_SUBTYPE, + PURPLE_SUBTYPE_CONVERSATION), + purple_value_new(PURPLE_TYPE_UINT)); + purple_signal_register(handle, "sending-im-msg", purple_marshal_VOID__POINTER_POINTER_POINTER, NULL, 3, diff -r ca66c299dbbf -r 42360009f2e5 libpurple/conversation.h --- a/libpurple/conversation.h Mon Jul 06 16:23:10 2009 +0000 +++ b/libpurple/conversation.h Mon Jul 06 17:40:06 2009 +0000 @@ -645,7 +645,21 @@ const char *message, PurpleMessageFlags flags, time_t mtime); - +/** + * Sends an attention to a conversation window. + * + * This is to be called by prpls to tell UIs to set off the action for + * an attention message + * + * @param conv The conversation + * @param who The user who sent the attention + * @param type The attention type (will be 0 for protocols that only have 1 type) + * @param flags The message flags (send, receive) + * @param mtime The time the attentsion was sent + */ +void purple_conversation_attention(PurpleConversation *conv, const char *who, + guint attention_type, PurpleMessageFlags flags, time_t mtime); + /** Set the features as supported for the given conversation. @param conv The conversation diff -r ca66c299dbbf -r 42360009f2e5 libpurple/internal.h diff -r ca66c299dbbf -r 42360009f2e5 libpurple/protocols/jabber/jabber.c --- a/libpurple/protocols/jabber/jabber.c Mon Jul 06 16:23:10 2009 +0000 +++ b/libpurple/protocols/jabber/jabber.c Mon Jul 06 17:40:06 2009 +0000 @@ -2899,6 +2899,11 @@ { JabberStream *js = conv->account->gc->proto_data; const gchar *who; + gchar *description; + PurpleBuddy *buddy; + const char *alias; + PurpleAttentionType *attn = + purple_get_attention_type_from_code(conv->account, 0); if (!args || !args[0]) { /* use the buddy from conversation, if it's a one-to-one conversation */ @@ -2911,27 +2916,19 @@ who = args[0]; } - if (_jabber_send_buzz(js, who, error)) { - const gchar *alias; - gchar *str; - PurpleBuddy *buddy = - purple_find_buddy(purple_connection_get_account(conv->account->gc), - who); - - if (buddy != NULL) - alias = purple_buddy_get_contact_alias(buddy); - else - alias = who; - - str = g_strdup_printf(_("Buzzing %s..."), alias); - purple_conversation_write(conv, NULL, str, - PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NOTIFY, time(NULL)); - g_free(str); - - return PURPLE_CMD_RET_OK; - } else { - return PURPLE_CMD_RET_FAILED; - } + buddy = purple_find_buddy(conv->account, who); + if (buddy != NULL) + alias = purple_buddy_get_contact_alias(buddy); + else + alias = who; + + description = + g_strdup_printf(purple_attention_type_get_outgoing_desc(attn), alias); + purple_conversation_attention(conv, who, 0, PURPLE_MESSAGE_SEND, time(NULL)); + purple_conversation_write(conv, NULL, description, + PURPLE_MESSAGE_NOTIFY | PURPLE_MESSAGE_SYSTEM, time(NULL)); + g_free(description); + return _jabber_send_buzz(js, who, error) ? PURPLE_CMD_RET_OK : PURPLE_CMD_RET_FAILED; } GList *jabber_attention_types(PurpleAccount *account) diff -r ca66c299dbbf -r 42360009f2e5 libpurple/protocols/jabber/message.c --- a/libpurple/protocols/jabber/message.c Mon Jul 06 16:23:10 2009 +0000 +++ b/libpurple/protocols/jabber/message.c Mon Jul 06 17:40:06 2009 +0000 @@ -290,6 +290,8 @@ static void handle_buzz(JabberMessage *jm) { PurpleBuddy *buddy; PurpleAccount *account; + PurpleConversation *c; + char *username; /* Delayed buzz MUST NOT be accepted */ if(jm->delayed) @@ -304,8 +306,16 @@ if ((buddy = purple_find_buddy(account, jm->from)) == NULL) return; /* Do not accept buzzes from unknown people */ + c = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, jm->from, account); + if (c == NULL) + c = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, jm->from); + + username = g_markup_escape_text(purple_buddy_get_alias(buddy), -1); /* xmpp only has 1 attention type, so index is 0 */ purple_prpl_got_attention(jm->js->gc, jm->from, 0); + purple_conversation_attention(c, jm->from, 0, PURPLE_MESSAGE_RECV, time(NULL)); + + g_free(username); } /* used internally by the functions below */ diff -r ca66c299dbbf -r 42360009f2e5 libpurple/protocols/msn/msg.c --- a/libpurple/protocols/msn/msg.c Mon Jul 06 16:23:10 2009 +0000 +++ b/libpurple/protocols/msn/msg.c Mon Jul 06 17:40:06 2009 +0000 @@ -964,6 +964,8 @@ else purple_prpl_got_attention(account->gc, user, MSN_NUDGE); + purple_conversation_attention(swboard->conv, user, MSN_NUDGE, + PURPLE_MESSAGE_SEND, time(NULL)); } else { purple_prpl_got_attention(account->gc, user, MSN_NUDGE); } diff -r ca66c299dbbf -r 42360009f2e5 libpurple/protocols/msn/msn.c --- a/libpurple/protocols/msn/msn.c Mon Jul 06 16:23:10 2009 +0000 +++ b/libpurple/protocols/msn/msn.c Mon Jul 06 17:40:06 2009 +0000 @@ -162,6 +162,8 @@ username = purple_conversation_get_name(conv); purple_prpl_send_attention(gc, username, MSN_NUDGE); + purple_conversation_attention(conv, username, 0, PURPLE_MESSAGE_SEND, + time(NULL)); return PURPLE_CMD_RET_OK; } diff -r ca66c299dbbf -r 42360009f2e5 libpurple/protocols/msnp9/msn.c --- a/libpurple/protocols/msnp9/msn.c Mon Jul 06 16:23:10 2009 +0000 +++ b/libpurple/protocols/msnp9/msn.c Mon Jul 06 17:40:06 2009 +0000 @@ -775,7 +775,8 @@ gc->proto_data = session; gc->flags |= PURPLE_CONNECTION_HTML | PURPLE_CONNECTION_FORMATTING_WBFO | PURPLE_CONNECTION_NO_BGCOLOR | - PURPLE_CONNECTION_NO_FONTSIZE | PURPLE_CONNECTION_NO_URLDESC | PURPLE_CONNECTION_ALLOW_CUSTOM_SMILEY; + PURPLE_CONNECTION_NO_FONTSIZE | PURPLE_CONNECTION_NO_URLDESC | PURPLE_CONNECTION_ALLOW_CUSTOM_SMILEY | + PURPLE_CONNECTION_ALLOW_ATTENTION; msn_session_set_login_step(session, MSN_LOGIN_STEP_START); diff -r ca66c299dbbf -r 42360009f2e5 libpurple/protocols/yahoo/libymsg.c --- a/libpurple/protocols/yahoo/libymsg.c Mon Jul 06 16:23:10 2009 +0000 +++ b/libpurple/protocols/yahoo/libymsg.c Mon Jul 06 17:40:06 2009 +0000 @@ -1071,6 +1071,8 @@ } username = g_markup_escape_text(from, -1); purple_prpl_got_attention(gc, username, YAHOO_BUZZ); + purple_conversation_attention(c, username, 0, PURPLE_MESSAGE_RECV, + time(NULL)); g_free(username); g_free(m); g_free(im); @@ -4846,6 +4848,7 @@ return PURPLE_CMD_RET_FAILED; purple_prpl_send_attention(account->gc, c->name, YAHOO_BUZZ); + purple_conversation_attention(c, c->name, 0, PURPLE_MESSAGE_SEND, time(NULL)); return PURPLE_CMD_RET_OK; } diff -r ca66c299dbbf -r 42360009f2e5 libpurple/sound.h --- a/libpurple/sound.h Mon Jul 06 16:23:10 2009 +0000 +++ b/libpurple/sound.h Mon Jul 06 17:40:06 2009 +0000 @@ -51,6 +51,8 @@ PURPLE_SOUND_CHAT_SAY, /**< Someone else says somthing in a chat. */ PURPLE_SOUND_POUNCE_DEFAULT, /**< Default sound for a buddy pounce. */ PURPLE_SOUND_CHAT_NICK, /**< Someone says your name in a chat. */ + PURPLE_SOUND_SEND_ATTENTION, /**< Send an attention */ + PURPLE_SOUND_GOT_ATTENTION, /**< Got an attention */ PURPLE_NUM_SOUNDS /**< Total number of sounds. */ } PurpleSoundEventID; diff -r ca66c299dbbf -r 42360009f2e5 pidgin/gtkconv.c --- a/pidgin/gtkconv.c Mon Jul 06 16:23:10 2009 +0000 +++ b/pidgin/gtkconv.c Mon Jul 06 17:40:06 2009 +0000 @@ -1231,6 +1231,20 @@ } static void +menu_get_attention_cb(gpointer data, guint action, GtkWidget *widget) +{ + PidginWindow *win = data; + PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); + + if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { + purple_prpl_send_attention(purple_conversation_get_gc(conv), + purple_conversation_get_name(conv), 0); + purple_conversation_attention(conv, purple_conversation_get_name(conv), + 0, PURPLE_MESSAGE_SEND, time(NULL)); + } +} + +static void menu_add_pounce_cb(gpointer data, guint action, GtkWidget *widget) { PidginWindow *win = data; @@ -2296,6 +2310,11 @@ gtkconv = PIDGIN_CONVERSATION(conv); old_conv = gtkconv->active_conv; + purple_debug_info("gtkconv", "setting active conversation on toolbar %p\n", + conv); + gtk_imhtmltoolbar_switch_active_conversation(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), + conv); + if (old_conv == conv) return; @@ -3157,6 +3176,7 @@ #endif { N_("/Conversation/Se_nd File..."), NULL, menu_send_file_cb, 0, "", PIDGIN_STOCK_TOOLBAR_SEND_FILE }, + { N_("/Conversation/Get _Attention"), NULL, menu_get_attention_cb, 0, "", PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION }, { N_("/Conversation/Add Buddy _Pounce..."), NULL, menu_add_pounce_cb, 0, "", NULL }, { N_("/Conversation/_Get Info"), "O", menu_get_info_cb, 0, @@ -3484,6 +3504,9 @@ gtk_item_factory_get_widget(win->menu.item_factory, N_("/Conversation/Send File...")); + win->menu.get_attention = + gtk_item_factory_get_widget(win->menu.item_factory, + N_("/Conversation/Get Attention")); win->menu.add_pounce = gtk_item_factory_get_widget(win->menu.item_factory, N_("/Conversation/Add Buddy Pounce...")); @@ -6398,6 +6421,7 @@ /* Deal with menu items */ gtk_widget_show(win->menu.view_log); gtk_widget_show(win->menu.send_file); + gtk_widget_show(win->menu.get_attention); gtk_widget_show(win->menu.add_pounce); gtk_widget_show(win->menu.get_info); gtk_widget_hide(win->menu.invite); @@ -6426,6 +6450,7 @@ /* Deal with menu items */ gtk_widget_show(win->menu.view_log); gtk_widget_hide(win->menu.send_file); + gtk_widget_hide(win->menu.get_attention); gtk_widget_hide(win->menu.add_pounce); gtk_widget_hide(win->menu.get_info); gtk_widget_show(win->menu.invite); @@ -6533,6 +6558,7 @@ gtk_widget_set_sensitive(win->menu.send_file, (prpl_info->send_file != NULL && (!prpl_info->can_receive_file || prpl_info->can_receive_file(gc, purple_conversation_get_name(conv))))); + gtk_widget_set_sensitive(win->menu.get_attention, (prpl_info->send_attention != NULL)); gtk_widget_set_sensitive(win->menu.alias, (account != NULL) && (purple_find_buddy(account, purple_conversation_get_name(conv)) != NULL)); @@ -6553,6 +6579,7 @@ /* Then deal with menu items */ gtk_widget_set_sensitive(win->menu.view_log, TRUE); gtk_widget_set_sensitive(win->menu.send_file, FALSE); + gtk_widget_set_sensitive(win->menu.get_attention, FALSE); gtk_widget_set_sensitive(win->menu.add_pounce, TRUE); gtk_widget_set_sensitive(win->menu.get_info, FALSE); gtk_widget_set_sensitive(win->menu.invite, FALSE); @@ -6858,6 +6885,7 @@ } } + static PurpleConversationUiOps conversation_ui_ops = { pidgin_conv_new, diff -r ca66c299dbbf -r 42360009f2e5 pidgin/gtkconvwin.h --- a/pidgin/gtkconvwin.h Mon Jul 06 16:23:10 2009 +0000 +++ b/pidgin/gtkconvwin.h Mon Jul 06 17:40:06 2009 +0000 @@ -51,6 +51,7 @@ GtkWidget *view_log; GtkWidget *send_file; + GtkWidget *get_attention; GtkWidget *add_pounce; GtkWidget *get_info; GtkWidget *invite; diff -r ca66c299dbbf -r 42360009f2e5 pidgin/gtkimhtmltoolbar.c --- a/pidgin/gtkimhtmltoolbar.c Mon Jul 06 16:23:10 2009 +0000 +++ b/pidgin/gtkimhtmltoolbar.c Mon Jul 06 17:40:06 2009 +0000 @@ -33,6 +33,7 @@ #include "request.h" #include "pidginstock.h" #include "util.h" +#include "debug.h" #include "gtkdialogs.h" #include "gtkimhtmltoolbar.h" @@ -913,6 +914,18 @@ gtk_widget_grab_focus(toolbar->imhtml); } +static void send_attention_cb(GtkWidget *attention, GtkIMHtmlToolbar *toolbar) +{ + PurpleConversation *conv = toolbar->active_conv; + const gchar *who = purple_conversation_get_name(conv); + PurpleConnection *gc = purple_conversation_get_gc(conv); + + toggle_button_set_active_block(GTK_TOGGLE_BUTTON(toolbar->attention), FALSE, + toolbar); + purple_conversation_attention(conv, who, 0, PURPLE_MESSAGE_SEND, time(NULL)); + purple_prpl_send_attention(gc, who, 0); +} + static void update_buttons_cb(GtkIMHtml *imhtml, GtkIMHtmlButtons buttons, GtkIMHtmlToolbar *toolbar) { gtk_widget_set_sensitive(GTK_WIDGET(toolbar->bold), buttons & GTK_IMHTML_BOLD); @@ -1232,6 +1245,8 @@ {PIDGIN_STOCK_TOOLBAR_INSERT_LINK, insert_link_cb, &toolbar->link, _("Insert Link")}, {PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE, insert_image_cb, &toolbar->image, _("Insert IM Image")}, {PIDGIN_STOCK_TOOLBAR_SMILEY, insert_smiley_cb, &toolbar->smiley, _("Insert Smiley")}, + {PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION, send_attention_cb, &toolbar->attention, + _("Send Attention")}, {NULL, NULL, NULL, NULL} }; int iter; @@ -1297,6 +1312,7 @@ GtkWidget *insert_button; GtkWidget *font_button; GtkWidget *smiley_button; + GtkWidget *attention_button; GtkWidget *font_menu; GtkWidget *insert_menu; GtkWidget *menuitem; @@ -1438,6 +1454,32 @@ g_signal_connect_swapped(G_OBJECT(smiley_button), "clicked", G_CALLBACK(gtk_button_clicked), toolbar->smiley); gtk_widget_show_all(smiley_button); + /* Sep */ + sep = gtk_vseparator_new(); + gtk_box_pack_start(GTK_BOX(box), sep, FALSE, FALSE, 0); + gtk_widget_show_all(sep); + + /* Attention */ + attention_button = gtk_button_new(); + gtk_button_set_relief(GTK_BUTTON(attention_button), GTK_RELIEF_NONE); + bbox = gtk_hbox_new(FALSE, 3); + gtk_container_add(GTK_CONTAINER(attention_button), bbox); + image = gtk_image_new_from_stock(PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION, + gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)); + gtk_box_pack_start(GTK_BOX(bbox), image, FALSE, FALSE, 0); + label = gtk_label_new_with_mnemonic(_("_Attention!")); + gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(box), attention_button, FALSE, FALSE, 0); + g_signal_connect_swapped(G_OBJECT(attention_button), "clicked", + G_CALLBACK(gtk_button_clicked), toolbar->attention); + gtk_widget_show_all(attention_button); + + g_signal_connect(G_OBJECT(toolbar->attention), "notify::sensitive", + G_CALLBACK(button_sensitiveness_changed), attention_button); + + /* set attention button to be greyed out until we get a conversation */ + gtk_widget_set_sensitive(toolbar->attention, FALSE); + gtk_box_pack_start(GTK_BOX(hbox), box, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(hbox), "lean-view", box); gtk_widget_show(box); @@ -1519,3 +1561,21 @@ g_free(toolbar->sml); toolbar->sml = g_strdup(proto_id); } + +void gtk_imhtmltoolbar_switch_active_conversation(GtkIMHtmlToolbar *toolbar, + PurpleConversation *conv) +{ + PurpleConnection *gc = purple_conversation_get_gc(conv); + PurplePlugin *prpl = purple_connection_get_prpl(gc); + + purple_debug_info("gtkimhtmltoolbar", "switch active conversation to %p\n", + conv); + toolbar->active_conv = conv; + + /* gray out attention button on protocols that don't support it + for the time being it is always disabled for chats */ + gtk_widget_set_sensitive(toolbar->attention, + conv && prpl && purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM && + PURPLE_PLUGIN_PROTOCOL_INFO(prpl)->send_attention != NULL); +} + diff -r ca66c299dbbf -r 42360009f2e5 pidgin/gtkimhtmltoolbar.h --- a/pidgin/gtkimhtmltoolbar.h Mon Jul 06 16:23:10 2009 +0000 +++ b/pidgin/gtkimhtmltoolbar.h Mon Jul 06 17:40:06 2009 +0000 @@ -65,7 +65,8 @@ GtkWidget *image; GtkWidget *link; GtkWidget *smiley; - + GtkWidget *attention; + GtkWidget *font_dialog; GtkWidget *fgcolor_dialog; GtkWidget *bgcolor_dialog; @@ -77,6 +78,8 @@ GtkWidget *strikethrough; GtkWidget *insert_hr; GtkWidget *call; + + PurpleConversation *active_conv; }; struct _GtkIMHtmlToolbarClass { @@ -90,6 +93,8 @@ void gtk_imhtmltoolbar_attach (GtkIMHtmlToolbar *toolbar, GtkWidget *imhtml); void gtk_imhtmltoolbar_associate_smileys (GtkIMHtmlToolbar *toolbar, const char *proto_id); +void gtk_imhtmltoolbar_switch_active_conversation(GtkIMHtmlToolbar *toolbar, + PurpleConversation *conv); #ifdef __cplusplus } diff -r ca66c299dbbf -r 42360009f2e5 pidgin/gtksound.c --- a/pidgin/gtksound.c Mon Jul 06 16:23:10 2009 +0000 +++ b/pidgin/gtksound.c Mon Jul 06 17:40:06 2009 +0000 @@ -72,7 +72,9 @@ {N_("Others talk in chat"), "chat_msg_recv", "receive.wav"}, /* this isn't a terminator, it's the buddy pounce default sound event ;-) */ {NULL, "pounce_default", "alert.wav"}, - {N_("Someone says your username in chat"), "nick_said", "alert.wav"} + {N_("Someone says your username in chat"), "nick_said", "alert.wav"}, + {N_("Attention received"), "got_attention", "alert.wav"}, + {N_("Attention sent"), "sent_attention", "alert.wav"} }; static gboolean @@ -217,6 +219,20 @@ play_conv_event(conv, event); } +static void +sent_attention_cb(PurpleAccount *account, const char *who, + PurpleConversation *conv, guint type, PurpleSoundEventID event) +{ + play_conv_event(conv, event); +} + +static void +got_attention_cb(PurpleAccount *account, const char *who, + PurpleConversation *conv, guint type, PurpleSoundEventID event) +{ + 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 @@ -297,6 +313,10 @@ purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/sound/enabled/pounce_default", TRUE); purple_prefs_add_path(PIDGIN_PREFS_ROOT "/sound/file/pounce_default", ""); purple_prefs_add_string(PIDGIN_PREFS_ROOT "/sound/theme", ""); + purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/sound/enabled/sent_attention", TRUE); + purple_prefs_add_path(PIDGIN_PREFS_ROOT "/sound/file/sent_attention", ""); + purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/sound/enabled/got_attention", TRUE); + purple_prefs_add_path(PIDGIN_PREFS_ROOT "/sound/file/got_attention", ""); purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/sound/conv_focus", TRUE); purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/sound/mute", FALSE); purple_prefs_add_path(PIDGIN_PREFS_ROOT "/sound/command", ""); @@ -343,6 +363,12 @@ purple_signal_connect(conv_handle, "received-chat-msg", gtk_sound_handle, PURPLE_CALLBACK(chat_msg_received_cb), GINT_TO_POINTER(PURPLE_SOUND_CHAT_SAY)); + purple_signal_connect(conv_handle, "sent-attention", gtk_sound_handle, + PURPLE_CALLBACK(sent_attention_cb), + GINT_TO_POINTER(PURPLE_SOUND_SEND_ATTENTION)); + purple_signal_connect(conv_handle, "got-attention", gtk_sound_handle, + PURPLE_CALLBACK(got_attention_cb), + GINT_TO_POINTER(PURPLE_SOUND_GOT_ATTENTION)); } static void diff -r ca66c299dbbf -r 42360009f2e5 pidgin/pidginstock.c --- a/pidgin/pidginstock.c Mon Jul 06 16:23:10 2009 +0000 +++ b/pidgin/pidginstock.c Mon Jul 06 17:40:06 2009 +0000 @@ -204,6 +204,7 @@ { PIDGIN_STOCK_TOOLBAR_VIDEO_CALL, "toolbar", "video-call.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, { PIDGIN_STOCK_TOOLBAR_AUDIO_VIDEO_CALL, "toolbar", "audio-video-call.png", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, #endif + { PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION, "toolbar", "get-attention.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL } }; const SizedStockIcon sized_status_icons [] = { diff -r ca66c299dbbf -r 42360009f2e5 pidgin/pidginstock.h --- a/pidgin/pidginstock.h Mon Jul 06 16:23:10 2009 +0000 +++ b/pidgin/pidginstock.h Mon Jul 06 17:40:06 2009 +0000 @@ -159,6 +159,7 @@ #define PIDGIN_STOCK_TOOLBAR_VIDEO_CALL "pidgin-video-call" #define PIDGIN_STOCK_TOOLBAR_AUDIO_VIDEO_CALL "pidgin-audio-video-call" #endif +#define PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION "pidgin-send-attention" /* Tray icons */ #define PIDGIN_STOCK_TRAY_AVAILABLE "pidgin-tray-available" diff -r ca66c299dbbf -r 42360009f2e5 pidgin/pixmaps/Makefile.am --- a/pidgin/pixmaps/Makefile.am Mon Jul 06 16:23:10 2009 +0000 +++ b/pidgin/pixmaps/Makefile.am Mon Jul 06 17:40:06 2009 +0000 @@ -445,6 +445,8 @@ toolbar/16/transfer.png \ toolbar/16/unblock.png \ toolbar/16/video-call.png + toolbar/16/unblock.png \ + toolbar/16/get-attention.png TOOLBAR_22_SCALABLE = \ toolbar/22/scalable/select-avatar.svg