[Python-checkins] CVS: python/dist/src/Mac/Modules/ctl _Ctlmodule.c,1.13,1.14 ctlscan.py,1.25,1.26 ctlsupport.py,1.47,1.48

Just van Rossum jvr@users.sourceforge.net
Sun, 30 Dec 2001 13:25:29 -0800


Update of /cvsroot/python/python/dist/src/Mac/Modules/ctl
In directory usw-pr-cvs1:/tmp/cvs-serv16470

Modified Files:
	_Ctlmodule.c ctlscan.py ctlsupport.py 
Log Message:
- added support for ControlActionProcs, exposing the following calls:
    - ctl.SetControlAction()
    - CreateScrollBarControl()
    - CreateSliderControl()
- print traceback when callbacks fail

Index: _Ctlmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Mac/Modules/ctl/_Ctlmodule.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -C2 -d -r1.13 -r1.14
*** _Ctlmodule.c	2001/12/18 20:15:26	1.13
--- _Ctlmodule.c	2001/12/30 21:25:26	1.14
***************
*** 129,134 ****
--- 129,136 ----
  
  /* TrackControl and HandleControlClick callback support */
+ #define kMyControlActionProcTag 'ACTN'  /* not an official tag, only for internal use */
  static PyObject *tracker;
  static ControlActionUPP mytracker_upp;
+ static ControlActionUPP myactionproc_upp;
  static ControlUserPaneDrawUPP mydrawproc_upp;
  static ControlUserPaneIdleUPP myidleproc_upp;
***************
*** 1184,1187 ****
--- 1186,1208 ----
  }
  
