~xnox/lightdm/archive-upload

« back to all changes in this revision

Viewing changes to src/lightdm.c

  • Committer: Robert Ancell
  • Date: 2013-11-27 03:48:36 UTC
  • mfrom: (1845 trunk)
  • mto: This revision was merged to the branch mainline in revision 1846.
  • Revision ID: robert.ancell@canonical.com-20131127034836-c9jba09zw4z3paur
Merge with trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
139
139
}
140
140
 
141
141
static void
 
142
set_seat_properties (Seat *seat, const gchar *config_section)
 
143
{
 
144
    gchar **keys;
 
145
    gint i;
 
146
 
 
147
    keys = config_get_keys (config_get_instance (), "SeatDefaults");
 
148
    for (i = 0; keys[i]; i++)
 
149
    {
 
150
        gchar *value = config_get_string (config_get_instance (), "SeatDefaults", keys[i]);
 
151
        seat_set_property (seat, keys[i], value);
 
152
        g_free (value);
 
153
    }
 
154
    g_strfreev (keys);
 
155
 
 
156
    if (config_section)
 
157
    {
 
158
        keys = config_get_keys (config_get_instance (), config_section);
 
159
        for (i = 0; keys[i]; i++)
 
160
        {
 
161
            gchar *value = config_get_string (config_get_instance (), config_section, keys[i]);
 
162
            seat_set_property (seat, keys[i], value);
 
163
            g_free (value);
 
164
        }
 
165
        g_strfreev (keys);
 
166
    }
 
167
}
 
168
 
 
169
static void
142
170
signal_cb (Process *process, int signum)
143
171
{
144
172
    g_debug ("Caught %s signal, shutting down", g_strsignal (signum));
156
184
static void
157
185
display_manager_seat_removed_cb (DisplayManager *display_manager, Seat *seat)
158
186
{
159
 
    if (seat_get_boolean_property (seat, "exit-on-failure"))
 
187
    gchar **types;
 
188
    gchar **iter;
 
189
    Seat *next_seat = NULL;
 
190
    GString *next_types;
 
191
 
 
192
    /* If we have fallback types registered for the seat, let's try them
 
193
       before giving up. */
 
194
    types = seat_get_string_list_property (seat, "type");
 
195
    next_types = g_string_new ("");
 
196
    for (iter = types; iter && *iter; iter++)
 
197
    {
 
198
        if (iter == types)
 
199
            continue; // skip first one, that is our current seat type
 
200
 
 
201
        if (!next_seat)
 
202
        {
 
203
            next_seat = seat_new (*iter);
 
204
            g_string_assign (next_types, *iter);
 
205
        }
 
206
        else
 
207
        {
 
208
            // Build up list of types to try next time
 
209
            g_string_append_c (next_types, ';');
 
210
            g_string_append (next_types, *iter);
 
211
        }
 
212
    }
 
213
    g_strfreev (types);
 
214
 
 
215
    if (next_seat)
 
216
    {
 
217
        const gchar *seat_name;
 
218
        gchar *config_section = NULL;
 
219
 
 
220
        seat_name = seat_get_string_property (seat, "seat-name");
 
221
        if (seat_name)
 
222
            config_section = g_strdup_printf ("Seat:%s", seat_name);
 
223
        set_seat_properties (next_seat, config_section);
 
224
        g_free (config_section);
 
225
 
 
226
        // We set this manually on default seat.  Let's port it over if needed.
 
227
        if (seat_get_boolean_property (seat, "exit-on-failure"))
 
228
            seat_set_property (next_seat, "exit-on-failure", "true");
 
229
 
 
230
        seat_set_property (next_seat, "type", next_types->str);
 
231
 
 
232
        display_manager_add_seat (display_manager, next_seat);
 
233
        g_object_unref (next_seat);
 
234
    }
 
235
    else if (seat_get_boolean_property (seat, "exit-on-failure"))
160
236
    {
161
237
        g_debug ("Required seat has stopped");
162
238
        exit_code = EXIT_FAILURE;
163
239
        display_manager_stop (display_manager);
164
240
    }
 
241
 
 
242
    g_string_free (next_types, TRUE);
165
243
}
166
244
 
167
245
static GVariant *
212
290
}
213
291
 
