]> git.lizzy.rs Git - bspwm.git/commitdiff
New message: 'toggle_visibility'
authorBastien Dejean <nihilhill@gmail.com>
Sun, 23 Dec 2012 11:11:08 +0000 (12:11 +0100)
committerBastien Dejean <nihilhill@gmail.com>
Sun, 23 Dec 2012 11:11:08 +0000 (12:11 +0100)
README.md
bspwm.1
bspwm.c
bspwm.h
messages.c
tree.c
window.c
window.h

index 6f844ba17c8fa4ec18bf257178916a37016ba55f..8c85f8480db13cd615b8b7a634bf326b3fdc2b52 100644 (file)
--- a/README.md
+++ b/README.md
@@ -137,6 +137,9 @@ The following messages are handled:
     toggle_locked
         Toggle the locked state of the current window (locked windows will not respond to the 'close' message).
 
+    toggle_visibility
+        Toggle the visibility of all the managed windows.
+
     close
         Close the focused window.
 
diff --git a/bspwm.1 b/bspwm.1
index 5d327217f8a22e005bfb7f0878c22f0fbf7d6f4e..354493fd362df799e061a6ef5163e841a84a0a11 100644 (file)
--- a/bspwm.1
+++ b/bspwm.1
@@ -160,6 +160,9 @@ Toggle the locked state of the current window (locked windows will not respond t
 .B close
 message).
 .TP
+.BI toggle_visibility
+Toggle the visibility of all the managed windows.
+.TP
 .BI close
 Close the focused window.
 .TP
diff --git a/bspwm.c b/bspwm.c
index 201f9491b929b211210c5a17b1b03d92a1f21071..09189350105fe767c2ba920731bf297364785ec4 100644 (file)
--- a/bspwm.c
+++ b/bspwm.c
@@ -138,6 +138,7 @@ void setup(void)
     get_pointer_position(&pointer_position);
     last_entered = XCB_NONE;
     split_mode = MODE_AUTOMATIC;
+    visible = true;
 }
 
 int main(int argc, char *argv[])
diff --git a/bspwm.h b/bspwm.h
index 0254ff52970c9e081ec72eeff2107db634ab3427..07c5ed1fac1bbbea2f5e630905e8deca3a1889a5 100644 (file)
--- a/bspwm.h
+++ b/bspwm.h
@@ -29,6 +29,7 @@ pointer_state_t *frozen_pointer;
 xcb_point_t pointer_position;
 xcb_window_t last_entered;
 
+bool visible;
 bool running;
 
 void register_events(void);
index ea1bc1b008a9fb7137d4d131b1bebb143fb751e0..f15b5ebdf38f91999a3782fd7b2c7e296aeb4a55 100644 (file)
@@ -106,6 +106,8 @@ void process_message(char *msg, char *rsp)
     } else if (strcmp(cmd, "toggle_locked") == 0) {
         if (mon->desk->focus != NULL)
             toggle_locked(mon->desk->focus->client);
+    } else if (strcmp(cmd, "toggle_visibility") == 0) {
+        toggle_visibility();
     } else if (strcmp(cmd, "pad") == 0) {
         char *name = strtok(NULL, TOK_SEP);
         if (name != NULL) {
diff --git a/tree.c b/tree.c
index a350784c4705da94ce59f98156671c6ae7af124d..a8415bf8f8a633a43bde189badf30e9fbb76554d 100644 (file)
--- a/tree.c
+++ b/tree.c
@@ -639,18 +639,20 @@ void select_desktop(desktop_t *d)
 
     PRINTF("select desktop %s\n", d->name);
 
-    node_t *n = first_extrema(d->root);
+    if (visible) {
+        node_t *n = first_extrema(d->root);
 
-    while (n != NULL) {
-        window_show(n->client->window);
-        n = next_leaf(n);
-    }
+        while (n != NULL) {
+            window_show(n->client->window);
+            n = next_leaf(n);
+        }
 
-    n = first_extrema(mon->desk->root);
+        n = first_extrema(mon->desk->root);
 
-    while (n != NULL) {
-        window_hide(n->client->window);
-        n = next_leaf(n);
+        while (n != NULL) {
+            window_hide(n->client->window);
+            n = next_leaf(n);
+        }
     }
 
     mon->last_desk = mon->desk;
index 0ad61e124066fe47d66175f9e0e78642279429f3..5c4f359ed2a40fc602426be5cb0010ca2c145e98 100644 (file)
--- a/window.c
+++ b/window.c
@@ -145,7 +145,7 @@ void manage_window(monitor_t *m, desktop_t *d, xcb_window_t win)
 
     arrange(m, d);
 
-    if (d == m->desk)
+    if (d == m->desk && visible)
         window_show(c->window);
 
     if (takes_focus)
@@ -472,3 +472,16 @@ void window_show(xcb_window_t win)
 {
     window_set_visibility(win, true);
 }
+
+void toggle_visibility(void)
+{
+    uint32_t values_off[] = {CLIENT_EVENT_MASK & ~XCB_EVENT_MASK_ENTER_WINDOW};
+    uint32_t values_on[] = {CLIENT_EVENT_MASK};
+    visible = !visible;
+    for (node_t *n = first_extrema(mon->desk->root); n != NULL; n = next_leaf(n)) {
+        xcb_window_t win = n->client->window;
+        xcb_change_window_attributes(dpy, win, XCB_CW_EVENT_MASK, values_off);
+        window_set_visibility(win, visible);
+        xcb_change_window_attributes(dpy, win, XCB_CW_EVENT_MASK, values_on);
+    }
+}
index 2b17590c37407a78bba22e61a586cf6c6fc6ab77..43c9b54d6fde6d4486921c474934f94a40f1bccf 100644 (file)
--- a/window.h
+++ b/window.h
@@ -30,6 +30,7 @@ void window_lower(xcb_window_t);
 void window_set_visibility(xcb_window_t, bool);
 void window_hide(xcb_window_t);
 void window_show(xcb_window_t);
+void toggle_visibility(void);
 uint32_t get_main_border_color(client_t *, bool, bool);
 void update_floating_rectangle(client_t *);
 void list_windows(char *);