Update to tk 8.5.19
This commit is contained in:
@@ -6,6 +6,8 @@
|
||||
*
|
||||
* Copyright 2001-2009, Apple Inc.
|
||||
* Copyright (c) 2005-2009 Daniel A. Steffen <das@users.sourceforge.net>
|
||||
* Copyright (c) 2015 Kevin Walzer/WordTech Communications LLC.
|
||||
* Copyright (c) 2015 Marc Culler.
|
||||
*
|
||||
* See the file "license.terms" for information on usage and redistribution of
|
||||
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||
@@ -15,7 +17,7 @@
|
||||
#include "tkMacOSXWm.h"
|
||||
#include "tkMacOSXEvent.h"
|
||||
#include "tkMacOSXDebug.h"
|
||||
|
||||
|
||||
/*
|
||||
#ifdef TK_MAC_DEBUG
|
||||
#define TK_MAC_DEBUG_EVENTS
|
||||
@@ -27,7 +29,7 @@
|
||||
* Declaration of functions used only in this file
|
||||
*/
|
||||
|
||||
static int GenerateUpdates(HIMutableShapeRef updateRgn,
|
||||
static int GenerateUpdates(HIShapeRef updateRgn,
|
||||
CGRect *updateBounds, TkWindow *winPtr);
|
||||
static int GenerateActivateEvents(TkWindow *winPtr,
|
||||
int activeFlag);
|
||||
@@ -46,7 +48,7 @@ extern NSString *NSWindowDidOrderOffScreenNotification;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
extern NSString *opaqueTag;
|
||||
extern BOOL opaqueTag;
|
||||
|
||||
@implementation TKApplication(TKWindowEvent)
|
||||
|
||||
@@ -163,6 +165,10 @@ extern NSString *opaqueTag;
|
||||
|
||||
if (winPtr) {
|
||||
TkGenWMDestroyEvent((Tk_Window) winPtr);
|
||||
if (_windowWithMouse == w) {
|
||||
_windowWithMouse = nil;
|
||||
[w release];
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -314,7 +320,7 @@ extern NSString *opaqueTag;
|
||||
|
||||
static int
|
||||
GenerateUpdates(
|
||||
HIMutableShapeRef updateRgn,
|
||||
HIShapeRef updateRgn,
|
||||
CGRect *updateBounds,
|
||||
TkWindow *winPtr)
|
||||
{
|
||||
@@ -357,11 +363,12 @@ GenerateUpdates(
|
||||
event.xexpose.width = damageBounds.size.width;
|
||||
event.xexpose.height = damageBounds.size.height;
|
||||
event.xexpose.count = 0;
|
||||
Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
|
||||
#ifdef TK_MAC_DEBUG_DRAWING
|
||||
TKLog(@"Expose %p {{%d, %d}, {%d, %d}}", event.xany.window, event.xexpose.x,
|
||||
Tk_HandleEvent(&event);
|
||||
|
||||
#ifdef TK_MAC_DEBUG_DRAWING
|
||||
NSLog(@"Expose %p {{%d, %d}, {%d, %d}}", event.xany.window, event.xexpose.x,
|
||||
event.xexpose.y, event.xexpose.width, event.xexpose.height);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Generate updates for the children of this window
|
||||
@@ -388,7 +395,7 @@ GenerateUpdates(
|
||||
/*
|
||||
* TODO: Here we should handle out of process embedding.
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -744,15 +751,16 @@ TkWmProtocolEventProc(
|
||||
int
|
||||
Tk_MacOSXIsAppInFront(void)
|
||||
{
|
||||
OSStatus err;
|
||||
ProcessSerialNumber frontPsn, ourPsn = {0, kCurrentProcess};
|
||||
Boolean isFrontProcess = true;
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
|
||||
ProcessSerialNumber frontPsn, ourPsn = {0, kCurrentProcess};
|
||||
|
||||
err = ChkErr(GetFrontProcess, &frontPsn);
|
||||
if (err == noErr) {
|
||||
ChkErr(SameProcess, &frontPsn, &ourPsn, &isFrontProcess);
|
||||
if (noErr == GetFrontProcess(&frontPsn)){
|
||||
SameProcess(&frontPsn, &ourPsn, &isFrontProcess);
|
||||
}
|
||||
|
||||
#else
|
||||
isFrontProcess = [NSRunningApplication currentApplication].active;
|
||||
#endif
|
||||
return (isFrontProcess == true);
|
||||
}
|
||||
|
||||
@@ -761,27 +769,25 @@ Tk_MacOSXIsAppInFront(void)
|
||||
#import <ApplicationServices/ApplicationServices.h>
|
||||
|
||||
/*
|
||||
* Custom content view for Tk NSWindows, containing standard NSView subviews.
|
||||
* The goal is to emulate X11-style drawing in response to Expose events:
|
||||
* during the normal AppKit drawing cycle, we supress drawing of all subviews
|
||||
* (using a technique adapted from WebKit's WebHTMLView) and instead send
|
||||
* Expose events about the subviews that would be redrawn. Tk Expose event
|
||||
* handling and drawing handlers then draw the subviews manually via their
|
||||
* -displayRectIgnoringOpacity:
|
||||
* Custom content view for use in Tk NSWindows.
|
||||
*
|
||||
* Since Tk handles all drawing of widgets, we only use the AppKit event loop
|
||||
* as a source of input events. To do this, we overload the NSView drawRect
|
||||
* method with a method which generates Expose events for Tk but does no
|
||||
* drawing. The redrawing operations are then done when Tk processes these
|
||||
* events.
|
||||
*
|
||||
* Earlier versions of Mac Tk used subclasses of NSView, e.g. NSButton, as the
|
||||
* basis for Tk widgets. These would then appear as subviews of the
|
||||
* TKContentView. To prevent the AppKit from redrawing and corrupting the Tk
|
||||
* Widgets it was necessary to use Apple private API calls. In order to avoid
|
||||
* using private API calls, the NSView-based widgets have been replaced with
|
||||
* normal Tk widgets which draw themselves as native widgets by using the
|
||||
* HITheme API.
|
||||
*
|
||||
*/
|
||||
|
||||
@interface TKContentView(TKWindowEvent)
|
||||
- (void) drawRect: (NSRect) rect;
|
||||
- (void) generateExposeEvents: (HIMutableShapeRef) shape;
|
||||
- (BOOL) isOpaque;
|
||||
- (BOOL) wantsDefaultClipping;
|
||||
- (BOOL) acceptsFirstResponder;
|
||||
- (void) keyDown: (NSEvent *) theEvent;
|
||||
@end
|
||||
|
||||
@implementation TKContentView
|
||||
@end
|
||||
|
||||
/*Restrict event processing to Expose events.*/
|
||||
static Tk_RestrictAction
|
||||
ExposeRestrictProc(
|
||||
ClientData arg,
|
||||
@@ -791,14 +797,24 @@ ExposeRestrictProc(
|
||||
? TK_PROCESS_EVENT : TK_DEFER_EVENT);
|
||||
}
|
||||
|
||||
/*Restrict event processing to ConfigureNotify events.*/
|
||||
static Tk_RestrictAction
|
||||
ConfigureRestrictProc(
|
||||
ClientData arg,
|
||||
XEvent *eventPtr)
|
||||
{
|
||||
return (eventPtr->type==ConfigureNotify ? TK_PROCESS_EVENT : TK_DEFER_EVENT);
|
||||
}
|
||||
|
||||
@implementation TKContentView(TKWindowEvent)
|
||||
|
||||
- (void) drawRect: (NSRect) rect
|
||||
{
|
||||
const NSRect *rectsBeingDrawn;
|
||||
NSInteger rectsBeingDrawnCount;
|
||||
|
||||
|
||||
[self getRectsBeingDrawn:&rectsBeingDrawn count:&rectsBeingDrawnCount];
|
||||
|
||||
#ifdef TK_MAC_DEBUG_DRAWING
|
||||
TKLog(@"-[%@(%p) %s%@]", [self class], self, _cmd, NSStringFromRect(rect));
|
||||
[[NSColor colorWithDeviceRed:0.0 green:1.0 blue:0.0 alpha:.1] setFill];
|
||||
@@ -806,73 +822,140 @@ ExposeRestrictProc(
|
||||
NSCompositeSourceOver);
|
||||
#endif
|
||||
|
||||
NSWindow *w = [self window];
|
||||
|
||||
if ([self isOpaque] && [w showsResizeIndicator]) {
|
||||
NSRect bounds = [self convertRect:[w _growBoxRect] fromView:nil];
|
||||
|
||||
if ([self needsToDrawRect:bounds]) {
|
||||
NSEraseRect(bounds);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
CGFloat height = [self bounds].size.height;
|
||||
HIMutableShapeRef drawShape = HIShapeCreateMutable();
|
||||
|
||||
while (rectsBeingDrawnCount--) {
|
||||
CGRect r = NSRectToCGRect(*rectsBeingDrawn++);
|
||||
|
||||
r.origin.y = height - (r.origin.y + r.size.height);
|
||||
HIShapeUnionWithRect(drawShape, &r);
|
||||
}
|
||||
if (CFRunLoopGetMain() == CFRunLoopGetCurrent()) {
|
||||
[self generateExposeEvents:drawShape];
|
||||
[self generateExposeEvents:(HIShapeRef)drawShape];
|
||||
} else {
|
||||
[self performSelectorOnMainThread:@selector(generateExposeEvents:)
|
||||
withObject:(id)drawShape waitUntilDone:NO
|
||||
modes:[NSArray arrayWithObjects:NSRunLoopCommonModes,
|
||||
|
||||
NSEventTrackingRunLoopMode, NSModalPanelRunLoopMode,
|
||||
nil]];
|
||||
}
|
||||
|
||||
CFRelease(drawShape);
|
||||
|
||||
}
|
||||
|
||||
- (void) generateExposeEvents: (HIMutableShapeRef) shape
|
||||
-(void) setFrameSize: (NSSize)newsize
|
||||
{
|
||||
[super setFrameSize: newsize];
|
||||
if ([self inLiveResize]) {
|
||||
NSWindow *w = [self window];
|
||||
TkWindow *winPtr = TkMacOSXGetTkWindow(w);
|
||||
Tk_Window tkwin = (Tk_Window) winPtr;
|
||||
unsigned int width = (unsigned int)newsize.width;
|
||||
unsigned int height=(unsigned int)newsize.height;
|
||||
ClientData oldArg;
|
||||
Tk_RestrictProc *oldProc;
|
||||
|
||||
/* This can be called from outside the Tk event loop.
|
||||
* Since it calls Tcl_DoOneEvent, we need to make sure we
|
||||
* don't clobber the AutoreleasePool set up by the caller.
|
||||
*/
|
||||
[NSApp setPoolProtected:YES];
|
||||
|
||||
/*
|
||||
* Try to prevent flickers and flashes.
|
||||
*/
|
||||
[w disableFlushWindow];
|
||||
NSDisableScreenUpdates();
|
||||
|
||||
/* Disable Tk drawing until the window has been completely configured.*/
|
||||
TkMacOSXSetDrawingEnabled(winPtr, 0);
|
||||
|
||||
/* Generate and handle a ConfigureNotify event for the new size.*/
|
||||
TkGenWMConfigureEvent(tkwin, Tk_X(tkwin), Tk_Y(tkwin), width, height,
|
||||
TK_SIZE_CHANGED | TK_MACOSX_HANDLE_EVENT_IMMEDIATELY);
|
||||
oldProc = Tk_RestrictEvents(ConfigureRestrictProc, NULL, &oldArg);
|
||||
while (Tk_DoOneEvent(TK_X_EVENTS|TK_DONT_WAIT)) {}
|
||||
Tk_RestrictEvents(oldProc, oldArg, &oldArg);
|
||||
|
||||
/* Now that Tk has configured all subwindows we can create the clip regions. */
|
||||
TkMacOSXSetDrawingEnabled(winPtr, 1);
|
||||
TkMacOSXInvalClipRgns(tkwin);
|
||||
TkMacOSXUpdateClipRgn(winPtr);
|
||||
|
||||
/* Finally, generate and process expose events to redraw the window. */
|
||||
HIRect bounds = NSRectToCGRect([self bounds]);
|
||||
HIShapeRef shape = HIShapeCreateWithRect(&bounds);
|
||||
[self generateExposeEvents: shape];
|
||||
while (Tk_DoOneEvent(TK_ALL_EVENTS|TK_DONT_WAIT)) {}
|
||||
[w enableFlushWindow];
|
||||
[w flushWindowIfNeeded];
|
||||
NSEnableScreenUpdates();
|
||||
[NSApp setPoolProtected:NO];
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* As insurance against bugs that might cause layout glitches during a live
|
||||
* resize, we redraw the window one more time at the end of the resize
|
||||
* operation.
|
||||
*/
|
||||
|
||||
- (void)viewDidEndLiveResize
|
||||
{
|
||||
HIRect bounds = NSRectToCGRect([self bounds]);
|
||||
HIShapeRef shape = HIShapeCreateWithRect(&bounds);
|
||||
[super viewDidEndLiveResize];
|
||||
[self generateExposeEvents: shape];
|
||||
|
||||
}
|
||||
|
||||
/* Core method of this class: generates expose events for redrawing.
|
||||
* Whereas drawRect is intended to be called only from the Appkit event
|
||||
* loop, this can be called from Tk. If the Tcl_ServiceMode is set to
|
||||
* TCL_SERVICE_ALL then the expose events will be immediately removed
|
||||
* from the Tcl event loop and processed. Typically, they should be queued,
|
||||
* however.
|
||||
*/
|
||||
- (void) generateExposeEvents: (HIShapeRef) shape
|
||||
{
|
||||
[self generateExposeEvents:shape childrenOnly:0];
|
||||
}
|
||||
|
||||
- (void) generateExposeEvents: (HIShapeRef) shape
|
||||
childrenOnly: (int) childrenOnly
|
||||
{
|
||||
TkWindow *winPtr = TkMacOSXGetTkWindow([self window]);
|
||||
unsigned long serial;
|
||||
CGRect updateBounds;
|
||||
int updatesNeeded;
|
||||
|
||||
if (!winPtr) {
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Generate Tk Expose events. */
|
||||
HIShapeGetBounds(shape, &updateBounds);
|
||||
/* All of these events will share the same serial number. */
|
||||
serial = LastKnownRequestProcessed(Tk_Display(winPtr));
|
||||
if (GenerateUpdates(shape, &updateBounds, winPtr) &&
|
||||
![[NSRunLoop currentRunLoop] currentMode] &&
|
||||
Tcl_GetServiceMode() != TCL_SERVICE_NONE) {
|
||||
/*
|
||||
* Ensure there are no pending idle-time redraws that could prevent the
|
||||
* just posted Expose events from generating new redraws.
|
||||
*/
|
||||
|
||||
while (Tcl_DoOneEvent(TCL_IDLE_EVENTS|TCL_DONT_WAIT)) {}
|
||||
|
||||
/*
|
||||
* For smoother drawing, process Expose events and resulting redraws
|
||||
* immediately instead of at idle time.
|
||||
*/
|
||||
updatesNeeded = GenerateUpdates(shape, &updateBounds, winPtr);
|
||||
|
||||
/* Process the Expose events if the service mode is TCL_SERVICE_ALL */
|
||||
if (updatesNeeded && Tcl_GetServiceMode() == TCL_SERVICE_ALL) {
|
||||
ClientData oldArg;
|
||||
Tk_RestrictProc *oldProc = Tk_RestrictEvents(ExposeRestrictProc,
|
||||
UINT2PTR(serial), &oldArg);
|
||||
|
||||
while (Tcl_ServiceEvent(TCL_WINDOW_EVENTS)) {}
|
||||
Tk_RestrictEvents(oldProc, oldArg, &oldArg);
|
||||
while (Tcl_DoOneEvent(TCL_IDLE_EVENTS|TCL_DONT_WAIT)) {}
|
||||
Tk_RestrictProc *oldProc = Tk_RestrictEvents(ExposeRestrictProc,
|
||||
UINT2PTR(serial), &oldArg);
|
||||
while (Tcl_ServiceEvent(TCL_WINDOW_EVENTS)) {}
|
||||
Tk_RestrictEvents(oldProc, oldArg, &oldArg);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This is no-op on 10.7 and up because Apple has removed this widget,
|
||||
* but we are leaving it here for backwards compatibility.
|
||||
*/
|
||||
- (void) tkToolbarButton: (id) sender
|
||||
{
|
||||
#ifdef TK_MAC_DEBUG_EVENTS
|
||||
@@ -882,7 +965,6 @@ ExposeRestrictProc(
|
||||
int x, y;
|
||||
TkWindow *winPtr = TkMacOSXGetTkWindow([self window]);
|
||||
Tk_Window tkwin = (Tk_Window) winPtr;
|
||||
|
||||
bzero(&event, sizeof(XVirtualEvent));
|
||||
event.type = VirtualEvent;
|
||||
event.serial = LastKnownRequestProcessed(Tk_Display(tkwin));
|
||||
@@ -900,27 +982,11 @@ ExposeRestrictProc(
|
||||
Tk_QueueWindowEvent((XEvent *) &event, TCL_QUEUE_TAIL);
|
||||
}
|
||||
|
||||
#ifdef TK_MAC_DEBUG_DRAWING
|
||||
- (void) setFrameSize: (NSSize) newSize
|
||||
{
|
||||
TKLog(@"-[%@(%p) %s%@]", [self class], self, _cmd,
|
||||
NSStringFromSize(newSize));
|
||||
[super setFrameSize:newSize];
|
||||
}
|
||||
|
||||
- (void) setNeedsDisplayInRect: (NSRect) invalidRect
|
||||
{
|
||||
TKLog(@"-[%@(%p) %s%@]", [self class], self, _cmd,
|
||||
NSStringFromRect(invalidRect));
|
||||
[super setNeedsDisplayInRect:invalidRect];
|
||||
}
|
||||
#endif
|
||||
|
||||
- (BOOL) isOpaque
|
||||
{
|
||||
NSWindow *w = [self window];
|
||||
|
||||
if (opaqueTag != NULL) {
|
||||
if (opaqueTag) {
|
||||
return YES;
|
||||
} else {
|
||||
|
||||
@@ -946,153 +1012,6 @@ ExposeRestrictProc(
|
||||
#endif
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark TKContentViewPrivate
|
||||
|
||||
/*
|
||||
* Technique adapted from WebKit/WebKit/mac/WebView/WebHTMLView.mm to supress
|
||||
* normal AppKit subview drawing and make all drawing go through us.
|
||||
* Overrides NSView internals.
|
||||
*/
|
||||
|
||||
@interface TKContentView(TKContentViewPrivate)
|
||||
- (id) initWithFrame: (NSRect) frame;
|
||||
- (void) _setAsideSubviews;
|
||||
- (void) _restoreSubviews;
|
||||
@end
|
||||
|
||||
@interface NSView(TKContentViewPrivate)
|
||||
- (void) _recursiveDisplayRectIfNeededIgnoringOpacity: (NSRect) rect
|
||||
isVisibleRect: (BOOL) isVisibleRect
|
||||
rectIsVisibleRectForView: (NSView *) visibleView
|
||||
topView: (BOOL) topView;
|
||||
- (void) _recursiveDisplayAllDirtyWithLockFocus: (BOOL) needsLockFocus
|
||||
visRect: (NSRect) visRect;
|
||||
- (void) _recursive: (BOOL) recurse
|
||||
displayRectIgnoringOpacity: (NSRect) displayRect
|
||||
inContext: (NSGraphicsContext *) context topView: (BOOL) topView;
|
||||
- (void) _lightWeightRecursiveDisplayInRect: (NSRect) visRect;
|
||||
- (BOOL) _drawRectIfEmpty;
|
||||
- (void) _drawRect: (NSRect) inRect clip: (BOOL) clip;
|
||||
- (void) _setDrawsOwnDescendants: (BOOL) drawsOwnDescendants;
|
||||
@end
|
||||
|
||||
@implementation TKContentView(TKContentViewPrivate)
|
||||
|
||||
- (id) initWithFrame: (NSRect) frame
|
||||
{
|
||||
self = [super initWithFrame:frame];
|
||||
if (self) {
|
||||
_savedSubviews = nil;
|
||||
_subviewsSetAside = NO;
|
||||
[self _setDrawsOwnDescendants:YES];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) _setAsideSubviews
|
||||
{
|
||||
#ifdef TK_MAC_DEBUG
|
||||
if (_subviewsSetAside || _savedSubviews) {
|
||||
Tcl_Panic("TKContentView _setAsideSubviews called incorrectly");
|
||||
}
|
||||
#endif
|
||||
_savedSubviews = _subviews;
|
||||
_subviews = nil;
|
||||
_subviewsSetAside = YES;
|
||||
}
|
||||
|
||||
- (void) _restoreSubviews
|
||||
{
|
||||
#ifdef TK_MAC_DEBUG
|
||||
if (!_subviewsSetAside || _subviews) {
|
||||
Tcl_Panic("TKContentView _restoreSubviews called incorrectly");
|
||||
}
|
||||
#endif
|
||||
_subviews = _savedSubviews;
|
||||
_savedSubviews = nil;
|
||||
_subviewsSetAside = NO;
|
||||
}
|
||||
|
||||
- (void) _recursiveDisplayRectIfNeededIgnoringOpacity: (NSRect) rect
|
||||
isVisibleRect: (BOOL) isVisibleRect
|
||||
rectIsVisibleRectForView: (NSView *) visibleView
|
||||
topView: (BOOL) topView
|
||||
{
|
||||
[self _setAsideSubviews];
|
||||
[super _recursiveDisplayRectIfNeededIgnoringOpacity:rect
|
||||
isVisibleRect:isVisibleRect rectIsVisibleRectForView:visibleView
|
||||
topView:topView];
|
||||
[self _restoreSubviews];
|
||||
}
|
||||
|
||||
- (void) _recursiveDisplayAllDirtyWithLockFocus: (BOOL) needsLockFocus
|
||||
visRect: (NSRect) visRect
|
||||
{
|
||||
BOOL needToSetAsideSubviews = !_subviewsSetAside;
|
||||
|
||||
if (needToSetAsideSubviews) {
|
||||
[self _setAsideSubviews];
|
||||
}
|
||||
[super _recursiveDisplayAllDirtyWithLockFocus:needsLockFocus
|
||||
visRect:visRect];
|
||||
if (needToSetAsideSubviews) {
|
||||
[self _restoreSubviews];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) _recursive: (BOOL) recurse
|
||||
displayRectIgnoringOpacity: (NSRect) displayRect
|
||||
inContext: (NSGraphicsContext *) context topView: (BOOL) topView
|
||||
{
|
||||
[self _setAsideSubviews];
|
||||
[super _recursive:recurse
|
||||
displayRectIgnoringOpacity:displayRect inContext:context
|
||||
topView:topView];
|
||||
[self _restoreSubviews];
|
||||
}
|
||||
|
||||
- (void) _lightWeightRecursiveDisplayInRect: (NSRect) visRect
|
||||
{
|
||||
BOOL needToSetAsideSubviews = !_subviewsSetAside;
|
||||
|
||||
if (needToSetAsideSubviews) {
|
||||
[self _setAsideSubviews];
|
||||
}
|
||||
[super _lightWeightRecursiveDisplayInRect:visRect];
|
||||
if (needToSetAsideSubviews) {
|
||||
[self _restoreSubviews];
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL) _drawRectIfEmpty
|
||||
{
|
||||
/*
|
||||
* Our -drawRect manages subview drawing directly, so it needs to be called
|
||||
* even if the area to be redrawn is completely obscured by subviews.
|
||||
*/
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void) _drawRect: (NSRect) inRect clip: (BOOL) clip
|
||||
{
|
||||
#ifdef TK_MAC_DEBUG_DRAWING
|
||||
TKLog(@"-[%@(%p) %s%@]", [self class], self, _cmd,
|
||||
NSStringFromRect(inRect));
|
||||
#endif
|
||||
BOOL subviewsWereSetAside = _subviewsSetAside;
|
||||
|
||||
if (subviewsWereSetAside) {
|
||||
[self _restoreSubviews];
|
||||
}
|
||||
[super _drawRect:inRect clip:clip];
|
||||
if (subviewsWereSetAside) {
|
||||
[self _setAsideSubviews];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user