proceeded with integration of Container struct

This commit is contained in:
garbeam 2005-12-07 02:37:37 +02:00
parent 004b0da2cc
commit f8949ef5e8
14 changed files with 346 additions and 484 deletions

View File

@ -15,7 +15,7 @@ Area *alloc_area(Page *p, XRectangle * r, char *layout)
{
char buf[MAX_BUF];
Area *a = (Area *) cext_emalloc(sizeof(Area));
int id = count_items((void **) p->area) + 1;
size_t id = cext_sizeof(&p->areas);
*a = zero_area;
a->rect = *r;
@ -34,82 +34,86 @@ Area *alloc_area(Page *p, XRectangle * r, char *layout)
snprintf(buf, MAX_BUF, "/%s/a/%d/layout", p->file[P_PREFIX]->name, id);
a->file[A_LAYOUT] = wmii_create_ixpfile(ixps, buf, layout);
a->layout = get_layout(layout);
p->area = (Area **) attach_item_end((void **) p->area, a, sizeof(Area *));
cext_attach_item(&p->areas, a);
p->file[P_SEL_AREA]->content = a->file[A_PREFIX]->content;
p->sel = index_item((void **) p->area, a);
return a;
}
void destroy_area(Area * a)
static void iter_destroy_area(void *item, void *aux)
{
destroy_frame((Frame *)item);
free((Frame *)item);
}
void destroy_area(Area *a)
{
unsigned int i;
a->layout->deinit(a);
for (i = 0; a->frame && a->frame[i]; i++);
destroy_frame(a->frame[i]);
free(a->frame);
cext_iterate(&a->frames, nil, iter_destroy_area);
ixp_remove_file(ixps, a->file[A_PREFIX]);
free(a);
}
void sel_area(Area * a, int raise)
static void iter_raise_frame(void *item, void *aux)
{
XRaiseWindow(dpy, ((Frame *)item)->win);
}
void sel_area(Area *a)
{
Page *p = a->page;
if (raise && a->frame) {
int i;
for (i = 0; a->frame[i]; i++)
if (i != a->sel)
XRaiseWindow(dpy, a->frame[i]->win);
}
p->sel = index_item((void **) p->area, a);
Frame *f;
Bool raise = cext_get_item_index(&p->areas, a) == 0;
if (raise)
cext_iterate(&a->frames, nil, iter_raise_frame);
cext_top_item(&p->areas, a);
p->file[P_SEL_AREA]->content = a->file[A_PREFIX]->content;
if (a->frame)
sel_frame(a->frame[a->sel], raise);
if ((f = get_sel_frame_of_area(a)))
sel_frame(f, raise);
}
void attach_frame_to_area(Area * a, Frame * f)
{
wmii_move_ixpfile(f->file[F_PREFIX], a->file[A_FRAME_PREFIX]);
a->file[A_SEL_FRAME]->content = f->file[F_PREFIX]->content;
a->frame = (Frame **) attach_item_end((void **) a->frame, f, sizeof(Frame *));
a->sel = index_item((void **) a->frame, f);
cext_attach_item(&a->frames, f);
f->area = a;
}
void detach_frame_from_area(Frame * f, int ignore_sel_and_destroy)
{
Area *a = f->area;
a->frame = (Frame **) detach_item((void **) a->frame, f, sizeof(Frame *));
cext_detach_item(&a->frames, f);
f->area = 0;
if (a->sel)
a->sel--;
else
a->sel = 0;
}
void draw_area(Area * a)
void draw_area(Area *a)
{
int i;
for (i = 0; a->frame && a->frame[i]; i++)
draw_frame(a->frame[i]);
cext_iterate(&a->frames, nil, draw_frame);
}
static void iter_hide_area(void *item, void *aux)
{
XUnmapWindow(dpy, ((Frame *)item)->win);
}
void hide_area(Area * a)
{
int i;
for (i = 0; a->frame && a->frame[i]; i++)
XUnmapWindow(dpy, a->frame[i]->win);
cext_iterate(&a->frames, nil, iter_hide_area);
}
static void iter_show_area(void *item, void *aux)
{
XMapWindow(dpy, ((Frame *)item)->win);
}
void show_area(Area * a)
{
int i;
for (i = 0; a->frame && a->frame[i]; i++)
XMapWindow(dpy, a->frame[i]->win);
cext_iterate(&a->frames, nil, iter_show_area);
}
Area *get_sel_area()
{
Page *p = cext_get_top_item(&page);
Page *p = get_sel_page();
return p ? p->area[p->sel] : nil;
return p ? cext_get_top_item(&p->areas) : nil;
}

View File

@ -184,7 +184,7 @@ void handle_client_property(Client * c, XPropertyEvent * e)
c->file[C_NAME]->size = strlen(buf);
}
if (c->frame)
draw_client(c);
draw_client(c, nil);
invoke_wm_event(def[WM_EVENT_CLIENT_UPDATE]);
break;
case XA_WM_TRANSIENT_FOR:
@ -209,7 +209,7 @@ void destroy_client(Client * c)
}
/* speed reasoned function for client property change */
void draw_client(void *item)
void draw_client(void *item, void *aux)
{
Client *c = item;
Frame *f = c->frame;
@ -235,7 +235,7 @@ void draw_client(void *item)
void draw_clients(Frame * f)
{
cext_iterate(&f->clients, draw_client);
cext_iterate(&f->clients, 0, draw_client);
}
void gravitate(Client * c, unsigned int tabh, unsigned int bw, int invert)
@ -311,15 +311,18 @@ void attach_client(Client * c)
if (t && t->frame)
a = t->frame->area;
}
cext_attach_item(&a->clients, c);
a->layout->attach(a, c);
if (old)
draw_frame(old);
draw_frame(old, nil);
invoke_wm_event(def[WM_EVENT_PAGE_UPDATE]);
}
void detach_client(Client *c) {
if (c->frame)
if (c->frame) {
cext_detach_item(&c->frame->area->clients, c);
c->frame->area->layout->detach(c->frame->area, c);
}
if (c->destroyed)
destroy_client(c);
sel_page(get_sel_page());

View File

@ -180,7 +180,7 @@ static void handle_expose(XEvent * e)
if (e->xexpose.count == 0) {
f = win_to_frame(e->xbutton.window);
if (f)
draw_frame(f);
draw_frame(f, nil);
}
}
@ -249,8 +249,8 @@ static void handle_enternotify(XEvent * e)
Frame *old = get_sel_frame();
if (old != c->frame) {
sel_frame(c->frame, 1);
draw_frame(old);
draw_frame(c->frame);
draw_frame(old, nil);
draw_frame(c->frame, nil);
}
}
}

