/*
 * qebind.h --
 *
 *	This module is the header for quasi-events.
 *
 * Copyright (c) 2002-2011 Tim Baker
 */

#ifndef INCLUDED_QEBIND_H
#define INCLUDED_QEBIND_H

/*
 * Used to tag functions that are only to be visible within the module being
 * built and not outside it (where this is supported by the linker).
 */

#ifndef MODULE_SCOPE
#   ifdef __cplusplus
#	define MODULE_SCOPE extern "C"
#   else
#	define MODULE_SCOPE extern
#   endif
#endif

#if TCL_MAJOR_VERSION < 9
#   define Tcl_Size int
#endif

typedef struct QE_BindingTable_ *QE_BindingTable;

/* Pass to QE_BindEvent */
typedef struct QE_Event {
	int type;
	int detail;
	ClientData clientData;
} QE_Event;

typedef struct QE_ExpandArgs {
	QE_BindingTable bindingTable;
	char which;
	ClientData object;
	Tcl_DString *result;
	int event;
	int detail;
	ClientData clientData;
} QE_ExpandArgs;

typedef void (*QE_ExpandProc)(QE_ExpandArgs *args);

MODULE_SCOPE int debug_bindings;

MODULE_SCOPE int QE_BindInit(Tcl_Interp *interp);
MODULE_SCOPE QE_BindingTable QE_CreateBindingTable(Tcl_Interp *interp);
MODULE_SCOPE void QE_DeleteBindingTable(QE_BindingTable bindingTable);
MODULE_SCOPE int QE_InstallEvent(QE_BindingTable bindingTable, char *name, QE_ExpandProc expand);
MODULE_SCOPE int QE_InstallDetail(QE_BindingTable bindingTable, char *name, int eventType, QE_ExpandProc expand);
MODULE_SCOPE int QE_UninstallEvent(QE_BindingTable bindingTable, int eventType);
MODULE_SCOPE int QE_UninstallDetail(QE_BindingTable bindingTable, int eventType, int detail);
MODULE_SCOPE int QE_CreateBinding(QE_BindingTable bindingTable,
	ClientData object, char *eventString, char *command, int append);
MODULE_SCOPE int QE_DeleteBinding(QE_BindingTable bindingTable,
	ClientData object, char *eventString);
MODULE_SCOPE int QE_GetAllObjects(QE_BindingTable bindingTable);
MODULE_SCOPE int QE_GetBinding(QE_BindingTable bindingTable,
	ClientData object, char *eventString);
MODULE_SCOPE int QE_GetAllBindings(QE_BindingTable bindingTable,
	ClientData object);
MODULE_SCOPE int QE_GetEventNames(QE_BindingTable bindingTable);
MODULE_SCOPE int QE_GetDetailNames(QE_BindingTable bindingTable, char *eventName);
MODULE_SCOPE int QE_BindEvent(QE_BindingTable bindingTable, QE_Event *eventPtr);
MODULE_SCOPE void QE_ExpandDouble(double number, Tcl_DString *result);
MODULE_SCOPE void QE_ExpandNumber(long number, Tcl_DString *result);
MODULE_SCOPE void QE_ExpandString(char *string, Tcl_DString *result);
MODULE_SCOPE void QE_ExpandEvent(QE_BindingTable bindingTable, int eventType, Tcl_DString *result);
MODULE_SCOPE void QE_ExpandDetail(QE_BindingTable bindingTable, int event, int detail, Tcl_DString *result);
MODULE_SCOPE void QE_ExpandPattern(QE_BindingTable bindingTable, int eventType, int detail, Tcl_DString *result);
MODULE_SCOPE void QE_ExpandUnknown(char which, Tcl_DString *result);
MODULE_SCOPE int QE_BindCmd(QE_BindingTable bindingTable, int objOffset, int objc,
	Tcl_Obj *const objv[]);
MODULE_SCOPE int QE_ConfigureCmd(QE_BindingTable bindingTable, int objOffset, int objc,
	Tcl_Obj *const objv[]);
MODULE_SCOPE int QE_GenerateCmd(QE_BindingTable bindingTable, int objOffset, int objc,
	Tcl_Obj *const objv[]);
MODULE_SCOPE int QE_InstallCmd(QE_BindingTable bindingTable, int objOffset, int objc,
	Tcl_Obj *const objv[]);
MODULE_SCOPE int QE_UnbindCmd(QE_BindingTable bindingTable, int objOffset, int objc,
	Tcl_Obj *const objv[]);
MODULE_SCOPE int QE_UninstallCmd(QE_BindingTable bindingTable, int objOffset, int objc,
	Tcl_Obj *const objv[]);
MODULE_SCOPE int QE_LinkageCmd(QE_BindingTable bindingTable, int objOffset, int objc,
	Tcl_Obj *const objv[]);

#endif /* INCLUDED_QEBIND_H */

