summaryrefslogtreecommitdiffstats
path: root/win
diff options
context:
space:
mode:
Diffstat (limited to 'win')
-rw-r--r--win/tkWinKey.c9
-rw-r--r--win/tkWinX.c44
2 files changed, 51 insertions, 2 deletions
diff --git a/win/tkWinKey.c b/win/tkWinKey.c
index 22e5dd9..7df78e1 100644
--- a/win/tkWinKey.c
+++ b/win/tkWinKey.c
@@ -9,7 +9,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkWinKey.c,v 1.16 2005/12/02 13:42:29 dkf Exp $
+ * RCS: @(#) $Id: tkWinKey.c,v 1.17 2006/08/30 21:55:51 hobbs Exp $
*/
#include "tkWinInt.h"
@@ -115,6 +115,13 @@ TkpGetString(
len = Tcl_UniCharToUtf((Tcl_UniChar) unichar, buf);
Tcl_DStringAppend(dsPtr, buf, len);
+ } else if (eventPtr->xkey.send_event == -3) {
+ /*
+ * Special case for WM_UNICHAR.
+ * xkey.trans_chars[] already contains a UTF-8 char.
+ */
+ Tcl_DStringAppend(dsPtr, eventPtr->xkey.trans_chars,
+ eventPtr->xkey.nbytes);
} else {
/*
* This is an event generated from generic code. It has no nchars or
diff --git a/win/tkWinX.c b/win/tkWinX.c
index 3a38aab..5614385 100644
--- a/win/tkWinX.c
+++ b/win/tkWinX.c
@@ -10,7 +10,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkWinX.c,v 1.53 2006/04/05 20:58:09 hobbs Exp $
+ * RCS: @(#) $Id: tkWinX.c,v 1.54 2006/08/30 21:55:51 hobbs Exp $
*/
/*
@@ -54,6 +54,15 @@
# pragma comment (lib, "imm32.lib")
#endif
+/*
+ * WM_UNICHAR is a message for Unicode input on all windows systems.
+ * Perhaps this definition should be moved in another file.
+ */
+#ifndef WM_UNICHAR
+#define WM_UNICHAR 0x0109
+#define UNICODE_NOCHAR 0xFFFF
+#endif
+
static TkWinProcs asciiProcs = {
0,
@@ -856,6 +865,21 @@ TkWinChildProc(
result = TkWinEmbeddedEventProc(hwnd, message, wParam, lParam);
break;
+ case WM_UNICHAR:
+ if (wParam == UNICODE_NOCHAR) {
+ /* If wParam is UNICODE_NOCHAR and the application processes
+ * this message, then return TRUE. */
+ result = 1;
+ } else {
+ /* If the event was translated, we must return 0 */
+ if (Tk_TranslateWinEvent(hwnd, message, wParam, lParam, &result)) {
+ result = 0;
+ } else {
+ result = 1;
+ }
+ }
+ break;
+
default:
if (!Tk_TranslateWinEvent(hwnd, message, wParam, lParam, &result)) {
result = DefWindowProc(hwnd, message, wParam, lParam);
@@ -945,6 +969,7 @@ Tk_TranslateWinEvent(
case WM_SETFOCUS:
case WM_KILLFOCUS:
case WM_DESTROYCLIPBOARD:
+ case WM_UNICHAR:
case WM_CHAR:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
@@ -1098,6 +1123,7 @@ GenerateXEvent(
*/
case WM_CHAR:
+ case WM_UNICHAR:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
case WM_KEYDOWN:
@@ -1230,6 +1256,22 @@ GenerateXEvent(
Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
event.type = KeyRelease;
break;
+
+ case WM_UNICHAR: {
+ char buffer[TCL_UTF_MAX+1];
+ int i;
+ event.type = KeyPress;
+ event.xany.send_event = -3;
+ event.xkey.keycode = wParam;
+ event.xkey.nbytes = Tcl_UniCharToUtf(wParam, buffer);
+ for (i=0; i<event.xkey.nbytes && i<TCL_UTF_MAX; ++i) {
+ event.xkey.trans_chars[i] = buffer[i];
+ }
+ Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
+ event.type = KeyRelease;
+ break;
+ }
+
}
break;
}