Mercurial > pidgin.yaz
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 } |