summaryrefslogtreecommitdiffstats
path: root/macosx
diff options
context:
space:
mode:
authorKevin Walzer <kw@codebykevin.com>2014-08-11 03:12:28 (GMT)
committerKevin Walzer <kw@codebykevin.com>2014-08-11 03:12:28 (GMT)
commit57ad1cd7057d0a9bd8ba4ca1465a9bc44e5b20e4 (patch)
tree87f91103f38aec2b30084dfc2eda0816949e28a6 /macosx
parente5461d3f1d5d970bcb21ffd00bbf7e727618de6a (diff)
downloadtk-57ad1cd7057d0a9bd8ba4ca1465a9bc44e5b20e4.zip
tk-57ad1cd7057d0a9bd8ba4ca1465a9bc44e5b20e4.tar.gz
tk-57ad1cd7057d0a9bd8ba4ca1465a9bc44e5b20e4.tar.bz2
Further refinement of scrolling; addresses artifacts in scrolling complex interfaces on OS X
Diffstat (limited to 'macosx')
-rw-r--r--macosx/tkMacOSXDraw.c43
-rw-r--r--macosx/tkMacOSXSubwindows.c14
2 files changed, 45 insertions, 12 deletions
diff --git a/macosx/tkMacOSXDraw.c b/macosx/tkMacOSXDraw.c
index 40400c2..6631b4f 100644
--- a/macosx/tkMacOSXDraw.c
+++ b/macosx/tkMacOSXDraw.c
@@ -1460,12 +1460,12 @@ XMaxRequestSize(
* a damage region.
*
* Results:
- * Returns 0 if the scroll generated no additional damage.
+ * Returns 0 if the scroll genereated no additional damage.
* Otherwise, sets the region that needs to be repainted after
* scrolling and returns 1.
*
* Side effects:
- * Scrolls the rectangle in the window.
+ * Scrolls the bits in the window.
*
*----------------------------------------------------------------------
*/
@@ -1518,9 +1518,46 @@ TkScrollWindow(
/* Scroll the rectangle. */
[view scrollRect:NSRectFromCGRect(scroll_src) by:NSMakeSize(dx, -dy)];
[view displayRect:NSRectFromCGRect(scroll_dst)];
+
+ /*
+ * When a Text widget contains embedded images, scrolling generates
+ * lots of artifacts involving multiple copies of the images
+ * displayed on top of each other. Extensive experimentation, with
+ * very little help from the Apple documentation, indicates that
+ * whenever an image is displayed it gets added as a subview, which
+ * then gets automatically redisplayed in its original location.
+ *
+ * We do two things to combat this. First, each subview that meets
+ * the scroll area is added as a damage rectangle. Second, we
+ * redisplay the subviews after the scroll.
+ */
+
+ /*
+ * Step 1: Find any subviews that meet the scroll area and mark
+ * them as damaged. Use Tk coordinates, shifted to account for the
+ * future scrolling.
+ */
+
+ for (NSView *subview in [view subviews] ) {
+ NSRect frame = [subview frame];
+ CGRect subviewRect = CGRectMake(
+ frame.origin.x - macDraw->xOff + dx,
+ (bounds.size.height - frame.origin.y - frame.size.height) - macDraw->yOff + dy,
+ frame.size.width, frame.size.height);
+ /* Rectangles with negative coordinates seem to cause trouble. */
+ if (subviewRect.origin.y < 0 && subviewRect.origin.y + subviewRect.size.height > 0) {
+ subviewRect.origin.y = 0;
+ }
+ CGRect intersection = CGRectIntersection(srcRect, subviewRect);
+ if (! CGRectIsEmpty(intersection) ){
+ dstRgn = HIShapeCreateWithRect(&subviewRect);
+ ChkErr(HIShapeUnion, dmgRgn, dstRgn, (HIMutableShapeRef) dmgRgn);
+ CFRelease(dstRgn);
+ }
+ }
+
}
}
-
if ( dmgRgn == NULL ) {
diff --git a/macosx/tkMacOSXSubwindows.c b/macosx/tkMacOSXSubwindows.c
index e4af406..9ba7100 100644
--- a/macosx/tkMacOSXSubwindows.c
+++ b/macosx/tkMacOSXSubwindows.c
@@ -651,7 +651,7 @@ XConfigureWindow(
*
* TkMacOSXUpdateClipRgn --
*
- * This function updates the clipping regions for a given window and all of
+ * This function updates the cliping regions for a given window and all of
* its children. Once updated the TK_CLIP_INVALID flag in the subwindow
* data structure is unset. The TK_CLIP_INVALID flag should always be
* unset before any drawing is attempted.
@@ -677,7 +677,7 @@ TkMacOSXUpdateClipRgn(
macWin = winPtr->privatePtr;
if (macWin && macWin->flags & TK_CLIP_INVALID) {
TkWindow *win2Ptr;
-
+
#ifdef TK_MAC_DEBUG_CLIP_REGIONS
TkMacOSXDbgMsg("%s", winPtr->pathName);
#endif
@@ -818,7 +818,7 @@ TkMacOSXUpdateClipRgn(
*
* TkMacOSXVisableClipRgn --
*
- * This function returns the Macintosh clipping region for the given
+ * This function returns the Macintosh cliping region for the given
* window. The caller is responsible for disposing of the returned
* region via TkDestroyRegion().
*
@@ -913,7 +913,7 @@ TkMacOSXInvalidateWindow(
* TK_PARENT_WINDOW */
{
#ifdef TK_MAC_DEBUG_CLIP_REGIONS
- TkMacOSXDbgMsg("%s", macWin->winPtr->pathName);
+ TkMacOSXDbgMsg("%s", winPtr->pathName);
#endif
if (macWin->flags & TK_CLIP_INVALID) {
TkMacOSXUpdateClipRgn(macWin->winPtr);
@@ -1071,7 +1071,7 @@ TkMacOSXGetRootControl(
* None.
*
* Side effects:
- * The clipping regions for the window and its children are marked invalid.
+ * The cliping regions for the window and its children are mark invalid.
* (Make sure they are valid before drawing.)
*
*----------------------------------------------------------------------
@@ -1090,10 +1090,6 @@ TkMacOSXInvalClipRgns(
* be marked.
*/
-#ifdef TK_MAC_DEBUG_CLIP_REGIONS
- TkMacOSXDbgMsg("%s", winPtr->pathName);
-#endif
-
if (!macWin || macWin->flags & TK_CLIP_INVALID) {
return;
}