diff options
author | Lars Uebernickel <lars.uebernickel@canonical.com> | 2012-11-21 00:02:12 +0100 |
---|---|---|
committer | Lars Uebernickel <lars.uebernickel@canonical.com> | 2012-11-21 00:02:12 +0100 |
commit | d22b49e5fee5ae352ec6050e63181850a857fb3a (patch) | |
tree | f64a82b8233d0fcc18cdfd3c918b361f22ebd14f /src/im-application-list.c | |
parent | 15f2eef7082f9a68b1511f0868cdd60558b3a4f6 (diff) | |
download | ayatana-indicator-messages-d22b49e5fee5ae352ec6050e63181850a857fb3a.tar.gz ayatana-indicator-messages-d22b49e5fee5ae352ec6050e63181850a857fb3a.tar.bz2 ayatana-indicator-messages-d22b49e5fee5ae352ec6050e63181850a857fb3a.zip |
Remove applications from the menu when the disappear from the bus
Diffstat (limited to 'src/im-application-list.c')
-rw-r--r-- | src/im-application-list.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/im-application-list.c b/src/im-application-list.c index 920626d..6da2950 100644 --- a/src/im-application-list.c +++ b/src/im-application-list.c @@ -43,6 +43,7 @@ enum SOURCE_REMOVED, MESSAGE_ADDED, MESSAGE_REMOVED, + APP_STOPPED, N_SIGNALS }; @@ -179,6 +180,16 @@ im_application_list_class_init (ImApplicationListClass *klass) 2, G_TYPE_DESKTOP_APP_INFO, G_TYPE_STRING); + + signals[APP_STOPPED] = g_signal_new ("app-stopped", + IM_TYPE_APPLICATION_LIST, + G_SIGNAL_RUN_FIRST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, + 1, + G_TYPE_DESKTOP_APP_INFO); } static void @@ -394,6 +405,31 @@ im_application_list_messages_listed (GObject *source_object, } static void +im_application_list_app_vanished (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + Application *app = user_data; + + if (app->cancellable) + { + g_cancellable_cancel (app->cancellable); + g_clear_object (&app->cancellable); + } + g_clear_object (&app->proxy); + + /* clear actions by creating a new action group and overriding it in + * the muxer */ + g_object_unref (app->actions); + app->actions = g_simple_action_group_new (); + g_action_muxer_insert (app->list->muxer, + g_app_info_get_id (G_APP_INFO (app->info)), + G_ACTION_GROUP (app->actions)); + + g_signal_emit (app->list, signals[APP_STOPPED], 0, app->info); +} + +static void im_application_list_proxy_created (GObject *source_object, GAsyncResult *result, gpointer user_data) @@ -419,6 +455,12 @@ im_application_list_proxy_created (GObject *source_object, g_signal_connect_swapped (app->proxy, "source-removed", G_CALLBACK (im_application_list_source_removed), app); g_signal_connect_swapped (app->proxy, "message-added", G_CALLBACK (im_application_list_message_added), app); g_signal_connect_swapped (app->proxy, "message-removed", G_CALLBACK (im_application_list_message_removed), app); + + g_bus_watch_name_on_connection (g_dbus_proxy_get_connection (G_DBUS_PROXY (app->proxy)), + g_dbus_proxy_get_name (G_DBUS_PROXY (app->proxy)), + G_BUS_NAME_WATCHER_FLAGS_NONE, + NULL, im_application_list_app_vanished, + app, NULL); } void |