From eee6551aff18c4deb9a42e546d54b89edc553604 Mon Sep 17 00:00:00 2001 From: "Carlos R. Mafra" Date: Sun, 21 Mar 2010 18:19:37 +0100 Subject: [PATCH] Remove python support from WINGs As the README used to say, it was a unfinished work. If someone wants to finish it after all these years it can be recovered from the logs. But meanwhile let's not carry dead code around. --- WINGs/Makefile.am | 3 +- WINGs/python/Makefile | 17 -- WINGs/python/README | 20 -- WINGs/python/WINGs.i | 699 -------------------------------------------------- WINGs/python/WINGs.py | 643 ---------------------------------------------- WINGs/python/setup.py | 71 ----- WINGs/python/test.py | 159 ------------ 7 files changed, 1 insertion(+), 1611 deletions(-) delete mode 100644 WINGs/python/Makefile delete mode 100644 WINGs/python/README delete mode 100644 WINGs/python/WINGs.i delete mode 100644 WINGs/python/WINGs.py delete mode 100755 WINGs/python/setup.py delete mode 100755 WINGs/python/test.py diff --git a/WINGs/Makefile.am b/WINGs/Makefile.am index 7dfe5762..9b60ac96 100644 --- a/WINGs/Makefile.am +++ b/WINGs/Makefile.am @@ -21,8 +21,7 @@ lib_LTLIBRARIES = libWINGs.la libWUtil.la LDADD= libWUtil.la libWINGs.la $(top_builddir)/wrlib/libwraster.la @INTLIBS@ -EXTRA_DIST = BUGS make-rgb python/Makefile python/README python/WINGs.i \ - python/WINGs.py python/setup.py python/test.py +EXTRA_DIST = BUGS make-rgb # wbutton.c diff --git a/WINGs/python/Makefile b/WINGs/python/Makefile deleted file mode 100644 index 95f46365..00000000 --- a/WINGs/python/Makefile +++ /dev/null @@ -1,17 +0,0 @@ - -all: WINGs.c - python setup.py build - ln -sf `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 - diff --git a/WINGs/python/README b/WINGs/python/README deleted file mode 100644 index 957dedf9..00000000 --- a/WINGs/python/README +++ /dev/null @@ -1,20 +0,0 @@ - -This is a python wrapper for the WINGs library, that can be used to write python -based programs with 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 WINGs.py for an example. - -the code is not finished yet and may fail to work as expected in some cases. - -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 install the newly built WINGs, else the python module will -be built against the old version. - diff --git a/WINGs/python/WINGs.i b/WINGs/python/WINGs.i deleted file mode 100644 index 2c739350..00000000 --- a/WINGs/python/WINGs.i +++ /dev/null @@ -1,699 +0,0 @@ -%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 malloc-ed 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 free-ing 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(_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; - } -%} - - -/* ignore structures we will not use */ -%ignore ConnectionDelegate; - -/* ignore functions we don't need */ -// should we ignore vararg functions, or just convert them to functions with -// a fixed number of parameters? -%varargs(char*) wmessage; -//%ignore wmessage; -%ignore wwarning; -%ignore wfatal; -%ignore wsyserror; -%ignore wsyserrorwithcode; -%ignore WMCreatePLArray; -%ignore WMCreatePLDictionary; - -%apply int *INPUT { int *argc }; - -#define Bool int - -%include "WINGs/WUtil.h" - -/* ignore structures we will not use */ - -/* ignore functions we don't need */ - -%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); -} -%} - - diff --git a/WINGs/python/WINGs.py b/WINGs/python/WINGs.py deleted file mode 100644 index dbdccde2..00000000 --- a/WINGs/python/WINGs.py +++ /dev/null @@ -1,643 +0,0 @@ -#!/usr/bin/env python - -import sys -import wings - -# Some useful constants - -False = 0 -True = 1 - -# check about None as action for buttonAction/windowCloseAction ... - -################################################################################ -# Exceptions -################################################################################ -from exceptions import Exception, StandardError - -class Error(StandardError): - pass - -del Exception, StandardError - -class WMTimer: - def __init__(self, milliseconds, callback, cdata=None, persistent=False): - if persistent: - self._o = wings.pyWMAddPersistentTimerHandler(milliseconds, (callback, cdata)) - else: - self._o = wings.pyWMAddTimerHandler(milliseconds, (callback, cdata)) - self.__WMDeleteTimerHandler = wings.pyWMDeleteTimerHandler - - def __del__(self): - self.__WMDeleteTimerHandler(self._o) - - -class WMPersistentTimer(WMTimer): - def __init__(self, milliseconds, callback, cdata=None): - WMTimer.__init__(self, milliseconds, callback, cdata, persistent=True) - - -class WMScreen: - __readonly = ('display', 'width', 'height', 'depth') - - def __init__(self, appname, display="", simpleapp=False): - wings.WMInitializeApplication(appname, len(sys.argv), sys.argv) - self._o = wings.pyWMOpenScreen(display, simpleapp) - if not self._o: - raise Error, "Cannot open display %s" % display - 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 __delattr__(self, name): - if name in self.__readonly: - #raise AttributeError, "'%s' attribute cannot be deleted from WMScreen instance" % name - raise Error, "'%s' attribute cannot be deleted from WMScreen instance" % name - try: - del(self.__dict__[name]) - except KeyError: - raise AttributeError, "%s instance has no attribute '%s'" % \ - (self.__class__.__name__, name) - - 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): - if self.__class__ == WMWidget: - raise Error, "a WMWidget can't be instantiated directly" - self._o = None - self.__WMDestroyWidget = wings.WMDestroyWidget - - def __del__(self): - if self._o is not None: - self.__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=""): - 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): - # bool(flag) for python2.2 - wings.WMSetLabelWraps(self._o, flag) - - def setRelief(self, relief): - wings.WMSetLabelRelief(self._o, relief) - - def setText(self, text=""): - 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): - # bool(flag) for python2.2 - wings.WMSetBoxHorizontal(self._o, flag) - - def setBorderWidth(self, width): - 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=""): - 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): - # bool(flag) for python2.2 - wings.WMSetButtonEnabled(self._o, flag) - - def isEnabled(self): - return wings.WMGetButtonEnabled(self._o) - - def setImageDimsWhenDisabled(self, flag): - # bool(flag) - 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): - # bool(flag) - wings.WMSetListAllowEmptySelection(self._o, flag) - - def allowMultipleSelection(self, flag): - # bool(flag) - wings.WMSetListAllowMultipleSelection(self._o, flag) - - def addItem(self, item): - wings.WMAddListItem(self._o, item) - - def insertItem(self, row, item): - wings.WMInsertListItem(self._o, row, item) - - def sortItems(self): - wings.WMSortListItems(self._o) - - def rowWithTitle(self, title): - 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): - wings.WMRemoveListItem(self._o, index) - - def selectItem(self, index): - wings.WMSelectListItem(self._o, index) - - def unselectItem(self, index): - 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=""): - WMWidget.__init__(self) - self._o = wings.WMCreateTextField(parent._o) - 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): - # bool(flag) - wings.WMSetTextFieldEditable(self._o, flag) - - def setBordered(self, flag): - # bool(flag) - wings.WMSetTextFieldBordered(self._o, flag) - - def setBeveled(self, flag): - # bool(flag) - wings.WMSetTextFieldBeveled(self._o, flag) - - def setSecure(self, flag): - # bool(flag) - wings.WMSetTextFieldSecure(self._o, flag) - - def setCursorPosition(self, position): - 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): - wings.WMInsertTextFieldText(self._o, text, position) - - def deleteText(self, start, count): - wings.WMDeleteTextFieldRange(self._o, wings.wmkrange(start, count)) - - def selectText(self, start, count): - 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 "didChange:", 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, object.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() - diff --git a/WINGs/python/setup.py b/WINGs/python/setup.py deleted file mode 100755 index 06598874..00000000 --- a/WINGs/python/setup.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/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") -flags = wings.read().split() -include_dirs = [x[2:] for x in flags] -#include_dirs += [".."] -wings.close() - -## Get the library dirs -wings = os.popen("get-wings-flags --ldflags", "r") -flags = wings.read().split() -library_dirs = [x[2:] for x in flags] -#library_dirs += [".."] -wings.close() - -## Get the libraries -wings = os.popen("get-wings-flags --libs", "r") -flags = wings.read().split() -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.info", - license = "GPL", - platforms = "ALL", - url = "http://windowmaker.info/", - - # 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, - )], -) diff --git a/WINGs/python/test.py b/WINGs/python/test.py deleted file mode 100755 index de98188c..00000000 --- a/WINGs/python/test.py +++ /dev/null @@ -1,159 +0,0 @@ -#!/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 "didChange:", 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, object.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) - 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() - -- 2.11.4.GIT