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;