mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-19 12:28:22 +01:00
- Added a python wrapper module for WINGs
This commit is contained in:
3
WINGs/python/.cvsignore
Normal file
3
WINGs/python/.cvsignore
Normal file
@@ -0,0 +1,3 @@
|
||||
WINGs.c
|
||||
wings.so
|
||||
build
|
||||
17
WINGs/python/Makefile
Normal file
17
WINGs/python/Makefile
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
all: WINGs.c
|
||||
python setup.py build
|
||||
ln -s `find build/ -name wings.so` .
|
||||
|
||||
install: WINGs.c
|
||||
python setup.py install
|
||||
|
||||
clean:
|
||||
rm -rf build dist WINGs.c *.o *~ *.so MANIFEST wings.py *.pyc *.pyo core
|
||||
|
||||
dist:
|
||||
python setup.py sdist
|
||||
|
||||
WINGs.c: WINGs.i
|
||||
swig -python -noproxy `get-wings-flags --cflags` -I.. -o WINGs.c WINGs.i
|
||||
|
||||
21
WINGs/python/README
Normal file
21
WINGs/python/README
Normal file
@@ -0,0 +1,21 @@
|
||||
|
||||
This is a python wrapper for the WINGs library. With it you can write python
|
||||
based programs which will have WINGs based graphic interfaces.
|
||||
|
||||
This module in not built by default. To build it you need python2.1 or later
|
||||
and swig-1.3.14 or later.
|
||||
|
||||
To build it, first compile and install WINGs. after that run 'make' in this
|
||||
directory. 'make install' will install the python module into the python tree.
|
||||
|
||||
run test.py or even WINGs.py for an example.
|
||||
|
||||
the code is not yet finished and probably won't do everything you expect it
|
||||
to do.
|
||||
|
||||
Note: currently the module expects WINGs installed to build. it won't take
|
||||
the WINGs libraries and header files from the source tree. You need to
|
||||
install WINGs first. Even if an old version of WINGs is already installed,
|
||||
you still need to nstall the newly built WINGs, else the python module will
|
||||
be built against the old version
|
||||
|
||||
677
WINGs/python/WINGs.i
Normal file
677
WINGs/python/WINGs.i
Normal file
@@ -0,0 +1,677 @@
|
||||
%module wings
|
||||
%{
|
||||
#include "WINGs/WINGsP.h"
|
||||
%}
|
||||
|
||||
%include typemaps.i
|
||||
|
||||
// This tells SWIG to treat char ** as a special case
|
||||
%typemap(python, in) char ** {
|
||||
/* Check if is a list */
|
||||
if (PyList_Check($input)) {
|
||||
int size = PyList_Size($input);
|
||||
int i = 0;
|
||||
$1 = (char **) wmalloc((size+1)*sizeof(char *));
|
||||
for (i = 0; i < size; i++) {
|
||||
PyObject *o = PyList_GetItem($input, i);
|
||||
if (PyString_Check(o))
|
||||
$1[i] = PyString_AsString(PyList_GetItem($input, i));
|
||||
else {
|
||||
PyErr_SetString(PyExc_TypeError, "list must contain strings");
|
||||
wfree($1);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
$1[i] = 0;
|
||||
} else {
|
||||
PyErr_SetString(PyExc_TypeError, "not a list");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
// This cleans up the char ** array we mallocd before the function call
|
||||
%typemap(python, freearg) char ** {
|
||||
wfree($1);
|
||||
}
|
||||
// This allows a C function to return a char ** as a Python list
|
||||
%typemap(python, out) char ** {
|
||||
int len,i;
|
||||
len = 0;
|
||||
while ($1[len]) len++;
|
||||
$result = PyList_New(len);
|
||||
for (i = 0; i < len; i++) {
|
||||
PyList_SetItem($result, i, PyString_FromString($1[i]));
|
||||
}
|
||||
}
|
||||
|
||||
// Now for some callbacks
|
||||
%typemap(python, in) PyObject *pyacArgs {
|
||||
if (PyTuple_Check($input)) {
|
||||
if (PyTuple_Size($input) != 3) {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"wrong number of parameters in tuple. should be 3.");
|
||||
return NULL;
|
||||
} else {
|
||||
PyObject *func = PyTuple_GetItem($input, 1);
|
||||
if (func!=Py_None && !PyCallable_Check(func)) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"'action' needs to be a callable object!");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
PyErr_SetString(PyExc_TypeError, "2nd argument not a tuple!");
|
||||
return NULL;
|
||||
}
|
||||
$1 = $input;
|
||||
}
|
||||
|
||||
%typemap(python, in) PyObject *pycArgs {
|
||||
if (PyTuple_Check($input)) {
|
||||
if (PyTuple_Size($input) != 2) {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"wrong number of parameters in tuple. should be 2.");
|
||||
return NULL;
|
||||
} else {
|
||||
PyObject *func = PyTuple_GetItem($input, 0);
|
||||
if (func!=Py_None && !PyCallable_Check(func)) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"'action' needs to be a callable object!");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
PyErr_SetString(PyExc_TypeError, "2nd argument not a tuple!");
|
||||
return NULL;
|
||||
}
|
||||
$1 = $input;
|
||||
}
|
||||
|
||||
// Type mapping for grabbing a FILE * from Python
|
||||
%typemap(python, in) FILE * {
|
||||
if (!PyFile_Check($input)) {
|
||||
PyErr_SetString(PyExc_TypeError, "Need a file!");
|
||||
return NULL;
|
||||
}
|
||||
$1 = PyFile_AsFile($input);
|
||||
}
|
||||
|
||||
/* These are for freeing the return of functions that need to be freed
|
||||
* before returning control to python. */
|
||||
%typemap(python, ret) char* WMGetTextFieldText { wfree($1); };
|
||||
|
||||
|
||||
%include exception.i
|
||||
|
||||
%exception pyWMScreenMainLoop {
|
||||
$function
|
||||
if (PyErr_Occurred())
|
||||
return NULL;
|
||||
}
|
||||
|
||||
%exception pyWMRunModalLoop {
|
||||
$function
|
||||
if (PyErr_Occurred())
|
||||
return NULL;
|
||||
}
|
||||
|
||||
%{
|
||||
static int mainLoopDone = 0;
|
||||
%}
|
||||
|
||||
|
||||
%inline %{
|
||||
WMScreen *pyWMOpenScreen(const char *display, int simpleapp)
|
||||
{
|
||||
Display *dpy = XOpenDisplay(display);
|
||||
|
||||
if (!dpy) {
|
||||
wwarning("WINGs: could not open display %s", XDisplayName(display));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (simpleapp) {
|
||||
return WMCreateSimpleApplicationScreen(dpy);
|
||||
} else {
|
||||
return WMCreateScreen(dpy, DefaultScreen(dpy));
|
||||
}
|
||||
}
|
||||
|
||||
void pyWMScreenMainLoop(WMScreen *scr)
|
||||
{
|
||||
XEvent event;
|
||||
|
||||
while (!PyErr_Occurred() && !mainLoopDone) {
|
||||
WMNextEvent(((W_Screen*)scr)->display, &event);
|
||||
WMHandleEvent(&event);
|
||||
}
|
||||
}
|
||||
|
||||
void pyWMBreakScreenMainLoop(WMScreen *scr)
|
||||
{
|
||||
mainLoopDone = 1;
|
||||
}
|
||||
|
||||
void pyWMRunModalLoop(WMScreen *scr, WMView *view)
|
||||
{
|
||||
int oldModalLoop = scr->modalLoop;
|
||||
WMView *oldModalView = scr->modalView;
|
||||
|
||||
scr->modalView = view;
|
||||
|
||||
scr->modalLoop = 1;
|
||||
while (!PyErr_Occurred() && scr->modalLoop) {
|
||||
XEvent event;
|
||||
|
||||
WMNextEvent(scr->display, &event);
|
||||
WMHandleEvent(&event);
|
||||
}
|
||||
|
||||
scr->modalView = oldModalView;
|
||||
scr->modalLoop = oldModalLoop;
|
||||
}
|
||||
%}
|
||||
|
||||
|
||||
//%rename WMScreenMainLoop _WMScreenMainLoop;
|
||||
//%rename WMRunModalLoop _WMRunModalLoop;
|
||||
|
||||
|
||||
%{
|
||||
/* These functions match the prototypes of the normal C callback
|
||||
* functions. However, we use the clientdata pointer for holding a
|
||||
* reference to a Python tuple containing (object, funct, clientData).
|
||||
*/
|
||||
static void PythonWMActionCallback(WMWidget *widget, void *cdata)
|
||||
{
|
||||
PyObject *pyobj, *func, *pydata, *arglist, *tuple, *result;
|
||||
|
||||
tuple = (PyObject*) cdata;
|
||||
pyobj = PyTuple_GetItem(tuple, 0);
|
||||
func = PyTuple_GetItem(tuple, 1);
|
||||
if (func && func!=Py_None) {
|
||||
pydata = PyTuple_GetItem(tuple, 2);
|
||||
arglist = Py_BuildValue("(OO)", pyobj, pydata);
|
||||
result = PyEval_CallObject(func, arglist);
|
||||
Py_DECREF(arglist);
|
||||
Py_XDECREF(result);
|
||||
}
|
||||
}
|
||||
|
||||
static void PythonWMCallback(void *data)
|
||||
{
|
||||
PyObject *func, *pydata, *arglist, *tuple, *result;
|
||||
|
||||
tuple = (PyObject*) data;
|
||||
func = PyTuple_GetItem(tuple, 0);
|
||||
if (func && func!=Py_None) {
|
||||
pydata = PyTuple_GetItem(tuple, 1);
|
||||
arglist = Py_BuildValue("(O)", pydata);
|
||||
result = PyEval_CallObject(func, arglist);
|
||||
Py_DECREF(arglist);
|
||||
Py_XDECREF(result);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
pyTextFieldDidBeginEditing(WMTextFieldDelegate *self, WMNotification *notif)
|
||||
{
|
||||
PyObject *pyobj, *delegate, *func, *pydata, *arglist, *tuple, *result;
|
||||
int action;
|
||||
|
||||
tuple = (PyObject*) self->data;
|
||||
pyobj = PyTuple_GetItem(tuple, 0);
|
||||
delegate = PyTuple_GetItem(tuple, 1);
|
||||
if (delegate != Py_None) {
|
||||
// should we call PyObject_HasAttrString()?? rather not and let
|
||||
// python raise an exception because the object doesn't has the
|
||||
// attribute
|
||||
func = PyObject_GetAttrString(delegate, "didBeginEditing");
|
||||
if (func!=NULL && func!=Py_None) {
|
||||
pydata = PyObject_GetAttrString(delegate, "data");
|
||||
if (!pydata) {
|
||||
Py_INCREF(Py_None);
|
||||
pydata = Py_None;
|
||||
}
|
||||
action = (int)WMGetNotificationClientData(notif);
|
||||
arglist = Py_BuildValue("(OOi)", pyobj, pydata, action);
|
||||
result = PyEval_CallObject(func, arglist);
|
||||
Py_DECREF(pydata);
|
||||
Py_DECREF(arglist);
|
||||
Py_XDECREF(result);
|
||||
}
|
||||
Py_XDECREF(func);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
pyTextFieldDidChange(WMTextFieldDelegate *self, WMNotification *notif)
|
||||
{
|
||||
PyObject *pyobj, *delegate, *func, *pydata, *arglist, *tuple, *result;
|
||||
int action;
|
||||
|
||||
tuple = (PyObject*) self->data;
|
||||
pyobj = PyTuple_GetItem(tuple, 0);
|
||||
delegate = PyTuple_GetItem(tuple, 1);
|
||||
if (delegate != Py_None) {
|
||||
func = PyObject_GetAttrString(delegate, "didChange");
|
||||
if (func!=NULL && func!=Py_None) {
|
||||
pydata = PyObject_GetAttrString(delegate, "data");
|
||||
if (!pydata) {
|
||||
Py_INCREF(Py_None);
|
||||
pydata = Py_None;
|
||||
}
|
||||
action = (int)WMGetNotificationClientData(notif);
|
||||
arglist = Py_BuildValue("(OOi)", pyobj, pydata, action);
|
||||
result = PyEval_CallObject(func, arglist);
|
||||
Py_DECREF(pydata);
|
||||
Py_DECREF(arglist);
|
||||
Py_XDECREF(result);
|
||||
}
|
||||
Py_XDECREF(func);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
pyTextFieldDidEndEditing(WMTextFieldDelegate *self, WMNotification *notif)
|
||||
{
|
||||
PyObject *pyobj, *delegate, *func, *pydata, *arglist, *tuple, *result;
|
||||
int action;
|
||||
|
||||
tuple = (PyObject*) self->data;
|
||||
pyobj = PyTuple_GetItem(tuple, 0);
|
||||
delegate = PyTuple_GetItem(tuple, 1);
|
||||
if (delegate != Py_None) {
|
||||
func = PyObject_GetAttrString(delegate, "didEndEditing");
|
||||
if (func!=NULL && func!=Py_None) {
|
||||
pydata = PyObject_GetAttrString(delegate, "data");
|
||||
if (!pydata) {
|
||||
Py_INCREF(Py_None);
|
||||
pydata = Py_None;
|
||||
}
|
||||
action = (int)WMGetNotificationClientData(notif);
|
||||
arglist = Py_BuildValue("(OOi)", pyobj, pydata, action);
|
||||
result = PyEval_CallObject(func, arglist);
|
||||
Py_DECREF(pydata);
|
||||
Py_DECREF(arglist);
|
||||
Py_XDECREF(result);
|
||||
}
|
||||
Py_XDECREF(func);
|
||||
}
|
||||
}
|
||||
|
||||
static Bool
|
||||
pyTextFieldShouldBeginEditing(WMTextFieldDelegate *self, WMTextField *tPtr)
|
||||
{
|
||||
PyObject *pyobj, *delegate, *func, *pydata, *arglist, *tuple, *result;
|
||||
Bool retval = False;
|
||||
|
||||
tuple = (PyObject*) self->data;
|
||||
pyobj = PyTuple_GetItem(tuple, 0);
|
||||
delegate = PyTuple_GetItem(tuple, 1);
|
||||
if (delegate != Py_None) {
|
||||
func = PyObject_GetAttrString(delegate, "shouldBeginEditing");
|
||||
if (func!=NULL && func!=Py_None) {
|
||||
pydata = PyObject_GetAttrString(delegate, "data");
|
||||
if (!pydata) {
|
||||
Py_INCREF(Py_None);
|
||||
pydata = Py_None;
|
||||
}
|
||||
arglist = Py_BuildValue("(OO)", pyobj, pydata);
|
||||
result = PyEval_CallObject(func, arglist);
|
||||
if (result!=Py_None && PyInt_AsLong(result)!=0) {
|
||||
retval = True;
|
||||
}
|
||||
Py_DECREF(pydata);
|
||||
Py_DECREF(arglist);
|
||||
Py_XDECREF(result);
|
||||
}
|
||||
Py_XDECREF(func);
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static Bool
|
||||
pyTextFieldShouldEndEditing(WMTextFieldDelegate *self, WMTextField *tPtr)
|
||||
{
|
||||
PyObject *pyobj, *delegate, *func, *pydata, *arglist, *tuple, *result;
|
||||
Bool retval = False;
|
||||
|
||||
tuple = (PyObject*) self->data;
|
||||
pyobj = PyTuple_GetItem(tuple, 0);
|
||||
delegate = PyTuple_GetItem(tuple, 1);
|
||||
if (delegate != Py_None) {
|
||||
func = PyObject_GetAttrString(delegate, "shouldEndEditing");
|
||||
if (func!=NULL && func!=Py_None) {
|
||||
pydata = PyObject_GetAttrString(delegate, "data");
|
||||
if (!pydata) {
|
||||
Py_INCREF(Py_None);
|
||||
pydata = Py_None;
|
||||
}
|
||||
arglist = Py_BuildValue("(OO)", pyobj, pydata);
|
||||
result = PyEval_CallObject(func, arglist);
|
||||
if (result!=Py_None && PyInt_AsLong(result)!=0) {
|
||||
retval = True;
|
||||
}
|
||||
Py_DECREF(pydata);
|
||||
Py_DECREF(arglist);
|
||||
Py_XDECREF(result);
|
||||
}
|
||||
Py_XDECREF(func);
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
%}
|
||||
|
||||
%inline %{
|
||||
void pyWMSetWindowCloseAction(WMWindow *win, PyObject *pyacArgs) {
|
||||
WMSetWindowCloseAction(win, PythonWMActionCallback, (void*)pyacArgs);
|
||||
Py_INCREF(pyacArgs);
|
||||
}
|
||||
|
||||
void pyWMSetButtonAction(WMButton *bPtr, PyObject *pyacArgs) {
|
||||
WMSetButtonAction(bPtr, PythonWMActionCallback, (void*)pyacArgs);
|
||||
Py_INCREF(pyacArgs);
|
||||
}
|
||||
|
||||
void pyWMSetScrollerAction(WMScroller *sPtr, PyObject *pyacArgs) {
|
||||
WMSetScrollerAction(sPtr, PythonWMActionCallback, (void*)pyacArgs);
|
||||
Py_INCREF(pyacArgs);
|
||||
}
|
||||
|
||||
void pyWMSetListAction(WMList *lPtr, PyObject *pyacArgs) {
|
||||
WMSetListAction(lPtr, PythonWMActionCallback, (void*)pyacArgs);
|
||||
Py_INCREF(pyacArgs);
|
||||
}
|
||||
|
||||
void pyWMSetListDoubleAction(WMList *lPtr, PyObject *pyacArgs) {
|
||||
WMSetListDoubleAction(lPtr, PythonWMActionCallback, (void*)pyacArgs);
|
||||
Py_INCREF(pyacArgs);
|
||||
}
|
||||
|
||||
void pyWMSetBrowserAction(WMBrowser *bPtr, PyObject *pyacArgs) {
|
||||
WMSetBrowserAction(bPtr, PythonWMActionCallback, (void*)pyacArgs);
|
||||
Py_INCREF(pyacArgs);
|
||||
}
|
||||
|
||||
void pyWMSetBrowserDoubleAction(WMBrowser *bPtr, PyObject *pyacArgs) {
|
||||
WMSetBrowserDoubleAction(bPtr, PythonWMActionCallback, (void*)pyacArgs);
|
||||
Py_INCREF(pyacArgs);
|
||||
}
|
||||
|
||||
void pyWMSetMenuItemAction(WMMenuItem *miPtr, PyObject *pyacArgs) {
|
||||
WMSetMenuItemAction(miPtr, PythonWMActionCallback, (void*)pyacArgs);
|
||||
Py_INCREF(pyacArgs);
|
||||
}
|
||||
|
||||
void pyWMSetPopUpButtonAction(WMPopUpButton *pPtr, PyObject *pyacArgs) {
|
||||
WMSetPopUpButtonAction(pPtr, PythonWMActionCallback, (void*)pyacArgs);
|
||||
Py_INCREF(pyacArgs);
|
||||
}
|
||||
|
||||
void pyWMSetSliderAction(WMSlider *sPtr, PyObject *pyacArgs) {
|
||||
WMSetSliderAction(sPtr, PythonWMActionCallback, (void*)pyacArgs);
|
||||
Py_INCREF(pyacArgs);
|
||||
}
|
||||
|
||||
void pyWMSetRulerMoveAction(WMRuler *rPtr, PyObject *pyacArgs) {
|
||||
WMSetRulerMoveAction(rPtr, PythonWMActionCallback, (void*)pyacArgs);
|
||||
Py_INCREF(pyacArgs);
|
||||
}
|
||||
|
||||
void pyWMSetRulerReleaseAction(WMRuler *rPtr, PyObject *pyacArgs) {
|
||||
WMSetRulerReleaseAction(rPtr, PythonWMActionCallback, (void*)pyacArgs);
|
||||
Py_INCREF(pyacArgs);
|
||||
}
|
||||
|
||||
void pyWMSetColorPanelAction(WMColorPanel *panel, PyObject *pyacArgs) {
|
||||
WMSetColorPanelAction(panel, (WMAction2*)PythonWMActionCallback, (void*)pyacArgs);
|
||||
Py_INCREF(pyacArgs);
|
||||
}
|
||||
|
||||
void* pyWMAddTimerHandler(int miliseconds, PyObject *pycArgs) {
|
||||
Py_INCREF(pycArgs);
|
||||
return (void*)WMAddTimerHandler(miliseconds, PythonWMCallback,
|
||||
(void*)pycArgs);
|
||||
}
|
||||
|
||||
void* pyWMAddPersistentTimerHandler(int miliseconds, PyObject *pycArgs) {
|
||||
Py_INCREF(pycArgs);
|
||||
return (void*)WMAddPersistentTimerHandler(miliseconds, PythonWMCallback,
|
||||
(void*)pycArgs);
|
||||
}
|
||||
|
||||
/* this doesn't work. we pass (func, data) as cdata at creation time, but
|
||||
* only data at destruction, so it won't find it unless we change
|
||||
* WMDeleteTimerWithClientData() to extract data from the tuple, and this
|
||||
* requires access to the internals of WINGs
|
||||
void pyWMDeleteTimerWithClientData(PyObject *pycData) {
|
||||
WMDeleteTimerWithClientData((void*)pycData);
|
||||
}*/
|
||||
|
||||
void pyWMDeleteTimerHandler(void *handlerID) {
|
||||
WMDeleteTimerHandler((WMHandlerID)handlerID);
|
||||
}
|
||||
|
||||
void* pyWMAddIdleHandler(PyObject *pycArgs) {
|
||||
Py_INCREF(pycArgs);
|
||||
return (void*)WMAddIdleHandler(PythonWMCallback, (void*)pycArgs);
|
||||
}
|
||||
|
||||
void pyWMDeleteIdleHandler(void *handlerID) {
|
||||
WMDeleteIdleHandler((WMHandlerID)handlerID);
|
||||
}
|
||||
|
||||
%}
|
||||
|
||||
|
||||
%exception pyWMSetTextFieldDelegate {
|
||||
$function
|
||||
if (PyErr_Occurred()) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
%inline %{
|
||||
void pyWMSetTextFieldDelegate(WMTextField *tPtr, PyObject *txtArgs) {
|
||||
WMTextFieldDelegate *td;
|
||||
|
||||
if (!txtArgs || !PyTuple_Check(txtArgs) || PyTuple_Size(txtArgs)!=2) {
|
||||
PyErr_SetString(PyExc_TypeError, "invalid setting of WMTextField "
|
||||
"delegate. Should be '(self, delegate)'");
|
||||
return;
|
||||
}
|
||||
// how do I check if txtArgs[1] is an instance of WMTextFieldDelegate?
|
||||
td = WMGetTextFieldDelegate(tPtr);
|
||||
if (!td) {
|
||||
td = (WMTextFieldDelegate*)wmalloc(sizeof(WMTextFieldDelegate));
|
||||
td->didBeginEditing = pyTextFieldDidBeginEditing;
|
||||
td->didChange = pyTextFieldDidChange;
|
||||
td->didEndEditing = pyTextFieldDidEndEditing;
|
||||
td->shouldBeginEditing = pyTextFieldShouldBeginEditing;
|
||||
td->shouldEndEditing = pyTextFieldShouldEndEditing;
|
||||
} else {
|
||||
Py_XDECREF((PyObject*)td->data);
|
||||
}
|
||||
Py_INCREF(txtArgs);
|
||||
td->data = txtArgs;
|
||||
WMSetTextFieldDelegate(tPtr, td);
|
||||
}
|
||||
%}
|
||||
|
||||
|
||||
%inline %{
|
||||
PyObject* pyWMGetTextFieldDelegate(WMTextField *tPtr) {
|
||||
WMTextFieldDelegate *td;
|
||||
PyObject *result, *tuple;
|
||||
|
||||
td = WMGetTextFieldDelegate(tPtr);
|
||||
if (!td) {
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
}
|
||||
|
||||
tuple = (PyObject*)td->data;
|
||||
if (!tuple || !PyTuple_Check(tuple) || PyTuple_Size(tuple)!=2) {
|
||||
PyErr_SetString(PyExc_TypeError, "invalid TextField delegate");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
result = PyTuple_GetItem(tuple, 1);
|
||||
if (!result)
|
||||
result = Py_None;
|
||||
|
||||
Py_INCREF(result);
|
||||
|
||||
return result;
|
||||
}
|
||||
%}
|
||||
|
||||
|
||||
%apply int *INPUT { int *argc };
|
||||
|
||||
#define Bool int
|
||||
|
||||
%include "WINGs/WUtil.h"
|
||||
|
||||
%include "WINGs/WINGs.h"
|
||||
|
||||
%{
|
||||
void
|
||||
WHandleEvents()
|
||||
{
|
||||
/* Check any expired timers */
|
||||
W_CheckTimerHandlers();
|
||||
|
||||
/* Do idle and timer stuff while there are no input events */
|
||||
/* Do not wait for input here. just peek to se if input is available */
|
||||
while (!W_HandleInputEvents(False, -1) && W_CheckIdleHandlers()) {
|
||||
/* dispatch timer events */
|
||||
W_CheckTimerHandlers();
|
||||
}
|
||||
|
||||
W_HandleInputEvents(True, -1);
|
||||
|
||||
/* Check any expired timers */
|
||||
W_CheckTimerHandlers();
|
||||
}
|
||||
%}
|
||||
|
||||
/* rewrite functions originally defined as macros */
|
||||
%inline %{
|
||||
#undef WMDuplicateArray
|
||||
WMArray* WMDuplicateArray(WMArray* array) {
|
||||
return WMCreateArrayWithArray(array);
|
||||
}
|
||||
|
||||
#undef WMPushInArray
|
||||
void WMPushInArray(WMArray *array, void *item) {
|
||||
WMAddToArray(array, item);
|
||||
}
|
||||
|
||||
#undef WMSetInArray
|
||||
void* WMSetInArray(WMArray *array, int index, void *item) {
|
||||
return WMReplaceInArray(array, index, item);
|
||||
}
|
||||
|
||||
#undef WMRemoveFromArray
|
||||
int WMRemoveFromArray(WMArray *array, void *item) {
|
||||
return WMRemoveFromArrayMatching(array, NULL, item);
|
||||
}
|
||||
|
||||
#undef WMGetFirstInArray
|
||||
int WMGetFirstInArray(WMArray *array, void *item) {
|
||||
return WMFindInArray(array, NULL, item);
|
||||
}
|
||||
|
||||
#undef WMCreateBag
|
||||
WMBag* WMCreateBag(int size) {
|
||||
return WMCreateTreeBag();
|
||||
}
|
||||
|
||||
#undef WMCreateBagWithDestructor
|
||||
WMBag* WMCreateBagWithDestructor(int size, WMFreeDataProc *destructor) {
|
||||
return WMCreateTreeBagWithDestructor(destructor);
|
||||
}
|
||||
|
||||
#undef WMSetInBag
|
||||
void* WMSetInBag(WMBag *bag, int index, void *item) {
|
||||
return WMReplaceInBag(bag, index, item);
|
||||
}
|
||||
|
||||
#undef WMAddItemToTree
|
||||
WMTreeNode* WMAddItemToTree(WMTreeNode *parent, void *item) {
|
||||
return WMInsertItemInTree(parent, -1, item);
|
||||
}
|
||||
|
||||
#undef WMAddNodeToTree
|
||||
WMTreeNode* WMAddNodeToTree(WMTreeNode *parent, WMTreeNode *aNode) {
|
||||
return WMInsertNodeInTree(parent, -1, aNode);
|
||||
}
|
||||
|
||||
#undef WMGetFirstInTree
|
||||
/* Returns first tree node that has data == cdata */
|
||||
WMTreeNode* WMGetFirstInTree(WMTreeNode *aTree, void *cdata) {
|
||||
return WMFindInTree(aTree, NULL, cdata);
|
||||
}
|
||||
|
||||
#undef WMFlushConnection
|
||||
int WMFlushConnection(WMConnection *cPtr) {
|
||||
return WMSendConnectionData(cPtr, NULL);
|
||||
}
|
||||
|
||||
#undef WMGetConnectionQueuedData
|
||||
WMArray* WMGetConnectionQueuedData(WMConnection *cPtr) {
|
||||
return WMGetConnectionUnsentData(cPtr);
|
||||
}
|
||||
|
||||
#undef WMWidgetClass
|
||||
W_Class WMWidgetClass(WMWidget *widget) {
|
||||
return (((W_WidgetType*)(widget))->widgetClass);
|
||||
}
|
||||
|
||||
#undef WMWidgetView
|
||||
WMView* WMWidgetView(WMWidget *widget) {
|
||||
return (((W_WidgetType*)(widget))->view);
|
||||
}
|
||||
|
||||
#undef WMCreateCommandButton
|
||||
WMButton* WMCreateCommandButton(WMWidget *parent) {
|
||||
return WMCreateCustomButton(parent, WBBSpringLoadedMask|WBBPushInMask
|
||||
|WBBPushLightMask|WBBPushChangeMask);
|
||||
}
|
||||
|
||||
#undef WMCreateRadioButton
|
||||
WMButton* WMCreateRadioButton(WMWidget *parent) {
|
||||
return WMCreateButton(parent, WBTRadio);
|
||||
}
|
||||
|
||||
#undef WMCreateSwitchButton
|
||||
WMButton* WMCreateSwitchButton(WMWidget *parent) {
|
||||
return WMCreateButton(parent, WBTSwitch);
|
||||
}
|
||||
|
||||
#undef WMAddListItem
|
||||
WMListItem* WMAddListItem(WMList *lPtr, char *text)
|
||||
{
|
||||
return WMInsertListItem(lPtr, -1, text);
|
||||
}
|
||||
|
||||
#undef WMCreateText
|
||||
WMText* WMCreateText(WMWidget *parent) {
|
||||
return WMCreateTextForDocumentType(parent, NULL, NULL);
|
||||
}
|
||||
|
||||
#undef WMRefreshText
|
||||
void WMRefreshText(WMText *tPtr) {
|
||||
return WMThawText(tPtr);
|
||||
}
|
||||
|
||||
#undef WMClearText
|
||||
void WMClearText(WMText *tPtr) {
|
||||
return WMAppendTextStream(tPtr, NULL);
|
||||
}
|
||||
%}
|
||||
|
||||
|
||||
644
WINGs/python/WINGs.py
Normal file
644
WINGs/python/WINGs.py
Normal file
@@ -0,0 +1,644 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import sys
|
||||
import wings
|
||||
import exceptions
|
||||
from types import *
|
||||
|
||||
# check about None as action for buttonAction/windowCloseAction ...
|
||||
|
||||
################################################################################
|
||||
# Exceptions
|
||||
################################################################################
|
||||
class Error(exceptions.Exception):
|
||||
def __init__(self, msg):
|
||||
self.msg = msg
|
||||
def __str__(self):
|
||||
return self.msg
|
||||
__repr__ = __str__
|
||||
|
||||
class WMTimer:
|
||||
def __init__(self, milliseconds, callback, cdata=None, persistent=0):
|
||||
if persistent:
|
||||
self._o = wings.pyWMAddPersistentTimerHandler(milliseconds, (callback, cdata))
|
||||
else:
|
||||
self._o = wings.pyWMAddTimerHandler(milliseconds, (callback, cdata))
|
||||
|
||||
def __del__(self):
|
||||
wings.pyWMDeleteTimerHandler(self._o)
|
||||
#delete = __del__
|
||||
|
||||
class WMPersistentTimer(WMTimer):
|
||||
def __init__(self, milliseconds, callback, cdata=None):
|
||||
WMTimer.__init__(self, milliseconds, callback, cdata, persistent=1)
|
||||
|
||||
|
||||
class WMScreen:
|
||||
__readonly = ('display', 'width', 'height', 'depth')
|
||||
|
||||
def __init__(self, appname, display="", simpleapp=0):
|
||||
wings.WMInitializeApplication(appname, len(sys.argv), sys.argv)
|
||||
self._o = wings.pyWMOpenScreen(display, simpleapp)
|
||||
self.__dict__['display'] = wings.WMScreenDisplay(self._o)
|
||||
self.__dict__['width'] = wings.WMScreenWidth(self._o)
|
||||
self.__dict__['height'] = wings.WMScreenHeight(self._o)
|
||||
self.__dict__['depth'] = wings.WMScreenDepth(self._o)
|
||||
|
||||
def __setattr__(self, name ,value):
|
||||
if name in self.__readonly:
|
||||
#raise AttributeError, "'%s' is a read-only WMScreen attribute" % name
|
||||
raise Error, "'%s' is a read-only WMScreen attribute" % name
|
||||
self.__dict__[name] = value
|
||||
|
||||
def mainLoop(self):
|
||||
wings.pyWMScreenMainLoop(self._o)
|
||||
|
||||
def breakMainLoop(self):
|
||||
wings.pyWMBreakScreenMainLoop(self._o)
|
||||
|
||||
def runModalLoop(self, view):
|
||||
wings.pyWMRunModalLoop(self._o, view)
|
||||
|
||||
def breakModalLoop(self):
|
||||
wings.WMBreakModalLoop(self._o)
|
||||
|
||||
def size(self):
|
||||
return (self.width, self.height)
|
||||
|
||||
|
||||
class WMView:
|
||||
pass
|
||||
|
||||
|
||||
class WMWidget(WMView):
|
||||
def __init__(self):
|
||||
self._o = None
|
||||
if self.__class__ == WMWidget:
|
||||
raise Error, "a WMWidget can't be instantiated directly"
|
||||
|
||||
def __del__(self):
|
||||
if (self._o != None):
|
||||
wings.WMDestroyWidget(self._o)
|
||||
|
||||
def resize(self, width, height):
|
||||
wings.WMResizeWidget(self._o, width, height)
|
||||
|
||||
def move(self, x, y):
|
||||
wings.WMMoveWidget(self._o, x, y)
|
||||
|
||||
def realize(self):
|
||||
wings.WMRealizeWidget(self._o)
|
||||
|
||||
def show(self):
|
||||
wings.WMMapWidget(self._o)
|
||||
|
||||
def hide(self):
|
||||
wings.WMUnmapWidget(self._o)
|
||||
|
||||
def redisplay(self):
|
||||
wings.WMRedisplayWidget(self._o)
|
||||
|
||||
def width(self):
|
||||
return wings.WMWidgetWidth(self._o)
|
||||
|
||||
def height(self):
|
||||
return wings.WMWidgetHeight(self._o)
|
||||
|
||||
def screen(self):
|
||||
return wings.WMWidgetScreen(self._o)
|
||||
|
||||
def view(self):
|
||||
return wings.WMWidgetView(self._o)
|
||||
|
||||
def setFocusTo(self, other):
|
||||
wings.WMSetFocusToWidget(other._o)
|
||||
|
||||
|
||||
class WMWindow(WMWidget):
|
||||
def __init__(self, screen, name, style=wings.WMTitledWindowMask
|
||||
|wings.WMClosableWindowMask|wings.WMMiniaturizableWindowMask
|
||||
|wings.WMResizableWindowMask):
|
||||
WMWidget.__init__(self)
|
||||
self._o = wings.WMCreateWindowWithStyle(screen._o, name, style)
|
||||
|
||||
def setMinSize(self, minWidth, minHeight):
|
||||
wings.WMSetWindowMinSize(self._o, minWidth, minHeight)
|
||||
|
||||
def setMaxSize(self, maxWidth, maxHeight):
|
||||
wings.WMSetWindowMaxSize(self._o, maxWidth, maxHeight)
|
||||
|
||||
def setInitialPosition(self, x, y):
|
||||
wings.WMSetWindowInitialPosition(self._o, x, y)
|
||||
|
||||
def setTitle(self, title):
|
||||
wings.WMSetWindowTitle(self._o, title)
|
||||
|
||||
def setCloseAction(self, action, data=None):
|
||||
if action!=None and (not callable(action)):
|
||||
raise Error, "action needs to be a callable object or None"
|
||||
wings.pyWMSetWindowCloseAction(self._o, (self, action, data))
|
||||
|
||||
|
||||
class WMPanel(WMWindow):
|
||||
def __init__(self, owner, name, style=wings.WMTitledWindowMask
|
||||
|wings.WMClosableWindowMask|wings.WMResizableWindowMask):
|
||||
WMWidget.__init__(self)
|
||||
self._o = wings.WMCreatePanelWithStyleForWindow(owner._o, name, style)
|
||||
|
||||
class WMFrame(WMWidget):
|
||||
def __init__(self, parent, title=None):
|
||||
WMWidget.__init__(self)
|
||||
self._o = wings.WMCreateFrame(parent._o)
|
||||
self.setTitle(title)
|
||||
|
||||
def setRelief(self, relief):
|
||||
wings.WMSetFrameRelief(self._o, relief)
|
||||
|
||||
def setTitle(self, title=None):
|
||||
title = title or ""
|
||||
assert type(title)==StringType
|
||||
wings.WMSetFrameTitle(self._o, title)
|
||||
|
||||
def setTitlePosition(self, position):
|
||||
wings.WMSetFrameTitlePosition(self._o, position)
|
||||
|
||||
class WMLabel(WMWidget):
|
||||
def __init__(self, parent, text=None):
|
||||
WMWidget.__init__(self)
|
||||
self._o = wings.WMCreateLabel(parent._o)
|
||||
self.setText(text)
|
||||
|
||||
def setWraps(self, flag):
|
||||
assert type(flag)==IntType
|
||||
wings.WMSetLabelWraps(self._o, flag)
|
||||
|
||||
def setRelief(self, relief):
|
||||
wings.WMSetLabelRelief(self._o, relief)
|
||||
|
||||
def setText(self, text=None):
|
||||
text = text or ""
|
||||
assert type(text)==StringType
|
||||
wings.WMSetLabelText(self._o, text)
|
||||
|
||||
def setTextColor(self, color):
|
||||
wings.WMSetLabelTextColor(self._o, color)
|
||||
|
||||
def setFont(self, font):
|
||||
wings.WMSetLabelFont(self._o, font)
|
||||
|
||||
def setTextAlignment(self, alignment):
|
||||
wings.WMSetLabelTextAlignment(self._o, alignment)
|
||||
|
||||
def setImage(self, image):
|
||||
wings.WMSetLabelImage(self._o, image)
|
||||
|
||||
def setImagePosition(self, position):
|
||||
wings.WMSetLabelImagePosition(self._o, position)
|
||||
|
||||
def text(self):
|
||||
return wings.WMGetLabelText(self._o)
|
||||
|
||||
def font(self):
|
||||
return wings.WMGetLabelFont(self._o)
|
||||
|
||||
def image(self):
|
||||
return wings.WMGetLabelImage(self._o)
|
||||
|
||||
|
||||
class WMBox(WMWidget):
|
||||
def __init__(self, parent):
|
||||
WMWidget.__init__(self)
|
||||
self._o = wings.WMCreateBox(parent._o)
|
||||
|
||||
def setHorizontal(self, flag):
|
||||
assert type(flag)==IntType
|
||||
wings.WMSetBoxHorizontal(self._o, flag)
|
||||
|
||||
def setBorderWidth(self, width):
|
||||
assert type(width)==IntType
|
||||
wings.WMSetBoxBorderWidth(self._o, width)
|
||||
|
||||
def addSubview(self, view, expand, fill, minSize, maxSize, space):
|
||||
wings.WMAddBoxSubview(self._o, view, expand, fill, minSize, maxSixe, space)
|
||||
|
||||
def addSubviewAtEnd(self, view, expand, fill, minSize, maxSize, space):
|
||||
wings.WMAddBoxSubviewAtEnd(self._o, view, expand, fill, minSize, maxSixe, space)
|
||||
|
||||
def removeSubview(self, view):
|
||||
wings.WMRemoveBoxSubview(self._o, view)
|
||||
|
||||
|
||||
class WMButton(WMWidget): # not for user instantiation
|
||||
def __init__(self, parent):
|
||||
WMWidget.__init__(self)
|
||||
if self.__class__ == WMButton:
|
||||
raise Error, "a WMButton can't be instantiated directly"
|
||||
|
||||
|
||||
def setText(self, text):
|
||||
assert type(text) == StringType
|
||||
wings.WMSetButtonText(self._o, text)
|
||||
|
||||
def setAction(self, action, data=None):
|
||||
if action!=None and (not callable(action)):
|
||||
raise Error, "action needs to be a callable object or None"
|
||||
wings.pyWMSetButtonAction(self._o, (self, action, data))
|
||||
|
||||
def performClick(self):
|
||||
wings.WMPerformButtonClick(self._o)
|
||||
|
||||
def setEnabled(self, flag):
|
||||
assert type(flag) == IntType
|
||||
wings.WMSetButtonEnabled(self._o, flag)
|
||||
|
||||
def isEnabled(self):
|
||||
return wings.WMGetButtonEnabled(self._o)
|
||||
|
||||
def setImageDimsWhenDisabled(self, flag):
|
||||
assert type(flag) == IntType
|
||||
wings.WMSetButtonImageDimsWhenDisabled(self._o, flag)
|
||||
|
||||
def setImage(self, image):
|
||||
wings.WMSetButtonImage(self_.o, image)
|
||||
|
||||
def setAlternateImage(self, image):
|
||||
wings.WMSetButtonAltImage(self._o, image)
|
||||
|
||||
def setImagePosition(self, position):
|
||||
wings.WMSetButtonImagePosition(self._o, position)
|
||||
|
||||
def setImageDefault(self):
|
||||
wings.WMSetButtonImageDefault(self._o)
|
||||
|
||||
|
||||
class WMCommandButton(WMButton):
|
||||
def __init__(self, parent):
|
||||
WMButton.__init__(self, parent)
|
||||
self._o = wings.WMCreateCommandButton(parent._o)
|
||||
|
||||
|
||||
class WMSwitchButton(WMButton):
|
||||
def __init__(self, parent):
|
||||
WMButton.__init__(self, parent)
|
||||
self._o = wings.WMCreateSwitchButton(parent._o)
|
||||
|
||||
|
||||
class WMRadioButton(WMButton):
|
||||
def __init__(self, parent, group=None):
|
||||
WMButton.__init__(self, parent)
|
||||
self._o = wings.WMCreateRadioButton(parent._o)
|
||||
if group:
|
||||
wings.WMGroupButtons(group._o, self._o)
|
||||
|
||||
|
||||
class WMListItem:
|
||||
pass
|
||||
|
||||
|
||||
class WMList(WMWidget):
|
||||
def __init__(self, parent):
|
||||
WMWidget.__init__(self)
|
||||
self._o = wings.WMCreateList(parent._o)
|
||||
|
||||
def allowEmptySelection(self, flag):
|
||||
assert type(flag) == IntType
|
||||
wings.WMSetListAllowEmptySelection(self._o, flag)
|
||||
|
||||
def allowMultipleSelection(self, flag):
|
||||
assert type(flag) == IntType
|
||||
wings.WMSetListAllowMultipleSelection(self._o, flag)
|
||||
|
||||
def addItem(self, item):
|
||||
assert type(item) == StringType
|
||||
wings.WMAddListItem(self._o, item)
|
||||
|
||||
def insertItem(self, row, item):
|
||||
assert type(row) == IntType and type(item) == StringType
|
||||
wings.WMAddListItem(self._o, item)
|
||||
|
||||
def sortItems(self):
|
||||
wings.WMSortListItems(self._o)
|
||||
|
||||
def rowWithTitle(self, title):
|
||||
assert type(title) == StringType
|
||||
return wings.WMFindRowOfListItemWithTitle(self._o, title)
|
||||
|
||||
def selectedItemRow(self):
|
||||
return wings.WMGetListSelectedItemRow(self._o)
|
||||
|
||||
def selectedItem(self):
|
||||
return wings.WMGetListSelectedItem(self._o)
|
||||
|
||||
def removeItem(self, index):
|
||||
assert type(index)==IntType
|
||||
wings.WMRemoveListItem(self._o, index)
|
||||
|
||||
def selectItem(self, index):
|
||||
assert type(index)==IntType
|
||||
wings.WMSelectListItem(self._o, index)
|
||||
|
||||
def unselectItem(self, index):
|
||||
assert type(index)==IntType
|
||||
wings.WMUnselectListItem(self._o, index)
|
||||
|
||||
|
||||
class WMTextFieldDelegate:
|
||||
__callbacks = ('didBeginEditing', 'didChange', 'didEndEditing',
|
||||
'shouldBeginEditing', 'shouldEndEditing')
|
||||
|
||||
def __init__(self):
|
||||
self.__dict__['data'] = None
|
||||
self.__dict__['didBeginEditing'] = None
|
||||
self.__dict__['didChange'] = None
|
||||
self.__dict__['didEndEditing'] = None
|
||||
self.__dict__['shouldBeginEditing'] = None
|
||||
self.__dict__['shouldEndEditing'] = None
|
||||
|
||||
def __setattr__(self, name ,value):
|
||||
if name in self.__callbacks and value!=None and (not callable(value)):
|
||||
#raise AttributeError, "%s.%s needs to be a callable object or None" % (self.__class__.__name__, name)
|
||||
raise Error, "%s.%s needs to be a callable object or None" % (self.__class__.__name__, name)
|
||||
else:
|
||||
self.__dict__[name] = value
|
||||
|
||||
|
||||
class WMTextField(WMWidget):
|
||||
def __init__(self, parent, text=None):
|
||||
WMWidget.__init__(self)
|
||||
self._o = wings.WMCreateTextField(parent._o)
|
||||
text = text or ""
|
||||
assert type(text) == StringType
|
||||
wings.WMSetTextFieldText(self._o, text)
|
||||
|
||||
def setDelegate(self, delegate):
|
||||
if delegate.__class__ != WMTextFieldDelegate:
|
||||
raise Error, "textfield delegate must be of type 'WMTextFieldDelegate'"
|
||||
wings.pyWMSetTextFieldDelegate(self._o, (self, delegate))
|
||||
|
||||
def delegate(self):
|
||||
return wings.pyWMGetTextFieldDelegate(self._o)
|
||||
|
||||
def text(self):
|
||||
return wings.WMGetTextFieldText(self._o)
|
||||
|
||||
def setEditable(self, flag):
|
||||
assert type(flag) == IntType
|
||||
wings.WMSetTextFieldEditable(self._o, flag)
|
||||
|
||||
def setBordered(self, flag):
|
||||
assert type(flag) == IntType
|
||||
wings.WMSetTextFieldBordered(self._o, flag)
|
||||
|
||||
def setBeveled(self, flag):
|
||||
assert type(flag) == IntType
|
||||
wings.WMSetTextFieldBeveled(self._o, flag)
|
||||
|
||||
def setSecure(self, flag):
|
||||
assert type(flag) == IntType
|
||||
wings.WMSetTextFieldSecure(self._o, flag)
|
||||
|
||||
def setCursorPosition(self, position):
|
||||
assert type(position) == IntType
|
||||
wings.WMSetTextFieldCursorPosition(self._o, position)
|
||||
|
||||
def setNextText(self, next):
|
||||
wings.WMSetTextFieldNextTextField(self._o, next._o)
|
||||
|
||||
def setPreviousText(self, previous):
|
||||
wings.WMSetTextFieldPrevTextField(self._o, previous._o)
|
||||
|
||||
def setTextAlignment(self, alignment):
|
||||
wings.WMSetTextFieldAlignment(self._o, alignment)
|
||||
|
||||
def isEditable(self):
|
||||
return wings.WMGetTextFieldEditable(self._o)
|
||||
|
||||
def insertText(self, text, position):
|
||||
assert type(text)==StringType and type(position)==IntType
|
||||
wings.WMInsertTextFieldText(self._o, text, position)
|
||||
|
||||
def deleteText(self, start, count):
|
||||
assert type(start)==IntType and type(count)==IntType
|
||||
wings.WMDeleteTextFieldRange(self._o, wings.wmkrange(start, count))
|
||||
|
||||
def selectText(self, start, count):
|
||||
assert type(start)==IntType and type(count)==IntType
|
||||
wings.WMSelectTextFieldRange(self._o, wings.wmkrange(start, count))
|
||||
|
||||
def setFont(self, font):
|
||||
wings.WMSetTextFieldFont(self._o, font)
|
||||
|
||||
def font(self):
|
||||
return wings.WMGettextFieldFont(self._o)
|
||||
|
||||
|
||||
################################################################################
|
||||
# wrap the WINGs constants so we don't need wings.constant_name
|
||||
################################################################################
|
||||
|
||||
# WMWindow title style
|
||||
WMTitledWindowMask = wings.WMTitledWindowMask
|
||||
WMClosableWindowMask = wings.WMClosableWindowMask
|
||||
WMMiniaturizableWindowMask = wings.WMMiniaturizableWindowMask
|
||||
WMResizableWindowMask = wings.WMResizableWindowMask
|
||||
|
||||
# WMFrame title positions
|
||||
WTPNoTitle = wings.WTPNoTitle
|
||||
WTPAboveTop = wings.WTPAboveTop
|
||||
WTPAtTop = wings.WTPAtTop
|
||||
WTPBelowTop = wings.WTPBelowTop
|
||||
WTPAboveBottom = wings.WTPAboveBottom
|
||||
WTPAtBottom = wings.WTPAtBottom
|
||||
WTPBelowBottom = wings.WTPBelowBottom
|
||||
|
||||
# Alingments
|
||||
WALeft = wings.WALeft
|
||||
WACenter = wings.WACenter
|
||||
WARight = wings.WARight
|
||||
WAJustified = wings.WAJustified # not valid for textfields
|
||||
|
||||
# Image positions
|
||||
WIPNoImage = wings.WIPNoImage
|
||||
WIPImageOnly = wings.WIPImageOnly
|
||||
WIPLeft = wings.WIPLeft
|
||||
WIPRight = wings.WIPRight
|
||||
WIPBelow = wings.WIPBelow
|
||||
WIPAbove = wings.WIPAbove
|
||||
WIPOverlaps = wings.WIPOverlaps
|
||||
|
||||
# Relief types
|
||||
WRFlat = wings.WRFlat
|
||||
WRSimple = wings.WRSimple
|
||||
WRRaised = wings.WRRaised
|
||||
WRSunken = wings.WRSunken
|
||||
WRGroove = wings.WRGroove
|
||||
WRRidge = wings.WRRidge
|
||||
WRPushed = wings.WRPushed
|
||||
|
||||
|
||||
# TextField events
|
||||
WMReturnTextMovement = wings.WMReturnTextMovement
|
||||
WMEscapeTextMovement = wings.WMEscapeTextMovement
|
||||
WMIllegalTextMovement = wings.WMIllegalTextMovement
|
||||
WMTabTextMovement = wings.WMTabTextMovement
|
||||
WMBacktabTextMovement = wings.WMBacktabTextMovement
|
||||
WMLeftTextMovement = wings.WMLeftTextMovement
|
||||
WMRightTextMovement = wings.WMRightTextMovement
|
||||
WMUpTextMovement = wings.WMUpTextMovement
|
||||
WMDownTextMovement = wings.WMDownTextMovement
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
def quit(obj, data):
|
||||
#sys.exit()
|
||||
scr.breakMainLoop()
|
||||
|
||||
def click(btn, list):
|
||||
print win.width(), win.height()
|
||||
print list.selectedItemRow()
|
||||
win2.show()
|
||||
scr.runModalLoop(win2.view())
|
||||
print txt2.text()
|
||||
|
||||
def sayhi(btn, data):
|
||||
print "hi"
|
||||
|
||||
def breakLoop(btn, data):
|
||||
#sys.exit()
|
||||
scr.breakModalLoop()
|
||||
win2.hide()
|
||||
|
||||
def dc(object, data, action):
|
||||
print "didChnage:", object, data, action
|
||||
|
||||
def dbe(object, data, action):
|
||||
print "didBeginEditing:", object, data, action
|
||||
|
||||
def dee(object, data, action):
|
||||
if action == wings.WMReturnTextMovement:
|
||||
if object == txt:
|
||||
object.setFocusTo(txt2)
|
||||
else:
|
||||
object.setFocusTo(txt)
|
||||
print "didEndEditing:", object, data, action, txt.text()
|
||||
|
||||
def tcb(one):
|
||||
old = list.selectedItemRow()
|
||||
list.selectItem(list.index)
|
||||
list.unselectItem(old)
|
||||
list.index = (list.index+1) % 3
|
||||
#print one
|
||||
|
||||
scr = WMScreen("foobar")
|
||||
win = WMWindow(scr, "aWindow")
|
||||
win.setCloseAction(quit)
|
||||
win.setTitle("test window")
|
||||
win.resize(400, 180)
|
||||
win.setInitialPosition((scr.width-win.width())/2, (scr.height-win.height())/2)
|
||||
|
||||
btn = WMCommandButton(win)
|
||||
btn.setText("Click Me")
|
||||
btn.resize(100, 25)
|
||||
btn.move(20, 20)
|
||||
btn.show()
|
||||
|
||||
sw = WMSwitchButton(win)
|
||||
sw.setText("Some option")
|
||||
sw.resize(100, 25)
|
||||
sw.move(20, 50)
|
||||
sw.show()
|
||||
|
||||
radios = []
|
||||
r = None
|
||||
j = 0
|
||||
for i in ["One", "Two", "Four"]:
|
||||
r = WMRadioButton(win, r)
|
||||
radios.append(r)
|
||||
r.show()
|
||||
r.setText(i)
|
||||
r.move(20, 70+j*25)
|
||||
r.resize(100, 25)
|
||||
j=j+1
|
||||
|
||||
sw.setAction(sayhi)
|
||||
|
||||
list = WMList(win)
|
||||
list.resize(100,100)
|
||||
list.move(130, 20)
|
||||
list.addItem("one")
|
||||
list.addItem("two")
|
||||
list.addItem("three")
|
||||
list.allowMultipleSelection(1)
|
||||
list.show()
|
||||
list.index = 0
|
||||
|
||||
txtdel = WMTextFieldDelegate()
|
||||
txtdel.data = 'mydata'
|
||||
txtdel.didBeginEditing = dbe
|
||||
txtdel.didEndEditing = dee
|
||||
txtdel.didChange = dc
|
||||
|
||||
txt = WMTextField(win, "abc")
|
||||
txt.resize(95, 20)
|
||||
txt.move(295, 20)
|
||||
txt.setDelegate(txtdel)
|
||||
txt.show()
|
||||
txt2 = WMTextField(win, "01234567890")
|
||||
txt2.resize(95, 20)
|
||||
txt2.move(295, 45)
|
||||
txt2.setDelegate(txtdel)
|
||||
txt2.show()
|
||||
|
||||
txt.setNextText(txt2)
|
||||
txt2.setNextText(txt)
|
||||
|
||||
label = WMLabel(win, "Text1:")
|
||||
label.setTextAlignment(WARight)
|
||||
label.move(240, 20)
|
||||
label.resize(55, 20)
|
||||
label.show()
|
||||
|
||||
label2 = WMLabel(win, "mytext2:")
|
||||
label2.setTextAlignment(WARight)
|
||||
label2.move(240, 45)
|
||||
label2.resize(55, 20)
|
||||
label2.show()
|
||||
|
||||
btn.setAction(click, list)
|
||||
|
||||
frame = WMFrame(win, "My Frame")
|
||||
frame.resize(150, 50)
|
||||
frame.move(240, 70)
|
||||
#frame.setRelief(WRPushed)
|
||||
frame.show()
|
||||
|
||||
ebtn = WMCommandButton(win)
|
||||
ebtn.setText("Exit")
|
||||
ebtn.resize(100, 25)
|
||||
ebtn.move(290, 147)
|
||||
ebtn.setAction(quit)
|
||||
ebtn.show()
|
||||
|
||||
win.realize()
|
||||
win.show()
|
||||
|
||||
timer = WMPersistentTimer(1000, tcb, win)
|
||||
#del(timer)
|
||||
#timer.delete()
|
||||
|
||||
win2 = WMPanel(win, "anotherWindow", WMTitledWindowMask)
|
||||
win2.setTitle("transient test window")
|
||||
win2.resize(150, 50)
|
||||
win2.setInitialPosition((scr.width-win2.width())/2, (scr.height-win2.height())/2)
|
||||
|
||||
btn7 = WMCommandButton(win2)
|
||||
btn7.setText("Dismiss")
|
||||
btn7.resize(100, 25)
|
||||
btn7.move(27, 10)
|
||||
btn7.show()
|
||||
btn7.setAction(breakLoop)
|
||||
|
||||
win2.realize()
|
||||
|
||||
scr.mainLoop()
|
||||
|
||||
72
WINGs/python/setup.py
Executable file
72
WINGs/python/setup.py
Executable file
@@ -0,0 +1,72 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
"""Setup script for the WINGs module distribution."""
|
||||
|
||||
import os, sys
|
||||
from distutils.core import setup
|
||||
from distutils.extension import Extension
|
||||
|
||||
## Get the include dirs
|
||||
wings = os.popen("get-wings-flags --cflags", "r")
|
||||
lines = [x.strip() for x in wings.readlines()]
|
||||
flags = reduce(lambda x,y: x+y, [x.split() for x in lines if x])
|
||||
include_dirs = [x[2:] for x in flags]
|
||||
wings.close()
|
||||
|
||||
## Get the library dirs
|
||||
wings = os.popen("get-wings-flags --ldflags", "r")
|
||||
lines = [x.strip() for x in wings.readlines()]
|
||||
flags = reduce(lambda x,y: x+y, [x.split() for x in lines if x])
|
||||
library_dirs = [x[2:] for x in flags]
|
||||
wings.close()
|
||||
|
||||
## Get the libraries
|
||||
wings = os.popen("get-wings-flags --libs", "r")
|
||||
lines = [x.strip() for x in wings.readlines()]
|
||||
flags = reduce(lambda x,y: x+y, [x.split() for x in lines if x])
|
||||
libraries = [x[2:] for x in flags]
|
||||
wings.close()
|
||||
|
||||
runtime_library_dirs = []
|
||||
extra_objects = []
|
||||
extra_compile_args = ['-Wno-strict-prototypes', '-Wno-unused']
|
||||
|
||||
long_description = \
|
||||
"""Python interface to the WINGs library
|
||||
|
||||
Python WINGs is an interface to WINGs, a small widget set with the
|
||||
N*XTSTEP look and feel. It's API is inspired in OpenStep and it's
|
||||
implementation borrows some ideas from Tk. It has a reasonable set of
|
||||
widgets, sufficient for building small applications (like a CDPlayer
|
||||
or hacking something like rxvt). It also has other functions that are
|
||||
usefull for applications, like a User Defaults alike configuration
|
||||
manager and a notification system.
|
||||
|
||||
"""
|
||||
|
||||
setup (# Distribution meta-data
|
||||
name = "Python-WINGs",
|
||||
version = "0.81.0",
|
||||
description = "A python interface to WINGs",
|
||||
long_description=long_description,
|
||||
author = "Dan Pascu",
|
||||
author_email = "dan@windowmaker.org",
|
||||
license = "GPL",
|
||||
platforms = "ALL",
|
||||
url = "http://windowmaker.org/",
|
||||
|
||||
# Description of the modules and packages in the distribution
|
||||
|
||||
py_modules = ["WINGs"],
|
||||
|
||||
ext_modules = [Extension(
|
||||
name='wings',
|
||||
sources=['WINGs.c'],
|
||||
include_dirs=include_dirs,
|
||||
library_dirs=library_dirs,
|
||||
runtime_library_dirs=runtime_library_dirs,
|
||||
libraries=libraries,
|
||||
extra_objects=extra_objects,
|
||||
extra_compile_args=extra_compile_args,
|
||||
)],
|
||||
)
|
||||
159
WINGs/python/test.py
Executable file
159
WINGs/python/test.py
Executable file
@@ -0,0 +1,159 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import sys
|
||||
from WINGs import *
|
||||
|
||||
if __name__ == "__main__":
|
||||
def quit(obj, data):
|
||||
#sys.exit()
|
||||
scr.breakMainLoop()
|
||||
|
||||
def click(btn, list):
|
||||
print win.width(), win.height()
|
||||
print list.selectedItemRow()
|
||||
win2.show()
|
||||
scr.runModalLoop(win2.view())
|
||||
print txt2.text()
|
||||
|
||||
def sayhi(btn, data):
|
||||
print "hi"
|
||||
|
||||
def breakLoop(btn, data):
|
||||
#sys.exit()
|
||||
scr.breakModalLoop()
|
||||
win2.hide()
|
||||
|
||||
def dc(object, data, action):
|
||||
print "didChnage:", object, data, action
|
||||
|
||||
def dbe(object, data, action):
|
||||
print "didBeginEditing:", object, data, action
|
||||
|
||||
def dee(object, data, action):
|
||||
if action == wings.WMReturnTextMovement:
|
||||
if object == txt:
|
||||
object.setFocusTo(txt2)
|
||||
else:
|
||||
object.setFocusTo(txt)
|
||||
print "didEndEditing:", object, data, action, txt.text()
|
||||
|
||||
def tcb(one):
|
||||
old = list.selectedItemRow()
|
||||
list.selectItem(list.index)
|
||||
list.unselectItem(old)
|
||||
list.index = (list.index+1) % 3
|
||||
#print one
|
||||
|
||||
scr = WMScreen("foobar")
|
||||
win = WMWindow(scr, "aWindow")
|
||||
win.setCloseAction(quit)
|
||||
win.setTitle("test window")
|
||||
win.resize(400, 180)
|
||||
win.setInitialPosition((scr.width-win.width())/2, (scr.height-win.height())/2)
|
||||
|
||||
btn = WMCommandButton(win)
|
||||
btn.setText("Click Me")
|
||||
btn.resize(100, 25)
|
||||
btn.move(20, 20)
|
||||
btn.show()
|
||||
|
||||
sw = WMSwitchButton(win)
|
||||
sw.setText("Some option")
|
||||
sw.resize(100, 25)
|
||||
sw.move(20, 50)
|
||||
sw.show()
|
||||
|
||||
radios = []
|
||||
r = None
|
||||
j = 0
|
||||
for i in ["One", "Two", "Four"]:
|
||||
r = WMRadioButton(win, r)
|
||||
radios.append(r)
|
||||
r.show()
|
||||
r.setText(i)
|
||||
r.move(20, 70+j*25)
|
||||
r.resize(100, 25)
|
||||
j=j+1
|
||||
|
||||
sw.setAction(sayhi)
|
||||
|
||||
list = WMList(win)
|
||||
list.resize(100,100)
|
||||
list.move(130, 20)
|
||||
list.addItem("one")
|
||||
list.addItem("two")
|
||||
list.addItem("three")
|
||||
list.allowMultipleSelection(1)
|
||||
list.show()
|
||||
list.index = 0
|
||||
|
||||
txtdel = WMTextFieldDelegate()
|
||||
txtdel.data = 'mydata'
|
||||
txtdel.didBeginEditing = dbe
|
||||
txtdel.didEndEditing = dee
|
||||
txtdel.didChange = dc
|
||||
|
||||
txt = WMTextField(win, "abc")
|
||||
txt.resize(95, 20)
|
||||
txt.move(295, 20)
|
||||
txt.setDelegate(txtdel)
|
||||
txt.show()
|
||||
txt2 = WMTextField(win, "01234567890")
|
||||
txt2.resize(95, 20)
|
||||
txt2.move(295, 45)
|
||||
txt2.setDelegate(txtdel)
|
||||
txt2.show()
|
||||
|
||||
txt.setNextText(txt2)
|
||||
txt2.setNextText(txt)
|
||||
|
||||
label = WMLabel(win, "Text1:")
|
||||
label.setTextAlignment(WARight)
|
||||
label.move(240, 20)
|
||||
label.resize(55, 20)
|
||||
label.show()
|
||||
|
||||
label2 = WMLabel(win, "mytext2:")
|
||||
label2.setTextAlignment(WARight)
|
||||
label2.move(240, 45)
|
||||
label2.resize(55, 20)
|
||||
label2.show()
|
||||
|
||||
btn.setAction(click, list)
|
||||
|
||||
frame = WMFrame(win, "My Frame")
|
||||
frame.resize(150, 50)
|
||||
frame.move(240, 70)
|
||||
#frame.setRelief(WRPushed)
|
||||
frame.show()
|
||||
|
||||
ebtn = WMCommandButton(win)
|
||||
ebtn.setText("Exit")
|
||||
ebtn.resize(100, 25)
|
||||
ebtn.move(290, 147)
|
||||
ebtn.setAction(quit)
|
||||
ebtn.show()
|
||||
|
||||
win.realize()
|
||||
win.show()
|
||||
|
||||
timer = WMPersistentTimer(1000, tcb, win)
|
||||
#del(timer)
|
||||
#timer.delete()
|
||||
|
||||
win2 = WMPanel(win, "anotherWindow", WMTitledWindowMask)
|
||||
win2.setTitle("transient test window")
|
||||
win2.resize(150, 50)
|
||||
win2.setInitialPosition((scr.width-win2.width())/2, (scr.height-win2.height())/2)
|
||||
|
||||
btn7 = WMCommandButton(win2)
|
||||
btn7.setText("Dismiss")
|
||||
btn7.resize(100, 25)
|
||||
btn7.move(27, 10)
|
||||
btn7.show()
|
||||
btn7.setAction(breakLoop)
|
||||
|
||||
win2.realize()
|
||||
|
||||
scr.mainLoop()
|
||||
|
||||
Reference in New Issue
Block a user