]> git.lizzy.rs Git - bspwm.git/blobdiff - types.c
New message: `balance`
[bspwm.git] / types.c
diff --git a/types.c b/types.c
index 1454710f95625bc284d93b22226c8a598d9764e5..9d5eafefd2c59b4f2cb0d6389e1b876c796819cd 100644 (file)
--- a/types.c
+++ b/types.c
@@ -3,8 +3,10 @@
 #include <xcb/xcb.h>
 #include <xcb/xcb_event.h>
 #include "bspwm.h"
+#include "ewmh.h"
 #include "settings.h"
 #include "types.h"
+#include "tree.h"
 
 node_t *make_node(void)
 {
@@ -31,6 +33,47 @@ monitor_t *make_monitor(xcb_rectangle_t *rect)
     return m;
 }
 
+monitor_t *find_monitor(char *name)
+{
+    for (monitor_t *m = mon_head; m != NULL; m = m->next)
+        if (strcmp(m->name, name) == 0)
+            return m;
+    return NULL;
+}
+
+void add_monitor(xcb_rectangle_t *rect)
+{
+    monitor_t *m = make_monitor(rect);
+    if (mon == NULL) {
+        mon = m;
+        mon_head = m;
+        mon_tail = m;
+    } else {
+        mon_tail->next = m;
+        m->prev = mon_tail;
+        mon_tail = m;
+    }
+    num_monitors++;
+}
+
+void remove_monitor(monitor_t *m)
+{
+    while (m->desk_head != NULL)
+        remove_desktop(m, m->desk_head);
+    monitor_t *prev = m->prev;
+    monitor_t *next = m->next;
+    if (prev != NULL)
+        prev->next = next;
+    if (next != NULL)
+        next->prev = prev;
+    if (m == mon_head)
+        mon_head = next;
+    if (m == mon_tail)
+        mon_tail = prev;
+    free(m);
+    num_monitors--;
+}
+
 desktop_t *make_desktop(const char *name)
 {
     desktop_t *d = malloc(sizeof(desktop_t));
@@ -44,6 +87,47 @@ desktop_t *make_desktop(const char *name)
     return d;
 }
 
+void add_desktop(monitor_t *m, char *name)
+{
+    desktop_t *d = make_desktop(name);
+    if (m->desk == NULL) {
+        m->desk = d;
+        m->desk_head = d;
+        m->desk_tail = d;
+    } else {
+        m->desk_tail->next = d;
+        d->prev = m->desk_tail;
+        m->desk_tail = d;
+    }
+    num_desktops++;
+    ewmh_update_number_of_desktops();
+    ewmh_update_desktop_names();
+    put_status();
+}
+
+void empty_desktop(desktop_t *d)
+{
+    destroy_tree(d->root);
+    d->root = d->focus = d->last_focus = NULL;
+}
+
+void remove_desktop(monitor_t *m, desktop_t *d)
+{
+    empty_desktop(d);
+    desktop_t *prev = d->prev;
+    desktop_t *next = d->next;
+    if (prev != NULL)
+        prev->next = next;
+    if (next != NULL)
+        next->prev = prev;
+    if (d == m->desk_head)
+        m->desk_head = next;
+    if (d == m->desk_tail)
+        m->desk_tail = prev;
+    free(d);
+    num_desktops--;
+}
+
 client_t *make_client(xcb_window_t win)
 {
     client_t *c = malloc(sizeof(client_t));
@@ -62,6 +146,7 @@ rule_t *make_rule(void)
     r->effect.floating = false;
     r->effect.monitor = NULL;
     r->effect.desktop = NULL;
+    r->prev = NULL;
     r->next = NULL;
     return r;
 }
@@ -69,5 +154,10 @@ rule_t *make_rule(void)
 pointer_state_t *make_pointer_state(void)
 {
     pointer_state_t *p = malloc(sizeof(pointer_state_t));
+    p->monitor = NULL;
+    p->desktop = NULL;
+    p->node = p->vertical_fence = p->horizontal_fence = NULL;
+    p->client = NULL;
+    p->window = XCB_NONE;
     return p;
 }