Skip to content

Commit 3dfb72c

Browse files
committed
ui: Added options to pause when showing menus and to open menus in active window.
* ui/ui.cpp: Dim all windows when paused. * ui/ui.cpp, menu/menu.cpp, ui/viewgfx.cpp: Broke assumption that UI elements will be drawn in the first window. * menu/menu.cpp: Allow menus to migrate between windows on activation. * ui/ui.cpp, ui/moptions.cpp, ui/submenu.cpp: Added an option to automatically pause when a menu is displayed. * Added an option to open menus in the most recently active window (alos affcts the profiler, speed display and popup messages).
1 parent 17adb7e commit 3dfb72c

118 files changed

Lines changed: 932 additions & 802 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/emu/render.cpp

Lines changed: 32 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3443,66 +3443,51 @@ render_target *render_manager::target_by_index(int index) const
34433443
// fonts
34443444
//-------------------------------------------------
34453445

3446-
float render_manager::ui_aspect(render_container *rc)
3446+
float render_manager::ui_aspect(render_target &target)
34473447
{
3448-
// work out if this is a UI container
3449-
render_target *target = nullptr;
3450-
if (!rc)
3451-
{
3452-
target = &ui_target();
3453-
rc = target->ui_container();
3454-
assert(rc);
3455-
}
3456-
else
3457-
{
3458-
for (render_target &t : m_targetlist)
3459-
{
3460-
if (t.ui_container() == rc)
3461-
{
3462-
target = &t;
3463-
break;
3464-
}
3465-
}
3466-
}
3448+
assert(target.ui_container());
34673449

3450+
// based on the orientation of the target, compute height/width or width/height
3451+
int const orient = orientation_add(target.orientation(), target.ui_container()->orientation());
34683452
float aspect;
3453+
if (!(orient & ORIENTATION_SWAP_XY))
3454+
aspect = float(target.height()) / float(target.width());
3455+
else
3456+
aspect = float(target.width()) / float(target.height());
34693457

3470-
if (target)
3458+
// if we have a valid pixel aspect, apply that and return
3459+
if (target.pixel_aspect() != 0.0F)
34713460
{
3472-
// UI container, aggregated multi-screen target
3461+
float pixel_aspect = target.pixel_aspect();
34733462

3474-
// based on the orientation of the target, compute height/width or width/height
3475-
int const orient = orientation_add(target->orientation(), rc->orientation());
3476-
if (!(orient & ORIENTATION_SWAP_XY))
3477-
aspect = float(target->height()) / float(target->width());
3478-
else
3479-
aspect = float(target->width()) / float(target->height());
3463+
if (orient & ORIENTATION_SWAP_XY)
3464+
pixel_aspect = 1.0F / pixel_aspect;
34803465

3481-
// if we have a valid pixel aspect, apply that and return
3482-
if (target->pixel_aspect() != 0.0f)
3483-
{
3484-
float pixel_aspect = target->pixel_aspect();
3466+
return aspect / pixel_aspect;
3467+
}
34853468

3486-
if (orient & ORIENTATION_SWAP_XY)
3487-
pixel_aspect = 1.0f / pixel_aspect;
3469+
// clamp for extreme proportions
3470+
return std::clamp(aspect, 0.66F, 1.5F);
3471+
}
34883472

3489-
return aspect /= pixel_aspect;
3490-
}
3491-
}
3492-
else
3473+
float render_manager::ui_aspect(render_container &rc)
3474+
{
3475+
// deal with UI containers
3476+
for (render_target &target : m_targetlist)
34933477
{
3494-
// single screen container
3495-
3496-
// based on the orientation of the target, compute height/width or width/height
3497-
int const orient = rc->orientation();
3498-
if (!(orient & ORIENTATION_SWAP_XY))
3499-
aspect = (float)rc->screen()->visible_area().height() / (float)rc->screen()->visible_area().width();
3500-
else
3501-
aspect = (float)rc->screen()->visible_area().width() / (float)rc->screen()->visible_area().height();
3478+
if (target.ui_container() == &rc)
3479+
return ui_aspect(target);
35023480
}
35033481

3482+
// based on the orientation of the target, compute height/width or width/height
3483+
assert(rc.screen());
3484+
int const orient = rc.orientation();
3485+
float const viswidth = rc.screen()->visible_area().width();
3486+
float const visheight = rc.screen()->visible_area().height();
3487+
float const aspect = !(orient & ORIENTATION_SWAP_XY) ? (visheight / viswidth) : (viswidth / visheight);
3488+
35043489
// clamp for extreme proportions
3505-
return std::clamp(aspect, 0.66f, 1.5f);
3490+
return std::clamp(aspect, 0.66F, 1.5F);
35063491
}
35073492

