diff options
-rw-r--r-- | generic/tkObj.c | 15 | ||||
-rw-r--r-- | unix/tkUnixKey.c | 29 |
2 files changed, 41 insertions, 3 deletions
diff --git a/generic/tkObj.c b/generic/tkObj.c index 3c49f94..e6952ff 100644 --- a/generic/tkObj.c +++ b/generic/tkObj.c @@ -153,8 +153,19 @@ GetTypeCache(void) Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); if (tsdPtr->doubleTypePtr == NULL) { - tsdPtr->doubleTypePtr = Tcl_GetObjType("double"); - tsdPtr->intTypePtr = Tcl_GetObjType("int"); + /* Smart initialization of doubleTypePtr/intTypePtr without + * hash-table lookup or creating complete Tcl_Obj's */ + Tcl_Obj obj; + obj.length = 3; + obj.bytes = (char *)"0.0"; + obj.typePtr = NULL; + Tcl_GetDoubleFromObj(NULL, &obj, &obj.internalRep.doubleValue); + tsdPtr->doubleTypePtr = obj.typePtr; + obj.bytes += 2; + obj.length = 1; + obj.typePtr = NULL; + Tcl_GetLongFromObj(NULL, &obj, &obj.internalRep.longValue); + tsdPtr->intTypePtr = obj.typePtr; } return tsdPtr; } diff --git a/unix/tkUnixKey.c b/unix/tkUnixKey.c index 23c4aa4..d8aa5ab 100644 --- a/unix/tkUnixKey.c +++ b/unix/tkUnixKey.c @@ -110,7 +110,7 @@ TkpGetString( XEvent *eventPtr, /* X keyboard event. */ Tcl_DString *dsPtr) /* Initialized, empty string to hold result. */ { - int len; + int len, mincode, maxcode; Tcl_DString buf; TkKeyEvent *kePtr = (TkKeyEvent *) eventPtr; @@ -125,6 +125,32 @@ TkpGetString( return Tcl_DStringValue(dsPtr); } + /* + * Only do this for KeyPress events, otherwise + * further Xlib function behavior might be undefined. + */ + + if (eventPtr->type != KeyPress) { + len = 0; + Tcl_DStringSetLength(dsPtr, len); + goto done; + } + + /* + * Filter keycodes out of range, otherwise + * further Xlib function behavior might be undefined. + */ + + mincode = 0; + maxcode = -1; + XDisplayKeycodes(winPtr->dispPtr->display, &mincode, &maxcode); + if ((eventPtr->xkey.keycode < mincode) || + (eventPtr->xkey.keycode > maxcode)) { + len = 0; + Tcl_DStringSetLength(dsPtr, len); + goto done; + } + #ifdef TK_USE_INPUT_METHODS if ((winPtr->dispPtr->flags & TK_DISPLAY_USE_IM) && (winPtr->inputContext != NULL) @@ -217,6 +243,7 @@ TkpGetString( * from having to reenter the XIM engine. [Bug 1373712] */ +done: kePtr->charValuePtr = ckalloc(len + 1); kePtr->charValueLen = len; memcpy(kePtr->charValuePtr, Tcl_DStringValue(dsPtr), (unsigned) len + 1); |