214
292
static void
215
 
set_seat_properties (Seat *seat, const gchar *config_section)
216
 
{
217
 
    gchar **keys;
218
 
    gint i;
219
 
 
220
 
    keys = config_get_keys (config_get_instance (), "SeatDefaults");
221
 
    for (i = 0; keys[i]; i++)
222
 
    {
223
 
        gchar *value = config_get_string (config_get_instance (), "SeatDefaults", keys[i]);
224
 
        seat_set_property (seat, keys[i], value);
225
 
        g_free (value);
226
 
    }
227
 
    g_strfreev (keys);
228
 
 
229
 
    if (config_section)
230
 
    {
231
 
        keys = config_get_keys (config_get_instance (), config_section);
232
 
        for (i = 0; keys[i]; i++)
233
 
        {
234
 
            gchar *value = config_get_string (config_get_instance (), config_section, keys[i]);
235
 
            seat_set_property (seat, keys[i], value);
236
 
            g_free (value);
237
 
        }
238
 
        g_strfreev (keys);
239
 
    }
240
 
}
241
 
 
242
 
static void
243
293
handle_display_manager_call (GDBusConnection       *connection,
244
294
                             const gchar           *sender,
245
295
                             const gchar           *object_path,
1199
1249
    for (i = groups; *i; i++)
1200
1250
    {
1201
1251
        gchar *config_section = *i;
1202
 
        gchar *type;
1203
 
        Seat *seat;
 
1252
        gchar **types;
 
1253
        gchar **type;
 
1254
        Seat *seat = NULL;
1204
1255
        const gchar *const seatpfx = "Seat:";
1205
1256
 
1206
1257
        if (!g_str_has_prefix (config_section, seatpfx))
1207
1258
            continue;
1208
1259
 
1209
1260
        g_debug ("Loading seat %s", config_section);
1210
 
        type = config_get_string (config_get_instance (), config_section, "type");
1211
 
        if (!type)
1212
 
            type = config_get_string (config_get_instance (), "SeatDefaults", "type");
1213
 
        seat = seat_new (type);
1214
 
        g_free (type);
 
1261
        types = config_get_string_list (config_get_instance (), config_section, "type");
 
1262
        if (!types)
 
1263
            types = config_get_string_list (config_get_instance (), "SeatDefaults", "type");
 
1264
        for (type = types; type && *type; type++)
 
1265
        {
 
1266
            seat = seat_new (*type);
 
1267
            if (seat)
 
1268
                break;
 
1269
        }
 
1270
        g_strfreev (types);
1215
1271
        if (seat)
1216
1272
        {
1217
1273
            const gsize seatpfxlen = strlen(seatpfx);
1232
1288
    /* If no seats start a default one */
1233
1289
    if (n_seats == 0 && config_get_boolean (config_get_instance (), "LightDM", "start-default-seat"))
1234
1290
    {
1235
 
        gchar *type;
1236
 
        Seat *seat;
 
1291
        gchar **types;
 
1292
        gchar **type;
 
1293
        Seat *seat = NULL;
1237
1294
 
1238
1295
        g_debug ("Adding default seat");
1239
1296
 
1240
 
        type = config_get_string (config_get_instance (), "SeatDefaults", "type");
1241
 
        seat = seat_new (type);
1242
 
        g_free (type);
 
1297
        types = config_get_string_list (config_get_instance (), "SeatDefaults", "type");
 
1298
        for (type = types; type && *type; type++)
 
1299
        {
 
1300
            seat = seat_new (*type);
 
1301
            if (seat)
 
1302
                break;
 
1303
        }
 
1304
        g_strfreev (types);
1243
1305
        if (seat)
1244
1306
        {
1245
1307
            set_seat_properties (seat, NULL);
1250
1312
        }
1251
1313
        else
1252
1314
        {
1253
 
            g_warning ("Failed to create default seat %s", type);
 
1315
            g_warning ("Failed to create default seat");
1254
1316
            return EXIT_FAILURE;
1255
1317
        }
1256
1318
    }