# # old_revision [0650760cfada782b67cad4bdb61334dccc84701b] # # patch "pidgin/gtkblist.c" # from [b52220ccb089bc988a4f6d3b7bd1922e812d5b8f] # to [049c3e34d9ca34a38a0998e6c95e5edcabf37450] # # patch "pidgin/gtkscrollbook.c" # from [f9c19ef06b850114fca3c67db3a2b089503239a0] # to [5a53af6d62a64b4ca8b24af84decf0161fb1dbcc] # # patch "pidgin/gtkscrollbook.h" # from [20613d163ce0b07eb6cf55d1f8eb27889d694c75] # to [dc05d1813ddc65ea353fdf7c209aea7102a3cb2b] # ============================================================ --- pidgin/gtkblist.c b52220ccb089bc988a4f6d3b7bd1922e812d5b8f +++ pidgin/gtkblist.c 049c3e34d9ca34a38a0998e6c95e5edcabf37450 @@ -4226,18 +4226,36 @@ static void _prefs_change_sort_method(co pidgin_blist_sort_method_set(val); } -static void account_modified(PurpleAccount *account, PidginBuddyList *gtkblist) +static void fixup_notebook(PidginBuddyList *gtkblist) { + int errors = 0; GList *list; - if (!gtkblist) - return; + PidginBuddyListPrivate *priv; - if ((list = purple_accounts_get_all_active()) != NULL) { + priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist); + + /* this is far too ugly thanks to me not wanting to fix #3989 properly right now */ + if (priv->error_scrollbook != NULL) { +#if GTK_CHECK_VERSION(2,2,0) + errors = gtk_notebook_get_n_pages(GTK_NOTEBOOK(priv->error_scrollbook->notebook)); +#else + errors = g_list_length(GTK_NOTEBOOK(priv->error_scrollbook->notebook)->children); +#endif + } + if ((list = purple_accounts_get_all_active()) != NULL || errors || + (list = gtk_container_get_children(GTK_CONTAINER(priv->error_scrollbook)))) { gtk_notebook_set_current_page(GTK_NOTEBOOK(gtkblist->notebook), 1); g_list_free(list); } else gtk_notebook_set_current_page(GTK_NOTEBOOK(gtkblist->notebook), 0); +} + +static void account_modified(PurpleAccount *account, PidginBuddyList *gtkblist) +{ + if (!gtkblist) + return; + fixup_notebook(gtkblist); update_menu_bar(gtkblist); } @@ -4248,7 +4266,7 @@ account_status_changed(PurpleAccount *ac if (!gtkblist) return; - update_menu_bar(gtkblist); + account_modified(account, gtkblist); } static gboolean @@ -4429,8 +4447,10 @@ remove_child_widget_by_account(GtkContai PurpleAccount *account) { GtkWidget *widget = find_child_widget_by_account(container, account); - if(widget) + if(widget) { + gtk_container_remove(container, widget); gtk_widget_destroy(widget); + } } /* Generic error buttons */ @@ -4530,7 +4550,7 @@ remove_generic_error_dialog(PurpleAccoun { PidginBuddyListPrivate *priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist); remove_child_widget_by_account( - GTK_CONTAINER(priv->error_scrollbook->notebook), account); + GTK_CONTAINER(priv->error_scrollbook), account); } @@ -4712,6 +4732,7 @@ update_account_error_state(PurpleAccount else pidgin_blist_update_account_error_state(account, NULL); + fixup_notebook(gtkblist); /* Don't bother updating the error if it hasn't changed. This stops * URGENT being repeatedly set for network errors whenever they try to * reconnect. @@ -4904,6 +4925,7 @@ static void pidgin_blist_show(PurpleBudd GtkWidget *label; GList *accounts; char *pretty, *tmp; + int errors = 0; GtkAccelGroup *accel_group; GtkTreeSelection *selection; GtkTargetEntry dte[] = {{"PURPLE_BLIST_NODE", GTK_TARGET_SAME_APP, DRAG_ROW}, @@ -4993,7 +5015,16 @@ static void pidgin_blist_show(PurpleBudd gtkblist->vbox = gtk_vbox_new(FALSE, 0); gtk_notebook_append_page(GTK_NOTEBOOK(gtkblist->notebook), gtkblist->vbox, NULL); gtk_widget_show_all(gtkblist->notebook); - if ((accounts = purple_accounts_get_all_active())) { + /* this is also far too ugly thanks to me still not wanting to fix #3989 properly right now */ + if (priv->error_scrollbook != NULL) { +#if GTK_CHECK_VERSION(2,2,0) + errors = gtk_notebook_get_n_pages(GTK_NOTEBOOK(priv->error_scrollbook->notebook)); +#else + errors = g_list_length(GTK_NOTEBOOK(priv->error_scrollbook->notebook)->children); +#endif + } + if ((accounts = purple_accounts_get_all_active()) || errors || + (accounts = gtk_container_get_children(GTK_CONTAINER(priv->error_scrollbook)))) { g_list_free(accounts); gtk_notebook_set_current_page(GTK_NOTEBOOK(gtkblist->notebook), 1); } ============================================================ --- pidgin/gtkscrollbook.c f9c19ef06b850114fca3c67db3a2b089503239a0 +++ pidgin/gtkscrollbook.c 5a53af6d62a64b4ca8b24af84decf0161fb1dbcc @@ -146,21 +146,74 @@ pidgin_scroll_book_add(GtkContainer *con static void pidgin_scroll_book_add(GtkContainer *container, GtkWidget *widget) { + GList *children; + PidginScrollBook *scroll_book; + + g_return_if_fail(GTK_IS_WIDGET (widget)); + g_return_if_fail (widget->parent == NULL); + + scroll_book = PIDGIN_SCROLL_BOOK(container); + children = scroll_book->children; + children = g_list_append(children, widget); gtk_widget_show(widget); gtk_notebook_append_page(GTK_NOTEBOOK(PIDGIN_SCROLL_BOOK(container)->notebook), widget, NULL); page_count_change_cb(PIDGIN_SCROLL_BOOK(container)); } static void +pidgin_scroll_book_remove(GtkContainer *container, GtkWidget *widget) +{ + int page; + GList *children; + GtkWidget *child; + PidginScrollBook *scroll_book; + g_return_if_fail(GTK_IS_WIDGET(widget)); + + scroll_book = PIDGIN_SCROLL_BOOK(container); + children = scroll_book->children; + + while (children) { + child = children->data; + if (child == widget) { + gtk_widget_unparent (widget); + children = g_list_remove_link (scroll_book->children, children); + g_list_free(children); + break; + } + } + + page = gtk_notebook_page_num(GTK_NOTEBOOK(PIDGIN_SCROLL_BOOK(container)->notebook), widget); + if (page >= 0) { + gtk_notebook_remove_page(GTK_NOTEBOOK(PIDGIN_SCROLL_BOOK(container)->notebook), page); + } +} + +static void pidgin_scroll_book_forall(GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data) { - PidginScrollBook *scroll_book = PIDGIN_SCROLL_BOOK(container); - if (include_internals) + GList *children; + PidginScrollBook *scroll_book; + + g_return_if_fail(GTK_IS_CONTAINER(container)); + + scroll_book = PIDGIN_SCROLL_BOOK(container); + + if (include_internals) { (*callback)(scroll_book->hbox, callback_data); - (*callback)(scroll_book->notebook, callback_data); + (*callback)(scroll_book->notebook, callback_data); + } + + children = scroll_book->children; + + while (children) { + GtkWidget *child; + child = children->data; + children = children->next; + (*callback)(child, callback_data); + } } static void @@ -169,6 +222,7 @@ pidgin_scroll_book_class_init (PidginScr GtkContainerClass *container_class = (GtkContainerClass*)klass; container_class->add = pidgin_scroll_book_add; + container_class->remove = pidgin_scroll_book_remove; container_class->forall = pidgin_scroll_book_forall; } ============================================================ --- pidgin/gtkscrollbook.h 20613d163ce0b07eb6cf55d1f8eb27889d694c75 +++ pidgin/gtkscrollbook.h dc05d1813ddc65ea353fdf7c209aea7102a3cb2b @@ -29,10 +29,6 @@ #include -#if !GTK_CHECK_VERSION(2,4,0) -#include "pidgincombobox.h" -#endif - G_BEGIN_DECLS #define PIDGIN_TYPE_SCROLL_BOOK (pidgin_scroll_book_get_type ()) @@ -54,9 +50,9 @@ struct _PidginScrollBook GtkWidget *label; GtkWidget *left_arrow; GtkWidget *right_arrow; + GList *children; /* Padding for future expansion */ - void (*_gtk_reserved0) (void); void (*_gtk_reserved1) (void); void (*_gtk_reserved2) (void); void (*_gtk_reserved3) (void); @@ -66,7 +62,7 @@ struct _PidginScrollBookClass struct _PidginScrollBookClass { - GtkComboBoxClass parent_class; + GtkContainerClass parent_class; /* Padding for future expansion */ void (*_gtk_reserved0) (void);