mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-01-22 17:12:25 -05:00
Fix pointer inputs not being properly intercepted by onscreen keyboard
Xbox: Fix being too sensitive to joystick input
This commit is contained in:
parent
a43ffbb54e
commit
a004920785
7 changed files with 43 additions and 24 deletions
2
Makefile
2
Makefile
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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];
|
||||||
|
|
||||||
|
|
|
@ -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())) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue