Mercurial > pidgin.yaz
changeset 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 | d1dfbedd9e64 (current diff) 5451ce45eeb3 (diff) |
children | 22f8b5512ef4 |
files | configure.ac libpurple/protocols/oscar/oscar.c pidgin/gtkconv.c pidgin/gtkimhtmltoolbar.c |
diffstat | 12 files changed, 190 insertions(+), 149 deletions(-) [+] |
line wrap: on
line diff
--- a/AUTHORS Sat May 10 10:03:23 2008 +0000 +++ b/AUTHORS Sat May 10 10:08:26 2008 +0000 @@ -45,6 +45,7 @@ Peter 'Fmoo' Ruibal Elliott 'QuLogic' Sales de Andrade Gabriel 'Nix' Schulhof +Jorge 'Masca' VillaseƱor Retired Developers: ------------------
--- a/ChangeLog Sat May 10 10:03:23 2008 +0000 +++ b/ChangeLog Sat May 10 10:08:26 2008 +0000 @@ -11,27 +11,34 @@ (fixes a problem with litter in the channel user list). * IRC no longer crashes on /list on servers which erroneously omit RPL_LISTSTART. + * Update the NetworkManager support to use D-Bus directly, instead of + libnm-glib. Hopefully it's stable now. It will now compile by + default if you have D-Bus support and NetworkManager.h. (Elliott + Sales de Andrade) Pidgin: * The typing notification in the conversation history can be disabled or customized (font, color etc.) in .gtkrc-2.0. - * Added a plugin (not built by default) which adds a Send button back - to the conversation window. People without physical keyboards have a - hard time with the lack of the button. + * Added a plugin (not installed by default) which adds a Send button + back to the conversation window. People without physical keyboards + have a hard time with the lack of the button. * Clicking on the buddyicon in the conversation window toggles the size of the icon between small and large. * The settings of a chat (e.g. Handle in an XMPP chat, or Exchange in an AIM chat) can be edited from its context menu in the buddy list. * Add a "Present conversation window" preference to the Message - Notification plugin, the "Raise conversation window" option does not + Notification plugin; the "Raise conversation window" option does not unminimize windows or draw attention to them when they are on other - workspaces the "Present" option should. + workspaces--the "Present" option should. * Add a preference to set Escape as the keyboard shortcut for closing the conversation window. * Add an option in the context menu to disable smileys in the selected - text in the conversation history/log viewer. This should help people who - regularly paste code in conversations. - * Add a preference to choose the minimum size of the text input. + text in the conversation history/log viewer. This should help people + who regularly paste code in conversations. + * Add a preference to choose the minimum size of the text input area in + lines. + * Moved the "Local alias" field in the Modify Account dialog to be below + the "User Options" heading on the "Basic" tab. General: * The configure script now dies on more absent dependencies. The
--- a/configure.ac Sat May 10 10:03:23 2008 +0000 +++ b/configure.ac Sat May 10 10:08:26 2008 +0000 @@ -1201,7 +1201,7 @@ dnl ####################################################################### AC_ARG_ENABLE(dbus, [AC_HELP_STRING([--enable-dbus], [enable D-Bus support])], , enable_dbus=yes) -AC_ARG_ENABLE(nm, [AC_HELP_STRING([--enable-nm], [enable NetworkManager support (buggy) (requires D-Bus)])], enable_libnm=$enableval, enable_libnm=no) +AC_ARG_ENABLE(nm, [AC_HELP_STRING([--enable-nm], [enable NetworkManager support (requires D-Bus)])], enable_nm=$enableval, enable_nm=yes) if test "x$enable_dbus" = "xyes" ; then AC_CHECK_PROG(enable_dbus, dbus-binding-tool, yes, no) @@ -1218,26 +1218,12 @@ Use --disable-dbus if you do not need D-Bus support. ])]) -dnl Check for libnm_glib; if we don't have it, oh well - if test "x$enable_libnm" = "xyes" ; then - LIBNM_CFLAGS="" - LIBNM_LIBS="" - PKG_CHECK_MODULES(LIBNM, libnm_glib, - [ - AC_DEFINE(HAVE_LIBNM, 1, [Define if you have NetworkManager]) - enable_libnm=yes - ], - [ - AC_MSG_RESULT(no) - AC_MSG_ERROR([ -NetworkManager development headers not found. -Use --disable-nm if you do not need NetworkManager support. -])]) - AC_SUBST(LIBNM_CFLAGS) - AC_SUBST(LIBNM_LIBS) +dnl Check for NetworkManager.h; if we don't have it, oh well + if test "x$enable_nm" = "xyes" ; then + AC_CHECK_HEADERS(NetworkManager/NetworkManager.h, [], enable_nm=no) fi else - enable_libnm=no + enable_nm=no fi dnl ####################################################################### @@ -2410,7 +2396,7 @@ if test "x$enable_dbus" = "xyes" ; then eval eval echo D-Bus services directory...... : $DBUS_SERVICES_DIR fi -echo Build with NetworkManager..... : $enable_libnm +echo Build with NetworkManager..... : $enable_nm echo SSL Library/Libraries......... : $msg_ssl echo Build with Cyrus SASL support. : $enable_cyrus_sasl echo Use kerberos 4 with zephyr.... : $kerberos
--- a/libpurple/network.c Sat May 10 10:03:23 2008 +0000 +++ b/libpurple/network.c Sat May 10 10:08:26 2008 +0000 @@ -59,11 +59,13 @@ # define HX_SIZE_OF_IFREQ(a) sizeof(a) #endif -#ifdef HAVE_LIBNM -#include <libnm_glib.h> +#ifdef HAVE_NETWORKMANAGER_NETWORKMANAGER_H +#include <dbus/dbus-glib.h> +#include <NetworkManager/NetworkManager.h> -static libnm_glib_ctx *nm_context = NULL; -static guint nm_callback_idx = 0; +static DBusGConnection *nm_conn = NULL; +static DBusGProxy *nm_proxy = NULL; +static DBusGProxy *dbus_proxy = NULL; #elif defined _WIN32 static int current_network_count; @@ -79,8 +81,8 @@ UPnPMappingAddRemove *mapping_data; }; -#ifdef HAVE_LIBNM -static void nm_callback_func(libnm_glib_ctx* ctx, gpointer user_data); +#ifdef HAVE_NETWORKMANAGER_NETWORKMANAGER_H +static NMState nm_get_network_state(void); #endif const unsigned char * @@ -591,61 +593,100 @@ gboolean purple_network_is_available(void) { -#ifdef HAVE_LIBNM - /* Try NetworkManager first, maybe we'll get lucky */ - int libnm_retval = -1; - - if (nm_context) +#ifdef HAVE_NETWORKMANAGER_NETWORKMANAGER_H + NMState state = nm_get_network_state(); + if (state == NM_STATE_UNKNOWN) { - if ((libnm_retval = libnm_glib_get_network_state(nm_context)) == LIBNM_NO_NETWORK_CONNECTION) - { - purple_debug_warning("network", "NetworkManager not active or reports no connection (retval = %i)\n", libnm_retval); - return FALSE; - } - if (libnm_retval == LIBNM_ACTIVE_NETWORK_CONNECTION) return TRUE; + purple_debug_warning("network", "NetworkManager not active. Assuming connection exists.\n"); + return TRUE; } + else if (state == NM_STATE_CONNECTED) + return TRUE; + + return FALSE; + #elif defined _WIN32 return (current_network_count > 0); +#else + return TRUE; #endif - return TRUE; } -#ifdef HAVE_LIBNM +#ifdef HAVE_NETWORKMANAGER_NETWORKMANAGER_H static void -nm_callback_func(libnm_glib_ctx* ctx, gpointer user_data) +nm_update_state(NMState state) { - static libnm_glib_state prev = LIBNM_NO_DBUS; - libnm_glib_state current; + static NMState prev = NM_STATE_UNKNOWN; PurpleConnectionUiOps *ui_ops = purple_connections_get_ui_ops(); - current = libnm_glib_get_network_state(ctx); - purple_debug_info("network","Entering nm_callback_func!\n"); - purple_signal_emit(purple_network_get_handle(), "network-configuration-changed", NULL); - switch(current) + switch(state) { - case LIBNM_ACTIVE_NETWORK_CONNECTION: - /* Call res_init in case DNS servers have changed */ - res_init(); - if (ui_ops != NULL && ui_ops->network_connected != NULL) - ui_ops->network_connected(); - prev = current; - break; - case LIBNM_NO_NETWORK_CONNECTION: - if (prev != LIBNM_ACTIVE_NETWORK_CONNECTION) + case NM_STATE_CONNECTED: + /* Call res_init in case DNS servers have changed */ + res_init(); + if (ui_ops != NULL && ui_ops->network_connected != NULL) + ui_ops->network_connected(); + prev = state; break; - if (ui_ops != NULL && ui_ops->network_disconnected != NULL) - ui_ops->network_disconnected(); - prev = current; - break; - case LIBNM_NO_DBUS: - case LIBNM_NO_NETWORKMANAGER: - case LIBNM_INVALID_CONTEXT: - default: - break; + case NM_STATE_ASLEEP: + case NM_STATE_CONNECTING: + case NM_STATE_DISCONNECTED: + if (prev != NM_STATE_CONNECTED) + break; + if (ui_ops != NULL && ui_ops->network_disconnected != NULL) + ui_ops->network_disconnected(); + prev = state; + break; + case NM_STATE_UNKNOWN: + default: + break; } } + +static void +nm_state_change_cb(DBusGProxy *proxy, NMState state, gpointer user_data) +{ + purple_debug_info("network", "Got StateChange from NetworkManager: %d.\n", state); + nm_update_state(state); +} + +static NMState +nm_get_network_state(void) +{ + GError *err = NULL; + NMState state = NM_STATE_UNKNOWN; + + if (!nm_proxy) + return NM_STATE_UNKNOWN; + + if (!dbus_g_proxy_call(nm_proxy, "state", &err, G_TYPE_INVALID, G_TYPE_UINT, &state, G_TYPE_INVALID)) { + /* XXX: Print an error? */ + return NM_STATE_UNKNOWN; + } + + return state; +} + +static void +nm_dbus_name_owner_changed_cb(DBusGProxy *proxy, char *service, char *old_owner, char *new_owner, gpointer user_data) +{ + if (g_str_equal(service, NM_DBUS_SERVICE)) { + gboolean old_owner_good = old_owner && (old_owner[0] != '\0'); + gboolean new_owner_good = new_owner && (new_owner[0] != '\0'); + + purple_debug_info("network", "Got NameOwnerChanged signal, service = '%s', old_owner = '%s', new_owner = '%s'\n", service, old_owner, new_owner); + if (!old_owner_good && new_owner_good) { /* Equivalent to old ServiceCreated signal */ + purple_debug_info("network", "NetworkManager has started.\n"); + nm_update_state(nm_get_network_state()); + } else if (old_owner_good && !new_owner_good) { /* Equivalent to old ServiceDeleted signal */ + purple_debug_info("network", "NetworkManager has gone away.\n"); + nm_update_state(NM_STATE_UNKNOWN); + } + } +} + #endif void * @@ -659,6 +700,9 @@ void purple_network_init(void) { +#ifdef HAVE_NETWORKMANAGER_NETWORKMANAGER_H + GError *error = NULL; +#endif #ifdef _WIN32 GError *err = NULL; gint cnt = wpurple_get_connected_network_count(); @@ -685,10 +729,27 @@ if(purple_prefs_get_bool("/purple/network/map_ports") || purple_prefs_get_bool("/purple/network/auto_ip")) purple_upnp_discover(NULL, NULL); -#ifdef HAVE_LIBNM - nm_context = libnm_glib_init(); - if(nm_context) - nm_callback_idx = libnm_glib_register_callback(nm_context, nm_callback_func, NULL, g_main_context_default()); +#ifdef HAVE_NETWORKMANAGER_NETWORKMANAGER_H + nm_conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error); + if (!nm_conn) { + purple_debug_warning("network", "Error connecting to DBus System service: %s.\n", error->message); + } else { + nm_proxy = dbus_g_proxy_new_for_name(nm_conn, + NM_DBUS_SERVICE, + NM_DBUS_PATH, + NM_DBUS_INTERFACE); + dbus_g_proxy_add_signal(nm_proxy, NM_DBUS_SIGNAL_STATE_CHANGE, G_TYPE_UINT, G_TYPE_INVALID); + dbus_g_proxy_connect_signal(nm_proxy, NM_DBUS_SIGNAL_STATE_CHANGE, + G_CALLBACK(nm_state_change_cb), NULL, NULL); + + dbus_proxy = dbus_g_proxy_new_for_name(nm_conn, + DBUS_SERVICE_DBUS, + DBUS_PATH_DBUS, + DBUS_INTERFACE_DBUS); + dbus_g_proxy_add_signal(dbus_proxy, "NameOwnerChanged", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); + dbus_g_proxy_connect_signal(dbus_proxy, "NameOwnerChanged", + G_CALLBACK(nm_dbus_name_owner_changed_cb), NULL, NULL); + } #endif purple_signal_register(purple_network_get_handle(), "network-configuration-changed", @@ -701,14 +762,17 @@ void purple_network_uninit(void) { -#ifdef HAVE_LIBNM - /* FIXME: If anyone can think of a more clever way to shut down libnm without - * using a global variable + this function, please do. */ - if(nm_context && nm_callback_idx) - libnm_glib_unregister_callback(nm_context, nm_callback_idx); - - if(nm_context) - libnm_glib_shutdown(nm_context); +#ifdef HAVE_NETWORKMANAGER_NETWORKMANAGER_H + if (nm_proxy) { + dbus_g_proxy_disconnect_signal(nm_proxy, NM_DBUS_SIGNAL_STATE_CHANGE, G_CALLBACK(nm_state_change_cb), NULL); + g_object_unref(G_OBJECT(nm_proxy)); + } + if (dbus_proxy) { + dbus_g_proxy_disconnect_signal(dbus_proxy, "NameOwnerChanged", G_CALLBACK(nm_dbus_name_owner_changed_cb), NULL); + g_object_unref(G_OBJECT(dbus_proxy)); + } + if (nm_conn) + dbus_g_connection_unref(nm_conn); #endif purple_signal_unregister(purple_network_get_handle(),
--- a/libpurple/protocols/msn/notification.c Sat May 10 10:03:23 2008 +0000 +++ b/libpurple/protocols/msn/notification.c Sat May 10 10:08:26 2008 +0000 @@ -1005,8 +1005,8 @@ passport = purple_normalize(account, purple_account_get_username(account)); - if ((strstr(passport, "@hotmail.") != NULL) || - (strstr(passport, "@msn.com") != NULL)) + if ((strstr(passport, "@hotmail.") == NULL) && + (strstr(passport, "@msn.com") == NULL)) return; if (count++ < 26)
--- a/libpurple/protocols/msnp9/notification.c Sat May 10 10:03:23 2008 +0000 +++ b/libpurple/protocols/msnp9/notification.c Sat May 10 10:08:26 2008 +0000 @@ -606,8 +606,8 @@ passport = purple_normalize(account, purple_account_get_username(account)); - if ((strstr(passport, "@hotmail.") != NULL) || - (strstr(passport, "@msn.com") != NULL)) + if ((strstr(passport, "@hotmail.") == NULL) && + (strstr(passport, "@msn.com") == NULL)) return; if (count++ < 26)
--- a/libpurple/protocols/oscar/oscar.c Sat May 10 10:03:23 2008 +0000 +++ b/libpurple/protocols/oscar/oscar.c Sat May 10 10:08:26 2008 +0000 @@ -1850,7 +1850,9 @@ else status_id = OSCAR_STATUS_ID_AVAILABLE; } else { - if (buddy_is_away) + if (type & AIM_ICQ_STATE_INVISIBLE) + status_id = OSCAR_STATUS_ID_INVISIBLE; + else if (buddy_is_away) status_id = OSCAR_STATUS_ID_AWAY; else status_id = OSCAR_STATUS_ID_AVAILABLE;
--- a/pidgin/gtkconn.c Sat May 10 10:03:23 2008 +0000 +++ b/pidgin/gtkconn.c Sat May 10 10:08:26 2008 +0000 @@ -200,8 +200,6 @@ { GList *list, *l; PidginBuddyList *gtkblist = pidgin_blist_get_default_gtk_blist(); - PurplePluginProtocolInfo *prpl_info = NULL; - PurpleConnection *gc = NULL; if(gtkblist) pidgin_status_box_set_network_available(PIDGIN_STATUS_BOX(gtkblist->statusbox), FALSE); @@ -210,15 +208,7 @@ while (l) { PurpleAccount *a = (PurpleAccount*)l->data; if (!purple_account_is_disconnected(a)) { - gc = purple_account_get_connection(a); - if (gc && gc->prpl) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); - if (prpl_info) { - if (prpl_info->keepalive) - prpl_info->keepalive(gc); - else - purple_account_disconnect(a); - } + purple_account_disconnect(a); } l = l->next; }
--- 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) {
--- a/pidgin/gtkdialogs.c Sat May 10 10:03:23 2008 +0000 +++ b/pidgin/gtkdialogs.c Sat May 10 10:08:26 2008 +0000 @@ -102,6 +102,7 @@ {"Peter 'Fmoo' Ruibal", NULL, NULL}, {"Elliott 'QuLogic' Sales de Andrade", NULL, NULL}, {"Gabriel 'Nix' Schulhof", NULL, NULL}, + {"Jorge 'Masca' VillaseƱor", NULL, NULL}, {NULL, NULL, NULL} }; @@ -628,7 +629,7 @@ #endif #ifndef _WIN32 -#ifdef HAVE_LIBNM +#ifdef HAVE_NETWORKMANAGER_NETWORKMANAGER_H g_string_append(str, " <b>NetworkManager:</b> Enabled<br/>"); #else g_string_append(str, " <b>NetworkManager:</b> Disabled<br/>");
--- a/pidgin/gtkstatusbox.c Sat May 10 10:03:23 2008 +0000 +++ b/pidgin/gtkstatusbox.c Sat May 10 10:08:26 2008 +0000 @@ -1131,7 +1131,7 @@ static gboolean imhtml_remove_focus(GtkWidget *w, GdkEventKey *event, PidginStatusBox *status_box) { - if (event->keyval == GDK_Tab || event->keyval == GDK_KP_Tab) + if (event->keyval == GDK_Tab || event->keyval == GDK_KP_Tab || event->keyval == GDK_ISO_Left_Tab) { /* If last inserted character is a tab, then remove the focus from here */ GtkWidget *top = gtk_widget_get_toplevel(w); @@ -1458,7 +1458,7 @@ } return TRUE; default: - return TRUE; + return FALSE; } }