]> git.sur5r.net Git - i3/i3/commitdiff
Don't create empty workspaces on restart 1943/head
authorNils Schneider <nils@nilsschneider.net>
Mon, 21 Sep 2015 09:44:39 +0000 (11:44 +0200)
committerNils Schneider <nils@nilsschneider.net>
Mon, 21 Sep 2015 11:26:58 +0000 (13:26 +0200)
This fixes a bug I introduced in #1921. When restarting i3 in place a
stray workspace was created on the root_output during restart. On first
start, this workspace would have been moved to the first real and empty
output.

However, this does not produce the desired result during restarts when
workspaces are alread present on all real outputs. The stray workspace would
still be added to the first real output which already contains some
workspaces. Thus, adding a new empty workspace to it.

Fix this by delaying creation of the root output's workspace until it is
known whether the output is active or not.

Fixes #1940

include/randr.h
src/randr.c
src/xinerama.c

index 2c379f6fb58bab5d477195de81d2e612abe47add..998f0d597e8839237da1885375fec363a898abbc 100644 (file)
@@ -118,4 +118,4 @@ Output *get_output_next_wrap(direction_t direction, Output *current);
  * Creates an output covering the root window.
  *
  */
-void create_root_output(xcb_connection_t *conn);
+Output *create_root_output(xcb_connection_t *conn);
index 23dd98d55c35f2e27a92aef32e03dc6587164349..e4522c4de1009a33ccdabae73062e363a8c76934 100644 (file)
@@ -239,19 +239,17 @@ Output *get_output_next(direction_t direction, Output *current, output_close_far
  * Creates an output covering the root window.
  *
  */
-void create_root_output(xcb_connection_t *conn) {
-    root_output = scalloc(1, sizeof(Output));
-
-    root_output->active = true;
-    root_output->rect.x = 0;
-    root_output->rect.y = 0;
-    root_output->rect.width = root_screen->width_in_pixels;
-    root_output->rect.height = root_screen->height_in_pixels;
-    root_output->name = "xroot-0";
-    output_init_con(root_output);
-    init_ws_for_output(root_output, output_get_content(root_output->con));
+Output *create_root_output(xcb_connection_t *conn) {
+    Output *s = scalloc(1, sizeof(Output));
 
-    TAILQ_INSERT_TAIL(&outputs, root_output, outputs);
+    s->active = false;
+    s->rect.x = 0;
+    s->rect.y = 0;
+    s->rect.width = root_screen->width_in_pixels;
+    s->rect.height = root_screen->height_in_pixels;
+    s->name = "xroot-0";
+
+    return s;
 }
 
 /*
@@ -833,11 +831,18 @@ void randr_query_outputs(void) {
 void randr_init(int *event_base) {
     const xcb_query_extension_reply_t *extreply;
 
-    create_root_output(conn);
+    root_output = create_root_output(conn);
+    TAILQ_INSERT_TAIL(&outputs, root_output, outputs);
 
     extreply = xcb_get_extension_data(conn, &xcb_randr_id);
-    if (!extreply->present)
+    if (!extreply->present) {
+        DLOG("RandR is not present, activating root output.\n");
+        root_output->active = true;
+        output_init_con(root_output);
+        init_ws_for_output(root_output, output_get_content(root_output->con));
+
         return;
+    }
 
     randr_query_outputs();
 
index 049e1bc4c8c63786f5a6afcafad02b90fe075de9..fb3b8603b768561e9a0fcdae6d8736c24c6868a1 100644 (file)
@@ -87,6 +87,19 @@ static void query_screens(xcb_connection_t *conn) {
     }
 }
 
+/*
+ * This creates the root_output (borrowed from randr.c) and uses it
+ * as the sole output for this session.
+ *
+ */
+static void use_root_output(xcb_connection_t *conn) {
+    Output *s = create_root_output(conn);
+    s->active = true;
+    TAILQ_INSERT_TAIL(&outputs, s, outputs);
+    output_init_con(s);
+    init_ws_for_output(s, output_get_content(s->con));
+}
+
 /*
  * We have just established a connection to the X server and need the initial Xinerama
  * information to setup workspaces for each screen.
@@ -95,14 +108,14 @@ static void query_screens(xcb_connection_t *conn) {
 void xinerama_init(void) {
     if (!xcb_get_extension_data(conn, &xcb_xinerama_id)->present) {
         DLOG("Xinerama extension not found, using root output.\n");
-        create_root_output(conn);
+        use_root_output(conn);
     } else {
         xcb_xinerama_is_active_reply_t *reply;
         reply = xcb_xinerama_is_active_reply(conn, xcb_xinerama_is_active(conn), NULL);
 
         if (reply == NULL || !reply->state) {
             DLOG("Xinerama is not active (in your X-Server), using root output.\n");
-            create_root_output(conn);
+            use_root_output(conn);
         } else
             query_screens(conn);