summaryrefslogtreecommitdiffstats
path: root/win
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2016-09-01 13:21:49 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2016-09-01 13:21:49 (GMT)
commitb1c0906cd7a5a3ab79df9ee025896ffb275725a4 (patch)
treef277aed8334f7eb42ec11d0dea0c75d747cd0cde /win
parent5bfb6d6fc431a9a9cf19335ed95bc09dd3698fb4 (diff)
downloadtk-b1c0906cd7a5a3ab79df9ee025896ffb275725a4.zip
tk-b1c0906cd7a5a3ab79df9ee025896ffb275725a4.tar.gz
tk-b1c0906cd7a5a3ab79df9ee025896ffb275725a4.tar.bz2
(experiment) don't fill trans_chars any more when send_event == -3. Results in many simplifications while it still should work the same
Diffstat (limited to 'win')
-rw-r--r--win/tkWinKey.c15
-rw-r--r--win/tkWinX.c64
2 files changed, 13 insertions, 66 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);
diff --git a/win/tkWinX.c b/win/tkWinX.c
index e8715b3..ccccf56 100644
--- a/win/tkWinX.c
+++ b/win/tkWinX.c
@@ -1210,8 +1210,7 @@ GenerateXEvent(
event.xany.send_event = -1;
event.xkey.keycode = 0;
if ((int)wParam & 0xff00) {
- int i, ch1 = wParam & 0xffff;
- char buffer[XMaxTransChars];
+ int ch1 = wParam & 0xffff;
if ((ch1 & 0xfc00) == 0xd800) {
tsdPtr->surrogateBuffer = ch1;
@@ -1223,32 +1222,8 @@ GenerateXEvent(
tsdPtr->surrogateBuffer = 0;
}
event.xany.send_event = -3;
- event.xkey.nbytes = Tcl_UniCharToUtf(ch1, buffer);
- if ((ch1 <= 0xffff) || (event.xkey.nbytes == XMaxTransChars)) {
- event.xkey.keycode = ch1;
- for (i=0; i<event.xkey.nbytes && i<XMaxTransChars; ++i) {
- event.xkey.trans_chars[i] = buffer[i];
- }
- } else {
-#ifdef USE_EXTRA_EVENTS
- event.xkey.keycode = ((int)(ch1 - 0x10000)>>10) | 0xd800;
- event.xkey.nbytes = Tcl_UniCharToUtf(event.xkey.keycode, buffer);
- for (i=0; i<event.xkey.nbytes && i<XMaxTransChars; ++i) {
- event.xkey.trans_chars[i] = buffer[i];
- }
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
- event.type = KeyRelease;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
- event.type = KeyPress;
- event.xkey.keycode = ((int)(ch1 - 0x10000)&0x3ff) | 0xdc00;
- event.xkey.nbytes = Tcl_UniCharToUtf(event.xkey.keycode, buffer);
- for (i=0; i<event.xkey.nbytes && i<XMaxTransChars; ++i) {
- event.xkey.trans_chars[i] = buffer[i];
- }
-#else
- event.xkey.nbytes = 0;
-#endif
- }
+ event.xkey.nbytes = 0;
+ event.xkey.keycode = ch1;
} else {
event.xkey.nbytes = 1;
event.xkey.trans_chars[0] = (char) wParam;
@@ -1269,41 +1244,10 @@ GenerateXEvent(
break;
case WM_UNICHAR: {
- char buffer[XMaxTransChars];
- int i;
event.type = KeyPress;
event.xany.send_event = -3;
event.xkey.keycode = wParam;
- event.xkey.nbytes = Tcl_UniCharToUtf((int)wParam, buffer);
- if(((int)wParam > 0xffff) && (event.xkey.nbytes < XMaxTransChars)) {
-#if USE_EXTRA_EVENTS
- /* trans_chars buffer is not big enough to hold 2 surrogate
- characters, so split it in two separate events */
-
- event.xkey.keycode = ((int)(wParam - 0x10000)>>10) | 0xd800;
- event.xkey.nbytes = Tcl_UniCharToUtf(event.xkey.keycode, buffer);
- for (i=0; i<event.xkey.nbytes && i<XMaxTransChars; ++i) {
- event.xkey.trans_chars[i] = buffer[i];
- }
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
- event.type = KeyRelease;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
- event.type = KeyPress;
- event.xkey.keycode = ((int)(wParam - 0x10000)&0x3ff) | 0xdc00;
- event.xkey.nbytes = Tcl_UniCharToUtf(event.xkey.keycode, buffer);
- for (i=0; i<event.xkey.nbytes && i<XMaxTransChars; ++i) {
- event.xkey.trans_chars[i] = buffer[i];
- }
-#else
- /* trans_chars buffer is not big enough to hold 2 surrogate
- characters, so don't store anything redundant anyway. */
- event.xkey.nbytes = 0;
-#endif
- } else {
- for (i=0; i<event.xkey.nbytes && i<XMaxTransChars; ++i) {
- event.xkey.trans_chars[i] = buffer[i];
- }
- }
+ event.xkey.nbytes = 0;
Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
event.type = KeyRelease;
break;