]> git.lizzy.rs Git - bspwm.git/blobdiff - src/messages.c
Handle mapping notify events
[bspwm.git] / src / messages.c
index ce0721a05c3ac301b1670863c37e1bd2dc64ae7f..6d9d970323cb749178496157d03ff2b29845a720 100644 (file)
@@ -27,6 +27,7 @@
 #include <string.h>
 #include <stdbool.h>
 #include <stdarg.h>
+#include <inttypes.h>
 #include <unistd.h>
 #include "bspwm.h"
 #include "desktop.h"
@@ -176,7 +177,12 @@ void cmd_node(char **args, int num, FILE *rsp)
                        coordinates_t dst;
                        int ret;
                        if ((ret = desktop_from_desc(*args, &ref, &dst)) == SELECTOR_OK) {
-                               if (transfer_node(trg.monitor, trg.desktop, trg.node, dst.monitor, dst.desktop, dst.desktop->focus)) {
+                               bool follow = false;
+                               if (num > 1 && streq("--follow", *(args+1))) {
+                                       follow = true;
+                                       num--, args++;
+                               }
+                               if (transfer_node(trg.monitor, trg.desktop, trg.node, dst.monitor, dst.desktop, dst.desktop->focus, follow)) {
                                        trg.monitor = dst.monitor;
                                        trg.desktop = dst.desktop;
                                } else {
@@ -196,7 +202,12 @@ void cmd_node(char **args, int num, FILE *rsp)
                        coordinates_t dst;
                        int ret;
                        if ((ret = monitor_from_desc(*args, &ref, &dst)) == SELECTOR_OK) {
-                               if (transfer_node(trg.monitor, trg.desktop, trg.node, dst.monitor, dst.monitor->desk, dst.monitor->desk->focus)) {
+                               bool follow = false;
+                               if (num > 1 && streq("--follow", *(args+1))) {
+                                       follow = true;
+                                       num--, args++;
+                               }
+                               if (transfer_node(trg.monitor, trg.desktop, trg.node, dst.monitor, dst.monitor->desk, dst.monitor->desk->focus, follow)) {
                                        trg.monitor = dst.monitor;
                                        trg.desktop = dst.monitor->desk;
                                } else {
@@ -216,7 +227,12 @@ void cmd_node(char **args, int num, FILE *rsp)
                        coordinates_t dst;
                        int ret;
                        if ((ret = node_from_desc(*args, &ref, &dst)) == SELECTOR_OK) {
-                               if (transfer_node(trg.monitor, trg.desktop, trg.node, dst.monitor, dst.desktop, dst.node)) {
+                               bool follow = false;
+                               if (num > 1 && streq("--follow", *(args+1))) {
+                                       follow = true;
+                                       num--, args++;
+                               }
+                               if (transfer_node(trg.monitor, trg.desktop, trg.node, dst.monitor, dst.desktop, dst.node, follow)) {
                                        trg.monitor = dst.monitor;
                                        trg.desktop = dst.desktop;
                                } else {
@@ -236,7 +252,12 @@ void cmd_node(char **args, int num, FILE *rsp)
                        coordinates_t dst;
                        int ret;
                        if ((ret = node_from_desc(*args, &ref, &dst)) == SELECTOR_OK) {
-                               if (swap_nodes(trg.monitor, trg.desktop, trg.node, dst.monitor, dst.desktop, dst.node)) {
+                               bool follow = false;
+                               if (num > 1 && streq("--follow", *(args+1))) {
+                                       follow = true;
+                                       num--, args++;
+                               }
+                               if (swap_nodes(trg.monitor, trg.desktop, trg.node, dst.monitor, dst.desktop, dst.node, follow)) {
                                        trg.monitor = dst.monitor;
                                        trg.desktop = dst.desktop;
                                } else {
@@ -322,6 +343,8 @@ void cmd_node(char **args, int num, FILE *rsp)
                                set_private(trg.monitor, trg.desktop, trg.node, (a == ALTER_SET ? b : !trg.node->private));
                        } else if (streq("locked", key)) {
                                set_locked(trg.monitor, trg.desktop, trg.node, (a == ALTER_SET ? b : !trg.node->locked));
+                       } else if (streq("marked", key)) {
+                               set_marked(trg.monitor, trg.desktop, trg.node, (a == ALTER_SET ? b : !trg.node->marked));
                        } else {
                                fail(rsp, "node %s: Invalid key: '%s'.\n", *(args - 1), key);
                                break;
@@ -613,7 +636,7 @@ void cmd_desktop(char **args, int num, FILE *rsp)
                                        break;
                                }
                        }
-                       focus_node(dst.monitor, dst.desktop, dst.desktop->focus);
+                       focus_node(dst.monitor, dst.desktop, NULL);
                } else if (streq("-a", *args) || streq("--activate", *args)) {
                        coordinates_t dst = trg;
                        if (num > 1 && *(args + 1)[0] != OPT_CHR) {
@@ -624,7 +647,9 @@ void cmd_desktop(char **args, int num, FILE *rsp)
                                        break;
                                }
                        }
-                       if (!activate_desktop(dst.monitor, dst.desktop)) {
+                       if (activate_desktop(dst.monitor, dst.desktop)) {
+                               activate_node(dst.monitor, dst.desktop, NULL);
+                       } else {
                                fail(rsp, "");
                                break;
                        }
@@ -641,7 +666,12 @@ void cmd_desktop(char **args, int num, FILE *rsp)
                        coordinates_t dst;
                        int ret;
                        if ((ret = monitor_from_desc(*args, &ref, &dst)) == SELECTOR_OK) {
-                               if (transfer_desktop(trg.monitor, dst.monitor, trg.desktop)) {
+                               bool follow = false;
+                               if (num > 1 && streq("--follow", *(args+1))) {
+                                       follow = true;
+                                       num--, args++;
+                               }
+                               if (transfer_desktop(trg.monitor, dst.monitor, trg.desktop, follow)) {
                                        trg.monitor = dst.monitor;
                                } else {
                                        fail(rsp, "");
@@ -660,7 +690,12 @@ void cmd_desktop(char **args, int num, FILE *rsp)
                        coordinates_t dst;
                        int ret;
                        if ((ret = desktop_from_desc(*args, &ref, &dst)) == SELECTOR_OK) {
-                               if (swap_desktops(trg.monitor, trg.desktop, dst.monitor, dst.desktop)) {
+                               bool follow = false;
+                               if (num > 1 && streq("--follow", *(args+1))) {
+                                       follow = true;
+                                       num--, args++;
+                               }
+                               if (swap_desktops(trg.monitor, trg.desktop, dst.monitor, dst.desktop, follow)) {
                                        trg.monitor = dst.monitor;
                                } else {
                                        fail(rsp, "");
@@ -682,18 +717,18 @@ void cmd_desktop(char **args, int num, FILE *rsp)
                                if (cyc == CYCLE_PREV) {
                                        if (d->prev == NULL) {
                                                while (d->next != NULL) {
-                                                       swap_desktops(trg.monitor, d, trg.monitor, d->next);
+                                                       swap_desktops(trg.monitor, d, trg.monitor, d->next, false);
                                                }
                                        } else {
-                                               swap_desktops(trg.monitor, d, trg.monitor, d->prev);
+                                               swap_desktops(trg.monitor, d, trg.monitor, d->prev, false);
                                        }
                                } else {
                                        if (d->next == NULL) {
                                                while (d->prev != NULL) {
-                                                       swap_desktops(trg.monitor, d, trg.monitor, d->prev);
+                                                       swap_desktops(trg.monitor, d, trg.monitor, d->prev, false);
                                                }
                                        } else {
-                                               swap_desktops(trg.monitor, d, trg.monitor, d->next);
+                                               swap_desktops(trg.monitor, d, trg.monitor, d->next, false);
                                        }
                                }
                        } else {
@@ -793,7 +828,7 @@ void cmd_monitor(char **args, int num, FILE *rsp)
                                        return;
                                }
                        }
-                       focus_node(dst.monitor, dst.monitor->desk, dst.monitor->desk->focus);
+                       focus_node(dst.monitor, NULL, NULL);
                } else if (streq("-s", *args) || streq("--swap", *args)) {
                        num--, args++;
                        if (num < 1) {
@@ -869,7 +904,7 @@ void cmd_monitor(char **args, int num, FILE *rsp)
                                desktop_t *next = d->next;
                                coordinates_t dst;
                                if (locate_desktop(*args, &dst) && dst.monitor == trg.monitor) {
-                                       swap_desktops(trg.monitor, d, dst.monitor, dst.desktop);
+                                       swap_desktops(trg.monitor, d, dst.monitor, dst.desktop, false);
                                        if (next == dst.desktop) {
                                                next = d;
                                        }
@@ -1520,6 +1555,11 @@ void set_setting(coordinates_t loc, char *name, char *value, FILE *rsp)
                        fail(rsp, "config: %s: Invalid value: '%s'.\n", name, value);
                        return;
                }
+       } else if (streq("mapping_events_count", name)) {
+               if (sscanf(value, "%" SCNi8, &mapping_events_count) != 1) {
+                       fail(rsp, "config: %s: Invalid value: '%s'.\n", name, value);
+                       return;
+               }
        } else if (streq("directional_focus_tightness", name)) {
                tightness_t p;
                if (parse_tightness(value, &p)) {
@@ -1683,6 +1723,8 @@ void get_setting(coordinates_t loc, char *name, FILE* rsp)
                fprintf(rsp, "%s", status_prefix);
        } else if (streq("initial_polarity", name)) {
                fprintf(rsp, "%s", CHILD_POL_STR(initial_polarity));
+       } else if (streq("mapping_events_count", name)) {
+               fprintf(rsp, "%" PRIi8, mapping_events_count);
        } else if (streq("directional_focus_tightness", name)) {
                fprintf(rsp, "%s", TIGHTNESS_STR(directional_focus_tightness));
        } else if (streq("pointer_modifier", name)) {