# HG changeset patch # User Sean Egan # Date 1187054315 0 # Node ID 771423734d6acebabfb31c437ffdfadc4f8986af # Parent 6e3cd5e804206637248652a6f3bd1281074a23f4# Parent f5d9b9bbf5fda3444f54896b11b713f24b29cee7 merge of '5af486724d98e56d56d8754e0b3d06d5f48b88d4' and 'd2728075ea812d40b40b69e2fddd0d441676ec5f' diff -r 6e3cd5e80420 -r 771423734d6a ChangeLog --- a/ChangeLog Mon Aug 13 21:02:17 2007 +0000 +++ b/ChangeLog Tue Aug 14 01:18:35 2007 +0000 @@ -1,11 +1,14 @@ Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul version 2.1.1 (??/??/????): - libpurple: + Yahoo: * Added an account action to open your inbox in the yahoo prpl. * Added support for Unicode status messages in Yahoo. * Server-stored aliases for Yahoo. (John Moody) * Fixed support for Yahoo! doodling. + * Support for MSN Messenger contacts + + Bonjour: * Bonjour plugin uses native Avahi instead of Howl * Bonjour plugin supports Buddy Icons @@ -14,6 +17,11 @@ the toolbar * Slim new redesign of conversation tabs to maximize number of conversations that can fit in a window + * Tab bar is not visible when only one conversation is open. You can + drag and drop conversations from the infopane. + * Moved "Reset Formatting" toolbar button to Font menu. + * Double click on the infopane to alias buddies and set topics + on chats Finch: * Sound support (Eric Polino) diff -r 6e3cd5e80420 -r 771423734d6a pidgin/gtkblist.c --- a/pidgin/gtkblist.c Mon Aug 13 21:02:17 2007 +0000 +++ b/pidgin/gtkblist.c Tue Aug 14 01:18:35 2007 +0000 @@ -3324,18 +3324,14 @@ } /* XXX Good luck cleaning up this crap */ - if (aliased) { - contact = (PurpleContact*)((PurpleBlistNode*)b)->parent; - if(contact) - gtkcontactnode = ((PurpleBlistNode*)contact)->ui_data; - - if(gtkcontactnode && !gtkcontactnode->contact_expanded && contact->alias) - name = contact->alias; - else - name = purple_buddy_get_alias(b); - } else { - name = b->name; - } + contact = (PurpleContact*)((PurpleBlistNode*)b)->parent; + if(contact) + gtkcontactnode = ((PurpleBlistNode*)contact)->ui_data; + + if(gtkcontactnode && !gtkcontactnode->contact_expanded && contact->alias) + name = contact->alias; + else + name = purple_buddy_get_alias(b); esc = g_markup_escape_text(name, strlen(name)); diff -r 6e3cd5e80420 -r 771423734d6a pidgin/gtkconv.c --- a/pidgin/gtkconv.c Mon Aug 13 21:02:17 2007 +0000 +++ b/pidgin/gtkconv.c Tue Aug 14 01:18:35 2007 +0000 @@ -186,6 +186,7 @@ static void focus_out_from_menubar(GtkWidget *wid, PidginWindow *win); static void pidgin_conv_tab_pack(PidginWindow *win, PidginConversation *gtkconv); static gboolean infopane_press_cb(GtkWidget *widget, GdkEventButton *e, PidginConversation *conv); +static gboolean alias_double_click_cb(GtkWidget *widget, GdkEventButton *event, PidginConversation *gtkconv); static void pidgin_conv_set_position_size(PidginWindow *win, int x, int y, int width, int height); @@ -4017,7 +4018,6 @@ } gtk_entry_set_text(GTK_ENTRY(gtkchat->topic_text), current_topic); - prpl_info->set_chat_topic(gc, purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)), new_topic); @@ -4385,6 +4385,8 @@ "foreground-set", TRUE, "weight-set", TRUE, NULL); + g_object_set(G_OBJECT(rend), "editable", TRUE, NULL); + col = gtk_tree_view_column_new_with_attributes(NULL, rend, "text", CHAT_USERS_ALIAS_COLUMN, "foreground-gdk", CHAT_USERS_COLOR_COLUMN, @@ -6298,7 +6300,7 @@ else title = g_strdup(purple_conversation_get_title(conv)); - if ((truncate = strchr(title, ' ')) || + if (((truncate = strchr(title, ' ')) && strcmp(title, conv->name)) || (truncate = strchr(title, '@'))) { truncchar = *truncate; *truncate = '\0'; @@ -6313,18 +6315,19 @@ markup = title; } } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { - PurpleConvChat *chat = PURPLE_CONV_CHAT(conv); - const char *topic = purple_conv_chat_get_topic(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; markup = g_strdup_printf("%s%s%s", purple_conversation_get_title(conv), - esc ? "\n" : "", + esc && *esc ? "\n" : "", pidgin_get_dim_grey_string(gtkconv->infopane), esc ? esc : ""); g_free(esc); } gtk_list_store_set(gtkconv->infopane_model, &(gtkconv->infopane_iter), 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); @@ -7713,8 +7716,10 @@ gtkconv = pidgin_conv_window_get_gtkconv_at_index(dest_win, page_num); tab = gtkconv->tabby; - - if (horiz_tabs) { + if (gtk_notebook_get_show_tabs(dest_notebook) == FALSE) { + dnd_hints_show_relative(HINT_ARROW_DOWN, gtkconv->infopane, HINT_POSITION_CENTER, HINT_POSITION_TOP); + dnd_hints_show_relative(HINT_ARROW_UP, gtkconv->infopane, HINT_POSITION_CENTER, HINT_POSITION_BOTTOM); + } else if (horiz_tabs) { if (((gpointer)win == (gpointer)dest_win && win->drag_tab < page_num) || to_right) { dnd_hints_show_relative(HINT_ARROW_DOWN, tab, HINT_POSITION_RIGHT, HINT_POSITION_TOP); dnd_hints_show_relative(HINT_ARROW_UP, tab, HINT_POSITION_RIGHT, HINT_POSITION_BOTTOM); @@ -7761,9 +7766,37 @@ static gboolean infopane_press_cb(GtkWidget *widget, GdkEventButton *e, PidginConversation *gtkconv) { + if (e->type == GDK_2BUTTON_PRESS && e->button == 1) { + if (alias_double_click_cb(widget, e, gtkconv)) + return TRUE; + } + if (e->type != GDK_BUTTON_PRESS) return FALSE; + if (e->button == 1) { + int nb_x, nb_y; + + if (gtkconv->win->in_drag) + return TRUE; + + gtkconv->win->in_predrag = TRUE; + gtkconv->win->drag_tab = gtk_notebook_page_num(GTK_NOTEBOOK(gtkconv->win->notebook), gtkconv->tab_cont); + + gdk_window_get_origin(gtkconv->infopane_hbox->window, &nb_x, &nb_y); + + gtkconv->win->drag_min_x = gtkconv->infopane_hbox->allocation.x + nb_x; + gtkconv->win->drag_min_y = gtkconv->infopane_hbox->allocation.y + nb_y; + gtkconv->win->drag_max_x = gtkconv->infopane_hbox->allocation.width + gtkconv->win->drag_min_x; + gtkconv->win->drag_max_y = gtkconv->infopane_hbox->allocation.height + gtkconv->win->drag_min_y; + + gtkconv->win->drag_motion_signal = g_signal_connect(G_OBJECT(gtkconv->win->notebook), "motion_notify_event", + G_CALLBACK(notebook_motion_cb), gtkconv->win); + gtkconv->win->drag_leave_signal = g_signal_connect(G_OBJECT(gtkconv->win->notebook), "leave_notify_event", + G_CALLBACK(notebook_leave_cb), gtkconv->win); + return FALSE; + } + if (e->button == 3) { /* Right click was pressed. Popup the Send To menu. */ GtkWidget *menu = gtk_menu_new(), *sub; @@ -8142,7 +8175,7 @@ { g_signal_handlers_disconnect_matched(G_OBJECT(entry), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, gtkconv); - gtk_widget_show(gtkconv->tab_label); + gtk_widget_show(gtkconv->infopane); gtk_widget_grab_focus(gtkconv->entry); gtk_widget_destroy(entry); } @@ -8189,21 +8222,18 @@ } serv_alias_buddy(buddy); } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { - PurpleChat *chat; - - chat = purple_blist_find_chat(account, name); - if (chat != NULL) { - purple_blist_alias_chat(chat, - gtk_entry_get_text(entry)); - } + gtk_entry_set_text(GTK_ENTRY(gtkconv->u.chat->topic_text), gtk_entry_get_text(entry)); + topic_callback(NULL, gtkconv); } remove_edit_entry(user_data, GTK_WIDGET(entry)); } static gboolean -alias_double_click_cb(GtkNotebook *notebook, GdkEventButton *event, PidginConversation *gtkconv) +alias_double_click_cb(GtkWidget *widget, GdkEventButton *event, PidginConversation *gtkconv) { GtkWidget *entry = NULL; + PurpleConversation *conv = gtkconv->active_conv; + const char *text = NULL; if (event->button != 1 || event->type != GDK_2BUTTON_PRESS) { return FALSE; @@ -8219,6 +8249,15 @@ return FALSE; } + 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) + return FALSE; + text = purple_buddy_get_contact_alias(buddy); + } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { + text = purple_conv_chat_get_topic(PURPLE_CONV_CHAT(conv)); + } + /* alias label */ entry = gtk_entry_new(); gtk_entry_set_has_frame(GTK_ENTRY(entry), FALSE); @@ -8227,17 +8266,19 @@ gtk_entry_set_alignment(GTK_ENTRY(entry), 0.5); #endif - gtk_box_pack_start(GTK_BOX(gtkconv->tabby), entry, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(gtkconv->infopane_hbox), entry, TRUE, TRUE, 0); /* after the tab label */ - gtk_box_reorder_child(GTK_BOX(gtkconv->tabby), entry, 2); + gtk_box_reorder_child(GTK_BOX(gtkconv->infopane_hbox), entry, 0); 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), - gtk_label_get_text(GTK_LABEL(gtkconv->tab_label))); + + + + gtk_entry_set_text(GTK_ENTRY(entry), text); gtk_widget_show(entry); - gtk_widget_hide(gtkconv->tab_label); + gtk_widget_hide(gtkconv->infopane); gtk_widget_grab_focus(entry); return FALSE;