blob: c0294da4ff7700da7f9065e5fbf08548c1ac540b [file] [log] [blame]
Stéphane Marchesinae37e6c2014-08-08 18:19:40 -07001/*
David Sodman8ef20062015-01-06 09:23:40 -08002 * Copyright 2014 The Chromium OS Authors. All rights reserved.
Stéphane Marchesinae37e6c2014-08-08 18:19:40 -07003 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file.
5 */
6
Dominik Behrda6df412016-08-02 12:56:42 -07007#include <errno.h>
Dominik Behr46c567f2016-03-08 15:11:48 -08008#include <fcntl.h>
Dominik Behr580462b2014-11-20 13:50:05 -08009#include <getopt.h>
Stéphane Marchesinae37e6c2014-08-08 18:19:40 -070010#include <libtsm.h>
Dominik Behr580462b2014-11-20 13:50:05 -080011#include <memory.h>
12#include <stdbool.h>
Stéphane Marchesinae37e6c2014-08-08 18:19:40 -070013#include <stdio.h>
14#include <stdlib.h>
15#include <unistd.h>
Dominik Behr46c567f2016-03-08 15:11:48 -080016#include <sys/stat.h>
17#include <sys/types.h>
Stéphane Marchesinae37e6c2014-08-08 18:19:40 -070018
Dominik Behr580462b2014-11-20 13:50:05 -080019#include "dbus.h"
Dominik Behr44e07e62016-01-13 19:43:57 -080020#include "dbus_interface.h"
Dominik Behr5239cca2016-01-21 18:22:04 -080021#include "dev.h"
Stéphane Marchesinae37e6c2014-08-08 18:19:40 -070022#include "input.h"
Dominik Behr44e07e62016-01-13 19:43:57 -080023#include "main.h"
Dominik Behr580462b2014-11-20 13:50:05 -080024#include "splash.h"
Stéphane Marchesinae37e6c2014-08-08 18:19:40 -070025#include "term.h"
David Sodmanbbcb0522014-09-19 10:34:07 -070026#include "util.h"
Stéphane Marchesinae37e6c2014-08-08 18:19:40 -070027
David Sodmanbbcb0522014-09-19 10:34:07 -070028#define FLAG_CLEAR 'c'
29#define FLAG_DAEMON 'd'
Dominik Behrd2530902016-05-05 14:01:06 -070030#define FLAG_ENABLE_GFX 'G'
Dominik Behr0bb51772016-07-26 18:04:53 -070031#define FLAG_ENABLE_VT1 '1'
Dominik Behr46c567f2016-03-08 15:11:48 -080032#define FLAG_ENABLE_VTS 'e'
David Sodmanbbcb0522014-09-19 10:34:07 -070033#define FLAG_FRAME_INTERVAL 'f'
34#define FLAG_GAMMA 'g'
Dominik Behr32a7c892015-10-09 15:47:53 -070035#define FLAG_IMAGE 'i'
36#define FLAG_IMAGE_HIRES 'I'
Dominik Behrfd9fdda2016-03-28 17:16:45 -070037#define FLAG_LOOP_COUNT 'C'
David Sodman8ef20062015-01-06 09:23:40 -080038#define FLAG_LOOP_START 'l'
39#define FLAG_LOOP_INTERVAL 'L'
40#define FLAG_LOOP_OFFSET 'o'
Dominik Behrda6df412016-08-02 12:56:42 -070041#define FLAG_NUM_VTS 'N'
Dominik Behr222936d2016-05-05 13:50:50 -070042#define FLAG_NO_LOGIN 'n'
David Sodman8ef20062015-01-06 09:23:40 -080043#define FLAG_OFFSET 'O'
Dominik Behrda6df412016-08-02 12:56:42 -070044#define FLAG_PRE_CREATE_VTS 'P'
David Sodmanbbcb0522014-09-19 10:34:07 -070045#define FLAG_PRINT_RESOLUTION 'p'
Dominik Behr92d9e312016-05-04 20:10:48 -070046#define FLAG_SCALE 'S'
Dominik Behrfd9fdda2016-03-28 17:16:45 -070047#define FLAG_SPLASH_ONLY 's'
David Sodmanbbcb0522014-09-19 10:34:07 -070048
49static struct option command_options[] = {
50 { "clear", required_argument, NULL, FLAG_CLEAR },
51 { "daemon", no_argument, NULL, FLAG_DAEMON },
Dominik Behr46c567f2016-03-08 15:11:48 -080052 { "dev-mode", no_argument, NULL, FLAG_ENABLE_VTS },
Dominik Behrd2530902016-05-05 14:01:06 -070053 { "enable-gfx", no_argument, NULL, FLAG_ENABLE_GFX },
Dominik Behr0bb51772016-07-26 18:04:53 -070054 { "enable-vt1", no_argument, NULL, FLAG_ENABLE_VT1 },
Dominik Behr46c567f2016-03-08 15:11:48 -080055 { "enable-vts", no_argument, NULL, FLAG_ENABLE_VTS },
David Sodmanbbcb0522014-09-19 10:34:07 -070056 { "frame-interval", required_argument, NULL, FLAG_FRAME_INTERVAL },
57 { "gamma", required_argument, NULL, FLAG_GAMMA },
Dominik Behr32a7c892015-10-09 15:47:53 -070058 { "image", required_argument, NULL, FLAG_IMAGE },
59 { "image-hires", required_argument, NULL, FLAG_IMAGE_HIRES },
Dominik Behrfd9fdda2016-03-28 17:16:45 -070060 { "loop-count", required_argument, NULL, FLAG_LOOP_COUNT },
David Sodman8ef20062015-01-06 09:23:40 -080061 { "loop-start", required_argument, NULL, FLAG_LOOP_START },
62 { "loop-interval", required_argument, NULL, FLAG_LOOP_INTERVAL },
63 { "loop-offset", required_argument, NULL, FLAG_LOOP_OFFSET },
Dominik Behrda6df412016-08-02 12:56:42 -070064 { "num-vts", required_argument, NULL, FLAG_NUM_VTS },
Dominik Behr222936d2016-05-05 13:50:50 -070065 { "no-login", no_argument, NULL, FLAG_NO_LOGIN },
David Sodman8ef20062015-01-06 09:23:40 -080066 { "offset", required_argument, NULL, FLAG_OFFSET },
David Sodmanbbcb0522014-09-19 10:34:07 -070067 { "print-resolution", no_argument, NULL, FLAG_PRINT_RESOLUTION },
Dominik Behrda6df412016-08-02 12:56:42 -070068 { "pre-create-vts", no_argument, NULL, FLAG_PRE_CREATE_VTS },
Dominik Behr92d9e312016-05-04 20:10:48 -070069 { "scale", required_argument, NULL, FLAG_SCALE },
Dominik Behrfd9fdda2016-03-28 17:16:45 -070070 { "splash-only", no_argument, NULL, FLAG_SPLASH_ONLY },
David Sodmanbbcb0522014-09-19 10:34:07 -070071 { NULL, 0, NULL, 0 }
72};
73
Dominik Behr46c567f2016-03-08 15:11:48 -080074commandflags_t command_flags = { 0 };
Dominik Behr580462b2014-11-20 13:50:05 -080075
Stéphane Marchesin8fc13522015-12-14 17:02:28 -080076static void parse_offset(char* param, int32_t* x, int32_t* y)
David Sodman8ef20062015-01-06 09:23:40 -080077{
78 char* token;
79 char* saveptr;
80
81 token = strtok_r(param, ",", &saveptr);
82 if (token)
83 *x = strtol(token, NULL, 0);
84
85 token = strtok_r(NULL, ",", &saveptr);
86 if (token)
87 *y = strtol(token, NULL, 0);
88}
David Sodmanbbcb0522014-09-19 10:34:07 -070089
Dominik Behr44e07e62016-01-13 19:43:57 -080090int main_process_events(uint32_t usec)
91{
92 terminal_t* terminal;
93 terminal_t* new_terminal;
94 fd_set read_set, exception_set;
Dominik Behrd7112672016-01-20 16:59:34 -080095 int maxfd = -1;
Dominik Behr44e07e62016-01-13 19:43:57 -080096 int sstat;
97 struct timeval tm;
98 struct timeval* ptm;
99
100 terminal = term_get_current_terminal();
101
102 FD_ZERO(&read_set);
103 FD_ZERO(&exception_set);
104
Dominik Behrd7112672016-01-20 16:59:34 -0800105 dbus_add_fds(&read_set, &exception_set, &maxfd);
Dominik Behrd7112672016-01-20 16:59:34 -0800106 input_add_fds(&read_set, &exception_set, &maxfd);
Dominik Behr5239cca2016-01-21 18:22:04 -0800107 dev_add_fds(&read_set, &exception_set, &maxfd);
Dominik Behr44e07e62016-01-13 19:43:57 -0800108
Dominik Behrda6df412016-08-02 12:56:42 -0700109 for (unsigned i = 0; i < term_num_terminals; i++) {
110 terminal_t* current_term = term_get_terminal(i);
111 if (term_is_valid(current_term))
Dominik Behrd7112672016-01-20 16:59:34 -0800112 term_add_fds(current_term, &read_set, &exception_set, &maxfd);
Dominik Behr44e07e62016-01-13 19:43:57 -0800113 }
114
115 if (usec) {
116 ptm = &tm;
117 tm.tv_sec = 0;
118 tm.tv_usec = usec;
119 } else
120 ptm = NULL;
121
Dominik Behrd7112672016-01-20 16:59:34 -0800122 sstat = select(maxfd + 1, &read_set, NULL, &exception_set, ptm);
Dominik Behr44e07e62016-01-13 19:43:57 -0800123 if (sstat == 0)
124 return 0;
125
126 dbus_dispatch_io();
127
128 if (term_exception(terminal, &exception_set))
129 return -1;
130
Dominik Behr5239cca2016-01-21 18:22:04 -0800131 dev_dispatch_io(&read_set, &exception_set);
Dominik Behr44e07e62016-01-13 19:43:57 -0800132 input_dispatch_io(&read_set, &exception_set);
133
Dominik Behrda6df412016-08-02 12:56:42 -0700134 for (unsigned i = 0; i < term_num_terminals; i++) {
135 terminal_t* current_term = term_get_terminal(i);
136 if (term_is_valid(current_term))
Dominik Behr44e07e62016-01-13 19:43:57 -0800137 term_dispatch_io(current_term, &read_set);
Dominik Behr44e07e62016-01-13 19:43:57 -0800138 }
139
Dominik Behrda6df412016-08-02 12:56:42 -0700140 /* Could have changed in input dispatch. */
141 terminal = term_get_current_terminal();
142
143 /* Restart terminal on which child has exited. We don't want possible garbage settings from previous session to remain. */
Dominik Behr44e07e62016-01-13 19:43:57 -0800144 if (term_is_valid(terminal)) {
145 if (term_is_child_done(terminal)) {
Dominik Behrda6df412016-08-02 12:56:42 -0700146 if (terminal == term_get_terminal(TERM_SPLASH_TERMINAL) && !command_flags.enable_vt1) {
147 /* Let the old term be, splash_destroy will clean it up. */
148 return 0;
Dominik Behr44e07e62016-01-13 19:43:57 -0800149 }
Dominik Behrda6df412016-08-02 12:56:42 -0700150 term_set_current_terminal(term_init(term_get_current(), -1));
Dominik Behr44e07e62016-01-13 19:43:57 -0800151 new_terminal = term_get_current_terminal();
152 if (!term_is_valid(new_terminal)) {
153 return -1;
154 }
155 term_activate(new_terminal);
156 term_close(terminal);
157 }
158 }
159
160 return 0;
161}
162
Dominik Behr46c567f2016-03-08 15:11:48 -0800163int main_loop(void)
Dominik Behr44e07e62016-01-13 19:43:57 -0800164{
Dominik Behr44e07e62016-01-13 19:43:57 -0800165 int status;
166
Dominik Behr44e07e62016-01-13 19:43:57 -0800167 while (1) {
168 status = main_process_events(0);
169 if (status != 0) {
Dominik Behrb1abcba2016-04-14 14:57:21 -0700170 LOG(ERROR, "Input process returned %d.", status);
Dominik Behr44e07e62016-01-13 19:43:57 -0800171 break;
172 }
173 }
174
175 return 0;
176}
177
Dominik Behr46c567f2016-03-08 15:11:48 -0800178bool set_drm_master_relax(void)
179{
180 int fd;
181 int num_written;
182
183 /*
184 * Setting drm_master_relax flag in kernel allows us to transfer DRM master
Dominik Behrb1abcba2016-04-14 14:57:21 -0700185 * between Chrome and frecon.
Dominik Behr46c567f2016-03-08 15:11:48 -0800186 */
187 fd = open("/sys/kernel/debug/dri/drm_master_relax", O_WRONLY);
188 if (fd != -1) {
189 num_written = write(fd, "Y", 1);
190 close(fd);
191 if (num_written != 1) {
Dominik Behrb1abcba2016-04-14 14:57:21 -0700192 LOG(ERROR, "Unable to set drm_master_relax.");
Dominik Behr46c567f2016-03-08 15:11:48 -0800193 return false;
194 }
195 } else {
Dominik Behrb1abcba2016-04-14 14:57:21 -0700196 LOG(ERROR, "Unable to open drm_master_relax.");
Dominik Behr46c567f2016-03-08 15:11:48 -0800197 return false;
198 }
199 return true;
200}
201
202static void main_on_login_prompt_visible(void* ptr)
203{
204 if (command_flags.daemon && !command_flags.enable_vts) {
Dominik Behrb1abcba2016-04-14 14:57:21 -0700205 LOG(INFO, "Chrome started, our work is done, exiting.");
Dominik Behr46c567f2016-03-08 15:11:48 -0800206 exit(EXIT_SUCCESS);
207 } else
208 if (ptr) {
Dominik Behrb1abcba2016-04-14 14:57:21 -0700209 LOG(INFO, "Chrome started, splash screen is not needed anymore.");
Dominik Behr0bb51772016-07-26 18:04:53 -0700210 if (command_flags.enable_vt1)
211 LOG(WARNING, "VT1 enabled and Chrome is active!");
Dominik Behrda6df412016-08-02 12:56:42 -0700212 splash_destroy((splash_t*)ptr);
213 }
214}
215
216static void legacy_print_resolution(int argc, char* argv[])
217{
218 int c;
219
220 optind = 1;
221 for (;;) {
222 c = getopt_long(argc, argv, "", command_options, NULL);
223 if (c == -1) {
224 break;
225 } else if (c == FLAG_PRINT_RESOLUTION) {
226 drm_t *drm = drm_scan();
227 if (!drm)
228 exit(EXIT_FAILURE);
229
230 printf("%d %d", drm_gethres(drm),
231 drm_getvres(drm));
232 drm_delref(drm);
233 exit(EXIT_SUCCESS);
234 }
Dominik Behr46c567f2016-03-08 15:11:48 -0800235 }
236}
Dominik Behr44e07e62016-01-13 19:43:57 -0800237
David Sodmanbbcb0522014-09-19 10:34:07 -0700238int main(int argc, char* argv[])
Stéphane Marchesinae37e6c2014-08-08 18:19:40 -0700239{
Stéphane Marchesinae37e6c2014-08-08 18:19:40 -0700240 int ret;
David Sodmanbbcb0522014-09-19 10:34:07 -0700241 int c;
Dominik Behrda6df412016-08-02 12:56:42 -0700242 int pts_fd;
David Sodman8ef20062015-01-06 09:23:40 -0800243 int32_t x, y;
Stéphane Marchesin00ff1872015-12-14 13:40:09 -0800244 splash_t* splash;
Dominik Behrb1abcba2016-04-14 14:57:21 -0700245 drm_t* drm;
Stéphane Marchesinae37e6c2014-08-08 18:19:40 -0700246
Dominik Behrda6df412016-08-02 12:56:42 -0700247 legacy_print_resolution(argc, argv);
248
Dominik Behr2b9f1232016-08-02 01:11:12 -0700249 fix_stdio();
Dominik Behrda6df412016-08-02 12:56:42 -0700250 pts_fd = posix_openpt(O_RDWR | O_NOCTTY | O_CLOEXEC | O_NONBLOCK);
Dominik Behr2b9f1232016-08-02 01:11:12 -0700251
Dominik Behrb1abcba2016-04-14 14:57:21 -0700252 optind = 1;
253 for (;;) {
254 c = getopt_long(argc, argv, "", command_options, NULL);
Dominik Behr0bb51772016-07-26 18:04:53 -0700255
256 if (c == -1)
Dominik Behrb1abcba2016-04-14 14:57:21 -0700257 break;
Dominik Behr0bb51772016-07-26 18:04:53 -0700258
259 switch (c) {
260 case FLAG_DAEMON:
261 command_flags.daemon = true;
262 break;
263
264 case FLAG_ENABLE_GFX:
265 command_flags.enable_gfx = true;
266 break;
267
268 case FLAG_ENABLE_VT1:
269 command_flags.enable_vt1 = true;
270 break;
271
272 case FLAG_ENABLE_VTS:
273 command_flags.enable_vts = true;;
274 break;
275
276 case FLAG_NO_LOGIN:
277 command_flags.no_login = true;
278 break;
279
Dominik Behrda6df412016-08-02 12:56:42 -0700280 case FLAG_NUM_VTS:
281 term_set_num_terminals(strtoul(optarg, NULL, 0));
282 break;
283
284 case FLAG_PRE_CREATE_VTS:
285 command_flags.pre_create_vts = true;
286 break;
287
Dominik Behr0bb51772016-07-26 18:04:53 -0700288 case FLAG_SPLASH_ONLY:
289 command_flags.splash_only = true;
290 break;
Dominik Behrb1abcba2016-04-14 14:57:21 -0700291 }
292 }
293
Dominik Behrb1abcba2016-04-14 14:57:21 -0700294 if (command_flags.daemon) {
Dominik Behrda6df412016-08-02 12:56:42 -0700295 int status;
Dominik Behrb23b05b2016-08-15 16:29:02 -0700296 unsigned vt;
Dominik Behrda6df412016-08-02 12:56:42 -0700297 fprintf(stdout, "%s\n", ptsname(pts_fd));
Dominik Behrb1abcba2016-04-14 14:57:21 -0700298 daemonize();
Dominik Behrda6df412016-08-02 12:56:42 -0700299 status = mkdir(FRECON_RUN_DIR, S_IRWXU);
300 if (status == 0 || (status < 0 && errno == EEXIST)) {
301 char pids[32];
302
303 sprintf(pids, "%u", getpid());
304 write_string_to_file(FRECON_PID_FILE, pids);
305 }
Dominik Behrb23b05b2016-08-15 16:29:02 -0700306
307 /* Remove all stale VT links. */
308 for (vt = 0; vt < TERM_MAX_TERMINALS; vt++) {
309 char path[32];
310 snprintf(path, sizeof(path), FRECON_VT_PATH, vt);
311 unlink(path);
312 }
Dominik Behrb1abcba2016-04-14 14:57:21 -0700313 }
Douglas Anderson4da95cd2015-10-05 15:04:30 -0700314
Stéphane Marchesinae37e6c2014-08-08 18:19:40 -0700315 ret = input_init();
316 if (ret) {
Dominik Behrb1abcba2016-04-14 14:57:21 -0700317 LOG(ERROR, "Input init failed.");
Stéphane Marchesinae37e6c2014-08-08 18:19:40 -0700318 return EXIT_FAILURE;
319 }
320
Dominik Behr5239cca2016-01-21 18:22:04 -0800321 ret = dev_init();
322 if (ret) {
Dominik Behrb1abcba2016-04-14 14:57:21 -0700323 LOG(ERROR, "Device management init failed.");
Dominik Behr5239cca2016-01-21 18:22:04 -0800324 return EXIT_FAILURE;
325 }
326
Dominik Behrb1abcba2016-04-14 14:57:21 -0700327 drm_set(drm = drm_scan());
Dominik Behrda6df412016-08-02 12:56:42 -0700328
329 splash = splash_init(pts_fd);
330 if (splash == NULL) {
331 LOG(ERROR, "Splash init failed.");
332 return EXIT_FAILURE;
333 }
David Sodmanbbcb0522014-09-19 10:34:07 -0700334
Dominik Behr0bb51772016-07-26 18:04:53 -0700335 /* These flags can be only processed after splash object has been created. */
Dominik Behrb1abcba2016-04-14 14:57:21 -0700336 optind = 1;
David Sodmanbbcb0522014-09-19 10:34:07 -0700337 for (;;) {
338 c = getopt_long(argc, argv, "", command_options, NULL);
339
340 if (c == -1)
341 break;
342
343 switch (c) {
344 case FLAG_CLEAR:
345 splash_set_clear(splash, strtoul(optarg, NULL, 0));
346 break;
347
David Sodman8ef20062015-01-06 09:23:40 -0800348 case FLAG_FRAME_INTERVAL:
349 splash_set_default_duration(splash, strtoul(optarg, NULL, 0));
350 break;
351
Dominik Behr32a7c892015-10-09 15:47:53 -0700352 case FLAG_IMAGE:
353 if (!splash_is_hires(splash))
354 splash_add_image(splash, optarg);
355 break;
356
357 case FLAG_IMAGE_HIRES:
358 if (splash_is_hires(splash))
359 splash_add_image(splash, optarg);
360 break;
361
Dominik Behrfd9fdda2016-03-28 17:16:45 -0700362 case FLAG_LOOP_COUNT:
363 splash_set_loop_count(splash, strtoul(optarg, NULL, 0));
364 break;
365
David Sodman8ef20062015-01-06 09:23:40 -0800366 case FLAG_LOOP_START:
367 splash_set_loop_start(splash, strtoul(optarg, NULL, 0));
368 break;
369
370 case FLAG_LOOP_INTERVAL:
371 splash_set_loop_duration(splash, strtoul(optarg, NULL, 0));
372 break;
373
374 case FLAG_LOOP_OFFSET:
375 parse_offset(optarg, &x, &y);
376 splash_set_loop_offset(splash, x, y);
377 break;
378
379 case FLAG_OFFSET:
380 parse_offset(optarg, &x, &y);
381 splash_set_offset(splash, x, y);
382 break;
Dominik Behrfd9fdda2016-03-28 17:16:45 -0700383
Dominik Behr92d9e312016-05-04 20:10:48 -0700384 case FLAG_SCALE:
385 splash_set_scale(splash, strtoul(optarg, NULL, 0));
386 break;
David Sodmanbbcb0522014-09-19 10:34:07 -0700387 }
388 }
389
Stéphane Marchesinac14d292015-12-14 15:27:18 -0800390 for (int i = optind; i < argc; i++)
David Sodman8ef20062015-01-06 09:23:40 -0800391 splash_add_image(splash, argv[i]);
392
David Sodmanf0a925a2015-05-04 11:19:19 -0700393 if (splash_num_images(splash) > 0) {
Dominik Behr797a3832016-01-11 15:53:11 -0800394 ret = splash_run(splash);
David Sodmanbbcb0522014-09-19 10:34:07 -0700395 if (ret) {
Dominik Behrb1abcba2016-04-14 14:57:21 -0700396 LOG(ERROR, "Splash_run failed: %d.", ret);
Yuly Novikov945871e2015-05-23 00:00:41 -0400397 return EXIT_FAILURE;
David Sodmanbbcb0522014-09-19 10:34:07 -0700398 }
399 }
400
Dominik Behr0bb51772016-07-26 18:04:53 -0700401 if (command_flags.splash_only) {
Dominik Behrda6df412016-08-02 12:56:42 -0700402 splash_destroy(splash);
Dominik Behrfd9fdda2016-03-28 17:16:45 -0700403 goto main_done;
Dominik Behr0bb51772016-07-26 18:04:53 -0700404 }
Dominik Behrfd9fdda2016-03-28 17:16:45 -0700405
David Sodmanbbcb0522014-09-19 10:34:07 -0700406 /*
Dominik Behr46c567f2016-03-08 15:11:48 -0800407 * The DBUS service launches later than the boot-splash service, and
408 * as a result, when splash_run starts DBUS is not yet up, but, by
409 * the time splash_run completes, it is running.
Dominik Behrb1abcba2016-04-14 14:57:21 -0700410 * We really need DBUS now, so we can interact with Chrome.
David Sodmanbbcb0522014-09-19 10:34:07 -0700411 */
Dominik Behr5f6742f2016-03-10 18:03:54 -0800412 dbus_init_wait();
David Sodman8ef20062015-01-06 09:23:40 -0800413
Dominik Behr46c567f2016-03-08 15:11:48 -0800414 /*
415 * Ask DBUS to call us back so we can destroy splash (or quit) when login
Dominik Behrb1abcba2016-04-14 14:57:21 -0700416 * prompt is visible.
Dominik Behr46c567f2016-03-08 15:11:48 -0800417 */
418 dbus_set_login_prompt_visible_callback(main_on_login_prompt_visible,
419 (void*)splash);
Dominik Behr0bb51772016-07-26 18:04:53 -0700420#if !DBUS
Dominik Behrda6df412016-08-02 12:56:42 -0700421 splash_destroy(splash);
Dominik Behr0bb51772016-07-26 18:04:53 -0700422#endif
Dominik Behr1883c042016-04-27 12:31:02 -0700423 /*
424 * Ask DBUS to notify us when suspend has finished so monitors can be reprobed
425 * in case they changed during suspend.
426 */
427 dbus_set_suspend_done_callback(term_suspend_done, NULL);
428
Dominik Behrda6df412016-08-02 12:56:42 -0700429 if (command_flags.pre_create_vts && command_flags.enable_vts) {
430 for (unsigned vt = command_flags.enable_vt1 ? TERM_SPLASH_TERMINAL : 1; vt < term_num_terminals; vt++) {
431 terminal_t *terminal = term_get_terminal(vt);
432 if (!terminal) {
433 terminal = term_init(vt, -1);
434 term_set_terminal(vt, terminal);
435 }
436 }
437 }
438
Dominik Behr46c567f2016-03-08 15:11:48 -0800439 if (command_flags.daemon) {
440 if (command_flags.enable_vts)
Dominik Behr83864df2016-04-21 12:35:08 -0700441 set_drm_master_relax(); /* TODO(dbehr) Remove when Chrome is fixed to actually release master. */
Dominik Behrda6df412016-08-02 12:56:42 -0700442 if (command_flags.enable_vt1)
443 term_switch_to(TERM_SPLASH_TERMINAL);
444 else
Dominik Behr0bb51772016-07-26 18:04:53 -0700445 term_background();
Dominik Behr46c567f2016-03-08 15:11:48 -0800446 } else {
Dominik Behrb1abcba2016-04-14 14:57:21 -0700447 /* Create and switch to first term in interactve mode. */
Dominik Behr83864df2016-04-21 12:35:08 -0700448 set_drm_master_relax(); /* TODO(dbehr) Remove when Chrome is fixed to actually release master. */
Dominik Behrda6df412016-08-02 12:56:42 -0700449 term_switch_to(command_flags.enable_vt1 ? TERM_SPLASH_TERMINAL : 1);
Dominik Behr46c567f2016-03-08 15:11:48 -0800450 }
451
452 ret = main_loop();
Stéphane Marchesinae37e6c2014-08-08 18:19:40 -0700453
Dominik Behrfd9fdda2016-03-28 17:16:45 -0700454main_done:
Stéphane Marchesinae37e6c2014-08-08 18:19:40 -0700455 input_close();
Dominik Behr5239cca2016-01-21 18:22:04 -0800456 dev_close();
Dominik Behr44e07e62016-01-13 19:43:57 -0800457 dbus_destroy();
Dominik Behr83010f82016-03-18 18:43:08 -0700458 drm_close();
Dominik Behrda6df412016-08-02 12:56:42 -0700459 if (command_flags.daemon)
460 unlink(FRECON_PID_FILE);
Stéphane Marchesinae37e6c2014-08-08 18:19:40 -0700461
Stéphane Marchesinae37e6c2014-08-08 18:19:40 -0700462 return ret;
463}