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
|
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
/***************************************************************************
uiinput.h
Internal MAME user interface input state.
***************************************************************************/
#pragma once
#ifndef __UIINPUT_H__
#define __UIINPUT_H__
#include "render.h"
/***************************************************************************
CONSTANTS
***************************************************************************/
#define EVENT_QUEUE_SIZE 128
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
enum ui_event_type
{
UI_EVENT_NONE,
UI_EVENT_MOUSE_MOVE,
UI_EVENT_MOUSE_LEAVE,
UI_EVENT_MOUSE_DOWN,
UI_EVENT_MOUSE_UP,
UI_EVENT_MOUSE_DOUBLE_CLICK,
UI_EVENT_CHAR
};
struct ui_event
{
ui_event_type event_type;
render_target * target;
INT32 mouse_x;
INT32 mouse_y;
input_item_id key;
unicode_char ch;
};
// ======================> 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);
/* clears all outstanding events */
void reset();
/* retrieves the current location of the mouse */
render_target *find_mouse(INT32 *x, INT32 *y, bool *button);
/* return TRUE if a key down for the given user interface sequence is detected */
bool pressed(int code);
/* 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, INT32 x, INT32 y);
void push_mouse_leave_event(render_target* target);
void push_mouse_down_event(render_target* target, INT32 x, INT32 y);
void push_mouse_up_event(render_target* target, INT32 x, INT32 y);
void push_mouse_double_click_event(render_target* target, INT32 x, INT32 y);
void push_char_event(render_target* target, unicode_char ch);
private:
// internal state
running_machine & m_machine; // reference to our machine
/* pressed states; retrieved with ui_input_pressed() */
osd_ticks_t m_next_repeat[IPT_COUNT];
UINT8 m_seqpressed[IPT_COUNT];
/* mouse position/info */
render_target * m_current_mouse_target;
INT32 m_current_mouse_x;
INT32 m_current_mouse_y;
bool m_current_mouse_down;
/* popped states; ring buffer of ui_events */
ui_event m_events[EVENT_QUEUE_SIZE];
int m_events_start;
int m_events_end;
bool m_initialized;
};
#endif /* __UIINPUT_H__ */
|