mame/src/emu/uiinput.h
2020-06-19 12:38:41 +02:00

130 lines
3.8 KiB
C++

// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
/***************************************************************************
uiinput.h
Internal MAME user interface input state.
***************************************************************************/
#ifndef MAME_EMU_UIINPUT_H
#define MAME_EMU_UIINPUT_H
#pragma once
/***************************************************************************
CONSTANTS
***************************************************************************/
#define EVENT_QUEUE_SIZE 128
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
struct ui_event
{
enum type
{
NONE,
MOUSE_MOVE,
MOUSE_LEAVE,
MOUSE_DOWN,
MOUSE_UP,
MOUSE_RDOWN,
MOUSE_RUP,
MOUSE_DOUBLE_CLICK,
MOUSE_WHEEL,
IME_CHAR
};
type event_type;
render_target * target;
s32 mouse_x;
s32 mouse_y;
input_item_id key;
char32_t ch;
short zdelta;
int num_lines;
};
// ======================> ui_input_manager
class ui_input_manager
{
public:
// construction/destruction
ui_input_manager(running_machine &machine);
void frame_update();
/* pushes a single event onto the queue */
bool push_event(ui_event event);
/* 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; }
/* 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 */
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);
void mark_all_as_pressed();
private:
// 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;
};
#endif // MAME_EMU_UIINPUT_H