ZSHCPL = $(PREFIX)/share/zsh/site-functions
WM_SRC = bspwm.c helpers.c settings.c monitor.c desktop.c tree.c history.c \
- events.c window.c messages.c query.c restore.c rules.c ewmh.c
+ events.c window.c messages.c query.c restore.c rule.c ewmh.c
WM_OBJ = $(WM_SRC:.c=.o)
CL_SRC = bspc.c helpers.c
CL_OBJ = $(CL_SRC:.c=.o)
bspc.o: bspc.c common.h helpers.h
-bspwm.o: bspwm.c bspwm.h common.h desktop.h events.h ewmh.h helpers.h messages.h monitor.h rules.h settings.h tree.h types.h window.h
+bspwm.o: bspwm.c bspwm.h common.h desktop.h events.h ewmh.h helpers.h messages.h monitor.h rule.h settings.h tree.h types.h window.h
desktop.o: desktop.c bspwm.h desktop.h ewmh.h helpers.h history.h tree.h types.h window.h
-events.o: events.c bspwm.h events.h ewmh.h helpers.h monitor.h query.h rules.h settings.h tree.h types.h window.h
+events.o: events.c bspwm.h events.h ewmh.h helpers.h monitor.h query.h settings.h tree.h types.h window.h
ewmh.o: ewmh.c bspwm.h ewmh.h helpers.h settings.h tree.h types.h
helpers.o: helpers.c bspwm.h helpers.h types.h
-history.o: history.c helpers.h history.h query.h types.h
-messages.o: messages.c bspwm.h common.h desktop.h events.h ewmh.h helpers.h messages.h monitor.h query.h restore.h rules.h settings.h tree.h types.h window.h
+history.o: history.c helpers.h query.h types.h
+messages.o: messages.c bspwm.h desktop.h events.h ewmh.h helpers.h messages.h monitor.h query.h restore.h rule.h settings.h tree.h types.h window.h
monitor.o: monitor.c bspwm.h desktop.h ewmh.h helpers.h monitor.h tree.h types.h window.h
-query.o: query.c bspwm.h helpers.h history.h messages.h query.h settings.h tree.h types.h
+query.o: query.c bspwm.h helpers.h history.h messages.h query.h tree.h types.h
restore.o: restore.c bspwm.h desktop.h ewmh.h helpers.h history.h monitor.h query.h restore.h settings.h tree.h types.h
-rules.o: rules.c bspwm.h ewmh.h helpers.h query.h rules.h types.h window.h
-settings.o: settings.c bspwm.h common.h helpers.h settings.h types.h
+rule.o: rule.c bspwm.h ewmh.h helpers.h query.h rule.h types.h window.h
+settings.o: settings.c bspwm.h helpers.h settings.h types.h
tree.o: tree.c bspwm.h desktop.h ewmh.h helpers.h history.h query.h settings.h tree.h types.h window.h
-window.o: window.c bspwm.h ewmh.h helpers.h query.h rules.h settings.h tree.h types.h window.h
+window.o: window.c bspwm.h ewmh.h helpers.h query.h rule.h settings.h tree.h types.h window.h
#include <stdio.h>
#include <string.h>
#include <unistd.h>
-#include <signal.h>
#include <fcntl.h>
#include <ctype.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/select.h>
-#include <xcb/xcb.h>
-#include <xcb/xcb_event.h>
-#include <xcb/xcb_ewmh.h>
-#include <xcb/randr.h>
#include "types.h"
#include "desktop.h"
#include "monitor.h"
#include "settings.h"
#include "messages.h"
-#include "rules.h"
#include "events.h"
#include "common.h"
-#include "helpers.h"
-#include "window.h"
#include "bspwm.h"
#include "tree.h"
+#include "window.h"
+#include "rule.h"
#include "ewmh.h"
int main(int argc, char *argv[])
#include <stdlib.h>
#include <string.h>
#include "bspwm.h"
-#include "types.h"
#include "desktop.h"
-#include "history.h"
#include "tree.h"
+#include "history.h"
#include "window.h"
#include "ewmh.h"
-#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
-#include <xcb/xcb.h>
-#include <xcb/randr.h>
-#include <xcb/xcb_event.h>
#include <xcb/xcb_icccm.h>
#include "types.h"
-#include "monitor.h"
#include "bspwm.h"
#include "settings.h"
-#include "helpers.h"
-#include "window.h"
#include "events.h"
-#include "tree.h"
+#include "monitor.h"
+#include "window.h"
#include "query.h"
-#include "rules.h"
+#include "tree.h"
#include "ewmh.h"
void handle_event(xcb_generic_event_t *evt)
-#include <stdio.h>
#include <string.h>
#include <unistd.h>
-#include <xcb/xcb_ewmh.h>
-#include "types.h"
#include "bspwm.h"
#include "settings.h"
#include "tree.h"
#include <stdlib.h>
#include <string.h>
#include <math.h>
-#include <xcb/xcb.h>
-#include <xcb/xcb_event.h>
#include "bspwm.h"
-#include "helpers.h"
void warn(char *fmt, ...)
{
#include <stdlib.h>
#include "types.h"
#include "query.h"
-#include "history.h"
focus_history_t *make_focus_history(void)
{
#include <stdlib.h>
#include <errno.h>
#include "settings.h"
-#include "messages.h"
#include "query.h"
-#include "restore.h"
-#include "common.h"
-#include "types.h"
+#include "bspwm.h"
+#include "tree.h"
#include "desktop.h"
#include "monitor.h"
-#include "bspwm.h"
-#include "ewmh.h"
-#include "helpers.h"
#include "window.h"
+#include "rule.h"
+#include "restore.h"
#include "events.h"
-#include "tree.h"
-#include "rules.h"
+#include "ewmh.h"
+#include "messages.h"
bool cmd_window(char **args, int num)
{
#include <stdlib.h>
#include <string.h>
#include "bspwm.h"
-#include "types.h"
-#include "desktop.h"
#include "tree.h"
#include "monitor.h"
+#include "desktop.h"
#include "window.h"
#include "ewmh.h"
-#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "bspwm.h"
#include "tree.h"
-#include "history.h"
-#include "settings.h"
#include "messages.h"
+#include "history.h"
#include "query.h"
void query_monitors(coordinates_t loc, domain_t dom, char *rsp)
#include <ctype.h>
#include <string.h>
+#include "bspwm.h"
#include "types.h"
-#include "desktop.h"
#include "monitor.h"
-#include "history.h"
+#include "desktop.h"
#include "tree.h"
#include "settings.h"
-#include "ewmh.h"
-#include "bspwm.h"
#include "query.h"
+#include "history.h"
+#include "ewmh.h"
#include "restore.h"
void restore_tree(char *file_path)
--- /dev/null
+#include <stdio.h>
+#include <string.h>
+#include <xcb/xcb_icccm.h>
+#include "bspwm.h"
+#include "ewmh.h"
+#include "window.h"
+#include "query.h"
+#include "rule.h"
+
+rule_t *make_rule(void)
+{
+ rule_t *r = malloc(sizeof(rule_t));
+ r->uid = ++rule_uid;
+ r->effect.floating = false;
+ r->effect.follow = false;
+ r->effect.focus = false;
+ r->effect.unmanage = false;
+ r->one_shot = false;
+ r->effect.desc[0] = '\0';
+ r->prev = NULL;
+ r->next = NULL;
+ return r;
+}
+
+void add_rule(rule_t *r)
+{
+ if (rule_head == NULL) {
+ rule_head = rule_tail = r;
+ } else {
+ rule_tail->next = r;
+ r->prev = rule_tail;
+ rule_tail = r;
+ }
+}
+
+void remove_rule(rule_t *r)
+{
+ if (r == NULL)
+ return;
+ rule_t *prev = r->prev;
+ rule_t *next = r->next;
+ if (prev != NULL)
+ prev->next = next;
+ if (next != NULL)
+ next->prev = prev;
+ if (r == rule_head)
+ rule_head = next;
+ if (r == rule_tail)
+ rule_tail = prev;
+ free(r);
+}
+
+void remove_rule_by_uid(unsigned int uid)
+{
+ remove_rule(find_rule(uid));
+}
+
+rule_t *find_rule(unsigned int uid)
+{
+ for (rule_t *r = rule_head; r != NULL; r = r->next)
+ if (r->uid == uid)
+ return r;
+ return NULL;
+}
+
+bool is_match(rule_t *r, xcb_window_t win)
+{
+ xcb_icccm_get_wm_class_reply_t reply;
+ int8_t success = 0;
+ if (streq(r->cause.name, MATCH_ALL) ||
+ ((success = xcb_icccm_get_wm_class_reply(dpy, xcb_icccm_get_wm_class(dpy, win), &reply, NULL)) == 1
+ && (streq(reply.class_name, r->cause.name)
+ || streq(reply.instance_name, r->cause.name)))) {
+ if (success == 1)
+ xcb_icccm_get_wm_class_reply_wipe(&reply);
+ return true;
+ }
+ return false;
+}
+
+void handle_rules(xcb_window_t win, monitor_t **m, desktop_t **d, bool *floating, bool *fullscreen, bool *locked, bool *follow, bool *transient, bool *takes_focus, bool *manage)
+{
+ xcb_ewmh_get_atoms_reply_t win_type;
+
+ if (xcb_ewmh_get_wm_window_type_reply(ewmh, xcb_ewmh_get_wm_window_type(ewmh, win), &win_type, NULL) == 1) {
+ for (unsigned int i = 0; i < win_type.atoms_len; i++) {
+ xcb_atom_t a = win_type.atoms[i];
+ if (a == ewmh->_NET_WM_WINDOW_TYPE_TOOLBAR
+ || a == ewmh->_NET_WM_WINDOW_TYPE_UTILITY) {
+ *takes_focus = false;
+ } else if (a == ewmh->_NET_WM_WINDOW_TYPE_DIALOG) {
+ *floating = true;
+ } else if (a == ewmh->_NET_WM_WINDOW_TYPE_DOCK || a == ewmh->_NET_WM_WINDOW_TYPE_DESKTOP || a == ewmh->_NET_WM_WINDOW_TYPE_NOTIFICATION) {
+ *manage = false;
+ if (a == ewmh->_NET_WM_WINDOW_TYPE_DESKTOP)
+ window_lower(win);
+ }
+ }
+ xcb_ewmh_get_atoms_reply_wipe(&win_type);
+ }
+
+ xcb_size_hints_t size_hints;
+
+ if (xcb_icccm_get_wm_normal_hints_reply(dpy, xcb_icccm_get_wm_normal_hints(dpy, win), &size_hints, NULL) == 1) {
+ if (size_hints.min_width > 0 && size_hints.min_height > 0
+ && size_hints.min_width == size_hints.max_width
+ && size_hints.min_height == size_hints.max_height)
+ *floating = true;
+ }
+
+ xcb_ewmh_get_atoms_reply_t win_state;
+
+ if (xcb_ewmh_get_wm_state_reply(ewmh, xcb_ewmh_get_wm_state(ewmh, win), &win_state, NULL) == 1) {
+ for (unsigned int i = 0; i < win_state.atoms_len; i++) {
+ xcb_atom_t a = win_state.atoms[i];
+ if (a == ewmh->_NET_WM_STATE_FULLSCREEN) {
+ *fullscreen = true;
+ }
+ }
+ xcb_ewmh_get_atoms_reply_wipe(&win_state);
+ }
+
+ xcb_window_t transient_for = XCB_NONE;
+ xcb_icccm_get_wm_transient_for_reply(dpy, xcb_icccm_get_wm_transient_for(dpy, win), &transient_for, NULL);
+ *transient = (transient_for == XCB_NONE ? false : true);
+ if (*transient)
+ *floating = true;
+
+ rule_t *rule = rule_head;
+
+ while (rule != NULL) {
+ if (is_match(rule, win)) {
+ rule_effect_t efc = rule->effect;
+ if (efc.floating)
+ *floating = true;
+ if (efc.fullscreen)
+ *fullscreen = true;
+ if (efc.locked)
+ *locked = true;
+ if (efc.follow)
+ *follow = true;
+ if (efc.focus)
+ *takes_focus = true;
+ if (efc.unmanage)
+ *manage = false;
+ if (efc.desc[0] != '\0') {
+ coordinates_t ref = {*m, *d, NULL};
+ coordinates_t loc;
+ if (desktop_from_desc(efc.desc, &ref, &loc)) {
+ *m = loc.monitor;
+ *d = loc.desktop;
+ }
+ }
+ }
+ rule_t *next = rule->next;
+ if (rule->one_shot)
+ remove_rule(rule);
+ rule = next;
+ }
+}
+
+void list_rules(char *pattern, char *rsp)
+{
+ char line[MAXLEN];
+
+ for (rule_t *r = rule_head; r != NULL; r = r->next) {
+ if (pattern != NULL && !streq(pattern, r->cause.name))
+ continue;
+ snprintf(line, sizeof(line), "%2X %s", r->uid, r->cause.name);
+ strncat(rsp, line, REMLEN(rsp));
+ if (r->effect.floating)
+ strncat(rsp, " --floating", REMLEN(rsp));
+ if (r->effect.fullscreen)
+ strncat(rsp, " --fullscreen", REMLEN(rsp));
+ if (r->effect.locked)
+ strncat(rsp, " --locked", REMLEN(rsp));
+ if (r->effect.follow)
+ strncat(rsp, " --follow", REMLEN(rsp));
+ if (r->effect.focus)
+ strncat(rsp, " --focus", REMLEN(rsp));
+ if (r->effect.unmanage)
+ strncat(rsp, " --unmanage", REMLEN(rsp));
+ if (r->one_shot)
+ strncat(rsp, " --one-shot", REMLEN(rsp));
+ if (r->effect.desc[0] != '\0') {
+ snprintf(line, sizeof(line), " -d %s", r->effect.desc);
+ strncat(rsp, line, REMLEN(rsp));
+ }
+ strncat(rsp, "\n", REMLEN(rsp));
+ }
+}
--- /dev/null
+#ifndef _RULE_H
+#define _RULE_H
+
+#define MATCH_ALL "*"
+
+rule_t *make_rule(void);
+void add_rule(rule_t *);
+void remove_rule(rule_t *);
+void remove_rule_by_uid(unsigned int);
+void prune_rules(desktop_t *);
+rule_t *find_rule(unsigned int);
+bool is_match(rule_t *, xcb_window_t);
+void handle_rules(xcb_window_t, monitor_t **, desktop_t **, bool *, bool *, bool *, bool *, bool *, bool *, bool *);
+void list_rules(char *, char *);
+
+#endif
+++ /dev/null
-#include <stdio.h>
-#include <string.h>
-#include <xcb/xcb_icccm.h>
-#include <xcb/xcb_ewmh.h>
-#include "window.h"
-#include "types.h"
-#include "bspwm.h"
-#include "ewmh.h"
-#include "rules.h"
-#include "query.h"
-
-rule_t *make_rule(void)
-{
- rule_t *r = malloc(sizeof(rule_t));
- r->uid = ++rule_uid;
- r->effect.floating = false;
- r->effect.follow = false;
- r->effect.focus = false;
- r->effect.unmanage = false;
- r->one_shot = false;
- r->effect.desc[0] = '\0';
- r->prev = NULL;
- r->next = NULL;
- return r;
-}
-
-void add_rule(rule_t *r)
-{
- if (rule_head == NULL) {
- rule_head = rule_tail = r;
- } else {
- rule_tail->next = r;
- r->prev = rule_tail;
- rule_tail = r;
- }
-}
-
-void remove_rule(rule_t *r)
-{
- if (r == NULL)
- return;
- rule_t *prev = r->prev;
- rule_t *next = r->next;
- if (prev != NULL)
- prev->next = next;
- if (next != NULL)
- next->prev = prev;
- if (r == rule_head)
- rule_head = next;
- if (r == rule_tail)
- rule_tail = prev;
- free(r);
-}
-
-void remove_rule_by_uid(unsigned int uid)
-{
- remove_rule(find_rule(uid));
-}
-
-rule_t *find_rule(unsigned int uid)
-{
- for (rule_t *r = rule_head; r != NULL; r = r->next)
- if (r->uid == uid)
- return r;
- return NULL;
-}
-
-bool is_match(rule_t *r, xcb_window_t win)
-{
- xcb_icccm_get_wm_class_reply_t reply;
- int8_t success = 0;
- if (streq(r->cause.name, MATCH_ALL) ||
- ((success = xcb_icccm_get_wm_class_reply(dpy, xcb_icccm_get_wm_class(dpy, win), &reply, NULL)) == 1
- && (streq(reply.class_name, r->cause.name)
- || streq(reply.instance_name, r->cause.name)))) {
- if (success == 1)
- xcb_icccm_get_wm_class_reply_wipe(&reply);
- return true;
- }
- return false;
-}
-
-void handle_rules(xcb_window_t win, monitor_t **m, desktop_t **d, bool *floating, bool *fullscreen, bool *locked, bool *follow, bool *transient, bool *takes_focus, bool *manage)
-{
- xcb_ewmh_get_atoms_reply_t win_type;
-
- if (xcb_ewmh_get_wm_window_type_reply(ewmh, xcb_ewmh_get_wm_window_type(ewmh, win), &win_type, NULL) == 1) {
- for (unsigned int i = 0; i < win_type.atoms_len; i++) {
- xcb_atom_t a = win_type.atoms[i];
- if (a == ewmh->_NET_WM_WINDOW_TYPE_TOOLBAR
- || a == ewmh->_NET_WM_WINDOW_TYPE_UTILITY) {
- *takes_focus = false;
- } else if (a == ewmh->_NET_WM_WINDOW_TYPE_DIALOG) {
- *floating = true;
- } else if (a == ewmh->_NET_WM_WINDOW_TYPE_DOCK || a == ewmh->_NET_WM_WINDOW_TYPE_DESKTOP || a == ewmh->_NET_WM_WINDOW_TYPE_NOTIFICATION) {
- *manage = false;
- if (a == ewmh->_NET_WM_WINDOW_TYPE_DESKTOP)
- window_lower(win);
- }
- }
- xcb_ewmh_get_atoms_reply_wipe(&win_type);
- }
-
- xcb_size_hints_t size_hints;
-
- if (xcb_icccm_get_wm_normal_hints_reply(dpy, xcb_icccm_get_wm_normal_hints(dpy, win), &size_hints, NULL) == 1) {
- if (size_hints.min_width > 0 && size_hints.min_height > 0
- && size_hints.min_width == size_hints.max_width
- && size_hints.min_height == size_hints.max_height)
- *floating = true;
- }
-
- xcb_ewmh_get_atoms_reply_t win_state;
-
- if (xcb_ewmh_get_wm_state_reply(ewmh, xcb_ewmh_get_wm_state(ewmh, win), &win_state, NULL) == 1) {
- for (unsigned int i = 0; i < win_state.atoms_len; i++) {
- xcb_atom_t a = win_state.atoms[i];
- if (a == ewmh->_NET_WM_STATE_FULLSCREEN) {
- *fullscreen = true;
- }
- }
- xcb_ewmh_get_atoms_reply_wipe(&win_state);
- }
-
- xcb_window_t transient_for = XCB_NONE;
- xcb_icccm_get_wm_transient_for_reply(dpy, xcb_icccm_get_wm_transient_for(dpy, win), &transient_for, NULL);
- *transient = (transient_for == XCB_NONE ? false : true);
- if (*transient)
- *floating = true;
-
- rule_t *rule = rule_head;
-
- while (rule != NULL) {
- if (is_match(rule, win)) {
- rule_effect_t efc = rule->effect;
- if (efc.floating)
- *floating = true;
- if (efc.fullscreen)
- *fullscreen = true;
- if (efc.locked)
- *locked = true;
- if (efc.follow)
- *follow = true;
- if (efc.focus)
- *takes_focus = true;
- if (efc.unmanage)
- *manage = false;
- if (efc.desc[0] != '\0') {
- coordinates_t ref = {*m, *d, NULL};
- coordinates_t loc;
- if (desktop_from_desc(efc.desc, &ref, &loc)) {
- *m = loc.monitor;
- *d = loc.desktop;
- }
- }
- }
- rule_t *next = rule->next;
- if (rule->one_shot)
- remove_rule(rule);
- rule = next;
- }
-}
-
-void list_rules(char *pattern, char *rsp)
-{
- char line[MAXLEN];
-
- for (rule_t *r = rule_head; r != NULL; r = r->next) {
- if (pattern != NULL && !streq(pattern, r->cause.name))
- continue;
- snprintf(line, sizeof(line), "%2X %s", r->uid, r->cause.name);
- strncat(rsp, line, REMLEN(rsp));
- if (r->effect.floating)
- strncat(rsp, " --floating", REMLEN(rsp));
- if (r->effect.fullscreen)
- strncat(rsp, " --fullscreen", REMLEN(rsp));
- if (r->effect.locked)
- strncat(rsp, " --locked", REMLEN(rsp));
- if (r->effect.follow)
- strncat(rsp, " --follow", REMLEN(rsp));
- if (r->effect.focus)
- strncat(rsp, " --focus", REMLEN(rsp));
- if (r->effect.unmanage)
- strncat(rsp, " --unmanage", REMLEN(rsp));
- if (r->one_shot)
- strncat(rsp, " --one-shot", REMLEN(rsp));
- if (r->effect.desc[0] != '\0') {
- snprintf(line, sizeof(line), " -d %s", r->effect.desc);
- strncat(rsp, line, REMLEN(rsp));
- }
- strncat(rsp, "\n", REMLEN(rsp));
- }
-}
+++ /dev/null
-#ifndef _RULES_H
-#define _RULES_H
-
-#define MATCH_ALL "*"
-
-rule_t *make_rule(void);
-void add_rule(rule_t *);
-void remove_rule(rule_t *);
-void remove_rule_by_uid(unsigned int);
-void prune_rules(desktop_t *);
-rule_t *find_rule(unsigned int);
-bool is_match(rule_t *, xcb_window_t);
-void handle_rules(xcb_window_t, monitor_t **, desktop_t **, bool *, bool *, bool *, bool *, bool *, bool *, bool *);
-void list_rules(char *, char *);
-
-#endif
-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
-#include <xcb/xcb.h>
-#include <xcb/xcb_event.h>
#include "bspwm.h"
-#include "helpers.h"
-#include "common.h"
#include "settings.h"
void run_config(void)
#include <limits.h>
#include <float.h>
#include "settings.h"
-#include "helpers.h"
#include "window.h"
-#include "types.h"
-#include "desktop.h"
-#include "history.h"
-#include "query.h"
#include "bspwm.h"
#include "ewmh.h"
#include "tree.h"
+#include "desktop.h"
+#include "history.h"
+#include "query.h"
node_t *make_node(void)
{
-#include <stdio.h>
#include <stdlib.h>
-#include <stdarg.h>
#include <string.h>
-#include <xcb/xcb.h>
-#include <xcb/xcb_event.h>
-#include <xcb/xcb_icccm.h>
#include "types.h"
#include "tree.h"
#include "bspwm.h"
#include "settings.h"
#include "ewmh.h"
-#include "rules.h"
#include "query.h"
+#include "rule.h"
#include "window.h"
pointer_state_t *make_pointer_state(void)