diff options
author | gcramer <remarcg@gmx.net> | 2018-10-23 10:48:24 (GMT) |
---|---|---|
committer | gcramer <remarcg@gmx.net> | 2018-10-23 10:48:24 (GMT) |
commit | 227ca7d6214feabba229a2f6e31587bb2513dd2d (patch) | |
tree | 841c9bcf9adbf195683a7bc416dcd1dddf7797f5 | |
parent | fc5bfbe78aecf4b5918f44178c4d493109c162e6 (diff) | |
download | tk-227ca7d6214feabba229a2f6e31587bb2513dd2d.zip tk-227ca7d6214feabba229a2f6e31587bb2513dd2d.tar.gz tk-227ca7d6214feabba229a2f6e31587bb2513dd2d.tar.bz2 |
(1) Some fixes for Windows. (2) Some minor corrections in test cases.
-rw-r--r-- | generic/tkArray.h | 35 | ||||
-rw-r--r-- | generic/tkBind.c | 73 | ||||
-rw-r--r-- | generic/tkDList.h | 4 | ||||
-rw-r--r-- | tests/bind.test | 37 |
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} |