# HG changeset patch # User Casey Harkins # Date 1214524901 0 # Node ID 5d833ca5a2651fdc374e1fd39f4649516a5b3df4 # Parent 750813c2db46874d1bad6de7ca686221b901d4e0 Make pidgin_blist_toggle_visibility() hide the buddy list when it is partially obscured but has the focus. This ensures we do something reasonable if the buddy list is obscured by an "always on top" window. Fixes #5145. diff -r 750813c2db46 -r 5d833ca5a265 pidgin/gtkblist.c --- a/pidgin/gtkblist.c Mon May 05 16:01:02 2008 +0000 +++ b/pidgin/gtkblist.c Fri Jun 27 00:01:41 2008 +0000 @@ -129,6 +129,7 @@ static guint visibility_manager_count = 0; static GdkVisibilityState gtk_blist_visibility = GDK_VISIBILITY_UNOBSCURED; +static gboolean gtk_blist_focused = FALSE; static gboolean editing_blist = FALSE; static GList *pidgin_blist_sort_methods = NULL; @@ -5077,9 +5078,14 @@ /******************************************/ static int -blist_focus_cb(GtkWidget *widget, gpointer data, PidginBuddyList *gtkblist) -{ - pidgin_set_urgent(GTK_WINDOW(gtkblist->window), FALSE); +blist_focus_cb(GtkWidget *widget, GdkEventFocus *event, PidginBuddyList *gtkblist) +{ + if(event->in) { + gtk_blist_focused = TRUE; + pidgin_set_urgent(GTK_WINDOW(gtkblist->window), FALSE); + } else { + gtk_blist_focused = FALSE; + } return 0; } @@ -5166,6 +5172,8 @@ gtkblist->window = pidgin_create_window(_("Buddy List"), 0, "buddy_list", TRUE); g_signal_connect(G_OBJECT(gtkblist->window), "focus-in-event", G_CALLBACK(blist_focus_cb), gtkblist); + g_signal_connect(G_OBJECT(gtkblist->window), "focus-out-event", + G_CALLBACK(blist_focus_cb), gtkblist); GTK_WINDOW(gtkblist->window)->allow_shrink = TRUE; gtkblist->main_vbox = gtk_vbox_new(FALSE, 0); @@ -6886,8 +6894,15 @@ { if (gtkblist && gtkblist->window) { if (GTK_WIDGET_VISIBLE(gtkblist->window)) { + /* make the buddy list visible if it is iconified or if it is + * obscured and not currently focused (the focus part ensures + * that we do something reasonable if the buddy list is obscured + * by a window set to always be on top), otherwise hide the + * buddy list + */ purple_blist_set_visible(PIDGIN_WINDOW_ICONIFIED(gtkblist->window) || - gtk_blist_visibility != GDK_VISIBILITY_UNOBSCURED); + ((gtk_blist_visibility != GDK_VISIBILITY_UNOBSCURED) && + !gtk_blist_focused)); } else { purple_blist_set_visible(TRUE); }