diff options
Diffstat (limited to 'areahandler.go')
| -rw-r--r-- | areahandler.go | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/areahandler.go b/areahandler.go new file mode 100644 index 0000000..0998f56 --- /dev/null +++ b/areahandler.go @@ -0,0 +1,73 @@ +// 13 december 2015 +package main + +// #include "ui.h" +// extern void doAreaHandlerDraw(uiAreaHandler *, uiArea *, uiAreaDrawParams *); +// static inline void uiAreaHandler *allocAreaHandler(void) +// { +// uiAreaHandler *ah; +// +// ah = (uiAreaHandler *) malloc(sizeof (uiAreaHandler)); +// if (ah == NULL) +// return NULL; +// ah->Draw = doAreaHandlerDraw; +// return ah; +// } +// static inline void freeAreaHandler(uiAreaHandler *ah) +// { +// free(ah); +// } +import "C" + +// no need to lock this; only the GUI thread can access it +var areahandlers = make(map[*C.uiAreaHandler]AreaHandler) + +// AreaHandler defines the functionality needed for handling events +// from an Area. +type AreaHandler interface { + // TODO document all these + Draw(a *Area, dp *AreaDrawParams) +} + +func registerHandler(ah AreaHandler) *C.uiAreaHandler { + uah := C.allocAreaHandler() + areahandlers[uah] = ah + return uah +} + +func unregisterAreaHandler(uah *C.uiAreaHandler) { + delete(areahandlers, uah) + C.freeAreaHandler(uah) +} + +// AreaDrawParams defines the TODO. +type AreaDrawParams struct { + // TODO document all these + Context *DrawContext + ClientWidth float64 + ClientHeight float64 + ClipX float64 + ClipY float64 + ClipWidth float64 + ClipHeight float64 + HScrollPos int + VScrollPos int +} + +// export doAreaHandlerDraw +func doAreaHandlerDraw(uah *C.uiAreaHandler, ua *C.uiArea, udp *C.uiAreaDrawParams) { + ah := areahandlers[uah] + a := areas[ua] + dp := &AreaDrawParams{ + Context: &DrawContext{udp.Context}, + ClientWidth: float64(udp.ClientWidth), + ClientHeight: float64(udp.ClientHeight), + ClipX: float64(udp.ClipX), + ClipY: float64(udp.ClipY), + ClipWidth: float64(udp.ClipWidth), + ClipHeight: float64(udp.ClipHeight), + HScrollPos: int(udp.HScrollPos), + VScrollPos: int(udp.VScrollPos), + } + ah.Draw(a, dp) +} |
