
/* ========================== Module _Evt =========================== */

#include "Python.h"

#ifndef __LP64__


#include "pymactoolbox.h"

/* Macro to test whether a weak-loaded CFM function exists */
#define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL )  {\
        PyErr_SetString(PyExc_NotImplementedError, \
        "Not available in this shared library/OS version"); \
        return NULL; \
    }} while(0)


#include <Carbon/Carbon.h>


static PyObject *Evt_Error;

static PyObject *Evt_GetMouse(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	Point mouseLoc;
#ifndef GetMouse
	PyMac_PRECHECK(GetMouse);
#endif
	if (!PyArg_ParseTuple(_args, ""))
		return NULL;
	GetMouse(&mouseLoc);
	_res = Py_BuildValue("O&",
	                     PyMac_BuildPoint, mouseLoc);
	return _res;
}

static PyObject *Evt_Button(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	Boolean _rv;
#ifndef Button
	PyMac_PRECHECK(Button);
#endif
	if (!PyArg_ParseTuple(_args, ""))
		return NULL;
	_rv = Button();
	_res = Py_BuildValue("b",
	                     _rv);
	return _res;
}

static PyObject *Evt_StillDown(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	Boolean _rv;
#ifndef StillDown
	PyMac_PRECHECK(StillDown);
#endif
	if (!PyArg_ParseTuple(_args, ""))
		return NULL;
	_rv = StillDown();
	_res = Py_BuildValue("b",
	                     _rv);
	return _res;
}

static PyObject *Evt_WaitMouseUp(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	Boolean _rv;
#ifndef WaitMouseUp
	PyMac_PRECHECK(WaitMouseUp);
#endif
	if (!PyArg_ParseTuple(_args, ""))
		return NULL;
	_rv = WaitMouseUp();
	_res = Py_BuildValue("b",
	                     _rv);
	return _res;
}

static PyObject *Evt_GetCaretTime(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	UInt32 _rv;
#ifndef GetCaretTime
	PyMac_PRECHECK(GetCaretTime);
#endif
	if (!PyArg_ParseTuple(_args, ""))
		return NULL;
	_rv = GetCaretTime();
	_res = Py_BuildValue("l",
	                     _rv);
	return _res;
}

static PyObject *Evt_GetKeys(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	KeyMap theKeys__out__;
#ifndef GetKeys
	PyMac_PRECHECK(GetKeys);
#endif
	if (!PyArg_ParseTuple(_args, ""))
		return NULL;
	GetKeys(theKeys__out__);
	_res = Py_BuildValue("s#",
	                     (char *)&theKeys__out__, (int)sizeof(KeyMap));
	return _res;
}

static PyObject *Evt_GetDblTime(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	UInt32 _rv;
#ifndef GetDblTime
	PyMac_PRECHECK(GetDblTime);
#endif
	if (!PyArg_ParseTuple(_args, ""))
		return NULL;
	_rv = GetDblTime();
	_res = Py_BuildValue("l",
	                     _rv);
	return _res;
}

static PyObject *Evt_SetEventMask(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	EventMask value;
#ifndef SetEventMask
	PyMac_PRECHECK(SetEventMask);
#endif
	if (!PyArg_ParseTuple(_args, "H",
	                      &value))
		return NULL;
	SetEventMask(value);
	Py_INCREF(Py_None);
	_res = Py_None;
	return _res;
}

static PyObject *Evt_GetNextEvent(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	Boolean _rv;
	EventMask eventMask;
	EventRecord theEvent;
#ifndef GetNextEvent
	PyMac_PRECHECK(GetNextEvent);
#endif
	if (!PyArg_ParseTuple(_args, "H",
	                      &eventMask))
		return NULL;
	_rv = GetNextEvent(eventMask,
	                   &theEvent);
	_res = Py_BuildValue("bO&",
	                     _rv,
	                     PyMac_BuildEventRecord, &theEvent);
	return _res;
}

static PyObject *Evt_EventAvail(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	Boolean _rv;
	EventMask eventMask;
	EventRecord theEvent;
#ifndef EventAvail
	PyMac_PRECHECK(EventAvail);
#endif
	if (!PyArg_ParseTuple(_args, "H",
	                      &eventMask))
		return NULL;
	_rv = EventAvail(eventMask,
	                 &theEvent);
	_res = Py_BuildValue("bO&",
	                     _rv,
	                     PyMac_BuildEventRecord, &theEvent);
	return _res;
}

