+ const gchar *type;
+ gchar **types;
+ gchar **iter;
+ gboolean make_seats = FALSE;
+ Seat *next_seat = NULL;
+
+ /* If we have fallback types registered for the seat, let's try them
+ before giving up. This code does not expect a type name to appear twice
+ in the type list. It is a configuration error to do so. */
+ type = seat_get_type_name(seat);
+ types = seat_get_string_list_property (seat, "type");
+ for (iter = types; !next_seat && iter && *iter; iter++)
+ {
+ if (make_seats)
+ next_seat = seat_new (*iter);
+ else if (g_strcmp0 (type, *iter) == 0)
+ make_seats = TRUE;
+ }
+ g_strfreev (types);
+
+ if (next_seat)
+ {
+ const gchar *seat_name;
+ gchar *config_section = NULL;
+
+ seat_name = seat_get_string_property (seat, "seat-name");
+ if (seat_name)
+ config_section = g_strdup_printf ("Seat:%s", seat_name);
+ set_seat_properties (next_seat, config_section);
+ g_free (config_section);
+
+ // We set this manually on default seat. Let's port it over if needed.
+ if (seat_get_boolean_property (seat, "exit-on-failure"))
+ seat_set_property (next_seat, "exit-on-failure", "true");
+
+ display_manager_add_seat (display_manager, next_seat);
+ g_object_unref (next_seat);
+ }
+ else if (seat_get_boolean_property (seat, "exit-on-failure"))