38
38
#include " render.h"
39
39
#include " cheat.h"
40
40
#include " rendfont.h"
41
+ #include " rendlay.h"
41
42
#include " romload.h"
42
43
#include " screen.h"
43
44
#include " speaker.h"
@@ -165,7 +166,13 @@ enum class mame_ui_manager::ui_callback_type : int
165
166
166
167
struct mame_ui_manager ::active_pointer
167
168
{
168
- active_pointer (ui_event const &event) : target(event.target), type(event.pointer_type), ptrid(event.pointer_id), x(-1 .0F ), y(-1 .0F )
169
+ active_pointer (ui_event const &event)
170
+ : target(event.target)
171
+ , updated(std::chrono::steady_clock::time_point::min())
172
+ , type(event.pointer_type)
173
+ , ptrid(event.pointer_id)
174
+ , x(-1 .0F )
175
+ , y(-1 .0F )
169
176
{
170
177
}
171
178
@@ -175,6 +182,7 @@ struct mame_ui_manager::active_pointer
175
182
}
176
183
177
184
render_target *target;
185
+ std::chrono::steady_clock::time_point updated;
178
186
osd::ui_event_handler::pointer type;
179
187
u16 ptrid;
180
188
float x, y;
@@ -198,8 +206,6 @@ mame_ui_manager::mame_ui_manager(running_machine &machine)
198
206
, m_popup_text_end(0 )
199
207
, m_mouse_bitmap(32 , 32 )
200
208
, m_mouse_arrow_texture(nullptr )
201
- , m_mouse_show(false )
202
- , m_update_pointers(false )
203
209
, m_pointers_changed(false )
204
210
, m_target_font_height(0 )
205
211
, m_has_warnings(false )
@@ -240,7 +246,6 @@ void mame_ui_manager::init()
240
246
return 0 ;
241
247
}));
242
248
m_non_char_keys_down = std::make_unique<uint8_t []>((std::size (non_char_keys) + 7 ) / 8 );
243
- m_mouse_show = machine ().system ().flags & machine_flags::CLICKABLE_ARTWORK ? true : false ;
244
249
245
250
// request notification callbacks
246
251
machine ().add_notifier (MACHINE_NOTIFY_FRAME, machine_notify_delegate (&mame_ui_manager::frame_update, this ));
@@ -733,7 +738,7 @@ bool mame_ui_manager::update_and_render(render_container &container)
733
738
// display the internal pointers
734
739
bool const pointer_update = m_pointers_changed;
735
740
m_pointers_changed = false ;
736
- if (m_mouse_show || ( is_menu_active () && machine ().options ().ui_mouse () ))
741
+ if (! is_menu_active () || machine ().options ().ui_mouse ())
737
742
{
738
743
const float cursor_size = 0.6 * get_line_height ();
739
744
for (auto const &pointer : m_display_pointers)
@@ -1128,12 +1133,12 @@ void mame_ui_manager::process_ui_events()
1128
1133
{
1129
1134
if (osd::ui_event_handler::pointer::TOUCH != event.pointer_type )
1130
1135
{
1131
- m_update_pointers = true ;
1132
1136
auto pos (std::lower_bound (m_active_pointers.begin (), m_active_pointers.end (), std::make_pair (event.target , event.pointer_id )));
1133
1137
if ((m_active_pointers.end () == pos) || (pos->target != event.target ) || (pos->ptrid != event.pointer_id ))
1134
1138
pos = m_active_pointers.emplace (pos, event);
1135
1139
else
1136
1140
assert (pos->type == event.pointer_type );
1141
+ pos->updated = std::chrono::steady_clock::now ();
1137
1142
event.target ->map_point_container (event.pointer_x , event.pointer_y , *event.target ->ui_container (), pos->x , pos->y );
1138
1143
}
1139
1144
@@ -1150,10 +1155,7 @@ void mame_ui_manager::process_ui_events()
1150
1155
{
1151
1156
auto const pos (std::lower_bound (m_active_pointers.begin (), m_active_pointers.end (), std::make_pair (event.target , event.pointer_id )));
1152
1157
if (m_active_pointers.end () != pos)
1153
- {
1154
- m_update_pointers = true ;
1155
1158
m_active_pointers.erase (pos);
1156
- }
1157
1159
1158
1160
event.target ->pointer_left (
1159
1161
event.pointer_type , event.pointer_id , event.pointer_device ,
@@ -1168,10 +1170,7 @@ void mame_ui_manager::process_ui_events()
1168
1170
{
1169
1171
auto const pos (std::lower_bound (m_active_pointers.begin (), m_active_pointers.end (), std::make_pair (event.target , event.pointer_id )));
1170
1172
if (m_active_pointers.end () != pos)
1171
- {
1172
- m_update_pointers = true ;
1173
1173
m_active_pointers.erase (pos);
1174
- }
1175
1174
1176
1175
event.target ->pointer_aborted (
1177
1176
event.pointer_type , event.pointer_id , event.pointer_device ,
@@ -1379,15 +1378,20 @@ uint32_t mame_ui_manager::handler_ingame(render_container &container)
1379
1378
1380
1379
// process UI events and update pointers if necessary
1381
1380
process_ui_events ();
1382
- if (m_update_pointers)
1381
+ display_pointer_vector pointers;
1382
+ pointers.reserve (m_active_pointers.size ());
1383
+ auto const now (std::chrono::steady_clock::now ());
1384
+ for (auto const &pointer : m_active_pointers)
1383
1385
{
1384
- display_pointer_vector pointers;
1385
- pointers.reserve (m_active_pointers.size ());
1386
- for (auto const &pointer : m_active_pointers)
1387
- pointers.emplace_back (display_pointer{ *pointer.target , pointer.type , pointer.x , pointer.y });
1388
- set_pointers (pointers.begin (), pointers.end ());
1389
- m_update_pointers = false ;
1386
+ layout_view const &view (pointer.target ->current_view ());
1387
+ if (view.show_pointers ())
1388
+ {
1389
+ // TODO: make timeout configurable
1390
+ if (!view.hide_inactive_pointers () || (osd::ui_event_handler::pointer::PEN == pointer.type ) || ((now - pointer.updated ) <= std::chrono::seconds (3 )))
1391
+ pointers.emplace_back (display_pointer{ *pointer.target , pointer.type , pointer.x , pointer.y });
1392
+ }
1390
1393
}
1394
+ set_pointers (pointers.begin (), pointers.end ());
1391
1395
1392
1396
if (!ui_disabled)
1393
1397
{
@@ -2400,6 +2404,12 @@ bool mame_ui_manager::set_ui_event_handler(std::function<bool ()> &&handler)
2400
2404
if (ui_callback_type::GENERAL != m_handler_callback_type)
2401
2405
return false ;
2402
2406
2407
+ for (auto *target = machine ().render ().first_target (); target; target = target->next ())
2408
+ {
2409
+ if (!target->hidden ())
2410
+ target->forget_pointers ();
2411
+ }
2412
+
2403
2413
set_handler (
2404
2414
ui_callback_type::CUSTOM,
2405
2415
handler_callback_func (
0 commit comments