From 5db97dc47368029d82827239891cf4f414eb5748 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sat, 14 May 2011 22:34:34 +0200 Subject: [PATCH] Bugfix: Fix initialization / assignments when RandR is missing --- include/randr.h | 15 ++++++++++++--- src/randr.c | 5 ++++- src/xinerama.c | 1 + 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/include/randr.h b/include/randr.h index 779a1316..d14d0478 100644 --- a/include/randr.h +++ b/include/randr.h @@ -35,12 +35,21 @@ void disable_randr(xcb_connection_t *conn); * Initializes a CT_OUTPUT Con (searches existing ones from inplace restart * before) to use for the given Output. * - * XXX: for assignments, we probably need to move workspace creation from here - * to after the loop in randr_query_outputs(). - * */ void output_init_con(Output *output); +/** + * Initializes at least one workspace for this output, trying the following + * steps until there is at least one workspace: + * + * • Move existing workspaces, which are assigned to be on the given output, to + * the output. + * • Create the first assigned workspace for this output. + * • Create the first unused workspace. + * + */ +void init_ws_for_output(Output *output, Con *content); + /** * Initializes the specified output, assigning the specified workspace to it. * diff --git a/src/randr.c b/src/randr.c index af0af334..56254299 100644 --- a/src/randr.c +++ b/src/randr.c @@ -213,6 +213,7 @@ void disable_randr(xcb_connection_t *conn) { s->rect.height = root_screen->height_in_pixels; s->name = "xroot-0"; output_init_con(s); + init_ws_for_output(s, output_get_content(s->con)); TAILQ_INSERT_TAIL(&outputs, s, outputs); @@ -325,7 +326,7 @@ void output_init_con(Output *output) { * • Create the first unused workspace. * */ -static void init_ws_for_output(Output *output, Con *content) { +void init_ws_for_output(Output *output, Con *content) { char *name; /* go through all assignments and move the existing workspaces to this output */ @@ -371,6 +372,7 @@ static void init_ws_for_output(Output *output, Con *content) { GREP_FIRST(visible, content, child->fullscreen_mode == CF_OUTPUT); if (!visible) { visible = TAILQ_FIRST(&(content->nodes_head)); + focused = content; workspace_show(visible->name); } return; @@ -383,6 +385,7 @@ static void init_ws_for_output(Output *output, Con *content) { LOG("Initializing first assigned workspace \"%s\" for output \"%s\"\n", assignment->name, assignment->output); + focused = content; workspace_show(assignment->name); return; } diff --git a/src/xinerama.c b/src/xinerama.c index 8bb1b43f..c116deaa 100644 --- a/src/xinerama.c +++ b/src/xinerama.c @@ -71,6 +71,7 @@ static void query_screens(xcb_connection_t *conn) { TAILQ_INSERT_HEAD(&outputs, s, outputs); else TAILQ_INSERT_TAIL(&outputs, s, outputs); output_init_con(s); + init_ws_for_output(s, output_get_content(s->con)); num_screens++; } -- 2.39.5