+monitor_t *make_monitor(xcb_rectangle_t *rect)
+{
+ monitor_t *m = malloc(sizeof(monitor_t));
+ snprintf(m->name, sizeof(m->name), "%s%02d", DEFAULT_MON_NAME, ++monitor_uid);
+ m->prev = m->next = NULL;
+ m->desk = m->last_desk = NULL;
+ if (rect != NULL)
+ m->rectangle = *rect;
+ else
+ warn("no rectangle was given for monitor '%s'\n", m->name);
+ m->top_padding = m->right_padding = m->bottom_padding = m->left_padding = 0;
+ 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--;
+}
+