# HG changeset patch # User Richard Laager # Date 1141876929 0 # Node ID 465c368366f83d597f4c68c7844a0ee3c9f13363 # Parent d6912eee114efca1ee1dc0f38f66871ac62cbe83 [gaim-migrate @ 15852] Add GAIM_MESSAGE_ACTIVE_ONLY: This allows core plugins to hint to the UI that it should not show a message if a conversation is "inactive". For the GTK+ UI, this means conversations that aren't the active conversation in a contact-aware conversation. With the GTK+ UI, to avoid having such a message logged, you need to either call gaim_conv_im_write() (which will drop the message before logging, or allow it through for both logging and displaying) or set the GAIM_MESSAGE_NO_LOG flag (which obviously suppresses all logging). Look at the Buddy State Notification and Psychic plugins for the examples of each of these techniques, respectively. This fixes a ShowStopperBug. Also, rearrange some stuff in gtkconv.c to make things more clear and remove unused code. committer: Tailor Script diff -r d6912eee114e -r 465c368366f8 plugins/ChangeLog.API --- a/plugins/ChangeLog.API Thu Mar 09 03:11:50 2006 +0000 +++ b/plugins/ChangeLog.API Thu Mar 09 04:02:09 2006 +0000 @@ -169,6 +169,7 @@ * gaim_date() * gaim_date_full(): See gaim_date_format_full() * gaim_strftime(): See gaim_utf8_strftime() + * GAIM_MESSAGE_COLORIZE Added: * gaim_prefs_disconnect_by_handle() @@ -279,6 +280,7 @@ * gaim_gtk_setup_screenname_autocomplete() * gaim_gtk_set_cursor() * gaim_gtk_clear_cursor() + * GAIM_MESSAGE_ACTIVE_ONLY Signals - Changed: (See the Doxygen docs for details on all signals.) * Signal propagation now stops after a handler returns a non-NULL value. diff -r d6912eee114e -r 465c368366f8 plugins/psychic.c --- a/plugins/psychic.c Thu Mar 09 03:11:50 2006 +0000 +++ b/plugins/psychic.c Thu Mar 09 04:02:09 2006 +0000 @@ -58,7 +58,7 @@ if(gaim_prefs_get_bool(PREF_NOTICE)) { gaim_conversation_write(gconv, NULL, _("You feel a disturbance in the force..."), - GAIM_MESSAGE_SYSTEM | GAIM_MESSAGE_NO_LOG, + GAIM_MESSAGE_SYSTEM | GAIM_MESSAGE_NO_LOG | GAIM_MESSAGE_ACTIVE_ONLY, time(NULL)); } diff -r d6912eee114e -r 465c368366f8 plugins/statenotify.c --- a/plugins/statenotify.c Thu Mar 09 03:11:50 2006 +0000 +++ b/plugins/statenotify.c Thu Mar 09 04:02:09 2006 +0000 @@ -25,6 +25,7 @@ if (conv == NULL) return; + g_return_if_fail(conv->type == GAIM_CONV_TYPE_IM); who = gaim_buddy_get_alias(buddy); escaped = g_markup_escape_text(who, -1); @@ -32,7 +33,7 @@ g_snprintf(buf, sizeof(buf), message, escaped); g_free(escaped); - gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); + gaim_conv_im_write(conv->u.im, NULL, buf, GAIM_MESSAGE_SYSTEM | GAIM_MESSAGE_ACTIVE_ONLY, time(NULL)); } static void diff -r d6912eee114e -r 465c368366f8 src/conversation.h --- a/src/conversation.h Thu Mar 09 03:11:50 2006 +0000 +++ b/src/conversation.h Thu Mar 09 04:02:09 2006 +0000 @@ -97,18 +97,25 @@ */ typedef enum { - GAIM_MESSAGE_SEND = 0x0001, /**< Outgoing message. */ - GAIM_MESSAGE_RECV = 0x0002, /**< Incoming message. */ - GAIM_MESSAGE_SYSTEM = 0x0004, /**< System message. */ - GAIM_MESSAGE_AUTO_RESP = 0x0008, /**< Auto response. */ - GAIM_MESSAGE_COLORIZE = 0x0010, /**< Colorize nicks. */ - GAIM_MESSAGE_NICK = 0x0020, /**< Contains your nick. */ - GAIM_MESSAGE_NO_LOG = 0x0040, /**< Do not log. */ - GAIM_MESSAGE_WHISPER = 0x0080, /**< Whispered message. */ - GAIM_MESSAGE_ERROR = 0x0200, /**< Error message. */ - GAIM_MESSAGE_DELAYED = 0x0400, /**< Delayed message. */ - GAIM_MESSAGE_RAW = 0x0800, /**< "Raw" message - don't apply formatting */ - GAIM_MESSAGE_IMAGES = 0x1000 /**< Message contains images */ + GAIM_MESSAGE_SEND = 0x0001, /**< Outgoing message. */ + GAIM_MESSAGE_RECV = 0x0002, /**< Incoming message. */ + GAIM_MESSAGE_SYSTEM = 0x0004, /**< System message. */ + GAIM_MESSAGE_AUTO_RESP = 0x0008, /**< Auto response. */ + GAIM_MESSAGE_ACTIVE_ONLY = 0x0010, /**< Hint to the UI that this + message should not be + shown in conversations + which are only open for + internal UI purposes + (e.g. for contact-aware + conversions). */ + GAIM_MESSAGE_NICK = 0x0020, /**< Contains your nick. */ + GAIM_MESSAGE_NO_LOG = 0x0040, /**< Do not log. */ + GAIM_MESSAGE_WHISPER = 0x0080, /**< Whispered message. */ + GAIM_MESSAGE_ERROR = 0x0200, /**< Error message. */ + GAIM_MESSAGE_DELAYED = 0x0400, /**< Delayed message. */ + GAIM_MESSAGE_RAW = 0x0800, /**< "Raw" message - don't + apply formatting */ + GAIM_MESSAGE_IMAGES = 0x1000 /**< Message contains images */ } GaimMessageFlags; @@ -124,7 +131,6 @@ GAIM_CBFLAGS_FOUNDER = 0x0008, /**< Channel Founder */ GAIM_CBFLAGS_TYPING = 0x0010, /**< Currently typing */ - } GaimConvChatBuddyFlags; #include "account.h" diff -r d6912eee114e -r 465c368366f8 src/gtkconv.c --- a/src/gtkconv.c Thu Mar 09 03:11:50 2006 +0000 +++ b/src/gtkconv.c Thu Mar 09 04:02:09 2006 +0000 @@ -2002,8 +2002,8 @@ return TRUE; } -static void -gaim_gtkconv_set_active_conversation(GaimConversation *conv) +void +gaim_gtkconv_switch_active_conversation(GaimConversation *conv) { GaimGtkConversation *gtkconv; GaimConversation *old_conv; @@ -2099,18 +2099,6 @@ } gaim_signal_emit(gaim_gtk_conversations_get_handle(), "conversation-switched", conv); -} - -void -gaim_gtkconv_switch_active_conversation(GaimConversation *conv) -{ - GaimGtkConversation *gtkconv; - - g_return_if_fail(conv != NULL); - - gtkconv = GAIM_GTK_CONVERSATION(conv); - - gaim_gtkconv_set_active_conversation(conv); gray_stuff_out(gtkconv); update_typing_icon(gtkconv); @@ -2516,7 +2504,7 @@ gaim_gtkconv_placement_place(gtkconv); } - gaim_gtkconv_set_active_conversation(conv); + gaim_gtkconv_switch_active_conversation(conv); gaim_gtk_conv_window_switch_gtkconv(gtkconv->win, gtkconv); gaim_gtk_conv_window_raise(gtkconv->win); gtk_window_present(GTK_WINDOW(gtkconv->win->window)); @@ -4466,6 +4454,7 @@ g_free(gtkconv); } + static void gaim_gtkconv_write_im(GaimConversation *conv, const char *who, const char *message, GaimMessageFlags flags, @@ -4474,21 +4463,17 @@ GaimGtkConversation *gtkconv; gtkconv = GAIM_GTK_CONVERSATION(conv); - gaim_gtkconv_set_active_conversation(conv); - - gaim_conversation_write(conv, who, message, flags, mtime); -} - -static void -gaim_gtkconv_write_chat(GaimConversation *conv, const char *who, - const char *message, GaimMessageFlags flags, time_t mtime) -{ - GaimGtkConversation *gtkconv; - - gtkconv = GAIM_GTK_CONVERSATION(conv); - gaim_gtkconv_set_active_conversation(conv); - - flags |= GAIM_MESSAGE_COLORIZE; + + if (conv != gtkconv->active_conv && + flags & GAIM_MESSAGE_ACTIVE_ONLY) + { + /* Plugins that want these messages suppressed should be + * calling gaim_conv_im_write(), so they get suppressed here, + * before being written to the log. */ + gaim_debug_info("gtkconv", + "Suppressing message for an inactive conversation in gaim_gtkconv_write_im()\n"); + return; + } gaim_conversation_write(conv, who, message, flags, mtime); } @@ -4584,8 +4569,7 @@ GaimPluginProtocolInfo *prpl_info; int gtk_font_options = 0; int gtk_font_options_all = 0; - int max_scrollback_lines = gaim_prefs_get_int( - "/gaim/gtk/conversations/scrollback_lines"); + int max_scrollback_lines; int line_count; char buf2[BUF_LONG]; char *mdate; @@ -4597,19 +4581,32 @@ GaimConversationType type; char *displaying; gboolean plugin_return; - struct tm tm = *(localtime(&mtime)); - + struct tm tm; + + g_return_if_fail(conv != NULL); gtkconv = GAIM_GTK_CONVERSATION(conv); - - if(gaim_prefs_get_bool("/gaim/gtk/conversations/use_smooth_scrolling")) - gtk_font_options_all |= GTK_IMHTML_USE_SMOOTHSCROLLING; - - /* Set the active conversation to the one that just messaged us. */ - /* TODO: consider not doing this if the account is offline or something */ - if (flags & (GAIM_MESSAGE_SEND | GAIM_MESSAGE_RECV)) - gaim_gtkconv_set_active_conversation(conv); + g_return_if_fail(gtkconv != NULL); + + if (conv != gtkconv->active_conv) + { + if (flags & GAIM_MESSAGE_ACTIVE_ONLY) + { + /* Unless this had GAIM_MESSAGE_NO_LOG, this message + * was logged. Plugin writers: if this isn't what + * you wanted, call gaim_conv_im_write() instead of + * gaim_conversation_write(). */ + gaim_debug_info("gtkconv", + "Suppressing message for an inactive conversation in gaim_gtkconv_write_conv()\n"); + return; + } + + /* Set the active conversation to the one that just messaged us. */ + /* TODO: consider not doing this if the account is offline or something */ + if (flags & (GAIM_MESSAGE_SEND | GAIM_MESSAGE_RECV)) + gaim_gtkconv_switch_active_conversation(conv); + } + type = gaim_conversation_get_type(conv); - account = gaim_conversation_get_account(conv); g_return_if_fail(account != NULL); gc = gaim_account_get_connection(account); @@ -4635,6 +4632,8 @@ gtk_text_view_get_buffer(GTK_TEXT_VIEW( gtkconv->imhtml))); + max_scrollback_lines = gaim_prefs_get_int( + "/gaim/gtk/conversations/scrollback_lines"); /* If we're sitting at more than 100 lines more than the max scrollback, trim down to max scrollback */ if (max_scrollback_lines > 0 @@ -4661,9 +4660,13 @@ g_free(tmp); } + if (gaim_prefs_get_bool("/gaim/gtk/conversations/use_smooth_scrolling")) + gtk_font_options_all |= GTK_IMHTML_USE_SMOOTHSCROLLING; + if (gtk_text_buffer_get_char_count(gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->imhtml)))) gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), "
", gtk_font_options_all); + tm = *(localtime(&mtime)); mdate = gaim_signal_emit_return_1(gaim_gtk_conversations_get_handle(), "conversation-timestamp", conv, &tm); @@ -4675,8 +4678,7 @@ mdate = g_strdup(gaim_time_format(&tm)); } - sml_attrib = g_strdup_printf("sml=\"%s\"", - gaim_account_get_protocol_name(account)); + sml_attrib = g_strdup_printf("sml=\"%s\"", gaim_account_get_protocol_name(account)); gtk_font_options |= GTK_IMHTML_NO_COMMENTS; @@ -4783,7 +4785,7 @@ if (flags & GAIM_MESSAGE_NICK) strcpy(color, HIGHLIGHT_COLOR); else if (flags & GAIM_MESSAGE_RECV) { - if (flags & GAIM_MESSAGE_COLORIZE) { + if (type == GAIM_CONV_TYPE_CHAT) { GdkColor *col = get_nick_color(gtkconv, name); g_snprintf(color, sizeof(color), "#%02X%02X%02X", @@ -5698,19 +5700,19 @@ static GaimConversationUiOps conversation_ui_ops = { gaim_gtkconv_new, - gaim_gtkconv_destroy, /* destroy_conversation */ - gaim_gtkconv_write_chat, /* write_chat */ - gaim_gtkconv_write_im, /* write_im */ - gaim_gtkconv_write_conv, /* write_conv */ - gaim_gtkconv_chat_add_users, /* chat_add_users */ - gaim_gtkconv_chat_rename_user, /* chat_rename_user */ - gaim_gtkconv_chat_remove_users, /* chat_remove_users */ - gaim_gtkconv_chat_update_user, /* chat_update_user */ - gaim_gtkconv_present_conversation, /* present */ - gaim_gtkconv_has_focus, /* has_focus */ - gaim_gtkconv_custom_smiley_add, /* custom_smiley_add */ - gaim_gtkconv_custom_smiley_write, /* custom_smiley_write */ - gaim_gtkconv_custom_smiley_close /* custom_smiley_close */ + gaim_gtkconv_destroy, /* destroy_conversation */ + NULL, /* write_chat */ + gaim_gtkconv_write_im, /* write_im */ + gaim_gtkconv_write_conv, /* write_conv */ + gaim_gtkconv_chat_add_users, /* chat_add_users */ + gaim_gtkconv_chat_rename_user, /* chat_rename_user */ + gaim_gtkconv_chat_remove_users, /* chat_remove_users */ + gaim_gtkconv_chat_update_user, /* chat_update_user */ + gaim_gtkconv_present_conversation, /* present */ + gaim_gtkconv_has_focus, /* has_focus */ + gaim_gtkconv_custom_smiley_add, /* custom_smiley_add */ + gaim_gtkconv_custom_smiley_write, /* custom_smiley_write */ + gaim_gtkconv_custom_smiley_close /* custom_smiley_close */ }; GaimConversationUiOps *