summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--otk_c/Makefile4
-rw-r--r--otk_c/color.c2
-rw-r--r--otk_c/color.h4
-rw-r--r--otk_c/display.c2
-rw-r--r--otk_c/display.h2
-rw-r--r--otk_c/gccache.c12
-rw-r--r--otk_c/gccache.h4
-rw-r--r--otk_c/init.c30
-rw-r--r--otk_c/init.h7
-rw-r--r--otk_c/screeninfo.h2
10 files changed, 57 insertions, 12 deletions
diff --git a/otk_c/Makefile b/otk_c/Makefile
index b9253343..2e0589d6 100644
--- a/otk_c/Makefile
+++ b/otk_c/Makefile
@@ -3,8 +3,8 @@ exec_prefix=$(prefix)
libdir=$(exec_prefix)/lib
targets = libotk.so libotk.a
-sources = display.c screeninfo.c rect.c gccache.c color.c
-headers = display.h screeninfo.h rect.h gccache.h color.h
+sources = init.c display.c screeninfo.c rect.c gccache.c color.c
+headers = init.h display.h screeninfo.h rect.h gccache.h color.h
CFLAGS+=-g -I/usr/gwar/include/python2.2 -W -Wall
diff --git a/otk_c/color.c b/otk_c/color.c
index d4dad53d..595eb08a 100644
--- a/otk_c/color.c
+++ b/otk_c/color.c
@@ -46,7 +46,7 @@ static long otkcolor_hash(OtkColor *self)
return self->screen << 24 | self->red << 16 | self->green << 8 | self->blue;
}
-static PyTypeObject OtkColor_Type = {
+PyTypeObject OtkColor_Type = {
PyObject_HEAD_INIT(NULL)
0,
"Color",
diff --git a/otk_c/color.h b/otk_c/color.h
index 6e9f421b..143429a0 100644
--- a/otk_c/color.h
+++ b/otk_c/color.h
@@ -1,10 +1,12 @@
-// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
+// -*- mode: C; indent-tabs-mode: nil; c-basic-offset: 2; -*-
#ifndef __color_h
#define __color_h
#include <X11/Xlib.h>
#include <Python.h>
+extern PyTypeObject OtkColor_Type;
+
//! OtkColor objects are immutable. DONT CHANGE THEM.
typedef struct OtkColor {
PyObject_HEAD
diff --git a/otk_c/display.c b/otk_c/display.c
index 5efe7197..016aa948 100644
--- a/otk_c/display.c
+++ b/otk_c/display.c
@@ -126,6 +126,8 @@ line argument.\n\n"));
self->screenInfoList = PyList_New(ScreenCount(self->display));
for (i = 0; i < ScreenCount(self->display); ++i)
PyList_SetItem(self->screenInfoList, i, OtkScreenInfo_New(i));
+
+ Py_INCREF(OBDisplay); // make sure it stays around!!
}
void OtkDisplay_Grab(OtkDisplay *self)
diff --git a/otk_c/display.h b/otk_c/display.h
index a36cd853..f13c52fb 100644
--- a/otk_c/display.h
+++ b/otk_c/display.h
@@ -10,6 +10,8 @@ struct OtkDisplay;
extern struct OtkDisplay *OBDisplay; // the global display XXX: move this to app.h and ob.h?
+extern PyTypeObject OtkDisplay_Type;
+
typedef struct OtkDisplay {
PyObject_HEAD
diff --git a/otk_c/gccache.c b/otk_c/gccache.c
index 71232bf4..f8b40f31 100644
--- a/otk_c/gccache.c
+++ b/otk_c/gccache.c
@@ -86,7 +86,7 @@ OtkGCCacheItem *OtkGCCacheItem_New()
}
-void OtkGCCache_Initialize(int screen_count)
+void OtkGCCache_Initialize()
{
unsigned int i;
@@ -94,7 +94,7 @@ void OtkGCCache_Initialize(int screen_count)
gccache->context_count = 128;
gccache->cache_size = 16;
- gccache->cache_buckets = 8 * screen_count;
+ gccache->cache_buckets = 8 * ScreenCount(OBDisplay->display);
gccache->cache_total_size = gccache->cache_size * gccache->cache_buckets;
gccache->contexts = malloc(sizeof(OtkGCCacheContext*) *
@@ -108,7 +108,7 @@ void OtkGCCache_Initialize(int screen_count)
}
-void OtkGCCache_Destroy()
+/*void OtkGCCache_Destroy()
{
unsigned int i;
@@ -122,9 +122,9 @@ void OtkGCCache_Destroy()
free(gccache->cache);
free(gccache);
gccache = NULL;
-}
+}*/
-OtkGCCacheContext *OtkGCCache_NextContext(int screen)
+static OtkGCCacheContext *nextContext(int screen)
{
Window hd = OtkDisplay_ScreenInfo(OBDisplay, screen)->root_window;
OtkGCCacheContext *c;
@@ -202,7 +202,7 @@ OtkGCCacheItem *OtkGCCache_Find(OtkColor *color, XFontStruct *font,
gccache->cache[k-1] = c;
}
} else {
- c->ctx = OtkGCCache_NextContext(screen);
+ c->ctx = nextContext(screen);
OtkGCCacheContext_Set(c->ctx, color, font, function, subwindow, linewidth);
c->ctx->used = True;
c->count = 1;
diff --git a/otk_c/gccache.h b/otk_c/gccache.h
index ccd95524..d7318260 100644
--- a/otk_c/gccache.h
+++ b/otk_c/gccache.h
@@ -51,8 +51,8 @@ typedef struct OtkGCCache {
OtkGCCacheItem **cache;
} OtkGCCache;
-void OtkGCCache_Initialize(int screen_count);
-void OtkGCCache_Destroy();
+void OtkGCCache_Initialize();
+//void OtkGCCache_Destroy();
// cleans up the cache
void OtkGCCache_Purge();
diff --git a/otk_c/init.c b/otk_c/init.c
new file mode 100644
index 00000000..5f576ac3
--- /dev/null
+++ b/otk_c/init.c
@@ -0,0 +1,30 @@
+// -*- mode: C; indent-tabs-mode: nil; c-basic-offset: 2; -*-
+
+#include "../config.h"
+#include "display.h"
+#include "screeninfo.h"
+#include "color.h"
+#include "gccache.h"
+
+#include <X11/Xlib.h>
+#include <Python.h>
+
+static PyMethodDef otk_methods[] = {
+// {"new_noddy", noddy_new_noddy, METH_VARARGS,
+// "Create a new Noddy object."},
+
+ {NULL, NULL, 0, NULL}
+};
+
+void initotk(char *display)
+{
+ OtkDisplay_Type.ob_type = &PyType_Type;
+ OtkScreenInfo_Type.ob_type = &PyType_Type;
+ OtkColor_Type.ob_type = &PyType_Type;
+
+ Py_InitModule("otk", otk_methods);
+
+ OtkDisplay_Initialize(display);
+ assert(OBDisplay);
+ OtkGCCache_Initialize();
+}
diff --git a/otk_c/init.h b/otk_c/init.h
new file mode 100644
index 00000000..ba807f23
--- /dev/null
+++ b/otk_c/init.h
@@ -0,0 +1,7 @@
+// -*- mode: C; indent-tabs-mode: nil; c-basic-offset: 2; -*-
+#ifndef __init_h
+#define __init_h
+
+void initotk(char *display);
+
+#endif // __init_h
diff --git a/otk_c/screeninfo.h b/otk_c/screeninfo.h
index 5114a37c..3a330f57 100644
--- a/otk_c/screeninfo.h
+++ b/otk_c/screeninfo.h
@@ -5,6 +5,8 @@
#include <X11/Xlib.h>
#include <Python.h>
+extern PyTypeObject OtkScreenInfo_Type;
+
typedef struct OtkScreenInfo {
int screen;
Window root_window;