+ static PyObject *CtlObj_SetControlAction(ControlObject *_self, PyObject *_args)
+ {
+ 	PyObject *_res = NULL;
+ 	PyObject* actionProc;
+ 	UniversalProcPtr c_callback;
+ #ifndef SetControlAction
+ 	PyMac_PRECHECK(SetControlAction);
+ #endif
+ 	if (!PyArg_ParseTuple(_args, "O",
+ 	                      &actionProc))
+ 		return NULL;
+ 	SetControlAction(_self->ob_itself,
+ 	                 myactionproc_upp);
+ 	Py_INCREF(Py_None);
+ 	_res = Py_None;
+ 	setcallback((PyObject*)_self, kMyControlActionProcTag, actionProc, &c_callback);
+ 	return _res;
+ }
+ 
  static PyObject *CtlObj_SetControlReference(ControlObject *_self, PyObject *_args)
  {
***************
*** 4005,4008 ****
--- 4026,4031 ----
  	{"GetControlVariant", (PyCFunction)CtlObj_GetControlVariant, 1,
  	 "() -> (ControlVariant _rv)"},
+ 	{"SetControlAction", (PyCFunction)CtlObj_SetControlAction, 1,
+ 	 "(PyObject* actionProc) -> None"},
  	{"SetControlReference", (PyCFunction)CtlObj_SetControlReference, 1,
  	 "(SInt32 data) -> None"},
***************
*** 4990,4993 ****
--- 5013,5062 ----
  #endif
  
+ static PyObject *Ctl_CreateSliderControl(PyObject *_self, PyObject *_args)
+ {
+ 	PyObject *_res = NULL;
+ 	OSStatus _err;
+ 	WindowPtr window;
+ 	Rect boundsRect;
+ 	SInt32 value;
+ 	SInt32 minimum;
+ 	SInt32 maximum;
+ 	UInt16 orientation;
+ 	UInt16 numTickMarks;
+ 	Boolean liveTracking;
+ 	PyObject* liveTrackingProc;
+ 	UniversalProcPtr c_callback;
+ 	ControlHandle outControl;
+ #ifndef CreateSliderControl
+ 	PyMac_PRECHECK(CreateSliderControl);
+ #endif
+ 	if (!PyArg_ParseTuple(_args, "O&O&lllHHbO",
+ 	                      WinObj_Convert, &window,
+ 	                      PyMac_GetRect, &boundsRect,
+ 	                      &value,
+ 	                      &minimum,
+ 	                      &maximum,
+ 	                      &orientation,
+ 	                      &numTickMarks,
+ 	                      &liveTracking,
+ 	                      &liveTrackingProc))
+ 		return NULL;
+ 	_err = CreateSliderControl(window,
+ 	                           &boundsRect,
+ 	                           value,
+ 	                           minimum,
+ 	                           maximum,
+ 	                           orientation,
+ 	                           numTickMarks,
+ 	                           liveTracking,
+ 	                           myactionproc_upp,
+ 	                           &outControl);
+ 	if (_err != noErr) return PyMac_Error(_err);
+ 	_res = Py_BuildValue("O&",
+ 	                     CtlObj_New, outControl);
+ 	setcallback(_res, kMyControlActionProcTag, liveTrackingProc, &c_callback);
+ 	return _res;
+ }
+ 
  #if TARGET_API_MAC_CARBON
  
***************
*** 5756,5759 ****
--- 5825,5871 ----
  #endif
  
+ static PyObject *Ctl_CreateScrollBarControl(PyObject *_self, PyObject *_args)
+ {
+ 	PyObject *_res = NULL;
+ 	OSStatus _err;
+ 	WindowPtr window;
+ 	Rect boundsRect;
+ 	SInt32 value;
+ 	SInt32 minimum;
+ 	SInt32 maximum;
+ 	SInt32 viewSize;
+ 	Boolean liveTracking;
+ 	PyObject* liveTrackingProc;
+ 	UniversalProcPtr c_callback;
+ 	ControlHandle outControl;
+ #ifndef CreateScrollBarControl
+ 	PyMac_PRECHECK(CreateScrollBarControl);
+ #endif
+ 	if (!PyArg_ParseTuple(_args, "O&O&llllbO",
+ 	                      WinObj_Convert, &window,
+ 	                      PyMac_GetRect, &boundsRect,
+ 	                      &value,
+ 	                      &minimum,
+ 	                      &maximum,
+ 	                      &viewSize,
+ 	                      &liveTracking,
+ 	                      &liveTrackingProc))
+ 		return NULL;
+ 	_err = CreateScrollBarControl(window,
+ 	                              &boundsRect,
+ 	                              value,
+ 	                              minimum,
+ 	                              maximum,
+ 	                              viewSize,
+ 	                              liveTracking,
+ 	                              myactionproc_upp,
+ 	                              &outControl);
+ 	if (_err != noErr) return PyMac_Error(_err);
+ 	_res = Py_BuildValue("O&",
+ 	                     CtlObj_New, outControl);
+ 	setcallback(_res, kMyControlActionProcTag, liveTrackingProc, &c_callback);
+ 	return _res;
+ }
+ 
  #if TARGET_API_MAC_CARBON
  
***************
*** 6145,6148 ****
--- 6257,6262 ----
  	 "(WindowPtr window, Rect boundsRect, CFStringRef title, UInt16 thickness, UInt16 behavior, ControlButtonContentInfo info, SInt16 menuID, UInt16 menuBehavior, UInt16 menuPlacement) -> (ControlHandle outControl)"},
  #endif
+ 	{"CreateSliderControl", (PyCFunction)Ctl_CreateSliderControl, 1,
+ 	 "(WindowPtr window, Rect boundsRect, SInt32 value, SInt32 minimum, SInt32 maximum, UInt16 orientation, UInt16 numTickMarks, Boolean liveTracking, PyObject* liveTrackingProc) -> (ControlHandle outControl)"},
  
  #if TARGET_API_MAC_CARBON
***************
*** 6260,6263 ****
--- 6374,6379 ----
  	 "(WindowPtr window, Rect boundsRect, CFStringRef title, SInt32 initialValue, Boolean autoToggle) -> (ControlHandle outControl)"},
  #endif
+ 	{"CreateScrollBarControl", (PyCFunction)Ctl_CreateScrollBarControl, 1,
+ 	 "(WindowPtr window, Rect boundsRect, SInt32 value, SInt32 minimum, SInt32 maximum, SInt32 viewSize, Boolean liveTracking, PyObject* liveTrackingProc) -> (ControlHandle outControl)"},
  
  #if TARGET_API_MAC_CARBON
***************
*** 6372,6377 ****
  	if (rv)
  		Py_DECREF(rv);
! 	else
  		PySys_WriteStderr("TrackControl or HandleControlClick: exception in tracker function\n");
  }
  
--- 6488,6495 ----
  	if (rv)
  		Py_DECREF(rv);
