Mercurial > pidgin
diff plugins/docklet/docklet.c @ 12016:24c7fb94d3a3
[gaim-migrate @ 14309]
Patch from charkins to fix potential problems with the buddy list becoming invisible with no way to restore visiblity. This (re)introduces the concept of a "visibility manager" that, if present, will be in charge of controlling the visibility of the buddy list.
committer: Tailor Script <tailor@pidgin.im>
| author | Daniel Atallah <daniel.atallah@gmail.com> |
|---|---|
| date | Wed, 09 Nov 2005 02:25:26 +0000 |
| parents | c7a36461b00c |
| children | 014c22dd9d06 |
line wrap: on
line diff
--- a/plugins/docklet/docklet.c Wed Nov 09 01:36:28 2005 +0000 +++ b/plugins/docklet/docklet.c Wed Nov 09 02:25:26 2005 +0000 @@ -52,7 +52,6 @@ GaimPlugin *handle = NULL; static struct docklet_ui_ops *ui_ops = NULL; static DockletStatus status = DOCKLET_STATUS_OFFLINE; -static gulong gtkblist_delete_cb_id = 0; static gboolean enable_join_chat = FALSE; static guint docklet_blinking_timer = 0; @@ -212,74 +211,8 @@ } /************************************************************************** - * minimize to and unminimize from the tray icon - **************************************************************************/ -static void -minimize_to_tray() -{ - GaimGtkBuddyList *blist = gaim_gtk_blist_get_default_gtk_blist(); - - if(!blist || !blist->window) - return; - - if (ui_ops && ui_ops->minimize) - ui_ops->minimize(blist->window); - - gaim_prefs_set_bool("/gaim/gtk/blist/list_visible", FALSE); - gtk_widget_hide(blist->window); - - docklet_update_status(); -} - -static void -unminimize_from_tray() -{ - GaimGtkBuddyList *blist = gaim_gtk_blist_get_default_gtk_blist(); - - if(!blist || !blist->window) - return; - - if (ui_ops && ui_ops->maximize) - ui_ops->maximize(blist->window); - - gaim_blist_set_visible(TRUE); - - docklet_update_status(); -} - -static void -docklet_toggle_blist() -{ - if(gaim_prefs_get_bool("/gaim/gtk/blist/list_visible")) - minimize_to_tray(); - else - unminimize_from_tray(); -} - -/************************************************************************** * callbacks and signal handlers **************************************************************************/ -/* catch delete events on gtkblist and hide it instead */ -static gboolean -gtkblist_delete_cb(GtkWidget *widget) { - gaim_debug(GAIM_DEBUG_INFO, "docklet", "hiding buddy list\n"); - minimize_to_tray(widget); - return TRUE; -} - -/* connect to delete signal when gtkblist is created */ -static void -gtkblist_created_cb(GaimBuddyList *list) -{ - if(list!=NULL && GAIM_IS_GTK_BLIST(list) && - GAIM_GTK_BLIST(list)->window!=NULL && - gtkblist_delete_cb_id==0) { - - gtkblist_delete_cb_id = g_signal_connect(G_OBJECT(GAIM_GTK_BLIST(list)->window), - "delete_event", G_CALLBACK(gtkblist_delete_cb), NULL); - } -} - static void gaim_quit_cb() { @@ -334,6 +267,12 @@ gaim_prefs_set_bool("/gaim/gtk/sound/mute", GTK_CHECK_MENU_ITEM(toggle)->active); } +static void +docklet_toggle_blist(GtkWidget *toggle, void *data) +{ + gaim_blist_set_visible(GTK_CHECK_MENU_ITEM(toggle)->active); +} + #ifdef _WIN32 /* This is a workaround for a bug in windows GTK+. Clicking outside of the menu does not get rid of it, so instead we get rid of it as soon as the @@ -440,7 +379,7 @@ || status==DOCKLET_STATUS_AWAY_PENDING) focus_first_unseen_conv(); else - docklet_toggle_blist(); + gaim_gtk_blist_toggle_visibility(); break; case 3: docklet_menu(); @@ -451,6 +390,7 @@ void docklet_embedded() { + gaim_gtk_blist_visibility_manager_add(); docklet_update_status(); if (ui_ops && ui_ops->update_icon) ui_ops->update_icon(status); @@ -459,7 +399,7 @@ void docklet_remove(gboolean visible) { - unminimize_from_tray(); + gaim_gtk_blist_visibility_manager_remove(); } void @@ -508,36 +448,22 @@ gaim_signal_connect(conv_handle, "conversation-updated", plugin, GAIM_CALLBACK(docklet_conv_updated_cb), NULL); - gaim_signal_connect(gaim_gtk_blist_get_handle(), "gtkblist-created", - plugin, GAIM_CALLBACK(gtkblist_created_cb), NULL); - gtkblist_created_cb(gaim_get_blist()); - gaim_signal_connect(core_handle, "quitting", plugin, GAIM_CALLBACK(gaim_quit_cb), NULL); enable_join_chat = online_account_supports_chat(); - if(!gaim_prefs_get_bool("/gaim/gtk/blist/list_visible")) - minimize_to_tray(); - return TRUE; } static gboolean plugin_unload(GaimPlugin *plugin) { - GaimGtkBuddyList *gtkblist = gaim_gtk_blist_get_default_gtk_blist(); - if (ui_ops && ui_ops->destroy) ui_ops->destroy(); /* remove callbacks */ - gaim_signals_disconnect_by_handle(handle); - if(gtkblist_delete_cb_id!=0) - g_signal_handler_disconnect(G_OBJECT(gtkblist->window), gtkblist_delete_cb_id); - gtkblist_delete_cb_id = 0; - - unminimize_from_tray(); + gaim_signals_disconnect_by_handle(handle); gaim_debug(GAIM_DEBUG_INFO, "docklet", "plugin unloaded\n");
