From 3d6989edab3ed414071521515d9e02287996ba7b Mon Sep 17 00:00:00 2001 From: wacfrr <284174234+wacfrr@users.noreply.github.com> Date: Tue, 2 Jun 2026 20:35:50 +0800 Subject: [PATCH 1/2] [gui] Fix non-ASCII filename rendering in TRootBrowser ROOT's application manifest explicitly declares UTF-8 active code page, so strings entering the GDK backend are guaranteed to be valid UTF-8. Use explicit UTF-8 decoding instead of mbstowcs(), which would misinterpret the UTF-8 byte stream under the system's legacy ANSI code page. --- graf2d/win32gdk/gdk/src/gdk/win32/gdkfont-win32.c | 14 ++++++++++++-- graf2d/win32gdk/gdk/src/gdk/win32/gdkim-win32.c | 6 +++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/graf2d/win32gdk/gdk/src/gdk/win32/gdkfont-win32.c b/graf2d/win32gdk/gdk/src/gdk/win32/gdkfont-win32.c index 8c91dc8d53099..a1508de4d9463 100644 --- a/graf2d/win32gdk/gdk/src/gdk/win32/gdkfont-win32.c +++ b/graf2d/win32gdk/gdk/src/gdk/win32/gdkfont-win32.c @@ -1638,8 +1638,18 @@ gdk_wchar_text_handle(GdkFont * font, list = list->next; } - if (!list) - singlefont = NULL; + if (!list) { + /* No font matched the Unicode block exactly. Fall back to the first + * font in the font set to avoid silently dropping the character (the + * old behavior set singlefont = NULL and skipped rendering entirely). + * With added defensive null-checks, this ensures CJK and non-Latin + * text visibility without introducing regression risks. */ + if (private && private->fonts && private->fonts->data) { + singlefont = (GdkWin32SingleFont *) private->fonts->data; + } else { + singlefont = NULL; + } + } GDK_NOTE(MISC, g_print("%d:%d:%d ", start - wcstr, wcp - wcstr, block)); diff --git a/graf2d/win32gdk/gdk/src/gdk/win32/gdkim-win32.c b/graf2d/win32gdk/gdk/src/gdk/win32/gdkim-win32.c index 5eaf4537e55d7..4bdea23f196ec 100644 --- a/graf2d/win32gdk/gdk/src/gdk/win32/gdkim-win32.c +++ b/graf2d/win32gdk/gdk/src/gdk/win32/gdkim-win32.c @@ -291,11 +291,15 @@ gint gdk_mbstowcs(GdkWChar * dest, const gchar * src, gint dest_max) /* A version that converts to wchar_t wide chars */ +/* ROOT's application manifest explicitly declares UTF-8, + * so strings entering the GDK backend are guaranteed to be valid UTF-8. + * Use explicit UTF-8 decoding instead of mbstowcs(), which would + * misinterpret the UTF-8 byte stream under the system's legacy ANSI code page. */ gint gdk_nmbstowchar_ts(wchar_t * dest, const gchar * src, gint src_len, gint dest_max) { -#if 1 +#if 0 return mbstowcs(dest, src, src_len); #else wchar_t *wcp; From 073c555702f11af5e8e10fdb63c0a1a88b460f52 Mon Sep 17 00:00:00 2001 From: wacfrr <284174234+wacfrr@users.noreply.github.com> Date: Tue, 2 Jun 2026 23:55:47 +0800 Subject: [PATCH 2/2] Update graf2d/win32gdk/gdk/src/gdk/win32/gdkfont-win32.c Co-authored-by: ferdymercury --- graf2d/win32gdk/gdk/src/gdk/win32/gdkfont-win32.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graf2d/win32gdk/gdk/src/gdk/win32/gdkfont-win32.c b/graf2d/win32gdk/gdk/src/gdk/win32/gdkfont-win32.c index a1508de4d9463..3f5ca77618ca8 100644 --- a/graf2d/win32gdk/gdk/src/gdk/win32/gdkfont-win32.c +++ b/graf2d/win32gdk/gdk/src/gdk/win32/gdkfont-win32.c @@ -1644,7 +1644,7 @@ gdk_wchar_text_handle(GdkFont * font, * old behavior set singlefont = NULL and skipped rendering entirely). * With added defensive null-checks, this ensures CJK and non-Latin * text visibility without introducing regression risks. */ - if (private && private->fonts && private->fonts->data) { + if (private && private->fonts) { singlefont = (GdkWin32SingleFont *) private->fonts->data; } else { singlefont = NULL;