! 	else {
  		PySys_WriteStderr("TrackControl or HandleControlClick: exception in tracker function\n");
+ 		PyErr_Print();
+ 	}
  }
  
***************
*** 6382,6386 ****
  	char keybuf[9];
  	
! 	if ( which == kControlUserPaneDrawProcTag )
  		*uppp = (UniversalProcPtr)mydrawproc_upp;
  	else if ( which == kControlUserPaneIdleProcTag )
--- 6500,6506 ----
  	char keybuf[9];
  	
! 	if ( which == kMyControlActionProcTag )
! 		*uppp = (UniversalProcPtr)myactionproc_upp;
! 	else if ( which == kControlUserPaneDrawProcTag )
  		*uppp = (UniversalProcPtr)mydrawproc_upp;
  	else if ( which == kControlUserPaneIdleProcTag )
***************
*** 6419,6428 ****
  	}
  	rv = PyEval_CallObject(func, arglist);
! 	if ( rv == NULL )
  		PySys_WriteStderr("Exception in control callback %x handler\n", (unsigned)which);
  	return rv;
  }
  
  static pascal void
  mydrawproc(ControlHandle control, SInt16 part)
  {
--- 6539,6563 ----
  	}
  	rv = PyEval_CallObject(func, arglist);
! 	if ( rv == NULL ) {
  		PySys_WriteStderr("Exception in control callback %x handler\n", (unsigned)which);
+ 		PyErr_Print();
+ 	}
  	return rv;
  }
  
  static pascal void
