]> Dogcows Code - chaz/openbox/blobdiff - openbox/dispatch.c
prefixing and capitalizing the StackLayer -> ObStackingLayer enum.
[chaz/openbox] / openbox / dispatch.c
index c1c9f783f3eedddd334b7e0ff6491bd1ce7843f6..291e9580803c878603585d8921b670d86b67dba8 100644 (file)
@@ -1,8 +1,15 @@
 #include "dispatch.h"
 #include "extensions.h"
+#include "client.h"
 
 #include <glib.h>
 
+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,11 +136,13 @@ 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;
@@ -114,7 +151,10 @@ void dispatch_client(EventType e, Client *c)
     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) {
@@ -122,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) {
@@ -140,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)
@@ -152,7 +198,31 @@ void dispatch_signal(int signal)
     ObEvent obe;
 
     obe.type = e;
-    obe.data.signal = signal;
+    obe.data.s.signal = signal;
+
+    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);
+    }
+}
+
+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) {
@@ -160,6 +230,39 @@ 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);
+    }
+
+    *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];
 }
This page took 0.030524 seconds and 4 git commands to generate.