View File

@ -102,7 +102,7 @@ Frame *alloc_frame(XRectangle * r)
return f;
}
void sel_frame(Frame * f, int raise)
void sel_frame(Frame * f, Bool raise)
{
Area *a = f->area;
sel_client(cext_get_top_item(&f->clients));
@ -122,12 +122,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)
{
frame = (Frame **) detach_item((void **) frame, f, sizeof(Frame *));
cext_detach_item(&frames, f);
XFreeGC(dpy, f->gc);
XDestroyWindow(dpy, f->win);
ixp_remove_file(ixps, f->file[F_PREFIX]);
@ -150,24 +150,32 @@ unsigned int border_width(Frame * f)
return 0;
}
static void resize_client(Frame * f, int tabh, int bw)
typedef struct {
unsigned int tabh;
unsigned int bw;
} Twouint;
static void iter_resize_client(void *item, void *aux)
{
int i;
for (i = 0; f->client && f->client[i]; i++) {
Client *c = f->client[i];
c->rect.x = bw;
c->rect.y = tabh ? tabh : bw;
c->rect.width = f->rect.width - 2 * bw;
c->rect.height = f->rect.height - bw - (tabh ? tabh : bw);
XMoveResizeWindow(dpy, c->win, c->rect.x, c->rect.y,
c->rect.width, c->rect.height);
configure_client(c);
}
Client *c = item;
Twouint *v = aux;
c->rect.x = v->bw;
c->rect.y = v->tabh ? v->tabh : v->bw;
c->rect.width = c->frame->rect.width - 2 * v->bw;
c->rect.height = c->frame->rect.height - v->bw - (v->tabh ? v->tabh : v->bw);
XMoveResizeWindow(dpy, c->win, c->rect.x, c->rect.y, c->rect.width, c->rect.height);
configure_client(c);
}
static void resize_clients(Frame * f, int tabh, int bw)
{
Twouint aux = { tabh, bw };
cext_iterate(&f->clients, &aux, iter_resize_client);
}
static void check_dimensions(Frame * f, unsigned int tabh, unsigned int bw)
{
Client *c = f->client ? f->client[f->sel] : 0;
Client *c = get_sel_client();
if (!c)
return;
@ -191,7 +199,7 @@ static void check_dimensions(Frame * f, unsigned int tabh, unsigned int bw)
static void resize_incremental(Frame * f, unsigned int tabh, unsigned int bw)
{
Client *c = f->client ? f->client[f->sel] : 0;
Client *c = get_sel_client();
if (!c)
return;
/* increment stuff, see chapter 4.1.2.3 of the ICCCM Manual */
@ -231,7 +239,7 @@ void resize_frame(Frame * f, XRectangle * r, XPoint * pt)
resize_incremental(f, tabh, bw);
XMoveResizeWindow(dpy, f->win, f->rect.x, f->rect.y, f->rect.width, f->rect.height);
resize_client(f, (tabh ? tabh : bw), bw);
resize_clients(f, (tabh ? tabh : bw), bw);
}
@ -274,8 +282,9 @@ void draw_tab(Frame * f, char *text, int x, int y, int w, int h, int sel)
* ./norm-style/bg-color "#RRGGBBAA"
* ./norm-style/border-color "#RRGGBBAA [#RRGGBBAA [#RRGGBBAA [#RRGGBBAA]]]"
*/
void draw_frame(Frame * f)
void draw_frame(void *frame, void *aux)
{
Frame *f = frame;
Draw d = { 0 };
int bw = border_width(f);
XRectangle notch;
@ -289,7 +298,7 @@ void draw_frame(Frame * f)
d.gc = f->gc;
/* define ground plate (i = 0) */
if (ISSELFRAME(f)) {
if (f == get_sel_frame()) {
d.bg = blitz_loadcolor(dpy, screen_num, f->file[F_SEL_BG_COLOR]->content);
d.fg = blitz_loadcolor(dpy, screen_num, f->file[F_SEL_FG_COLOR]->content);
d.border = blitz_loadcolor(dpy, screen_num, f->file[F_SEL_BORDER_COLOR]->content);
@ -311,19 +320,16 @@ void draw_frame(Frame * f)
void handle_frame_buttonpress(XButtonEvent * e, Frame * f)
{
Align align;
int bindex;
int size = count_items((void **) f->client);
int cindex = e->x / f->rect.width / size;
if (!f->area->page->sel)
XRaiseWindow(dpy, f->win);
if (cindex != f->sel) {
sel_client(f->client[cindex]);
draw_frame(f);
size_t size = cext_sizeof(&f->clients);
int bindex, cindex = e->x / f->rect.width / size;
Client *c = cext_get_item(&f->clients, cindex);
XRaiseWindow(dpy, f->win);
if (get_sel_client() != c) {
sel_client(c);
draw_frame(f, nil);
return;
}
if (e->button == Button1) {
if (!(f = SELFRAME(page[sel])))
return;
align = cursor_to_align(f->cursor);
if (align == CENTER)
mouse_move(f);
@ -335,15 +341,14 @@ void handle_frame_buttonpress(XButtonEvent * e, Frame * f)
/* frame mouse handling */
if (f->file[bindex]->content)
spawn(dpy, f->file[bindex]->content);
draw_frame(f);
draw_frame(f, nil);
}
void attach_client_to_frame(Frame * f, Client * c)
{
wmii_move_ixpfile(c->file[C_PREFIX], f->file[F_CLIENT_PREFIX]);
f->file[F_SEL_CLIENT]->content = c->file[C_PREFIX]->content;
f->client = (Client **) attach_item_end((void **) f->client, c, sizeof(Client *));
f->sel = index_item((void **) f->client, c);
cext_attach_item(&f->clients, c);
c->frame = f;
reparent_client(c, f->win, border_width(f), tab_height(f));
resize_frame(f, &f->rect, 0);
@ -353,100 +358,89 @@ void attach_client_to_frame(Frame * f, Client * c)
void detach_client_from_frame(Client * c)
{
Client *client;
Frame *f = c->frame;
wmii_move_ixpfile(c->file[C_PREFIX], def[WM_DETACHED_CLIENT]);
c->frame = 0;
f->client = (Client **) detach_item((void **) f->client, c, sizeof(Client *));
if (f->sel)
f->sel--;
else
f->sel = 0;
cext_detach_item(&f->clients, c);
if (!c->destroyed) {
if (f) {
hide_client(c);
detached = (Client **) attach_item_begin((void **) detached, c, sizeof(Client *));
cext_attach_item(&detached, c);
}
reparent_client(c, root, border_width(f), tab_height(f));
}
if (f->client) {
sel_client(f->client[f->sel]);
draw_frame(f);
if ((client = cext_get_top_item(&f->clients))) {
sel_client(client);
draw_frame(f, nil);
}
}
static void select_client(void *obj, char *cmd)
{
Frame *f = obj;
int size = count_items((void **) f->client);
size_t size = cext_sizeof(&f->clients);
if (!f || !cmd || size == 1)
return;
if (!strncmp(cmd, "prev", 5)) {
if (f->sel > 0)
f->sel--;
else
f->sel = size - 1;
} else if (!strncmp(cmd, "next", 5)) {
if (f->sel + 1 == size)
f->sel = 0;
else
f->sel++;
}
sel_client(f->client[f->sel]);
draw_frame(f);
if (!strncmp(cmd, "prev", 5))
cext_top_item(&f->clients, cext_get_up_item(&f->clients, cext_get_top_item(&f->clients)));
else if (!strncmp(cmd, "next", 5))
cext_top_item(&f->clients, cext_get_down_item(&f->clients, cext_get_top_item(&f->clients)));
sel_client(cext_get_top_item(&f->clients));
draw_frame(f, nil);
}
static void handle_before_read_frame(IXPServer * s, File * f)
static void iter_before_read_frame(void *item, void *aux)
{
int i = 0;
Frame *f = item;
File *file = aux;
if (file == f->file[F_GEOMETRY]) {
char buf[64];
snprintf(buf, 64, "%d,%d,%d,%d", f->rect.x, f->rect.y, f->rect.width, f->rect.height);
if (file->content)
free(file->content);
file->content = cext_estrdup(buf);
file->size = strlen(buf);
}
}
for (i = 0; frame && frame[i]; i++) {
if (f == frame[i]->file[F_GEOMETRY]) {
char buf[64];
snprintf(buf, 64, "%d,%d,%d,%d", frame[i]->rect.x,
frame[i]->rect.y, frame[i]->rect.width,
frame[i]->rect.height);
if (f->content)
free(f->content);
f->content = cext_estrdup(buf);
f->size = strlen(buf);
return;
static void handle_before_read_frame(IXPServer *s, File *f)
{
cext_iterate(&frames, f, iter_before_read_frame);
}
static void iter_after_write_frame(void *item, void *aux)
{
Frame *f = item;
File *file = aux;
if (file == f->file[F_CTL]) {
run_action(file, f, frame_acttbl);
return;
}
if (file == f->file[F_TAB] || file == f->file[F_BORDER] || file == f->file[F_HANDLE_INC]) {
f->area->layout->arrange(f->area);
draw_page(f->area->page);
return;
} else if (file == f->file[F_GEOMETRY]) {
char *size = f->file[F_GEOMETRY]->content;
if (size && strrchr(size, ',')) {
XRectangle frect;
blitz_strtorect(&rect, &frect, size);
resize_frame(f, &frect, 0);
draw_page(f->area->page);
}
return;
}
}
static void handle_after_write_frame(IXPServer * s, File * f)
{
int i;
for (i = 0; frame && frame[i]; i++) {
if (f == frame[i]->file[F_CTL]) {
run_action(f, frame[i], frame_acttbl);
return;
}
if (f == frame[i]->file[F_TAB]
|| f == frame[i]->file[F_BORDER]
|| f == frame[i]->file[F_HANDLE_INC]) {
if (frame[i]->area) {
frame[i]->area->layout->arrange(frame[i]->area);
draw_page(frame[i]->area->page);
}
return;
} else if (f == frame[i]->file[F_GEOMETRY]) {
char *size = frame[i]->file[F_GEOMETRY]->content;
if (size && strrchr(size, ',')) {
XRectangle frect;
blitz_strtorect(&rect, &frect, size);
resize_frame(frame[i], &frect, 0);
draw_page(frame[i]->area->page);
}
return;
}
}
cext_iterate(&frames, f, iter_after_write_frame);
}
Frame *get_sel_frame_of_area(Area *a)
{
return cext_get_top_item(&a->frame);
return cext_get_top_item(&a->frames);
}
Frame *get_sel_frame()

View File

@ -15,13 +15,13 @@ typedef struct Column Column;
struct Acme {
int sel;
Column **column;
Container columns;
};
struct Column {
int sel;
int refresh;
Frame **frame;
Container frames;
XRectangle rect;
};
@ -39,43 +39,47 @@ static Acme zero_acme = { 0 };
void init_layout_column()
{
layouts = (Layout **) attach_item_end((void **) layouts, &lcol, sizeof(Layout *));
cext_attach_item(&layouts, &lcol);
}
static void arrange_column(Area * a, Column * col)
static Column *get_sel_column(Acme *acme)
{
int i;
int n = count_items((void **) col->frame);
unsigned int height = a->rect.height / n;
for (i = 0; col->frame && col->frame[i]; i++) {
if (col->refresh) {
col->frame[i]->rect = col->rect;
col->frame[i]->rect.height = height;
col->frame[i]->rect.y = i * height;
}
resize_frame(col->frame[i], &col->frame[i]->rect, 0);
}
return cext_get_top_item(&acme->columns);
}
static void arrange_col(Area * a)
static void iter_arrange_column_frame(void *frame, void *height)
{
unsigned int h = *(unsigned int *)height;
Frame *f = frame;
Column *col = f->aux;
if (col->refresh) {
f->rect = col->rect;
f->rect.height = h;
f->rect.y = cext_get_item_index(&col->frames, f) * h;
}
resize_frame(f, &f->rect, 0);
}
static void iter_arrange_column(void *column, void *area)
{
Column *col = column;
size_t size = cext_sizeof(&col->frames);
unsigned int height = ((Area *)area)->rect.height / size;
cext_iterate(&col->frames, &height, iter_arrange_column_frame);
}
static void arrange_col(Area *a)
{
Acme *acme = a->aux;
int i;
if (!acme) {
fprintf(stderr, "%s", "wmiiwm: fatal, page has no layout\n");
exit(1);
}
for (i = 0; acme->column && acme->column[i]; i++)
arrange_column(a, acme->column[i]);
cext_iterate(&acme->columns, a, iter_arrange_column);
}
static void init_col(Area * a)
static void init_col(Area *a)
{
Acme *acme = cext_emalloc(sizeof(Acme));
int i, j, n, cols = 1;
unsigned int width = 1;
int i, cols = 1;
unsigned int width;
//size_t size;
Column *col;
*acme = zero_acme;
@ -83,28 +87,27 @@ static void init_col(Area * a)
/* processing argv */
/*
for (i = 1; (i < argc) && (argv[i][0] == '-'); i++) {
switch (argv[i][1]) {
case 'c':
cols = _strtonum(argv[++i], 0, 32);
if (cols < 1)
cols = 1;
break;
}
}
*/
for (i = 1; (i < argc) && (argv[i][0] == '-'); i++) {
switch (argv[i][1]) {
case 'c':
cols = _strtonum(argv[++i], 0, 32);
if (cols < 1)
cols = 1;
break;
}
}
*/
width = a->rect.width / cols;
acme->column = cext_emalloc((cols + 1) * sizeof(Column *));
for (i = 0; i < cols; i++) {
acme->column[i] = cext_emalloc(sizeof(Column));
*acme->column[i] = zero_column;
acme->column[i]->rect = a->rect;
acme->column[i]->rect.x = i * width;
acme->column[i]->rect.width = width;
acme->column[i]->refresh = 1;
col = cext_emalloc(sizeof(Column));
*col = zero_column;
col->rect = a->rect;
col->rect.x = i * width;
col->rect.width = width;
col->refresh = 1;
cext_attach_item(&acme->columns, col);
}
acme->column[cols] = 0; /* null termination of array */
/*
* Frame attaching strategy works as follows: 1. If more client than
@ -113,8 +116,9 @@ static void init_col(Area * a)
* than column exist, than filling begins from eastmost to westmost
* column until no more client exist.
*/
n = count_items((void **) client);
if (n > cols) {
#if 0
size = cext_sizeof(&a->clients);
if (size > cols) {
/* 1st. case */
j = 0;
for (i = 0; i < (cols - 1); i++) {
@ -147,56 +151,56 @@ static void init_col(Area * a)
}
}
arrange_col(a);
#endif
}
static void deinit_col(Area * a)
static void iter_detach_client(void *client, void *aux)
{
detach_client_from_frame((Client *)client);
}
static void iter_detach_frame(void *frame, void *aux)
{
Frame *f = frame;
cext_iterate(&f->clients, nil, iter_detach_client);
}
static void iter_deinit_col(void *column, void *aux)
{
Column *col = column;
cext_iterate(&col->frames, nil, iter_detach_frame);
}
static void deinit_col(Area *a)
{
Acme *acme = a->aux;
int i;
for (i = 0; acme->column && acme->column[i]; i++) {
Column *col = acme->column[i];
int j;
for (j = 0; col->frame && col->frame[j]; j++) {
Frame *f = col->frame[j];
while (f->client && f->client[0])
detach_client_from_frame(f->client[0]);
detach_frame_from_area(f, 1);
destroy_frame(f);
}
free(col->frame);
}
free(acme->column);
cext_iterate(&acme->columns, nil, iter_deinit_col);
free(acme);
a->aux = 0;
}
static void attach_col(Area * a, Client * c)
static void attach_col(Area *a, Client *c)
{
Acme *acme = a->aux;
Column *col;
Frame *f;
col = acme->column[acme->sel];
col = get_sel_column(acme);
f = alloc_frame(&c->rect);
col->frame = (Frame **) attach_item_end((void **) col->frame, f, sizeof(Frame *));
cext_attach_item(&col->frames, f);
f->aux = col;
col->refresh = 1;
attach_frame_to_area(a, f);
attach_client_to_frame(f, c);
arrange_col(a);
}
static void detach_col(Area * a, Client * c)
static void detach_col(Area *a, Client *c)
{
Frame *f = c->frame;
Column *col = f->aux;
if (!col)
return; /* client was not attached, maybe exit(1) in
* such case */
col->frame = (Frame **) detach_item((void **) col->frame, c->frame, sizeof(Frame *));
cext_detach_item(&col->frames, f);
col->refresh = 1;
detach_client_from_frame(c);
detach_frame_from_area(f, 1);
@ -207,6 +211,7 @@ static void detach_col(Area * a, Client * c)
static void drop_resize(Frame * f, XRectangle * new)
{
#if 0
Column *col = f->aux;
Acme *acme = f->area->aux;
int i, idx, n = 0;
@ -299,10 +304,12 @@ static void drop_resize(Frame * f, XRectangle * new)
resize_frame(south, &south->rect, 0);
}
}
#endif
}
static void _drop_move(Frame * f, XRectangle * new, XPoint * pt)
{
#if 0
Column *tgt = 0, *src = f->aux;
Acme *acme = f->area->aux;
int i;
@ -351,13 +358,14 @@ static void _drop_move(Frame * f, XRectangle * new, XPoint * pt)
(Frame **) attach_item_end((void **) tgt->frame, f,
sizeof(Frame *));
tgt->refresh = 1;
arrange_column(f->area, tgt);
iter_arrange_column(tgt, f->area);
/* TODO: implement a better target placing strategy */
}
#endif
}
static void resize_col(Frame * f, XRectangle * new, XPoint * pt)
static void resize_col(Frame *f, XRectangle *new, XPoint *pt)
{
if ((f->rect.width == new->width)
&& (f->rect.height == new->height))

View File

@ -10,36 +10,36 @@
#include "wm.h"
#include "layout.h"
static void init_float(Area * a);
static void deinit_float(Area * a);
static void arrange_float(Area * a);
static void attach_float(Area * a, Client * c);
static void detach_float(Area * a, Client * c);
static void resize_float(Frame * f, XRectangle * new, XPoint * pt);
static void init_float(Area *a);
static void deinit_float(Area *a);
static void arrange_float(Area *a);
static void attach_float(Area *a, Client *c);
static void detach_float(Area *a, Client *c);
static void resize_float(Frame *f, XRectangle *new, XPoint *pt);
static Layout lfloat = { "float", init_float, deinit_float, arrange_float, attach_float, detach_float, resize_float };
void init_layout_float()
{
layouts = (Layout **) attach_item_end((void **) layouts, &lfloat, sizeof(Layout *));
cext_attach_item(&layouts, &lfloat);
}
static void arrange_float(Area * a)
static void arrange_float(Area *a)
{
}
static void init_float(Area * a)
static void init_float(Area *a)
{
}
static void deinit_float(Area * a)
static void deinit_float(Area *a)
{
}
static void attach_float(Area * a, Client * c)
static void attach_float(Area *a, Client *c)
{
Frame *f = a->frame ? a->frame[a->sel] : 0;
Frame *f = get_sel_frame_of_area(a);
/* check for tabbing? */
if (f && (((char *) f->file[F_LOCKED]->content)[0] == '1'))
f = 0;
@ -48,16 +48,16 @@ static void attach_float(Area * a, Client * c)
attach_frame_to_area(a, f);
}
attach_client_to_frame(f, c);
if (a->page == page[sel])
if (a->page == get_sel_page())
XMapRaised(dpy, f->win);
draw_frame(f);
draw_frame(f, nil);
}
static void detach_float(Area * a, Client * c)
static void detach_float(Area *a, Client *c)
{
Frame *f = c->frame;
detach_client_from_frame(f->client[0]);
if (!f->client) {
detach_client_from_frame(c);
if (!cext_sizeof(&f->clients)) {
detach_frame_from_area(f, 0);
destroy_frame(f);
}

View File

@ -9,8 +9,6 @@
#include "wm.h"
static Page zero_page = { 0 };
static void select_frame(void *obj, char *cmd);
static void handle_after_write_page(IXPServer * s, File * f);
@ -24,10 +22,10 @@ Page *alloc_page()
{
Page *p = cext_emalloc(sizeof(Page));
char buf[MAX_BUF], buf2[16];
int id = count_items((void **) page) + 1;
size_t id = cext_sizeof(&pages);
snprintf(buf2, sizeof(buf2), "%d", id);
*p = zero_page;
p->areas.list = p->areas.stack = 0;
snprintf(buf, sizeof(buf), "/%d", id);
p->file[P_PREFIX] = ixp_create(ixps, buf);
snprintf(buf, sizeof(buf), "/%d/name", id);
@ -41,62 +39,53 @@ Page *alloc_page()
p->file[P_CTL] = ixp_create(ixps, buf);
p->file[P_CTL]->after_write = handle_after_write_page;
alloc_area(p, &rect, "float");
page = (Page **) attach_item_end((void **) page, p, sizeof(Page *));
sel = index_item((void **) page, p);
cext_attach_item(&pages, p);
def[WM_SEL_PAGE]->content = p->file[P_PREFIX]->content;
return p;
}
void destroy_page(Page * p)
static void iter_destroy_page(void *item, void *aux)
{
unsigned int i;
for (i = 0; p->area[i]; i++)
destroy_area(p->area[i]);
free_page(p);
if (page) {
show_page(page[sel]);
def[WM_SEL_PAGE]->content = page[sel]->file[P_PREFIX]->content;
sel_page(page[sel]);
}
destroy_area((Area *)item);
}
void free_page(Page * p)
void destroy_page(Page * p)
{
page = (Page **) detach_item((void **) page, p, sizeof(Page *));
if (page) {
if (sel - 1 >= 0)
sel--;
else
sel = 0;
}
cext_iterate(&p->areas, nil, iter_destroy_page);
def[WM_SEL_PAGE]->content = 0;
ixp_remove_file(ixps, p->file[P_PREFIX]);
if (ixps->errstr)
fprintf(stderr, "wmiiwm: free_page(): %s\n", ixps->errstr);
free(p);
if ((p = get_sel_page())) {
show_page(p);
sel_page(p);
}
}
void sel_page(Page * p)
{
if (!page)
Page *sel = get_sel_page();
if (!sel)
return;
if (p != page[sel]) {
hide_page(page[sel]);
sel = index_item((void **) page, p);
show_page(page[sel]);
def[WM_SEL_PAGE]->content = p->file[P_PREFIX]->content;
if (p != sel) {
hide_page(sel);
cext_top_item(&pages, p);
show_page(p);
}
def[WM_SEL_PAGE]->content = p->file[P_PREFIX]->content;
invoke_wm_event(def[WM_EVENT_PAGE_UPDATE]);
sel_area(p->area[p->sel], !p->sel);
sel_area(get_sel_area());
}
static void iter_draw_page(void *item, void *aux)
{
draw_area((Area *)item);
}
void draw_page(Page * p)
{
int i;
if (!p)
return;
for (i = 0; p->area && p->area[i]; i++)
draw_area(p->area[i]);
cext_iterate(&p->areas, nil, iter_draw_page);
}
XRectangle *rectangles(unsigned int *num)
@ -152,196 +141,60 @@ static void center_pointer(Frame * f)
static void select_frame(void *obj, char *cmd)
{
int i;
Area *a;
Frame *f, *old;
f = old = page ? SELFRAME(page[sel]) : 0;
f = old = get_sel_frame();
if (!f || !cmd)
return;
if (!strncmp(cmd, "prev", 5)) {
i = index_prev_item((void **) f->area->frame, f);
f = f->area->frame[i];
} else if (!strncmp(cmd, "next", 5)) {
i = index_next_item((void **) f->area->frame, f);
f = f->area->frame[i];
}
a = f->area;
if (!strncmp(cmd, "prev", 5))
cext_top_item(&a->frames, cext_get_up_item(&a->frames, f));
else if (!strncmp(cmd, "next", 5))
cext_top_item(&a->frames, cext_get_down_item(&a->frames, f));
if (old != f) {
sel_frame(f, 1);
sel_frame(f, cext_get_item_index(&a->page->areas, a) == 0);
center_pointer(f);
draw_frame(old);
draw_frame(f);
draw_frame(old, nil);
draw_frame(f, nil);
}
}
static void iter_hide_page(void *item, void *aux)
{
hide_area((Area *)item);
}
void hide_page(Page * p)
{
cext_iterate(&p->areas, nil, iter_hide_page);
}
int i;
for (i = 0; p->area && p->area[i]; i++)
hide_area(p->area[i]);
static void iter_show_page(void *item, void *aux)
{
show_area((Area *)item);
}
void show_page(Page * p)
{
int i;
for (i = 0; p->area && p->area[i]; i++)
show_area(p->area[i]);
cext_iterate(&p->areas, nil, iter_show_page);
}
static void handle_after_write_page(IXPServer * s, File * f)
static void iter_after_write_page(void *item, void *aux)
{
int i;
for (i = 0; page && page[i]; i++) {
Page *p = page[i];
if (p->file[P_CTL] == f) {
run_action(f, p, page_acttbl);
return;
}
/*
else if (p->file[P_MANAGED_SIZE] == f) {
/ resize stuff /
blitz_strtorect(dpy, &rect, &p->managed_rect,
p->file[P_MANAGED_SIZE]->content);
if (!p->managed_rect.width)
p->managed_rect.width = 10;
if (!p->managed_rect.height)
p->managed_rect.height = 10;
if (p->layout)
p->layout->arrange(p);
draw_page(p);
return;
} else if (p->file[P_MANAGED_LAYOUT] == f) {
int had_valid_layout = p->layout ? 1 : 0;
if (p->layout)
p->layout->deinit(p);
p->layout = get_layout(p->file[P_MANAGED_LAYOUT]->content);
if (p->layout) {
p->layout->init(p);
p->layout->arrange(p);
if (!had_valid_layout) {
int j;
Frame **tmp = 0;
for (j = 0; p->floating && p->floating[j]; j++) {
if (!p->floating[j]->floating)
tmp =
(Frame **) attach_item_begin((void **) tmp,
p->
floating[j],
sizeof(Frame
*));
}
for (j = 0; tmp && tmp[j]; j++)
toggle_frame(tmp[j]);
free(tmp);
}
}
if (!p->layout) {
/ make all managed client floating /
int j;
Frame **tmp = 0;
while (p->managed) {
tmp = (Frame **) attach_item_begin((void **) tmp,
p->managed[0],
sizeof(Frame *));
detach_frame_from_page(p->managed[0], 1);
}
for (j = 0; tmp && tmp[j]; j++) {
attach_Frameo_page(p, tmp[j], 0);
resize_frame(tmp[j], rect_of_frame(tmp[j]), 0, 1);
}
free(tmp);
}
draw_page(p);
invoke_wm_event(wm_file[CORE_EVENT_PAGE_UPDATE]);
return;
}
*/
Page *p = (Page *)item;
File *file = aux;
if (file == p->file[P_CTL]) {
run_action(file, p, page_acttbl);
return;
}
}
/*
void
attach_frame_to_page(Page * p, Frame * f, int managed)
static void handle_after_write_page(IXPServer *s, File *f)
{
Frame *old = get_selected(p);
XSelectInput(dpy, root, ROOT_MASK & ~StructureNotifyMask);
XMapRaised(dpy, f->win);
if (!f->floating && managed && p->layout) {
int i;
p->managed = (Frame **) attach_item_end((void **) p->managed, f,
sizeof(Frame *));
p->managed_stack =
(Frame **) attach_item_begin((void **) p->managed_stack, f,
sizeof(Frame *));
wmii_move_ixpfile(f->file[F_PREFIX], p->file[P_MANAGED_PREFIX]);
p->file[P_MANAGED_SELECTED]->content =
f->file[F_PREFIX]->content;
if (p == page[sel_page])
for (i = 0; p->floating && p->floating[i]; i++)
XRaiseWindow(dpy, p->floating[i]->win);
} else {
p->floating = (Frame **) attach_item_end((void **) p->floating, f,
sizeof(Frame *));
p->floating_stack =
(Frame **) attach_item_begin((void **) p->floating_stack, f,
sizeof(Frame *));
wmii_move_ixpfile(f->file[F_PREFIX], p->file[P_FLOATING_PREFIX]);
p->file[P_FLOATING_SELECTED]->content =
f->file[F_PREFIX]->content;
p->file[P_MODE]->content = p->file[P_FLOATING_PREFIX]->content;
}
f->page = p;
sel_frame(f, 1, 0, 1);
if (is_managed_frame(f) && p->layout)
p->layout->manage(f);
center_pointer(f);
if (old)
draw_frame(old);
draw_frame(f);
cext_iterate(&pages, f, iter_after_write_page);
}
void
detach_frame_from_page(Frame * f, int ignore_sel_and_destroy)
{
Page *p = f->page;
wmii_move_ixpfile(f->file[F_PREFIX], wm_file[CORE_DETACHED_FRAME]);
if (is_managed_frame(f)) {
p->managed = (Frame **) detach_item((void **) p->managed, f,
sizeof(Frame *));
p->managed_stack =
(Frame **) detach_item((void **) p->managed_stack, f,
sizeof(Frame *));
p->file[P_MANAGED_SELECTED]->content = 0;
} else {
p->floating = (Frame **) detach_item((void **) p->floating, f,
sizeof(Frame *));
p->floating_stack =
(Frame **) detach_item((void **) p->floating_stack, f,
sizeof(Frame *));
p->file[P_FLOATING_SELECTED]->content = 0;
}
XUnmapWindow(dpy, f->win);
if (is_managed_mode(p) && p->layout)
p->layout->unmanage(f);
f->page = 0;
if (!ignore_sel_and_destroy) {
Frame *fr;
if (!p->managed && !p->floating
&& _strtonum(p->file[P_AUTO_DESTROY]->content, 0, 1)) {
destroy_page(p);
return;
}
sel_page(p, 0, 1);
fr = get_selected(p);
if (fr) {
center_pointer(fr);
draw_frame(fr);
}
}
}
*/
Page *get_sel_page()
{
return cext_get_top_item(&page);
return cext_get_top_item(&pages);
}

View File

@ -16,7 +16,6 @@
#include "wm.h"
static Draw d = { 0 };
static XRectangle initial_rect;
static int other_wm_running;
static int (*x_error_handler) (Display *, XErrorEvent *);
@ -112,51 +111,53 @@ scale_rect(XRectangle * from_dim, XRectangle * to_dim,
tgt->height = 1;
}
static void draw_pager_frame(void *item)
static void iter_draw_pager_frame(void *item, void *aux)
{
Draw *d = aux;
Frame *f = (Frame *)item;
if (f == cext_get_top_item(&f->area->frames)) {
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);
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);
} else {
d.bg = blitz_loadcolor(dpy, screen_num, def[WM_NORM_BG_COLOR]->content);
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);
d->bg = blitz_loadcolor(dpy, screen_num, def[WM_NORM_BG_COLOR]->content);
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);
}
d.data = ((Client *)cext_get_top_item(&f->clients))->file[C_NAME]->content;
scale_rect(&rect, &initial_rect, &f->area->rect, &d.rect);
blitz_drawlabel(dpy, &d);
d->data = ((Client *)cext_get_top_item(&f->clients))->file[C_NAME]->content;
scale_rect(&rect, &initial_rect, &f->area->rect, &d->rect);
blitz_drawlabel(dpy, d);
XSync(dpy, False); /* do not clear upwards */
}
static void draw_pager_area(void *item)
static void draw_pager_area(void *item, void *aux)
{
cext_iterate(&((Area *)item)->frames, draw_pager_frame);
cext_iterate(&((Area *)item)->frames, aux, iter_draw_pager_frame);
}
static void draw_pager_page(Page * p)
static void draw_pager_page(Page *p, Draw *d)
{
char name[4];
initial_rect = d.rect;
initial_rect = d->rect;
if (p == cext_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);
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);
} else {
d.bg = blitz_loadcolor(dpy, screen_num, def[WM_NORM_BG_COLOR]->content);
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);
d->bg = blitz_loadcolor(dpy, screen_num, def[WM_NORM_BG_COLOR]->content);
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_get_item_index(&pages, p));
d.data = name;
blitz_drawlabel(dpy, &d);
d->data = name;
blitz_drawlabel(dpy, d);
XSync(dpy, False);
cext_iterate(&p->areas, draw_pager_area);
cext_iterate(&p->areas, d, draw_pager_area);
}
static void draw_pager()
{
Draw d = { 0 };
unsigned int ic, ir, tw, th, rows, cols, size;
int i = 0;
int dx;
@ -180,7 +181,7 @@ static void draw_pager()
d.rect.height = th;
if (!(p = cext_get_item(&pages, i)))
return;
draw_pager_page(p);
draw_pager_page(p, &d);
i++;
}
}
@ -677,7 +678,7 @@ static int startup_error_handler(Display * dpy, XErrorEvent * error)
return -1;
}
static void clean_client_up(void *item)
static void clean_client_up(void *item, void *aux)
{
Client *c = item;
Frame *f = c->frame;
@ -693,7 +694,7 @@ static void clean_client_up(void *item)
static void cleanup()
{
cext_iterate(&clients, clean_client_up);
cext_iterate(&clients, nil, clean_client_up);
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
}
@ -708,6 +709,12 @@ static void run()
}
def[WM_CTL]->after_write = handle_after_write;
detached.list = detached.stack = 0;
pages.list = pages.stack = 0;
frames.list = frames.stack = 0;
clients.list = clients.stack = 0;
layouts.list = layouts.stack = 0;
init_atoms();
init_cursors();
init_default();

View File

@ -129,6 +129,8 @@ struct Area {
Layout *layout;
Page *page;
Container frames;
/* XXX: remove frames container, areas shall only contain clients */
Container clients;
XRectangle rect;
void *aux; /* free pointer */
File *file[A_LAST];
@ -165,11 +167,11 @@ int screen_num;
Window root;
Window transient;
XRectangle rect;
Container detached = {0};
Container pages = {0};
Container frames = {0};
Container clients = {0};
Container layouts = {0};
Container detached;
Container pages;
Container frames;
Container clients;
Container layouts;
XFontStruct *font;
XColor xorcolor;
GC xorgc;
@ -203,7 +205,7 @@ unsigned int valid_mask, num_lock_mask;
/* area.c */
Area *alloc_area(Page *p, XRectangle * r, char *layout);
void destroy_area(Area * a);
void sel_area(Area * a, int raise);
void sel_area(Area * a);
void attach_frame_to_area(Area * a, Frame * f);
void detach_frame_from_area(Frame * f, int ignore_sel_and_destroy);
void draw_area(Area * a);
@ -218,7 +220,7 @@ void destroy_client(Client * c);
void configure_client(Client * c);
void handle_client_property(Client * c, XPropertyEvent * e);
void close_client(Client * c);
void draw_client(void *item);
void draw_client(void *item, void *aux);
void draw_clients(Frame * f);
void gravitate(Client * c, unsigned int tabh, unsigned int bw, int invert);
void grab_client(Client * c, unsigned long mod, unsigned int button);
@ -232,12 +234,12 @@ void detach_client(Client *c);
Client *get_sel_client();
/* frame.c */
void sel_frame(Frame * f, int raise);
void sel_frame(Frame * f, Bool raise);
Frame *win_to_frame(Window w);
Frame *alloc_frame(XRectangle * r);
void destroy_frame(Frame * f);
void resize_frame(Frame * f, XRectangle * r, XPoint * pt);
void draw_frame(Frame * f);
void draw_frame(void *frame, void *aux);
void handle_frame_buttonpress(XButtonEvent * e, Frame * f);
void attach_client_to_frame(Frame * f, Client * c);
void detach_client_from_frame(Client *c);

View File

@ -35,7 +35,7 @@ void cext_attach_item(Container *c, void *item);
void cext_detach_item(Container *c, void *item);
void *cext_find_item(Container *c, void *pattern, int (*comp)(void *pattern, void *item));
void cext_top_item(Container *c, void *item);
void cext_iterate(Container *c, void (*doit)(void *));
void cext_iterate(Container *c, void *aux, void (*iter)(void *, void *aux));
void *cext_get_top_item(Container *c);
void *cext_get_down_item(Container *c, void *item);
void *cext_get_up_item(Container *c, void *item);

View File

@ -76,11 +76,11 @@ void *cext_find_item(Container *c, void *pattern, int (*comp)(void *pattern, voi
return i ? i->item : nil;
}
void cext_iterate(Container *c, void (*doit)(void *))
void cext_iterate(Container *c, void *aux, void (*iter)(void *, void *aux))
{
CItem *i;
for (i = c->list; i; i = i->next)
doit(i->item);
iter(i->item, aux);
}
void cext_top_item(Container *c, void *item)
@ -88,7 +88,6 @@ void cext_top_item(Container *c, void *item)
CItem *i = cext_find_item(c, item, comp_ptr);
if (!i)
return;
detach_from_stack(i);
attach_to_stack(c, i);
}

View File

@ -12,8 +12,6 @@
#include "wmii.h"
#include <cext.h>
static pid_t mypid;
static char *mysockfile;

View File

@ -11,8 +11,6 @@
#include "wmii.h"
#include <cext.h>
void spawn(void *dpy, char *cmd)
{
/* the questionable double-fork is done to catch all zombies */

View File

@ -13,11 +13,7 @@
#include "blitz.h"
#include <cext.h>
int
property(Display * dpy, Window w, Atom a, Atom t, long l,
unsigned char **prop)
int property(Display * dpy, Window w, Atom a, Atom t, long l, unsigned char **prop)
{
Atom real;
int format;