From f9b5fec03dfc1f614432bc03bd04df4bdaa01502 Mon Sep 17 00:00:00 2001 From: kichikuou Date: Sat, 2 Jul 2022 09:30:28 +0900 Subject: [PATCH] Implement mouse wheel input This implements iptGetWheelCount and iptClearWheelCount commands, and wheel events for SACT backlog. --- modules/SACT/SACT.c | 3 +++ modules/SACT/sprite_event.c | 34 ++++++++++++++++------------------ src/ags.h | 3 +-- src/cmd2F.c | 4 ++-- src/input.c | 8 ++++++++ src/input.h | 2 ++ src/sdl_core.h | 2 ++ src/sdl_event.c | 27 +++++++++++++++++++++++++++ 8 files changed, 61 insertions(+), 22 deletions(-) diff --git a/modules/SACT/SACT.c b/modules/SACT/SACT.c index 2bb870b..576ed3c 100644 --- a/modules/SACT/SACT.c +++ b/modules/SACT/SACT.c @@ -153,6 +153,9 @@ static void Init() { if (sact.version >= 120) { sact.logging = TRUE; +#ifdef __EMSCRIPTEN__ + EM_ASM( xsystem35.texthook.disableWheelEvent(0xffffffff) ); +#endif } else { sact.logging = FALSE; } diff --git a/modules/SACT/sprite_event.c b/modules/SACT/sprite_event.c index 72f1f8a..6530e2c 100644 --- a/modules/SACT/sprite_event.c +++ b/modules/SACT/sprite_event.c @@ -223,16 +223,15 @@ static void cb_waitkey_simple(agsevent_t *e) { } break; - case AGSEVENT_BUTTON_RELEASE: + case AGSEVENT_MOUSE_WHEEL: // back log view mode に移行 - if (e->d3 == AGSEVENT_WHEEL_UP || - e->d3 == AGSEVENT_WHEEL_DN) { - // MessageKey 待ちのときのみ - if (sact.waittype != KEYWAIT_MESSAGE) break; - sblog_start(); - sact.waittype = KEYWAIT_BACKLOG; - break; - } + // MessageKey 待ちのときのみ + if (sact.waittype != KEYWAIT_MESSAGE) break; + sblog_start(); + sact.waittype = KEYWAIT_BACKLOG; + break; + + case AGSEVENT_BUTTON_RELEASE: if (sact.zhiding) { slist_foreach(sact.sp_zhide, cb_focused_zkey, &update); sact.zhiding = FALSE; @@ -407,19 +406,18 @@ static void cb_waitkey_backlog(agsevent_t *e) { break; case AGSEVENT_BUTTON_RELEASE: - switch(e->d3) { - case AGSEVENT_WHEEL_UP: - sblog_pagenext(); - break; - case AGSEVENT_WHEEL_DN: - sblog_pagepre(); - break; - case AGSEVENT_BUTTON_RIGHT: + if (e->d3 == AGSEVENT_BUTTON_RIGHT) { sblog_end(); sact.waittype = KEYWAIT_MESSAGE; - break; } break; + + case AGSEVENT_MOUSE_WHEEL: + if (e->d3 > 0) + sblog_pagenext(); + else + sblog_pagepre(); + break; } } diff --git a/src/ags.h b/src/ags.h index 159f9e2..8b06f73 100644 --- a/src/ags.h +++ b/src/ags.h @@ -91,12 +91,11 @@ typedef struct _agsevent agsevent_t; #define AGSEVENT_KEY_PRESS 4 #define AGSEVENT_KEY_RELEASE 5 #define AGSEVENT_TIMER 6 +#define AGSEVENT_MOUSE_WHEEL 7 #define AGSEVENT_BUTTON_LEFT 1 #define AGSEVENT_BUTTON_MID 2 #define AGSEVENT_BUTTON_RIGHT 3 -#define AGSEVENT_WHEEL_UP 4 -#define AGSEVENT_WHEEL_DN 5 struct _ags { diff --git a/src/cmd2F.c b/src/cmd2F.c index 33540b8..60c3812 100644 --- a/src/cmd2F.c +++ b/src/cmd2F.c @@ -619,6 +619,7 @@ void commands2F37() { } void commands2F38() { + sys_clearWheelInfo(); DEBUG_COMMAND("iptClearWheelCount:\n"); } @@ -626,8 +627,7 @@ void commands2F39() { int *vForward = getCaliVariable(); int *vBack = getCaliVariable(); - *vForward = 0; - *vBack = 0; + sys_getWheelInfo(vForward, vBack); DEBUG_COMMAND("iptGetWheelCount %d, %d:\n", *vForward, *vBack); } diff --git a/src/input.c b/src/input.c index 5d6796b..dd2334e 100644 --- a/src/input.c +++ b/src/input.c @@ -65,6 +65,14 @@ int sys_getMouseInfo(MyPoint *p, boolean is_dibgeo) { return key; } +void sys_getWheelInfo(int *forward, int *back) { + sdl_getWheelInfo(forward, back); +} + +void sys_clearWheelInfo(void) { + sdl_clearWheelInfo(); +} + int sys_getKeyInfo() { return sdl_getKeyInfo(); } diff --git a/src/input.h b/src/input.h index ff74199..6a18de4 100644 --- a/src/input.h +++ b/src/input.h @@ -46,6 +46,8 @@ extern int sys_getMouseInfo(MyPoint *p, boolean is_dibgeo); extern int sys_getInputInfo(void); extern int sys_getKeyInfo(void); extern int sys_getJoyInfo(void); +extern void sys_getWheelInfo(int *forward, int *back); +extern void sys_clearWheelInfo(void); extern void sys_key_releasewait(int key, boolean zi_mask_enabled); extern void sys_hit_any_key(); extern void set_hak_keymode(int key, int mode); diff --git a/src/sdl_core.h b/src/sdl_core.h index 395329e..09acdb7 100644 --- a/src/sdl_core.h +++ b/src/sdl_core.h @@ -97,6 +97,8 @@ extern void sdl_setCursorType(int type); extern boolean sdl_cursorNew(BYTE* data, int no, CursorImage *cursorImage, TCursorDirEntry *cursordirentry); extern int sdl_getKeyInfo(); extern int sdl_getMouseInfo(MyPoint *p); +extern void sdl_getWheelInfo(int *forward, int *back); +extern void sdl_clearWheelInfo(void); extern int sdl_getJoyInfo(void); extern void sdl_setAutoRepeat(boolean enable); extern MyPoint sdl_translateMouseCoords(int x, int y); diff --git a/src/sdl_event.c b/src/sdl_event.c index 2c073e3..f97fbd6 100644 --- a/src/sdl_event.c +++ b/src/sdl_event.c @@ -44,6 +44,7 @@ static void keyEventProsess(SDL_KeyboardEvent *e, boolean pressed); /* pointer の状態 */ static int mousex, mousey, mouseb; +static int mouse_wheel_up, mouse_wheel_down; boolean RawKeyInfo[256]; /* SDL Joystick */ @@ -156,6 +157,18 @@ static void sdl_getEvent(void) { mousey = e.motion.y; send_agsevent(AGSEVENT_MOUSE_MOTION, 0); break; + + case SDL_MOUSEWHEEL: + { + int y = e.wheel.y * (e.wheel.direction == SDL_MOUSEWHEEL_FLIPPED ? -1 : 1); + if (y > 0) + mouse_wheel_up += y; + else if (y < 0) + mouse_wheel_down -= y; + send_agsevent(AGSEVENT_MOUSE_WHEEL, y); + break; + } + case SDL_MOUSEBUTTONDOWN: mouseb |= (1 << e.button.button); RawKeyInfo[mouse_to_rawkey(e.button.button)] = TRUE; @@ -311,6 +324,20 @@ int sdl_getMouseInfo(MyPoint *p) { return m1 | m2; } +void sdl_getWheelInfo(int *forward, int *back) { + sdl_getEvent(); + *forward = mouse_wheel_up; + *back = mouse_wheel_down; + +#ifdef __EMSCRIPTEN__ + EM_ASM( xsystem35.texthook.disableWheelEvent(100) ); +#endif +} + +void sdl_clearWheelInfo(void) { + mouse_wheel_up = mouse_wheel_down = 0; +} + int sdl_getJoyInfo(void) { sdl_getEvent(); return joyinfo;