summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ck-manager.c29
-rw-r--r--src/ck-seat.c19
-rw-r--r--src/ck-seat.h2
3 files changed, 23 insertions, 27 deletions
diff --git a/src/ck-manager.c b/src/ck-manager.c
index d5d2c65..440163b 100644
--- a/src/ck-manager.c
+++ b/src/ck-manager.c
@@ -1304,13 +1304,21 @@ add_new_seat (CkManager *manager,
sid = generate_seat_id (manager);
seat = ck_seat_new (sid, kind);
- if (seat == NULL) {
- /* returns null if connection to bus fails */
- g_free (sid);
- goto out;
- }
+
+ /* First we connect our own signals to the seat, followed by
+ * the D-Bus signal hookup to make sure we can first dump the
+ * database and only then send out the D-Bus signals for
+ * it. GObject guarantees us that the signal handlers are
+ * called in the same order as they are registered. */
connect_seat_signals (manager, seat);
+ if (!ck_seat_register (seat)) {
+ /* returns false if connection to bus fails */
+ disconnect_seat_signals (manager, seat);
+ g_object_unref (seat);
+ g_free (sid);
+ return NULL;
+ }
g_hash_table_insert (manager->priv->seats, sid, seat);
@@ -1322,7 +1330,6 @@ add_new_seat (CkManager *manager,
log_seat_added_event (manager, seat);
- out:
return seat;
}
@@ -2407,14 +2414,16 @@ add_seat_for_file (CkManager *manager,
sid = generate_seat_id (manager);
seat = ck_seat_new_from_file (sid, filename);
- if (seat == NULL) {
- /* returns null if connection to bus fails */
+
+ connect_seat_signals (manager, seat);
+ if (!ck_seat_register (seat)) {
+ /* returns false if connection to bus fails */
+ disconnect_seat_signals (manager, seat);
+ g_object_unref (seat);
g_free (sid);
return;
}
- connect_seat_signals (manager, seat);
-
g_hash_table_insert (manager->priv->seats, sid, seat);
g_debug ("Added seat: %s", sid);
diff --git a/src/ck-seat.c b/src/ck-seat.c
index 8edaaeb..27ccf14 100644
--- a/src/ck-seat.c
+++ b/src/ck-seat.c
@@ -741,8 +741,8 @@ active_vt_changed (CkVtMonitor *vt_monitor,
update_active_vt (seat, num);
}
-static gboolean
-register_seat (CkSeat *seat)
+gboolean
+ck_seat_register (CkSeat *seat)
{
GError *error = NULL;
@@ -1023,19 +1023,12 @@ ck_seat_new (const char *sid,
CkSeatKind kind)
{
GObject *object;
- gboolean res;
object = g_object_new (CK_TYPE_SEAT,
"id", sid,
"kind", kind,
NULL);
- res = register_seat (CK_SEAT (object));
- if (! res) {
- g_object_unref (object);
- return NULL;
- }
-
return CK_SEAT (object);
}
@@ -1045,7 +1038,6 @@ ck_seat_new_with_devices (const char *sid,
GPtrArray *devices)
{
GObject *object;
- gboolean res;
int i;
object = g_object_new (CK_TYPE_SEAT,
@@ -1059,12 +1051,6 @@ ck_seat_new_with_devices (const char *sid,
}
}
- res = register_seat (CK_SEAT (object));
- if (! res) {
- g_object_unref (object);
- return NULL;
- }
-
return CK_SEAT (object);
}
@@ -1232,4 +1218,3 @@ ck_seat_dump (CkSeat *seat,
g_free (group_name);
}
-
diff --git a/src/ck-seat.h b/src/ck-seat.h
index efae465..47d10a7 100644
--- a/src/ck-seat.h
+++ b/src/ck-seat.h
@@ -91,6 +91,8 @@ CkSeat * ck_seat_new_with_devices (const char *sid,
CkSeatKind kind,
GPtrArray *devices);
+gboolean ck_seat_register (CkSeat *seat);
+
void ck_seat_dump (CkSeat *seat,
GKeyFile *key_file);