Fix pointer inputs not being properly intercepted by onscreen keyboard

Xbox: Fix being too sensitive to joystick input
This commit is contained in:
UnknownShadow200 2024-09-29 07:21:18 +10:00
parent a43ffbb54e
commit a004920785
7 changed files with 43 additions and 24 deletions

View file

@ -133,9 +133,9 @@ endif
ifeq ($(PLAT),dos) ifeq ($(PLAT),dos)
CC = i586-pc-msdosdjgpp-gcc CC = i586-pc-msdosdjgpp-gcc
LIBS = LIBS =
BUILD_DIR = build-dos
LDFLAGS = -g LDFLAGS = -g
OEXT = .exe OEXT = .exe
BUILD_DIR = build-dos
endif endif

View file

@ -79,8 +79,8 @@ extern struct _InputState {
cc_bool RawMode; cc_bool RawMode;
/* Sources available for input (Mouse/Keyboard, Gamepad) */ /* Sources available for input (Mouse/Keyboard, Gamepad) */
cc_uint8 Sources; cc_uint8 Sources;
/* Function that overrides all normal input handling (e.g. for virtual keyboard) */ /* Function that can override all normal input handling (e.g. for virtual keyboard) */
void (*DownHook)(int btn, struct InputDevice* device); cc_bool (*DownHook)(int btn, struct InputDevice* device);
} Input; } Input;
/* Sets Input_Pressed[key] to true and raises InputEvents.Down */ /* Sets Input_Pressed[key] to true and raises InputEvents.Down */
@ -185,9 +185,9 @@ extern struct TouchPointer touches[INPUT_MAX_POINTERS];
struct Pointer { struct Pointer {
int x, y; int x, y;
/* Function that overrides all normal pointer input press handling */ /* Function that overrides all normal pointer input press handling */
void (*DownHook)(int index); cc_bool (*DownHook)(int index);
/* Function that overrides all normal pointer input release handling */ /* Function that overrides all normal pointer input release handling */
void (*UpHook) (int index); cc_bool (*UpHook) (int index);
}; };
CC_VAR extern struct Pointer Pointers[INPUT_MAX_POINTERS]; CC_VAR extern struct Pointer Pointers[INPUT_MAX_POINTERS];

View file

