From 93c5fdf107657e8f0041985743fe2918ef0cd394 Mon Sep 17 00:00:00 2001 From: dgp Date: Fri, 2 Jan 2015 20:17:39 +0000 Subject: The [winfo id] of a Tk window is meant to identify it. The actual value returned, though, has been a hex-formatted int value -- that is 32 bits. On OS X Cocoa, the actual Window or XID is not an int but an unsigned long, and does not fit in 32 bits. (What's really stored even seems to be a (MacDrawable *) -- a pointer -- definitely not something 32-bits can capture). Thus generating [winfo id] loses info, and breaks totally. Has for a long time apparently. There are even explicit comments in place plainly stating that it is broken and what needs doing to fix it. Updated the platform-specific routines Tkp(Scan|Print)WindowId() so that window id's are no longer lossy and broken in Cocoa Tk. --- macosx/tkMacOSXEmbed.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- macosx/tkMacOSXPort.h | 9 +-------- 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/macosx/tkMacOSXEmbed.c b/macosx/tkMacOSXEmbed.c index 17832c6..ef83276 100644 --- a/macosx/tkMacOSXEmbed.c +++ b/macosx/tkMacOSXEmbed.c @@ -174,6 +174,50 @@ TkpMakeWindow( /* *---------------------------------------------------------------------- * + * TkpScanWindowId -- + * + * Given a string, produce the corresponding Window Id. + * + * Results: + * The return value is normally TCL_OK; in this case *idPtr will be set + * to the Window value equivalent to string. If string is improperly + * formed then TCL_ERROR is returned and an error message will be left in + * the interp's result. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +int +TkpScanWindowId( + Tcl_Interp *interp, + CONST char * string, + Window *idPtr) +{ + int code; + Tcl_Obj obj; + + obj.refCount = 1; + obj.bytes = string; + obj.length = strlen(string); + obj.typePtr = NULL; + + code = Tcl_GetLongFromObj(interp, &obj, (long *)idPtr); + + if (obj.refCount > 1) { + Tcl_Panic("invalid sharing of Tcl_Obj on C stack"); + } + if (obj.typePtr && obj.typePtr->freeIntRepProc) { + obj.typePtr->freeIntRepProc(&obj); + } + return code; +} + +/* + *---------------------------------------------------------------------- + * * TkpUseWindow -- * * This procedure causes a Tk window to use a given X window as its @@ -214,7 +258,7 @@ TkpUseWindow( } /* - * Decode the container pointer, and look for it among the list of + * Decode the container window ID, and look for it among the list of * available containers. * * N.B. For now, we are limiting the containers to be in the same Tk @@ -222,7 +266,7 @@ TkpUseWindow( * containers. */ - if (Tcl_GetInt(interp, string, (int*) &parent) != TCL_OK) { + if (TkpScanWindowId(interp, string, (Window *)&parent) != TCL_OK) { return TCL_ERROR; } diff --git a/macosx/tkMacOSXPort.h b/macosx/tkMacOSXPort.h index 0a60cf6..6b56c83 100644 --- a/macosx/tkMacOSXPort.h +++ b/macosx/tkMacOSXPort.h @@ -162,14 +162,7 @@ */ #define TkpPrintWindowId(buf,w) \ - sprintf((buf), "0x%x", (unsigned int) (w)) - -/* - * TkpScanWindowId is just an alias for Tcl_GetInt on Unix. - */ - -#define TkpScanWindowId(i,s,wp) \ - Tcl_GetInt((i),(s),(int *) (wp)) + sprintf((buf), "0x%lx", (unsigned long) (w)) /* * Turn off Tk double-buffering as Aqua windows are already double-buffered. -- cgit v0.12 From 2f75423051e6eda811bcdfeadd4b5397d12baae2 Mon Sep 17 00:00:00 2001 From: dgp Date: Fri, 2 Jan 2015 20:18:52 +0000 Subject: remove old comment --- macosx/tkMacOSXPort.h | 1 - 1 file changed, 1 deletion(-) diff --git a/macosx/tkMacOSXPort.h b/macosx/tkMacOSXPort.h index 6b56c83..2ccbac3 100644 --- a/macosx/tkMacOSXPort.h +++ b/macosx/tkMacOSXPort.h @@ -158,7 +158,6 @@ /* * This macro stores a representation of the window handle in a string. - * This should perhaps use the real size of an XID. */ #define TkpPrintWindowId(buf,w) \ -- cgit v0.12 From 3fd4914af5da89ce545fe0857f34a460cf781c0b Mon Sep 17 00:00:00 2001 From: Kevin Walzer Date: Sun, 4 Jan 2015 23:22:29 +0000 Subject: Improved scrolling for text under Cocoa; thanks to Marc Culler for patch. --- generic/tkTextDisp.c | 34 ++++++++++++++++++++++++++++++++++ macosx/tkMacOSXDraw.c | 9 +++++---- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/generic/tkTextDisp.c b/generic/tkTextDisp.c index f16c45b..ac0b95a 100644 --- a/generic/tkTextDisp.c +++ b/generic/tkTextDisp.c @@ -3883,6 +3883,21 @@ TkTextUpdateOneLine( * *---------------------------------------------------------------------- */ +#ifdef MAC_OSX_TK +static void +RedisplayText( + ClientData clientData ) +{ + register TkText *textPtr = (TkText *) clientData; + TextDInfo *dInfoPtr = textPtr->dInfoPtr; + TkRegion damageRegion = TkCreateRegion(); + XRectangle rectangle = {0, 0, dInfoPtr->maxX, dInfoPtr->maxY}; + TkUnionRectWithRegion(&rectangle, damageRegion, damageRegion); + + TextInvalidateRegion(textPtr, damageRegion); + DisplayText(clientData); +} +#endif static void DisplayText( @@ -3897,6 +3912,9 @@ DisplayText( int bottomY = 0; /* Initialization needed only to stop compiler * warnings. */ Tcl_Interp *interp; +#ifdef MAC_OSX_TK + Tcl_TimerToken macRefreshTimer = NULL; +#endif if ((textPtr->tkwin == NULL) || (textPtr->flags & DESTROYED)) { /* @@ -4099,6 +4117,22 @@ DisplayText( oldY, dInfoPtr->maxX-dInfoPtr->x, height, 0, y-oldY, damageRgn)) { TextInvalidateRegion(textPtr, damageRgn); + +#ifdef MAC_OSX_TK + + /* + * On OS X large scrolls sometimes leave garbage on the screen. + * This attempts to clean it up by redisplaying the Text window + * after 200 milliseconds. + */ + if ( abs(y-oldY) > 14 ) { + Tcl_DeleteTimerHandler(macRefreshTimer); + macRefreshTimer = Tcl_CreateTimerHandler(200, + RedisplayText, + clientData); + } +#endif + } numCopies++; TkDestroyRegion(damageRgn); diff --git a/macosx/tkMacOSXDraw.c b/macosx/tkMacOSXDraw.c index d4b2c85..ecc6c0d 100644 --- a/macosx/tkMacOSXDraw.c +++ b/macosx/tkMacOSXDraw.c @@ -1531,10 +1531,11 @@ TkScrollWindow( } } } - - /* Redisplay the scrolled area. */ - [view displayRect:scrollDst]; - + + /* Redisplay the scrolled area; hide to reduce flicker after removal of private API calls. */ + [view setHidden:YES]; + [view displayRect:scrollDst]; + [view setHidden:NO]; } } -- cgit v0.12 From e63bab777eed65bb380173f6f4e62e2e802e5456 Mon Sep 17 00:00:00 2001 From: dgp Date: Wed, 7 Jan 2015 20:30:13 +0000 Subject: Reduce font-related porting fragility of test. --- tests/canvText.test | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/canvText.test b/tests/canvText.test index 20a39b0..7eef938 100644 --- a/tests/canvText.test +++ b/tests/canvText.test @@ -485,8 +485,8 @@ test canvText-17.1 {TextToPostscript procedure} { .c itemconfig test -font $font -text "00000000" -width [expr 3*$ax] .c itemconfig test -anchor n -fill black set x [.c postscript] - set x [string range $x [string first "/Courier-Oblique" $x] end] -} "/Courier-Oblique findfont [font actual $font -size] scalefont ISOEncode setfont + set x [string range $x [string first "findfont " $x] end] +} "findfont [font actual $font -size] scalefont ISOEncode setfont 0.000 0.000 0.000 setrgbcolor AdjustColor 100 200 \[ \[(000)\] -- cgit v0.12