65816-llvm-mos/runtime/src/eventLoop.c
2026-05-30 19:40:29 -05:00

78 lines
2.3 KiB
C

// eventLoop.c - implementation of iigs/eventLoop.h.
//
// TaskMaster returns an event-code that already encodes "this was a
// close-box click / menu pick / drag-region click / ..." so the loop
// body is a switch on the return code, not a manual GetNextEvent.
#include "iigs/eventLoop.h"
#include "iigs/toolbox.h"
static int gShouldQuit = 0;
// TaskMaster return codes (subset — see TB Vol.2 ch.5).
enum {
EV_NULL = 0,
EV_MOUSE_DOWN = 1,
EV_MOUSE_UP = 2,
EV_KEY_DOWN = 3,
EV_AUTO_KEY = 5,
EV_UPDATE = 6,
EV_ACTIVATE = 8,
EV_SWITCH = 9,
EV_MENU_PICK = 17,
EV_CLOSE_CLICK = 22,
EV_ZOOM_CLICK = 23,
EV_GROW_CLICK = 24
};
void iigsEventLoopQuit(void) {
gShouldQuit = 1;
}
void iigsEventLoop(const IigsEventCallbacksT *cb) {
static IigsEventT ev; // static so we don't blow the stack each call
gShouldQuit = 0;
while (!gShouldQuit) {
uint16_t code = TaskMaster(0xFFFF, &ev);
switch (code) {
case EV_NULL:
if (cb && cb->onIdle) {
cb->onIdle();
}
break;
case EV_CLOSE_CLICK:
if (cb && cb->onClose) {
cb->onClose(ev.window);
}
break;
case EV_MENU_PICK: {
uint16_t menuId = (uint16_t)(ev.message >> 16);
uint16_t itemId = (uint16_t)(ev.message & 0xFFFFu);
if (cb && cb->onMenu) {
cb->onMenu(menuId, itemId);
}
HiliteMenu(0, menuId);
break;
}
case EV_KEY_DOWN:
case EV_AUTO_KEY:
if (cb && cb->onKey) {
cb->onKey((uint8_t)(ev.message & 0xFFu), &ev);
}
break;
case EV_MOUSE_DOWN:
if (cb && cb->onMouse) {
cb->onMouse(&ev);
}
break;
default:
// TaskMaster handled it internally (drag/zoom/grow/
// update/activate dispatch). No callback for these
// in the current surface; add later if needed.
break;
}
}
}