summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/frontend/mame/ui/menu.h22
-rw-r--r--src/frontend/mame/ui/ui.cpp28
-rw-r--r--src/osd/windows/window.cpp32
-rw-r--r--src/osd/windows/window.h9
4 files changed, 63 insertions, 28 deletions
diff --git a/src/frontend/mame/ui/menu.h b/src/frontend/mame/ui/menu.h
index 00b42890f4b..6c5238eacef 100644
--- a/src/frontend/mame/ui/menu.h
+++ b/src/frontend/mame/ui/menu.h
@@ -203,7 +203,8 @@ protected:
{
// size up the text
float const lrborder(ui().box_lr_border() * machine().render().ui_aspect(&container()));
- float maxwidth(origx2 - origx1);
+ float const origwidth(origx2 - origx1 - (2.0f * lrborder));
+ float maxwidth(origwidth);
for (Iter it = begin; it != end; ++it)
{
float width;
@@ -212,30 +213,27 @@ protected:
0.0f, 0.0f, 1.0f, justify, wrap,
mame_ui_manager::NONE, rgb_t::black(), rgb_t::white(),
&width, nullptr, text_size);
- width += 2.0f * lrborder;
maxwidth = (std::max)(maxwidth, width);
}
- if (scale && ((origx2 - origx1) < maxwidth))
+ if (scale && (origwidth < maxwidth))
{
- text_size *= ((origx2 - origx1) / maxwidth);
- maxwidth = origx2 - origx1;
+ text_size *= origwidth / maxwidth;
+ maxwidth = origwidth;
}
// draw containing box
- float x1(0.5f * (1.0f - maxwidth));
- float x2(x1 + maxwidth);
- ui().draw_outlined_box(container(), x1, y1, x2, y2, bgcolor);
+ float const boxleft(0.5f - (maxwidth * 0.5f) - lrborder);
+ float boxright(0.5f + (maxwidth * 0.5f) + lrborder);
+ ui().draw_outlined_box(container(), boxleft, y1, boxright, y2, bgcolor);
// inset box and draw content
- x1 += lrborder;
- x2 -= lrborder;
+ float const textleft(0.5f - (maxwidth * 0.5f));
y1 += ui().box_tb_border();
- y2 -= ui().box_tb_border();
for (Iter it = begin; it != end; ++it)
{
ui().draw_text_full(
container(), std::string_view(*it),
- x1, y1, x2 - x1, justify, wrap,
+ textleft, y1, maxwidth, justify, wrap,
mame_ui_manager::NORMAL, fgcolor, ui().colors().text_bg_color(),
nullptr, nullptr, text_size);
y1 += ui().get_line_height();
diff --git a/src/frontend/mame/ui/ui.cpp b/src/frontend/mame/ui/ui.cpp
index 7d3a51c8928..f44bf05af6f 100644
--- a/src/frontend/mame/ui/ui.cpp
+++ b/src/frontend/mame/ui/ui.cpp
@@ -835,7 +835,14 @@ void mame_ui_manager::draw_text(render_container &container, std::string_view bu
// and full size computation
//-------------------------------------------------
-void mame_ui_manager::draw_text_full(render_container &container, std::string_view origs, float x, float y, float origwrapwidth, ui::text_layout::text_justify justify, ui::text_layout::word_wrapping wrap, draw_mode draw, rgb_t fgcolor, rgb_t bgcolor, float *totalwidth, float *totalheight, float text_size)
+void mame_ui_manager::draw_text_full(
+ render_container &container,
+ std::string_view origs,
+ float x, float y, float origwrapwidth,
+ ui::text_layout::text_justify justify, ui::text_layout::word_wrapping wrap,
+ draw_mode draw, rgb_t fgcolor, rgb_t bgcolor,
+ float *totalwidth, float *totalheight,
+ float text_size)
{
// create the layout
auto layout = create_layout(container, origwrapwidth, justify, wrap);
@@ -844,7 +851,7 @@ void mame_ui_manager::draw_text_full(render_container &container, std::string_vi
layout.add_text(
origs,
fgcolor,
- draw == OPAQUE_ ? bgcolor : rgb_t::transparent(),
+ (draw == OPAQUE_) ? bgcolor : rgb_t::transparent(),
text_size);
// and emit it (if we are asked to do so)
@@ -867,7 +874,7 @@ void mame_ui_manager::draw_text_full(render_container &container, std::string_vi
void mame_ui_manager::draw_text_box(render_container &container, std::string_view text, ui::text_layout::text_justify justify, float xpos, float ypos, rgb_t backcolor)
{
// cap the maximum width
- float maximum_width = 1.0f - box_lr_border() * 2;
+ float maximum_width = 1.0f - (box_lr_border() * machine().render().ui_aspect(&container) * 2.0f);
// create a layout
ui::text_layout layout = create_layout(container, maximum_width, justify);
@@ -888,17 +895,18 @@ void mame_ui_manager::draw_text_box(render_container &container, std::string_vie
void mame_ui_manager::draw_text_box(render_container &container, ui::text_layout &layout, float xpos, float ypos, rgb_t backcolor)
{
// xpos and ypos are where we want to "pin" the layout, but we need to adjust for the actual size of the payload
- auto actual_left = layout.actual_left();
- auto actual_width = layout.actual_width();
- auto actual_height = layout.actual_height();
- auto x = std::clamp(xpos - actual_width / 2, box_lr_border(), 1.0f - actual_width - box_lr_border());
- auto y = std::clamp(ypos - actual_height / 2, box_tb_border(), 1.0f - actual_height - box_tb_border());
+ auto const lrborder = box_lr_border() * machine().render().ui_aspect(&container);
+ auto const actual_left = layout.actual_left();
+ auto const actual_width = layout.actual_width();
+ auto const actual_height = layout.actual_height();
+ auto const x = std::clamp(xpos - actual_width / 2, lrborder, 1.0f - actual_width - lrborder);
+ auto const y = std::clamp(ypos - actual_height / 2, box_tb_border(), 1.0f - actual_height - box_tb_border());
// add a box around that
draw_outlined_box(
container,
- x - box_lr_border(), y - box_tb_border(),
- x + actual_width + box_lr_border(), y + actual_height + box_tb_border(),
+ x - lrborder, y - box_tb_border(),
+ x + actual_width + lrborder, y + actual_height + box_tb_border(),
backcolor);
// emit the text
diff --git a/src/osd/windows/window.cpp b/src/osd/windows/window.cpp
index e6a15729350..c5166d67a11 100644
--- a/src/osd/windows/window.cpp
+++ b/src/osd/windows/window.cpp
@@ -307,6 +307,7 @@ win_window_info::win_window_info(
, m_lastclicktime(std::chrono::steady_clock::time_point::min())
, m_lastclickx(0)
, m_lastclicky(0)
+ , m_last_surrogate(0)
, m_attached_mode(false)
{
m_non_fullscreen_bounds.left = 0;
@@ -1158,7 +1159,34 @@ LRESULT CALLBACK win_window_info::video_window_proc(HWND wnd, UINT message, WPAR
break;
case WM_CHAR:
- window->machine().ui_input().push_char_event(window->target(), (char32_t) wparam);
+ {
+ char16_t const ch = char16_t(wparam);
+ if ((0xd800 <= ch) && (0xdbff >= ch))
+ {
+ window->m_last_surrogate = ch;
+ }
+ else if ((0xdc00 <= ch) && (0xdfff >= ch))
+ {
+ if (window->m_last_surrogate)
+ {
+ char32_t const uch = 0x10000 + ((ch & 0x03ff) | ((window->m_last_surrogate & 0x03ff) << 10));
+ window->machine().ui_input().push_char_event(window->target(), uch);
+ }
+ window->m_last_surrogate = 0;
+ }
+ else
+ {
+ window->machine().ui_input().push_char_event(window->target(), char32_t(ch));
+ window->m_last_surrogate = 0;
+ }
+ }
+ break;
+
+ case WM_UNICHAR:
+ if (UNICODE_NOCHAR == wparam)
+ return TRUE;
+ else
+ window->machine().ui_input().push_char_event(window->target(), char32_t(wparam));
break;
case WM_MOUSEWHEEL:
@@ -1166,8 +1194,8 @@ LRESULT CALLBACK win_window_info::video_window_proc(HWND wnd, UINT message, WPAR
UINT ucNumLines = 3; // default
SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &ucNumLines, 0);
window->machine().ui_input().push_mouse_wheel_event(window->target(), GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam), GET_WHEEL_DELTA_WPARAM(wparam), ucNumLines);
- break;
}
+ break;
// pause the system when we start a menu or resize
case WM_ENTERSIZEMOVE:
diff --git a/src/osd/windows/window.h b/src/osd/windows/window.h
index 8db6fc394b2..6586420df66 100644
--- a/src/osd/windows/window.h
+++ b/src/osd/windows/window.h
@@ -98,8 +98,8 @@ public:
int m_ismaximized;
// monitor info
- int m_fullscreen_safe;
- float m_aspect;
+ int m_fullscreen_safe;
+ float m_aspect;
// rendering info
std::mutex m_render_lock;
@@ -110,8 +110,9 @@ public:
// input info
std::chrono::steady_clock::time_point m_lastclicktime;
- int m_lastclickx;
- int m_lastclicky;
+ int m_lastclickx;
+ int m_lastclicky;
+ char16_t m_last_surrogate;
private:
void draw_video_contents(HDC dc, bool update);