static PyObject *Evt_PostEvent(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSErr _err;
	EventKind eventNum;
	UInt32 eventMsg;
#ifndef PostEvent
	PyMac_PRECHECK(PostEvent);
#endif
	if (!PyArg_ParseTuple(_args, "Hl",
	                      &eventNum,
	                      &eventMsg))
		return NULL;
	_err = PostEvent(eventNum,
	                 eventMsg);
	if (_err != noErr) return PyMac_Error(_err);
	Py_INCREF(Py_None);
	_res = Py_None;
	return _res;
}

static PyObject *Evt_FlushEvents(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	EventMask whichMask;
	EventMask stopMask;
#ifndef FlushEvents
	PyMac_PRECHECK(FlushEvents);
#endif
	if (!PyArg_ParseTuple(_args, "HH",
	                      &whichMask,
	                      &stopMask))
		return NULL;
	FlushEvents(whichMask,
	            stopMask);
	Py_INCREF(Py_None);
	_res = Py_None;
	return _res;
}

static PyObject *Evt_GetGlobalMouse(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	Point globalMouse;
#ifndef GetGlobalMouse
	PyMac_PRECHECK(GetGlobalMouse);
#endif
	if (!PyArg_ParseTuple(_args, ""))
		return NULL;
	GetGlobalMouse(&globalMouse);
	_res = Py_BuildValue("O&",
	                     PyMac_BuildPoint, globalMouse);
	return _res;
}

static PyObject *Evt_GetCurrentKeyModifiers(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	UInt32 _rv;
#ifndef GetCurrentKeyModifiers
	PyMac_PRECHECK(GetCurrentKeyModifiers);
#endif
	if (!PyArg_ParseTuple(_args, ""))
		return NULL;
	_rv = GetCurrentKeyModifiers();
	_res = Py_BuildValue("l",
	                     _rv);
	return _res;
}

static PyObject *Evt_CheckEventQueueForUserCancel(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	Boolean _rv;
#ifndef CheckEventQueueForUserCancel
	PyMac_PRECHECK(CheckEventQueueForUserCancel);
#endif
	if (!PyArg_ParseTuple(_args, ""))
		return NULL;
	_rv = CheckEventQueueForUserCancel();
	_res = Py_BuildValue("b",
	                     _rv);
	return _res;
}

static PyObject *Evt_KeyScript(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	short code;
#ifndef KeyScript
	PyMac_PRECHECK(KeyScript);
#endif
	if (!PyArg_ParseTuple(_args, "h",
	                      &code))
		return NULL;
	KeyScript(code);
	Py_INCREF(Py_None);
	_res = Py_None;
	return _res;
}

static PyObject *Evt_IsCmdChar(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	Boolean _rv;
	EventRecord event;
	short test;
#ifndef IsCmdChar
	PyMac_PRECHECK(IsCmdChar);
#endif
	if (!PyArg_ParseTuple(_args, "O&h",
	                      PyMac_GetEventRecord, &event,
	                      &test))
		return NULL;
	_rv = IsCmdChar(&event,
	                test);
	_res = Py_BuildValue("b",
	                     _rv);
	return _res;
}

static PyObject *Evt_LMGetKeyThresh(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	SInt16 _rv;
#ifndef LMGetKeyThresh
	PyMac_PRECHECK(LMGetKeyThresh);
#endif
	if (!PyArg_ParseTuple(_args, ""))
		return NULL;
	_rv = LMGetKeyThresh();
	_res = Py_BuildValue("h",
	                     _rv);
	return _res;
}

static PyObject *Evt_LMSetKeyThresh(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	SInt16 value;
#ifndef LMSetKeyThresh
	PyMac_PRECHECK(LMSetKeyThresh);
#endif
	if (!PyArg_ParseTuple(_args, "h",
	                      &value))
		return NULL;
	LMSetKeyThresh(value);
	Py_INCREF(Py_None);
	_res = Py_None;
	return _res;
}

