# HG changeset patch # User Richard Laager # Date 1179184662 0 # Node ID 79f6b097a0a65732e0507592b3f544194352c12d # Parent 4453f59c2035e1568cddeeb11e6a67eea10a156d# Parent 74f1f5bbd858b026d344ae84c44f2062965a5ea3 merge of '2263648adbe7bbf44fd9bf0230c9054be1d4c72b' and '8acb1ca32888c20351b7ed15c87ae347440d802a' diff -r 4453f59c2035 -r 79f6b097a0a6 COPYRIGHT --- a/COPYRIGHT Mon May 14 23:11:30 2007 +0000 +++ b/COPYRIGHT Mon May 14 23:17:42 2007 +0000 @@ -323,6 +323,7 @@ Phil Snowberger Eddie Sohn (tr1sk) Sony Computer Entertainment America, Inc. +Andy Spencer Mark Spencer Lex Spoon Chris Stafford diff -r 4453f59c2035 -r 79f6b097a0a6 ChangeLog --- a/ChangeLog Mon May 14 23:11:30 2007 +0000 +++ b/ChangeLog Mon May 14 23:17:42 2007 +0000 @@ -24,6 +24,7 @@ * Identify the account when warning about plaintext auth over an unencrypted channel * Fix XMPP SASL authentication error when using Cyrus and a connect server + * Fix changing tab locations to update properly * Turning off "Show formatting on incoming messages" now ignores formatting in tags too * File transfer progress for transfers on MSN is now correctly displayed diff -r 4453f59c2035 -r 79f6b097a0a6 libpurple/util.c --- a/libpurple/util.c Mon May 14 23:11:30 2007 +0000 +++ b/libpurple/util.c Mon May 14 23:17:42 2007 +0000 @@ -3285,6 +3285,9 @@ gfud->inpa = 0; close(gfud->fd); gfud->fd = -1; + gfud->request_written = 0; + gfud->len = 0; + gfud->data_len = 0; g_free(gfud->website.user); g_free(gfud->website.passwd); @@ -3497,7 +3500,7 @@ } gfud->request_written += len; - if (gfud->request_written != total_len) + if (gfud->request_written < total_len) return; /* We're done writing our request, now start reading the response */ diff -r 4453f59c2035 -r 79f6b097a0a6 pidgin/gtkblist.c --- a/pidgin/gtkblist.c Mon May 14 23:11:30 2007 +0000 +++ b/pidgin/gtkblist.c Mon May 14 23:17:42 2007 +0000 @@ -327,7 +327,6 @@ GValue val; PurpleBlistNode *node; const char *text = NULL; - char *esc; path = gtk_tree_path_new_from_string (path_str); gtk_tree_model_get_iter (GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); @@ -350,12 +349,10 @@ g_return_if_reached(); } - esc = g_markup_escape_text(text, -1); if (GTK_IS_ENTRY (editable)) { GtkEntry *entry = GTK_ENTRY (editable); - gtk_entry_set_text(entry, esc); - } - g_free(esc); + gtk_entry_set_text(entry, text); + } } static void gtk_blist_renderer_edited_cb(GtkCellRendererText *text_rend, char *arg1, @@ -3957,6 +3954,9 @@ g_free(primary); gtk_widget_destroy(GTK_WIDGET(widget)); g_hash_table_remove(gtkblist->connection_errors, account); + if (gtk_container_get_children(GTK_CONTAINER(gtkblist->error_buttons)) == NULL) { + gtk_widget_hide(gtkblist->error_buttons); + } } /* Add some buttons that show connection errors */ @@ -3977,7 +3977,7 @@ escaped); g_free(escaped); - hbox = gtk_hbox_new(FALSE, 0); + hbox = gtk_hbox_new(FALSE, 6); /* Create the icon */ if ((status_type = purple_account_get_status_type_with_primitive(account, @@ -3987,8 +3987,7 @@ image = gtk_image_new_from_pixbuf(pixbuf); g_object_unref(pixbuf); - gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, - PIDGIN_HIG_BOX_SPACE); + gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); } } @@ -3999,8 +3998,7 @@ #if GTK_CHECK_VERSION(2,6,0) g_object_set(label, "ellipsize", PANGO_ELLIPSIZE_END, NULL); #endif - gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, - PIDGIN_HIG_BOX_SPACE); + gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); /* Create the actual button and put the icon and text on it */ button = gtk_button_new(); @@ -4011,6 +4009,7 @@ gtk_widget_show_all(button); gtk_box_pack_end(GTK_BOX(gtkblist->error_buttons), button, FALSE, FALSE, 0); + gtk_widget_show_all(gtkblist->error_buttons); } void @@ -4476,7 +4475,8 @@ /* Create an empty vbox used for showing connection errors */ gtkblist->error_buttons = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->error_buttons, FALSE, FALSE, 0); - + gtk_container_set_border_width(GTK_CONTAINER(gtkblist->error_buttons), 3); + /* Add the statusbox */ gtkblist->statusbox = pidgin_status_box_new(); gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->statusbox, FALSE, TRUE, 0); @@ -4573,6 +4573,7 @@ gtkblist); gtk_widget_hide(gtkblist->headline_hbox); + gtk_widget_hide(gtkblist->error_buttons); /* emit our created signal */ purple_signal_emit(handle, "gtkblist-created", list); diff -r 4453f59c2035 -r 79f6b097a0a6 pidgin/gtkconv.c --- a/pidgin/gtkconv.c Mon May 14 23:11:30 2007 +0000 +++ b/pidgin/gtkconv.c Mon May 14 23:17:42 2007 +0000 @@ -176,6 +176,7 @@ static gboolean color_is_visible(GdkColor foreground, GdkColor background, int color_contrast, int brightness_contrast); static void pidgin_conv_update_fields(PurpleConversation *conv, PidginConvFields fields); static void focus_out_from_menubar(GtkWidget *wid, PidginWindow *win); +static void pidgin_conv_tab_pack(PidginWindow *win, PidginConversation *gtkconv); static GdkColor *get_nick_color(PidginConversation *gtkconv, const char *name) { static GdkColor col; @@ -6512,16 +6513,18 @@ tab_side_pref_cb(const char *name, PurplePrefType type, gconstpointer value, gpointer data) { - GList *l; + GList *gtkwins, *gtkconvs; GtkPositionType pos; - PidginWindow *win; + PidginWindow *gtkwin; pos = GPOINTER_TO_INT(value); - for (l = pidgin_conv_windows_get_list(); l != NULL; l = l->next) { - win = l->data; - - gtk_notebook_set_tab_pos(GTK_NOTEBOOK(win->notebook), pos&~8); + for (gtkwins = pidgin_conv_windows_get_list(); gtkwins != NULL; gtkwins = gtkwins->next) { + gtkwin = gtkwins->data; + gtk_notebook_set_tab_pos(GTK_NOTEBOOK(gtkwin->notebook), pos&~8); + for (gtkconvs = gtkwin->gtkconvs; gtkconvs != NULL; gtkconvs = gtkconvs->next) { + pidgin_conv_tab_pack(gtkwin, gtkconvs->data); + } } } @@ -8056,35 +8059,17 @@ { PurpleConversation *conv = gtkconv->active_conv; PidginConversation *focus_gtkconv; - GtkWidget *tabby, *menu_tabby; GtkWidget *tab_cont = gtkconv->tab_cont; GtkWidget *close_image; PurpleConversationType conv_type; const gchar *tmp_lab; gint close_button_width, close_button_height, focus_width, focus_pad; - gboolean tabs_side = FALSE; - gint angle = 0; conv_type = purple_conversation_get_type(conv); - win->gtkconvs = g_list_append(win->gtkconvs, gtkconv); gtkconv->win = win; - if (purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == GTK_POS_LEFT || - purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == GTK_POS_RIGHT) - tabs_side = TRUE; - else if (purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == (GTK_POS_LEFT|8)) - angle = 90; - else if (purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == (GTK_POS_RIGHT|8)) - angle = 270; - - if (angle) - gtkconv->tabby = tabby = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); - else - gtkconv->tabby = tabby = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); - gtkconv->menu_tabby = menu_tabby = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); - /* Close button. */ gtkconv->close = gtk_button_new(); gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &close_button_width, &close_button_height); @@ -8128,56 +8113,25 @@ /* Tab label. */ gtkconv->tab_label = gtk_label_new(tmp_lab = purple_conversation_get_title(conv)); -#if GTK_CHECK_VERSION(2,6,0) - if (!angle) - g_object_set(G_OBJECT(gtkconv->tab_label), "ellipsize", PANGO_ELLIPSIZE_END, NULL); - gtk_label_set_width_chars(GTK_LABEL(gtkconv->tab_label), 6); - if (tabs_side) { - gtk_label_set_width_chars(GTK_LABEL(gtkconv->tab_label), MIN(g_utf8_strlen(tmp_lab, -1), 12)); - } - if (angle) - gtk_label_set_angle(GTK_LABEL(gtkconv->tab_label), angle); -#endif - gtkconv->menu_label = gtk_label_new(purple_conversation_get_title(conv)); -#if 0 - gtk_misc_set_alignment(GTK_MISC(gtkconv->tab_label), 0.00, 0.5); - gtk_misc_set_padding(GTK_MISC(gtkconv->tab_label), 4, 0); -#endif - - /* Pack it all together. */ - if (angle == 90) - gtk_box_pack_start(GTK_BOX(tabby), gtkconv->close, FALSE, FALSE, 0); - else - gtk_box_pack_start(GTK_BOX(tabby), gtkconv->icon, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(menu_tabby), gtkconv->menu_icon, - FALSE, FALSE, 0); - - gtk_widget_show_all(gtkconv->icon); + gtkconv->menu_tabby = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); + gtkconv->menu_label = gtk_label_new(purple_conversation_get_title(gtkconv->active_conv)); + gtk_box_pack_start(GTK_BOX(gtkconv->menu_tabby), gtkconv->menu_icon, FALSE, FALSE, 0); + gtk_widget_show_all(gtkconv->menu_icon); - gtk_box_pack_start(GTK_BOX(tabby), gtkconv->tab_label, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(menu_tabby), gtkconv->menu_label, TRUE, TRUE, 0); - gtk_widget_show(gtkconv->tab_label); + gtk_box_pack_start(GTK_BOX(gtkconv->menu_tabby), gtkconv->menu_label, TRUE, TRUE, 0); gtk_widget_show(gtkconv->menu_label); gtk_misc_set_alignment(GTK_MISC(gtkconv->menu_label), 0, 0); - if (angle == 90) - gtk_box_pack_start(GTK_BOX(tabby), gtkconv->icon, FALSE, FALSE, 0); - else - gtk_box_pack_start(GTK_BOX(tabby), gtkconv->close, FALSE, FALSE, 0); - if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/close_on_tabs")) - gtk_widget_show(gtkconv->close); - - gtk_widget_show(tabby); - gtk_widget_show(menu_tabby); + gtk_widget_show(gtkconv->menu_tabby); if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) pidgin_conv_update_buddy_icon(conv); - /* Add this pane to the conversation's notebook. */ - gtk_notebook_append_page_menu(GTK_NOTEBOOK(win->notebook), tab_cont, tabby, menu_tabby); - gtk_notebook_set_tab_label_packing(GTK_NOTEBOOK(win->notebook), tab_cont, !tabs_side && !angle, TRUE, GTK_PACK_START); - + /* Build and set conversations tab */ + pidgin_conv_tab_pack(win, gtkconv); + + gtk_notebook_set_menu_label(GTK_NOTEBOOK(win->notebook), tab_cont, gtkconv->menu_tabby); gtk_widget_show(tab_cont); @@ -8198,6 +8152,87 @@ update_send_to_selection(win); } +static void +pidgin_conv_tab_pack(PidginWindow *win, PidginConversation *gtkconv) +{ + gboolean tabs_side = FALSE; + gint angle = 0; + GtkWidget *first, *third; + + if (purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == GTK_POS_LEFT || + purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == GTK_POS_RIGHT) + tabs_side = TRUE; + else if (purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == (GTK_POS_LEFT|8)) + angle = 90; + else if (purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/tab_side") == (GTK_POS_RIGHT|8)) + angle = 270; + +#if GTK_CHECK_VERSION(2,6,0) + if (!angle) + g_object_set(G_OBJECT(gtkconv->tab_label), "ellipsize", PANGO_ELLIPSIZE_END, NULL); + else + g_object_set(G_OBJECT(gtkconv->tab_label), "ellipsize", PANGO_ELLIPSIZE_NONE, NULL); + gtk_label_set_width_chars(GTK_LABEL(gtkconv->tab_label), 6); + if (tabs_side) { + gtk_label_set_width_chars( + GTK_LABEL(gtkconv->tab_label), + MIN(g_utf8_strlen(gtk_label_get_text(GTK_LABEL(gtkconv->tab_label)), -1), 12) + ); + } + if (angle) + gtk_label_set_angle(GTK_LABEL(gtkconv->tab_label), angle); +#endif + +#if 0 + gtk_misc_set_alignment(GTK_MISC(gtkconv->tab_label), 0.00, 0.5); + gtk_misc_set_padding(GTK_MISC(gtkconv->tab_label), 4, 0); +#endif + + if (angle) + gtkconv->tabby = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); + else + gtkconv->tabby = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); + + /* select the correct ordering for verticle tabs */ + if (angle == 90) { + first = gtkconv->close; + third = gtkconv->icon; + } else { + first = gtkconv->icon; + third = gtkconv->close; + } + + if (gtkconv->tab_label->parent == NULL) { + /* Pack if it's a new widget */ + gtk_box_pack_start(GTK_BOX(gtkconv->tabby), first, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtkconv->tabby), gtkconv->tab_label, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(gtkconv->tabby), third, FALSE, FALSE, 0); + + /* Add this pane to the conversation's notebook. */ + gtk_notebook_append_page(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont, gtkconv->tabby); + } else { + /* reparent old widgets on preference changes */ + gtk_widget_reparent(first, gtkconv->tabby); + gtk_widget_reparent(gtkconv->tab_label, gtkconv->tabby); + gtk_widget_reparent(third, gtkconv->tabby); + gtk_box_set_child_packing(GTK_BOX(gtkconv->tabby), first, FALSE, FALSE, 0, GTK_PACK_START); + gtk_box_set_child_packing(GTK_BOX(gtkconv->tabby), gtkconv->tab_label, TRUE, TRUE, 0, GTK_PACK_START); + gtk_box_set_child_packing(GTK_BOX(gtkconv->tabby), third, FALSE, FALSE, 0, GTK_PACK_START); + + /* Reset the tabs label to the new version */ + gtk_notebook_set_tab_label(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont, gtkconv->tabby); + } + + gtk_notebook_set_tab_label_packing(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont, !tabs_side && !angle, TRUE, GTK_PACK_START); + + /* show the widgets */ + gtk_widget_show(gtkconv->icon); + gtk_widget_show(gtkconv->tab_label); + if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/close_on_tabs")) + gtk_widget_show(gtkconv->close); + gtk_widget_show(gtkconv->tabby); +} + void pidgin_conv_window_remove_gtkconv(PidginWindow *win, PidginConversation *gtkconv) {