I wrote this quick patch because I want plugins to be able to
communicate with each other with events.  Using the option values to
communicate with each other is a bit cumbersome if you want to monitor
for changes or do anything which requires events.

It is just a small patch and works in the compiz way (ie by wrapping the core
event).

Some potential events that I can think of at the moment are 'option changed'
and 'cube settle on top' (Maybe a widget plugin can use this)

Plugins can send compiz events like this.

(*d->handleCompizEvent) (d, "switcher", "NEXT_EVENT", option,
                                         nOption);

In this case, switcher is sending the NEXT_EVENT signal. It is probably best to deal with strings for the events since they do not have to be defined and
are easily passed to external applications.

The option can be any type of extra information passed as a pointer to a
CompOption as per normal.

Some sort of standard should be set out for the naming of events like this.
diff --git a/include/compiz.h b/include/compiz.h
index 61a9de5..a7eff50 100644
--- a/include/compiz.h
+++ b/include/compiz.h
@@ -568,6 +568,12 @@ typedef void (*FiniPluginForDisplayProc)
 typedef void (*HandleEventProc) (CompDisplay *display,
                                 XEvent      *event);
 
+typedef void (*HandleCompizEventProc) (CompDisplay *display,
+                                      char       *pluginName,
+                                      char       *eventName,
+                                      CompOption *option,
+                                      int        nOption);
+
 typedef Bool (*CallBackProc) (void *closure);
 
 typedef void (*ForEachWindowProc) (CompWindow *window,
@@ -749,7 +755,8 @@ struct _CompDisplay {
     InitPluginForDisplayProc initPluginForDisplay;
     FiniPluginForDisplayProc finiPluginForDisplay;
 
-    HandleEventProc handleEvent;
+    HandleEventProc        handleEvent;
+    HandleCompizEventProc  handleCompizEvent;
 
     CompPrivate *privates;
 };
@@ -853,6 +860,12 @@ setDisplayAction (CompDisplay     *displ
 void
 handleEvent (CompDisplay *display,
             XEvent      *event);
+void
+handleCompizEvent (CompDisplay *display,
+                  char       *pluginName,
+                  char       *eventName,
+                  CompOption *option,
+                  int        nOption);
 
 void
 handleSyncAlarm (CompWindow *w);
diff --git a/src/display.c b/src/display.c
index 4abdaed..dd70c51 100644
--- a/src/display.c
+++ b/src/display.c
@@ -2507,6 +2507,7 @@ #endif
     d->finiPluginForDisplay = finiPluginForDisplay;
 
     d->handleEvent = handleEvent;
+    d->handleCompizEvent = handleCompizEvent;
 
     d->supportedAtom        = XInternAtom (dpy, "_NET_SUPPORTED", 0);
     d->supportingWmCheckAtom = XInternAtom (dpy, "_NET_SUPPORTING_WM_CHECK", 
0);
diff --git a/src/event.c b/src/event.c
index 2d182be..ce92780 100644
--- a/src/event.c
+++ b/src/event.c
@@ -1059,6 +1059,14 @@ handleActionEvent (CompDisplay *d,
     return FALSE;
 }
 
+void handleCompizEvent (CompDisplay *d,
+                       char       *pluginName,
+                       char       *eventName,
+                       CompOption *option,
+                       int        nOption)
+{
+}
+
 void
 handleEvent (CompDisplay *d,
             XEvent      *event)
_______________________________________________
compiz mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/compiz

Reply via email to