g_free (path);
}
+static void
+set_seat_properties (Seat *seat, const gchar *config_section)
+{
+ gchar **keys;
+ gint i;
+
+ keys = config_get_keys (config_get_instance (), "SeatDefaults");
+ for (i = 0; keys[i]; i++)
+ {
+ gchar *value = config_get_string (config_get_instance (), "SeatDefaults", keys[i]);
+ seat_set_property (seat, keys[i], value);
+ g_free (value);
+ }
+ g_strfreev (keys);
+
+ if (config_section)
+ {
+ keys = config_get_keys (config_get_instance (), config_section);
+ for (i = 0; keys[i]; i++)
+ {
+ gchar *value = config_get_string (config_get_instance (), config_section, keys[i]);
+ seat_set_property (seat, keys[i], value);
+ g_free (value);
+ }
+ g_strfreev (keys);
+ }
+}
+
static void
signal_cb (Process *process, int signum)
{
static void
display_manager_seat_removed_cb (DisplayManager *display_manager, Seat *seat)
{
- if (seat_get_boolean_property (seat, "exit-on-failure"))
+ 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"))
{
g_debug ("Required seat has stopped");
exit_code = EXIT_FAILURE;
return result;
}
-static void
-set_seat_properties (Seat *seat, const gchar *config_section)
-{
- gchar **keys;
- gint i;
-
- keys = config_get_keys (config_get_instance (), "SeatDefaults");
- for (i = 0; keys[i]; i++)
- {
- gchar *value = config_get_string (config_get_instance (), "SeatDefaults", keys[i]);
- seat_set_property (seat, keys[i], value);
- g_free (value);
- }
- g_strfreev (keys);
-
- if (config_section)
- {
- keys = config_get_keys (config_get_instance (), config_section);
- for (i = 0; keys[i]; i++)
- {
- gchar *value = config_get_string (config_get_instance (), config_section, keys[i]);
- seat_set_property (seat, keys[i], value);
- g_free (value);
- }
- g_strfreev (keys);
- }
-}
-
static void
handle_display_manager_call (GDBusConnection *connection,
const gchar *sender,
types = config_get_string_list (config_get_instance (), config_section, "type");
if (!types)
types = config_get_string_list (config_get_instance (), "SeatDefaults", "type");
- for (type = types; !seat && *type; type++)
+ for (type = types; !seat && type && *type; type++)
seat = seat_new (*type);
g_strfreev (types);
if (seat)
g_debug ("Adding default seat");
types = config_get_string_list (config_get_instance (), "SeatDefaults", "type");
- for (type = types; !seat && *type; type++)
+ for (type = types; !seat && type && *type; type++)
seat = seat_new (*type);
g_strfreev (types);
if (seat)
return seat;
}
+const gchar *
+seat_get_type_name (Seat *seat)
+{
+ GList *values = NULL;
+ GList *iter;
+ const gchar *name = NULL;
+
+ if (seat_modules)
+ values = g_hash_table_get_values (seat_modules);
+
+ for (iter = values; iter; iter = iter->next)
+ {
+ SeatModule *module = (SeatModule *)iter->data;
+ if (module->type == G_OBJECT_TYPE (seat))
+ {
+ name = module->name;
+ break;
+ }
+ }
+
+ g_list_free (values);
+ return name;
+}
+
void
seat_set_property (Seat *seat, const gchar *name, const gchar *value)
{
return g_hash_table_lookup (seat->priv->properties, name);
}
+gchar **
+seat_get_string_list_property (Seat *seat, const gchar *name)
+{
+ g_return_val_if_fail (seat != NULL, NULL);
+ return g_strsplit (g_hash_table_lookup (seat->priv->properties, name), ";", 0);
+}
+
gboolean
seat_get_boolean_property (Seat *seat, const gchar *name)
{