@ -784,7 +784,7 @@ cc_bool KeyBind_IsPressed(InputBind binding) { return Bind_IsTriggered[binding];
static void OnPointerDown(void* obj, int idx) { static void OnPointerDown(void* obj, int idx) {
struct Screen* s; struct Screen* s;
int i, x, y, mask; int i, x, y, mask;
if (Pointers[idx].DownHook) { Pointers[idx].DownHook(idx); return; } if (Pointers[0].DownHook && Pointers[0].DownHook(idx)) return;
/* Always set last click time, otherwise quickly tapping */ /* Always set last click time, otherwise quickly tapping */
/* sometimes triggers a 'delete' in InputHandler_Tick, */ /* sometimes triggers a 'delete' in InputHandler_Tick, */
@ -822,7 +822,7 @@ static void OnPointerDown(void* obj, int idx) {
static void OnPointerUp(void* obj, int idx) { static void OnPointerUp(void* obj, int idx) {
struct Screen* s; struct Screen* s;
int i, x, y; int i, x, y;
if (Pointers[idx].UpHook) { Pointers[idx].UpHook(idx); return; } if (Pointers[0].UpHook && Pointers[0].UpHook(idx)) return;
#ifdef CC_BUILD_TOUCH #ifdef CC_BUILD_TOUCH
CheckBlockTap(idx); CheckBlockTap(idx);
@ -841,7 +841,7 @@ static void OnInputDown(void* obj, int key, cc_bool was, struct InputDevice* dev
struct Screen* s; struct Screen* s;
cc_bool triggered; cc_bool triggered;
int i; int i;
if (Input.DownHook) { Input.DownHook(key, device); return; } if (Input.DownHook && Input.DownHook(key, device)) return;
#ifndef CC_BUILD_WEB #ifndef CC_BUILD_WEB
if (key == device->escapeButton && (s = Gui_GetClosable())) { if (key == device->escapeButton && (s = Gui_GetClosable())) {

View file

@ -190,7 +190,7 @@ static cc_bool IsShutdown(int key) {
} }
static void OnInputDown(void* obj, int key, cc_bool was, struct InputDevice* device) { static void OnInputDown(void* obj, int key, cc_bool was, struct InputDevice* device) {
if (Input.DownHook) { Input.DownHook(key, device); return; } if (Input.DownHook && Input.DownHook(key, device)) return;
if (IsShutdown(key)) Launcher_ShouldExit = true; if (IsShutdown(key)) Launcher_ShouldExit = true;
Launcher_Active->KeyDown(Launcher_Active, key, was, device); Launcher_Active->KeyDown(Launcher_Active, key, was, device);

View file

@ -1973,14 +1973,14 @@ static void KeyBindsScreen_Update(struct KeyBindsScreen* s, int i) {
s->dirty = true; s->dirty = true;
} }
static void KeyBindsScreen_TriggerBinding(int key, struct InputDevice* device) { static cc_bool KeyBindsScreen_TriggerBinding(int key, struct InputDevice* device) {
struct KeyBindsScreen* s = &KeyBindsScreen; struct KeyBindsScreen* s = &KeyBindsScreen;
InputBind bind; InputBind bind;
int idx; int idx;
if (device->type != bind_device->type) return; if (device->type != bind_device->type) return false;
Input.DownHook = NULL; Input.DownHook = NULL;
if (s->curI == -1) return; if (s->curI == -1) return false;
bind = s->binds[s->curI]; bind = s->binds[s->curI];
if (key == device->escapeButton) { if (key == device->escapeButton) {
@ -1993,6 +1993,7 @@ static void KeyBindsScreen_TriggerBinding(int key, struct InputDevice* device) {
s->curI = -1; s->curI = -1;
s->closable = true; s->closable = true;
KeyBindsScreen_Update(s, idx); KeyBindsScreen_Update(s, idx);
return true;
} }
static void KeyBindsScreen_OnBindingClick(void* screen, void* widget) { static void KeyBindsScreen_OnBindingClick(void* screen, void* widget) {

View file

@ -271,7 +271,7 @@ static void VirtualKeyboard_ClickSelected(void) {
} }
} }
static void VirtualKeyboard_ProcessDown(int key, struct InputDevice* device) { static cc_bool VirtualKeyboard_OnInputDown(int key, struct InputDevice* device) {
int deltaX, deltaY; int deltaX, deltaY;
Input_CalcDelta(key, device, &deltaX, &deltaY); Input_CalcDelta(key, device, &deltaX, &deltaY);
@ -290,6 +290,7 @@ static void VirtualKeyboard_ProcessDown(int key, struct InputDevice* device) {
} else if (key == CCPAD_R) { } else if (key == CCPAD_R) {
VirtualKeyboard_AppendChar('/'); VirtualKeyboard_AppendChar('/');
} }
return true;
} }
static void VirtualKeyboard_PadAxis(void* obj, int port, int axis, float x, float y) { static void VirtualKeyboard_PadAxis(void* obj, int port, int axis, float x, float y) {
@ -302,21 +303,36 @@ static void VirtualKeyboard_PadAxis(void* obj, int port, int axis, float x, floa
if (ySteps) VirtualKeyboard_Scroll(0, ySteps > 0 ? 1 : -1); if (ySteps) VirtualKeyboard_Scroll(0, ySteps > 0 ? 1 : -1);
} }
static void VirtualKeyboard_PointerDown(void* obj, int idx) { static cc_bool VirtualKeyboard_GetPointerPosition(int idx, int* kbX, int* kbY) {
int width = VirtualKeyboard_Width(); int width = VirtualKeyboard_Width();
int height = VirtualKeyboard_Height(); int height = VirtualKeyboard_Height();
int kbX, kbY; int originX, originY;
VirtualKeyboard_CalcPosition(&kbX, &kbY, VirtualKeyboard_WindowWidth(), VirtualKeyboard_WindowHeight()); VirtualKeyboard_CalcPosition(&originX, &originY, VirtualKeyboard_WindowWidth(), VirtualKeyboard_WindowHeight());
int x = Pointers[idx].x, y = Pointers[idx].y; int x = Pointers[idx].x, y = Pointers[idx].y;
if (x < kbX || y < kbY || x >= kbX + width || y >= kbY + height) return; if (x < originX || y < originY || x >= originX + width || y >= originY + height) return false;
kb_curX = (x - kbX) / kb_tileWidth; *kbX = x - originX;
kb_curY = (y - kbY) / kb_tileHeight; *kbY = y - originY;
return true;
}
static cc_bool VirtualKeyboard_PointerDown(int idx) {
int kbX, kbY;
if (!VirtualKeyboard_GetPointerPosition(idx, &kbX, &kbY)) return false;
kb_curX = kbX / kb_tileWidth;
kb_curY = kbY / kb_tileHeight;
if (kb_curX >= kb->cellsPerRow) kb_curX = kb->cellsPerRow - 1; if (kb_curX >= kb->cellsPerRow) kb_curX = kb->cellsPerRow - 1;
VirtualKeyboard_Clamp(); VirtualKeyboard_Clamp();
VirtualKeyboard_ClickSelected(); VirtualKeyboard_ClickSelected();
return true;
}
static cc_bool VirtualKeyboard_PointerUp(int idx) {
int kbX, kbY;
return VirtualKeyboard_GetPointerPosition(idx, &kbX, &kbY);
} }
@ -415,7 +431,8 @@ static void VirtualKeyboard_Hook(void) {
/* the virtual keyboard in the first place gets mistakenly processed */ /* the virtual keyboard in the first place gets mistakenly processed */
kb_needsHook = false; kb_needsHook = false;
Event_Register_(&ControllerEvents.AxisUpdate, NULL, VirtualKeyboard_PadAxis); Event_Register_(&ControllerEvents.AxisUpdate, NULL, VirtualKeyboard_PadAxis);
Event_Register_(&PointerEvents.Down, NULL, VirtualKeyboard_PointerDown); Pointers[0].DownHook = VirtualKeyboard_PointerDown;
Pointers[0].UpHook = VirtualKeyboard_PointerUp;
} }
static void VirtualKeyboard_Open(struct OpenKeyboardArgs* args, cc_bool launcher) { static void VirtualKeyboard_Open(struct OpenKeyboardArgs* args, cc_bool launcher) {
@ -445,7 +462,7 @@ static void VirtualKeyboard_Open(struct OpenKeyboardArgs* args, cc_bool launcher
} }
Window_Main.SoftKeyboardFocus = true; Window_Main.SoftKeyboardFocus = true;
Input.DownHook = VirtualKeyboard_ProcessDown; Input.DownHook = VirtualKeyboard_OnInputDown;
LBackend_Hooks[0] = VirtualKeyboard_Display2D; LBackend_Hooks[0] = VirtualKeyboard_Display2D;
Game.Draw2DHooks[0] = VirtualKeyboard_Display3D; Game.Draw2DHooks[0] = VirtualKeyboard_Display3D;
} }
@ -463,7 +480,8 @@ static void VirtualKeyboard_Close(void) {
VirtualKeyboard_Close3D(); VirtualKeyboard_Close3D();
Event_Unregister_(&ControllerEvents.AxisUpdate, NULL, VirtualKeyboard_PadAxis); Event_Unregister_(&ControllerEvents.AxisUpdate, NULL, VirtualKeyboard_PadAxis);
Event_Unregister_(&PointerEvents.Down, NULL, VirtualKeyboard_PointerDown); Pointers[0].DownHook = NULL;
Pointers[0].UpHook = NULL;
Window_Main.SoftKeyboardFocus = false; Window_Main.SoftKeyboardFocus = false;
KB_MarkDirty = NULL; KB_MarkDirty = NULL;

View file

@ -171,8 +171,8 @@ static void HandleButtons(int port, xid_gamepad_in* gp) {
#define AXIS_SCALE 8192.0f #define AXIS_SCALE 8192.0f
static void HandleJoystick(int port, int axis, int x, int y, float delta) { static void HandleJoystick(int port, int axis, int x, int y, float delta) {
if (Math_AbsI(x) <= 512) x = 0; if (Math_AbsI(x) <= 4096) x = 0;
if (Math_AbsI(y) <= 512) y = 0; if (Math_AbsI(y) <= 4096) y = 0;
Gamepad_SetAxis(port, axis, x / AXIS_SCALE, -y / AXIS_SCALE, delta); Gamepad_SetAxis(port, axis, x / AXIS_SCALE, -y / AXIS_SCALE, delta);
} }