]> git.sur5r.net Git - i3/i3/blobdiff - src/ewmh.c
Merge branch 'master' into next
[i3/i3] / src / ewmh.c
index 45d4e5fec19bff8578f40cb2cd4d3876fda211e1..331df5dd3a47cb8ed2a06872841f315f6c26bf61 100644 (file)
@@ -27,6 +27,9 @@ void ewmh_update_current_desktop(void) {
     TAILQ_FOREACH(output, &(croot->nodes_head), nodes) {
         Con *ws;
         TAILQ_FOREACH(ws, &(output_get_content(output)->nodes_head), nodes) {
+            if (STARTS_WITH(ws->name, "__"))
+                continue;
+
             if (ws == focused_ws) {
                 xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root,
                         A__NET_CURRENT_DESKTOP, XCB_ATOM_CARDINAL, 32, 1, &idx);
@@ -50,11 +53,14 @@ void ewmh_update_active_window(xcb_window_t window) {
 }
 
 /*
- * Updates the workarea for each desktop.
- *
- * This function is not called at the moment due to:
+ * i3 currently does not support _NET_WORKAREA, because it does not correspond
+ * to i3’s concept of workspaces. See also:
  * http://bugs.i3wm.org/539
  * http://bugs.i3wm.org/301
+ * http://bugs.i3wm.org/1038
+ *
+ * We need to actively delete this property because some display managers (e.g.
+ * LightDM) set it.
  *
  * EWMH: Contains a geometry for each desktop. These geometries specify an area
  * that is completely contained within the viewport. Work area SHOULD be used by
@@ -62,55 +68,7 @@ void ewmh_update_active_window(xcb_window_t window) {
  *
  */
 void ewmh_update_workarea(void) {
-    int num_workspaces = 0, count = 0;
-    Rect last_rect = {0, 0, 0, 0};
-    Con *output;
-
-    TAILQ_FOREACH(output, &(croot->nodes_head), nodes) {
-        Con *ws;
-        TAILQ_FOREACH(ws, &(output_get_content(output)->nodes_head), nodes) {
-            /* Check if we need to initialize last_rect. The case that the
-             * first workspace is all-zero may happen when the user
-             * assigned workspace 2 for his first screen, for example. Thus
-             * we need an initialized last_rect in the very first run of
-             * the following loop. */
-            if (last_rect.width == 0 && last_rect.height == 0 &&
-                    ws->rect.width != 0 && ws->rect.height != 0) {
-                memcpy(&last_rect, &(ws->rect), sizeof(Rect));
-            }
-            num_workspaces++;
-        }
-    }
-
-    DLOG("Got %d workspaces\n", num_workspaces);
-    uint8_t *workarea = smalloc(sizeof(Rect) * num_workspaces);
-    TAILQ_FOREACH(output, &(croot->nodes_head), nodes) {
-        Con *ws;
-        TAILQ_FOREACH(ws, &(output_get_content(output)->nodes_head), nodes) {
-            DLOG("storing %d: %dx%d with %d x %d\n", count, ws->rect.x,
-                 ws->rect.y, ws->rect.width, ws->rect.height);
-            /* If a workspace is not yet initialized and thus its
-             * dimensions are zero, we will instead put the dimensions
-             * of the last workspace in the list. For example firefox
-             * intersects all workspaces and does not cope so well with
-             * an all-zero workspace. */
-            if (ws->rect.width == 0 || ws->rect.height == 0) {
-                DLOG("re-using last_rect (%dx%d, %d, %d)\n",
-                     last_rect.x, last_rect.y, last_rect.width,
-                     last_rect.height);
-                memcpy(workarea + (sizeof(Rect) * count++), &last_rect, sizeof(Rect));
-                continue;
-            }
-            memcpy(workarea + (sizeof(Rect) * count++), &(ws->rect), sizeof(Rect));
-            memcpy(&last_rect, &(ws->rect), sizeof(Rect));
-        }
-    }
-    xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root,
-            A__NET_WORKAREA, XCB_ATOM_CARDINAL, 32,
-            num_workspaces * (sizeof(Rect) / sizeof(uint32_t)),
-            workarea);
-    free(workarea);
-    xcb_flush(conn);
+    xcb_delete_property(conn, root, A__NET_WORKAREA);
 }
 
 /*
@@ -164,5 +122,5 @@ void ewmh_setup_hints(void) {
     /* I’m not entirely sure if we need to keep _NET_WM_NAME on root. */
     xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root, A__NET_WM_NAME, A_UTF8_STRING, 8, strlen("i3"), "i3");
 
-    xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root, A__NET_SUPPORTED, XCB_ATOM_ATOM, 32, 16, supported_atoms);
+    xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root, A__NET_SUPPORTED, XCB_ATOM_ATOM, 32, 18, supported_atoms);
 }