wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit 806a6ea150d4e8c1ee65410921b33236d84b274c
parent a89682c17eacd666cb079943136c77c41aae46d1
Author: garbeam <garbeam@localhost.localdomain>
Date:   Tue,  6 Dec 2005 15:22:58 +0200

began new container type for areas


Diffstat:
cmd/wm/client.c | 5++++-
cmd/wm/event.c | 36+++++++++++++-----------------------
libcext/Makefile | 2+-
libcext/array.c | 91-------------------------------------------------------------------------------
libcext/cext.h | 20+++++++++++++++++++-
libcext/container.c | 95+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6 files changed, 132 insertions(+), 117 deletions(-)

diff --git a/cmd/wm/client.c b/cmd/wm/client.c @@ -323,8 +323,10 @@ void gravitate(Client * c, unsigned int tabh, unsigned int bw, int invert) void attach_client(Client * c) { Area *a = 0; + Frame *old; if (!page) alloc_page(); + old = SELFRAME(page[sel]); /* transient stuff */ a = SELAREA; if (c && c->trans) { @@ -332,8 +334,9 @@ void attach_client(Client * c) if (t && t->frame) a = t->frame->area; } - a->layout->attach(a, c); + if (old) + draw_frame(old); invoke_wm_event(def[WM_EVENT_PAGE_UPDATE]); } diff --git a/cmd/wm/event.c b/cmd/wm/event.c @@ -63,6 +63,7 @@ static void handle_buttonpress(XEvent * e) Client *c; XButtonPressedEvent *ev = &e->xbutton; Frame *f = win_to_frame(ev->window); + if (f) { handle_frame_buttonpress(ev, f); return; @@ -76,6 +77,7 @@ static void handle_buttonpress(XEvent * e) if (c->frame) { /* client is attached */ ev->state &= valid_mask; if (ev->state & Mod1Mask) { + Align align; if (!c->frame->area->page->sel) XRaiseWindow(dpy, c->frame->win); switch (ev->button) { @@ -83,13 +85,9 @@ static void handle_buttonpress(XEvent * e) mouse_move(c->frame); break; case Button3: - { - Align align = xy_to_align(&c->rect, ev->x, ev->y); - if (align == CENTER) - mouse_move(c->frame); - else - mouse_resize(c->frame, align); - } + align = xy_to_align(&c->rect, ev->x, ev->y); + if (align == CENTER) mouse_move(c->frame); + else mouse_resize(c->frame, align); break; default: break; @@ -120,23 +118,16 @@ static void handle_configurerequest(XEvent * e) tabh = tab_height(f); } if (ev->value_mask & CWStackMode) { - if (wc.stack_mode == Above) - XRaiseWindow(dpy, c->win); - else - ev->value_mask &= ~CWStackMode; + if (wc.stack_mode == Above) XRaiseWindow(dpy, c->win); + else ev->value_mask &= ~CWStackMode; } gravitate(c, tabh ? tabh : bw, bw, 1); - if (ev->value_mask & CWX) - c->rect.x = ev->x; - if (ev->value_mask & CWY) - c->rect.y = ev->y; - if (ev->value_mask & CWWidth) - c->rect.width = ev->width; - if (ev->value_mask & CWHeight) - c->rect.height = ev->height; - if (ev->value_mask & CWBorderWidth) - c->border = ev->border_width; + if (ev->value_mask & CWX) c->rect.x = ev->x; + if (ev->value_mask & CWY) c->rect.y = ev->y; + if (ev->value_mask & CWWidth) c->rect.width = ev->width; + if (ev->value_mask & CWHeight) c->rect.height = ev->height; + if (ev->value_mask & CWBorderWidth) c->border = ev->border_width; gravitate(c, tabh ? tabh : bw, bw, 0); @@ -144,8 +135,7 @@ static void handle_configurerequest(XEvent * e) f->rect.x = wc.x = c->rect.x - bw; f->rect.y = wc.y = c->rect.y - (tabh ? tabh : bw); f->rect.width = wc.width = c->rect.width + 2 * bw; - f->rect.height = wc.height = - c->rect.height + bw + (tabh ? tabh : bw); + f->rect.height = wc.height = c->rect.height + bw + (tabh ? tabh : bw); wc.border_width = 1; wc.sibling = None; wc.stack_mode = ev->detail; diff --git a/libcext/Makefile b/libcext/Makefile @@ -3,7 +3,7 @@ include ../config.mk -SRC = array.c emalloc.c estrdup.c strlcat.c strlcpy.c strtonum.c tokenize.c +SRC = container.c emalloc.c estrdup.c strlcat.c strlcpy.c strtonum.c tokenize.c OBJ = ${SRC:.c=.o} diff --git a/libcext/array.c b/libcext/array.c @@ -1,91 +0,0 @@ -/* - * (C)opyright MMIV-MMV Anselm R. Garbe <garbeam at gmail dot com> - * See LICENSE file for license details. - */ - -#include <stdlib.h> - -#include "cext.h" - -void **attach_item_begin(void **old, void *item, size_t size_item) -{ - int i, size_old; - void **result = 0; - for (size_old = 0; old && old[size_old]; size_old++); - result = emalloc(size_item * (size_old + 2)); - result[0] = item; - for (i = 0; old && old[i]; i++) - result[i + 1] = old[i]; - result[i + 1] = 0; - if (old) - free(old); - return result; -} - -void **attach_item_end(void **old, void *item, size_t size_item) -{ - int i, size_old; - void **result = 0; - for (size_old = 0; old && old[size_old]; size_old++); - result = emalloc(size_item * (size_old + 2)); - for (i = 0; old && old[i]; i++) - result[i] = old[i]; - result[i++] = item; - result[i] = 0; - if (old) - free(old); - return result; -} - -void **detach_item(void **old, void *item, size_t size_item) -{ - int size_old, i, j = 0; - void **result = 0; - for (size_old = 0; old && old[size_old]; size_old++); - if (size_old != 1) { - result = emalloc(size_item * size_old); - for (i = 0; old[i]; i++) - if (old[i] != item) - result[j++] = old[i]; - result[j] = 0; - } - if (old) - free(old); - return result; -} - -int index_item(void **items, void *item) -{ - int i = 0; - for (i = 0; items && items[i] && (items[i] != item); i++); - return items[i] ? i : -1; -} - -int count_items(void **items) -{ - int i; - for (i = 0; items && items[i]; i++); - return i; -} - -int index_next_item(void **items, void *item) -{ - int idx = index_item(items, item); - if (idx == -1) - return idx; - if (idx == count_items(items) - 1) - return 0; - else - return idx + 1; -} - -int index_prev_item(void **items, void *item) -{ - int idx = index_item(items, item); - if (idx == -1) - return idx; - if (idx == 0) - return count_items(items) - 1; - else - return idx - 1; -} diff --git a/libcext/cext.h b/libcext/cext.h @@ -15,7 +15,25 @@ #define TRUE 1 #endif -/* array.c */ +/* container.c */ +typedef struct Container Container; +typedef struct CItem CItem; + +struct CItem { + void *item; + CItem *prev; + CItem *next; +}; + +struct Container { + CItem *list; + CItem *stack; +} Container; + +void attach_item +void *item_at( + + void **attach_item_end(void **old, void *item, size_t size_item); void **attach_item_begin(void **old, void *item, size_t size_item); void **detach_item(void **old, void *item, size_t size_item); diff --git a/libcext/container.c b/libcext/container.c @@ -0,0 +1,95 @@ +/* + * (C)opyright MMIV-MMV Anselm R. Garbe <garbeam at gmail dot com> + * See LICENSE file for license details. + */ + +#include <stdlib.h> + +#include "cext.h" + + + + + +void **attach_item_begin(void **old, void *item, size_t size_item) +{ + int i, size_old; + void **result = 0; + for (size_old = 0; old && old[size_old]; size_old++); + result = emalloc(size_item * (size_old + 2)); + result[0] = item; + for (i = 0; old && old[i]; i++) + result[i + 1] = old[i]; + result[i + 1] = 0; + if (old) + free(old); + return result; +} + +void **attach_item_end(void **old, void *item, size_t size_item) +{ + int i, size_old; + void **result = 0; + for (size_old = 0; old && old[size_old]; size_old++); + result = emalloc(size_item * (size_old + 2)); + for (i = 0; old && old[i]; i++) + result[i] = old[i]; + result[i++] = item; + result[i] = 0; + if (old) + free(old); + return result; +} + +void **detach_item(void **old, void *item, size_t size_item) +{ + int size_old, i, j = 0; + void **result = 0; + for (size_old = 0; old && old[size_old]; size_old++); + if (size_old != 1) { + result = emalloc(size_item * size_old); + for (i = 0; old[i]; i++) + if (old[i] != item) + result[j++] = old[i]; + result[j] = 0; + } + if (old) + free(old); + return result; +} + +int index_item(void **items, void *item) +{ + int i = 0; + for (i = 0; items && items[i] && (items[i] != item); i++); + return items[i] ? i : -1; +} + +int count_items(void **items) +{ + int i; + for (i = 0; items && items[i]; i++); + return i; +} + +int index_next_item(void **items, void *item) +{ + int idx = index_item(items, item); + if (idx == -1) + return idx; + if (idx == count_items(items) - 1) + return 0; + else + return idx + 1; +} + +int index_prev_item(void **items, void *item) +{ + int idx = index_item(items, item); + if (idx == -1) + return idx; + if (idx == 0) + return count_items(items) - 1; + else + return idx - 1; +}