diff options
author | MC <mc@hack.org> | 2010-07-01 11:09:34 +0200 |
---|---|---|
committer | MC <mc@brain.hack.org> | 2010-07-01 11:09:34 +0200 |
commit | 409eb3a123101714ea2b55b42fdd5ab1d45c5e78 (patch) | |
tree | a3281a2f03c995fbc43b140a6734d86eddde59cc | |
parent | 1b2083a88ecd46e16d83a2276c4af2c54770f0de (diff) | |
download | mcwm-409eb3a123101714ea2b55b42fdd5ab1d45c5e78.zip |
When changing workspaces, remove fixed windows from the current and
add them to where we're going to. Take care to save the next pointer
so we don't lose our ability to traverse the list.
-rw-r--r-- | mcwm.c | 42 |
1 files changed, 20 insertions, 22 deletions
@@ -288,6 +288,7 @@ void delfromworkspace(struct client *client, uint32_t ws) if (client == item->data) { delitem(&wslist[ws], item); + return; } } } @@ -295,6 +296,7 @@ void delfromworkspace(struct client *client, uint32_t ws) void changeworkspace(uint32_t ws) { struct item *item; + struct item *tmpitem; struct client *client; if (ws == curws) @@ -314,20 +316,9 @@ void changeworkspace(uint32_t ws) setunfocus(focuswin->id); focuswin = NULL; } - -#if DEBUG - PDEBUG("From workspace:\n"); - listitems(wslist[curws]); -#endif - - -#if DEBUG - PDEBUG("To workspace:\n"); - listitems(wslist[ws]); -#endif /* Go through list of current ws. Unmap everything that isn't fixed. */ - for (item = wslist[curws]; item != NULL; item = item->next) + for (item = wslist[curws]; item != NULL; ) { client = item->data; @@ -336,23 +327,26 @@ void changeworkspace(uint32_t ws) if (client->fixed) { -#if 0 /* We move all fixed windows to every new workspace we go to. */ - delfromworkspace(client, curws); addtoworkspace(client, ws); - PDEBUG("After deleting fixed, curws::\n"); - listitems(wslist[curws]); + /* + * NB! Before deleting this item, we need to save the + * address to next item so we can continue through the + * list. + */ + tmpitem = item; + item = item->next; - PDEBUG("After deleting fixed, going to ws:\n"); - listitems(wslist[ws]); -#endif + delitem(&wslist[curws], tmpitem); } else { - xcb_unmap_window(conn, client->id); + xcb_unmap_window(conn, client->id); + item = item->next; } - } + + } /* for */ /* Go through list of new ws. Map everything that isn't fixed. */ for (item = wslist[ws]; item != NULL; item = item->next) @@ -362,7 +356,6 @@ void changeworkspace(uint32_t ws) PDEBUG("changeworkspace. map phase. ws #%d, client-fixed: %d\n", ws, client->fixed); - /* Fixed windows are already mapped. Map everything else. */ if (!client->fixed) { @@ -378,6 +371,11 @@ void changeworkspace(uint32_t ws) void fixwindow(struct client *client) { uint32_t values[1]; + + if (NULL == client) + { + return; + } if (client->fixed) { |