static PyObject *Evt_LMGetKeyRepThresh(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	SInt16 _rv;
#ifndef LMGetKeyRepThresh
	PyMac_PRECHECK(LMGetKeyRepThresh);
#endif
	if (!PyArg_ParseTuple(_args, ""))
		return NULL;
	_rv = LMGetKeyRepThresh();
	_res = Py_BuildValue("h",
	                     _rv);
	return _res;
}

static PyObject *Evt_LMSetKeyRepThresh(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	SInt16 value;
#ifndef LMSetKeyRepThresh
	PyMac_PRECHECK(LMSetKeyRepThresh);
#endif
	if (!PyArg_ParseTuple(_args, "h",
	                      &value))
		return NULL;
	LMSetKeyRepThresh(value);
	Py_INCREF(Py_None);
	_res = Py_None;
	return _res;
}

static PyObject *Evt_LMGetKbdLast(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	UInt8 _rv;
#ifndef LMGetKbdLast
	PyMac_PRECHECK(LMGetKbdLast);
#endif
	if (!PyArg_ParseTuple(_args, ""))
		return NULL;
	_rv = LMGetKbdLast();
	_res = Py_BuildValue("b",
	                     _rv);
	return _res;
}

static PyObject *Evt_LMSetKbdLast(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	UInt8 value;
#ifndef LMSetKbdLast
	PyMac_PRECHECK(LMSetKbdLast);
#endif
	if (!PyArg_ParseTuple(_args, "b",
	                      &value))
		return NULL;
	LMSetKbdLast(value);
	Py_INCREF(Py_None);
	_res = Py_None;
	return _res;
}

static PyObject *Evt_LMGetKbdType(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	UInt8 _rv;
#ifndef LMGetKbdType
	PyMac_PRECHECK(LMGetKbdType);
#endif
	if (!PyArg_ParseTuple(_args, ""))
		return NULL;
	_rv = LMGetKbdType();
	_res = Py_BuildValue("b",
	                     _rv);
	return _res;
}

static PyObject *Evt_LMSetKbdType(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	UInt8 value;
#ifndef LMSetKbdType
	PyMac_PRECHECK(LMSetKbdType);
#endif
	if (!PyArg_ParseTuple(_args, "b",
	                      &value))
		return NULL;
	LMSetKbdType(value);
	Py_INCREF(Py_None);
	_res = Py_None;
	return _res;
}

static PyObject *Evt_TickCount(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	UInt32 _rv;
#ifndef TickCount
	PyMac_PRECHECK(TickCount);
#endif
	if (!PyArg_ParseTuple(_args, ""))
		return NULL;
	_rv = TickCount();
	_res = Py_BuildValue("l",
	                     _rv);
	return _res;
}

static PyObject *Evt_WaitNextEvent(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;

	Boolean _rv;
	EventMask eventMask;
	EventRecord theEvent;
	UInt32 sleep;
	Handle mouseregion = (Handle)0;

	if (!PyArg_ParseTuple(_args, "Hl|O&",
	                      &eventMask,
	                      &sleep,
	                      OptResObj_Convert, &mouseregion))
	        return NULL;
	_rv = WaitNextEvent(eventMask,
	                    &theEvent,
	                    sleep,
	                    (RgnHandle)mouseregion);
	_res = Py_BuildValue("bO&",
	                     _rv,
	                     PyMac_BuildEventRecord, &theEvent);
	return _res;

}

