diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2016-09-01 13:21:49 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2016-09-01 13:21:49 (GMT) |
commit | b1c0906cd7a5a3ab79df9ee025896ffb275725a4 (patch) | |
tree | f277aed8334f7eb42ec11d0dea0c75d747cd0cde /win | |
parent | 5bfb6d6fc431a9a9cf19335ed95bc09dd3698fb4 (diff) | |
download | tk-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.c | 15 | ||||
-rw-r--r-- | win/tkWinX.c | 64 |
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; |