comparison pidgin/gtkblist.c @ 22898:5d833ca5a265

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.
author Casey Harkins <charkins@pidgin.im>
date Fri, 27 Jun 2008 00:01:41 +0000
parents b4a0f4b32ba5
children 7076f4e965c5
comparison
equal deleted inserted replaced
22823:750813c2db46 22898:5d833ca5a265
127 127
128 static GtkWidget *accountmenu = NULL; 128 static GtkWidget *accountmenu = NULL;
129 129
130 static guint visibility_manager_count = 0; 130 static guint visibility_manager_count = 0;
131 static GdkVisibilityState gtk_blist_visibility = GDK_VISIBILITY_UNOBSCURED; 131 static GdkVisibilityState gtk_blist_visibility = GDK_VISIBILITY_UNOBSCURED;
132 static gboolean gtk_blist_focused = FALSE;
132 static gboolean editing_blist = FALSE; 133 static gboolean editing_blist = FALSE;
133 134
134 static GList *pidgin_blist_sort_methods = NULL; 135 static GList *pidgin_blist_sort_methods = NULL;
135 static struct pidgin_blist_sort_method *current_sort_method = NULL; 136 static struct pidgin_blist_sort_method *current_sort_method = NULL;
136 static void sort_method_none(PurpleBlistNode *node, PurpleBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur, GtkTreeIter *iter); 137 static void sort_method_none(PurpleBlistNode *node, PurpleBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur, GtkTreeIter *iter);
5075 /******************************************/ 5076 /******************************************/
5076 /* End of connection error handling stuff */ 5077 /* End of connection error handling stuff */
5077 /******************************************/ 5078 /******************************************/
5078 5079
5079 static int 5080 static int
5080 blist_focus_cb(GtkWidget *widget, gpointer data, PidginBuddyList *gtkblist) 5081 blist_focus_cb(GtkWidget *widget, GdkEventFocus *event, PidginBuddyList *gtkblist)
5081 { 5082 {
5082 pidgin_set_urgent(GTK_WINDOW(gtkblist->window), FALSE); 5083 if(event->in) {
5084 gtk_blist_focused = TRUE;
5085 pidgin_set_urgent(GTK_WINDOW(gtkblist->window), FALSE);
5086 } else {
5087 gtk_blist_focused = FALSE;
5088 }
5083 return 0; 5089 return 0;
5084 } 5090 }
5085 5091
5086 #if 0 5092 #if 0
5087 static GtkWidget * 5093 static GtkWidget *
5164 gdk_pixbuf_fill(gtkblist->empty_avatar, 0x00000000); 5170 gdk_pixbuf_fill(gtkblist->empty_avatar, 0x00000000);
5165 5171
5166 gtkblist->window = pidgin_create_window(_("Buddy List"), 0, "buddy_list", TRUE); 5172 gtkblist->window = pidgin_create_window(_("Buddy List"), 0, "buddy_list", TRUE);
5167 g_signal_connect(G_OBJECT(gtkblist->window), "focus-in-event", 5173 g_signal_connect(G_OBJECT(gtkblist->window), "focus-in-event",
5168 G_CALLBACK(blist_focus_cb), gtkblist); 5174 G_CALLBACK(blist_focus_cb), gtkblist);
5175 g_signal_connect(G_OBJECT(gtkblist->window), "focus-out-event",
5176 G_CALLBACK(blist_focus_cb), gtkblist);
5169 GTK_WINDOW(gtkblist->window)->allow_shrink = TRUE; 5177 GTK_WINDOW(gtkblist->window)->allow_shrink = TRUE;
5170 5178
5171 gtkblist->main_vbox = gtk_vbox_new(FALSE, 0); 5179 gtkblist->main_vbox = gtk_vbox_new(FALSE, 0);
5172 gtk_widget_show(gtkblist->main_vbox); 5180 gtk_widget_show(gtkblist->main_vbox);
5173 gtk_container_add(GTK_CONTAINER(gtkblist->window), gtkblist->main_vbox); 5181 gtk_container_add(GTK_CONTAINER(gtkblist->window), gtkblist->main_vbox);
6884 void 6892 void
6885 pidgin_blist_toggle_visibility() 6893 pidgin_blist_toggle_visibility()
6886 { 6894 {
6887 if (gtkblist && gtkblist->window) { 6895 if (gtkblist && gtkblist->window) {
6888 if (GTK_WIDGET_VISIBLE(gtkblist->window)) { 6896 if (GTK_WIDGET_VISIBLE(gtkblist->window)) {
6897 /* make the buddy list visible if it is iconified or if it is
6898 * obscured and not currently focused (the focus part ensures
6899 * that we do something reasonable if the buddy list is obscured
6900 * by a window set to always be on top), otherwise hide the
6901 * buddy list
6902 */
6889 purple_blist_set_visible(PIDGIN_WINDOW_ICONIFIED(gtkblist->window) || 6903 purple_blist_set_visible(PIDGIN_WINDOW_ICONIFIED(gtkblist->window) ||
6890 gtk_blist_visibility != GDK_VISIBILITY_UNOBSCURED); 6904 ((gtk_blist_visibility != GDK_VISIBILITY_UNOBSCURED) &&
6905 !gtk_blist_focused));
6891 } else { 6906 } else {
6892 purple_blist_set_visible(TRUE); 6907 purple_blist_set_visible(TRUE);
6893 } 6908 }
6894 } 6909 }
6895 } 6910 }