summaryrefslogtreecommitdiffstats
path: root/win/tkWinKey.c
diff options
context:
space:
mode:
Diffstat (limited to 'win/tkWinKey.c')
-rw-r--r--win/tkWinKey.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/win/tkWinKey.c b/win/tkWinKey.c
index a49898f..64f8cd4 100644
--- a/win/tkWinKey.c
+++ b/win/tkWinKey.c
@@ -113,15 +113,18 @@ TkpGetString(
Tcl_DStringAppend(dsPtr, buf, len);
} else if (keyEv->send_event == -3) {
+
+ char buf[XMaxTransChars];
+ int len;
+
/*
- * Special case for WM_UNICHAR. xkey.trans_chars[] already contains a
- * UTF-8 char, except when nbytes == 0 (then it didn't fit there).
+ * Special case for WM_UNICHAR.
*/
- if (keyEv->nbytes) {
- Tcl_DStringAppend(dsPtr, keyEv->trans_chars, keyEv->nbytes);
- } else if (keyEv->keycode > 0xffff) {
- char buf[XMaxTransChars];
+ len = Tcl_UniCharToUtf(keyEv->keycode, buf);
+ if ((keyEv->keycode <= 0xffff) || (len == XMaxTransChars)) {
+ Tcl_DStringAppend(dsPtr, buf, len);
+ } else {
Tcl_UniCharToUtf(((keyEv->keycode - 0x10000) >> 10) | 0xd800, buf);
Tcl_DStringAppend(dsPtr, buf, 3);
Tcl_UniCharToUtf(((keyEv->keycode - 0x10000) & 0x3ff) | 0xdc00, buf);