18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2005, 2007 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef __LP64__ 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "HIViewAdapter.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#import "QuickDrawCompatibility.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSObjectExtras.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <wtf/Assertions.h> 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void SetViewNeedsDisplay(HIViewRef inView, RgnHandle inRegion, Boolean inNeedsDisplay); 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WATCH_INVALIDATION 0 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSView(ShhhhDontTell) 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSRect)_dirtyRect; 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation HIViewAdapter 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic CFMutableDictionaryRef sViewMap; 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic IMP oldNSViewSetNeedsDisplayIMP; 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic IMP oldNSViewSetNeedsDisplayInRectIMP; 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic IMP oldNSViewNextValidKeyViewIMP; 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void _webkit_NSView_setNeedsDisplay(id self, SEL _cmd, BOOL flag); 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void _webkit_NSView_setNeedsDisplayInRect(id self, SEL _cmd, NSRect invalidRect); 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSView *_webkit_NSView_nextValidKeyView(id self, SEL _cmd); 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)bindHIViewToNSView:(HIViewRef)hiView nsView:(NSView*)nsView 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (sViewMap == NULL) { 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sViewMap = CFDictionaryCreateMutable(NULL, 0, NULL, NULL); 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Override -[NSView setNeedsDisplay:] 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Method setNeedsDisplayMethod = class_getInstanceMethod(objc_getClass("NSView"), @selector(setNeedsDisplay:)); 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(setNeedsDisplayMethod); 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!oldNSViewSetNeedsDisplayIMP); 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oldNSViewSetNeedsDisplayIMP = method_setImplementation(setNeedsDisplayMethod, (IMP)_webkit_NSView_setNeedsDisplay); 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Override -[NSView setNeedsDisplayInRect:] 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Method setNeedsDisplayInRectMethod = class_getInstanceMethod(objc_getClass("NSView"), @selector(setNeedsDisplayInRect:)); 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(setNeedsDisplayInRectMethod); 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!oldNSViewSetNeedsDisplayInRectIMP); 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oldNSViewSetNeedsDisplayInRectIMP = method_setImplementation(setNeedsDisplayInRectMethod, (IMP)_webkit_NSView_setNeedsDisplayInRect); 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Override -[NSView nextValidKeyView] 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Method nextValidKeyViewMethod = class_getInstanceMethod(objc_getClass("NSView"), @selector(nextValidKeyView)); 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(nextValidKeyViewMethod); 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!oldNSViewNextValidKeyViewIMP); 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oldNSViewNextValidKeyViewIMP = method_setImplementation(nextValidKeyViewMethod, (IMP)_webkit_NSView_nextValidKeyView); 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFDictionaryAddValue(sViewMap, nsView, hiView); 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (HIViewRef)getHIViewForNSView:(NSView*)inView 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return sViewMap ? (HIViewRef)CFDictionaryGetValue(sViewMap, inView) : NULL; 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)unbindNSView:(NSView*)inView 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFDictionaryRemoveValue(sViewMap, inView); 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void _webkit_NSView_setNeedsDisplay(id self, SEL _cmd, BOOL flag) 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oldNSViewSetNeedsDisplayIMP(self, _cmd, flag); 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!flag) { 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewRef hiView = NULL; 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSRect targetBounds = [self visibleRect]; 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSRect validRect = targetBounds; 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView *view = self; 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (view) { 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project targetBounds = [view visibleRect]; 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ((hiView = [HIViewAdapter getHIViewForNSView:view]) != NULL) 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project validRect = [view convertRect:validRect toView:[view superview]]; 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view = [view superview]; 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hiView) { 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Flip rect here and convert to region 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIRect rect; 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rect.origin.x = validRect.origin.x; 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rect.origin.y = targetBounds.size.height - NSMaxY(validRect); 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rect.size.height = validRect.size.height; 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rect.size.width = validRect.size.width; 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For now, call the region-based API. 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RgnHandle rgn = NewRgn(); 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (rgn) { 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Rect qdRect; 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project qdRect.top = (SInt16)rect.origin.y; 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project qdRect.left = (SInt16)rect.origin.x; 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project qdRect.bottom = CGRectGetMaxY(rect); 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project qdRect.right = CGRectGetMaxX(rect); 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RectRgn(rgn, &qdRect); 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetViewNeedsDisplay(hiView, rgn, false); 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DisposeRgn(rgn); 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void _webkit_NSView_setNeedsDisplayInRect(id self, SEL _cmd, NSRect invalidRect) 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project invalidRect = NSUnionRect(invalidRect, [self _dirtyRect]); 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oldNSViewSetNeedsDisplayInRectIMP(self, _cmd, invalidRect); 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!NSIsEmptyRect(invalidRect)) { 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewRef hiView = NULL; 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSRect targetBounds = [self bounds]; 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView *view = self; 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (view) { 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project targetBounds = [view bounds]; 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ((hiView = [HIViewAdapter getHIViewForNSView:view]) != NULL) 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project invalidRect = [view convertRect:invalidRect toView:[view superview]]; 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view = [view superview]; 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hiView) { 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (NSWidth(invalidRect) > 0 && NSHeight(invalidRect)) { 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Flip rect here and convert to region 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIRect rect; 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rect.origin.x = invalidRect.origin.x; 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rect.origin.y = targetBounds.size.height - NSMaxY(invalidRect); 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rect.size.height = invalidRect.size.height; 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rect.size.width = invalidRect.size.width; 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For now, call the region-based API. 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RgnHandle rgn = NewRgn(); 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (rgn) { 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Rect qdRect; 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project qdRect.top = (SInt16)rect.origin.y; 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project qdRect.left = (SInt16)rect.origin.x; 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project qdRect.bottom = CGRectGetMaxY(rect); 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project qdRect.right = CGRectGetMaxX(rect); 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RectRgn(rgn, &qdRect); 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetViewNeedsDisplay(hiView, rgn, true); 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DisposeRgn(rgn); 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [[self window] setViewsNeedDisplay:YES]; 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSView *_webkit_NSView_nextValidKeyView(id self, SEL _cmd) 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([HIViewAdapter getHIViewForNSView:self]) 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [[self window] contentView]; 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return oldNSViewNextValidKeyViewIMP(self, _cmd); 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void SetViewNeedsDisplay(HIViewRef inHIView, RgnHandle inRegion, Boolean inNeedsDisplay) 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowAttributes attrs; 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetWindowAttributes(GetControlOwner(inHIView), &attrs); 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (attrs & kWindowCompositingAttribute) { 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if WATCH_INVALIDATION 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Rect bounds; 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetRegionBounds(inRegion, &bounds); 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf("%s: rect on input %d %d %d %d\n", inNeedsDisplay ? "INVALIDATE" : "VALIDATE", 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bounds.top, bounds.left, bounds.bottom, bounds.right); 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewSetNeedsDisplayInRegion(inHIView, inRegion, inNeedsDisplay); 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Rect bounds, cntlBounds; 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GrafPtr port, savePort; 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Rect portBounds; 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if WATCH_INVALIDATION 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf("%s: rect on input %d %d %d %d\n", inNeedsDisplay ? "INVALIDATE" : "VALIDATE", 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bounds.top, bounds.left, bounds.bottom, bounds.right); 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetControlBounds(inHIView, &cntlBounds); 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if WATCH_INVALIDATION 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf("%s: control bounds are %d %d %d %d\n", inNeedsDisplay ? "INVALIDATE" : "VALIDATE", 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cntlBounds.top, cntlBounds.left, cntlBounds.bottom, cntlBounds.right); 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project port = GetWindowPort(GetControlOwner(inHIView)); 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetPort(&savePort); 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetPort(port); 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetPortBounds(port, &portBounds); 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetOrigin(0, 0); 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OffsetRgn(inRegion, cntlBounds.left, cntlBounds.top); 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetRegionBounds(inRegion, &bounds); 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if WATCH_INVALIDATION 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf("%s: rect in port coords %d %d %d %d\n", inNeedsDisplay ? "INVALIDATE" : "VALIDATE", 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bounds.top, bounds.left, bounds.bottom, bounds.right); 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (inNeedsDisplay) 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project InvalWindowRgn(GetControlOwner(inHIView), inRegion); 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ValidWindowRgn(GetControlOwner(inHIView), inRegion); 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetOrigin(portBounds.left, portBounds.top); 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetPort(savePort); 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 250