2012-08-20 22:38:29 +02:00
|
|
|
#include <stdlib.h>
|
2012-09-01 21:55:35 +02:00
|
|
|
#include <string.h>
|
2012-08-20 22:38:29 +02:00
|
|
|
#include <xcb/xcb.h>
|
|
|
|
#include <xcb/xcb_event.h>
|
2012-10-17 16:18:40 +02:00
|
|
|
#include "bspwm.h"
|
2012-12-26 22:48:07 +01:00
|
|
|
#include "ewmh.h"
|
2012-09-28 22:39:32 +02:00
|
|
|
#include "settings.h"
|
2012-08-18 11:18:19 +02:00
|
|
|
#include "types.h"
|
2012-12-26 14:39:46 +01:00
|
|
|
#include "tree.h"
|
2012-08-18 11:18:19 +02:00
|
|
|
|
2012-08-29 18:37:31 +02:00
|
|
|
node_t *make_node(void)
|
2012-08-18 11:18:19 +02:00
|
|
|
{
|
2012-08-29 18:37:31 +02:00
|
|
|
node_t *n = malloc(sizeof(node_t));
|
2012-09-04 11:14:01 +02:00
|
|
|
n->parent = n->first_child = n->second_child = NULL;
|
2012-09-01 21:55:35 +02:00
|
|
|
n->split_ratio = SPLIT_RATIO;
|
|
|
|
n->split_type = TYPE_VERTICAL;
|
2012-09-04 11:14:01 +02:00
|
|
|
n->client = NULL;
|
|
|
|
n->vacant = false;
|
2012-08-18 11:18:19 +02:00
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
2012-10-17 16:18:40 +02:00
|
|
|
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);
|
2012-12-09 12:01:45 +01:00
|
|
|
m->top_padding = m->right_padding = m->bottom_padding = m->left_padding = 0;
|
2012-10-17 16:18:40 +02:00
|
|
|
return m;
|
|
|
|
}
|
|
|
|
|
2012-12-26 22:48:07 +01:00
|
|
|
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++;
|
|
|
|
}
|
|
|
|
|
2012-12-26 14:39:46 +01:00
|
|
|
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;
|
2012-12-26 15:22:36 +01:00
|
|
|
free(m);
|
2012-12-27 22:36:06 +01:00
|
|
|
num_monitors--;
|
2012-12-26 14:39:46 +01:00
|
|
|
}
|
|
|
|
|
2012-09-12 14:56:51 +02:00
|
|
|
desktop_t *make_desktop(const char *name)
|
2012-08-18 11:18:19 +02:00
|
|
|
{
|
2012-08-29 18:37:31 +02:00
|
|
|
desktop_t *d = malloc(sizeof(desktop_t));
|
2012-10-17 16:18:40 +02:00
|
|
|
if (name == NULL)
|
|
|
|
snprintf(d->name, sizeof(d->name), "%s%02d", DEFAULT_DESK_NAME, ++desktop_uid);
|
|
|
|
else
|
|
|
|
strncpy(d->name, name, sizeof(d->name));
|
2012-08-25 15:24:35 +02:00
|
|
|
d->layout = LAYOUT_TILED;
|
2012-08-23 15:32:20 +02:00
|
|
|
d->prev = d->next = NULL;
|
2012-09-04 11:14:01 +02:00
|
|
|
d->root = d->focus = d->last_focus = NULL;
|
2012-08-18 11:18:19 +02:00
|
|
|
return d;
|
|
|
|
}
|
2012-08-25 15:24:35 +02:00
|
|
|
|
2012-12-26 22:48:07 +01:00
|
|
|
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();
|
|
|
|
}
|
|
|
|
|
2012-12-27 22:36:06 +01:00
|
|
|
void empty_desktop(desktop_t *d)
|
|
|
|
{
|
|
|
|
destroy_tree(d->root);
|
|
|
|
d->root = d->focus = d->last_focus = NULL;
|
|
|
|
}
|
|
|
|
|
2012-12-26 14:39:46 +01:00
|
|
|
void remove_desktop(monitor_t *m, desktop_t *d)
|
|
|
|
{
|
2012-12-27 22:36:06 +01:00
|
|
|
empty_desktop(d);
|
2012-12-26 14:39:46 +01:00
|
|
|
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;
|
2012-12-26 15:22:36 +01:00
|
|
|
free(d);
|
2012-12-27 22:36:06 +01:00
|
|
|
num_desktops--;
|
2012-12-26 14:39:46 +01:00
|
|
|
}
|
|
|
|
|
2012-09-05 14:07:06 +02:00
|
|
|
client_t *make_client(xcb_window_t win)
|
2012-08-25 15:24:35 +02:00
|
|
|
{
|
2012-08-29 18:37:31 +02:00
|
|
|
client_t *c = malloc(sizeof(client_t));
|
2012-09-29 11:57:41 +02:00
|
|
|
strncpy(c->class_name, MISSING_VALUE, sizeof(c->class_name));
|
2012-10-23 12:48:10 +02:00
|
|
|
c->uid = ++client_uid;
|
2012-09-28 22:39:32 +02:00
|
|
|
c->border_width = border_width;
|
2012-09-05 14:07:06 +02:00
|
|
|
c->window = win;
|
2012-09-21 19:05:42 +02:00
|
|
|
c->floating = c->transient = c->fullscreen = c->locked = c->urgent = false;
|
2012-08-25 15:24:35 +02:00
|
|
|
return c;
|
|
|
|
}
|
2012-09-10 13:47:51 +02:00
|
|
|
|
|
|
|
rule_t *make_rule(void)
|
|
|
|
{
|
|
|
|
rule_t *r = malloc(sizeof(rule_t));
|
2012-12-25 19:03:35 +01:00
|
|
|
r->uid = ++rule_uid;
|
2012-09-18 17:21:04 +02:00
|
|
|
r->effect.floating = false;
|
2013-03-12 10:56:45 +01:00
|
|
|
r->effect.follow = false;
|
2012-11-11 18:40:55 +01:00
|
|
|
r->effect.monitor = NULL;
|
|
|
|
r->effect.desktop = NULL;
|
2013-01-10 19:14:36 +01:00
|
|
|
r->prev = NULL;
|
2012-09-18 17:21:04 +02:00
|
|
|
r->next = NULL;
|
2012-09-10 13:47:51 +02:00
|
|
|
return r;
|
|
|
|
}
|
2012-09-22 15:10:59 +02:00
|
|
|
|
|
|
|
pointer_state_t *make_pointer_state(void)
|
|
|
|
{
|
|
|
|
pointer_state_t *p = malloc(sizeof(pointer_state_t));
|
2013-02-04 14:22:41 +01:00
|
|
|
p->monitor = NULL;
|
|
|
|
p->desktop = NULL;
|
2013-02-28 15:04:14 +01:00
|
|
|
p->node = p->vertical_fence = p->horizontal_fence = NULL;
|
2013-02-04 14:22:41 +01:00
|
|
|
p->client = NULL;
|
|
|
|
p->window = XCB_NONE;
|
2012-09-22 15:10:59 +02:00
|
|
|
return p;
|
|
|
|
}
|