+ myactionproc(ControlHandle control, SInt16 part)
+ {
+ 	ControlObject *ctl_obj;
+ 	PyObject *arglist, *rv;
+ 	
+ 	ctl_obj = (ControlObject *)CtlObj_WhichControl(control);
+ 	arglist = Py_BuildValue("Oh", ctl_obj, part);
+ 	rv = callcallback(ctl_obj, kMyControlActionProcTag, arglist);
+ 	Py_XDECREF(arglist);
+ 	Py_XDECREF(rv);
+ }
+ 
+ static pascal void
  mydrawproc(ControlHandle control, SInt16 part)
  {
***************
*** 6495,6498 ****
--- 6630,6634 ----
  
  	mytracker_upp = NewControlActionUPP(mytracker);
+ 	myactionproc_upp = NewControlActionUPP(myactionproc);
  	mydrawproc_upp = NewControlUserPaneDrawUPP(mydrawproc);
  	myidleproc_upp = NewControlUserPaneIdleUPP(myidleproc);

Index: ctlscan.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Mac/Modules/ctl/ctlscan.py,v
retrieving revision 1.25
retrieving revision 1.26
diff -C2 -d -r1.25 -r1.26
*** ctlscan.py	2001/12/18 20:15:27	1.25
--- ctlscan.py	2001/12/30 21:25:26	1.26
***************
*** 89,92 ****
--- 89,93 ----
  			'SendControlMessage', # Parameter changed from long to void* from UH3.3 to UH3.4
  			'CreateTabsControl',  # wrote manually
+ 			'GetControlAction',  # too much effort for too little usefulness
  			
  			# too lazy for now
***************
*** 260,264 ****
  		return [
  			'ProcPtr',
! 			'ControlActionUPP',
  			'Ptr',
  			'ControlDefSpec', # Don't know how to do this yet
--- 261,265 ----
  		return [
  			'ProcPtr',
! #			'ControlActionUPP',
  			'Ptr',
  			'ControlDefSpec', # Don't know how to do this yet
***************
*** 320,323 ****
--- 321,327 ----
  			([("ControlButtonContentInfo", '*', "OutMode")],
  			 [("ControlButtonContentInfo", '*', "InMode")]),
+ 			
+ 			([("ControlActionUPP", 'liveTrackingProc', "InMode")],
+ 			 [("ControlActionUPPNewControl", 'liveTrackingProc', "InMode")]),
  			]
  

Index: ctlsupport.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Mac/Modules/ctl/ctlsupport.py,v
retrieving revision 1.47
retrieving revision 1.48
diff -C2 -d -r1.47 -r1.48
*** ctlsupport.py	2001/12/18 12:53:47	1.47
--- ctlsupport.py	2001/12/30 21:25:26	1.48
***************
*** 95,98 ****
--- 95,116 ----
  ControlPushButtonIconAlignment = UInt16
  
+ class ControlActionDefinition(Type):
+ 	def declare(self, name):
+ 		Output("%s %s;", self.typeName, name)
+ 		Output("UniversalProcPtr c_callback;")
+ 	def passInput(self, name):
+ 		return "myactionproc_upp"
+ 	def cleanup(self, name):
+ 		Output("setcallback((PyObject*)_self, kMyControlActionProcTag, actionProc, &c_callback);")
+ 
+ class ControlActionDefinitionNewControl(ControlActionDefinition):
+ 	def cleanup(self, name):
+ 		Output("setcallback(_res, kMyControlActionProcTag, liveTrackingProc, &c_callback);")
+ 
+ ControlActionUPP = ControlActionDefinition("PyObject*", "O")
+ ControlActionUPPNewControl = ControlActionDefinitionNewControl("PyObject*", "O")
+ ControlSliderOrientation = UInt16
+ 
+ 
  includestuff = includestuff + """
  #ifdef WITHOUT_FRAMEWORKS
***************
*** 204,209 ****
--- 222,229 ----
  
  /* TrackControl and HandleControlClick callback support */
+ #define kMyControlActionProcTag 'ACTN'  /* not an official tag, only for internal use */
  static PyObject *tracker;
  static ControlActionUPP mytracker_upp;
+ static ControlActionUPP myactionproc_upp;
  static ControlUserPaneDrawUPP mydrawproc_upp;
  static ControlUserPaneIdleUPP myidleproc_upp;
***************
*** 280,285 ****
  	if (rv)
  		Py_DECREF(rv);
! 	else
  		PySys_WriteStderr("TrackControl or HandleControlClick: exception in tracker function\\n");
  }
  
--- 300,307 ----
  	if (rv)
  		Py_DECREF(rv);
! 	else {
  		PySys_WriteStderr("TrackControl or HandleControlClick: exception in tracker function\\n");
+ 		PyErr_Print();
+ 	}
  }
  
***************
*** 290,294 ****
  	char keybuf[9];
  	
! 	if ( which == kControlUserPaneDrawProcTag )
  		*uppp = (UniversalProcPtr)mydrawproc_upp;
  	else if ( which == kControlUserPaneIdleProcTag )
--- 312,318 ----
  	char keybuf[9];
  	
! 	if ( which == kMyControlActionProcTag )
! 		*uppp = (UniversalProcPtr)myactionproc_upp;
! 	else if ( which == kControlUserPaneDrawProcTag )
  		*uppp = (UniversalProcPtr)mydrawproc_upp;
  	else if ( which == kControlUserPaneIdleProcTag )
***************
*** 327,336 ****
  	}
  	rv = PyEval_CallObject(func, arglist);
! 	if ( rv == NULL )
  		PySys_WriteStderr("Exception in control callback %x handler\\n", (unsigned)which);
  	return rv;
  }
  
  static pascal void
  mydrawproc(ControlHandle control, SInt16 part)
  {
--- 351,375 ----
  	}
  	rv = PyEval_CallObject(func, arglist);
! 	if ( rv == NULL ) {
  		PySys_WriteStderr("Exception in control callback %x handler\\n", (unsigned)which);
+ 		PyErr_Print();
+ 	}
  	return rv;
  }
  
  static pascal void
+ myactionproc(ControlHandle control, SInt16 part)
+ {
+ 	ControlObject *ctl_obj;
+ 	PyObject *arglist, *rv;
+ 	
+ 	ctl_obj = (ControlObject *)CtlObj_WhichControl(control);
+ 	arglist = Py_BuildValue("Oh", ctl_obj, part);
+ 	rv = callcallback(ctl_obj, kMyControlActionProcTag, arglist);
+ 	Py_XDECREF(arglist);
+ 	Py_XDECREF(rv);
+ }
+ 
+ static pascal void
  mydrawproc(ControlHandle control, SInt16 part)
  {
***************
*** 397,400 ****
--- 436,440 ----
  initstuff = initstuff + """
  mytracker_upp = NewControlActionUPP(mytracker);
+ myactionproc_upp = NewControlActionUPP(myactionproc);
  mydrawproc_upp = NewControlUserPaneDrawUPP(mydrawproc);
  myidleproc_upp = NewControlUserPaneIdleUPP(myidleproc);