mirror of https://github.com/0intro/wmii
heapized global containers
This commit is contained in:
parent
eb05036a06
commit
398043dcd6
|
@ -34,7 +34,7 @@ Area *alloc_area(Page *p, char *layout)
|
|||
a->layout = get_layout(layout);
|
||||
a->layout->init(a);
|
||||
cext_attach_item(&p->areas, a);
|
||||
cext_attach_item(&areas, a);
|
||||
cext_attach_item(areas, a);
|
||||
p->file[P_SEL_AREA]->content = a->file[A_PREFIX]->content;
|
||||
return a;
|
||||
}
|
||||
|
@ -45,10 +45,10 @@ void destroy_area(Area *a)
|
|||
a->layout->deinit(a);
|
||||
while ((c = cext_stack_get_top_item(&a->clients))) {
|
||||
cext_detach_item(&a->clients, c);
|
||||
cext_attach_item(&detached, c);
|
||||
cext_attach_item(detached, c);
|
||||
}
|
||||
ixp_remove_file(ixps, a->file[A_PREFIX]);
|
||||
cext_detach_item(&areas, a);
|
||||
cext_detach_item(areas, a);
|
||||
free(a);
|
||||
}
|
||||
|
||||
|
@ -122,7 +122,7 @@ static void iter_after_write_area(void *item, void *aux)
|
|||
}
|
||||
|
||||
static void handle_after_write_area(IXPServer *s, File *f) {
|
||||
cext_list_iterate(&areas, f, iter_after_write_area);
|
||||
cext_list_iterate(areas, f, iter_after_write_area);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ Client *alloc_client(Window w)
|
|||
c->file[C_NAME] = wmii_create_ixpfile(ixps, buf, (char *)name.value);
|
||||
free(name.value);
|
||||
id++;
|
||||
cext_attach_item(&clients, c);
|
||||
cext_attach_item(clients, c);
|
||||
return c;
|
||||
}
|
||||
|
||||
|
@ -177,8 +177,8 @@ void handle_client_property(Client *c, XPropertyEvent *e)
|
|||
|
||||
void destroy_client(Client * c)
|
||||
{
|
||||
cext_detach_item(&detached, c);
|
||||
cext_detach_item(&clients, c);
|
||||
cext_detach_item(detached, c);
|
||||
cext_detach_item(clients, c);
|
||||
ixp_remove_file(ixps, c->file[C_PREFIX]);
|
||||
free(c);
|
||||
}
|
||||
|
@ -294,7 +294,7 @@ void gravitate(Client * c, unsigned int tabh, unsigned int bw, int invert)
|
|||
void attach_client(Client * c)
|
||||
{
|
||||
Area *a = 0;
|
||||
if (!cext_sizeof_container(&pages))
|
||||
if (!cext_sizeof_container(pages))
|
||||
alloc_page();
|
||||
/* transient stuff */
|
||||
a = get_sel_area();
|
||||
|
|
|
@ -93,7 +93,7 @@ Frame *alloc_frame(XRectangle * r)
|
|||
XDefineCursor(dpy, f->win, f->cursor);
|
||||
f->gc = XCreateGC(dpy, f->win, 0, 0);
|
||||
XSync(dpy, False);
|
||||
cext_attach_item(&frames, f);
|
||||
cext_attach_item(frames, f);
|
||||
return f;
|
||||
}
|
||||
|
||||
|
@ -107,12 +107,12 @@ static int comp_frame_win(void *pattern, void *frame)
|
|||
|
||||
Frame *win_to_frame(Window w)
|
||||
{
|
||||
return cext_find_item(&frames, &w, comp_frame_win);
|
||||
return cext_find_item(frames, &w, comp_frame_win);
|
||||
}
|
||||
|
||||
void destroy_frame(Frame * f)
|
||||
{
|
||||
cext_detach_item(&frames, f);
|
||||
cext_detach_item(frames, f);
|
||||
XFreeGC(dpy, f->gc);
|
||||
XDestroyWindow(dpy, f->win);
|
||||
ixp_remove_file(ixps, f->file[F_PREFIX]);
|
||||
|
@ -318,7 +318,7 @@ void detach_client_from_frame(Client *c, Bool unmap)
|
|||
cext_detach_item(&f->clients, c);
|
||||
if (!c->destroyed) {
|
||||
if (!unmap) {
|
||||
cext_attach_item(&detached, c);
|
||||
cext_attach_item(detached, c);
|
||||
hide_client(c);
|
||||
}
|
||||
c->rect.x = f->rect.x;
|
||||
|
@ -365,7 +365,7 @@ static void iter_before_read_frame(void *item, void *aux)
|
|||
|
||||
static void handle_before_read_frame(IXPServer *s, File *f)
|
||||
{
|
||||
cext_list_iterate(&frames, f, iter_before_read_frame);
|
||||
cext_list_iterate(frames, f, iter_before_read_frame);
|
||||
}
|
||||
|
||||
static void iter_after_write_frame(void *item, void *aux)
|
||||
|
@ -391,7 +391,7 @@ static void iter_after_write_frame(void *item, void *aux)
|
|||
|
||||
static void handle_after_write_frame(IXPServer * s, File * f)
|
||||
{
|
||||
cext_list_iterate(&frames, f, iter_after_write_frame);
|
||||
cext_list_iterate(frames, f, iter_after_write_frame);
|
||||
}
|
||||
|
||||
Frame *get_sel_frame_of_area(Area *a)
|
||||
|
|
|
@ -17,5 +17,5 @@ static int comp_layout_name(void *name, void *layout)
|
|||
|
||||
Layout *get_layout(char *name)
|
||||
{
|
||||
return cext_find_item(&layouts, name, comp_layout_name);
|
||||
return cext_find_item(layouts, name, comp_layout_name);
|
||||
}
|
||||
|
|
|
@ -49,7 +49,7 @@ static Layout lcol = { "col", init_col, deinit_col, arrange_col, attach_col, det
|
|||
|
||||
void init_layout_column()
|
||||
{
|
||||
cext_attach_item(&layouts, &lcol);
|
||||
cext_attach_item(layouts, &lcol);
|
||||
}
|
||||
|
||||
static Column *get_sel_column(Acme *acme)
|
||||
|
|
|
@ -32,7 +32,7 @@ static Layout lfloat = { "float", init_float, deinit_float, arrange_float, attac
|
|||
|
||||
void init_layout_float()
|
||||
{
|
||||
cext_attach_item(&layouts, &lfloat);
|
||||
cext_attach_item(layouts, &lfloat);
|
||||
}
|
||||
|
||||
static void arrange_float(Area *a)
|
||||
|
|
|
@ -23,7 +23,7 @@ Page *alloc_page()
|
|||
{
|
||||
Page *p = cext_emallocz(sizeof(Page));
|
||||
char buf[MAX_BUF], buf2[16];
|
||||
size_t id = cext_sizeof_container(&pages);
|
||||
size_t id = cext_sizeof_container(pages);
|
||||
|
||||
snprintf(buf2, sizeof(buf2), "%d", id);
|
||||
p->areas.list = p->areas.stack = 0;
|
||||
|
@ -41,7 +41,7 @@ Page *alloc_page()
|
|||
p->file[P_CTL]->after_write = handle_after_write_page;
|
||||
alloc_area(p, "float");
|
||||
alloc_area(p, def[WM_LAYOUT]->content);
|
||||
cext_attach_item(&pages, p);
|
||||
cext_attach_item(pages, p);
|
||||
def[WM_SEL_PAGE]->content = p->file[P_PREFIX]->content;
|
||||
invoke_wm_event(def[WM_EVENT_PAGE_UPDATE]);
|
||||
return p;
|
||||
|
@ -57,7 +57,7 @@ void destroy_page(Page * p)
|
|||
cext_list_iterate(&p->areas, nil, iter_destroy_area);
|
||||
def[WM_SEL_PAGE]->content = 0;
|
||||
ixp_remove_file(ixps, p->file[P_PREFIX]);
|
||||
cext_detach_item(&pages, p);
|
||||
cext_detach_item(pages, p);
|
||||
free(p);
|
||||
if ((p = get_sel_page()))
|
||||
sel_page(p);
|
||||
|
@ -72,7 +72,7 @@ void sel_page(Page * p)
|
|||
return;
|
||||
if (p != sel) {
|
||||
hide_page(sel);
|
||||
cext_stack_top_item(&pages, p);
|
||||
cext_stack_top_item(pages, p);
|
||||
show_page(p);
|
||||
}
|
||||
def[WM_SEL_PAGE]->content = p->file[P_PREFIX]->content;
|
||||
|
@ -142,12 +142,12 @@ static void iter_after_write_page(void *item, void *aux)
|
|||
|
||||
static void handle_after_write_page(IXPServer *s, File *f)
|
||||
{
|
||||
cext_list_iterate(&pages, f, iter_after_write_page);
|
||||
cext_list_iterate(pages, f, iter_after_write_page);
|
||||
}
|
||||
|
||||
Page *get_sel_page()
|
||||
{
|
||||
return cext_stack_get_top_item(&pages);
|
||||
return cext_stack_get_top_item(pages);
|
||||
}
|
||||
|
||||
static void select_area(void *obj, char *arg)
|
||||
|
|
70
cmd/wm/wm.c
70
cmd/wm/wm.c
|
@ -142,7 +142,7 @@ static void draw_pager_page(Page *p, Draw *d)
|
|||
{
|
||||
char name[4];
|
||||
initial_rect = d->rect;
|
||||
if (p == cext_stack_get_top_item(&pages)) {
|
||||
if (p == cext_stack_get_top_item(pages)) {
|
||||
d->bg = blitz_loadcolor(dpy, screen_num, def[WM_SEL_BG_COLOR]->content);
|
||||
d->fg = blitz_loadcolor(dpy, screen_num, def[WM_SEL_FG_COLOR]->content);
|
||||
d->border = blitz_loadcolor(dpy, screen_num, def[WM_SEL_BORDER_COLOR]->content);
|
||||
|
@ -151,7 +151,7 @@ static void draw_pager_page(Page *p, Draw *d)
|
|||
d->fg = blitz_loadcolor(dpy, screen_num, def[WM_NORM_FG_COLOR]->content);
|
||||
d->border = blitz_loadcolor(dpy, screen_num, def[WM_NORM_BORDER_COLOR]->content);
|
||||
}
|
||||
snprintf(name, sizeof(name), "%d", cext_list_get_item_index(&pages, p));
|
||||
snprintf(name, sizeof(name), "%d", cext_list_get_item_index(pages, p));
|
||||
d->data = name;
|
||||
blitz_drawlabel(dpy, d);
|
||||
XSync(dpy, False);
|
||||
|
@ -166,7 +166,7 @@ static void draw_pager()
|
|||
int dx;
|
||||
Page *p;
|
||||
|
||||
blitz_getbasegeometry(&pages, &size, &cols, &rows);
|
||||
blitz_getbasegeometry(pages, &size, &cols, &rows);
|
||||
dx = (cols - 1) * GAP; /* GAPpx space */
|
||||
tw = (rect.width - dx) / cols;
|
||||
th = ((double) tw / rect.width) * rect.height;
|
||||
|
@ -182,7 +182,7 @@ static void draw_pager()
|
|||
else
|
||||
d.rect.y = ir * (rect.height - th) / (rows - 1);
|
||||
d.rect.height = th;
|
||||
if (!(p = cext_list_get_item(&pages, i)))
|
||||
if (!(p = cext_list_get_item(pages, i)))
|
||||
return;
|
||||
draw_pager_page(p, &d);
|
||||
i++;
|
||||
|
@ -198,9 +198,9 @@ static Page *xy_to_pager_page(int x, int y)
|
|||
XRectangle r;
|
||||
Page *p;
|
||||
|
||||
if (!cext_sizeof_container(&pages))
|
||||
if (!cext_sizeof_container(pages))
|
||||
return nil;
|
||||
blitz_getbasegeometry(&pages, &size, &cols, &rows);
|
||||
blitz_getbasegeometry(pages, &size, &cols, &rows);
|
||||
dx = (cols - 1) * GAP; /* GAPpx space */
|
||||
tw = (rect.width - dx) / cols;
|
||||
th = ((double) tw / rect.width) * rect.height;
|
||||
|
@ -214,7 +214,7 @@ static Page *xy_to_pager_page(int x, int y)
|
|||
else
|
||||
r.y = ir * (rect.height - th) / (rows - 1);
|
||||
r.height = th;
|
||||
if (!(p = cext_list_get_item(&pages, i)))
|
||||
if (!(p = cext_list_get_item(pages, i)))
|
||||
return nil;
|
||||
if (blitz_ispointinrect(x, y, &r))
|
||||
return p;
|
||||
|
@ -241,7 +241,7 @@ static void pager(void *obj, char *arg)
|
|||
XEvent ev;
|
||||
int i;
|
||||
|
||||
if (!cext_sizeof_container(&pages))
|
||||
if (!cext_sizeof_container(pages))
|
||||
return;
|
||||
|
||||
XClearWindow(dpy, transient);
|
||||
|
@ -265,8 +265,8 @@ static void pager(void *obj, char *arg)
|
|||
case KeyPress:
|
||||
XUnmapWindow(dpy, transient);
|
||||
if ((i = handle_kpress(&ev.xkey)) != -1)
|
||||
if (i < cext_sizeof_container(&pages))
|
||||
sel_page(cext_list_get_item(&pages, i));
|
||||
if (i < cext_sizeof_container(pages))
|
||||
sel_page(cext_list_get_item(pages, i));
|
||||
XUngrabKeyboard(dpy, CurrentTime);
|
||||
XUngrabPointer(dpy, CurrentTime /* ev.xbutton.time */ );
|
||||
return;
|
||||
|
@ -291,9 +291,9 @@ static void draw_detached_clients()
|
|||
unsigned int i, ic, ir, tw, th, rows, cols, size;
|
||||
int dx, dy;
|
||||
|
||||
if (!cext_sizeof_container(&detached))
|
||||
if (!cext_sizeof_container(detached))
|
||||
return;
|
||||
blitz_getbasegeometry(&detached, &size, &cols, &rows);
|
||||
blitz_getbasegeometry(detached, &size, &cols, &rows);
|
||||
dx = (cols - 1) * GAP; /* GAPpx space */
|
||||
dy = (rows - 1) * GAP; /* GAPpx space */
|
||||
tw = (rect.width - dx) / cols;
|
||||
|
@ -304,7 +304,7 @@ static void draw_detached_clients()
|
|||
i = 0;
|
||||
for (ir = 0; ir < rows; ir++) {
|
||||
for (ic = 0; ic < cols; ic++) {
|
||||
Client *c = cext_list_get_item(&detached, i++);
|
||||
Client *c = cext_list_get_item(detached, i++);
|
||||
XRectangle cr;
|
||||
if (!c)
|
||||
return;
|
||||
|
@ -335,7 +335,7 @@ static void detached_clients(void *obj, char *arg)
|
|||
{
|
||||
XEvent ev;
|
||||
int i, n;
|
||||
size_t size = cext_sizeof_container(&detached);
|
||||
size_t size = cext_sizeof_container(detached);
|
||||
Client *c;
|
||||
|
||||
if (!size)
|
||||
|
@ -357,15 +357,15 @@ static void detached_clients(void *obj, char *arg)
|
|||
XUnmapWindow(dpy, transient);
|
||||
if ((n = handle_kpress(&ev.xkey)) != -1) {
|
||||
for (i = 0; i < size; i++)
|
||||
hide_client(cext_list_get_item(&detached, i));
|
||||
hide_client(cext_list_get_item(detached, i));
|
||||
if (n - 1 < i) {
|
||||
c = cext_list_get_item(&detached, n);
|
||||
cext_detach_item(&detached, c);
|
||||
c = cext_list_get_item(detached, n);
|
||||
cext_detach_item(detached, c);
|
||||
attach_client(c);
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < size; i++)
|
||||
hide_client(cext_list_get_item(&detached, i));
|
||||
hide_client(cext_list_get_item(detached, i));
|
||||
}
|
||||
XUngrabKeyboard(dpy, CurrentTime);
|
||||
return;
|
||||
|
@ -374,9 +374,9 @@ static void detached_clients(void *obj, char *arg)
|
|||
if (ev.xbutton.button == Button1) {
|
||||
XUnmapWindow(dpy, transient);
|
||||
for (i = 0; i < size; i++)
|
||||
hide_client(cext_list_get_item(&detached, i));
|
||||
hide_client(cext_list_get_item(detached, i));
|
||||
if ((c = win_to_client(ev.xbutton.window))) {
|
||||
cext_detach_item(&detached, c);
|
||||
cext_detach_item(detached, c);
|
||||
attach_client(c);
|
||||
}
|
||||
}
|
||||
|
@ -396,9 +396,9 @@ static void _close_client(void *obj, char *arg)
|
|||
|
||||
static void _attach_client(void *obj, char *arg)
|
||||
{
|
||||
if (cext_sizeof_container(&detached)) {
|
||||
Client *c = cext_stack_get_top_item(&detached);
|
||||
cext_detach_item(&detached, c);
|
||||
if (cext_sizeof_container(detached)) {
|
||||
Client *c = cext_stack_get_top_item(detached);
|
||||
cext_detach_item(detached, c);
|
||||
attach_client(c);
|
||||
}
|
||||
}
|
||||
|
@ -416,11 +416,11 @@ static void _select_page(void *obj, char *arg)
|
|||
if (!p || !arg)
|
||||
return;
|
||||
if (!strncmp(arg, "prev", 5))
|
||||
p = cext_list_get_prev_item(&pages, p);
|
||||
p = cext_list_get_prev_item(pages, p);
|
||||
else if (!strncmp(arg, "next", 5))
|
||||
p = cext_list_get_next_item(&pages, p);
|
||||
p = cext_list_get_next_item(pages, p);
|
||||
else
|
||||
p = cext_list_get_item(&pages, blitz_strtonum(arg, 0, cext_sizeof_container(&pages) - 1));
|
||||
p = cext_list_get_item(pages, blitz_strtonum(arg, 0, cext_sizeof_container(pages) - 1));
|
||||
sel_page(p);
|
||||
}
|
||||
|
||||
|
@ -449,7 +449,7 @@ static int comp_client_win(void *pattern, void *client)
|
|||
|
||||
Client *win_to_client(Window w)
|
||||
{
|
||||
return cext_find_item(&clients, &w, comp_client_win);
|
||||
return cext_find_item(clients, &w, comp_client_win);
|
||||
}
|
||||
|
||||
void scan_wins()
|
||||
|
@ -576,7 +576,7 @@ void handle_after_write(IXPServer * s, File * f)
|
|||
if (geom && strrchr(geom, ',')) {
|
||||
area_rect = rect;
|
||||
blitz_strtorect(&rect, &area_rect, geom);
|
||||
cext_list_iterate(&pages, nil, iter_update_page);
|
||||
cext_list_iterate(pages, nil, iter_update_page);
|
||||
}
|
||||
}
|
||||
check_event(0);
|
||||
|
@ -712,7 +712,7 @@ static void clean_client_up(void *item, void *aux)
|
|||
|
||||
static void cleanup()
|
||||
{
|
||||
cext_list_iterate(&clients, nil, clean_client_up);
|
||||
cext_list_iterate(clients, nil, clean_client_up);
|
||||
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
|
||||
}
|
||||
|
||||
|
@ -782,12 +782,12 @@ int main(int argc, char *argv[])
|
|||
}
|
||||
def[WM_CTL]->after_write = handle_after_write;
|
||||
|
||||
detached.list = detached.stack = 0;
|
||||
pages.list = pages.stack = 0;
|
||||
areas.list = areas.stack = 0;
|
||||
frames.list = frames.stack = 0;
|
||||
clients.list = clients.stack = 0;
|
||||
layouts.list = layouts.stack = 0;
|
||||
detached = cext_emallocz(sizeof(Container));
|
||||
pages = cext_emallocz(sizeof(Container));
|
||||
areas = cext_emallocz(sizeof(Container));
|
||||
frames = cext_emallocz(sizeof(Container));
|
||||
clients = cext_emallocz(sizeof(Container));
|
||||
layouts = cext_emallocz(sizeof(Container));
|
||||
|
||||
init_atoms();
|
||||
init_cursors();
|
||||
|
|
12
cmd/wm/wm.h
12
cmd/wm/wm.h
|
@ -164,12 +164,12 @@ Window root;
|
|||
Window transient;
|
||||
XRectangle rect;
|
||||
XRectangle area_rect;
|
||||
Container detached;
|
||||
Container pages;
|
||||
Container areas;
|
||||
Container frames;
|
||||
Container clients;
|
||||
Container layouts;
|
||||
Container *detached;
|
||||
Container *pages;
|
||||
Container *areas;
|
||||
Container *frames;
|
||||
Container *clients;
|
||||
Container *layouts;
|
||||
XFontStruct *font;
|
||||
XColor xorcolor;
|
||||
GC xorgc;
|
||||
|
|
Loading…
Reference in New Issue