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*)&rect;
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