18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2005 Apple Computer, 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 "HIWebView.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "CarbonWindowAdapter.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "HIViewAdapter.h" 355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#import "QuickDrawCompatibility.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebHTMLViewInternal.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKit.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKitSystemInterface.h> 395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#import <objc/objc-runtime.h> 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSWindow (AppKitSecretsHIWebViewKnows) 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_removeWindowRef; 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSView (AppKitSecretsHIWebViewKnows) 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_clearDirtyRectsForTree; 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern "C" void HIWebViewRegisterClass(); 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface MenuItemProxy : NSObject <NSValidatedUserInterfaceItem> 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int _tag; 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SEL _action; 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithAction:(SEL)action; 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (SEL)action; 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (int)tag; 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation MenuItemProxy 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithAction:(SEL)action 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super init]; 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (self == nil) return nil; 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _action = action; 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return self; 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (SEL)action 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return _action; 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (int)tag 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct HIWebView 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewRef fViewRef; 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* fWebView; 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView* fFirstResponder; 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CarbonWindowAdapter * fKitWindow; 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool fIsComposited; 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRunLoopObserverRef fUpdateObserver; 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef struct HIWebView HIWebView; 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const OSType NSAppKitPropertyCreator = 'akit'; 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThese constants are not used. Commented out to make the compiler happy. 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const OSType NSViewCarbonControlViewPropertyTag = 'view'; 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const OSType NSViewCarbonControlAutodisplayPropertyTag = 'autd'; 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const OSType NSViewCarbonControlFirstResponderViewPropertyTag = 'frvw'; 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const OSType NSCarbonWindowPropertyTag = 'win '; 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef BUILDING_ON_TIGER 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst int typeByteCount = typeSInt32; 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic SEL _NSSelectorForHICommand( const HICommand* hiCommand ); 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const EventTypeSpec kEvents[] = { 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassHIObject, kEventHIObjectConstruct }, 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassHIObject, kEventHIObjectDestruct }, 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassMouse, kEventMouseUp }, 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassMouse, kEventMouseMoved }, 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassMouse, kEventMouseDragged }, 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassMouse, kEventMouseWheelMoved }, 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassKeyboard, kEventRawKeyDown }, 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassKeyboard, kEventRawKeyRepeat }, 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassCommand, kEventCommandProcess }, 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassCommand, kEventCommandUpdateStatus }, 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassControl, kEventControlInitialize }, 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassControl, kEventControlDraw }, 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassControl, kEventControlHitTest }, 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassControl, kEventControlGetPartRegion }, 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassControl, kEventControlGetData }, 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassControl, kEventControlBoundsChanged }, 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassControl, kEventControlActivate }, 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassControl, kEventControlDeactivate }, 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassControl, kEventControlOwningWindowChanged }, 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassControl, kEventControlClick }, 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassControl, kEventControlContextualMenuClick }, 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassControl, kEventControlSetFocusPart } 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define kHIViewBaseClassID CFSTR( "com.apple.hiview" ) 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define kHIWebViewClassID CFSTR( "com.apple.HIWebView" ) 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic HIWebView* HIWebViewConstructor( HIViewRef inView ); 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void HIWebViewDestructor( HIWebView* view ); 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus HIWebViewEventHandler( 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventHandlerCallRef inCallRef, 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventRef inEvent, 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void * inUserData ); 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic UInt32 GetBehaviors(); 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic ControlKind GetKind(); 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void Draw( HIWebView* inView, RgnHandle limitRgn, CGContextRef inContext ); 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic ControlPartCode HitTest( HIWebView* view, const HIPoint* where ); 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus GetRegion( HIWebView* view, ControlPartCode inPart, RgnHandle outRgn ); 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void BoundsChanged( 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIWebView* inView, 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UInt32 inOptions, 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const HIRect* inOriginalBounds, 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const HIRect* inCurrentBounds ); 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void OwningWindowChanged( 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIWebView* view, 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowRef oldWindow, 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowRef newWindow ); 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void ActiveStateChanged( HIWebView* view ); 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus Click( HIWebView* inView, EventRef inEvent ); 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus ContextMenuClick( HIWebView* inView, EventRef inEvent ); 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus MouseUp( HIWebView* inView, EventRef inEvent ); 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus MouseMoved( HIWebView* inView, EventRef inEvent ); 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus MouseDragged( HIWebView* inView, EventRef inEvent ); 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus MouseWheelMoved( HIWebView* inView, EventRef inEvent ); 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus ProcessCommand( HIWebView* inView, const HICommand* inCommand ); 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus UpdateCommandStatus( HIWebView* inView, const HICommand* inCommand ); 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus SetFocusPart( 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIWebView* view, 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ControlPartCode desiredFocus, 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RgnHandle invalidRgn, 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Boolean focusEverything, 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ControlPartCode* actualFocus ); 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSView* AdvanceFocus( HIWebView* view, bool forward ); 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void RelinquishFocus( HIWebView* view, bool inAutodisplay ); 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic WindowRef GetWindowRef( HIWebView* inView ); 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void SyncFrame( HIWebView* inView ); 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus WindowHandler( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData ); 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void StartUpdateObserver( HIWebView* view ); 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void StopUpdateObserver( HIWebView* view ); 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void HIRectToQDRect( const HIRect* inRect, Rect* outRect ) 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project outRect->top = (SInt16)CGRectGetMinY( *inRect ); 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project outRect->left = (SInt16)CGRectGetMinX( *inRect ); 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project outRect->bottom = (SInt16)CGRectGetMaxY( *inRect ); 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project outRect->right = (SInt16)CGRectGetMaxX( *inRect ); 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HIWebViewCreate 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectOSStatus 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHIWebViewCreate(HIViewRef* outControl) 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIWebViewRegisterClass(); 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return HIObjectCreate(kHIWebViewClassID, NULL, (HIObjectRef*)outControl); 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HIWebViewGetWebView 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebView* 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHIWebViewGetWebView( HIViewRef inView ) 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIWebView* view = (HIWebView*)HIObjectDynamicCast( (HIObjectRef)inView, kHIWebViewClassID ); 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView* result = NULL; 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( view ) 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = view->fWebView; 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HIWebViewConstructor 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic HIWebView* 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHIWebViewConstructor( HIViewRef inView ) 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIWebView* view = (HIWebView*)malloc( sizeof( HIWebView ) ); 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( view ) 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSRect frame = { { 0, 0 }, { 400, 400 } }; 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->fViewRef = inView; 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebView *webView = [[WebView alloc] initWithFrame: frame]; 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRetain(webView); 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [webView release]; 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->fWebView = webView; 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [HIViewAdapter bindHIViewToNSView:inView nsView:view->fWebView]; 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->fFirstResponder = NULL; 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->fKitWindow = NULL; 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->fIsComposited = false; 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->fUpdateObserver = NULL; 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return view; 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HIWebViewDestructor 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHIWebViewDestructor( HIWebView* inView ) 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [HIViewAdapter unbindNSView:inView->fWebView]; 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRelease(inView->fWebView); 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project free(inView); 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HIWebViewRegisterClass 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHIWebViewRegisterClass() 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static bool sRegistered; 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( !sRegistered ) 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIObjectRegisterSubclass( kHIWebViewClassID, kHIViewBaseClassID, 0, HIWebViewEventHandler, 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventTypeCount( kEvents ), kEvents, 0, NULL ); 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sRegistered = true; 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// GetBehaviors 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic UInt32 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectGetBehaviors() 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return kControlSupportsDataAccess | kControlSupportsGetRegion | kControlGetsFocusOnClick; 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Draw 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectDraw( HIWebView* inView, RgnHandle limitRgn, CGContextRef inContext ) 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIRect bounds; 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Rect drawRect; 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIRect hiRect; 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool createdContext = false; 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!inView->fIsComposited) 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GrafPtr port; 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Rect portRect; 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetPort( &port ); 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetPortBounds( port, &portRect ); 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CreateCGContextForPort( port, &inContext ); 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SyncCGContextOriginWithPort( inContext, port ); 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CGContextTranslateCTM( inContext, 0, (portRect.bottom - portRect.top) ); 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CGContextScaleCTM( inContext, 1, -1 ); 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project createdContext = true; 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewGetBounds( inView->fViewRef, &bounds ); 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CGContextRef savedContext = WKNSWindowOverrideCGContext(inView->fKitWindow, inContext); 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [NSGraphicsContext setCurrentContext:[inView->fKitWindow graphicsContext]]; 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetRegionBounds( limitRgn, &drawRect ); 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( !inView->fIsComposited ) 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OffsetRect( &drawRect, (SInt16)-bounds.origin.x, (SInt16)-bounds.origin.y ); 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hiRect.origin.x = drawRect.left; 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hiRect.origin.y = bounds.size.height - drawRect.bottom; // flip y 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hiRect.size.width = drawRect.right - drawRect.left; 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hiRect.size.height = drawRect.bottom - drawRect.top; 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// printf( "Drawing: drawRect is (%g %g) (%g %g)\n", hiRect.origin.x, hiRect.origin.y, 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// hiRect.size.width, hiRect.size.height ); 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: We need to do layout before Carbon has decided what region needs drawn. 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // In Cocoa we make sure to do layout and invalidate any new regions before draw, so everything 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // can be drawn in one pass. Doing a layout here will cause new regions to be invalidated, but they 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // will not all be drawn in this pass since we already have a fixed rect we are going to display. 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView <WebDocumentView> *documentView = [[[inView->fWebView mainFrame] frameView] documentView]; 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([documentView isKindOfClass:[WebHTMLView class]]) 3545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen [(WebHTMLView *)documentView _web_updateLayoutAndStyleIfNeededRecursive]; 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( inView->fIsComposited ) 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [inView->fWebView displayIfNeededInRect: *(NSRect*)&hiRect]; 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [inView->fWebView displayRect:*(NSRect*)&hiRect]; 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WKNSWindowRestoreCGContext(inView->fKitWindow, savedContext); 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( !inView->fIsComposited ) 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewRef view; 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewFindByID( HIViewGetRoot( GetControlOwner( inView->fViewRef ) ), kHIViewWindowGrowBoxID, &view ); 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( view ) 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIRect frame; 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewGetBounds( view, &frame ); 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewConvertRect( &frame, view, NULL ); 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hiRect.origin.x = drawRect.left; 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hiRect.origin.y = drawRect.top; 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hiRect.size.width = drawRect.right - drawRect.left; 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hiRect.size.height = drawRect.bottom - drawRect.top; 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewConvertRect( &hiRect, inView->fViewRef, NULL ); 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( CGRectIntersectsRect( frame, hiRect ) ) 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewSetNeedsDisplay( view, true ); 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( createdContext ) 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CGContextSynchronize( inContext ); 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CGContextRelease( inContext ); 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HitTest 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic ControlPartCode 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHitTest( HIWebView* view, const HIPoint* where ) 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIRect bounds; 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewGetBounds( view->fViewRef, &bounds ); 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( CGRectContainsPoint( bounds, *where ) ) 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 1; 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return kControlNoPart; 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// GetRegion 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectGetRegion( 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIWebView* inView, 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ControlPartCode inPart, 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RgnHandle outRgn ) 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus err = eventNotHandledErr; 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( inPart == -3 ) // kControlOpaqueMetaPart: 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( [inView->fWebView isOpaque] ) 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIRect bounds; 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Rect temp; 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewGetBounds( inView->fViewRef, &bounds ); 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project temp.top = (SInt16)bounds.origin.y; 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project temp.left = (SInt16)bounds.origin.x; 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project temp.bottom = (SInt16)CGRectGetMaxY( bounds ); 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project temp.right = (SInt16)CGRectGetMaxX( bounds ); 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RectRgn( outRgn, &temp ); 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project err = noErr; 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return err; 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic WindowRef 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectGetWindowRef( HIWebView* inView ) 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return GetControlOwner( inView->fViewRef ); 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Click 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectClick(HIWebView* inView, EventRef inEvent) 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEvent *kitEvent = WKCreateNSEventWithCarbonClickEvent(inEvent, GetWindowRef(inView)); 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!inView->fIsComposited) 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project StartUpdateObserver(inView); 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [inView->fKitWindow sendEvent:kitEvent]; 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!inView->fIsComposited) 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project StopUpdateObserver(inView); 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [kitEvent release]; 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return noErr; 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// MouseUp 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMouseUp( HIWebView* inView, EventRef inEvent ) 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEvent* kitEvent = WKCreateNSEventWithCarbonEvent(inEvent); 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [inView->fKitWindow sendEvent:kitEvent]; 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [kitEvent release]; 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return noErr; 4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// MouseMoved 4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMouseMoved( HIWebView* inView, EventRef inEvent ) 4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEvent *kitEvent = WKCreateNSEventWithCarbonMouseMoveEvent(inEvent, inView->fKitWindow); 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [inView->fKitWindow sendEvent:kitEvent]; 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [kitEvent release]; 4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return noErr; 5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// MouseDragged 5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus 5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMouseDragged( HIWebView* inView, EventRef inEvent ) 5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEvent* kitEvent = WKCreateNSEventWithCarbonEvent(inEvent); 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [inView->fKitWindow sendEvent:kitEvent]; 5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [kitEvent release]; 5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return noErr; 5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// MouseDragged 5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus 5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMouseWheelMoved( HIWebView* inView, EventRef inEvent ) 5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEvent* kitEvent = WKCreateNSEventWithCarbonEvent(inEvent); 5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [inView->fKitWindow sendEvent:kitEvent]; 5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [kitEvent release]; 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return noErr; 5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ContextMenuClick 5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus 5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectContextMenuClick( HIWebView* inView, EventRef inEvent ) 5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView *webView = inView->fWebView; 5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSWindow *window = [webView window]; 5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Get the point out of the event. 5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIPoint point; 5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventParameter(inEvent, kEventParamMouseLocation, typeHIPoint, NULL, sizeof(point), NULL, &point); 5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewConvertPoint(&point, inView->fViewRef, NULL); 5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Flip the Y coordinate, since Carbon is flipped relative to the AppKit. 5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSPoint location = NSMakePoint(point.x, [window frame].size.height - point.y); 5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Make up an event with the point and send it to the window. 5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEvent *kitEvent = [NSEvent mouseEventWithType:NSRightMouseDown 5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project location:location 5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project modifierFlags:0 5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project timestamp:GetEventTime(inEvent) 5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project windowNumber:[window windowNumber] 5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project context:0 5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project eventNumber:0 5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clickCount:1 5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pressure:0]; 5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [inView->fKitWindow sendEvent:kitEvent]; 5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return noErr; 5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// GetKind 5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic ControlKind 5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectGetKind() 5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ControlKind kMyKind = { 'appl', 'wbvw' }; 5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return kMyKind; 5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// BoundsChanged 5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void 5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectBoundsChanged( 5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIWebView* inView, 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UInt32 inOptions, 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const HIRect* inOriginalBounds, 5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const HIRect* inCurrentBounds ) 5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( inView->fWebView ) 5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SyncFrame( inView ); 5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// OwningWindowChanged 5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void 6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectOwningWindowChanged( 6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIWebView* view, 6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowRef oldWindow, 6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowRef newWindow ) 6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( newWindow ){ 6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowAttributes attrs; 6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus err = GetWindowProperty(newWindow, NSAppKitPropertyCreator, NSCarbonWindowPropertyTag, sizeof(NSWindow *), NULL, &view->fKitWindow); 6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( err != noErr ) 6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const EventTypeSpec kWindowEvents[] = { 6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassWindow, kEventWindowClosed }, 6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassMouse, kEventMouseMoved }, 6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassMouse, kEventMouseUp }, 6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassMouse, kEventMouseDragged }, 6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassMouse, kEventMouseWheelMoved }, 6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassKeyboard, kEventRawKeyDown }, 6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassKeyboard, kEventRawKeyRepeat }, 6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassKeyboard, kEventRawKeyUp }, 6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassControl, kEventControlClick }, 6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->fKitWindow = [[CarbonWindowAdapter alloc] initWithCarbonWindowRef: newWindow takingOwnership: NO disableOrdering:NO carbon:YES]; 6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetWindowProperty(newWindow, NSAppKitPropertyCreator, NSCarbonWindowPropertyTag, sizeof(NSWindow *), &view->fKitWindow); 6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project InstallWindowEventHandler( newWindow, WindowHandler, GetEventTypeCount( kWindowEvents ), kWindowEvents, newWindow, NULL ); 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [[view->fKitWindow contentView] addSubview:view->fWebView]; 6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetWindowAttributes( newWindow, &attrs ); 6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->fIsComposited = ( ( attrs & kWindowCompositingAttribute ) != 0 ); 6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SyncFrame( view ); 6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Be sure to detach the cocoa view, too. 6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( view->fWebView ) 6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [view->fWebView removeFromSuperview]; 6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->fKitWindow = NULL; // break the ties that bind 6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//------------------------------------------------------------------------------------- 6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// WindowHandler 6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//------------------------------------------------------------------------------------- 6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Redirect mouse events to the views beneath them. This is required for WebKit to work 6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// properly. We install it once per window. We also tap into window close to release 6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the NSWindow that shadows our Carbon window. 6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus 6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWindowHandler( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData ) 6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowRef window = (WindowRef)inUserData; 6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus result = eventNotHandledErr; 6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch( GetEventClass( inEvent ) ) 6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventClassControl: 6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch( GetEventKind( inEvent ) ) 6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventControlClick: 6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CarbonWindowAdapter *kitWindow; 6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus err; 6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project err = GetWindowProperty( window, NSAppKitPropertyCreator, NSCarbonWindowPropertyTag, sizeof(NSWindow *), NULL, &kitWindow); 6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We must be outside the HIWebView, relinquish focus. 6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [kitWindow relinquishFocus]; 6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventClassKeyboard: 6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSWindow* kitWindow; 6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus err; 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEvent* kitEvent; 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // if the first responder in the kit window is something other than the 6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // window, we assume a subview of the webview is focused. we must send 6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the event to the window so that it goes through the kit's normal TSM 6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // logic, and -- more importantly -- allows any delegates associated 6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // with the first responder to have a chance at the event. 6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project err = GetWindowProperty( window, NSAppKitPropertyCreator, NSCarbonWindowPropertyTag, sizeof(NSWindow *), NULL, &kitWindow); 6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( err == noErr ) 6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSResponder* responder = [kitWindow firstResponder]; 6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( responder != kitWindow ) 6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project kitEvent = WKCreateNSEventWithCarbonEvent(inEvent); 6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [kitWindow sendEvent:kitEvent]; 7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [kitEvent release]; 7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = noErr; 7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventClassWindow: 7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSWindow* kitWindow; 7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus err; 7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project err = GetWindowProperty( window, NSAppKitPropertyCreator, NSCarbonWindowPropertyTag, sizeof(NSWindow *), NULL, &kitWindow); 7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( err == noErr ) 7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [kitWindow _removeWindowRef]; 7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [kitWindow close]; 7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = noErr; 7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventClassMouse: 7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (GetEventKind(inEvent)) 7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventMouseMoved: 7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Point where; 7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventParameter(inEvent, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &where); 7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowRef temp; 7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FindWindow(where, &temp); 7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (temp == window) 7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Rect bounds; 7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetWindowBounds(window, kWindowStructureRgn, &bounds); 7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project where.h -= bounds.left; 7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project where.v -= bounds.top; 7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetEventParameter(inEvent, kEventParamWindowRef, typeWindowRef, sizeof(WindowRef), &window); 7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetEventParameter(inEvent, kEventParamWindowMouseLocation, typeQDPoint, sizeof(Point), &where); 7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus err = noErr; 7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewRef view = NULL; 7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project err = HIViewGetViewForMouseEvent(HIViewGetRoot(window), inEvent, &view); 7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (err == noErr && view && HIObjectIsOfClass((HIObjectRef)view, kHIWebViewClassID)) 7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = SendEventToEventTargetWithOptions(inEvent, HIObjectGetEventTarget((HIObjectRef)view), kEventTargetDontPropagate); 7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventMouseUp: 7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventMouseDragged: 7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventMouseWheelMoved: 7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus err = noErr; 7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewRef view = NULL; 7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project err = HIViewGetViewForMouseEvent(HIViewGetRoot(window), inEvent, &view); 7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (err == noErr && view && HIObjectIsOfClass((HIObjectRef)view, kHIWebViewClassID)) 7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = SendEventToEventTargetWithOptions(inEvent, HIObjectGetEventTarget((HIObjectRef)view), kEventTargetDontPropagate); 7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// SyncFrame 7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void 7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSyncFrame( HIWebView* inView ) 7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewRef parent = HIViewGetSuperview( inView->fViewRef ); 7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( parent ) 7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( inView->fIsComposited ) 7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIRect frame; 7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIRect parentBounds; 7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSPoint origin; 7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewGetFrame( inView->fViewRef, &frame ); 7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewGetBounds( parent, &parentBounds ); 7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project origin.x = frame.origin.x; 7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project origin.y = parentBounds.size.height - CGRectGetMaxY( frame ); 7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// printf( "syncing to (%g %g) (%g %g)\n", origin.x, origin.y, 7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// frame.size.width, frame.size.height ); 7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [inView->fWebView setFrameOrigin: origin]; 7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [inView->fWebView setFrameSize: *(NSSize*)&frame.size]; 8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GrafPtr port = GetWindowPort( GetControlOwner( inView->fViewRef ) ); 8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PixMapHandle portPix = GetPortPixMap( port ); 8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Rect bounds; 8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIRect rootFrame; 8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIRect frame; 8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetControlBounds( inView->fViewRef, &bounds ); 8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OffsetRect( &bounds, -(**portPix).bounds.left, -(**portPix).bounds.top ); 8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// printf( "control lives at %d %d %d %d in window-coords\n", bounds.top, bounds.left, 8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// bounds.bottom, bounds.right ); 8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewGetFrame( HIViewGetRoot( GetControlOwner( inView->fViewRef ) ), &rootFrame ); 8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frame.origin.x = bounds.left; 8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frame.origin.y = rootFrame.size.height - bounds.bottom; 8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frame.size.width = bounds.right - bounds.left; 8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frame.size.height = bounds.bottom - bounds.top; 8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// printf( " before frame convert (%g %g) (%g %g)\n", frame.origin.x, frame.origin.y, 8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// frame.size.width, frame.size.height ); 8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [inView->fWebView convertRect:*(NSRect*)&frame fromView:nil]; 8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// printf( " moving web view to (%g %g) (%g %g)\n", frame.origin.x, frame.origin.y, 8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// frame.size.width, frame.size.height ); 8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [inView->fWebView setFrameOrigin: *(NSPoint*)&frame.origin]; 8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [inView->fWebView setFrameSize: *(NSSize*)&frame.size]; 8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// SetFocusPart 8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus 8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSetFocusPart( 8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIWebView* view, 8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ControlPartCode desiredFocus, 8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RgnHandle invalidRgn, 8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Boolean focusEverything, 8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ControlPartCode* actualFocus ) 8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView * freshlyMadeFirstResponderView; 8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SInt32 partCodeToReturn; 8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Do what Carbon is telling us to do. 8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( desiredFocus == kControlFocusNoPart ) 8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Relinquish the keyboard focus. 8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RelinquishFocus( view, true ); //(autodisplay ? YES : NO)); 8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project freshlyMadeFirstResponderView = nil; 8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project partCodeToReturn = kControlFocusNoPart; 8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project //NSLog(@"Relinquished the key focus because we have no choice."); 8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if ( desiredFocus == kControlFocusNextPart || desiredFocus == kControlFocusPrevPart ) 8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL goForward = (desiredFocus == kControlFocusNextPart ); 8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Advance the keyboard focus, maybe right off of this view. Maybe a subview of this one already has the keyboard focus, maybe not. 8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project freshlyMadeFirstResponderView = AdvanceFocus( view, goForward ); 8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (freshlyMadeFirstResponderView) 8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project partCodeToReturn = desiredFocus; 8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project partCodeToReturn = kControlFocusNoPart; 8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project //NSLog(freshlyMadeFirstResponderView ? @"Advanced the key focus." : @"Relinquished the key focus."); 8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // What's this? 8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (desiredFocus != kControlIndicatorPart) { 8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project check(false); 8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project freshlyMadeFirstResponderView = nil; 8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project partCodeToReturn = desiredFocus; 8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->fFirstResponder = freshlyMadeFirstResponderView; 8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *actualFocus = partCodeToReturn; 8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Done. 8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return noErr; 8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// AdvanceFocus 8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSView* 8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectAdvanceFocus( HIWebView* view, bool forward ) 8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSResponder* oldFirstResponder; 8988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView* currentKeyView; 8998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView* viewWeMadeFirstResponder; 9008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Focus on some part (subview) of this control (view). Maybe 9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // a subview of this one already has the keyboard focus, maybe not. 9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oldFirstResponder = [view->fKitWindow firstResponder]; 9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we tab out of our NSView, it will no longer be the responder 9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // when we get here. We'll try this trick for now. We might need to 9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // tag the view appropriately. 9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( view->fFirstResponder && ( (NSResponder*)view->fFirstResponder != oldFirstResponder ) ) 9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NULL; 9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( [oldFirstResponder isKindOfClass:[NSView class]] ) 9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView* tentativeNewKeyView; 9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Some view in this window already has the keyboard focus. It better at least be a subview of this one. 9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView* oldFirstResponderView = (NSView *)oldFirstResponder; 9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project check( [oldFirstResponderView isDescendantOf:view->fWebView] ); 9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( oldFirstResponderView != view->fFirstResponder 9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && ![oldFirstResponderView isDescendantOf:view->fFirstResponder] ) 9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Despite our efforts to record what view we made the first responder 9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // (for use in the next paragraph) we couldn't keep up because the user 9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // has clicked in a text field to make it the key focus, instead of using 9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the tab key. Find a control on which it's reasonable to invoke 9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // -[NSView nextValidKeyView], taking into account the fact that 9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // NSTextFields always pass on first-respondership to a temporarily- 9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // contained NSTextView. 9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView *viewBeingTested; 9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project currentKeyView = oldFirstResponderView; 9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project viewBeingTested = currentKeyView; 9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while ( viewBeingTested != view->fWebView ) 9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( [viewBeingTested isKindOfClass:[NSTextField class]] ) 9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project currentKeyView = viewBeingTested; 9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project viewBeingTested = [viewBeingTested superview]; 9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We recorded which view we made into the first responder the 9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // last time the user hit the tab key, and nothing has invalidated 9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // our recorded value since. 9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project currentKeyView = view->fFirstResponder; 9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Try to move on to the next or previous key view. We use the laboriously 9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // recorded/figured currentKeyView instead of just oldFirstResponder as the 9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // jumping-off-point when searching for the next valid key view. This is so 9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we don't get fooled if we recently made some view the first responder, but 9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // it passed on first-responder-ness to some temporary subview. 9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // You can't put normal views in a window with Carbon-control-wrapped views. 9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Stuff like this would break. M.P. Notice - 12/2/00 9678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project tentativeNewKeyView = forward ? [currentKeyView nextValidKeyView] : [currentKeyView previousValidKeyView]; 9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( tentativeNewKeyView && [tentativeNewKeyView isDescendantOf:view->fWebView] ) 9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 9718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The user has tabbed to another subview of this control view. Change the keyboard focus. 9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project //NSLog(@"Tabbed to the next or previous key view."); 9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [view->fKitWindow makeFirstResponder:tentativeNewKeyView]; 9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project viewWeMadeFirstResponder = tentativeNewKeyView; 9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The user has tabbed past the subviews of this control view. The window is the first responder now. 9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project //NSLog(@"Tabbed past the first or last key view."); 9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [view->fKitWindow makeFirstResponder:view->fKitWindow]; 9828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project viewWeMadeFirstResponder = nil; 9838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // No view in this window has the keyboard focus. This view should 9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // try to select one of its key subviews. We're not interested in 9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the subviews of sibling views here. 9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project //NSLog(@"No keyboard focus in window. Attempting to set..."); 9928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView *tentativeNewKeyView; 9948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project check(oldFirstResponder==fKitWindow); 9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( [view->fWebView acceptsFirstResponder] ) 9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project tentativeNewKeyView = view->fWebView; 9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project tentativeNewKeyView = [view->fWebView nextValidKeyView]; 9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( tentativeNewKeyView && [tentativeNewKeyView isDescendantOf:view->fWebView] ) 10008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This control view has at least one subview that can take the keyboard focus. 10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( !forward ) 10038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 10048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The user has tabbed into this control view backwards. Find 10058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // and select the last subview of this one that can take the 10068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // keyboard focus. Watch out for loops of valid key views. 10078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView *firstTentativeNewKeyView = tentativeNewKeyView; 10098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView *nextTentativeNewKeyView = [tentativeNewKeyView nextValidKeyView]; 10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while ( nextTentativeNewKeyView 10118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && [nextTentativeNewKeyView isDescendantOf:view->fWebView] 10128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && nextTentativeNewKeyView!=firstTentativeNewKeyView) 10138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project tentativeNewKeyView = nextTentativeNewKeyView; 10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project nextTentativeNewKeyView = [tentativeNewKeyView nextValidKeyView]; 10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Set the keyboard focus. 10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project //NSLog(@"Tabbed into the first or last key view."); 10228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [view->fKitWindow makeFirstResponder:tentativeNewKeyView]; 10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project viewWeMadeFirstResponder = tentativeNewKeyView; 10248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 10268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 10278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This control view has no subviews that can take the keyboard focus. 10288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project //NSLog(@"Can't tab into this view."); 10298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project viewWeMadeFirstResponder = nil; 10308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Done. 10348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return viewWeMadeFirstResponder; 10358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 10398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// RelinquishFocus 10408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 10428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void 10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRelinquishFocus( HIWebView* view, bool inAutodisplay ) 10448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSResponder* firstResponder; 10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Apparently Carbon thinks that some subview of this control view has the keyboard focus, 10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // or we wouldn't be being asked to relinquish focus. 10498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project firstResponder = [view->fKitWindow firstResponder]; 10518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( [firstResponder isKindOfClass:[NSView class]] ) 10528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 10538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Some subview of this control view really is the first responder right now. 10548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project check( [(NSView *)firstResponder isDescendantOf:view->fWebView] ); 10558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Make the window the first responder, so that no view is the key view. 10578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [view->fKitWindow makeFirstResponder:view->fKitWindow]; 10588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If this control is not allowed to do autodisplay, don't let 10608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // it autodisplay any just-changed focus rings or text on the 10618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // next go around the event loop. I'm probably clearing more 10628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // dirty rects than I have to, but it doesn't seem to hurt in 10638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the print panel accessory view case, and I don't have time 10648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // to figure out exactly what -[NSCell _setKeyboardFocusRingNeedsDisplay] 10658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // is doing when invoked indirectly from -makeFirstResponder up above. M.P. Notice - 12/4/00 10668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( !inAutodisplay ) 10688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [[view->fWebView opaqueAncestor] _clearDirtyRectsForTree]; 10698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 10718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 10728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The Cocoa first responder does not correspond to the Carbon 10738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // control that has the keyboard focus. This can happen when 10748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // you've closed a dialog by hitting return in an NSTextView 10758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // that's a subview of this one; Cocoa closed the window, and 10768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // now Carbon is telling this control to relinquish the focus 10778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // as it's being disposed. There's nothing to do. 10788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project check(firstResponder==window); 10808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 10848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ActiveStateChanged 10858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 10868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 10878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void 10888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectActiveStateChanged( HIWebView* view ) 10898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( [view->fWebView respondsToSelector:@selector(setEnabled)] ) 10918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 10928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [(NSControl*)view->fWebView setEnabled: IsControlEnabled( view->fViewRef )]; 10938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewSetNeedsDisplay( view->fViewRef, true ); 10948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 10998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ProcessCommand 11008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 11018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 11028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus 11038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectProcessCommand( HIWebView* inView, const HICommand* inCommand ) 11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus result = eventNotHandledErr; 11068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSResponder* resp; 11078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project resp = [inView->fKitWindow firstResponder]; 11098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( [resp isKindOfClass:[NSView class]] ) 11118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 11128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView* respView = (NSView*)resp; 11138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( respView == inView->fWebView 11158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project || [respView isDescendantOf: inView->fWebView] ) 11168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 11178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch ( inCommand->commandID ) 11188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 11198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kHICommandCut: 11208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kHICommandCopy: 11218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kHICommandPaste: 11228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kHICommandClear: 11238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kHICommandSelectAll: 11248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 11258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SEL selector = _NSSelectorForHICommand( inCommand ); 11268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( [respView respondsToSelector:selector] ) 11278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 11288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [respView performSelector:selector withObject:nil]; 11298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = noErr; 11308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 11338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 11388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 11418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// UpdateCommandStatus 11428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 11438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 11448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus 11458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectUpdateCommandStatus( HIWebView* inView, const HICommand* inCommand ) 11468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus result = eventNotHandledErr; 11488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MenuItemProxy* proxy = NULL; 11498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSResponder* resp; 11508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project resp = [inView->fKitWindow firstResponder]; 11528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( [resp isKindOfClass:[NSView class]] ) 11548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 11558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView* respView = (NSView*)resp; 11568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( respView == inView->fWebView 11588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project || [respView isDescendantOf: inView->fWebView] ) 11598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 11608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( inCommand->attributes & kHICommandFromMenu ) 11618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 11628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SEL selector = _NSSelectorForHICommand( inCommand ); 11638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( selector ) 11658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 11668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( [resp respondsToSelector: selector] ) 11678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 11688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project proxy = [[MenuItemProxy alloc] initWithAction: selector]; 11698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Can't use -performSelector:withObject: here because the method we're calling returns BOOL, while 11718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // -performSelector:withObject:'s return value is assumed to be an id. 11728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL (*validationFunction)(id, SEL, id) = (BOOL (*)(id, SEL, id))objc_msgSend; 11738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (validationFunction(resp, @selector(validateUserInterfaceItem:), proxy)) 11748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EnableMenuItem( inCommand->menu.menuRef, inCommand->menu.menuItemIndex ); 11758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 11768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DisableMenuItem( inCommand->menu.menuRef, inCommand->menu.menuItemIndex ); 11778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = noErr; 11798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( proxy ) 11868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [proxy release]; 11878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 11898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Blatantly stolen from AppKit and cropped a bit 11928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 11948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// _NSSelectorForHICommand 11958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//---------------------------------------------------------------------------------- 11968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 11978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic SEL 11988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project_NSSelectorForHICommand( const HICommand* inCommand ) 11998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch ( inCommand->commandID ) 12018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 12028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kHICommandUndo: return @selector(undo:); 12038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kHICommandRedo: return @selector(redo:); 12048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kHICommandCut : return @selector(cut:); 12058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kHICommandCopy : return @selector(copy:); 12068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kHICommandPaste: return @selector(paste:); 12078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kHICommandClear: return @selector(delete:); 12088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kHICommandSelectAll: return @selector(selectAll:); 12098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: return NULL; 12108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NULL; 12138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------- 12178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HIWebViewEventHandler 12188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------------- 12198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Our object's virtual event handler method. I'm not sure if we need this these days. 12208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// We used to do various things with it, but those days are long gone... 12218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// 12228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus 12238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHIWebViewEventHandler( 12248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventHandlerCallRef inCallRef, 12258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventRef inEvent, 12268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void * inUserData ) 12278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus result = eventNotHandledErr; 12298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIPoint where; 12308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSType tag; 12318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void * ptr; 12328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Size size; 12338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UInt32 features; 12348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RgnHandle region = NULL; 12358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ControlPartCode part; 12368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIWebView* view = (HIWebView*)inUserData; 12378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // [NSApp setWindowsNeedUpdate:YES] must be called before events so that ActivateTSMDocument is called to set an active document. 12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Without an active document, TSM will use a default document which uses a bottom-line input window which we don't want. 12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [NSApp setWindowsNeedUpdate:YES]; 12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch ( GetEventClass( inEvent ) ) 12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventClassHIObject: 12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch ( GetEventKind( inEvent ) ) 12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventHIObjectConstruct: 12488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 12498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIObjectRef object; 12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = GetEventParameter( inEvent, kEventParamHIObjectInstance, 12528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project typeHIObjectRef, NULL, sizeof( HIObjectRef ), NULL, &object ); 12538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project require_noerr( result, MissingParameter ); 12548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // on entry for our construct event, we're passed the 12568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // creation proc we registered with for this class. 12578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we use it now to create the instance, and then we 12588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // replace the instance parameter data with said instance 12598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // as type void. 12608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view = HIWebViewConstructor( (HIViewRef)object ); 12628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( view ) 12648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetEventParameter( inEvent, kEventParamHIObjectInstance, 12668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project typeVoidPtr, sizeof( void * ), &view ); 12678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 12708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventHIObjectDestruct: 12728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIWebViewDestructor( view ); 12738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // result is unimportant 12748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 12758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 12778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventClassKeyboard: 12798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 12808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEvent* kitEvent = WKCreateNSEventWithCarbonEvent(inEvent); 12818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [view->fKitWindow sendSuperEvent:kitEvent]; 12828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [kitEvent release]; 12838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = noErr; 12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 12868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventClassMouse: 12888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch ( GetEventKind( inEvent ) ) 12898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 12908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventMouseUp: 12918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = MouseUp( view, inEvent ); 12928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 12938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventMouseWheelMoved: 12958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = MouseWheelMoved( view, inEvent ); 12968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 12978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventMouseMoved: 12998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = MouseMoved( view, inEvent ); 13008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 13018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventMouseDragged: 13038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = MouseDragged( view, inEvent ); 13048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 13058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 13078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventClassCommand: 13098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 13108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HICommand command; 13118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = GetEventParameter( inEvent, kEventParamDirectObject, typeHICommand, NULL, 13138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sizeof( HICommand ), NULL, &command ); 13148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project require_noerr( result, MissingParameter ); 13158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch ( GetEventKind( inEvent ) ) 13178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 13188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventCommandProcess: 13198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = ProcessCommand( view, &command ); 13208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 13218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventCommandUpdateStatus: 13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = UpdateCommandStatus( view, &command ); 13248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 13288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventClassControl: 13308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch ( GetEventKind( inEvent ) ) 13318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 13328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventControlInitialize: 13338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project features = GetBehaviors(); 13348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetEventParameter( inEvent, kEventParamControlFeatures, typeUInt32, 13358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sizeof( UInt32 ), &features ); 13368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = noErr; 13378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 13388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventControlDraw: 13408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 13418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CGContextRef context = NULL; 13428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventParameter( inEvent, kEventParamRgnHandle, typeQDRgnHandle, NULL, 13448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sizeof( RgnHandle ), NULL, ®ion ); 13458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventParameter( inEvent, kEventParamCGContextRef, typeCGContextRef, NULL, 13468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sizeof( CGContextRef ), NULL, &context ); 13478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Draw( view, region, context ); 13498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = noErr; 13518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 13538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventControlHitTest: 13558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventParameter( inEvent, kEventParamMouseLocation, typeHIPoint, NULL, 13568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sizeof( HIPoint ), NULL, &where ); 13578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project part = HitTest( view, &where ); 13588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetEventParameter( inEvent, kEventParamControlPart, typeControlPartCode, sizeof( ControlPartCode ), &part ); 13598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = noErr; 13608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 13618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventControlGetPartRegion: 13638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventParameter( inEvent, kEventParamControlPart, typeControlPartCode, NULL, 13648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sizeof( ControlPartCode ), NULL, &part ); 13658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventParameter( inEvent, kEventParamControlRegion, typeQDRgnHandle, NULL, 13668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sizeof( RgnHandle ), NULL, ®ion ); 13678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = GetRegion( view, part, region ); 13688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 13698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventControlGetData: 13718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventParameter(inEvent, kEventParamControlPart, typeControlPartCode, NULL, sizeof(ControlPartCode), NULL, &part); 13728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventParameter(inEvent, kEventParamControlDataTag, typeEnumeration, NULL, sizeof(OSType), NULL, &tag); 13738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventParameter(inEvent, kEventParamControlDataBuffer, typePtr, NULL, sizeof(Ptr), NULL, &ptr); 13748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventParameter(inEvent, kEventParamControlDataBufferSize, typeByteCount, NULL, sizeof(Size), NULL, &size); 13758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (tag == kControlKindTag) { 13778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Size outSize; 13788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = noErr; 13798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ptr) { 13818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (size != sizeof(ControlKind)) 13828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = errDataSizeMismatch; 13838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 13848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (*(ControlKind *)ptr) = GetKind(); 13858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project outSize = sizeof(ControlKind); 13888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetEventParameter(inEvent, kEventParamControlDataBufferSize, typeByteCount, sizeof(Size), &outSize); 13898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 13928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventControlBoundsChanged: 13948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 13958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIRect prevRect, currRect; 13968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UInt32 attrs; 13978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventParameter( inEvent, kEventParamAttributes, typeUInt32, NULL, 13998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sizeof( UInt32 ), NULL, &attrs ); 14008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventParameter( inEvent, kEventParamOriginalBounds, typeHIRect, NULL, 14018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sizeof( HIRect ), NULL, &prevRect ); 14028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventParameter( inEvent, kEventParamCurrentBounds, typeHIRect, NULL, 14038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sizeof( HIRect ), NULL, &currRect ); 14048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BoundsChanged( view, attrs, &prevRect, &currRect ); 14068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = noErr; 14078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 14098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventControlActivate: 14118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ActiveStateChanged( view ); 14128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = noErr; 14138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 14148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventControlDeactivate: 14168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ActiveStateChanged( view ); 14178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = noErr; 14188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 14198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventControlOwningWindowChanged: 14218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 14228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowRef fromWindow, toWindow; 14238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = GetEventParameter( inEvent, kEventParamControlOriginalOwningWindow, typeWindowRef, NULL, 14258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sizeof( WindowRef ), NULL, &fromWindow ); 14268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project require_noerr( result, MissingParameter ); 14278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = GetEventParameter( inEvent, kEventParamControlCurrentOwningWindow, typeWindowRef, NULL, 14298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sizeof( WindowRef ), NULL, &toWindow ); 14308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project require_noerr( result, MissingParameter ); 14318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OwningWindowChanged( view, fromWindow, toWindow ); 14338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = noErr; 14358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 14378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventControlClick: 14398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = Click( view, inEvent ); 14408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 14418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventControlContextualMenuClick: 14438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = ContextMenuClick( view, inEvent ); 14448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 14458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventControlSetFocusPart: 14478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 14488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ControlPartCode desiredFocus; 14498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RgnHandle invalidRgn; 14508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Boolean focusEverything; 14518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ControlPartCode actualFocus; 14528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = GetEventParameter( inEvent, kEventParamControlPart, typeControlPartCode, NULL, 14548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sizeof( ControlPartCode ), NULL, &desiredFocus ); 14558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project require_noerr( result, MissingParameter ); 14568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventParameter( inEvent, kEventParamControlInvalRgn, typeQDRgnHandle, NULL, 14588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sizeof( RgnHandle ), NULL, &invalidRgn ); 14598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project focusEverything = false; // a good default in case the parameter doesn't exist 14618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventParameter( inEvent, kEventParamControlFocusEverything, typeBoolean, NULL, 14638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sizeof( Boolean ), NULL, &focusEverything ); 14648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = SetFocusPart( view, desiredFocus, invalidRgn, focusEverything, &actualFocus ); 14668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( result == noErr ) 14688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project verify_noerr( SetEventParameter( inEvent, kEventParamControlPart, typeControlPartCode, 14698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sizeof( ControlPartCode ), &actualFocus ) ); 14708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 14728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // some other kind of Control event 14748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 14758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 14768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 14788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // some other event class 14808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 14818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 14828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMissingParameter: 14858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 14868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void UpdateObserver(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info); 14908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void 14928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectStartUpdateObserver( HIWebView* view ) 14938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRunLoopObserverContext context; 14958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRunLoopObserverRef observer; 14968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRunLoopRef mainRunLoop; 14978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project check( view->fIsComposited == false ); 14998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project check( view->fUpdateObserver == NULL ); 15008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project context.version = 0; 15028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project context.info = view; 15038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project context.retain = NULL; 15048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project context.release = NULL; 15058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project context.copyDescription = NULL; 15068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mainRunLoop = (CFRunLoopRef)GetCFRunLoopFromEventLoop( GetMainEventLoop() ); 15088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project observer = CFRunLoopObserverCreate( NULL, kCFRunLoopEntry | kCFRunLoopBeforeWaiting, true, 0, UpdateObserver, &context ); 15098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRunLoopAddObserver( mainRunLoop, observer, kCFRunLoopCommonModes ); 15108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->fUpdateObserver = observer; 15128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// printf( "Update observer started\n" ); 15148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void 15178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectStopUpdateObserver( HIWebView* view ) 15188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project check( view->fIsComposited == false ); 15208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project check( view->fUpdateObserver != NULL ); 15218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRunLoopObserverInvalidate( view->fUpdateObserver ); 15238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRelease( view->fUpdateObserver ); 15248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view->fUpdateObserver = NULL; 15258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// printf( "Update observer removed\n" ); 15278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void 15308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectUpdateObserver( CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info ) 15318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIWebView* view = (HIWebView*)info; 15338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RgnHandle region = NewRgn(); 15348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// printf( "Update observer called\n" ); 15368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( region ) 15388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 15398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetWindowRegion( GetControlOwner( view->fViewRef ), kWindowUpdateRgn, region ); 15408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( !EmptyRgn( region ) ) 15428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 15438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RgnHandle ourRgn = NewRgn(); 15448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Rect rect; 15458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetWindowBounds( GetControlOwner( view->fViewRef ), kWindowStructureRgn, &rect ); 15478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// printf( "Update region is non-empty\n" ); 15498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ourRgn ) 15518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 15528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Rect rect; 15538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GrafPtr savePort, port; 15548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Point offset = { 0, 0 }; 15558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project port = GetWindowPort( GetControlOwner( view->fViewRef ) ); 15578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetPort( &savePort ); 15598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetPort( port ); 15608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GlobalToLocal( &offset ); 15628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OffsetRgn( region, offset.h, offset.v ); 15638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetControlBounds( view->fViewRef, &rect ); 15658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RectRgn( ourRgn, &rect ); 15668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// printf( "our control is at %d %d %d %d\n", 15688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// rect.top, rect.left, rect.bottom, rect.right ); 15698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetRegionBounds( region, &rect ); 15718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// printf( "region is at %d %d %d %d\n", 15728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// rect.top, rect.left, rect.bottom, rect.right ); 15738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SectRgn( ourRgn, region, ourRgn ); 15758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetRegionBounds( ourRgn, &rect ); 15778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// printf( "intersection is %d %d %d %d\n", 15788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// rect.top, rect.left, rect.bottom, rect.right ); 15798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( !EmptyRgn( ourRgn ) ) 15808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 15818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RgnHandle saveVis = NewRgn(); 15828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// printf( "looks like we should draw\n" ); 15848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( saveVis ) 15868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 15878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// RGBColor kRedColor = { 0xffff, 0, 0 }; 15888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetPortVisibleRegion( GetWindowPort( GetControlOwner( view->fViewRef ) ), saveVis ); 15908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetPortVisibleRegion( GetWindowPort( GetControlOwner( view->fViewRef ) ), ourRgn ); 15918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// RGBForeColor( &kRedColor ); 15938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// PaintRgn( ourRgn ); 15948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// QDFlushPortBuffer( port, NULL ); 15958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Delay( 15, NULL ); 15968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Draw1Control( view->fViewRef ); 15988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ValidWindowRgn( GetControlOwner( view->fViewRef ), ourRgn ); 15998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetPortVisibleRegion( GetWindowPort( GetControlOwner( view->fViewRef ) ), saveVis ); 16018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DisposeRgn( saveVis ); 16028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetPort( savePort ); 16068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DisposeRgn( ourRgn ); 16088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DisposeRgn( region ); 16128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1616