]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: Fix initialization / assignments when RandR is missing
authorMichael Stapelberg <michael@stapelberg.de>
Sat, 14 May 2011 20:34:34 +0000 (22:34 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 14 May 2011 20:34:34 +0000 (22:34 +0200)
include/randr.h
src/randr.c
src/xinerama.c

index 779a131630bff56d870b141ad8bc346e0c1bb064..d14d04788aeb7ea283b66ff085f9af0b1a2ff6dd 100644 (file)
@@ -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.
  *
index af0af334097215b694992447a9134236bc1c5445..56254299fff4e84f0fca1fb7b5b8b1afeeb32444 100644 (file)
@@ -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;
     }
index 8bb1b43f117fa08b67029b940f9661432fd3149f..c116deaa954fb0bd709a1e5ec44a23c0f1b5e7a9 100644 (file)
@@ -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++;
         }