summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tkObj.c15
-rw-r--r--unix/tkUnixKey.c29
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);