3 #include
"WINGs/WINGsP.h"
8 // This tells SWIG to treat char
** as a special case
9 %typemap
(python
, in
) char
** {
10 /* Check if is a list
*/
11 if
(PyList_Check
($input
)) {
12 int size
= PyList_Size
($input
);
14 $
1 = (char
**) wmalloc
((size
+1)*sizeof
(char
*));
15 for
(i
= 0; i
< size
; i
++) {
16 PyObject
*o
= PyList_GetItem
($input
, i
);
17 if
(PyString_Check
(o
))
18 $
1[i
] = PyString_AsString
(PyList_GetItem
($input
, i
));
20 PyErr_SetString
(PyExc_TypeError
, "list must contain strings");
27 PyErr_SetString
(PyExc_TypeError
, "not a list");
31 // This cleans up the char
** array we malloc
\x19d before the function call
32 %typemap
(python
, freearg
) char
** {
35 // This allows a C function to return a char
** as a Python list
36 %typemap
(python
, out
) char
** {
39 while
($
1[len
]) len
++;
40 $result
= PyList_New
(len
);
41 for
(i
= 0; i
< len
; i
++) {
42 PyList_SetItem
($result
, i
, PyString_FromString
($
1[i
]));
46 // Now for some callbacks
47 %typemap
(python
, in
) PyObject
*pyacArgs
{
48 if
(PyTuple_Check
($input
)) {
49 if
(PyTuple_Size
($input
) != 3) {
50 PyErr_SetString
(PyExc_ValueError
,
51 "wrong number of parameters in tuple. should be 3.");
54 PyObject
*func
= PyTuple_GetItem
($input
, 1);
55 if
(func
!=Py_None
&& !PyCallable_Check(func)) {
56 PyErr_SetString
(PyExc_TypeError
,
57 "'action' needs to be a callable object!");
62 PyErr_SetString
(PyExc_TypeError
, "2nd argument not a tuple!");
68 %typemap
(python
, in
) PyObject
*pycArgs
{
69 if
(PyTuple_Check
($input
)) {
70 if
(PyTuple_Size
($input
) != 2) {
71 PyErr_SetString
(PyExc_ValueError
,
72 "wrong number of parameters in tuple. should be 2.");
75 PyObject
*func
= PyTuple_GetItem
($input
, 0);
76 if
(func
!=Py_None
&& !PyCallable_Check(func)) {
77 PyErr_SetString
(PyExc_TypeError
,
78 "'action' needs to be a callable object!");
83 PyErr_SetString
(PyExc_TypeError
, "2nd argument not a tuple!");
89 // Type mapping for grabbing a
FILE * from Python
90 %typemap
(python
, in
) FILE * {
91 if
(!PyFile_Check
($input
)) {
92 PyErr_SetString
(PyExc_TypeError
, "Need a file!");
95 $
1 = PyFile_AsFile
($input
);
98 /* These are for freeing the return of functions that need to be freed
99 * before returning control to python.
*/
100 %typemap
(python
, ret
) char
* WMGetTextFieldText
{ wfree
($
1); };
105 %exception pyWMScreenMainLoop
{
107 if
(PyErr_Occurred
())
111 %exception pyWMRunModalLoop
{
113 if
(PyErr_Occurred
())
118 static int mainLoopDone
= 0;
123 WMScreen
*pyWMOpenScreen
(const char
*display
, int simpleapp
)
125 Display
*dpy
= XOpenDisplay
(display
);
128 wwarning
("WINGs: could not open display %s", XDisplayName
(display
));
133 return WMCreateSimpleApplicationScreen
(dpy
);
135 return WMCreateScreen
(dpy
, DefaultScreen
(dpy
));
139 void pyWMScreenMainLoop
(WMScreen
*scr
)
143 while
(!PyErr_Occurred
() && !mainLoopDone) {
144 WMNextEvent
(((W_Screen
*)scr
)->display
, &event);
145 WMHandleEvent
(&event);
149 void pyWMBreakScreenMainLoop
(WMScreen
*scr
)
154 void pyWMRunModalLoop
(WMScreen
*scr
, WMView
*view
)
156 int oldModalLoop
= scr-
>modalLoop
;
157 WMView
*oldModalView
= scr-
>modalView
;
159 scr-
>modalView
= view
;
162 while
(!PyErr_Occurred
() && scr->modalLoop) {
165 WMNextEvent
(scr-
>display
, &event);
166 WMHandleEvent
(&event);
169 scr-
>modalView
= oldModalView
;
170 scr-
>modalLoop
= oldModalLoop
;
175 //%rename WMScreenMainLoop _WMScreenMainLoop
;
176 //%rename WMRunModalLoop _WMRunModalLoop
;
180 /* These functions match the prototypes of the normal C callback
181 * functions. However
, we use the clientdata pointer for holding a
182 * reference to a Python tuple containing
(object
, funct
, clientData
).
184 static void PythonWMActionCallback
(WMWidget
*widget
, void
*cdata
)
186 PyObject
*pyobj
, *func
, *pydata
, *arglist
, *tuple
, *result
;
188 tuple
= (PyObject
*) cdata
;
189 pyobj
= PyTuple_GetItem
(tuple
, 0);
190 func
= PyTuple_GetItem
(tuple
, 1);
191 if
(func
&& func!=Py_None) {
192 pydata
= PyTuple_GetItem
(tuple
, 2);
193 arglist
= Py_BuildValue
("(OO)", pyobj
, pydata
);
194 result
= PyEval_CallObject
(func
, arglist
);
200 static void PythonWMCallback
(void
*data
)
202 PyObject
*func
, *pydata
, *arglist
, *tuple
, *result
;
204 tuple
= (PyObject
*) data
;
205 func
= PyTuple_GetItem
(tuple
, 0);
206 if
(func
&& func!=Py_None) {
207 pydata
= PyTuple_GetItem
(tuple
, 1);
208 arglist
= Py_BuildValue
("(O)", pydata
);
209 result
= PyEval_CallObject
(func
, arglist
);
216 pyTextFieldDidBeginEditing
(WMTextFieldDelegate
*self
, WMNotification
*notif
)
218 PyObject
*pyobj
, *delegate
, *func
, *pydata
, *arglist
, *tuple
, *result
;
221 tuple
= (PyObject
*) self-
>data
;
222 pyobj
= PyTuple_GetItem
(tuple
, 0);
223 delegate
= PyTuple_GetItem
(tuple
, 1);
224 if
(delegate
!= Py_None
) {
225 // should we call PyObject_HasAttrString
()?? rather not and let
226 // python raise an exception because the object doesn't has the
228 func
= PyObject_GetAttrString
(delegate
, "didBeginEditing");
229 if
(func
!=NULL && func!=Py_None) {
230 pydata
= PyObject_GetAttrString
(delegate
, "data");
235 action
= (int
)WMGetNotificationClientData
(notif
);
236 arglist
= Py_BuildValue
("(OOi)", pyobj
, pydata
, action
);
237 result
= PyEval_CallObject
(func
, arglist
);
247 pyTextFieldDidChange
(WMTextFieldDelegate
*self
, WMNotification
*notif
)
249 PyObject
*pyobj
, *delegate
, *func
, *pydata
, *arglist
, *tuple
, *result
;
252 tuple
= (PyObject
*) self-
>data
;
253 pyobj
= PyTuple_GetItem
(tuple
, 0);
254 delegate
= PyTuple_GetItem
(tuple
, 1);
255 if
(delegate
!= Py_None
) {
256 func
= PyObject_GetAttrString
(delegate
, "didChange");
257 if
(func
!=NULL && func!=Py_None) {
258 pydata
= PyObject_GetAttrString
(delegate
, "data");
263 action
= (int
)WMGetNotificationClientData
(notif
);
264 arglist
= Py_BuildValue
("(OOi)", pyobj
, pydata
, action
);
265 result
= PyEval_CallObject
(func
, arglist
);
275 pyTextFieldDidEndEditing
(WMTextFieldDelegate
*self
, WMNotification
*notif
)
277 PyObject
*pyobj
, *delegate
, *func
, *pydata
, *arglist
, *tuple
, *result
;
280 tuple
= (PyObject
*) self-
>data
;
281 pyobj
= PyTuple_GetItem
(tuple
, 0);
282 delegate
= PyTuple_GetItem
(tuple
, 1);
283 if
(delegate
!= Py_None
) {
284 func
= PyObject_GetAttrString
(delegate
, "didEndEditing");
285 if
(func
!=NULL && func!=Py_None) {
286 pydata
= PyObject_GetAttrString
(delegate
, "data");
291 action
= (int
)WMGetNotificationClientData
(notif
);
292 arglist
= Py_BuildValue
("(OOi)", pyobj
, pydata
, action
);
293 result
= PyEval_CallObject
(func
, arglist
);
303 pyTextFieldShouldBeginEditing
(WMTextFieldDelegate
*self
, WMTextField
*tPtr
)
305 PyObject
*pyobj
, *delegate
, *func
, *pydata
, *arglist
, *tuple
, *result
;
308 tuple
= (PyObject
*) self-
>data
;
309 pyobj
= PyTuple_GetItem
(tuple
, 0);
310 delegate
= PyTuple_GetItem
(tuple
, 1);
311 if
(delegate
!= Py_None
) {
312 func
= PyObject_GetAttrString
(delegate
, "shouldBeginEditing");
313 if
(func
!=NULL && func!=Py_None) {
314 pydata
= PyObject_GetAttrString
(delegate
, "data");
319 arglist
= Py_BuildValue
("(OO)", pyobj
, pydata
);
320 result
= PyEval_CallObject
(func
, arglist
);
321 if
(result
!=Py_None
&& PyInt_AsLong(result)!=0) {
335 pyTextFieldShouldEndEditing
(WMTextFieldDelegate
*self
, WMTextField
*tPtr
)
337 PyObject
*pyobj
, *delegate
, *func
, *pydata
, *arglist
, *tuple
, *result
;
340 tuple
= (PyObject
*) self-
>data
;
341 pyobj
= PyTuple_GetItem
(tuple
, 0);
342 delegate
= PyTuple_GetItem
(tuple
, 1);
343 if
(delegate
!= Py_None
) {
344 func
= PyObject_GetAttrString
(delegate
, "shouldEndEditing");
345 if
(func
!=NULL && func!=Py_None) {
346 pydata
= PyObject_GetAttrString
(delegate
, "data");
351 arglist
= Py_BuildValue
("(OO)", pyobj
, pydata
);
352 result
= PyEval_CallObject
(func
, arglist
);
353 if
(result
!=Py_None
&& PyInt_AsLong(result)!=0) {
368 void pyWMSetWindowCloseAction
(WMWindow
*win
, PyObject
*pyacArgs
) {
369 WMSetWindowCloseAction
(win
, PythonWMActionCallback
, (void
*)pyacArgs
);
373 void pyWMSetButtonAction
(WMButton
*bPtr
, PyObject
*pyacArgs
) {
374 WMSetButtonAction
(bPtr
, PythonWMActionCallback
, (void
*)pyacArgs
);
378 void pyWMSetScrollerAction
(WMScroller
*sPtr
, PyObject
*pyacArgs
) {
379 WMSetScrollerAction
(sPtr
, PythonWMActionCallback
, (void
*)pyacArgs
);
383 void pyWMSetListAction
(WMList
*lPtr
, PyObject
*pyacArgs
) {
384 WMSetListAction
(lPtr
, PythonWMActionCallback
, (void
*)pyacArgs
);
388 void pyWMSetListDoubleAction
(WMList
*lPtr
, PyObject
*pyacArgs
) {
389 WMSetListDoubleAction
(lPtr
, PythonWMActionCallback
, (void
*)pyacArgs
);
393 void pyWMSetBrowserAction
(WMBrowser
*bPtr
, PyObject
*pyacArgs
) {
394 WMSetBrowserAction
(bPtr
, PythonWMActionCallback
, (void
*)pyacArgs
);
398 void pyWMSetBrowserDoubleAction
(WMBrowser
*bPtr
, PyObject
*pyacArgs
) {
399 WMSetBrowserDoubleAction
(bPtr
, PythonWMActionCallback
, (void
*)pyacArgs
);
403 void pyWMSetMenuItemAction
(WMMenuItem
*miPtr
, PyObject
*pyacArgs
) {
404 WMSetMenuItemAction
(miPtr
, PythonWMActionCallback
, (void
*)pyacArgs
);
408 void pyWMSetPopUpButtonAction
(WMPopUpButton
*pPtr
, PyObject
*pyacArgs
) {
409 WMSetPopUpButtonAction
(pPtr
, PythonWMActionCallback
, (void
*)pyacArgs
);
413 void pyWMSetSliderAction
(WMSlider
*sPtr
, PyObject
*pyacArgs
) {
414 WMSetSliderAction
(sPtr
, PythonWMActionCallback
, (void
*)pyacArgs
);
418 void pyWMSetRulerMoveAction
(WMRuler
*rPtr
, PyObject
*pyacArgs
) {
419 WMSetRulerMoveAction
(rPtr
, PythonWMActionCallback
, (void
*)pyacArgs
);
423 void pyWMSetRulerReleaseAction
(WMRuler
*rPtr
, PyObject
*pyacArgs
) {
424 WMSetRulerReleaseAction
(rPtr
, PythonWMActionCallback
, (void
*)pyacArgs
);
428 void pyWMSetColorPanelAction
(WMColorPanel
*panel
, PyObject
*pyacArgs
) {
429 WMSetColorPanelAction
(panel
, (WMAction2
*)PythonWMActionCallback
, (void
*)pyacArgs
);
433 void
* pyWMAddTimerHandler
(int miliseconds
, PyObject
*pycArgs
) {
435 return
(void
*)WMAddTimerHandler
(miliseconds
, PythonWMCallback
,
439 void
* pyWMAddPersistentTimerHandler
(int miliseconds
, PyObject
*pycArgs
) {
441 return
(void
*)WMAddPersistentTimerHandler
(miliseconds
, PythonWMCallback
,
445 /* this doesn't work. we pass
(func
, data
) as cdata at creation time
, but
446 * only data at destruction
, so it won't find it unless we change
447 * WMDeleteTimerWithClientData
() to extract data from the tuple
, and this
448 * requires access to the internals of WINGs
449 void pyWMDeleteTimerWithClientData
(PyObject
*pycData
) {
450 WMDeleteTimerWithClientData
((void
*)pycData
);
453 void pyWMDeleteTimerHandler
(void
*handlerID
) {
454 WMDeleteTimerHandler
((WMHandlerID
)handlerID
);
457 void
* pyWMAddIdleHandler
(PyObject
*pycArgs
) {
459 return
(void
*)WMAddIdleHandler
(PythonWMCallback
, (void
*)pycArgs
);
462 void pyWMDeleteIdleHandler
(void
*handlerID
) {
463 WMDeleteIdleHandler
((WMHandlerID
)handlerID
);
469 %exception pyWMSetTextFieldDelegate
{
471 if
(PyErr_Occurred
()) {
477 void pyWMSetTextFieldDelegate
(WMTextField
*tPtr
, PyObject
*txtArgs
) {
478 WMTextFieldDelegate
*td
;
480 if
(!txtArgs ||
!PyTuple_Check
(txtArgs
) || PyTuple_Size
(txtArgs
)!=2) {
481 PyErr_SetString
(PyExc_TypeError
, "invalid setting of WMTextField "
482 "delegate. Should be '(self, delegate)'");
485 // how do I check if txtArgs
[1] is an instance of WMTextFieldDelegate?
486 td
= WMGetTextFieldDelegate
(tPtr
);
488 td
= (WMTextFieldDelegate
*)wmalloc
(sizeof
(WMTextFieldDelegate
));
489 td-
>didBeginEditing
= pyTextFieldDidBeginEditing
;
490 td-
>didChange
= pyTextFieldDidChange
;
491 td-
>didEndEditing
= pyTextFieldDidEndEditing
;
492 td-
>shouldBeginEditing
= pyTextFieldShouldBeginEditing
;
493 td-
>shouldEndEditing
= pyTextFieldShouldEndEditing
;
495 Py_XDECREF
((PyObject
*)td-
>data
);
499 WMSetTextFieldDelegate
(tPtr
, td
);
505 PyObject
* pyWMGetTextFieldDelegate
(WMTextField
*tPtr
) {
506 WMTextFieldDelegate
*td
;
507 PyObject
*result
, *tuple
;
509 td
= WMGetTextFieldDelegate
(tPtr
);
515 tuple
= (PyObject
*)td-
>data
;
516 if
(!tuple ||
!PyTuple_Check
(tuple
) || PyTuple_Size
(tuple
)!=2) {
517 PyErr_SetString
(PyExc_TypeError
, "invalid TextField delegate");
521 result
= PyTuple_GetItem
(tuple
, 1);
532 %apply int
*INPUT { int
*argc
};
536 %include
"WINGs/WUtil.h"
538 %include
"WINGs/WINGs.h"
544 /* Check any expired timers
*/
545 W_CheckTimerHandlers
();
547 /* Do idle and timer stuff while there are no input events
*/
548 /* Do not wait for input here. just peek to se if input is available
*/
549 while
(!W_HandleInputEvents
(False
, -1) && W_CheckIdleHandlers()) {
550 /* dispatch timer events
*/
551 W_CheckTimerHandlers
();
554 W_HandleInputEvents
(True
, -1);
556 /* Check any expired timers
*/
557 W_CheckTimerHandlers
();
561 /* rewrite functions originally defined as macros
*/
563 #undef WMDuplicateArray
564 WMArray
* WMDuplicateArray
(WMArray
* array
) {
565 return WMCreateArrayWithArray
(array
);
569 void WMPushInArray
(WMArray
*array
, void
*item
) {
570 WMAddToArray
(array
, item
);
574 void
* WMSetInArray
(WMArray
*array
, int index
, void
*item
) {
575 return WMReplaceInArray
(array
, index
, item
);
578 #undef WMRemoveFromArray
579 int WMRemoveFromArray
(WMArray
*array
, void
*item
) {
580 return WMRemoveFromArrayMatching
(array
, NULL, item
);
583 #undef WMGetFirstInArray
584 int WMGetFirstInArray
(WMArray
*array
, void
*item
) {
585 return WMFindInArray
(array
, NULL, item
);
589 WMBag
* WMCreateBag
(int size
) {
590 return WMCreateTreeBag
();
593 #undef WMCreateBagWithDestructor
594 WMBag
* WMCreateBagWithDestructor
(int size
, WMFreeDataProc
*destructor
) {
595 return WMCreateTreeBagWithDestructor
(destructor
);
599 void
* WMSetInBag
(WMBag
*bag
, int index
, void
*item
) {
600 return WMReplaceInBag
(bag
, index
, item
);
603 #undef WMAddItemToTree
604 WMTreeNode
* WMAddItemToTree
(WMTreeNode
*parent
, void
*item
) {
605 return WMInsertItemInTree
(parent
, -1, item
);
608 #undef WMAddNodeToTree
609 WMTreeNode
* WMAddNodeToTree
(WMTreeNode
*parent
, WMTreeNode
*aNode
) {
610 return WMInsertNodeInTree
(parent
, -1, aNode
);
613 #undef WMGetFirstInTree
614 /* Returns first tree node that has data
== cdata
*/
615 WMTreeNode
* WMGetFirstInTree
(WMTreeNode
*aTree
, void
*cdata
) {
616 return WMFindInTree
(aTree
, NULL, cdata
);
619 #undef WMFlushConnection
620 int WMFlushConnection
(WMConnection
*cPtr
) {
621 return WMSendConnectionData
(cPtr
, NULL);
624 #undef WMGetConnectionQueuedData
625 WMArray
* WMGetConnectionQueuedData
(WMConnection
*cPtr
) {
626 return WMGetConnectionUnsentData
(cPtr
);
630 W_Class WMWidgetClass
(WMWidget
*widget
) {
631 return
(((W_WidgetType
*)(widget
))->widgetClass
);
635 WMView
* WMWidgetView
(WMWidget
*widget
) {
636 return
(((W_WidgetType
*)(widget
))->view
);
639 #undef WMCreateCommandButton
640 WMButton
* WMCreateCommandButton
(WMWidget
*parent
) {
641 return WMCreateCustomButton
(parent
, WBBSpringLoadedMask|WBBPushInMask
642 |WBBPushLightMask|WBBPushChangeMask
);
645 #undef WMCreateRadioButton
646 WMButton
* WMCreateRadioButton
(WMWidget
*parent
) {
647 return WMCreateButton
(parent
, WBTRadio
);
650 #undef WMCreateSwitchButton
651 WMButton
* WMCreateSwitchButton
(WMWidget
*parent
) {
652 return WMCreateButton
(parent
, WBTSwitch
);
656 WMListItem
* WMAddListItem
(WMList
*lPtr
, char
*text
)
658 return WMInsertListItem
(lPtr
, -1, text
);
662 WMText
* WMCreateText
(WMWidget
*parent
) {
663 return WMCreateTextForDocumentType
(parent
, NULL, NULL);
667 void WMRefreshText
(WMText
*tPtr
) {
668 return WMThawText
(tPtr
);
672 void WMClearText
(WMText
*tPtr
) {
673 return WMAppendTextStream
(tPtr
, NULL);