All pastes #383825 Raw Edit

Something

public text v1 · immutable
·published 2007-03-06 17:12 UTC
rendered paste body
Index: beryl-core/src/library.c
===================================================================
--- beryl-core/src/library.c	(Revision 0)
+++ beryl-core/src/library.c	(Revision 0)
@@ -0,0 +1,121 @@
+/**
+ *
+ * Beryl library interface
+ *
+ * library.c
+ *
+ * Copyright : (C) 2007 by Patrick Niklaus
+ * Authors: Patrick Niklaus <patrick.niklaus@googlemail.com>
+ *
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ **/
+
+#ifdef HAVE_CONFIG_H
+#  include "../config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <beryl.h>
+#include <beryl-private.h>
+
+static void updateLibraryFuncion(CompDisplay *d, CompLibraryFunction *func)
+{
+	CompPlugin *p;
+	
+	for (p = getPlugins(); p; p = p->next)
+		if (p->vTable->updateLibrayFunction)
+			(*p->vTable->updateLibrayFunction) (d, func);
+}
+
+static void appendLibraryFunction(CompDisplay *d, CompLibraryFunction *func)
+{
+	if (d->libFunctions) {
+		d->libFunctions->next = func;
+		func->prev = d->libFunctions;
+		func->next = NULL;
+	}else {
+		d->libFunctions = func;
+		func->prev = NULL;
+		func->next = NULL;
+	}
+}
+
+static void unhookLibraryFunction(CompDisplay *d, CompLibraryFunction *func)
+{
+	CompLibraryFunction *prev = func->prev;
+	CompLibraryFunction *next = func->next;
+
+	if (prev) {
+		if (next)
+			prev->next = next;
+		else 
+			prev->next = NULL;
+	}
+	if (next) {
+		if (prev)
+			next->prev = prev;
+		else
+			next->prev = NULL;
+	}
+
+	if (!prev && !next)
+		d->libFunctions = NULL;
+	else if (!prev && next)
+		d->libFunctions = next;
+}
+
+void addLibraryFunction(CompDisplay *d, char *name, void *function)
+{
+	CompLibraryFunction *func = (CompLibraryFunction*) malloc(sizeof(CompLibraryFunction));
+	
+	func->name = name;
+	func->function = function;
+
+	appendLibraryFunction(d, func);
+
+	updateLibraryFuncion(d, func);
+}
+
+void removeLibraryFunction(CompDisplay *d, char *name)
+{
+	if (!d->libFunctions)
+		return;
+
+	CompLibraryFunction *func;
+	for (func = d->libFunctions; func; func = func->next)
+		if (strcmp(func->name, name) == 0)
+			break;
+	
+	if (!func)
+		return;
+
+	unhookLibraryFunction(d, func);
+	updateLibraryFuncion(d, func);
+	free(func);
+}
+
+void *getLibraryFunction(CompDisplay *d, char *name)
+{
+	if (!d->libFunctions)
+		return;
+
+	CompLibraryFunction *func;
+	for (func = d->libFunctions; func; func = func->next)
+		if (strcmp(func->name, name) == 0)
+			return func->function;
+
+	return NULL;
+}
Index: beryl-core/src/display.c
===================================================================
--- beryl-core/src/display.c	(Revision 4370)
+++ beryl-core/src/display.c	(Arbeitskopie)
@@ -2361,6 +2361,8 @@
 	d->fileToImage = fileToImage;
 	d->imageToFile = imageToFile;
 
+	d->libFunctions = NULL;
+
 	d->reloadSettingsAtom=XInternAtom(dpy,"_BERYL_SETTINGS_RELOAD",0);
 
 	d->berylDesktopManaged = XInternAtom(dpy, "_BERYL_DESKTOP_MANAGED", 0);
Index: beryl-core/src/Makefile.am
===================================================================
--- beryl-core/src/Makefile.am	(Revision 4370)
+++ beryl-core/src/Makefile.am	(Arbeitskopie)
@@ -39,6 +39,7 @@
 	syscheck.h	    \
 	beryl-private.h     \
 	fsp.h		    \
+	library.c \
 	blog.c
 
 
Index: beryl-core/include/beryl.h
===================================================================
--- beryl-core/include/beryl.h	(Revision 4370)
+++ beryl-core/include/beryl.h	(Arbeitskopie)
@@ -102,6 +102,7 @@
 typedef struct _CompProgram			CompProgram;
 typedef struct _CompFunction		CompFunction;
 typedef struct _CompFunctionData	CompFunctionData;
+typedef struct _CompLibraryFunction CompLibraryFunction;
 typedef struct _FragmentAttrib		FragmentAttrib;
 
 /* virtual modifiers */
@@ -851,6 +852,8 @@
     FileToImageProc fileToImage;
     ImageToFileProc imageToFile;
 
+	CompLibraryFunction *libFunctions;
+
     CompPrivate *privates;
 
     int lastPointerX;
@@ -2709,7 +2712,27 @@
 setDesktopForWindow (CompWindow   *w,
 		     unsigned int desktop);
 
+/* library.c */
 
+typedef void (*UpdateLibraryFunctionProc) (CompDisplay *d, CompLibraryFunction *func);
+
+struct _CompLibraryFunction {
+	CompLibraryFunction *prev;
+	CompLibraryFunction *next;
+
+	char *name;
+	void *function;
+};
+
+void
+addLibraryFunction (CompDisplay *d, char *name,	void *function);
+
+void
+removeLibraryFunction (CompDisplay *d, char *name);
+
+void*
+getLibraryFunction (CompDisplay *d, char* name);
+
 /* plugin.c */
 
 typedef Bool (*InitPluginProc) (CompPlugin *plugin);
@@ -2766,6 +2789,8 @@
     GetScreenOptionsProc  getScreenOptions;
     SetScreenOptionProc   setScreenOption;
 
+	UpdateLibraryFunctionProc updateLibrayFunction;
+
     CompPluginDep *deps;
     int           nDeps;
 
@@ -2883,7 +2908,6 @@
 void
 closeSession (void);
 
-
 /* fragment.c */
 
 #define MAX_FRAGMENT_FUNCTIONS 16