Add a timeout: delay_exit_on_zero_displays

Outputs may disappear momentarily and come back later.
To prevent i3 from exit when no output is available momentarily, add a timeout delay_exit_on_zero_displays.
This commit is contained in:
hwangcc
2015-04-03 16:16:38 +08:00
parent 1546891e6a
commit 2c77d7ceed
9 changed files with 124 additions and 9 deletions

View File

@ -69,7 +69,7 @@ Output *get_first_output(void) {
if (output->active)
return output;
die("No usable outputs available.\n");
return NULL;
}
/*
@ -564,6 +564,8 @@ static void handle_output(xcb_connection_t *conn, xcb_randr_output_t id,
if (!new->active) {
DLOG("width/height 0/0, disabling output\n");
return;
} else {
new->to_be_disabled = false;
}
DLOG("mode: %dx%d+%d+%d\n", new->rect.width, new->rect.height,
@ -585,11 +587,7 @@ static void handle_output(xcb_connection_t *conn, xcb_randr_output_t id,
new->changed = true;
}
/*
* (Re-)queries the outputs via RandR and stores them in the list of outputs.
*
*/
void randr_query_outputs(void) {
static bool __randr_query_outputs(void) {
Output *output, *other, *first;
xcb_randr_get_output_primary_cookie_t pcookie;
xcb_randr_get_screen_resources_current_cookie_t rcookie;
@ -603,7 +601,7 @@ void randr_query_outputs(void) {
xcb_randr_output_t *randr_outputs;
if (randr_disabled)
return;
return true;
/* Get screen resources (primary output, crtcs, outputs, modes) */
rcookie = xcb_randr_get_screen_resources_current(conn, root);
@ -615,7 +613,7 @@ void randr_query_outputs(void) {
DLOG("primary output is %08x\n", primary->output);
if ((res = xcb_randr_get_screen_resources_current_reply(conn, rcookie, NULL)) == NULL) {
disable_randr(conn);
return;
return true;
}
cts = res->config_timestamp;
@ -697,6 +695,11 @@ void randr_query_outputs(void) {
DLOG("Output %s disabled, re-assigning workspaces/docks\n", output->name);
first = get_first_output();
if (!first) {
FREE(res);
FREE(primary);
return false;
}
/* TODO: refactor the following code into a nice function. maybe
* use an on_destroy callback which is implement differently for
@ -812,6 +815,32 @@ void randr_query_outputs(void) {
FREE(res);
FREE(primary);
return true;
}
/*
* (Re-)queries the outputs via RandR and stores them in the list of outputs.
*
*/
void randr_query_outputs(void) {
static bool first_query = true;
if (first_query) {
/* find monitors at least once via RandR */
if (!__randr_query_outputs())
die("No usable outputs available.\n");
first_query = false;
} else {
/* requery */
if (!__randr_query_outputs()) {
DLOG("sleep %f ms due to zero displays\n", config.zero_disp_exit_timer_ms);
usleep(config.zero_disp_exit_timer_ms * 1000);
if (!__randr_query_outputs())
die("No usable outputs available.\n");
}
}
}
/*