From 5eaecae93f7ba32b6bec9515dfa465130bc8b808 Mon Sep 17 00:00:00 2001 From: Jeff Armstrong Date: Sun, 24 Jul 2011 22:26:32 -0400 Subject: Added VDI routines. Added proper resource handling, some menu library code, and object library code. --- lib/gem.c | 15 ++++- lib/py_aes.c | 54 ++++++++++++++-- lib/py_aes.h | 4 ++ lib/py_vdi.c | 208 +++++++++++++++++++++++++++++------------------------------ 4 files changed, 172 insertions(+), 109 deletions(-) (limited to 'lib') diff --git a/lib/gem.c b/lib/gem.c index cbb3b5b..f842dd1 100644 --- a/lib/gem.c +++ b/lib/gem.c @@ -49,8 +49,15 @@ GemMethods[] = { {"wind_set_string", py_wind_set_string, METH_VARARGS, "Set a string window parameter"}, {"wind_update", py_wind_update, METH_VARARGS, "Lock window redraw for updates"}, + /* AES Event Libary */ {"evnt_multi", py_evnt_multi, METH_VARARGS | METH_KEYWORDS, "Process multiple GEM events."}, + /* AES Menu Library */ + {"menu_bar", py_menu_bar, METH_VARARGS, "Install or hide a GEM menubar"}, + + /* AES Object Library */ + {"objc_draw", py_objc_draw, METH_VARARGS, "Draw an AES object to the screen"}, + /* VDI Functions */ {"v_open_screen", py_v_open_screen, METH_NOARGS, "Open and retrieve a handle to a virtual screen workstation"}, {"v_clsvwk", py_v_clsvwk, METH_VARARGS, "Close a virtual workstation"}, @@ -126,6 +133,12 @@ PROC LibFunc[] = { /* AES Event Library */ "py_evnt_multi", "Internal\n", py_evnt_multi, + /* AES Menu Library */ + "py_menu_bar", "Internal\n", py_menu_bar, + + /* AES Object Library */ + "py_objc_draw", "Internal\n", py_objc_draw, + /* VDI Functions */ "py_v_open_screen", "Internal\n", py_v_open_screen, "py_v_clsvwk", "Internal\n", py_v_clsvwk, @@ -138,7 +151,7 @@ PROC LibFunc[] = { }; LDGLIB LibLdg[] = { - 0x0001, 29, LibFunc, "GEM Extensions for Python", 0 + 0x0001, 31, LibFunc, "GEM Extensions for Python", 0 }; int main( void) diff --git a/lib/py_aes.c b/lib/py_aes.c index b112876..e221ba8 100644 --- a/lib/py_aes.c +++ b/lib/py_aes.c @@ -26,11 +26,17 @@ PyObject* __CDECL py_appl_write(PyObject *self, PyObject *args) int ret; int app_id; char *message; +int buflen; int msg_length; - if(!PyArg_ParseTuple(args,"iiy*",&app_id,&msg_length,&message)) + if(!PyArg_ParseTuple(args,"iis#",&app_id,&msg_length,&message,&buflen)) return NULL; + if(buflen < msg_length) { + PyErr_SetString(GEMError,"Data length's are dangerously inconsistent in appl_write"); + return NULL; + } + ret = appl_write(app_id,msg_length,message); return Py_BuildValue("i",ret); } @@ -122,13 +128,12 @@ PyObject *obj; short x,y,w,h; int ret; - if(!PyArg_ParseTuple(args,"O(hhhh)",&obj,&x,&y,&w,&h)) + if(!PyArg_ParseTuple(args,"O",&obj)) return NULL; form_center(PyCapsule_GetPointer(obj,NULL),&x,&y,&w,&h); - Py_INCREF(Py_None); - return Py_None; + return Py_BuildValue("(iiii)",(int)x,(int)y,(int)w,(int)h); } /* --- Graphics Library --- */ @@ -505,3 +510,44 @@ static char *kwlist[] = {"mouse_buttons","mouse_movement","timer",NULL}; "key", (int)em_out.emo_kreturn,(int)em_out.emo_kmeta); } +/* Menu Library */ +PyObject* __CDECL py_menu_bar(PyObject *self, PyObject *args) +{ +PyObject *object; +int action; +int ret; + + if(!PyArg_ParseTuple(args,"Oi",&object, &action)) + return NULL; + + ret = menu_bar(PyCapsule_GetPointer(object,NULL),action); + + if(ret == 0) { + PyErr_SetString(GEMError,"Menu bar failed to set properly"); + return NULL; + } + Py_INCREF(Py_None); + return Py_None; +} + +/* Object Library */ +PyObject* __CDECL py_objc_draw(PyObject *self, PyObject *args) +{ +PyObject *object; +int id,depth; +int cx, cy, cw, ch; +int ret; + + if(!PyArg_ParseTuple(args,"Oii(iiii)",&object,&id,&depth,&cx,&cy,&cw,&ch)) + return NULL; + + ret = objc_draw(PyCapsule_GetPointer(object,NULL),id,depth,cx,cy,cw,ch); + + if(ret == 0) { + PyErr_SetString(GEMError,"Object draw call failed"); + return NULL; + } + + Py_INCREF(Py_None); + return Py_None; +} \ No newline at end of file diff --git a/lib/py_aes.h b/lib/py_aes.h index e9bf132..98eff67 100644 --- a/lib/py_aes.h +++ b/lib/py_aes.h @@ -29,5 +29,9 @@ PyObject* __CDECL py_wind_update(PyObject *self, PyObject *args); PyObject* __CDECL py_evnt_multi(PyObject *self, PyObject *args, PyObject *kwargs); + + PyObject* __CDECL py_menu_bar(PyObject *self, PyObject *args); + + PyObject* __CDECL py_objc_draw(PyObject *self, PyObject *args); #endif /* __PY_AES_HEADERS */ diff --git a/lib/py_vdi.c b/lib/py_vdi.c index 9c1dd7e..fe9fbe1 100644 --- a/lib/py_vdi.c +++ b/lib/py_vdi.c @@ -1,104 +1,104 @@ -#include "ldg_Python.h" -#include - -PyObject* __CDECL py_v_open_screen(PyObject *self, PyObject *args) -{ -int i; -short work_in[16]; -short work_out[57]; - -short vdi_handle; - - for(i=1;i<16;i++) - work_in[i] = (short)0; /* General Defaults */ - - work_in[0] = (short)1; /* Current Resolution */ - work_in[10] = (short)2; /* Necessary for screen drawing */ - - v_opnvwk(work_in, &vdi_handle, work_out); - - /* For now, ignore the work_out array */ - - return Py_BuildValue("i",(int)vdi_handle); -} - -PyObject* __CDECL py_v_clsvwk(PyObject *self, PyObject *args) -{ -int handle; - - if(!PyArg_ParseTuple(args,"i",&handle)) - return NULL; - - v_clsvwk(handle); - - Py_INCREF(Py_None); - return Py_None; -} - -PyObject* __CDECL py_v_bar(PyObject *self, PyObject *args) -{ -int handle; -int x1, y1, x2, y2; -short pxarray[4]; - - if(!PyArg_ParseTuple(args,"i(ii)(ii)",&handle, &x1, &y1, &x2, &y2)) - return NULL; - - pxarray[0] = x1; - pxarray[1] = y1; - pxarray[2] = x2; - pxarray[3] = y2; - - v_bar(handle,pxarray); - - Py_INCREF(Py_None); - return Py_None; -} - -PyObject* __CDECL py_v_ellipse(PyObject *self, PyObject *args) -{ -int handle; -int x1, y1, xr, yr; - - if(!PyArg_ParseTuple(args,"i(ii)(ii)",&handle, &x1, &y1, &xr, &yr)) - return NULL; - - v_ellipse(handle,x1,y1,xr,yr); - - Py_INCREF(Py_None); - return Py_None; -} - -PyObject* __CDECL py_vsf_color(PyObject *self, PyObject *args) -{ -int handle; -int index; - - if(!PyArg_ParseTuple(args,"ii",&handle, &index)) - return NULL; - - index = vsf_color(handle,index); - - return Py_BuildValue("i",index); -} - -PyObject* __CDECL py_vs_clip(PyObject *self, PyObject *args) -{ -int handle; -int x1, y1, x2, y2; -int enable; -short pxarray[4]; - - if(!PyArg_ParseTuple(args,"ii(ii)(ii)",&handle, &enable, &x1, &y1, &x2, &y2)) - return NULL; - - pxarray[0] = (short)x1; - pxarray[1] = (short)y1; - pxarray[2] = (short)x2; - pxarray[3] = (short)y2; - - vs_clip(handle,enable,pxarray); - - Py_INCREF(Py_None); - return Py_None; -} +#include "ldg_Python.h" +#include + +PyObject* __CDECL py_v_open_screen(PyObject *self, PyObject *args) +{ +int i; +short work_in[16]; +short work_out[57]; + +short vdi_handle; + + for(i=1;i<16;i++) + work_in[i] = (short)0; /* General Defaults */ + + work_in[0] = (short)1; /* Current Resolution */ + work_in[10] = (short)2; /* Necessary for screen drawing */ + + v_opnvwk(work_in, &vdi_handle, work_out); + + /* For now, ignore the work_out array */ + + return Py_BuildValue("i",(int)vdi_handle); +} + +PyObject* __CDECL py_v_clsvwk(PyObject *self, PyObject *args) +{ +int handle; + + if(!PyArg_ParseTuple(args,"i",&handle)) + return NULL; + + v_clsvwk(handle); + + Py_INCREF(Py_None); + return Py_None; +} + +PyObject* __CDECL py_v_bar(PyObject *self, PyObject *args) +{ +int handle; +int x1, y1, x2, y2; +short pxarray[4]; + + if(!PyArg_ParseTuple(args,"i(ii)(ii)",&handle, &x1, &y1, &x2, &y2)) + return NULL; + + pxarray[0] = (short)x1; + pxarray[1] = (short)y1; + pxarray[2] = (short)x2; + pxarray[3] = (short)y2; + + v_bar(handle,pxarray); + + Py_INCREF(Py_None); + return Py_None; +} + +PyObject* __CDECL py_v_ellipse(PyObject *self, PyObject *args) +{ +int handle; +int x1, y1, xr, yr; + + if(!PyArg_ParseTuple(args,"i(ii)(ii)",&handle, &x1, &y1, &xr, &yr)) + return NULL; + + v_ellipse(handle,x1,y1,xr,yr); + + Py_INCREF(Py_None); + return Py_None; +} + +PyObject* __CDECL py_vsf_color(PyObject *self, PyObject *args) +{ +int handle; +int index; + + if(!PyArg_ParseTuple(args,"ii",&handle, &index)) + return NULL; + + index = vsf_color(handle,index); + + return Py_BuildValue("i",index); +} + +PyObject* __CDECL py_vs_clip(PyObject *self, PyObject *args) +{ +int handle; +int x1, y1, x2, y2; +int enable; +short pxarray[4]; + + if(!PyArg_ParseTuple(args,"ii(ii)(ii)",&handle, &enable, &x1, &y1, &x2, &y2)) + return NULL; + + pxarray[0] = (short)x1; + pxarray[1] = (short)y1; + pxarray[2] = (short)x2; + pxarray[3] = (short)y2; + + vs_clip(handle,enable,pxarray); + + Py_INCREF(Py_None); + return Py_None; +} -- cgit v1.2.3