summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/uiinput.h
blob: 54170bad7ec4f0d4b93dba6047dfa6e1833cfc3a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// 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

#include "interface/uievents.h"


/***************************************************************************
    TYPE DEFINITIONS
***************************************************************************/

struct ui_event
{
	enum class type
	{
		NONE,
		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;
	s32                 mouse_y;
	input_item_id       key;
	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 final : public osd::ui_event_handler
{
public:
	// construction/destruction
	ui_input_manager(running_machine &machine);

	void check_ui_inputs();

	// 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::type::NONE; }

	// clears all outstanding events
	void reset();

	// 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);

	// getters
	running_machine &machine() const { return m_machine; }

	// 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;

	// 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