diff options
Diffstat (limited to 'src/emu/uiinput.cpp')
-rw-r--r-- | src/emu/uiinput.cpp | 258 |
1 files changed, 152 insertions, 106 deletions
diff --git a/src/emu/uiinput.cpp b/src/emu/uiinput.cpp index c84ceae865a..241bcd6370a 100644 --- a/src/emu/uiinput.cpp +++ b/src/emu/uiinput.cpp @@ -16,8 +16,6 @@ CONSTANTS ***************************************************************************/ -#define EVENT_QUEUE_SIZE 128 - enum { SEQ_PRESSED_FALSE = 0, /* not pressed */ @@ -26,58 +24,31 @@ enum }; +//************************************************************************** +// NETWORK MANAGER +//************************************************************************** -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ +//------------------------------------------------- +// network_manager - constructor +//------------------------------------------------- -/* private input port state */ -struct ui_input_private -{ - /* pressed states; retrieved with ui_input_pressed() */ - osd_ticks_t next_repeat[IPT_COUNT]; - UINT8 seqpressed[IPT_COUNT]; - - /* mouse position/info */ - render_target * current_mouse_target; - INT32 current_mouse_x; - INT32 current_mouse_y; - bool current_mouse_down; - - /* popped states; ring buffer of ui_events */ - ui_event events[EVENT_QUEUE_SIZE]; - int events_start; - int events_end; -}; - - - -/*************************************************************************** - FUNCTION PROTOYPES -***************************************************************************/ - -//static void ui_input_frame_update(running_machine &machine); - - - -/*************************************************************************** - INITIALIZATION -***************************************************************************/ - -/*------------------------------------------------- - ui_input_init - initializes the UI input - system --------------------------------------------------*/ - -void ui_input_init(running_machine &machine) +ui_input_manager::ui_input_manager(running_machine &machine) + : m_machine(machine), + m_current_mouse_target(nullptr), + m_current_mouse_down(false), + m_events_start(0), + m_events_end(0) { /* create the private data */ - machine.ui_input_data = auto_alloc_clear(machine, <ui_input_private>()); - machine.ui_input_data->current_mouse_x = -1; - machine.ui_input_data->current_mouse_y = -1; + m_current_mouse_x = -1; + m_current_mouse_y = -1; + + memset(m_next_repeat, 0, sizeof(m_next_repeat)); + memset(m_seqpressed, 0, sizeof(m_seqpressed)); + memset(m_events, 0, sizeof(m_events)); /* add a frame callback to poll inputs */ - machine.add_notifier(MACHINE_NOTIFY_FRAME, machine_notify_delegate(FUNC(ui_input_frame_update), &machine)); + machine.add_notifier(MACHINE_NOTIFY_FRAME, machine_notify_delegate(FUNC(ui_input_manager::frame_update), this)); } @@ -87,62 +58,55 @@ void ui_input_init(running_machine &machine) ***************************************************************************/ /*------------------------------------------------- - ui_input_frame_update - looks through pressed + frame_update - looks through pressed input as per events pushed our way and posts corresponding IPT_UI_* events -------------------------------------------------*/ -void ui_input_frame_update(running_machine &machine) +void ui_input_manager::frame_update() { - ui_input_private *uidata = machine.ui_input_data; - /* update the state of all the UI keys */ for (ioport_type code = ioport_type(IPT_UI_FIRST + 1); code < IPT_UI_LAST; ++code) { - bool pressed = machine.ioport().type_pressed(code); - if (!pressed || uidata->seqpressed[code] != SEQ_PRESSED_RESET) - uidata->seqpressed[code] = pressed; + bool pressed = machine().ioport().type_pressed(code); + if (!pressed || m_seqpressed[code] != SEQ_PRESSED_RESET) + m_seqpressed[code] = pressed; } } /*------------------------------------------------- - ui_input_push_event - pushes a single event + push_event - pushes a single event onto the queue -------------------------------------------------*/ -bool ui_input_push_event(running_machine &machine, ui_event evt) +bool ui_input_manager::push_event(ui_event evt) { - ui_input_private *uidata = machine.ui_input_data; - - /* we may be called before the UI is initialized */ - if (uidata == nullptr) - return false; /* some pre-processing (this is an icky place to do this stuff!) */ switch (evt.event_type) { case UI_EVENT_MOUSE_MOVE: - uidata->current_mouse_target = evt.target; - uidata->current_mouse_x = evt.mouse_x; - uidata->current_mouse_y = evt.mouse_y; + m_current_mouse_target = evt.target; + m_current_mouse_x = evt.mouse_x; + m_current_mouse_y = evt.mouse_y; break; case UI_EVENT_MOUSE_LEAVE: - if (uidata->current_mouse_target == evt.target) + if (m_current_mouse_target == evt.target) { - uidata->current_mouse_target = nullptr; - uidata->current_mouse_x = -1; - uidata->current_mouse_y = -1; + m_current_mouse_target = nullptr; + m_current_mouse_x = -1; + m_current_mouse_y = -1; } break; case UI_EVENT_MOUSE_DOWN: - uidata->current_mouse_down = true; + m_current_mouse_down = true; break; case UI_EVENT_MOUSE_UP: - uidata->current_mouse_down = false; + m_current_mouse_down = false; break; default: @@ -151,28 +115,27 @@ bool ui_input_push_event(running_machine &machine, ui_event evt) } /* is the queue filled up? */ - if ((uidata->events_end + 1) % ARRAY_LENGTH(uidata->events) == uidata->events_start) + if ((m_events_end + 1) % ARRAY_LENGTH(m_events) == m_events_start) return false; - uidata->events[uidata->events_end++] = evt; - uidata->events_end %= ARRAY_LENGTH(uidata->events); + m_events[m_events_end++] = evt; + m_events_end %= ARRAY_LENGTH(m_events); return true; } /*------------------------------------------------- - ui_input_pop_event - pops an event off of the queue + pop_event - pops an event off of the queue -------------------------------------------------*/ -bool ui_input_pop_event(running_machine &machine, ui_event *evt) +bool ui_input_manager::pop_event(ui_event *evt) { - ui_input_private *uidata = machine.ui_input_data; bool result; - if (uidata->events_start != uidata->events_end) + if (m_events_start != m_events_end) { - *evt = uidata->events[uidata->events_start++]; - uidata->events_start %= ARRAY_LENGTH(uidata->events); + *evt = m_events[m_events_start++]; + m_events_start %= ARRAY_LENGTH(m_events); result = true; } else @@ -185,40 +148,38 @@ bool ui_input_pop_event(running_machine &machine, ui_event *evt) /*------------------------------------------------- - ui_input_reset - clears all outstanding events + reset - clears all outstanding events and resets the sequence states -------------------------------------------------*/ -void ui_input_reset(running_machine &machine) +void ui_input_manager::reset() { - ui_input_private *uidata = machine.ui_input_data; int code; - uidata->events_start = 0; - uidata->events_end = 0; + m_events_start = 0; + m_events_end = 0; for (code = IPT_UI_FIRST + 1; code < IPT_UI_LAST; code++) { - uidata->seqpressed[code] = SEQ_PRESSED_RESET; - uidata->next_repeat[code] = 0; + m_seqpressed[code] = SEQ_PRESSED_RESET; + m_next_repeat[code] = 0; } } /*------------------------------------------------- - ui_input_find_mouse - retrieves the current + find_mouse - retrieves the current location of the mouse -------------------------------------------------*/ -render_target *ui_input_find_mouse(running_machine &machine, INT32 *x, INT32 *y, bool *button) +render_target *ui_input_manager::find_mouse(INT32 *x, INT32 *y, bool *button) { - ui_input_private *uidata = machine.ui_input_data; if (x != nullptr) - *x = uidata->current_mouse_x; + *x = m_current_mouse_x; if (y != nullptr) - *y = uidata->current_mouse_y; + *y = m_current_mouse_y; if (button != nullptr) - *button = uidata->current_mouse_down; - return uidata->current_mouse_target; + *button = m_current_mouse_down; + return m_current_mouse_target; } @@ -228,34 +189,33 @@ render_target *ui_input_find_mouse(running_machine &machine, INT32 *x, INT32 *y, ***************************************************************************/ /*------------------------------------------------- - ui_input_pressed - return TRUE if a key down + pressed - return TRUE if a key down for the given user interface sequence is detected -------------------------------------------------*/ -bool ui_input_pressed(running_machine &machine, int code) +bool ui_input_manager::pressed(int code) { - return ui_input_pressed_repeat(machine, code, 0); + return pressed_repeat(code, 0); } /*------------------------------------------------- - ui_input_pressed_repeat - return TRUE if a key + pressed_repeat - return TRUE if a key down for the given user interface sequence is detected, or if autorepeat at the given speed is triggered -------------------------------------------------*/ -bool ui_input_pressed_repeat(running_machine &machine, int code, int speed) +bool ui_input_manager::pressed_repeat(int code, int speed) { - ui_input_private *uidata = machine.ui_input_data; int pressed; g_profiler.start(PROFILER_INPUT); /* get the status of this key (assumed to be only in the defaults) */ assert(code >= IPT_UI_CONFIGURE && code <= IPT_OSD_16); - pressed = (uidata->seqpressed[code] == SEQ_PRESSED_TRUE); + pressed = (m_seqpressed[code] == SEQ_PRESSED_TRUE); /* if down, handle it specially */ if (pressed) @@ -263,12 +223,12 @@ g_profiler.start(PROFILER_INPUT); osd_ticks_t tps = osd_ticks_per_second(); /* if this is the first press, set a 3x delay and leave pressed = 1 */ - if (uidata->next_repeat[code] == 0) - uidata->next_repeat[code] = osd_ticks() + 3 * speed * tps / 60; + if (m_next_repeat[code] == 0) + m_next_repeat[code] = osd_ticks() + 3 * speed * tps / 60; /* if this is an autorepeat case, set a 1x delay and leave pressed = 1 */ - else if (speed > 0 && (osd_ticks() + tps - uidata->next_repeat[code]) >= tps) - uidata->next_repeat[code] += 1 * speed * tps / 60; + else if (speed > 0 && (osd_ticks() + tps - m_next_repeat[code]) >= tps) + m_next_repeat[code] += 1 * speed * tps / 60; /* otherwise, reset pressed = 0 */ else @@ -277,9 +237,95 @@ g_profiler.start(PROFILER_INPUT); /* if we're not pressed, reset the memory field */ else - uidata->next_repeat[code] = 0; + m_next_repeat[code] = 0; g_profiler.stop(); return pressed; } + +/*------------------------------------------------- + push_mouse_move_event - pushes a mouse + move event to the specified render_target +-------------------------------------------------*/ + +void ui_input_manager::push_mouse_move_event(render_target* target, INT32 x, INT32 y) +{ + ui_event event = { UI_EVENT_NONE }; + event.event_type = UI_EVENT_MOUSE_MOVE; + event.target = target; + event.mouse_x = x; + event.mouse_y = y; + push_event(event); +} + +/*------------------------------------------------- + push_mouse_leave_event - pushes a + mouse leave event to the specified render_target +-------------------------------------------------*/ + +void ui_input_manager::push_mouse_leave_event(render_target* target) +{ + ui_event event = { UI_EVENT_NONE }; + event.event_type = UI_EVENT_MOUSE_LEAVE; + event.target = target; + push_event(event); +} + +/*------------------------------------------------- + push_mouse_down_event - pushes a mouse + down event to the specified render_target +-------------------------------------------------*/ + +void ui_input_manager::push_mouse_down_event(render_target* target, INT32 x, INT32 y) +{ + ui_event event = { UI_EVENT_NONE }; + event.event_type = UI_EVENT_MOUSE_DOWN; + event.target = target; + event.mouse_x = x; + event.mouse_y = y; + push_event(event); +} + +/*------------------------------------------------- + push_mouse_down_event - pushes a mouse + down event to the specified render_target +-------------------------------------------------*/ + +void ui_input_manager::push_mouse_up_event(render_target* target, INT32 x, INT32 y) +{ + ui_event event = { UI_EVENT_NONE }; + event.event_type = UI_EVENT_MOUSE_UP; + event.target = target; + event.mouse_x = x; + event.mouse_y = y; + push_event(event); +} + +/*------------------------------------------------- + push_mouse_double_click_event - pushes + a mouse double-click event to the specified + render_target +-------------------------------------------------*/ +void ui_input_manager::push_mouse_double_click_event(render_target* target, INT32 x, INT32 y) +{ + ui_event event = { UI_EVENT_NONE }; + event.event_type = UI_EVENT_MOUSE_DOUBLE_CLICK; + event.target = target; + event.mouse_x = x; + event.mouse_y = y; + push_event(event); +} + +/*------------------------------------------------- + push_char_event - pushes a char event + to the specified render_target +-------------------------------------------------*/ +void ui_input_manager::push_char_event(render_target* target, unicode_char ch) +{ + ui_event event = { UI_EVENT_NONE }; + event.event_type = UI_EVENT_CHAR; + event.target = target; + event.ch = ch; + push_event(event); +} |