summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tkArray.h35
-rw-r--r--generic/tkBind.c73
-rw-r--r--generic/tkDList.h4
-rw-r--r--tests/bind.test37
4 files changed, 95 insertions, 54 deletions
diff --git a/generic/tkArray.h b/generic/tkArray.h
index be7fa66..bb4452a 100644
--- a/generic/tkArray.h
+++ b/generic/tkArray.h
@@ -179,23 +179,23 @@ static int \
AT##_IsEmpty(struct AT *arr) \
{ \
assert(!arr || arr->size != 0xdeadbeef); \
- return !arr || arr->size == 0; \
+ return !arr || arr->size == 0u; \
} \
\
__TK_ARRAY_UNUSED \
-static int \
+static size_t \
AT##_Size(const struct AT *arr) \
{ \
assert(!arr || arr->size != 0xdeadbeef); \
- return arr ? arr->size : 0; \
+ return arr ? arr->size : 0u; \
} \
\
__TK_ARRAY_UNUSED \
-static int \
+static size_t \
AT##_Capacity(const struct AT *arr) \
{ \
assert(!arr || arr->size != 0xdeadbeef); \
- return arr ? arr->capacity : 0; \
+ return arr ? arr->capacity : 0u; \
} \
\
__TK_ARRAY_UNUSED \
@@ -331,6 +331,23 @@ AT##_Free(struct AT **arrp) \
{ \
AT##_Resize(arrp, 0); \
} \
+ \
+__TK_ARRAY_UNUSED \
+static int \
+AT##_Find(const struct AT *arr, const ElemType *elem) \
+{ \
+ assert(!arr || arr->size != 0xdeadbeef); \
+ if (arr) { \
+ const ElemType *buf = arr->buf; \
+ size_t i; \
+ for (i = 0; i < arr->size; ++i) { \
+ if (memcmp(&buf[i], elem, sizeof(struct ElemType)) == 0) { \
+ return (int) i; \
+ } \
+ } \
+ } \
+ return -1; \
+} \
/* ------------------------------------------------------------------------- */
#define TK_PTR_ARRAY_DEFINE(AT, ElemType) /* AT = type of array */ \
@@ -398,7 +415,7 @@ AT##_Back(struct AT *arr) \
} \
\
__TK_ARRAY_UNUSED \
-static int \
+static size_t \
AT##_Size(const struct AT *arr) \
{ \
assert(!arr || arr->size != 0xdeadbeef); \
@@ -406,7 +423,7 @@ AT##_Size(const struct AT *arr) \
} \
\
__TK_ARRAY_UNUSED \
-static int \
+static size_t \
AT##_Capacity(const struct AT *arr) \
{ \
assert(!arr || arr->size != 0xdeadbeef); \
@@ -425,7 +442,7 @@ AT##_Resize(struct AT **arrp, size_t newCapacity) \
*arrp = NULL; \
} else { \
int init = *arrp == NULL; \
- unsigned memSize = sizeof(AT) + (newCapacity - 1)*sizeof(ElemType *); \
+ size_t memSize = sizeof(AT) + (newCapacity - 1)*sizeof(ElemType *); \
*arrp = ckrealloc(*arrp, memSize); \
if (init) { \
(*arrp)->size = 0; \
@@ -522,7 +539,7 @@ AT##_Find(const struct AT *arr, const ElemType *elem) \
size_t i; \
for (i = 0; i < arr->size; ++i) { \
if (buf[i] == elem) { \
- return i; \
+ return (int) i; \
} \
} \
} \
diff --git a/generic/tkBind.c b/generic/tkBind.c
index 0e1413b..786e23a 100644
--- a/generic/tkBind.c
+++ b/generic/tkBind.c
@@ -335,7 +335,7 @@ typedef struct PatSeq {
* Tcl/Tk does not support C99 integer support.)
*/
-#define NO_NUMBER (((Tcl_WideUInt) 1) << (8*sizeof(Tcl_WideInt) - 1))
+#define NO_NUMBER (((Tcl_WideInt) 1) << (8*sizeof(Tcl_WideInt) - 1))
/*
* The following structure is used in the nameTable of a virtual event table
@@ -796,7 +796,7 @@ FreePatSeq(
{
assert(psPtr);
assert(!psPtr->owned);
- DEBUG(psPtr->added = 0xdeadbeef);
+ DEBUG(psPtr->added = (int) 0xdeadbeef);
ckfree(psPtr->script);
if (!psPtr->object) {
VirtOwners_Free(&psPtr->ptr.owners);
@@ -849,14 +849,14 @@ ResolveModifiers(
if (dispPtr->metaModMask) {
if (modMask & META_MASK) {
- modMask |= dispPtr->metaModMask;
modMask &= ~META_MASK;
+ modMask |= dispPtr->metaModMask;
}
}
if (dispPtr->altModMask) {
if (modMask & ALT_MASK) {
- modMask |= dispPtr->altModMask;
modMask &= ~ALT_MASK;
+ modMask |= dispPtr->altModMask;
}
}
@@ -931,7 +931,7 @@ MakeListEntry(
assert(pool);
assert(psPtr);
- assert(psPtr->added != 0xdeadbeef);
+ assert(psPtr->added != (int) 0xdeadbeef);
if (PSList_IsEmpty(pool)) {
newEntry = ckalloc(sizeof(PSEntry));
@@ -1115,13 +1115,17 @@ ClearPromotionLists(
*---------------------------------------------------------------------------
*/
+/*
+ * Windoze compiler does not allow the definition of static variables inside a function,
+ * otherwise this should belong to function TkBindInit().
+ */
+TCL_DECLARE_MUTEX(bindMutex);
+static bool initialized = false;
+
void
TkBindInit(
TkMainInfo *mainPtr) /* The newly created application. */
{
- TCL_DECLARE_MUTEX(bindMutex);
- static bool initialized = false;
-
BindInfo *bindInfoPtr;
assert(mainPtr);
@@ -1141,10 +1145,9 @@ TkBindInit(
/* test expected indices of Button1..Button5, otherwise our button handling is not working */
assert(Button1 == 1 && Button2 == 2 && Button3 == 3 && Button4 == 4 && Button5 == 5);
assert(Button2Mask == (Button1Mask << 1));
- assert(Button2Mask == (Button1Mask << 2));
- assert(Button3Mask == (Button1Mask << 3));
- assert(Button4Mask == (Button1Mask << 4));
- assert(Button5Mask == (Button1Mask << 5));
+ assert(Button3Mask == (Button1Mask << 2));
+ assert(Button4Mask == (Button1Mask << 3));
+ assert(Button5Mask == (Button1Mask << 4));
/* test expected values of button motion masks, otherwise our button handling is not working */
assert(Button1MotionMask == Button1Mask);
@@ -1383,7 +1386,7 @@ Tk_DeleteBindingTable(
for (psPtr = Tcl_GetHashValue(hPtr); psPtr; psPtr = nextPtr) {
nextPtr = psPtr->nextSeqPtr;
- assert(psPtr->added != 0xdeadbeef);
+ assert(psPtr->added != (int) 0xdeadbeef);
FreePatSeq(psPtr);
}
}
@@ -1433,7 +1436,7 @@ InsertPatSeq(
assert(lookupTables);
assert(psPtr);
assert(psPtr->numPats >= 1);
- assert(psPtr->added != 0xdeadbeef);
+ assert(psPtr->added != (int) 0xdeadbeef);
if (!(psPtr->added)) {
PatternTableKey key;
@@ -1512,7 +1515,7 @@ Tk_CreateBinding(
if (!psPtr) {
return 0;
}
- assert(psPtr->added != 0xdeadbeef);
+ assert(psPtr->added != (int) 0xdeadbeef);
if (psPtr->numPats > PromArr_Capacity(bindPtr->promArr)) {
/*
@@ -1598,7 +1601,7 @@ Tk_DeleteBinding(
Tcl_HashEntry *hPtr;
PatSeq *prevPtr;
- assert(psPtr->added != 0xdeadbeef);
+ assert(psPtr->added != (int) 0xdeadbeef);
/*
* Unlink the binding from the list for its object.
@@ -1665,7 +1668,7 @@ Tk_GetBinding(
assert(eventString);
psPtr = FindSequence(interp, &bindPtr->lookupTables, object, eventString, false, true, NULL);
- assert(!psPtr || psPtr->added != 0xdeadbeef);
+ assert(!psPtr || psPtr->added != (int) 0xdeadbeef);
return psPtr ? psPtr->script : NULL;
}
@@ -1709,7 +1712,7 @@ Tk_GetAllBindings(
*/
for (psPtr = Tcl_GetHashValue(hPtr); psPtr; psPtr = psPtr->ptr.nextObj) {
- assert(psPtr->added != 0xdeadbeef);
+ assert(psPtr->added != (int) 0xdeadbeef);
Tcl_ListObjAppendElement(NULL, resultObj, GetPatternObj(psPtr));
}
Tcl_SetObjResult(interp, resultObj);
@@ -1903,7 +1906,7 @@ Tk_DeleteAllBindings(
ClearPromotionLists(bindPtr, object);
for (psPtr = Tcl_GetHashValue(hPtr); psPtr; psPtr = nextPtr) {
- assert(psPtr->added != 0xdeadbeef);
+ assert(psPtr->added != (int) 0xdeadbeef);
DEBUG(psPtr->added = false);
nextPtr = DeletePatSeq(psPtr);
}
@@ -1982,7 +1985,7 @@ Tk_BindEvent(
const char *p;
const char *end;
unsigned scriptCount;
- unsigned oldScreen;
+ int oldScreen;
unsigned flags;
unsigned arraySize;
unsigned newArraySize;
@@ -2057,7 +2060,7 @@ Tk_BindEvent(
bindInfoPtr->lastEventTime = eventPtr->xkey.time;
}
/* modifier keys are not influencing button events */
- for (i = 0; i < dispPtr->numModKeyCodes; ++i) {
+ for (i = 0; i < (unsigned) dispPtr->numModKeyCodes; ++i) {
if (dispPtr->modKeyCodes[i] == eventPtr->xkey.keycode) {
return;
}
@@ -2177,14 +2180,14 @@ Tk_BindEvent(
arraySize = 0;
Tcl_DStringInit(&scripts);
- if (numObjects > SIZE_OF_ARRAY(matchPtrBuf)) {
+ if ((unsigned) numObjects > SIZE_OF_ARRAY(matchPtrBuf)) {
/* it's unrealistic that the buffer size is too small, but who knows? */
matchPtrArr = ckalloc(numObjects*sizeof(matchPtrArr[0]));
}
memset(matchPtrArr, 0, numObjects*sizeof(matchPtrArr[0]));
if (!PromArr_IsEmpty(bindPtr->promArr)) {
- for (k = 0; k < numObjects; ++k) {
+ for (k = 0; k < (unsigned) numObjects; ++k) {
psl[1] = PromArr_Last(bindPtr->promArr);
psl[0] = psl[1] - 1;
@@ -2216,7 +2219,7 @@ Tk_BindEvent(
* 2. Look for bindings without detail.
*/
- for (k = 0; k < numObjects; ++k) {
+ for (k = 0; k < (unsigned) numObjects; ++k) {
PSList *psSuccList = PromArr_First(bindPtr->promArr);
PatSeq *bestPtr;
@@ -2332,7 +2335,7 @@ Tk_BindEvent(
|| psEntry->window != curEvent->xev.xany.window
|| (patPtr->info
&& curEvent->detail.info
- && patPtr->eventType == curEvent->xev.type
+ && patPtr->eventType == (unsigned) curEvent->xev.type
&& patPtr->info != curEvent->detail.info)) {
RemoveListEntry(&bindPtr->lookupTables.entryPool, psEntry);
} else {
@@ -2568,7 +2571,7 @@ MatchPatterns(
if (patIndex == 0 || psEntry->window == window) {
PatSeq* psPtr = psEntry->psPtr;
- assert(psPtr->added != 0xdeadbeef);
+ assert(psPtr->added != (int) 0xdeadbeef);
assert((psPtr->object == NULL) == (physPtrPtr != NULL));
assert(psPtr->object || patIndex == 0);
assert(psPtr->numPats > patIndex);
@@ -2578,7 +2581,7 @@ MatchPatterns(
: VirtPatIsBound(bindPtr, psPtr, object, physPtrPtr)) {
TkPattern *patPtr = psPtr->pats + patIndex;
- if (patPtr->eventType == curEvent->xev.type
+ if (patPtr->eventType == (unsigned) curEvent->xev.type
&& (curEvent->xev.type != CreateNotify
|| curEvent->xev.xcreatewindow.parent == window)
&& (!patPtr->name || patPtr->name == curEvent->detail.name)
@@ -2650,6 +2653,7 @@ MatchPatterns(
}
if (bestPhysPtr) {
+ assert(physPtrPtr);
*physPtrPtr = bestPhysPtr;
}
return bestPtr;
@@ -3201,7 +3205,7 @@ DeleteVirtualEventTable(
for (psPtr = Tcl_GetHashValue(hPtr); psPtr; psPtr = nextPtr) {
nextPtr = psPtr->nextSeqPtr;
- assert(psPtr->added != 0xdeadbeef);
+ assert(psPtr->added != (int) 0xdeadbeef);
DEBUG(psPtr->owned = false);
FreePatSeq(psPtr);
}
@@ -3267,7 +3271,7 @@ CreateVirtualEvent(
if (!(psPtr = FindSequence(interp, &vetPtr->lookupTables, NULL, eventString, true, false, NULL))) {
return false;
}
- assert(psPtr->added != 0xdeadbeef);
+ assert(psPtr->added != (int) 0xdeadbeef);
/*
* Find/create virtual event.
@@ -3363,7 +3367,7 @@ DeleteVirtualEvent(
for (iPhys = PhysOwned_Size(owned); --iPhys >= 0; ) {
PatSeq *psPtr = PhysOwned_Get(owned, iPhys);
- assert(psPtr->added != 0xdeadbeef);
+ assert(psPtr->added != (int) 0xdeadbeef);
if (!eventPSPtr || psPtr == eventPSPtr) {
VirtOwners *owners = psPtr->ptr.owners;
@@ -3390,8 +3394,7 @@ DeleteVirtualEvent(
} else {
/*
* Removed last reference to this physical event, so remove it
- * from physical->virtual map. And don't forget to remove it
- * from lookup tables.
+ * from lookup table.
*/
DEBUG(psPtr->owned = false);
RemovePatSeqFromLookup(&vetPtr->lookupTables, psPtr);
@@ -3409,7 +3412,7 @@ DeleteVirtualEvent(
* Just deleting this one physical event. Consolidate list of
* owned physical events and return.
*/
- if (iPhys < PhysOwned_Size(owned)) {
+ if ((unsigned) iPhys < PhysOwned_Size(owned)) {
PhysOwned_Set(owned, iPhys, lastElemPtr);
}
return TCL_OK;
@@ -3691,7 +3694,7 @@ HandleEventGenerate(
warp = 0;
pos = TCL_QUEUE_TAIL;
- for (i = 2; i < objc; i += 2) {
+ for (i = 2; i < (unsigned) objc; i += 2) {
Tcl_Obj *optionPtr, *valuePtr;
bool badOpt = false;
int index;
@@ -3731,7 +3734,7 @@ HandleEventGenerate(
if ((int) pos < -1) {
return TCL_ERROR;
}
- synch = (pos == -1);
+ synch = ((int) pos == -1);
break;
case EVENT_ABOVE:
if (!NameToWindow(interp, tkwin, valuePtr, &tkwin2)) {
diff --git a/generic/tkDList.h b/generic/tkDList.h
index 0510a2b..e4c34d2 100644
--- a/generic/tkDList.h
+++ b/generic/tkDList.h
@@ -317,11 +317,11 @@ LT##_Prev(struct ElemType *elem) \
} \
\
__TK_DLIST_UNUSED \
-static int \
+static unsigned \
LT##_Size(const struct LT *head) \
{ \
const struct ElemType *elem; \
- int size = 0; \
+ unsigned size = 0; \
assert(head); \
if ((elem = head->first)) { \
for ( ; elem != (void *) head; elem = elem->_dl_.next) { \
diff --git a/tests/bind.test b/tests/bind.test
index 8a135bd..3bba518 100644
--- a/tests/bind.test
+++ b/tests/bind.test
@@ -6145,10 +6145,11 @@ test bind-32.3 {should trigger best match of modifier states} -setup {
pack [frame .t.f]
focus -force .t.f
update
+ set x {}
} -body {
- bind .t.f <Alt-Control-Key-A> { set x "Alt-Control" }
- bind .t.f <Shift-Control-Key-A> { set x "Shift-Control" }
- bind .t.f <Shift-Key-A> { set x "Shift" }
+ bind .t.f <Alt-Control-Key-A> { lappend x "Alt-Control" }
+ bind .t.f <Shift-Control-Key-A> { lappend x "Shift-Control" }
+ bind .t.f <Shift-Key-A> { lappend x "Shift" }
event generate .t.f <Alt-Control-Key-A>
set x
} -cleanup {
@@ -6175,6 +6176,9 @@ test bind-32.5 {should trigger Quadruple-1} -setup {
set x {}
} -body {
bind .t.f <Quadruple-1> { set x "Quadruple" }
+ bind .t.f <Triple-1> { set x "Triple" }
+ bind .t.f <Double-1> { set x "Double" }
+ bind .t.f <1> { set x "Single" }
# Old implementation triggers "Double", but new implementation
# will trigger "Quadruple", the latter behavior conforms to other
# toolkits.
@@ -6206,8 +6210,8 @@ test bind-33.1 {prefer longest match} -setup {
update
set x {}
} -body {
- bind .t.f <a><1><1> { set x "a11" }
- bind .t.f <Double-1> { set x "Double" }
+ bind .t.f <a><1><1> { lappend x "a11" }
+ bind .t.f <Double-1> { lappend x "Double" }
event generate .t.f <a>
event generate .t.f <1>
event generate .t.f <1>
@@ -6221,8 +6225,8 @@ test bind-33.2 {don't prefer more specialized event} -setup {
update
set x {}
} -body {
- bind .t.f <Double-1> { set x "Double" }
- bind .t.f <1><1> { set x "11" }
+ bind .t.f <Double-1> { lappend x "Double" }
+ bind .t.f <1><1> { lappend x "11" }
event generate .t.f <1>
event generate .t.f <1>
set x
@@ -6231,7 +6235,24 @@ test bind-33.2 {don't prefer more specialized event} -setup {
# This test case shows that old implementation has an issue, because
# in my opinion it is expected that <Double-1> is matching, because
# this binding is more specialized. But new implementation will be
- # conform to old, and so "11" is the correct result.
+ # conform to old, and so "11" is the expected result.
+} -result {11}
+test bind-33.3 {don't prefer more specialized event} -setup {
+ pack [frame .t.f]
+ focus -force .t.f
+ update
+ set x {}
+} -body {
+ bind .t.f <1><1> { lappend x "11" }
+ bind .t.f <Double-1> { lappend x "Double" }
+ event generate .t.f <1> -time 0
+ event generate .t.f <1> -time 1000
+ set x
+} -cleanup {
+ destroy .t.f
+ # This test case also shows that old implementation has an issue, because
+ # here <1><1> will be triggered correctly, but this is not consistent with
+ # test case 33.2.
} -result {11}