static PyMethodDef Evt_methods[] = {
	{"GetMouse", (PyCFunction)Evt_GetMouse, 1,
	 PyDoc_STR("() -> (Point mouseLoc)")},
	{"Button", (PyCFunction)Evt_Button, 1,
	 PyDoc_STR("() -> (Boolean _rv)")},
	{"StillDown", (PyCFunction)Evt_StillDown, 1,
	 PyDoc_STR("() -> (Boolean _rv)")},
	{"WaitMouseUp", (PyCFunction)Evt_WaitMouseUp, 1,
	 PyDoc_STR("() -> (Boolean _rv)")},
	{"GetCaretTime", (PyCFunction)Evt_GetCaretTime, 1,
	 PyDoc_STR("() -> (UInt32 _rv)")},
	{"GetKeys", (PyCFunction)Evt_GetKeys, 1,
	 PyDoc_STR("() -> (KeyMap theKeys)")},
	{"GetDblTime", (PyCFunction)Evt_GetDblTime, 1,
	 PyDoc_STR("() -> (UInt32 _rv)")},
	{"SetEventMask", (PyCFunction)Evt_SetEventMask, 1,
	 PyDoc_STR("(EventMask value) -> None")},
	{"GetNextEvent", (PyCFunction)Evt_GetNextEvent, 1,
	 PyDoc_STR("(EventMask eventMask) -> (Boolean _rv, EventRecord theEvent)")},
	{"EventAvail", (PyCFunction)Evt_EventAvail, 1,
	 PyDoc_STR("(EventMask eventMask) -> (Boolean _rv, EventRecord theEvent)")},
	{"PostEvent", (PyCFunction)Evt_PostEvent, 1,
	 PyDoc_STR("(EventKind eventNum, UInt32 eventMsg) -> None")},
	{"FlushEvents", (PyCFunction)Evt_FlushEvents, 1,
	 PyDoc_STR("(EventMask whichMask, EventMask stopMask) -> None")},
	{"GetGlobalMouse", (PyCFunction)Evt_GetGlobalMouse, 1,
	 PyDoc_STR("() -> (Point globalMouse)")},
	{"GetCurrentKeyModifiers", (PyCFunction)Evt_GetCurrentKeyModifiers, 1,
	 PyDoc_STR("() -> (UInt32 _rv)")},
	{"CheckEventQueueForUserCancel", (PyCFunction)Evt_CheckEventQueueForUserCancel, 1,
	 PyDoc_STR("() -> (Boolean _rv)")},
	{"KeyScript", (PyCFunction)Evt_KeyScript, 1,
	 PyDoc_STR("(short code) -> None")},
	{"IsCmdChar", (PyCFunction)Evt_IsCmdChar, 1,
	 PyDoc_STR("(EventRecord event, short test) -> (Boolean _rv)")},
	{"LMGetKeyThresh", (PyCFunction)Evt_LMGetKeyThresh, 1,
	 PyDoc_STR("() -> (SInt16 _rv)")},
	{"LMSetKeyThresh", (PyCFunction)Evt_LMSetKeyThresh, 1,
	 PyDoc_STR("(SInt16 value) -> None")},
	{"LMGetKeyRepThresh", (PyCFunction)Evt_LMGetKeyRepThresh, 1,
	 PyDoc_STR("() -> (SInt16 _rv)")},
	{"LMSetKeyRepThresh", (PyCFunction)Evt_LMSetKeyRepThresh, 1,
	 PyDoc_STR("(SInt16 value) -> None")},
	{"LMGetKbdLast", (PyCFunction)Evt_LMGetKbdLast, 1,
	 PyDoc_STR("() -> (UInt8 _rv)")},
	{"LMSetKbdLast", (PyCFunction)Evt_LMSetKbdLast, 1,
	 PyDoc_STR("(UInt8 value) -> None")},
	{"LMGetKbdType", (PyCFunction)Evt_LMGetKbdType, 1,
	 PyDoc_STR("() -> (UInt8 _rv)")},
	{"LMSetKbdType", (PyCFunction)Evt_LMSetKbdType, 1,
	 PyDoc_STR("(UInt8 value) -> None")},
	{"TickCount", (PyCFunction)Evt_TickCount, 1,
	 PyDoc_STR("() -> (UInt32 _rv)")},
	{"WaitNextEvent", (PyCFunction)Evt_WaitNextEvent, 1,
	 PyDoc_STR("(EventMask eventMask, UInt32 sleep [,RegionHandle]) -> (Boolean _rv, EventRecord theEvent)")},
	{NULL, NULL, 0}
};


#else /* __LP64__ */

static PyMethodDef Evt_methods[] = {
	{NULL, NULL, 0}
};
#endif /* __LP64__ */


void init_Evt(void)
{
	PyObject *m;
#ifndef __LP64__
	PyObject *d;
#endif /* __LP64__ */




	m = Py_InitModule("_Evt", Evt_methods);
#ifndef __LP64__
	d = PyModule_GetDict(m);
	Evt_Error = PyMac_GetOSErrException();
	if (Evt_Error == NULL ||
	    PyDict_SetItemString(d, "Error", Evt_Error) != 0)
		return;
#endif /* __LP64__ */
}

/* ======================== End module _Evt ========================= */

