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// I don't think this class belongs in WebKit. Lets move it out. 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Things that I've never bothered working out: 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// For non-sheet windows, handle Carbon WindowMove events so as to do the same things as -[NSWindow _windowMoved]. 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Check to see how this stuff deals with various screen size change scenarious. 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// M.P. Warning - 9/17/01 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There are some invariants I'm maintaining for objects of this class which have been successfully initialized but not deallocated. These all make it easier to not override every single method of NSWindow. 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// _auxiliaryStorage->auxWFlags.hasShadow will always be false if the Carbon window has a kWindowNoShadowAttribute, and vice versa. 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// _auxiliaryStorage->_auxWFlags.minimized will always reflect the window's Carbon collapsed state. 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// _borderView will always point to an NSCarbonWindowFrame. 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// _contentView will always point to an NSCarbonWindowContentView; 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// _frame will always reflect the window's Carbon kWindowStructureRgn bounds. 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// _styleMask will always have _NSCarbonWindowMask set, and will have NSClosableWindowMask, NSMiniaturizableWindowMask, NSResizableWindowMask, and/or NSTitledWindowMask set as appropriate. 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// _wflags.oneShot and _wflags.delayedOneShot will always be false. 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// _wFlags.visible will always reflect the window's Carbon visibility. 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// _windowNum will always be greater than zero, and valid. 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// The instance variables involved are ones that came to my attention during the initial writing of this class; I haven't methodically gone through NSWindow's ivar list or anything like that. M.P. Notice - 10/10/00 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Things that have to be worked on if NSCarbonWindows are ever used for something other than dialogs and sheets: 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Clicking on an NSCarbonWindow while a Cocoa app-modal dialog is shown does not beep, as it should [old bug, maybe fixed now]. 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Handling of mouse clicks or key presses for any window control (close, miniaturize, zoom) might not be all there. 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Handling of miniaturization of Carbon windows via title bar double-click might not be all there. 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// The background on NSCarbonWindowTester's sample window (not sample dialog or sample sheet) might be wrong. 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// The controls on NSCarbonWindowTester's sample window look inactive when the window is inactive, but have first-click behavior. 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// M.P. Warning - 12/14/00 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Some things would have to be made public if someone wanted to subclass this so as to support more menu item commands. M.P. Warning - 9/19/00 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef __LP64__ 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "CarbonWindowAdapter.h" 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "CarbonWindowFrame.h" 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "CarbonWindowContentView.h" 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "HIViewAdapter.h" 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKitSystemInterface.h> 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <AppKit/AppKit.h> 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//#import <CoreGraphics/CGSWindow.h> 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <HIToolbox/CarbonEvents.h> 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <HIToolbox/Controls.h> 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <HIToolbox/HIView.h> 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <assert.h> 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/WebCoreObjCExtras.h> 76635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <runtime/InitializeThreading.h> 7721939df44de1705786c545cd1bf519d47250322dBen Murdoch#import <wtf/Threading.h> 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitLogging.h" 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSObjectExtras.h" 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebTypesInternal.h" 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSWindow(HIWebFrameView) 84967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (id)_initContent:(const NSRect *)contentRect styleMask:(unsigned int)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag contentView:aView; 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_oldPlaceWindow:(NSRect)frameRect; 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_windowMovedToRect:(NSRect)actualFrame; 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setWindowNumber:(NSInteger)nativeWindow; 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSGraphicsContext *)_threadContext; 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setFrame:(NSRect)newWindowFrameRect; 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setVisible:(BOOL)flag; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSApplication(HIWebFrameView) 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setIsActive:(BOOL)aFlag; 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)_setMouseActivationInProgress:(BOOL)flag; 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_handleKeyEquivalent:(NSEvent*)theEvent; 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSInputContext 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)processInputKeyBindings:(NSEvent *)event; 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Forward declarations. 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus NSCarbonWindowHandleEvent(EventHandlerCallRef inEventHandlerCallRef, EventRef inEventRef, void *inUserData); 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation CarbonWindowAdapter 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Return an appropriate window frame class. 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (Class)frameViewClassForStyleMask:(unsigned int)style { 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // There's only one appropriate window style, and only one appropriate window frame class. 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project assert(style & WKCarbonWindowMask()); 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [CarbonWindowFrame class]; 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Overriding of the parent class' designated initializer, just for safety's sake. 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)style backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag { 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Do the standard Cocoa thing. 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project self = [super initWithContentRect:contentRect styleMask:style backing:bufferingType defer:flag]; 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (self==nil) return nil; 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Simple. 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _windowRef = NULL; 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _windowRefIsOwned = NO; 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _eventHandler = NULL; 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Done. 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return self; 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Given a reference to a Carbon window that is to be encapsulated, an indicator of whether or not this object should take responsibility for disposing of the Carbon window, and an indicator of whether to disable Carbon window ordering, initialize. This is the class' designated initializer. 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithCarbonWindowRef:(WindowRef)inWindowRef takingOwnership:(BOOL)inWindowRefIsOwned disableOrdering:(BOOL)inDisableOrdering carbon:(BOOL)inCarbon { 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSBackingStoreType backingStoreType; 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CarbonWindowContentView *carbonWindowContentView; 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSWindow *windowAsProperty; 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus osStatus; 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UInt32 windowFeatures; 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowAttributes windowAttributes; 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned int styleMask; 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void *nativeWindow; 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowModality windowModality; 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ControlRef contentView; 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Simple. 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // It's very weak to have to put this before the invocation of [super initWithContentRect:...], but -setContentView: is invoked from within that initializer. It turns out that the common admonition about not calling virtual functions from within C++ constructors makes sense in Objective-C too. M.P. Notice - 10/10/00 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _windowRef = inWindowRef; 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project //_auxiliaryStorage->_windowRef = inWindowRef; 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _windowRefIsOwned = inWindowRefIsOwned; 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _carbon = inCarbon; 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Find out the window's CoreGraphics window reference. 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project nativeWindow = WKGetNativeWindowFromWindowRef(inWindowRef); 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Find out the window's Carbon window attributes. 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetWindowAttributes(inWindowRef, &windowAttributes); 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Find out the window's Carbon window features. 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetWindowFeatures(inWindowRef, &windowFeatures); 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Figure out the window's backing store type. 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // At one time, this had code stolen from CreatePlatformWindow in HIToolbox/Windows/Platform/CGSPlatform.c 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // But now the non-retained window class is a Carbon secret that's not even in 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // WindowsPriv.h; maybe we'll have to revisit this if someone needs to use WebKit 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // in a non-retained window. 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project backingStoreType = NSBackingStoreRetained; 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Figure out the window's style mask. 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project styleMask = WKCarbonWindowMask(); 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (windowAttributes & kWindowCloseBoxAttribute) styleMask |= NSClosableWindowMask; 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (windowAttributes & kWindowResizableAttribute) styleMask |= NSResizableWindowMask; 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (windowFeatures & kWindowCanCollapse) styleMask |= NSMiniaturizableWindowMask; 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (windowFeatures & kWindowHasTitleBar) styleMask |= NSTitledWindowMask; 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = GetWindowModality(_windowRef, &windowModality, NULL); 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus != noErr) { 1822bde8e466a4451c7319e3a072d118917957d6554Steve Block NSLog(@"Couldn't get window modality: error=%ld", osStatus); 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Create one of our special content views. 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project carbonWindowContentView = [[[CarbonWindowContentView alloc] init] autorelease]; 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Do some standard Cocoa initialization. The defer argument's value is YES because we don't want -[NSWindow _commonAwake] to get called. It doesn't appear that any relevant NSWindow code checks _wFlags.deferred, so we should be able to get away with the lie. 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project self = (CarbonWindowAdapter*)[super _initContent:NULL styleMask:styleMask backing:backingStoreType defer:YES contentView:carbonWindowContentView]; 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!self) return nil; 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project assert(_contentView); 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Record accurately whether or not this window has a shadow, in case someone asks. 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // _auxiliaryStorage->_auxWFlags.hasShadow = (windowAttributes & kWindowNoShadowAttribute) ? NO : YES; 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Record the window number. 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _setWindowNumber:(NSInteger)nativeWindow]; 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Set up from the frame rectangle. 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We didn't even really try to get it right at _initContent:... time, because it's more trouble that it's worth to write a real +[NSCarbonWindow frameRectForContentRect:styleMask:]. M.P. Notice - 10/10/00 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self reconcileToCarbonWindowBounds]; 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Install an event handler for the Carbon window events in which we're interested. 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const EventTypeSpec kEvents[] = { 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassWindow, kEventWindowActivated }, 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassWindow, kEventWindowDeactivated }, 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassWindow, kEventWindowBoundsChanged }, 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassWindow, kEventWindowShown }, 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { kEventClassWindow, kEventWindowHidden } 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const EventTypeSpec kControlBoundsChangedEvent = { kEventClassControl, kEventControlBoundsChanged }; 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = InstallEventHandler( GetWindowEventTarget(_windowRef), NSCarbonWindowHandleEvent, GetEventTypeCount( kEvents ), kEvents, (void*)self, &_eventHandler); 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus!=noErr) { 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self release]; 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = InstallEventHandler( GetControlEventTarget( HIViewGetRoot( _windowRef ) ), NSCarbonWindowHandleEvent, 1, &kControlBoundsChangedEvent, (void*)self, &_eventHandler); 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus!=noErr) { 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self release]; 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewFindByID( HIViewGetRoot( _windowRef ), kHIViewWindowContentID, &contentView ); 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = InstallEventHandler( GetControlEventTarget( contentView ), NSCarbonWindowHandleEvent, 1, &kControlBoundsChangedEvent, (void*)self, &_eventHandler); 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus!=noErr) { 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self release]; 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Put a pointer to this Cocoa NSWindow in a Carbon window property tag. 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Right now, this is just used by NSViewCarbonControl. M.P. Notice - 10/9/00 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project windowAsProperty = self; 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = SetWindowProperty(_windowRef, WKCarbonWindowPropertyCreator(), WKCarbonWindowPropertyTag(), sizeof(NSWindow *), &windowAsProperty); 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus!=noErr) { 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self release]; 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Ignore the Carbon window activation/deactivation events that Carbon sends to its windows at app activation/deactivation. We'll send such events when we think it's appropriate. 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _passingCarbonWindowActivationEvents = NO; 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Be sure to sync up visibility 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _setVisible:(BOOL)IsWindowVisible( _windowRef )]; 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Done. 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return self; 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setViewsNeedDisplay:(BOOL)wellDoThey { 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Make sure we can flush anything that needs it. 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We need to sync the context here. I was hoping I didn't need to do this, 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // but apparently when scrolling, the AppKit view system draws directly. 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // When this occurs, I cannot intercept it to make it draw in my HIView 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // context. What ends up happening is that it draws, but nothing ever 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // flushes it. 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( [self windowNumber] != -1 ) 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CGContextRef cgContext = (CGContextRef)[[self _threadContext] graphicsPort]; 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CGContextSynchronize( cgContext ); 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)initialize 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 272635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project JSC::initializeThreading(); 27321939df44de1705786c545cd1bf519d47250322dBen Murdoch WTF::initializeMainThreadToProcessMainThread(); 274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef BUILDING_ON_TIGER 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCoreObjCFinalizeOnMainThread(self); 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 277635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Given a reference to a Carbon window that is to be encapsulated, and an indicator of whether or not this object should take responsibility for disposing of the Carbon window, initialize. 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithCarbonWindowRef:(WindowRef)inWindowRef takingOwnership:(BOOL)inWindowRefIsOwned { 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // for now, set disableOrdering to YES because that is what we've been doing and is therefore lower risk. However, I think it would be correct to set it to NO. 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [self initWithCarbonWindowRef:inWindowRef takingOwnership:inWindowRefIsOwned disableOrdering:YES carbon:NO]; 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Clean up. 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)dealloc { 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (WebCoreObjCScheduleDeallocateOnMainThread([CarbonWindowAdapter class], self)) 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Clean up, if necessary. 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // if we didn't remove the event handler at dealloc time, we would risk getting sent events after the window has been deallocated. See 2702179. M.P. Notice - 6/1/01 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (_eventHandler) RemoveEventHandler(_eventHandler); 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Do the standard Cocoa thing. 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super dealloc]; 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)finalize { 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_MAIN_THREAD(); 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (_eventHandler) RemoveEventHandler(_eventHandler); 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super finalize]; 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WindowRef)windowRef { 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Simple. 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return _windowRef; 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// should always be YES, but check in order to avoid initialization or deallocation surprises 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_hasWindowRef { 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return (_windowRef != NULL); 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// an NSCarbonWindow does not manage the windowRef. The windowRef manages the NSCarbonWindow 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_managesWindowRef { 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NO; 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_removeWindowRef { 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _windowRef = NULL; 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (_eventHandler) RemoveEventHandler(_eventHandler); 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _eventHandler = NULL; 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WindowClass)_carbonWindowClass { 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowClass windowClass = kDocumentWindowClass; 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus osStatus; 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([self _hasWindowRef]) { 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = GetWindowClass([self windowRef], &windowClass); 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus != noErr) { 3372bde8e466a4451c7319e3a072d118917957d6554Steve Block NSLog(@"Couldn't get window class: error=%ld", osStatus); 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return windowClass; 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Update this window's frame and content frame rectangles to match the Carbon window's structure bounds and content bounds rectangles. Return yes if the update was really necessary, no otherwise. 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)reconcileToCarbonWindowBounds { 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus osStatus; 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSRect newContentFrameRect; 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSRect newWindowFrameRect; 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSRect oldContentFrameRect; 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Rect windowContentBoundsRect; 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Rect windowStructureBoundsRect; 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Initialize for safe returning. 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL reconciliationWasNecessary = NO; 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Precondition check. 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project assert(_contentView); 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Get the Carbon window's bounds, which are expressed in global screen coordinates, with (0,0) at the top-left of the main screen. 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = GetWindowBounds(_windowRef, kWindowStructureRgn, &windowStructureBoundsRect); 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus!=noErr) NSLog(@"A Carbon window's structure bounds couldn't be gotten."); 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = GetWindowBounds(_windowRef, kWindowContentRgn, &windowContentBoundsRect); 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus!=noErr) NSLog(@"A Carbon window's content bounds couldn't be gotten."); 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Set the frame rectangle of the border view and this window from the Carbon window's structure region bounds. 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newWindowFrameRect.origin.x = windowStructureBoundsRect.left; 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newWindowFrameRect.origin.y = NSMaxY([[[NSScreen screens] objectAtIndex:0] frame]) - windowStructureBoundsRect.bottom; 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newWindowFrameRect.size.width = windowStructureBoundsRect.right - windowStructureBoundsRect.left; 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newWindowFrameRect.size.height = windowStructureBoundsRect.bottom - windowStructureBoundsRect.top; 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!NSEqualRects(newWindowFrameRect, _frame)) { 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _setFrame:newWindowFrameRect]; 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [_borderView setFrameSize:newWindowFrameRect.size]; 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project reconciliationWasNecessary = YES; 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Set the content view's frame rect from the Carbon window's content region bounds. 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newContentFrameRect.origin.x = windowContentBoundsRect.left - windowStructureBoundsRect.left; 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newContentFrameRect.origin.y = windowStructureBoundsRect.bottom - windowContentBoundsRect.bottom; 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newContentFrameRect.size.width = windowContentBoundsRect.right - windowContentBoundsRect.left; 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newContentFrameRect.size.height = windowContentBoundsRect.bottom - windowContentBoundsRect.top; 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oldContentFrameRect = [_contentView frame]; 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!NSEqualRects(newContentFrameRect, oldContentFrameRect)) { 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [_contentView setFrame:newContentFrameRect]; 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project reconciliationWasNecessary = YES; 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Done. 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return reconciliationWasNecessary; 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Handle an event just like an NSWindow would. 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)sendSuperEvent:(NSEvent *)inEvent { 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Filter out a few events that just result in complaints in the log. 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Ignore some unknown event that gets sent when NSTextViews in printing accessory views are focused. M.P. Notice - 12/7/00 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL ignoreEvent = NO; 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEventType eventType = [inEvent type]; 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (eventType==NSSystemDefined) { 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project short eventSubtype = [inEvent subtype]; 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (eventSubtype==7) { 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ignoreEvent = YES; 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (eventType == NSKeyDown) { 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Handle command-space as [NSApp sendEvent:] does. 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([NSInputContext processInputKeyBindings:inEvent]) { 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Simple. 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!ignoreEvent) [super sendEvent:inEvent]; 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)relinquishFocus 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSResponder* firstResponder; 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Carbon thinks that a control has the keyboard focus, 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // or we wouldn't be being asked to relinquish focus. 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project firstResponder = [self firstResponder]; 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([firstResponder isKindOfClass:[NSView class]] ){ 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Make the window the first responder, so that no view is the key view. 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self makeFirstResponder:self]; 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)makeFirstResponder:(NSResponder *)aResponder 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Let NSWindow focus the appropriate NSView. 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (![super makeFirstResponder:aResponder]) 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NO; 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Now, if the view we're focusing is in a HIWebView, find the 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // corresponding HIWebView for the NSView, and tell carbon to 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // clear any focused control. 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewRef viewRef = 0; 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSResponder *firstResponder = [self firstResponder]; 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([firstResponder isKindOfClass:[NSView class]]) { 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView *view = (NSView *)firstResponder; 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (view) { 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project viewRef = [HIViewAdapter getHIViewForNSView:view]; 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (viewRef) 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view = [view superview]; 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewRef focus; 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetKeyboardFocus (_windowRef, &focus); 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (focus != viewRef) { 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SetKeyboardFocus (_windowRef, viewRef, kControlIndicatorPart ); 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return YES; 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _addCursorRect:cursor:forView:, despite the fact that NSWindow's invokes [self windowNumber], because Carbon windows won't have subviews, and therefore won't have cursor rects. 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _autoResizeState, despite the fact that NSWindow's operates on _windowNum, because it looks like it might work on Carbon windows as is. 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Disappointingly, -_blockHeartBeat: is not immediately invoked to turn off heartbeating. Heartbeating is turned off by setting the gDefaultButtonPaused global variable, and then this method is invoked later, if that global is set (at heartbeating time I guess). Something has to change if we want to hook this up in Carbon windows. M.P. Warning - 9/17/01 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Do the right thing for a Carbon window. 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_blockHeartBeat:(BOOL)flag { 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ControlRef defaultButton; 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus osStatus; 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Do the standard Cocoa thing. 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super _blockHeartBeat:flag]; 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If there's a default Carbon button in this Carbon window, make it stop pulsing, the Carbon way. 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This is inspired by HIToolbox/Controls/Definitions/ButtonCDEF.c's ButtonEventHandler(). M.P. Notice - 12/5/00 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = GetWindowDefaultButton(_windowRef, &defaultButton); 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus==noErr && defaultButton) { 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Boolean anotherButtonIsTracking = flag ? TRUE : FALSE; 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = SetControlData(defaultButton, kControlNoPart, kControlPushButtonAnotherButtonTrackingTag, sizeof(Boolean), &anotherButtonIsTracking); 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus==noErr) DrawOneControl(defaultButton); 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else NSLog(@"Some data couldn't be set in a Carbon control."); 4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Do the right thing for a Carbon window. 4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_cancelKey:(id)sender { 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Most of the time the handling of the cancel key will be done by Carbon, but this method will be invoked if an NSCarbonWindow is wrapping a Carbon window that contains an NSViewCarbonControl, and the escape key or whatever is pressed with an NSTextView focused. Just do what Carbon would do. 4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ControlRef cancelButton; 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetWindowCancelButton(_windowRef, &cancelButton); 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cancelButton) { 4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (IsControlActive(cancelButton)) { 4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewSimulateClick(cancelButton, kControlButtonPart, 0, NULL); 5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Do the right thing for a Carbon window. 5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_commonAwake { 5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Complain, because this should never be called. We insist that -[NSCarbonWindow initWithCarbonWindowRef] is the only valid initializer for instances of this class, and that there's no such thing as a one-shot NSCarbonWindow. 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSLog(@"-[NSCarbonWindow _commonAwake] is not implemented."); 5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _commonInitFrame:styleMask:backing:defer:, despite the fact that NSWindow's modifies quite a few instance variables, because it gets called in a harmless way if the class instance is properly initialized with -[NSCarbonWindow initWithCarbonWindowRef:takingOwnership:]. 5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Do the right thing for a Carbon window. 520967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (id)_destroyRealWindow:(BOOL)orderingOut { 5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Complain, because this should never be called. We don't support one-shot NSCarbonWindows. 5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSLog(@"-[NSCarbonWindow _destroyRealWindow:] is not implemented."); 5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return self; 5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _discardCursorRectsForView, despite the fact that NSWindow's invokes [self windowNumber], because Carbon windows won't have subviews, and therefore won't have cursor rects. 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _forceFlushWindowToScreen, despite the fact that NSWindow's invokes [self windowNumber], because it looks like it might work on Carbon windows as is. 5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _getPositionFromServer, despite the fact that NSWindow's operates on _windowNum, because it's only called from -[NSApplication _activateWindows], which is hopefully about to become obsolete any second now. 5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _globalWindowNum, despite the fact that NSWindow's invokes [self windowNumber], because it looks like it might work on Carbon windows as is. 5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _initContent:styleMask:backing:defer:contentView:, despite the fact that NSWindow's modifies _auxiliaryStorage->_auxWFlags.hasShadow, because it will never get called if the class instance is properly initialized with -[NSCarbonWindow initWithCarbonWindowRef:takingOwnership:]. 5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _initContent:styleMask:backing:defer:counterpart:, despite the fact that NSWindow's modifies _auxiliaryStorage->_auxWFlags.hasShadow, because it will never get called if the class instance is properly initialized with -[NSCarbonWindow initWithCarbonWindowRef:takingOwnership:]. 5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Do what NSWindow would do, but then sychronize the Carbon window structures. 5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_oldPlaceWindow:(NSRect)frameRect { 5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus osStatus; 5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Do the standard Cocoa thing. 5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super _oldPlaceWindow:frameRect]; 5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Tell Carbon to update its various regions. 5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Despite its name, this function should be called early and often, even if the window isn't visible yet. 2702648. M.P. Notice - 7/24/01 5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = WKSyncWindowWithCGAfterMove(_windowRef); 5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus!=noErr) NSLog(@"A Carbon window's bounds couldn't be synchronized (%i).", (int)osStatus); 5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _orderOutAndCalcKeyWithCounter:, despite the fact that NSWindow's invokes [self windowNumber], because it looks like it might work on Carbon windows as is. 5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _realHeartBeatThreadContext, despite the fact that NSWindows's invokes [self windowNumber], because it looks like it might not do anything that will effect a Carbon window. 5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _registerWithDockIfNeeded, despite the fact that NSWindow's invokes [self windowNumber], because it looks like it might work on Carbon windows as is. 5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _removeCursorRect:cursor:forView:, despite the fact that NSWindow's invokes [self windowNumber], because Carbon windows won't have subviews, and therefore won't have cursor rects. 5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _setAvoidsActivation:, despite the fact that NSWindow's invokes [self windowNumber], because it looks like it might work on Carbon windows as is. 5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _setFrame:, despite the fact that NSWindow's modifies _frame, because it looks like it might work on Carbon windows as is. The synchronization of the Carbon window bounds rect to the Cocoa frame rect is done in the overrides of _oldPlaceWindow: and _windowMovedToRect:. 5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _setFrameCommon:display:stashSize:, despite the fact that NSWindow's invokes [self windowNumber], because it looks like it might work on Carbon windows as is. 5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _setWindowNumber:, despite the fact that NSWindow's modifies _windowNum and invokes [self windowNumber], because it looks like it might work on Carbon windows as is. 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Do what NSWindow would do, but for a Carbon window. 5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This function is mostly cut-and-pasted from -[NSWindow _termWindowIfOwner]. M.P. Notice - 8/7/00 5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_termWindowIfOwner { 5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _setWindowNumber:-1]; 5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _wFlags.isTerminating = YES; 5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (_windowRef && _windowRefIsOwned) DisposeWindow(_windowRef); 5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // KW - need to clear window shadow state so it gets reset correctly when new window created 5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// if ([_borderView respondsToSelector:@selector(setShadowState:)]) { 5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// [_borderView setShadowState:kFrameShadowNone]; 5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// } 5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _wFlags.isTerminating = NO; 5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _threadContext, despite the fact that NSWindow's invokes [self windowNumber], because it looks like it might not do anything that will effect a Carbon window. 6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of _windowMoved:, despite the fact that NSWindow's operates on _windowNum, because it looks like it might work on Carbon windows as is. 6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Do what NSWindow would do, but then sychronize the Carbon window structures. 6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_windowMovedToRect:(NSRect)actualFrame { 6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus osStatus; 6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Do the standard Cocoa thing. 6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super _windowMovedToRect:actualFrame]; 6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Let Carbon know that the window has been moved, unless this method is being called "early." 6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (_wFlags.visible) { 6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = WKSyncWindowWithCGAfterMove(_windowRef); 6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus!=noErr) NSLog(@"A Carbon window's bounds couldn't be synchronized (%i).", (int)osStatus); 6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSRect)constrainFrameRect:(NSRect)actualFrame toScreen:(NSScreen *)screen { 6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // let Carbon decide window size and position 6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return actualFrame; 6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)selectKeyViewFollowingView:(NSView *)aView { 6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewRef view = NULL; 6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view = [HIViewAdapter getHIViewForNSView:aView]; 6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( view ) 6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewRef contentView; 6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetRootControl( GetControlOwner( view ), &contentView ); 6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewAdvanceFocus( contentView, 0 ); 6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super selectKeyViewFollowingView:aView]; 6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)selectKeyViewPrecedingView:(NSView *)aView { 6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewRef view = NULL; 6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project view = [HIViewAdapter getHIViewForNSView:aView]; 6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( view ) 6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewRef contentView; 6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetRootControl( GetControlOwner( view ), &contentView ); 6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewAdvanceFocus( contentView, shiftKey ); 6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super selectKeyViewPrecedingView:aView]; 6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)makeKeyWindow { 6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [NSApp _setMouseActivationInProgress:NO]; 6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [NSApp setIsActive:YES]; 6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super makeKeyWindow]; 6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WKShowKeyAndMain(); 6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Do the right thing for a Carbon window. 6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)canBecomeKeyWindow { 6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return YES; 6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Do the right thing for a Carbon window. 6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)canBecomeMainWindow { 6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus osStatus; 6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowClass windowClass; 6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // By default, Carbon windows cannot become the main window. 6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // What about when the default isn't right? Requiring subclassing seems harsh. M.P. Warning - 9/17/01 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // KW - modify this to allow document windows to become main 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This is primarily to get the right look, so that you don't have two windows that both look active - one Cocoa document and one Carbon document 6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = GetWindowClass(_windowRef, &windowClass); 6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return (osStatus == noErr && windowClass == kDocumentWindowClass); 6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of deminiaturize:, despite the fact that NSWindow's invokes [self windowNumber], because it looks like it might work on Carbon windows as is. 6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of disableCursorRects, despite the fact that NSWindow's invokes [self windowNumber], because Carbon windows won't have subviews, and therefore won't have cursor rects. 6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of enableCursorRects, despite the fact that NSWindow's invokes [self windowNumber], because Carbon windows won't have subviews, and therefore won't have cursor rects. 7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Do the right thing for a Carbon window. 7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)encodeWithCoder:(NSCoder *)coder { 7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Actually, this will probably never be implemented. M.P. Notice - 8/2/00 7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSLog(@"-[NSCarbonWindow encodeWithCoder:] is not implemented."); 7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of frame, despite the fact that NSWindow's returns _frame, because _frame is one of the instance variables whose value we're keeping synchronized with the Carbon window. 7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Do the right thing for a Carbon window. 7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithCoder:(NSCoder *)coder { 7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Actually, this will probably never be implemented. M.P. Notice - 8/2/00 7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSLog(@"-[NSCarbonWindow initWithCoder:] is not implemented."); 7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self release]; 7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of level, despite the fact that NSWindow's returns _level, because _level is one of the instance variables whose value we're keeping synchronized with the Carbon window. 7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of miniaturize:, despite the fact that NSWindow's invokes [self windowNumber], because it looks like it might work on Carbon windows as is. 7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of resizeToScreenWithEvent:, despite the fact that NSWindow's operates on _windowNum. 7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// It looks like it's only called when an _NSForceResizeEventType event is passed into -[NSWindow sendEvent:], and I can't find any instances of that happening. 7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Do the right thing for a Carbon Window. 7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)sendEvent:(NSEvent *)theEvent { 7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Not all events are handled in the same manner. 7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEventType eventType = [theEvent type]; 7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (eventType==NSAppKitDefined) { 7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Handle the event the Cocoa way. Carbon won't understand it anyway. 7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super sendEvent:theEvent]; 7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of setAcceptsMouseMovedEvents:, despite the fact that NSWindow's invokes [self windowNumber], because it looks like it might work on Carbon windows as is. 7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of setBackingType:, despite the fact that NSWindow's invokes [self windowNumber], because it's apparently not expected to do anything anyway, judging from the current implementation of PSsetwindowtype(). 7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Do what NSWindow would do, but for a Carbon window. 7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setContentView:(NSView *)aView { 7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSRect contentFrameRect; 7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus osStatus; 7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Rect windowContentBoundsRect; 7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Precondition check. 7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project assert(_borderView); 7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project assert([_borderView isKindOfClass:[CarbonWindowFrame class]]); 7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project assert(_windowRef); 7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Parameter check. 7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project assert(aView); 7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project assert([aView isKindOfClass:[CarbonWindowContentView class]]); 7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Find out the window's Carbon window structure region (content) bounds. 7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = GetWindowBounds(_windowRef, kWindowContentRgn, &windowContentBoundsRect); 7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus!=noErr) NSLog(@"A Carbon window's content bounds couldn't be gotten."); 7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project contentFrameRect.origin = NSZeroPoint; 7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project contentFrameRect.size.width = windowContentBoundsRect.right - windowContentBoundsRect.left; 7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project contentFrameRect.size.height = windowContentBoundsRect.bottom - windowContentBoundsRect.top; 7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the content view is still in some other view hierarchy, pry it free. 7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [_contentView removeFromSuperview]; 7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project assert(![_contentView superview]); 7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Record the content view, and size it to this window's content frame. 7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _contentView = aView; 7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [_contentView setFrame:contentFrameRect]; 7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Make the content view a subview of the border view. 7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [_borderView addSubview:_contentView]; 7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Tell the content view it's new place in the responder chain. 7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [_contentView setNextResponder:self]; 7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of setDepthLimit:, despite the fact that NSWindow's invokes [self windowNumber], because it looks like it might work on Carbon windows as is. 7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)worksWhenModal { 7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowClass windowClass = [self _carbonWindowClass]; 8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return (windowClass == kFloatingWindowClass || windowClass == kUtilityWindowClass); 8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setModalWindowLevel { 8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 807967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (id)_clearModalWindowLevel { 8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of setLevel:, despite the fact that NSWindow's invokes [self windowNumber], because it looks like it might work on Carbon windows as is. 8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// I thought at first that there should be a mapping between Cocoa level and Carbon window class, but experiments convince me that such is not the case. M.P. Notice - 9/18/00 8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no override of windowNumber, despite the fact that NSWindow's returns _windowNum, because _windowNum is one of the instance variables whose value we're keeping synchronized with the Carbon window. 8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (UInt32)carbonHICommandIDFromActionSelector:(SEL)inActionSelector { 8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Initialize with the default return value. 8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UInt32 hiCommandID = 0; 8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Pretty simple, if tedious. 8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (inActionSelector==@selector(clear:)) hiCommandID = kHICommandClear; 8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (inActionSelector==@selector(copy:)) hiCommandID = kHICommandCopy; 8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (inActionSelector==@selector(cut:)) hiCommandID = kHICommandCut; 8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (inActionSelector==@selector(paste:)) hiCommandID = kHICommandPaste; 8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (inActionSelector==@selector(redo:)) hiCommandID = kHICommandRedo; 8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (inActionSelector==@selector(selectAll:)) hiCommandID = kHICommandSelectAll; 8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (inActionSelector==@selector(undo:)) hiCommandID = kHICommandUndo; 8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Done. 8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return hiCommandID; 8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)sendCarbonProcessHICommandEvent:(UInt32)inHICommandID { 8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventTargetRef eventTargetRef; 8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HICommand hiCommand; 8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus osStatus; 8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Initialize for safe error handling. 8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventRef eventRef = NULL; 8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Create a Process Command event. Don't mention anything about the menu item, because we don't want the Carbon Event handler fiddling with it. 8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hiCommand.attributes = 0; 8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hiCommand.commandID = inHICommandID; 8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hiCommand.menu.menuRef = 0; 8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hiCommand.menu.menuItemIndex = 0; 8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = CreateEvent(NULL, kEventClassCommand, kEventCommandProcess, GetCurrentEventTime(), kEventAttributeNone, &eventRef); 8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus!=noErr) { 8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSLog(@"CreateEvent() returned %i.", (int)osStatus); 8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project goto CleanUp; 8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = SetEventParameter(eventRef, kEventParamDirectObject, typeHICommand, sizeof(HICommand), &hiCommand); 8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus!=noErr) { 8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSLog(@"SetEventParameter() returned %i.", (int)osStatus); 8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project goto CleanUp; 8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Send a Carbon event to whatever has the Carbon user focus. 8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project eventTargetRef = GetUserFocusEventTarget(); 8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = SendEventToEventTarget(eventRef, eventTargetRef); 8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus!=noErr) { 8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSLog(@"SendEventToEventTarget() returned %i.", (int)osStatus); 8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project goto CleanUp; 8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCleanUp: 8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Clean up. 8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (eventRef) ReleaseEvent(eventRef); 8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (Boolean)sendCarbonUpdateHICommandStatusEvent:(UInt32)inHICommandID withMenuRef:(MenuRef)inMenuRef andMenuItemIndex:(UInt16)inMenuItemIndex { 8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventTargetRef eventTargetRef; 8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HICommand hiCommand; 8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus osStatus; 8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Initialize for safe error handling and flag returning. 8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Boolean eventWasHandled = FALSE; 8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EventRef eventRef = NULL; 8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Create a Process Command event. Don't mention anything about the menu item, because we don't want the Carbon Event handler fiddling with it. 8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hiCommand.attributes = kHICommandFromMenu; 8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hiCommand.commandID = inHICommandID; 8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hiCommand.menu.menuRef = inMenuRef; 8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hiCommand.menu.menuItemIndex = inMenuItemIndex; 8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = CreateEvent(NULL, kEventClassCommand, kEventCommandUpdateStatus, GetCurrentEventTime(), kEventAttributeNone, &eventRef); 8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus!=noErr) { 8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSLog(@"CreateEvent() returned %i.", (int)osStatus); 8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project goto CleanUp; 8988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 8998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = SetEventParameter(eventRef, kEventParamDirectObject, typeHICommand, sizeof(HICommand), &hiCommand); 9008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus!=noErr) { 9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSLog(@"SetEventParameter() returned %i.", (int)osStatus); 9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project goto CleanUp; 9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Send a Carbon event to whatever has the Carbon user focus. 9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project eventTargetRef = GetUserFocusEventTarget(); 9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = SendEventToEventTarget(eventRef, eventTargetRef); 9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (osStatus==noErr) { 9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project eventWasHandled = TRUE; 9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (osStatus!=eventNotHandledErr) { 9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSLog(@"SendEventToEventTarget() returned %i.", (int)osStatus); 9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project goto CleanUp; 9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCleanUp: 9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Clean up. 9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (eventRef) ReleaseEvent(eventRef); 9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Done. 9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return eventWasHandled; 9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_handleRootBoundsChanged 9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewRef root = HIViewGetRoot( _windowRef ); 9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIRect frame; 9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewGetFrame( root, &frame ); 9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [_borderView setFrameSize:*(NSSize*)&frame.size]; 9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_handleContentBoundsChanged 9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewRef root, contentView; 9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIRect rootBounds, contentFrame; 9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSRect oldContentFrameRect; 9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project root = HIViewGetRoot( _windowRef ); 9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewFindByID( root, kHIViewWindowContentID, &contentView ); 9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewGetFrame( contentView, &contentFrame ); 9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewGetBounds( root, &rootBounds ); 9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Set the content view's frame rect from the Carbon window's content region bounds. 9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project contentFrame.origin.y = rootBounds.size.height - CGRectGetMaxY( contentFrame ); 9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oldContentFrameRect = [_contentView frame]; 9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( !NSEqualRects( *(NSRect*)&contentFrame, oldContentFrameRect ) ) { 9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [_contentView setFrame:*(NSRect*)&contentFrame]; 9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (OSStatus)_handleCarbonEvent:(EventRef)inEvent callRef:(EventHandlerCallRef)inCallRef { 9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus result = eventNotHandledErr; 9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch ( GetEventClass( inEvent ) ) 9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventClassControl: 9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ControlRef control; 9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project check( GetEventKind( inEvent ) == kEventControlBoundsChanged ); 9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetEventParameter( inEvent, kEventParamDirectObject, typeControlRef, NULL, 9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sizeof( ControlRef ), NULL, &control ); 9678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( control == HIViewGetRoot( _windowRef ) ) 9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _handleRootBoundsChanged]; 9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 9718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _handleContentBoundsChanged]; 9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventClassWindow: 9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch ( GetEventKind( inEvent ) ) 9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventWindowShown: 9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _setVisible:YES]; 9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventWindowHidden: 9838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _setVisible:NO]; 9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventWindowActivated: 9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self makeKeyWindow]; 9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventWindowDeactivated: 9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self resignKeyWindow]; 9928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 9938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case kEventWindowBoundsChanged: 9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self reconcileToCarbonWindowBounds]; 9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Handle various events that Carbon is sending to our window. 10058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic OSStatus NSCarbonWindowHandleEvent(EventHandlerCallRef inEventHandlerCallRef, EventRef inEventRef, void *inUserData) { 10068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // default action is to send event to next handler. We modify osStatus as necessary where we don't want this behavior 10088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus osStatus = eventNotHandledErr; 10098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We do different things for different event types. 10118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CarbonWindowAdapter *carbonWindow = (CarbonWindowAdapter *)inUserData; 10128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project osStatus = [carbonWindow _handleCarbonEvent: inEventRef callRef: inEventHandlerCallRef]; 10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Done. If we want to propagate the event, we return eventNotHandledErr to send it to the next handler 10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return osStatus; 10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// [3364117] We need to make sure this does not fall through to the AppKit implementation! bad things happen. 10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_reallyDoOrderWindow:(NSWindowOrderingMode)place relativeTo:(int)otherWin findKey:(BOOL)doKeyCalc forCounter:(BOOL)isACounter force:(BOOL)doForce isModal:(BOOL)isModal { 10228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSRect) _growBoxRect 10258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WindowAttributes attrs; 10278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSRect retRect = NSZeroRect; 10288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetWindowAttributes( _windowRef, &attrs ); 10308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( attrs & kWindowResizableAttribute ) 10328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 10338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIRect bounds, rect; 10348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewRef view; 10358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewGetBounds( HIViewGetRoot( _windowRef ), &bounds ); 10378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewFindByID( HIViewGetRoot( _windowRef ), kHIViewWindowGrowBoxID, &view ); 10388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HIViewGetFrame( view, &rect ); 10398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rect.origin.y = bounds.size.height - CGRectGetMaxY( rect ) - 1; 10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rect.origin.x++; 10428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project retRect = *(NSRect*)▭ 10448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return retRect; 10478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end // implementation CarbonWindowAdapter 10508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1052