X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fdispatch.c;h=291e9580803c878603585d8921b670d86b67dba8;hb=960a7f0184a84f99545fa2d3dd22cefc77f2cbc6;hp=f65a723afdbda38d0538ab42bd97fcc7dada436a;hpb=75b07a2bb3b98d581b39d3991cf1e9068452264a;p=chaz%2Fopenbox diff --git a/openbox/dispatch.c b/openbox/dispatch.c index f65a723a..291e9580 100644 --- a/openbox/dispatch.c +++ b/openbox/dispatch.c @@ -1,8 +1,15 @@ #include "dispatch.h" #include "extensions.h" +#include "client.h" #include +typedef struct { + EventHandler h; + void *data; +} Func; + +/* an array of GSList*s of Func*s */ static GSList **funcs; void dispatch_startup() @@ -16,18 +23,18 @@ void dispatch_startup() j >>= 1; ++i; } - funcs = g_new(GSList*, i); - - for (i = 0, j = 1; j < EVENT_RANGE; ++i, j <<= 1) - funcs[i] = NULL; + funcs = g_new0(GSList*, i); } void dispatch_shutdown() { guint i; EventType j; + GSList *it; for (i = 0, j = 1; j < EVENT_RANGE; ++i, j <<= 1) { + for (it = funcs[i]; it != NULL; it = it->next) + g_free(it->data); g_slist_free(funcs[i]); funcs[i] = NULL; } @@ -35,22 +42,50 @@ void dispatch_shutdown() g_free(funcs); } -void dispatch_register(EventHandler h, EventMask mask) +void dispatch_register(EventMask mask, EventHandler h, void *data) { guint i; EventType j; + GSList *it, *next; + EventMask m; + Func *f; - while (mask) { + /* add to masks it needs to be registered for */ + m = mask; + while (m) { for (i = 0, j = 1; j < EVENT_RANGE; ++i, j <<= 1) - if (mask & j) { - funcs[i] = g_slist_append(funcs[i], h); - mask ^= j; /* remove from the mask */ + if (m & j) { + for (it = funcs[i]; it != NULL; it = it->next) { + f = it->data; + if (f->h == h && f->data == data) + break; + } + if (it == NULL) { /* wasn't already regged */ + f = g_new(Func, 1); + f->h = h; + f->data = data; + funcs[i] = g_slist_append(funcs[i], f); + } + m ^= j; /* remove from the mask */ } g_assert(j >= EVENT_RANGE); /* an invalid event is in the mask */ } + + /* remove from masks its not registered for anymore */ + for (i = 0, j = 1; j < EVENT_RANGE; ++i, j <<= 1) { + if (!(j & mask)) + for (it = funcs[i]; it != NULL; it = next) { + next = it->next; + f = it->data; + if (f->h == h && f->data == data) { + g_free(f); + funcs[i] = g_slist_delete_link(funcs[i], it); + } + } + } } -void dispatch_x(XEvent *xe, Client *c) +void dispatch_x(XEvent *xe, ObClient *c) { EventType e; guint i; @@ -101,18 +136,25 @@ void dispatch_x(XEvent *xe, Client *c) ++i; } - for (it = funcs[i]; it != NULL; it = it->next) - ((EventHandler)it->data)(&obe); + for (it = funcs[i]; it != NULL; it = it->next) { + Func *f = it->data; + f->h(&obe, f->data); + } } -void dispatch_client(EventType e, Client *c) +void dispatch_client(EventType e, ObClient *c, int num0, int num1) { guint i; GSList *it; ObEvent obe; + g_assert(c != NULL); + obe.type = e; - obe.data.client = c; + obe.data.c.client = c; + obe.data.c.num[0] = num0; + obe.data.c.num[1] = num1; + obe.data.c.num[2] = 0; i = 0; while (e > 1) { @@ -120,17 +162,21 @@ void dispatch_client(EventType e, Client *c) ++i; } - for (it = funcs[i]; it != NULL; it = it->next) - ((EventHandler)it->data)(&obe); + for (it = funcs[i]; it != NULL; it = it->next) { + Func *f = it->data; + f->h(&obe, f->data); + } } -void dispatch_ob(EventType e) +void dispatch_ob(EventType e, int num0, int num1) { guint i; GSList *it; ObEvent obe; obe.type = e; + obe.data.o.num[0] = num0; + obe.data.o.num[1] = num1; i = 0; while (e > 1) { @@ -138,8 +184,10 @@ void dispatch_ob(EventType e) ++i; } - for (it = funcs[i]; it != NULL; it = it->next) - ((EventHandler)it->data)(&obe); + for (it = funcs[i]; it != NULL; it = it->next) { + Func *f = it->data; + f->h(&obe, f->data); + } } void dispatch_signal(int signal) @@ -150,7 +198,7 @@ void dispatch_signal(int signal) ObEvent obe; obe.type = e; - obe.data.signal = signal; + obe.data.s.signal = signal; i = 0; while (e > 1) { @@ -158,6 +206,63 @@ void dispatch_signal(int signal) ++i; } - for (it = funcs[i]; it != NULL; it = it->next) - ((EventHandler)it->data)(&obe); + for (it = funcs[i]; it != NULL; it = it->next) { + Func *f = it->data; + f->h(&obe, f->data); + } +} + +void dispatch_move(ObClient *c, int *x, int *y) +{ + guint i; + GSList *it; + EventType e = Event_Client_Moving; + ObEvent obe; + + obe.type = e; + obe.data.c.client = c; + obe.data.c.num[0] = *x; + obe.data.c.num[1] = *y; + + i = 0; + while (e > 1) { + e >>= 1; + ++i; + } + + for (it = funcs[i]; it != NULL; it = it->next) { + Func *f = it->data; + f->h(&obe, f->data); + } + + *x = obe.data.c.num[0]; + *y = obe.data.c.num[1]; +} + +void dispatch_resize(ObClient *c, int *w, int *h, ObCorner corner) +{ + guint i; + GSList *it; + EventType e = Event_Client_Resizing; + ObEvent obe; + + obe.type = e; + obe.data.c.client = c; + obe.data.c.num[0] = *w; + obe.data.c.num[1] = *h; + obe.data.c.num[2] = corner; + + i = 0; + while (e > 1) { + e >>= 1; + ++i; + } + + for (it = funcs[i]; it != NULL; it = it->next) { + Func *f = it->data; + f->h(&obe, f->data); + } + + *w = obe.data.c.num[0]; + *h = obe.data.c.num[1]; }