#include "livecode/api/api.h" #include namespace Inkscape { namespace Livecode { extern "C" Janet cfun_mouse_pos(int32_t argc, Janet *argv) { janet_fixarity(argc, 0); return janet_wrap_point(ctx().mouse().pos()); } extern "C" Janet cfun_mouse_delta(int32_t argc, Janet *argv) { janet_fixarity(argc, 0); return janet_wrap_point(ctx().mouse().delta()); } extern "C" Janet cfun_mouse_ui_pos(int32_t argc, Janet *argv) { janet_fixarity(argc, 0); return janet_wrap_point(ctx().mouse().ui_pos()); } extern "C" Janet cfun_mouse_ui_delta(int32_t argc, Janet *argv) { janet_fixarity(argc, 0); return janet_wrap_point(ctx().mouse().ui_delta()); } Janet janet_wrap_inputstate(InputState const &state) { switch (state) { case INPUTSTATE_NONE: return janet_wrap_nil(); case INPUTSTATE_HOVER: return janet_ckeywordv("hover"); case INPUTSTATE_PRESSED: return janet_ckeywordv("pressed"); case INPUTSTATE_HELD: return janet_ckeywordv("held"); case INPUTSTATE_RELEASED: return janet_ckeywordv("released"); default: janet_panic("unexpected event value"); } } extern "C" Janet cfun_mouse_event(int32_t argc, Janet *argv) { janet_arity(argc, 0, 1); guint button = janet_getsize(argv, 1); if (button < 1 || button > 5) { janet_panic("expected button to be between 1 and 5"); } return janet_wrap_inputstate(ctx().mouse().event(button)); } #define BUTTONMETHOD(name) \ extern "C" Janet cfun_mouse_##name(int32_t argc, Janet *argv) { \ janet_arity(argc, 0, 1); \ guint button = janet_getsize(argv, 1); \ if (button < 1 || button > 5) { \ janet_panic("expected button to be between 1 and 5"); \ } \ return janet_wrap_boolean(ctx().mouse().name(button)); \ } BUTTONMETHOD(pressed) BUTTONMETHOD(held) BUTTONMETHOD(released) const JanetReg it_cfuns[] = { { "mouse/pos", cfun_mouse_pos, "(mouse/pos)\n\nGet the current mouse position as a geom/point." }, { "mouse/delta", cfun_mouse_delta, "(mouse/pos)\n\nGet the mouse motion since last frame as a geom/point." }, { "mouse/ui-pos", cfun_mouse_ui_pos, "(mouse/pos)\n\nGet the current mouse position as a geom/point, in UI space." }, { "mouse/ui-delta", cfun_mouse_ui_delta, "(mouse/pos)\n\nGet the mouse motion since last frame as a geom/point, in UI space." }, { "mouse/event", cfun_mouse_event, "(mouse/event [button])\n\nGet the current event/status for a mouse button.\n" "Returns either nil, :pressed, :held or :released." }, { "mouse/pressed", cfun_mouse_pressed, "(mouse/pressed [button])\n\nCheck whether a mouse button was pressed this frame.\n" }, { "mouse/held", cfun_mouse_held, "(mouse/held [button])\n\nCheck whether a mouse button was held down this frame.\n" }, { "mouse/released", cfun_mouse_released, "(mouse/released [button])\n\nCheck whether a mouse button was released this frame.\n" }, {NULL, NULL, NULL} }; void janet_lib_input(JanetTable *env) { janet_printf("yoloading"); janet_cfuns(env, NULL, it_cfuns); } } }