Mercurial > pidgin.yaz
diff pidgin/gtkconv.c @ 27837:2c6fb4d5cea2
propagate from branch 'im.pidgin.pidgin' (head 727d816d20ca2bcfae91438cbd708b9f3d7de105)
to branch 'im.pidgin.pidgin.yaz' (head 218d9beb35ab97efaf1eb7af814279b221ad23bb)
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Sat, 10 May 2008 10:08:26 +0000 |
parents | 1dd0e007514d 396fd93907f1 |
children | acef4202e147 |
line wrap: on
line diff
--- a/pidgin/gtkconv.c Sat May 10 10:03:23 2008 +0000 +++ b/pidgin/gtkconv.c Sat May 10 10:08:26 2008 +0000 @@ -155,7 +155,6 @@ static gboolean infopane_entry_activate(PidginConversation *gtkconv); static void got_typing_keypress(PidginConversation *gtkconv, gboolean first); static void gray_stuff_out(PidginConversation *gtkconv); -static GList *generate_invite_user_names(PurpleConnection *gc); static void add_chat_buddy_common(PurpleConversation *conv, PurpleConvChatBuddy *cb, const char *old_name); static gboolean tab_complete(PurpleConversation *conv); static void pidgin_conv_updated(PurpleConversation *conv, PurpleConvUpdateType type); @@ -753,6 +752,25 @@ gtk_widget_grab_focus(PIDGIN_CONVERSATION(conv)->entry); } +static gboolean +chat_invite_filter(const PidginBuddyCompletionEntry *entry, gpointer data) +{ + PurpleAccount *filter_account = data; + PurpleAccount *account = NULL; + + if (entry->is_buddy) { + if (PURPLE_BUDDY_IS_ONLINE(entry->entry.buddy)) + account = purple_buddy_get_account(entry->entry.buddy); + else + return FALSE; + } else { + account = entry->entry.logged_buddy->account; + } + if (account == filter_account) + return TRUE; + return FALSE; +} + static void do_invite(GtkWidget *w, int resp, InviteBuddyInfo *info) { @@ -762,7 +780,7 @@ gtkconv = PIDGIN_CONVERSATION(info->conv); if (resp == GTK_RESPONSE_OK) { - buddy = pidgin_text_combo_box_entry_get_text(info->entry); + buddy = gtk_entry_get_text(GTK_ENTRY(info->entry)); message = gtk_entry_get_text(GTK_ENTRY(info->message)); if (!g_ascii_strcasecmp(buddy, "")) @@ -785,6 +803,7 @@ { InviteBuddyInfo *info = (InviteBuddyInfo *)data; const char *convprotocol; + gboolean success = TRUE; convprotocol = purple_account_get_protocol_id(purple_conversation_get_account(info->conv)); @@ -807,11 +826,12 @@ purple_notify_error(PIDGIN_CONVERSATION(info->conv), NULL, _("That buddy is not on the same protocol as this " "chat."), NULL); + success = FALSE; } else - pidgin_text_combo_box_entry_set_text(info->entry, buddy->name); - - gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); + gtk_entry_set_text(GTK_ENTRY(info->entry), purple_buddy_get_name(buddy)); + + gtk_drag_finish(dc, success, (dc->action == GDK_ACTION_MOVE), t); } else if (sd->target == gdk_atom_intern("application/x-im-contact", FALSE)) { @@ -833,17 +853,18 @@ purple_notify_error(PIDGIN_CONVERSATION(info->conv), NULL, _("That buddy is not on the same protocol as this " "chat."), NULL); + success = FALSE; } else { - pidgin_text_combo_box_entry_set_text(info->entry, username); + gtk_entry_set_text(GTK_ENTRY(info->entry), username); } } g_free(username); g_free(protocol); - gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); + gtk_drag_finish(dc, success, (dc->action == GDK_ACTION_MOVE), t); } } @@ -934,7 +955,9 @@ gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); /* Now the Buddy drop-down entry field. */ - info->entry = pidgin_text_combo_box_entry_new(NULL, generate_invite_user_names(gc)); + info->entry = gtk_entry_new(); + pidgin_setup_screenname_autocomplete_with_filter(info->entry, NULL, chat_invite_filter, + purple_conversation_get_account(conv)); gtk_table_attach_defaults(GTK_TABLE(table), info->entry, 1, 2, 0, 1); gtk_label_set_mnemonic_widget(GTK_LABEL(label), info->entry); @@ -973,13 +996,12 @@ G_CALLBACK(invite_dnd_recv), info); g_signal_connect(G_OBJECT(info->entry), "drag_data_received", G_CALLBACK(invite_dnd_recv), info); - } gtk_widget_show_all(invite_dialog); if (info != NULL) - gtk_widget_grab_focus(GTK_BIN(info->entry)->child); + gtk_widget_grab_focus(info->entry); } static void @@ -1957,6 +1979,7 @@ break; case GDK_Tab: + case GDK_KP_Tab: case GDK_ISO_Left_Tab: if (event->state & GDK_SHIFT_MASK) { move_to_next_unread_tab(gtkconv, FALSE); @@ -2138,6 +2161,8 @@ else { switch (event->keyval) { case GDK_Tab: + case GDK_KP_Tab: + case GDK_ISO_Left_Tab: if (gtkconv->entry != entry) break; return tab_complete(conv); @@ -2208,6 +2233,7 @@ (event->keyval == GDK_Home) || (event->keyval == GDK_End) || (event->keyval == GDK_Tab) || + (event->keyval == GDK_KP_Tab) || (event->keyval == GDK_ISO_Left_Tab)) { if (event->type == GDK_KEY_PRESS) @@ -3862,42 +3888,6 @@ update_send_to_selection(win); } -static GList * -generate_invite_user_names(PurpleConnection *gc) -{ - PurpleBlistNode *gnode,*cnode,*bnode; - static GList *tmp = NULL; - - g_list_free(tmp); - tmp = NULL; - - if (gc != NULL) { - for(gnode = purple_get_blist()->root; gnode; gnode = gnode->next) { - if(!PURPLE_BLIST_NODE_IS_GROUP(gnode)) - continue; - for(cnode = gnode->child; cnode; cnode = cnode->next) { - if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode)) - continue; - for(bnode = cnode->child; bnode; bnode = bnode->next) { - PurpleBuddy *buddy; - - if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode)) - continue; - - buddy = (PurpleBuddy *)bnode; - - if (buddy->account == gc->account && - PURPLE_BUDDY_IS_ONLINE(buddy)) - tmp = g_list_insert_sorted(tmp, buddy->name, - (GCompareFunc)g_utf8_collate); - } - } - } - } - - return tmp; -} - static GdkPixbuf * get_chat_buddy_status_icon(PurpleConvChat *chat, const char *name, PurpleConvChatBuddyFlags flags) {