summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2017-08-10 18:05:54 +1000
committer Vas Crabb <vas@vastheman.com>2017-08-10 18:05:54 +1000
commitb363e92b5d14d988833242b4ce876bcdfac3cc65 (patch)
treea3b23a966362eb76bcbf6d2afe3120c630093d3d /src
parent7145f33cdf207267a7d0f3a56932e94f154851d0 (diff)
Don't process every character individually when searching - this reduces
lag if you keep typing while a big list is searched. (nw) patch up German translation
Diffstat (limited to 'src')
-rw-r--r--src/emu/uiinput.cpp51
-rw-r--r--src/emu/uiinput.h33
-rw-r--r--src/frontend/mame/ui/menu.cpp8
-rw-r--r--src/frontend/mame/ui/selgame.cpp24
-rw-r--r--src/frontend/mame/ui/selgame.h2
-rw-r--r--src/frontend/mame/ui/selmenu.cpp46
-rw-r--r--src/frontend/mame/ui/selmenu.h1
-rw-r--r--src/frontend/mame/ui/selsoft.cpp15
-rw-r--r--src/frontend/mame/ui/selsoft.h1
-rw-r--r--src/frontend/mame/ui/ui.cpp2
-rw-r--r--src/osd/modules/debugger/debugimgui.cpp2
-rw-r--r--src/osd/modules/input/input_uwp.cpp2
12 files changed, 90 insertions, 97 deletions
diff --git a/src/emu/uiinput.cpp b/src/emu/uiinput.cpp
index 9123a6af526..18fee890eec 100644
--- a/src/emu/uiinput.cpp
+++ b/src/emu/uiinput.cpp
@@ -98,13 +98,13 @@ bool ui_input_manager::push_event(ui_event evt)
/* some pre-processing (this is an icky place to do this stuff!) */
switch (evt.event_type)
{
- case UI_EVENT_MOUSE_MOVE:
+ case ui_event::MOUSE_MOVE:
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:
+ case ui_event::MOUSE_LEAVE:
if (m_current_mouse_target == evt.target)
{
m_current_mouse_target = nullptr;
@@ -113,11 +113,11 @@ bool ui_input_manager::push_event(ui_event evt)
}
break;
- case UI_EVENT_MOUSE_DOWN:
+ case ui_event::MOUSE_DOWN:
m_current_mouse_down = true;
break;
- case UI_EVENT_MOUSE_UP:
+ case ui_event::MOUSE_UP:
m_current_mouse_down = false;
break;
@@ -142,20 +142,17 @@ bool ui_input_manager::push_event(ui_event evt)
bool ui_input_manager::pop_event(ui_event *evt)
{
- bool result;
-
if (m_events_start != m_events_end)
{
*evt = m_events[m_events_start++];
m_events_start %= ARRAY_LENGTH(m_events);
- result = true;
+ return true;
}
else
{
memset(evt, 0, sizeof(*evt));
- result = false;
+ return false;
}
- return result;
}
@@ -293,8 +290,8 @@ g_profiler.stop();
void ui_input_manager::push_mouse_move_event(render_target* target, s32 x, s32 y)
{
- ui_event event = { UI_EVENT_NONE };
- event.event_type = UI_EVENT_MOUSE_MOVE;
+ ui_event event = { ui_event::NONE };
+ event.event_type = ui_event::MOUSE_MOVE;
event.target = target;
event.mouse_x = x;
event.mouse_y = y;
@@ -308,8 +305,8 @@ void ui_input_manager::push_mouse_move_event(render_target* target, s32 x, s32 y
void ui_input_manager::push_mouse_leave_event(render_target* target)
{
- ui_event event = { UI_EVENT_NONE };
- event.event_type = UI_EVENT_MOUSE_LEAVE;
+ ui_event event = { ui_event::NONE };
+ event.event_type = ui_event::MOUSE_LEAVE;
event.target = target;
push_event(event);
}
@@ -321,8 +318,8 @@ void ui_input_manager::push_mouse_leave_event(render_target* target)
void ui_input_manager::push_mouse_down_event(render_target* target, s32 x, s32 y)
{
- ui_event event = { UI_EVENT_NONE };
- event.event_type = UI_EVENT_MOUSE_DOWN;
+ ui_event event = { ui_event::NONE };
+ event.event_type = ui_event::MOUSE_DOWN;
event.target = target;
event.mouse_x = x;
event.mouse_y = y;
@@ -336,8 +333,8 @@ void ui_input_manager::push_mouse_down_event(render_target* target, s32 x, s32 y
void ui_input_manager::push_mouse_up_event(render_target* target, s32 x, s32 y)
{
- ui_event event = { UI_EVENT_NONE };
- event.event_type = UI_EVENT_MOUSE_UP;
+ ui_event event = { ui_event::NONE };
+ event.event_type = ui_event::MOUSE_UP;
event.target = target;
event.mouse_x = x;
event.mouse_y = y;
@@ -351,8 +348,8 @@ down event to the specified render_target
void ui_input_manager::push_mouse_rdown_event(render_target* target, s32 x, s32 y)
{
- ui_event event = { UI_EVENT_NONE };
- event.event_type = UI_EVENT_MOUSE_RDOWN;
+ ui_event event = { ui_event::NONE };
+ event.event_type = ui_event::MOUSE_RDOWN;
event.target = target;
event.mouse_x = x;
event.mouse_y = y;
@@ -366,8 +363,8 @@ down event to the specified render_target
void ui_input_manager::push_mouse_rup_event(render_target* target, s32 x, s32 y)
{
- ui_event event = { UI_EVENT_NONE };
- event.event_type = UI_EVENT_MOUSE_RUP;
+ ui_event event = { ui_event::NONE };
+ event.event_type = ui_event::MOUSE_RUP;
event.target = target;
event.mouse_x = x;
event.mouse_y = y;
@@ -381,8 +378,8 @@ void ui_input_manager::push_mouse_rup_event(render_target* target, s32 x, s32 y)
-------------------------------------------------*/
void ui_input_manager::push_mouse_double_click_event(render_target* target, s32 x, s32 y)
{
- ui_event event = { UI_EVENT_NONE };
- event.event_type = UI_EVENT_MOUSE_DOUBLE_CLICK;
+ 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;
@@ -395,8 +392,8 @@ void ui_input_manager::push_mouse_double_click_event(render_target* target, s32
-------------------------------------------------*/
void ui_input_manager::push_char_event(render_target* target, char32_t ch)
{
- ui_event event = { UI_EVENT_NONE };
- event.event_type = UI_EVENT_CHAR;
+ ui_event event = { ui_event::NONE };
+ event.event_type = ui_event::IME_CHAR;
event.target = target;
event.ch = ch;
push_event(event);
@@ -409,8 +406,8 @@ void ui_input_manager::push_char_event(render_target* target, char32_t ch)
void ui_input_manager::push_mouse_wheel_event(render_target *target, s32 x, s32 y, short delta, int ucNumLines)
{
- ui_event event = { UI_EVENT_NONE };
- event.event_type = UI_EVENT_MOUSE_WHEEL;
+ ui_event event = { ui_event::NONE };
+ event.event_type = ui_event::MOUSE_WHEEL;
event.target = target;
event.mouse_x = x;
event.mouse_y = y;
diff --git a/src/emu/uiinput.h b/src/emu/uiinput.h
index e6673c4d763..2a7aeeff084 100644
--- a/src/emu/uiinput.h
+++ b/src/emu/uiinput.h
@@ -23,23 +23,23 @@
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_RDOWN,
- UI_EVENT_MOUSE_RUP,
- UI_EVENT_MOUSE_DOUBLE_CLICK,
- UI_EVENT_MOUSE_WHEEL,
- UI_EVENT_CHAR
-};
-
struct ui_event
{
- ui_event_type event_type;
+ 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;
@@ -65,6 +65,9 @@ public:
/* 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();
diff --git a/src/frontend/mame/ui/menu.cpp b/src/frontend/mame/ui/menu.cpp
index eac424ea412..5f1056bc45d 100644
--- a/src/frontend/mame/ui/menu.cpp
+++ b/src/frontend/mame/ui/menu.cpp
@@ -907,7 +907,7 @@ void menu::handle_events(uint32_t flags, event &ev)
switch (local_menu_event.event_type)
{
// if we are hovering over a valid item, select it with a single click
- case UI_EVENT_MOUSE_DOWN:
+ case ui_event::MOUSE_DOWN:
if (custom_mouse_down())
return;
@@ -943,7 +943,7 @@ void menu::handle_events(uint32_t flags, event &ev)
break;
// if we are hovering over a valid item, fake a UI_SELECT with a double-click
- case UI_EVENT_MOUSE_DOUBLE_CLICK:
+ case ui_event::MOUSE_DOUBLE_CLICK:
if (!(flags & PROCESS_ONLYCHAR) && hover >= 0 && hover < item.size())
{
selected = hover;
@@ -958,7 +958,7 @@ void menu::handle_events(uint32_t flags, event &ev)
break;
// caught scroll event
- case UI_EVENT_MOUSE_WHEEL:
+ case ui_event::MOUSE_WHEEL:
if (!(flags & PROCESS_ONLYCHAR))
{
if (local_menu_event.zdelta > 0)
@@ -991,7 +991,7 @@ void menu::handle_events(uint32_t flags, event &ev)
break;
// translate CHAR events into specials
- case UI_EVENT_CHAR:
+ case ui_event::IME_CHAR:
ev.iptkey = IPT_SPECIAL;
ev.unichar = local_menu_event.ch;
stop = true;
diff --git a/src/frontend/mame/ui/selgame.cpp b/src/frontend/mame/ui/selgame.cpp
index 86e1ac06dce..cb66194acb5 100644
--- a/src/frontend/mame/ui/selgame.cpp
+++ b/src/frontend/mame/ui/selgame.cpp
@@ -224,11 +224,6 @@ void menu_select_game::handle()
highlight = machine_filter::LAST;
break;
- case IPT_SPECIAL:
- // typed characters append to the buffer
- inkey_special(menu_event);
- break;
-
case IPT_OTHER:
// this is generated when something in the left box is clicked
m_prev_selected = nullptr;
@@ -849,22 +844,9 @@ void menu_select_game::inkey_select_favorite(const event *menu_event)
// returns if the search can be activated
//-------------------------------------------------
-inline bool menu_select_game::isfavorite() const
+bool menu_select_game::isfavorite() const
{
- return (main_filters::actual == machine_filter::FAVORITE);
-}
-
-//-------------------------------------------------
-// handle special key event
-//-------------------------------------------------
-
-void menu_select_game::inkey_special(const event *menu_event)
-{
- if (!isfavorite())
- {
- if (input_character(m_search, menu_event->unichar, uchar_is_printable))
- reset(reset_options::SELECT_FIRST);
- }
+ return machine_filter::FAVORITE == main_filters::actual;
}
@@ -1432,7 +1414,7 @@ void menu_select_game::make_topbox_text(std::string &line0, std::string &line1,
{
line1.clear();
}
- if (main_filters::actual == machine_filter::CATEGORY && inifile.total() > 0)
+ else if (main_filters::actual == machine_filter::CATEGORY && inifile.total() > 0)
{
line1 = string_format(_("%1$s (%2$s - %3$s) - Search: %4$s_"),
machine_filter::display_name(main_filters::actual),
diff --git a/src/frontend/mame/ui/selgame.h b/src/frontend/mame/ui/selgame.h
index e8093ff5f78..0a2b49e08bd 100644
--- a/src/frontend/mame/ui/selgame.h
+++ b/src/frontend/mame/ui/selgame.h
@@ -56,6 +56,7 @@ private:
// get selected software and/or driver
virtual void get_selection(ui_software_info const *&software, game_driver const *&driver) const override;
+ virtual bool accept_search() const override { return !isfavorite(); }
// text for main top/bottom panels
virtual void make_topbox_text(std::string &line0, std::string &line1, std::string &line2) const override;
@@ -88,7 +89,6 @@ private:
// handlers
void inkey_select(const event *menu_event);
void inkey_select_favorite(const event *menu_event);
- void inkey_special(const event *menu_event);
void inkey_export();
};
diff --git a/src/frontend/mame/ui/selmenu.cpp b/src/frontend/mame/ui/selmenu.cpp
index 2af76f00d0b..7ae24e1cdae 100644
--- a/src/frontend/mame/ui/selmenu.cpp
+++ b/src/frontend/mame/ui/selmenu.cpp
@@ -1310,9 +1310,6 @@ void menu_select_launch::handle_keys(uint32_t flags, int &iptkey)
void menu_select_launch::handle_events(uint32_t flags, event &ev)
{
- bool stop = false;
- ui_event local_menu_event;
-
if (m_pressed)
{
bool const pressed = mouse_pressed();
@@ -1331,12 +1328,14 @@ void menu_select_launch::handle_events(uint32_t flags, event &ev)
}
// loop while we have interesting events
+ bool stop(false), search_changed(false);
+ ui_event local_menu_event;
while (!stop && machine().ui_input().pop_event(&local_menu_event))
{
switch (local_menu_event.event_type)
{
// if we are hovering over a valid item, select it with a single click
- case UI_EVENT_MOUSE_DOWN:
+ case ui_event::MOUSE_DOWN:
if (m_ui_error)
{
ev.iptkey = IPT_OTHER;
@@ -1433,7 +1432,7 @@ void menu_select_launch::handle_events(uint32_t flags, event &ev)
break;
// if we are hovering over a valid item, fake a UI_SELECT with a double-click
- case UI_EVENT_MOUSE_DOUBLE_CLICK:
+ case ui_event::MOUSE_DOUBLE_CLICK:
if (hover >= 0 && hover < item.size())
{
selected = hover;
@@ -1449,7 +1448,7 @@ void menu_select_launch::handle_events(uint32_t flags, event &ev)
break;
// caught scroll event
- case UI_EVENT_MOUSE_WHEEL:
+ case ui_event::MOUSE_WHEEL:
if (hover >= 0 && hover < item.size() - skip_main_items - 1)
{
if (local_menu_event.zdelta > 0)
@@ -1481,21 +1480,25 @@ void menu_select_launch::handle_events(uint32_t flags, event &ev)
break;
// translate CHAR events into specials
- case UI_EVENT_CHAR:
+ case ui_event::IME_CHAR:
if (exclusive_input_pressed(ev.iptkey, IPT_UI_CONFIGURE, 0))
{
ev.iptkey = IPT_UI_CONFIGURE;
stop = true;
}
- else
+ else if (m_ui_error)
{
ev.iptkey = IPT_SPECIAL;
- ev.unichar = local_menu_event.ch;
stop = true;
}
+ else if (accept_search())
+ {
+ if (input_character(m_search, local_menu_event.ch, uchar_is_printable))
+ search_changed = true;
+ }
break;
- case UI_EVENT_MOUSE_RDOWN:
+ case ui_event::MOUSE_RDOWN:
if (hover >= 0 && hover < item.size() - skip_main_items - 1)
{
selected = hover;
@@ -1512,7 +1515,30 @@ void menu_select_launch::handle_events(uint32_t flags, event &ev)
default:
break;
}
+
+ // need to update search before processing certain kinds of events, but others don't matter
+ if (search_changed)
+ {
+ switch (machine().ui_input().peek_event_type())
+ {
+ case ui_event::MOUSE_DOWN:
+ case ui_event::MOUSE_RDOWN:
+ case ui_event::MOUSE_DOUBLE_CLICK:
+ case ui_event::MOUSE_WHEEL:
+ stop = true;
+ break;
+ case ui_event::NONE:
+ case ui_event::MOUSE_MOVE:
+ case ui_event::MOUSE_LEAVE:
+ case ui_event::MOUSE_UP:
+ case ui_event::MOUSE_RUP:
+ case ui_event::IME_CHAR:
+ break;
+ }
+ }
}
+ if (search_changed)
+ reset(reset_options::SELECT_FIRST);
}
diff --git a/src/frontend/mame/ui/selmenu.h b/src/frontend/mame/ui/selmenu.h
index 888a72e085d..8b8d0157448 100644
--- a/src/frontend/mame/ui/selmenu.h
+++ b/src/frontend/mame/ui/selmenu.h
@@ -195,6 +195,7 @@ private:
// get selected software and/or driver
virtual void get_selection(ui_software_info const *&software, game_driver const *&driver) const = 0;
+ virtual bool accept_search() const { return true; }
void select_prev()
{
if (!m_prev_selected)
diff --git a/src/frontend/mame/ui/selsoft.cpp b/src/frontend/mame/ui/selsoft.cpp
index a3a3cd072ef..e64a6136cf7 100644
--- a/src/frontend/mame/ui/selsoft.cpp
+++ b/src/frontend/mame/ui/selsoft.cpp
@@ -244,11 +244,6 @@ void menu_select_software::handle()
}
}
}
- else if (menu_event->iptkey == IPT_SPECIAL)
- {
- // typed characters append to the buffer
- inkey_special(menu_event);
- }
}
}
}
@@ -528,16 +523,6 @@ void menu_select_software::inkey_select(const event *menu_event)
}
}
-//-------------------------------------------------
-// handle special key event
-//-------------------------------------------------
-
-void menu_select_software::inkey_special(const event *menu_event)
-{
- if (input_character(m_search, menu_event->unichar, uchar_is_printable))
- reset(reset_options::SELECT_FIRST);
-}
-
//-------------------------------------------------
// load custom filters info from file
diff --git a/src/frontend/mame/ui/selsoft.h b/src/frontend/mame/ui/selsoft.h
index bcde4479f80..0982580a5f0 100644
--- a/src/frontend/mame/ui/selsoft.h
+++ b/src/frontend/mame/ui/selsoft.h
@@ -62,7 +62,6 @@ private:
// handlers
void inkey_select(const event *menu_event);
- void inkey_special(const event *menu_event);
virtual void general_info(const game_driver *driver, std::string &buffer) override {}
};
diff --git a/src/frontend/mame/ui/ui.cpp b/src/frontend/mame/ui/ui.cpp
index 04a03f7fc44..a7434c6df54 100644
--- a/src/frontend/mame/ui/ui.cpp
+++ b/src/frontend/mame/ui/ui.cpp
@@ -821,7 +821,7 @@ void mame_ui_manager::process_natural_keyboard()
while (machine().ui_input().pop_event(&event))
{
// if this was a UI_EVENT_CHAR event, post it
- if (event.event_type == UI_EVENT_CHAR)
+ if (event.event_type == ui_event::IME_CHAR)
machine().ioport().natkeyboard().post(event.ch);
}
diff --git a/src/osd/modules/debugger/debugimgui.cpp b/src/osd/modules/debugger/debugimgui.cpp
index 05f56521b18..293ac0229df 100644
--- a/src/osd/modules/debugger/debugimgui.cpp
+++ b/src/osd/modules/debugger/debugimgui.cpp
@@ -358,7 +358,7 @@ void debug_imgui::handle_keys()
{
switch (event.event_type)
{
- case UI_EVENT_CHAR:
+ case ui_event::IME_CHAR:
m_key_char = event.ch;
if(focus_view != nullptr)
focus_view->view->process_char(m_key_char);
diff --git a/src/osd/modules/input/input_uwp.cpp b/src/osd/modules/input/input_uwp.cpp
index 2130d000fea..6b3b8675cff 100644
--- a/src/osd/modules/input/input_uwp.cpp
+++ b/src/osd/modules/input/input_uwp.cpp
@@ -492,7 +492,7 @@ internal:
{
ui_event uiev;
memset(&uiev, 0, sizeof(uiev));
- uiev.event_type = UI_EVENT_CHAR;
+ uiev.event_type = ui_event::IME_CHAR;
this->Machine.ui_input().push_event(uiev);
}
}