diff options
Diffstat (limited to 'src/emu/uiinput.h')
-rw-r--r-- | src/emu/uiinput.h | 109 |
1 files changed, 52 insertions, 57 deletions
diff --git a/src/emu/uiinput.h b/src/emu/uiinput.h index d62f0c8a9b9..54170bad7ec 100644 --- a/src/emu/uiinput.h +++ b/src/emu/uiinput.h @@ -5,6 +5,7 @@ uiinput.h Internal MAME user interface input state. + ***************************************************************************/ #ifndef MAME_EMU_UIINPUT_H @@ -12,12 +13,8 @@ #pragma once +#include "interface/uievents.h" -/*************************************************************************** - CONSTANTS -***************************************************************************/ - -#define EVENT_QUEUE_SIZE 128 /*************************************************************************** TYPE DEFINITIONS @@ -25,20 +22,20 @@ struct ui_event { - enum type + enum class type { NONE, - MOUSE_MOVE, - MOUSE_LEAVE, - MOUSE_DOWN, - MOUSE_UP, - MOUSE_RDOWN, - MOUSE_RUP, - MOUSE_DOUBLE_CLICK, + WINDOW_FOCUS, + WINDOW_DEFOCUS, 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; @@ -47,82 +44,80 @@ 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 */ + // pushes a single event onto the queue bool push_event(ui_event event); - /* pops an event off of the queue */ + // pops an event off of the queue bool pop_event(ui_event *event); - /* check the next event type without removing it */ - ui_event::type peek_event_type() const { return (m_events_start != m_events_end) ? m_events[m_events_start].event_type : ui_event::NONE; } + // check the next event type without removing it + ui_event::type peek_event_type() const { return (m_events_start != m_events_end) ? m_events[m_events_start].event_type : ui_event::type::NONE; } - /* clears all outstanding events */ + // 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, or if - autorepeat at the given speed is triggered */ + // 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); // getters running_machine &machine() const { return m_machine; } - - 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); + // queueing events + 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 = 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 |