35083493

src/emu/render.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,8 @@ class render_manager
679679
// UI targets
680680
render_target &ui_target() const { assert(m_ui_target != nullptr); return *m_ui_target; }
681681
void set_ui_target(render_target &target) { m_ui_target = ⌖ }
682-
float ui_aspect(render_container *rc = nullptr);
682+
float ui_aspect(render_target &target); // gets result for target's UI container - target must not be a hidden target with no UI container
683+
float ui_aspect(render_container &rc); // rc must be a screen container or a UI container for a render target; requires an O(n) scan of render targets
683684

684685
// UI containers
685686
render_container &ui_container() const { assert(ui_target().ui_container()); return *ui_target().ui_container(); }

src/emu/uiinput.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ enum
3535

3636
ui_input_manager::ui_input_manager(running_machine &machine)
3737
: m_machine(machine)
38+
, m_focused_target(nullptr)
39+
, m_last_focused_target(nullptr)
3840
, m_presses_enabled(true)
3941
, m_events_start(0)
4042
, m_events_end(0)
@@ -192,6 +194,8 @@ bool ui_input_manager::pressed_repeat(int code, int speed)
192194

193195
void ui_input_manager::push_window_focus_event(render_target *target)
194196
{
197+
m_focused_target = m_last_focused_target = target;
198+
195199
ui_event event = { ui_event::type::NONE };
196200
event.event_type = ui_event::type::WINDOW_FOCUS;
197201
event.target = target;
@@ -205,6 +209,9 @@ void ui_input_manager::push_window_focus_event(render_target *target)
205209

206210
void ui_input_manager::push_window_defocus_event(render_target *target)
207211
{
212+
if (m_focused_target == target)
213+
m_focused_target = nullptr;
214+
208215
ui_event event = { ui_event::type::NONE };
209216
event.event_type = ui_event::type::WINDOW_DEFOCUS;
210217
event.target = target;

src/emu/uiinput.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ class ui_input_manager final : public osd::ui_event_handler
8888
// return true if a key down for the given user interface sequence is detected, or if autorepeat at the given speed is triggered
8989
bool pressed_repeat(int code, int speed);
9090

91+
// get current or most recently focused render target
92+
render_target *focused_target() const { return m_focused_target; }
93+
render_target *last_focused_target() const { return m_last_focused_target; }
94+
9195
// getters
9296
running_machine &machine() const { return m_machine; }
9397

@@ -109,6 +113,10 @@ class ui_input_manager final : public osd::ui_event_handler
109113
// internal state
110114
running_machine & m_machine;
111115

116+
// track focused render target;
117+
render_target * m_focused_target;
118+
render_target * m_last_focused_target;
119+
112120
// pressed states; retrieved with pressed() or pressed_repeat()
113121
bool m_presses_enabled;
114122
osd_ticks_t m_next_repeat[IPT_COUNT];

src/frontend/mame/cheat.cpp

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,21 +1238,25 @@ bool cheat_manager::save_all(std::string const &filename)
12381238
// render text
12391239
//-------------------------------------------------
12401240

1241-
void cheat_manager::render_text(mame_ui_manager &mui, render_container &container)
1241+
void cheat_manager::render_text(mame_ui_manager &mui, render_target &target)
12421242
{
12431243
// render any text and free it along the way
1244-
for (int linenum = 0; linenum < m_output.size(); linenum++)
1244+
if (!m_output.size())
12451245
{
1246-
if (!m_output[linenum].empty())
1246+
float const lineheight = mui.get_line_height(target);
1247+
for (int linenum = 0; linenum < m_output.size(); linenum++)
12471248
{
1248-
// output the text
1249-
mui.draw_text_full(
1250-
container,
1251-
m_output[linenum],
1252-
0.0f, float(linenum) * mui.get_line_height(), 1.0f,
1253-
m_justify[linenum], ui::text_layout::word_wrapping::NEVER,
1254-
mame_ui_manager::OPAQUE_, rgb_t::white(), rgb_t::black(),
1255-
nullptr, nullptr);
1249+
if (!m_output[linenum].empty())
1250+
{
1251+
// output the text
1252+
mui.draw_text_full(
1253+
target,
1254+
m_output[linenum],
1255+
0.0f, float(linenum) * lineheight, 1.0f,
1256+
m_justify[linenum], ui::text_layout::word_wrapping::NEVER,
1257+
mame_ui_manager::OPAQUE_, rgb_t::white(), rgb_t::black(),
1258+
nullptr, nullptr);
1259+
}
12561260
}
12571261
}
12581262
}
@@ -1371,9 +1375,10 @@ uint64_t cheat_manager::execute_tobcd(int params, const uint64_t *param)
13711375

13721376
void cheat_manager::frame_update()
13731377
{
1378+
// FIXME: this assumes the overlay will always be on the default UI target
13741379
// set up for accumulating output
13751380
m_lastline = 0;
1376-
m_numlines = floor(1.0f / mame_machine_manager::instance()->ui().get_line_height());
1381+
m_numlines = floor(1.0f / mame_machine_manager::instance()->ui().get_line_height(machine().render().ui_target()));
13771382
m_numlines = std::min<uint8_t>(m_numlines, m_output.size());
13781383
for (auto & elem : m_output)
13791384
elem.clear();

src/frontend/mame/cheat.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ class cheat_manager
319319
// actions
320320
void reload();
321321
bool save_all(std::string const &filename);
322-
void render_text(mame_ui_manager &mui, render_container &container);
322+
void render_text(mame_ui_manager &mui, render_target &target);
323323

324324
// output helpers
325325
std::string &get_output_string(int row, ui::text_layout::text_justify justify);

src/frontend/mame/luaengine.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -946,8 +946,8 @@ void lua_engine::initialize()
946946
[this](const char *name)
947947
{
948948
mame_ui_manager &mui = mame_machine_manager::instance()->ui();
949-
render_container &container = machine().render().ui_container();
950-
ui::menu_plugin::show_menu(mui, container, name);
949+
render_target &target = machine().render().ui_target(); // FIXME: it should really ask the UI manager where to show this
950+
ui::menu_plugin::show_menu(mui, target, name);
951951
};
952952
emu["register_callback"] =
953953
[this] (sol::function cb, const std::string &name)
@@ -1811,7 +1811,9 @@ void lua_engine::initialize()
18111811
msg,
18121812
x, y, (1.0F - x),
18131813
justify, ui::text_layout::word_wrapping::WORD,
1814-
mame_ui_manager::OPAQUE_, *fgcolor, *bgcolor);
1814+
mame_ui_manager::OPAQUE_, *fgcolor, *bgcolor,
1815+
nullptr, nullptr,
1816+
ui.get_line_height(ui.machine().render().ui_target())); // FIXME: line height quantisation assumes text is displayed on default UI target
18151817
});
18161818
screen_dev_type.set_function(
18171819
"orientation",
@@ -2224,15 +2226,15 @@ void lua_engine::initialize()
22242226

22252227
auto ui_type = sol().registry().new_usertype<mame_ui_manager>("ui", sol::no_constructor);
22262228
// sol converts char32_t to a string
2227-
ui_type.set_function("get_char_width", [] (mame_ui_manager &m, uint32_t utf8char) { return m.get_char_width(utf8char); });
2228-
ui_type.set_function("get_string_width", static_cast<float (mame_ui_manager::*)(std::string_view)>(&mame_ui_manager::get_string_width));
2229+
ui_type.set_function("get_char_width", [] (mame_ui_manager &m, uint32_t utf8char) { return m.get_char_width(m.machine().render().ui_target(), utf8char); }); // FIXME: allow render target to be supplied
2230+
ui_type.set_function("get_string_width", [] (mame_ui_manager &m, std::string_view s) { return m.get_string_width(m.machine().render().ui_target(), s); }); // FIXME: allow render target to be supplied
22292231
ui_type.set_function("set_aggressive_input_focus", [] (mame_ui_manager &m, bool aggressive_focus) { osd_set_aggressive_input_focus(aggressive_focus); });
22302232
ui_type["get_general_input_setting"] = sol::overload(
22312233
// TODO: overload with sequence type string - parser isn't available here
22322234
[] (mame_ui_manager &ui, ioport_type type, int player) { return ui.get_general_input_setting(type, player, SEQ_TYPE_STANDARD); },
22332235
[] (mame_ui_manager &ui, ioport_type type) { return ui.get_general_input_setting(type, 0, SEQ_TYPE_STANDARD); });
22342236
ui_type["options"] = sol::property([] (mame_ui_manager &m) { return static_cast<core_options *>(&m.options()); });
2235-
ui_type["line_height"] = sol::property([] (mame_ui_manager &m) { return m.get_line_height(); });
2237+
ui_type["line_height"] = sol::property([] (mame_ui_manager &m) { return m.get_line_height(m.machine().render().ui_target()); }); // FIXME: allow render target to be supplied
22362238
ui_type["menu_active"] = sol::property(&mame_ui_manager::is_menu_active);
22372239
ui_type["ui_active"] = sol::property(&mame_ui_manager::ui_active, &mame_ui_manager::set_ui_active);
22382240
ui_type["single_step"] = sol::property(&mame_ui_manager::single_step, &mame_ui_manager::set_single_step);

src/frontend/mame/luaengine_render.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1191,7 +1191,9 @@ void lua_engine::initialize_render(sol::table &emu)
11911191
msg,
11921192
x, y, (1.0f - x),
11931193
justify, ui::text_layout::word_wrapping::WORD,
1194-
mame_ui_manager::OPAQUE_, *fgcolor, *bgcolor);
1194+
mame_ui_manager::OPAQUE_, *fgcolor, *bgcolor,
1195+
nullptr, nullptr,
1196+
ui.get_line_height(ui.machine().render().ui_target())); // FIXME: line height quantisation assumes text is displayed on default UI target
11951197
});
11961198
render_container_type["user_settings"] = sol::property(&render_container::get_user_settings, &render_container::set_user_settings);
11971199
render_container_type["orientation"] = sol::property(

src/frontend/mame/mame.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -440,11 +440,11 @@ void emulator_info::display_ui_chooser(running_machine& machine)
440440
{
441441
// force the UI to show the game select screen
442442
mame_ui_manager &mui = mame_machine_manager::instance()->ui();
443-
render_container &container = machine.render().ui_container();
443+
render_target &target = machine.render().ui_target();
444444
if (machine.options().ui() == emu_options::UI_SIMPLE)
445-
ui::simple_menu_select_game::force_game_select(mui, container);
445+
ui::simple_menu_select_game::force_game_select(mui, target);
446446
else
447-
ui::menu_select_game::force_game_select(mui, container);
447+
ui::menu_select_game::force_game_select(mui, target);
448448
}
449449

450450
int emulator_info::start_frontend(emu_options &options, osd_interface &osd, std::vector<std::string> &args)
@@ -461,7 +461,7 @@ int emulator_info::start_frontend(emu_options &options, osd_interface &osd, int
461461

462462
bool emulator_info::draw_user_interface(running_machine& machine)
463463
{
464-
return mame_machine_manager::instance()->ui().update_and_render(machine.render().ui_container());
464+
return mame_machine_manager::instance()->ui().update_and_render(machine.render().ui_target());
465465
}
466466

467467
void emulator_info::periodic_check()

src/frontend/mame/ui/about.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ namespace {
3434
// ctor
3535
//-------------------------------------------------
3636

37-
menu_about::menu_about(mame_ui_manager &mui, render_container &container)
38-
: menu_textbox(mui, container)
37+
menu_about::menu_about(mame_ui_manager &mui, render_target &target)
38+
: menu_textbox(mui, target)
3939
, m_header{
4040
util::string_format(
4141
#ifdef MAME_DEBUG

0 commit comments

Comments
 (0)