summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/uiinput.h
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2024-04-12 02:49:15 +1000
committer Vas Crabb <vas@vastheman.com>2024-04-12 02:49:15 +1000
commit4ddd26fe21edba8e7df65b12d721e9bed579e6e4 (patch)
treee1452c7d52a51fcefdf83a686f585c53ce10f5c0 /src/emu/uiinput.h
parent78ef444ea6b639336b174e8e47d782a016ae6ae7 (diff)
Initial touch input support:
* Feed mouse/pen/touch pointer events through UI input manager with Win32 and SDL. * Started migrating UI code to use new API and reworking mouse/touch interaction. * emu/render.cpp: Support pressing multiple clickable layout items simultaneously. * emu/render.cpp: Allow UI elements to be drawn in any window. * emu/rendlay.cpp, luaengine_render.cpp: Added layout view events for pointer input. * ui/ui.cpp: Allow the UI handler to control pointer display. * ui/analogipt.cpp: Added mouse/touch and more keys for navigating field state list. * ui/menu.cpp: Use vertical swipe to scroll and horizontal swipe to adjust. * ui/menu.cpp: Draw after processing input - greatly improves responsiveness. * ui/menu.cpp: Ignore keyboard/gamepad input during pointer actions. * ui/selmenu.cpp: Made left/right info pane arrows repeat when held. * ui/selmenu.cpp: Use middle click to move keyboard focus. * ui/selmenu.cpp: Let filter list scroll if it's too tall, and use a bit of horizontal padding. * ui/selmenu.cpp: Improved divider sizing. * ui/state.cpp: Don't allow clicks to pass through the confirm deletion prompt to the menu. * ui/simpleselgame.cpp: Fixed error message display and graphics/sound status not showing. * ui/simpleselgame.cpp: Allow tap/click to dismiss error message. * ui/utils.cpp: Show UI for choice filters when there are no choices - it's less confusing. * modules/input/input_sdl.cpp: Made scaling for mouse scroll better match RawInput and DirectInput. * modules/input/input_rawinput.cpp: Added support for horizontal scroll axis. * modules/input/input_win32.cpp: Added support for scroll axes and more buttons to mouse/lightgun. * modules/debugger/debugimgui.cpp: Don't fight over events with the UI manager - it breaks menus. * osd/windows/window.cpp: Translate mouse position to window cooridinates for scroll wheel events. * osd/sdl/window.cpp: Supply last mouse position for scroll wheel events if possible. * scripts/build/complay.py: Made zero input mask an error - it was only being used to block clicks.
Diffstat (limited to 'src/emu/uiinput.h')
-rw-r--r--src/emu/uiinput.h88
1 files changed, 41 insertions, 47 deletions
diff --git a/src/emu/uiinput.h b/src/emu/uiinput.h
index 3fc89d7a4ff..54170bad7ec 100644
--- a/src/emu/uiinput.h
+++ b/src/emu/uiinput.h
@@ -13,6 +13,8 @@
#pragma once
+#include "interface/uievents.h"
+
/***************************************************************************
TYPE DEFINITIONS
@@ -25,17 +27,15 @@ struct ui_event
NONE,
WINDOW_FOCUS,
WINDOW_DEFOCUS,
- MOUSE_MOVE,
- MOUSE_LEAVE,
- MOUSE_DOWN,
- MOUSE_UP,
- MOUSE_RDOWN,
- MOUSE_RUP,
- MOUSE_DOUBLE_CLICK,
MOUSE_WHEEL,
+ POINTER_UPDATE,
+ POINTER_LEAVE,
+ POINTER_ABORT,
IME_CHAR
};
+ using pointer = osd::ui_event_handler::pointer;
+
type event_type;
render_target * target;
s32 mouse_x;
@@ -44,17 +44,27 @@ struct ui_event
char32_t ch;
short zdelta;
int num_lines;
+
+ pointer pointer_type; // type of input controlling this pointer
+ u16 pointer_id; // pointer ID - will be recycled aggressively
+ u16 pointer_device; // for grouping pointers for multi-touch gesture recognition
+ s32 pointer_x; // pointer X coordinate
+ s32 pointer_y; // pointer Y coordinate
+ u32 pointer_buttons; // currently depressed buttons
+ u32 pointer_pressed; // buttons pressed since last update (primary action in LSB)
+ u32 pointer_released; // buttons released since last update (primary action in LSB)
+ s16 pointer_clicks; // positive for multi-click, negative on release if turned into hold or drag
};
// ======================> ui_input_manager
-class ui_input_manager
+class ui_input_manager final : public osd::ui_event_handler
{
public:
// construction/destruction
ui_input_manager(running_machine &machine);
- void frame_update();
+ void check_ui_inputs();
// pushes a single event onto the queue
bool push_event(ui_event event);
@@ -68,17 +78,13 @@ public:
// clears all outstanding events
void reset();
- // retrieves the current location of the mouse
- render_target *find_mouse(s32 *x, s32 *y, bool *button) const;
- ioport_field *find_mouse_field() const;
-
- // return true if a key down for the given user interface sequence is detected
- bool pressed(int code);
-
// enable/disable UI key presses
bool presses_enabled() const { return m_presses_enabled; }
void set_presses_enabled(bool enabled) { m_presses_enabled = enabled; }
+ // return true if a key down for the given user interface sequence is detected
+ bool pressed(int code) { return pressed_repeat(code, 0); }
+
// return true if a key down for the given user interface sequence is detected, or if autorepeat at the given speed is triggered
bool pressed_repeat(int code, int speed);
@@ -86,44 +92,32 @@ public:
running_machine &machine() const { return m_machine; }
// queueing events
- void push_window_focus_event(render_target *target);
- void push_window_defocus_event(render_target *target);
- void push_mouse_move_event(render_target *target, s32 x, s32 y);
- void push_mouse_leave_event(render_target *target);
- void push_mouse_down_event(render_target *target, s32 x, s32 y);
- void push_mouse_up_event(render_target *target, s32 x, s32 y);
- void push_mouse_rdown_event(render_target *target, s32 x, s32 y);
- void push_mouse_rup_event(render_target *target, s32 x, s32 y);
- void push_mouse_double_click_event(render_target *target, s32 x, s32 y);
- void push_char_event(render_target *target, char32_t ch);
- void push_mouse_wheel_event(render_target *target, s32 x, s32 y, short delta, int ucNumLines);
+ virtual void push_window_focus_event(render_target *target) override;
+ virtual void push_window_defocus_event(render_target *target) override;
+ virtual void push_mouse_wheel_event(render_target *target, s32 x, s32 y, short delta, int lines) override;
+ virtual void push_pointer_update(render_target *target, pointer type, u16 ptrid, u16 device, s32 x, s32 y, u32 buttons, u32 pressed, u32 released, s16 clicks) override;
+ virtual void push_pointer_leave(render_target *target, pointer type, u16 ptrid, u16 device, s32 x, s32 y, u32 released, s16 clicks) override;
+ virtual void push_pointer_abort(render_target *target, pointer type, u16 ptrid, u16 device, s32 x, s32 y, u32 released, s16 clicks) override;
+ virtual void push_char_event(render_target *target, char32_t ch) override;
void mark_all_as_pressed();
private:
-
// constants
- static constexpr unsigned EVENT_QUEUE_SIZE = 128;
+ static constexpr unsigned EVENT_QUEUE_SIZE = 256;
// internal state
- running_machine & m_machine; // reference to our machine
-
- // pressed states; retrieved with ui_input_pressed()
- bool m_presses_enabled;
- osd_ticks_t m_next_repeat[IPT_COUNT];
- u8 m_seqpressed[IPT_COUNT];
-
- // mouse position/info
- render_target * m_current_mouse_target;
- s32 m_current_mouse_x;
- s32 m_current_mouse_y;
- bool m_current_mouse_down;
- ioport_field * m_current_mouse_field;
-
- // popped states; ring buffer of ui_events
- ui_event m_events[EVENT_QUEUE_SIZE];
- int m_events_start;
- int m_events_end;
+ running_machine & m_machine;
+
+ // pressed states; retrieved with pressed() or pressed_repeat()
+ bool m_presses_enabled;
+ osd_ticks_t m_next_repeat[IPT_COUNT];
+ u8 m_seqpressed[IPT_COUNT];
+
+ // ring buffer of ui_events
+ ui_event m_events[EVENT_QUEUE_SIZE];
+ int m_events_start;
+ int m_events_end;
};
#endif // MAME_EMU_UIINPUT_H