X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=types.c;h=9d5eafefd2c59b4f2cb0d6389e1b876c796819cd;hb=45cb3efd44cecdce50bb8e21bd33393d60107b40;hp=c9663030d5d9cf9c63505b8ccd753ec679b70671;hpb=09f163beccce045905b7af6d142c18bb4ad7f5a4;p=bspwm.git diff --git a/types.c b/types.c index c966303..9d5eafe 100644 --- a/types.c +++ b/types.c @@ -2,7 +2,11 @@ #include #include #include +#include "bspwm.h" +#include "ewmh.h" +#include "settings.h" #include "types.h" +#include "tree.h" node_t *make_node(void) { @@ -15,28 +19,145 @@ node_t *make_node(void) return n; } +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--; +} + desktop_t *make_desktop(const char *name) { desktop_t *d = malloc(sizeof(desktop_t)); - strcpy(d->name, name); + if (name == NULL) + snprintf(d->name, sizeof(d->name), "%s%02d", DEFAULT_DESK_NAME, ++desktop_uid); + else + strncpy(d->name, name, sizeof(d->name)); d->layout = LAYOUT_TILED; d->prev = d->next = NULL; d->root = d->focus = d->last_focus = NULL; 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)); + strncpy(c->class_name, MISSING_VALUE, sizeof(c->class_name)); + c->uid = ++client_uid; + c->border_width = border_width; c->window = win; - c->floating = c->transient = c->fullscreen = c->locked = c->urgent = c->visible = false; + c->floating = c->transient = c->fullscreen = c->locked = c->urgent = false; return c; } rule_t *make_rule(void) { rule_t *r = malloc(sizeof(rule_t)); + r->uid = ++rule_uid; r->effect.floating = false; + r->effect.monitor = NULL; + r->effect.desktop = NULL; + r->prev = NULL; r->next = NULL; return r; } + +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; +}