From 4887bfbc732ff6ffe456a980874c65219ca08674 Mon Sep 17 00:00:00 2001 From: Jeff Armstrong Date: Thu, 21 Jul 2011 22:09:09 -0400 Subject: Added a simple example. Troubleshooting of evnt_multi. --- lib/gem.c | 6 ++-- lib/py_aes.c | 112 +++++++++++++++++++++++++++++++++++++++++------------------ lib/py_aes.h | 5 +-- 3 files changed, 85 insertions(+), 38 deletions(-) (limited to 'lib') diff --git a/lib/gem.c b/lib/gem.c index b6041bd..d06f65b 100644 --- a/lib/gem.c +++ b/lib/gem.c @@ -22,6 +22,7 @@ GemMethods[] = { {"appl_init", py_appl_init, METH_VARARGS, "Initialize a GEM application"}, {"appl_exit", py_appl_exit, METH_VARARGS, "Exit a GEM application"}, {"appl_write", py_appl_write, METH_VARARGS, "Send a message to a GEM application"}, + {"appl_read", py_appl_read, METH_VARARGS, "Retrieve message data from a GEM application"}, /* AES Forms Library */ {"form_alert", py_form_alert, METH_VARARGS, "Display a GEM alert dialog"}, @@ -46,7 +47,7 @@ GemMethods[] = { {"wind_set", py_wind_set, METH_VARARGS, "Set a window parameter"}, {"wind_update", py_wind_update, METH_VARARGS, "Lock window redraw for updates"}, - {"evnt_multi", py_evnt_multi, METH_KEYWORDS | METH_VARARGS, "Process multiple GEM events."}, + {"evnt_multi", py_evnt_multi, METH_VARARGS, "Process multiple GEM events."}, {NULL,NULL,0,NULL} }; @@ -86,6 +87,7 @@ PROC LibFunc[] = { "py_appl_exit", "Internal\n", py_appl_exit, "py_appl_init", "Internal\n", py_appl_init, "py_appl_write", "Internal\n", py_appl_write, + "py_appl_read", "Internal\n", py_appl_read, /* AES Forms Library */ "py_form_alert", "Internal\n", py_form_alert, @@ -117,7 +119,7 @@ PROC LibFunc[] = { }; LDGLIB LibLdg[] = { - 0x0001, 21, LibFunc, "GEM Extensions for Python", 0 + 0x0001, 22, LibFunc, "GEM Extensions for Python", 0 }; int main( void) diff --git a/lib/py_aes.c b/lib/py_aes.c index 539fbbf..ede4788 100644 --- a/lib/py_aes.c +++ b/lib/py_aes.c @@ -35,6 +35,40 @@ int msg_length; return Py_BuildValue("i",ret); } +PyObject* __CDECL py_appl_read(PyObject *self, PyObject *args) +{ +int ret; +int app_id; +char *message; +int msg_length; +PyObject *ret_obj; + + if(!PyArg_ParseTuple(args,"ii",&app_id,&msg_length)) + return NULL; + + if(msg_length <= 0) { + PyErr_SetString(GEMError,"Data length of zero requested in appl_read"); + return NULL; + } + + message = (char *)malloc(msg_length*sizeof(char)); + ret = appl_read(app_id,msg_length,message); + + if(ret == 0) { + PyErr_SetString(GEMError,"Application read request failed"); + return NULL; + } + +#ifdef PYTHON_3_API + ret_obj = Py_BuildValue("y#",ret_obj,msg_length); +#else + ret_obj = Py_BuildValue("s#",ret_obj,msg_length); +#endif + + free(message); + return ret_obj; +} + /* --- Forms Library --- */ PyObject* __CDECL py_form_alert(PyObject *self, PyObject *args) { @@ -378,6 +412,11 @@ PyObject *tpl; /* --- Event Library --- */ PyObject* __CDECL py_evnt_multi(PyObject self, PyObject *args, PyObject *kwargs) { + +EVMULT_IN em_in; +EVMULT_OUT em_out; + + /* Because this is possibly the ugliest call ever created in the C * language, we'll use the same variable names as the docs use. */ @@ -385,7 +424,7 @@ int ev_mflags, ev_mbclicks, ev_mbmask, ev_mbstate, ev_mm1flags, ev_mm1x, ev_mm1y int ev_mm2x, ev_mm2y, ev_mm2width, ev_mm2height, ev_mtlocount, ev_mthicount, ev_mmox, ev_mmoy; int ev_mmbutton, ev_mmokstate, ev_mkreturn, ev_mbreturn; -int message[8]; +static char message[16]; int ret; @@ -399,52 +438,57 @@ static char *kwlist[] = {"mouse_buttons","mouse_movement","timer",NULL}; mmovement = NULL; timer = 0l; - if(!PyArg_ParseTupleAndKeywords(args, kwargs, "i|OOl", kwlist, - &ev_mflags, &mbuttons, &mmovement, &timer)) - return NULL; + form_alert(0,"[3][Start evnt_multi][Ok]"); + //if(!PyArg_ParseTupleAndKeywords(args, kwargs, "i|OOl", kwlist, + // &ev_mflags, &mbuttons, &mmovement, &timer)) + if(!PyArg_ParseTuple(args,"i",&ev_mflags)) + return NULL; + + form_alert(0,"[3][Args parsed][Ok]"); + em_in.emi_flags = ev_mflags; + /* Timer handling */ - ev_mtlocount = loword(timer); - ev_mthicount = hiword(timer); + em_in.emi_tlow = loword(timer); + em_in.emi_thigh = hiword(timer); /* Mouse button handling */ if(mbuttons != NULL) { PyArg_ParseTuple(mbuttons,"iii",&ev_mbclicks,&ev_mbmask,&ev_mbstate); + em_in.emi_bclicks = (short)ev_mbclicks; + em_in.emi_bmask = (short)ev_mbmask; + em_in.emi_bstate = (short)ev_mbstate; } /* Mouse movement handling */ if(mmovement != NULL) { PyArg_ParseTuple(mmovement,"(iiiii)(iiiii)",&ev_mm1flags,&ev_mm1x,&ev_mm1y,&ev_mm1width,ev_mm1height, &ev_mm2flags,&ev_mm2x,&ev_mm2y,&ev_mm2width,ev_mm2height); + em_in.emi_m1leave = (short)ev_mm1flags; + em_in.emi_m1.g_x = (short)ev_mm1x; + em_in.emi_m1.g_y = (short)ev_mm1y; + em_in.emi_m1.g_w = (short)ev_mm1width; + em_in.emi_m1.g_h = (short)ev_mm1height; + + em_in.emi_m2leave = (short)ev_mm2flags; + em_in.emi_m2.g_x = (short)ev_mm2x; + em_in.emi_m2.g_y = (short)ev_mm2y; + em_in.emi_m2.g_w = (short)ev_mm2width; + em_in.emi_m2.g_h = (short)ev_mm2height; } - /* More is still needed */ - ret = evnt_multi(ev_mflags, - ev_mbclicks, - ev_mbmask, - ev_mbstate, - ev_mm1flags, - ev_mm1x, - ev_mm1y, - ev_mm1width, - ev_mm1height, - ev_mm2flags, - ev_mm2x, - ev_mm2y, - ev_mm2width, - ev_mm2height, - message, - ev_mtlocount, - ev_mthicount, - &ev_mmox, - &ev_mmoy, - &ev_mmbutton, - &ev_mmokstate, - /* &ev_mkreturn, */ - &ev_mbreturn); - - return Py_BuildValue("{s:i,s:i,s:(ii),s:(iii),s:i}", "events", ret, "message", message, - "mouse_position", ev_mmox, ev_mmoy, "mouse_button", ev_mmbutton, ev_mmokstate, ev_mbreturn, - "key", ev_mkreturn); + /* Use the not-so-portable fast multi call */ + ret = evnt_multi_fast(&em_in, message, &em_out); + form_alert(0,"[3][Args parsed][Ok]"); +//#ifdef PYTHON_3_API + //return Py_BuildValue("{s:i,s:y#,s:(ii),s:(ii),s:(ii)}", +//#else + return Py_BuildValue("{s:i,s:s#,s:(ii),s:(ii),s:(ii)}", +//#endif + "events", ret, + "message", message, 16, + "mouse_position", (int)em_out.emo_mouse.p_x, (int)em_out.emo_mouse.p_y, + "mouse_button", (int)em_out.emo_mbutton, (int)em_out.emo_mclicks, + "key", (int)em_out.emo_kreturn,(int)em_out.emo_kmeta); } diff --git a/lib/py_aes.h b/lib/py_aes.h index 024aac0..81beb50 100644 --- a/lib/py_aes.h +++ b/lib/py_aes.h @@ -6,6 +6,7 @@ PyObject* __CDECL py_appl_init(PyObject *self, PyObject *args); PyObject* __CDECL py_appl_exit(PyObject *self, PyObject *args); PyObject* __CDECL py_appl_write(PyObject *self, PyObject *args); + PyObject* __CDECL py_appl_read(PyObject *self, PyObject *args); PyObject* __CDECL py_form_alert(PyObject *self, PyObject *args); PyObject* __CDECL py_form_dial(PyObject *self, PyObject *args); @@ -15,7 +16,7 @@ PyObject* __CDECL py_graf_handle(PyObject self, PyObject *args); PyObject* __CDECL py_graf_mouse(PyObject self, PyObject *args); -PyObject* __CDECL py_rsrc_load(PyObject *self, PyObject *args); + PyObject* __CDECL py_rsrc_load(PyObject *self, PyObject *args); PyObject* __CDECL py_rsrc_gaddr(PyObject *self, PyObject *args); PyObject* __CDECL py_wind_create(PyObject *self, PyObject *args); @@ -26,6 +27,6 @@ PyObject* __CDECL py_rsrc_load(PyObject *self, PyObject *args); PyObject* __CDECL py_wind_set(PyObject *self, PyObject *args); PyObject* __CDECL py_wind_update(PyObject *self, PyObject *args); - PyObject* __CDECL py_evnt_multi(PyObject self, PyObject *args, PyObject *kwargs); + PyObject* __CDECL py_evnt_multi(PyObject self, PyObject *args); #endif /* __PY_AES_HEADERS */ -- cgit v1.2.3