]> git.lizzy.rs Git - bspwm.git/blob - types.c
e675aad2877a9794b2cfa8fe35c90e9bd41047d2
[bspwm.git] / types.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include <xcb/xcb.h>
4 #include <xcb/xcb_event.h>
5 #include "bspwm.h"
6 #include "ewmh.h"
7 #include "settings.h"
8 #include "types.h"
9 #include "tree.h"
10
11 node_t *make_node(void)
12 {
13     node_t *n = malloc(sizeof(node_t));
14     n->parent = n->first_child = n->second_child = NULL;
15     n->split_ratio = split_ratio;
16     n->split_type = TYPE_VERTICAL;
17     n->client = NULL;
18     n->vacant = false;
19     return n;
20 }
21
22 monitor_t *make_monitor(xcb_rectangle_t *rect)
23 {
24     monitor_t *m = malloc(sizeof(monitor_t));
25     snprintf(m->name, sizeof(m->name), "%s%02d", DEFAULT_MON_NAME, ++monitor_uid);
26     m->prev = m->next = NULL;
27     m->desk = m->last_desk = NULL;
28     if (rect != NULL)
29         m->rectangle = *rect;
30     else
31         warn("no rectangle was given for monitor '%s'\n", m->name);
32     m->top_padding = m->right_padding = m->bottom_padding = m->left_padding = 0;
33     return m;
34 }
35
36 monitor_t *find_monitor(char *name)
37 {
38     for (monitor_t *m = mon_head; m != NULL; m = m->next)
39         if (strcmp(m->name, name) == 0)
40             return m;
41     return NULL;
42 }
43
44 void add_monitor(xcb_rectangle_t *rect)
45 {
46     monitor_t *m = make_monitor(rect);
47     if (mon == NULL) {
48         mon = m;
49         mon_head = m;
50         mon_tail = m;
51     } else {
52         mon_tail->next = m;
53         m->prev = mon_tail;
54         mon_tail = m;
55     }
56     num_monitors++;
57 }
58
59 void remove_monitor(monitor_t *m)
60 {
61     while (m->desk_head != NULL)
62         remove_desktop(m, m->desk_head);
63     monitor_t *prev = m->prev;
64     monitor_t *next = m->next;
65     if (prev != NULL)
66         prev->next = next;
67     if (next != NULL)
68         next->prev = prev;
69     if (m == mon_head)
70         mon_head = next;
71     if (m == mon_tail)
72         mon_tail = prev;
73     free(m);
74     num_monitors--;
75 }
76
77 desktop_t *make_desktop(const char *name)
78 {
79     desktop_t *d = malloc(sizeof(desktop_t));
80     if (name == NULL)
81         snprintf(d->name, sizeof(d->name), "%s%02d", DEFAULT_DESK_NAME, ++desktop_uid);
82     else
83         strncpy(d->name, name, sizeof(d->name));
84     d->layout = LAYOUT_TILED;
85     d->prev = d->next = NULL;
86     d->root = d->focus = d->last_focus = NULL;
87     return d;
88 }
89
90 void add_desktop(monitor_t *m, char *name)
91 {
92     desktop_t *d = make_desktop(name);
93     if (m->desk == NULL) {
94         m->desk = d;
95         m->desk_head = d;
96         m->desk_tail = d;
97     } else {
98         m->desk_tail->next = d;
99         d->prev = m->desk_tail;
100         m->desk_tail = d;
101     }
102     num_desktops++;
103     ewmh_update_number_of_desktops();
104     ewmh_update_desktop_names();
105     put_status();
106 }
107
108 void empty_desktop(desktop_t *d)
109 {
110     destroy_tree(d->root);
111     d->root = d->focus = d->last_focus = NULL;
112 }
113
114 void remove_desktop(monitor_t *m, desktop_t *d)
115 {
116     empty_desktop(d);
117     desktop_t *prev = d->prev;
118     desktop_t *next = d->next;
119     if (prev != NULL)
120         prev->next = next;
121     if (next != NULL)
122         next->prev = prev;
123     if (d == m->desk_head)
124         m->desk_head = next;
125     if (d == m->desk_tail)
126         m->desk_tail = prev;
127     free(d);
128     num_desktops--;
129 }
130
131 client_t *make_client(xcb_window_t win)
132 {
133     client_t *c = malloc(sizeof(client_t));
134     strncpy(c->class_name, MISSING_VALUE, sizeof(c->class_name));
135     c->uid = ++client_uid;
136     c->border_width = border_width;
137     c->window = win;
138     c->floating = c->transient = c->fullscreen = c->locked = c->urgent = false;
139     return c;
140 }
141
142 rule_t *make_rule(void)
143 {
144     rule_t *r = malloc(sizeof(rule_t));
145     r->uid = ++rule_uid;
146     r->effect.floating = false;
147     r->effect.follow = false;
148     r->effect.monitor = NULL;
149     r->effect.desktop = NULL;
150     r->prev = NULL;
151     r->next = NULL;
152     return r;
153 }
154
155 pointer_state_t *make_pointer_state(void)
156 {
157     pointer_state_t *p = malloc(sizeof(pointer_state_t));
158     p->monitor = NULL;
159     p->desktop = NULL;
160     p->node = p->vertical_fence = p->horizontal_fence = NULL;
161     p->client = NULL;
162     p->window = XCB_NONE;
163     return p;
164 }