Mercurial > pidgin.yaz
diff pidgin/gtkconv.c @ 27746:e13759a83714
propagate from branch 'im.pidgin.pidgin' (head cff05fbceab1d88163770d13a4c7a6116bdeb8ee)
to branch 'im.pidgin.pidgin.yaz' (head 4c2ca466febbc129edc2012fd6ce5769696116d0)
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Sat, 15 Dec 2007 05:15:31 +0000 |
parents | b9197011ddd6 a53f4b1813df |
children | 2be2eec7d273 |
line wrap: on
line diff
--- a/pidgin/gtkconv.c Sat Dec 15 05:12:24 2007 +0000 +++ b/pidgin/gtkconv.c Sat Dec 15 05:15:31 2007 +0000 @@ -129,6 +129,7 @@ static GtkWidget *invite_dialog = NULL; static GtkWidget *warn_close_dialog = NULL; +static PidginWindow *hidden_convwin = NULL; static GList *window_list = NULL; /* Lists of status icons at all available sizes for use as window icons */ @@ -1379,7 +1380,13 @@ timer = purple_timeout_add_seconds(CLOSE_CONV_TIMEOUT_SECS, close_already, conv); purple_conversation_set_data(conv, "close-timer", GINT_TO_POINTER(timer)); } +#if 0 + /* I will miss you */ purple_conversation_set_ui_ops(conv, NULL); +#else + pidgin_conv_window_remove_gtkconv(gtkconv->win, gtkconv); + pidgin_conv_window_add_gtkconv(hidden_convwin, gtkconv); +#endif } } @@ -2820,6 +2827,9 @@ if (gtkconv == NULL) { pidgin_conv_attach_to_conversation(conv); gtkconv = PIDGIN_CONVERSATION(conv); + } else if (gtkconv->win == hidden_convwin) { + pidgin_conv_window_remove_gtkconv(hidden_convwin, gtkconv); + pidgin_conv_placement_place(gtkconv); } pidgin_conv_switch_active_conversation(conv); @@ -2852,20 +2862,15 @@ PurpleConversation *conv = (PurpleConversation*)l->data; PidginConversation *gtkconv = PIDGIN_CONVERSATION(conv); - if (gtkconv != NULL && gtkconv->active_conv != conv) + if(gtkconv == NULL || gtkconv->active_conv != conv) continue; - if (gtkconv == NULL) { - if (!purple_conversation_get_data(conv, "unseen-count") || - !purple_conversation_get_data(conv, "unseen-state") || - GPOINTER_TO_INT(purple_conversation_get_data(conv, "unseen-state"))<min_state) - continue; + + if (gtkconv->unseen_state >= min_state + && (!hidden_only || + (hidden_only && gtkconv->win == hidden_convwin))) { + r = g_list_prepend(r, conv); c++; - } else { - if (gtkconv->unseen_state >= min_state && !hidden_only) { - r = g_list_prepend(r, conv); - c++; - } } } @@ -2908,8 +2913,8 @@ GdkPixbuf *pbuf = pidgin_conv_get_icon(conv, icon, PIDGIN_ICON_SIZE_TANGO_MICROSCOPIC); GtkWidget *item; gchar *text = g_strdup_printf("%s (%d)", - gtkconv ? gtk_label_get_text(GTK_LABEL(gtkconv->tab_label)) : purple_conversation_get_name(conv), - gtkconv ? gtkconv->unseen_count : GPOINTER_TO_INT(purple_conversation_get_data(conv, "unseen-count"))); + gtk_label_get_text(GTK_LABEL(gtkconv->tab_label)), + gtkconv->unseen_count); gtk_image_set_from_pixbuf(GTK_IMAGE(icon), pbuf); g_object_unref(pbuf); @@ -3183,7 +3188,7 @@ PurpleConversation *conv; GtkWidget *item; - if (win->window == NULL) + if (win->window == NULL || win == hidden_convwin) return; gtkconv = pidgin_conv_window_get_active_gtkconv(win); @@ -4423,7 +4428,7 @@ pad_bottom = gtk_text_view_get_pixels_below_lines(GTK_TEXT_VIEW(gtkconv->entry)); pad_inside = gtk_text_view_get_pixels_inside_wrap(GTK_TEXT_VIEW(gtkconv->entry)); - height = (oneline.height + pad_top + pad_bottom) * lines; + height = (oneline.height + pad_top + pad_bottom) * MAX(lines, 2); height += (oneline.height + pad_inside) * (wrapped_lines - lines); gtkconv->auto_resize = TRUE; @@ -4455,7 +4460,7 @@ { GtkWidget *hbox, *label; PidginChatPane *gtkchat = gtkconv->u.chat; - + hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); @@ -4604,16 +4609,25 @@ conv = gtkconv->active_conv; if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { node = (PurpleBlistNode*)(purple_blist_find_chat(conv->account, conv->name)); +#if 0 + /* Using the transient blist nodes to show the tooltip doesn't quite work yet. */ + if (!node) + node = g_object_get_data(G_OBJECT(gtkconv->imhtml), "transient_chat"); +#endif } else { node = (PurpleBlistNode*)(purple_find_buddy(conv->account, conv->name)); - } - - if (node) +#if 0 + if (!node) + node = g_object_get_data(G_OBJECT(gtkconv->imhtml), "transient_buddy"); +#endif + } + + if (node) pidgin_blist_draw_tooltip(node, gtkconv->infopane); return FALSE; } -static void +static void pidgin_conv_leave_cb (GtkWidget *w, GdkEventCrossing *e, PidginConversation *gtkconv) { pidgin_blist_tooltip_destroy(); @@ -5050,9 +5064,6 @@ GtkWidget *tab_cont; PurpleBlistNode *convnode; - if (hidden) - return; - if (conv_type == PURPLE_CONV_TYPE_IM && (gtkconv = pidgin_conv_find_gtkconv(conv))) { conv->ui_data = gtkconv; if (!g_list_find(gtkconv->convs, conv)) @@ -5152,7 +5163,10 @@ G_CALLBACK(gtk_widget_grab_focus), gtkconv->entry); - pidgin_conv_placement_place(gtkconv); + if (hidden) + pidgin_conv_window_add_gtkconv(hidden_convwin, gtkconv); + else + pidgin_conv_placement_place(gtkconv); if (nick_colors == NULL) { nbr_nick_colors = NUM_NICK_COLORS; @@ -5160,13 +5174,11 @@ } } -#if 0 static void pidgin_conv_new_hidden(PurpleConversation *conv) { private_gtkconv_new(conv, TRUE); } -#endif void pidgin_conv_new(PurpleConversation *conv) @@ -5182,24 +5194,30 @@ PurpleConversation *conv, PurpleMessageFlags flags) { PurpleConversationUiOps *ui_ops = pidgin_conversations_get_conv_ui_ops(); + gboolean hide = FALSE; /* create hidden conv if hide_new pref is always */ - /* or if hide_new pref is away and account is away */ - if ((strcmp(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/im/hide_new"), "always") == 0) || - (strcmp(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/im/hide_new"), "away") == 0 && - !purple_status_is_available(purple_account_get_active_status(account)))) { - if (!conv) { - ui_ops->create_conversation = NULL; - conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, sender); - purple_conversation_set_ui_ops(conv, NULL); - ui_ops->create_conversation = pidgin_conv_new; - } else { - /* TODO: update the unseen_state data on the conv here */ - } - } else { - /* new message for an IM */ - if (conv && conv->type == PURPLE_CONV_TYPE_IM) - pidgin_conv_attach_to_conversation(conv); + if (strcmp(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/im/hide_new"), "always") == 0) + hide = TRUE; + + /* create hidden conv if hide_new pref is away and account is away */ + if (strcmp(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/im/hide_new"), "away") == 0 && + !purple_status_is_available(purple_account_get_active_status(account))) + hide = TRUE; + + if (conv && PIDGIN_IS_PIDGIN_CONVERSATION(conv) && !hide) { + PidginConversation *gtkconv = PIDGIN_CONVERSATION(conv); + if (gtkconv->win == hidden_convwin) { + pidgin_conv_window_remove_gtkconv(gtkconv->win, gtkconv); + pidgin_conv_placement_place(gtkconv); + } + return; + } + + if (hide) { + ui_ops->create_conversation = pidgin_conv_new_hidden; + purple_conversation_new(PURPLE_CONV_TYPE_IM, account, sender); + ui_ops->create_conversation = pidgin_conv_new; } } @@ -5208,9 +5226,6 @@ { PidginConversation *gtkconv = PIDGIN_CONVERSATION(conv); - if (!gtkconv) - return; - gtkconv->convs = g_list_remove(gtkconv->convs, conv); /* Don't destroy ourselves until all our convos are gone */ if (gtkconv->convs) { @@ -6553,7 +6568,6 @@ gboolean ellipsis = FALSE; /* I think this is a little longer than it needs to be but I'm lazy. */ char *style; - gboolean bold = FALSE; if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) im = PURPLE_CONV_IM(conv); @@ -6575,8 +6589,29 @@ markup = title; } } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { - const char *topic = gtk_entry_get_text(GTK_ENTRY(gtkconv->u.chat->topic_text)); - char *esc = topic ? g_markup_escape_text(topic, -1) : NULL; + const char *topic = gtkconv->u.chat->topic_text ? gtk_entry_get_text(GTK_ENTRY(gtkconv->u.chat->topic_text)) : NULL; + char *esc = NULL; +#if GTK_CHECK_VERSION(2,6,0) + esc = topic ? g_markup_escape_text(topic, -1) : NULL; +#else + /* GTK < 2.6 doesn't have auto ellipsization, so we do a crude + * trucation to prevent forcing the window to be as wide as the topic */ + int len = 0; + char *c, *tmp = g_strdup(topic); + c = tmp; + while(*c && len < 72) { + c = g_utf8_next_char(c); + len++; + } + if (len == 72) { + *c = '\0'; + c = g_strdup_printf("%s...", tmp); + g_free(tmp); + tmp = c; + } + esc = tmp ? g_markup_escape_text(tmp, -1) : NULL; + g_free(tmp); +#endif markup = g_strdup_printf("%s%s<span color='%s' size='smaller'>%s</span>", purple_conversation_get_title(conv), esc && *esc ? "\n" : "", @@ -6588,7 +6623,7 @@ CONV_TEXT_COLUMN, markup, -1); /* XXX seanegan Why do I have to do this? */ gtk_widget_queue_draw(gtkconv->infopane); - + if (title != markup) g_free(markup); @@ -6599,47 +6634,43 @@ if (im != NULL && purple_conv_im_get_typing_state(im) == PURPLE_TYPING) { atk_object_set_description(accessibility_obj, _("Typing")); - style = "color=\"#4e9a06\""; + style = "tab-label-typing"; } else if (im != NULL && purple_conv_im_get_typing_state(im) == PURPLE_TYPED) { atk_object_set_description(accessibility_obj, _("Stopped Typing")); - style = "color=\"#c4a000\""; + style = "tab-label-typed"; } else if (gtkconv->unseen_state == PIDGIN_UNSEEN_NICK) { atk_object_set_description(accessibility_obj, _("Nick Said")); - style = "color=\"#204a87\""; + style = "tab-label-attention"; } else if (gtkconv->unseen_state == PIDGIN_UNSEEN_TEXT) { atk_object_set_description(accessibility_obj, _("Unread Messages")); if (gtkconv->active_conv->type == PURPLE_CONV_TYPE_CHAT) - style = "color=\"#cc0000\""; + style = "tab-label-unreadchat"; else - style = "color=\"#204a87\""; + style = "tab-label-attention"; } else if (gtkconv->unseen_state == PIDGIN_UNSEEN_EVENT) { atk_object_set_description(accessibility_obj, _("New Event")); - style = "color=\"#888a85\""; + style = "tab-label-event"; } else { style = NULL; } - + + gtk_widget_set_name(gtkconv->tab_label, style); + gtk_label_set_text(GTK_LABEL(gtkconv->tab_label), title); + gtk_widget_set_state(gtkconv->tab_label, GTK_STATE_ACTIVE); + if (gtkconv->unseen_state == PIDGIN_UNSEEN_TEXT || gtkconv->unseen_state == PIDGIN_UNSEEN_NICK || - gtkconv->unseen_state == PIDGIN_UNSEEN_EVENT) - bold = TRUE; - - if (style || bold) - { - char *html_title,*label; - - html_title = g_markup_escape_text(title_tmp, -1); - label = g_strdup_printf("<span %s %s>%s</span>", - style ? style : "", - bold ? "weight=\"bold\"" : "", - html_title); - g_free(html_title); - gtk_label_set_markup(GTK_LABEL(gtkconv->tab_label), label); - g_free(label); - } - else - gtk_label_set_text(GTK_LABEL(gtkconv->tab_label), title_tmp); + gtkconv->unseen_state == PIDGIN_UNSEEN_EVENT) { + PangoAttrList *list = pango_attr_list_new(); + PangoAttribute *attr = pango_attr_weight_new(PANGO_WEIGHT_BOLD); + attr->start_index = 0; + attr->end_index = -1; + pango_attr_list_insert(list, attr); + gtk_label_set_attributes(GTK_LABEL(gtkconv->tab_label), list); + pango_attr_list_unref(list); + } else + gtk_label_set_attributes(GTK_LABEL(gtkconv->tab_label), NULL); if (pidgin_conv_window_is_active_conversation(conv)) update_typing_icon(gtkconv); @@ -6720,7 +6751,6 @@ unseen = PIDGIN_UNSEEN_TEXT; conv_set_unseen(conv, unseen); - purple_conversation_update(conv, PURPLE_CONV_UPDATE_UNSEEN); } } @@ -7244,7 +7274,6 @@ account_status_changed_cb(PurpleAccount *account, PurpleStatus *oldstatus, PurpleStatus *newstatus) { -#if 0 GList *l; PurpleConversation *conv = NULL; PidginConversation *gtkconv; @@ -7254,7 +7283,27 @@ if(purple_status_is_available(oldstatus) || !purple_status_is_available(newstatus)) return; -#endif + + while ((l = hidden_convwin->gtkconvs) != NULL) + { + gtkconv = l->data; + + conv = gtkconv->active_conv; + + while(l && !purple_status_is_available( + purple_account_get_active_status( + purple_conversation_get_account(conv)))) + l = l->next; + if (!l) + break; + + pidgin_conv_window_remove_gtkconv(hidden_convwin, gtkconv); + pidgin_conv_placement_place(gtkconv); + + /* TODO: do we need to do anything for any other conversations that are in the same gtkconv here? + * I'm a little concerned that not doing so will cause the "pending" indicator in the gtkblist not to be cleared. -DAA*/ + purple_conversation_update(conv, PURPLE_CONV_UPDATE_UNSEEN); + } } static void @@ -7262,25 +7311,35 @@ gconstpointer value, gpointer data) { GList *l; + PurpleConversation *conv = NULL; + PidginConversation *gtkconv; gboolean when_away = FALSE; + if(!hidden_convwin) + return; + if(strcmp(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/im/hide_new"), "always")==0) return; if(strcmp(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/im/hide_new"), "away")==0) when_away = TRUE; - for (l = purple_get_conversations(); l; l = l->next) + for (l = hidden_convwin->gtkconvs; l; ) { - PurpleConversation *conv = l->data; - PidginConversation *gtkconv = PIDGIN_CONVERSATION(conv); - if (gtkconv) + gtkconv = l->data; + l = l->next; + + conv = gtkconv->active_conv; + + if (conv->type == PURPLE_CONV_TYPE_CHAT || + gtkconv->unseen_count == 0 || + (when_away && !purple_status_is_available( + purple_account_get_active_status( + purple_conversation_get_account(conv))))) continue; - if(when_away && !purple_status_is_available( - purple_account_get_active_status( - purple_conversation_get_account(conv)))) - continue; - pidgin_conv_attach_to_conversation(conv); + + pidgin_conv_window_remove_gtkconv(hidden_convwin, gtkconv); + pidgin_conv_placement_place(gtkconv); } } @@ -7550,10 +7609,13 @@ purple_conversation_set_data(conv, "unseen-count", NULL); purple_conversation_set_data(conv, "unseen-state", NULL); purple_conversation_set_ui_ops(conv, pidgin_conversations_get_conv_ui_ops()); - private_gtkconv_new(conv, FALSE); + if (!PIDGIN_CONVERSATION(conv)) + private_gtkconv_new(conv, FALSE); timer = GPOINTER_TO_INT(purple_conversation_get_data(conv, "close-timer")); - if (timer) + if (timer) { purple_timeout_remove(timer); + purple_conversation_set_data(conv, "close-timer", NULL); + } } gboolean pidgin_conv_attach_to_conversation(PurpleConversation *conv) @@ -7561,8 +7623,22 @@ GList *list; PidginConversation *gtkconv; - if (PIDGIN_IS_PIDGIN_CONVERSATION(conv)) - return FALSE; + if (PIDGIN_IS_PIDGIN_CONVERSATION(conv)) { + /* This is pretty much always the case now. */ + gtkconv = PIDGIN_CONVERSATION(conv); + if (gtkconv->win != hidden_convwin) + return FALSE; + pidgin_conv_window_remove_gtkconv(hidden_convwin, gtkconv); + pidgin_conv_placement_place(gtkconv); + purple_signal_emit(pidgin_conversations_get_handle(), + "conversation-displayed", gtkconv); + list = gtkconv->convs; + while (list) { + pidgin_conv_attach(list->data); + list = list->next; + } + return TRUE; + } pidgin_conv_attach(conv); gtkconv = PIDGIN_CONVERSATION(conv); @@ -7783,17 +7859,17 @@ purple_value_new(PURPLE_TYPE_INT)); purple_signal_register(handle, "conversation-switched", - purple_marshal_VOID__POINTER_POINTER, NULL, 1, + purple_marshal_VOID__POINTER, NULL, 1, purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONVERSATION)); purple_signal_register(handle, "conversation-hiding", - purple_marshal_VOID__POINTER_POINTER, NULL, 1, + purple_marshal_VOID__POINTER, NULL, 1, purple_value_new(PURPLE_TYPE_BOXED, "PidginConversation *")); purple_signal_register(handle, "conversation-displayed", - purple_marshal_VOID__POINTER_POINTER, NULL, 1, + purple_marshal_VOID__POINTER, NULL, 1, purple_value_new(PURPLE_TYPE_BOXED, "PidginConversation *")); @@ -7835,6 +7911,9 @@ purple_conversations_set_ui_ops(&conversation_ui_ops); + hidden_convwin = pidgin_conv_window_new(); + window_list = g_list_remove(window_list, hidden_convwin); + purple_signal_connect(purple_accounts_get_handle(), "account-status-changed", handle, PURPLE_CALLBACK(account_status_changed_cb), NULL); @@ -7874,6 +7953,41 @@ PURPLE_CALLBACK(wrote_msg_update_unseen_cb), NULL); purple_signal_connect(purple_conversations_get_handle(), "wrote-chat-msg", handle, PURPLE_CALLBACK(wrote_msg_update_unseen_cb), NULL); + + { + /* Set default tab colors */ + GString *str = g_string_new(NULL); + GtkSettings *settings = gtk_settings_get_default(); + struct { + const char *stylename; + const char *labelname; + const char *color; + } styles[] = { + {"pidgin_tab_label_typing_default", "tab-label-typing", "#4e9a06"}, + {"pidgin_tab_label_typed_default", "tab-label-typed", "#c4a000"}, + {"pidgin_tab_label_attention_default", "tab-label-attention", "#006aff"}, + {"pidgin_tab_label_unreadchat_default", "tab-label-unreadchat", "#cc0000"}, + {"pidgin_tab_label_event_default", "tab-label-event", "#888a85"}, + {NULL, NULL, NULL} + }; + int iter; + for (iter = 0; styles[iter].stylename; iter++) { + if (!gtk_rc_get_style_by_paths(settings, styles[iter].labelname, NULL, G_TYPE_NONE)) + /* Apparently both ACTIVE and NORMAL are required */ + g_string_append_printf(str, "style \"%s\" {\n" + "fg[ACTIVE] = \"%s\"\n" + "}\n" + "widget \"*%s\" style \"%s\"\n", + styles[iter].stylename, + styles[iter].color, + styles[iter].labelname, styles[iter].stylename); + } + gtk_rc_parse_string(str->str); + g_string_free(str, TRUE); +#if GTK_CHECK_VERSION(2,4,0) + gtk_rc_reset_styles(settings); +#endif + } } void @@ -8708,7 +8822,7 @@ gtk_entry_get_text(entry)); } serv_alias_buddy(buddy); - } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { + } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { gtk_entry_set_text(GTK_ENTRY(gtkconv->u.chat->topic_text), gtk_entry_get_text(entry)); topic_callback(NULL, gtkconv); } @@ -8719,7 +8833,7 @@ infopane_entry_activate(PidginConversation *gtkconv) { GtkWidget *entry = NULL; - PurpleConversation *conv = gtkconv->active_conv; + PurpleConversation *conv = gtkconv->active_conv; const char *text = NULL; if (!GTK_WIDGET_VISIBLE(gtkconv->tab_label)) { @@ -8735,9 +8849,21 @@ if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { PurpleBuddy *buddy = purple_find_buddy(gtkconv->active_conv->account, gtkconv->active_conv->name); if (!buddy) + /* This buddy isn't in your buddy list, so we can't alias him */ return FALSE; + text = purple_buddy_get_contact_alias(buddy); } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { + PurpleConnection *gc; + PurplePluginProtocolInfo *prpl_info = NULL; + + gc = purple_conversation_get_gc(conv); + if (gc != NULL) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + if (prpl_info && prpl_info->set_chat_topic == NULL) + /* This protocol doesn't support setting the chat room topic */ + return FALSE; + text = purple_conv_chat_get_topic(PURPLE_CONV_CHAT(conv)); } @@ -8756,10 +8882,9 @@ g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(alias_cb), gtkconv); g_signal_connect(G_OBJECT(entry), "focus-out-event", G_CALLBACK(alias_focus_cb), gtkconv); g_signal_connect(G_OBJECT(entry), "key-press-event", G_CALLBACK(alias_key_press_cb), gtkconv); - - - - gtk_entry_set_text(GTK_ENTRY(entry), text); + + if (text != NULL) + gtk_entry_set_text(GTK_ENTRY(entry), text); gtk_widget_show(entry); gtk_widget_hide(gtkconv->infopane); gtk_widget_grab_focus(entry); @@ -9049,8 +9174,6 @@ if (win->dialogs.search) gtk_widget_destroy(win->dialogs.search); - gtk_widget_hide_all(win->window); - if (win->gtkconvs) { while (win->gtkconvs) { gboolean last = (win->gtkconvs->next == NULL); @@ -9104,7 +9227,7 @@ ptr = gdk_cursor_new(GDK_LEFT_PTR); } - gtk_label_set_markup(label, "×"); + gtk_label_set_markup(label, "×"); gdk_window_set_cursor(event->window, ptr); return FALSE; } @@ -9117,7 +9240,7 @@ hand = gdk_cursor_new(GDK_HAND2); } - gtk_label_set_markup(label, "<u>×</u>"); + gtk_label_set_markup(label, "<u>×</u>"); gdk_window_set_cursor(event->window, hand); return FALSE; } @@ -9147,7 +9270,7 @@ gtk_event_box_set_visible_window(GTK_EVENT_BOX(gtkconv->close), FALSE); #endif gtk_widget_set_events(gtkconv->close, GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); - close_image = gtk_label_new("×"); + close_image = gtk_label_new("×"); g_signal_connect(G_OBJECT(gtkconv->close), "enter-notify-event", G_CALLBACK(close_button_entered_cb), close_image); g_signal_connect(G_OBJECT(gtkconv->close), "leave-notify-event", G_CALLBACK(close_button_left_cb), close_image); gtk_widget_show(close_image); @@ -9176,6 +9299,7 @@ /* Tab label. */ gtkconv->tab_label = gtk_label_new(tmp_lab = purple_conversation_get_title(conv)); + gtk_widget_set_name(gtkconv->tab_label, "tab-label"); gtkconv->menu_tabby = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); gtkconv->menu_label = gtk_label_new(tmp_lab); @@ -9335,7 +9459,7 @@ if (win->gtkconvs && win->gtkconvs->next == NULL) pidgin_conv_tab_pack(win, win->gtkconvs->data); - if (!win->gtkconvs) + if (!win->gtkconvs && win != hidden_convwin) pidgin_conv_window_destroy(win); } @@ -9874,7 +9998,9 @@ gboolean pidgin_conv_is_hidden(PidginConversation *gtkconv) { - return (gtkconv == NULL); + g_return_val_if_fail(gtkconv != NULL, FALSE); + + return (gtkconv->win == hidden_convwin); } @@ -9975,5 +10101,3 @@ return colors; } - -