diff options
-rw-r--r-- | src/lightdm.c | 44 | ||||
-rw-r--r-- | tests/scripts/dbus.conf | 4 |
2 files changed, 33 insertions, 15 deletions
diff --git a/src/lightdm.c b/src/lightdm.c index 886eae81..fdebd682 100644 --- a/src/lightdm.c +++ b/src/lightdm.c @@ -611,11 +611,6 @@ seat_bus_entry_free (gpointer data) { SeatBusEntry *entry = data; - g_dbus_connection_unregister_object (bus, entry->bus_id); - - emit_object_value_changed (bus, "/org/freedesktop/DisplayManager", "org.freedesktop.DisplayManager", "Seats", get_seat_list ()); - emit_object_signal (bus, "/org/freedesktop/DisplayManager", "SeatRemoved", entry->path); - g_free (entry->path); g_free (entry); } @@ -625,14 +620,6 @@ session_bus_entry_free (gpointer data) { SessionBusEntry *entry = data; - g_dbus_connection_unregister_object (bus, entry->bus_id); - - emit_object_value_changed (bus, "/org/freedesktop/DisplayManager", "org.freedesktop.DisplayManager", "Sessions", get_session_list (NULL)); - emit_object_signal (bus, "/org/freedesktop/DisplayManager", "SessionRemoved", entry->path); - - emit_object_value_changed (bus, entry->seat_path, "org.freedesktop.DisplayManager.Seat", "Sessions", get_session_list (entry->seat_path)); - emit_object_signal (bus, entry->seat_path, "SessionRemoved", entry->path); - g_free (entry->path); g_free (entry->seat_path); g_free (entry); @@ -685,8 +672,28 @@ running_user_session_cb (Seat *seat, Session *session) static void session_removed_cb (Seat *seat, Session *session) { + SessionBusEntry *entry; + gchar *seat_path = NULL; + g_signal_handlers_disconnect_matched (session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); + + entry = g_hash_table_lookup (session_bus_entries, session); + if (entry) + { + g_dbus_connection_unregister_object (bus, entry->bus_id); + emit_object_signal (bus, "/org/freedesktop/DisplayManager", "SessionRemoved", entry->path); + emit_object_signal (bus, entry->seat_path, "SessionRemoved", entry->path); + seat_path = g_strdup (entry->seat_path); + } + g_hash_table_remove (session_bus_entries, session); + + if (seat_path) + { + emit_object_value_changed (bus, "/org/freedesktop/DisplayManager", "org.freedesktop.DisplayManager", "Sessions", get_session_list (NULL)); + emit_object_value_changed (bus, seat_path, "org.freedesktop.DisplayManager.Seat", "Sessions", get_session_list (seat_path)); + g_free (seat_path); + } } static void @@ -730,7 +737,18 @@ seat_added_cb (DisplayManager *display_manager, Seat *seat) static void seat_removed_cb (DisplayManager *display_manager, Seat *seat) { + SeatBusEntry *entry; + + entry = g_hash_table_lookup (seat_bus_entries, seat); + if (entry) + { + g_dbus_connection_unregister_object (bus, entry->bus_id); + emit_object_signal (bus, "/org/freedesktop/DisplayManager", "SeatRemoved", entry->path); + } + g_hash_table_remove (seat_bus_entries, seat); + + emit_object_value_changed (bus, "/org/freedesktop/DisplayManager", "org.freedesktop.DisplayManager", "Seats", get_seat_list ()); } static gboolean diff --git a/tests/scripts/dbus.conf b/tests/scripts/dbus.conf index 5f2ce05b..e38c9c09 100644 --- a/tests/scripts/dbus.conf +++ b/tests/scripts/dbus.conf @@ -64,10 +64,10 @@ user-session=default #?XSERVER-0 TERMINATE SIGNAL=15 # Removal is reported via D-Bus -#?RUNNER DBUS-PROPERTIES-CHANGED PATH=/org/freedesktop/DisplayManager INTERFACE=org.freedesktop.DisplayManager CHANGED=Sessions #?RUNNER DBUS-SIGNAL PATH=/org/freedesktop/DisplayManager INTERFACE=org.freedesktop.DisplayManager NAME=SessionRemoved -#?RUNNER DBUS-PROPERTIES-CHANGED PATH=/org/freedesktop/DisplayManager/Seat0 INTERFACE=org.freedesktop.DisplayManager.Seat CHANGED=Sessions #?RUNNER DBUS-SIGNAL PATH=/org/freedesktop/DisplayManager/Seat0 INTERFACE=org.freedesktop.DisplayManager NAME=SessionRemoved +#?RUNNER DBUS-PROPERTIES-CHANGED PATH=/org/freedesktop/DisplayManager INTERFACE=org.freedesktop.DisplayManager CHANGED=Sessions +#?RUNNER DBUS-PROPERTIES-CHANGED PATH=/org/freedesktop/DisplayManager/Seat0 INTERFACE=org.freedesktop.DisplayManager.Seat CHANGED=Sessions # X server starts #?XSERVER-0 START VT=7 SEAT=seat0 |