19f62ea84SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 39f62ea84SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 49f62ea84SAndrew Rist * or more contributor license agreements. See the NOTICE file 59f62ea84SAndrew Rist * distributed with this work for additional information 69f62ea84SAndrew Rist * regarding copyright ownership. The ASF licenses this file 79f62ea84SAndrew Rist * to you under the Apache License, Version 2.0 (the 89f62ea84SAndrew Rist * "License"); you may not use this file except in compliance 99f62ea84SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 119f62ea84SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 139f62ea84SAndrew Rist * Unless required by applicable law or agreed to in writing, 149f62ea84SAndrew Rist * software distributed under the License is distributed on an 159f62ea84SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 169f62ea84SAndrew Rist * KIND, either express or implied. See the License for the 179f62ea84SAndrew Rist * specific language governing permissions and limitations 189f62ea84SAndrew Rist * under the License. 19cdf0e10cSrcweir * 209f62ea84SAndrew Rist *************************************************************/ 219f62ea84SAndrew Rist 229f62ea84SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_vcl.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <string> 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include "rtl/ustrbuf.hxx" 30cdf0e10cSrcweir 31cdf0e10cSrcweir #include "osl/file.h" 32cdf0e10cSrcweir 33cdf0e10cSrcweir #include "vcl/svapp.hxx" 34cdf0e10cSrcweir #include "vcl/window.hxx" 35cdf0e10cSrcweir #include "vcl/timer.hxx" 36cdf0e10cSrcweir 37cdf0e10cSrcweir #include "aqua/saldata.hxx" 38cdf0e10cSrcweir #include "aqua/salgdi.h" 39cdf0e10cSrcweir #include "aqua/salframe.h" 40cdf0e10cSrcweir #include "aqua/salmenu.h" 41cdf0e10cSrcweir #include "aqua/saltimer.h" 42cdf0e10cSrcweir #include "aqua/salinst.h" 43cdf0e10cSrcweir #include "aqua/salframeview.h" 44cdf0e10cSrcweir #include "aqua/aqua11yfactory.h" 45cdf0e10cSrcweir 46cdf0e10cSrcweir #include "salwtype.hxx" 47cdf0e10cSrcweir 48cdf0e10cSrcweir #include "premac.h" 49cdf0e10cSrcweir // needed for theming 50cdf0e10cSrcweir // FIXME: move theming code to salnativewidgets.cxx 51cdf0e10cSrcweir #include <Carbon/Carbon.h> 52cdf0e10cSrcweir #include "postmac.h" 53cdf0e10cSrcweir 54cdf0e10cSrcweir 55cdf0e10cSrcweir using namespace std; 56cdf0e10cSrcweir 57cdf0e10cSrcweir // ======================================================================= 58cdf0e10cSrcweir 59cdf0e10cSrcweir AquaSalFrame* AquaSalFrame::s_pCaptureFrame = NULL; 60cdf0e10cSrcweir 61cdf0e10cSrcweir // ======================================================================= 62cdf0e10cSrcweir 63cdf0e10cSrcweir AquaSalFrame::AquaSalFrame( SalFrame* pParent, sal_uLong salFrameStyle ) : 64*bde8a4bdSHerbert Dürr mpNSWindow(nil), 65*bde8a4bdSHerbert Dürr mpNSView(nil), 66cdf0e10cSrcweir mpDockMenuEntry(nil), 67cdf0e10cSrcweir mpGraphics(NULL), 68cdf0e10cSrcweir mpParent(NULL), 69cdf0e10cSrcweir mnMinWidth(0), 70cdf0e10cSrcweir mnMinHeight(0), 71cdf0e10cSrcweir mnMaxWidth(0), 72cdf0e10cSrcweir mnMaxHeight(0), 73cdf0e10cSrcweir mbGraphics(false), 74cdf0e10cSrcweir mbFullScreen( false ), 75cdf0e10cSrcweir mbShown(false), 76cdf0e10cSrcweir mbInitShow(true), 77cdf0e10cSrcweir mbPositioned(false), 78cdf0e10cSrcweir mbSized(false), 79cdf0e10cSrcweir mbPresentation( false ), 80cdf0e10cSrcweir mnStyle( salFrameStyle ), 81cdf0e10cSrcweir mnStyleMask( 0 ), 82cdf0e10cSrcweir mnLastEventTime( 0 ), 83cdf0e10cSrcweir mnLastModifierFlags( 0 ), 84cdf0e10cSrcweir mpMenu( NULL ), 85cdf0e10cSrcweir mnExtStyle( 0 ), 86cdf0e10cSrcweir mePointerStyle( POINTER_ARROW ), 87cdf0e10cSrcweir mnTrackingRectTag( 0 ), 88cdf0e10cSrcweir mrClippingPath( 0 ), 89cdf0e10cSrcweir mnICOptions( 0 ) 90cdf0e10cSrcweir { 91cdf0e10cSrcweir maSysData.nSize = sizeof( SystemEnvData ); 92cdf0e10cSrcweir 93cdf0e10cSrcweir mpParent = dynamic_cast<AquaSalFrame*>(pParent); 94cdf0e10cSrcweir 95cdf0e10cSrcweir initWindowAndView(); 96cdf0e10cSrcweir 97cdf0e10cSrcweir SalData* pSalData = GetSalData(); 98cdf0e10cSrcweir pSalData->maFrames.push_front( this ); 99cdf0e10cSrcweir pSalData->maFrameCheck.insert( this ); 100cdf0e10cSrcweir } 101cdf0e10cSrcweir 102cdf0e10cSrcweir // ----------------------------------------------------------------------- 103cdf0e10cSrcweir 104cdf0e10cSrcweir AquaSalFrame::~AquaSalFrame() 105cdf0e10cSrcweir { 106cdf0e10cSrcweir // if the frame is destroyed and has the current menubar 107cdf0e10cSrcweir // set the default menubar 108cdf0e10cSrcweir if( mpMenu && mpMenu->mbMenuBar && AquaSalMenu::pCurrentMenuBar == mpMenu ) 109cdf0e10cSrcweir AquaSalMenu::setDefaultMenu(); 110cdf0e10cSrcweir 111cdf0e10cSrcweir // cleanup clipping stuff 112cdf0e10cSrcweir ResetClipRegion(); 113cdf0e10cSrcweir 114cdf0e10cSrcweir [SalFrameView unsetMouseFrame: this]; 115cdf0e10cSrcweir 116cdf0e10cSrcweir SalData* pSalData = GetSalData(); 117cdf0e10cSrcweir pSalData->maFrames.remove( this ); 118cdf0e10cSrcweir pSalData->maFrameCheck.erase( this ); 119ff005604SEike Rathke pSalData->maPresentationFrames.remove( this ); 120cdf0e10cSrcweir 121cdf0e10cSrcweir DBG_ASSERT( this != s_pCaptureFrame, "capture frame destroyed" ); 122cdf0e10cSrcweir if( this == s_pCaptureFrame ) 123cdf0e10cSrcweir s_pCaptureFrame = NULL; 124cdf0e10cSrcweir 125cdf0e10cSrcweir if ( mpGraphics ) 126cdf0e10cSrcweir delete mpGraphics; 127cdf0e10cSrcweir 128cdf0e10cSrcweir if( mpDockMenuEntry ) 129cdf0e10cSrcweir // life cycle comment: the menu has ownership of the item, so no release 130cdf0e10cSrcweir [AquaSalInstance::GetDynamicDockMenu() removeItem: mpDockMenuEntry]; 131*bde8a4bdSHerbert Dürr if ( mpNSView ) { 132*bde8a4bdSHerbert Dürr [AquaA11yFactory revokeView: mpNSView]; 133*bde8a4bdSHerbert Dürr [mpNSView release]; 134cdf0e10cSrcweir } 135*bde8a4bdSHerbert Dürr if ( mpNSWindow ) 136*bde8a4bdSHerbert Dürr [mpNSWindow release]; 137cdf0e10cSrcweir } 138cdf0e10cSrcweir 139cdf0e10cSrcweir // ----------------------------------------------------------------------- 140cdf0e10cSrcweir 141cdf0e10cSrcweir void AquaSalFrame::initWindowAndView() 142cdf0e10cSrcweir { 143cdf0e10cSrcweir // initialize mirroring parameters 144cdf0e10cSrcweir // FIXME: screens changing 145*bde8a4bdSHerbert Dürr NSScreen* pNSScreen = [mpNSWindow screen]; 146*bde8a4bdSHerbert Dürr if( pNSScreen == nil ) 147*bde8a4bdSHerbert Dürr pNSScreen = [NSScreen mainScreen]; 148*bde8a4bdSHerbert Dürr maScreenRect = [pNSScreen frame]; 149cdf0e10cSrcweir 150cdf0e10cSrcweir // calculate some default geometry 151*bde8a4bdSHerbert Dürr NSRect aVisibleRect = [pNSScreen visibleFrame]; 152cdf0e10cSrcweir CocoaToVCL( aVisibleRect ); 153cdf0e10cSrcweir 154cdf0e10cSrcweir maGeometry.nX = static_cast<int>(aVisibleRect.origin.x + aVisibleRect.size.width / 10); 155cdf0e10cSrcweir maGeometry.nY = static_cast<int>(aVisibleRect.origin.y + aVisibleRect.size.height / 10); 156cdf0e10cSrcweir maGeometry.nWidth = static_cast<unsigned int>(aVisibleRect.size.width * 0.8); 157cdf0e10cSrcweir maGeometry.nHeight = static_cast<unsigned int>(aVisibleRect.size.height * 0.8); 158cdf0e10cSrcweir 159cdf0e10cSrcweir // calculate style mask 160cdf0e10cSrcweir if( (mnStyle & SAL_FRAME_STYLE_FLOAT) || 161cdf0e10cSrcweir (mnStyle & SAL_FRAME_STYLE_OWNERDRAWDECORATION) ) 162cdf0e10cSrcweir mnStyleMask = NSBorderlessWindowMask; 163cdf0e10cSrcweir else if( mnStyle & SAL_FRAME_STYLE_DEFAULT ) 164cdf0e10cSrcweir { 165cdf0e10cSrcweir mnStyleMask = NSTitledWindowMask | 166cdf0e10cSrcweir NSMiniaturizableWindowMask | 167cdf0e10cSrcweir NSResizableWindowMask | 168cdf0e10cSrcweir NSClosableWindowMask; 169cdf0e10cSrcweir // make default window "maximized" 170cdf0e10cSrcweir maGeometry.nX = static_cast<int>(aVisibleRect.origin.x); 171cdf0e10cSrcweir maGeometry.nY = static_cast<int>(aVisibleRect.origin.y); 172cdf0e10cSrcweir maGeometry.nWidth = static_cast<int>(aVisibleRect.size.width); 173cdf0e10cSrcweir maGeometry.nHeight = static_cast<int>(aVisibleRect.size.height); 174cdf0e10cSrcweir mbPositioned = mbSized = true; 175cdf0e10cSrcweir } 176cdf0e10cSrcweir else 177cdf0e10cSrcweir { 178cdf0e10cSrcweir if( (mnStyle & SAL_FRAME_STYLE_MOVEABLE) ) 179cdf0e10cSrcweir { 180cdf0e10cSrcweir mnStyleMask |= NSTitledWindowMask; 181cdf0e10cSrcweir if( mpParent == NULL ) 182cdf0e10cSrcweir mnStyleMask |= NSMiniaturizableWindowMask; 183cdf0e10cSrcweir } 184cdf0e10cSrcweir if( (mnStyle & SAL_FRAME_STYLE_SIZEABLE) ) 185cdf0e10cSrcweir mnStyleMask |= NSResizableWindowMask; 186cdf0e10cSrcweir if( (mnStyle & SAL_FRAME_STYLE_CLOSEABLE) ) 187cdf0e10cSrcweir mnStyleMask |= NSClosableWindowMask; 188cdf0e10cSrcweir // documentation says anything other than NSBorderlessWindowMask (=0) 189cdf0e10cSrcweir // should also include NSTitledWindowMask; 190cdf0e10cSrcweir if( mnStyleMask != 0 ) 191cdf0e10cSrcweir mnStyleMask |= NSTitledWindowMask; 192cdf0e10cSrcweir } 193cdf0e10cSrcweir 194cdf0e10cSrcweir // #i91990# support GUI-less (daemon) execution 195cdf0e10cSrcweir @try 196cdf0e10cSrcweir { 197*bde8a4bdSHerbert Dürr mpNSWindow = [[SalFrameWindow alloc] initWithSalFrame: this]; 198*bde8a4bdSHerbert Dürr mpNSView = [[SalFrameView alloc] initWithSalFrame: this]; 199cdf0e10cSrcweir } 200cdf0e10cSrcweir @catch ( id exception ) 201cdf0e10cSrcweir { 202cdf0e10cSrcweir return; 203cdf0e10cSrcweir } 204cdf0e10cSrcweir 205cdf0e10cSrcweir if( (mnStyle & SAL_FRAME_STYLE_TOOLTIP) ) 206*bde8a4bdSHerbert Dürr [mpNSWindow setIgnoresMouseEvents: YES]; 207cdf0e10cSrcweir else 208*bde8a4bdSHerbert Dürr [mpNSWindow setAcceptsMouseMovedEvents: YES]; 209*bde8a4bdSHerbert Dürr [mpNSWindow setHasShadow: YES]; 210*bde8a4bdSHerbert Dürr [mpNSWindow setDelegate: mpNSWindow]; 211cdf0e10cSrcweir 212cd426cceSHerbert Dürr const NSRect aRect = NSMakeRect( 0,0, maGeometry.nWidth, maGeometry.nHeight ); 213*bde8a4bdSHerbert Dürr mnTrackingRectTag = [mpNSView addTrackingRect: aRect owner: mpNSView userData: nil assumeInside: NO]; 214cdf0e10cSrcweir 215*bde8a4bdSHerbert Dürr maSysData.mpNSView = mpNSView; 216cdf0e10cSrcweir 217cdf0e10cSrcweir UpdateFrameGeometry(); 218cdf0e10cSrcweir 219*bde8a4bdSHerbert Dürr [mpNSWindow setContentView: mpNSView]; 220cdf0e10cSrcweir } 221cdf0e10cSrcweir 222cdf0e10cSrcweir // ----------------------------------------------------------------------- 223cdf0e10cSrcweir 224cdf0e10cSrcweir void AquaSalFrame::CocoaToVCL( NSRect& io_rRect, bool bRelativeToScreen ) 225cdf0e10cSrcweir { 226cdf0e10cSrcweir if( bRelativeToScreen ) 227cdf0e10cSrcweir io_rRect.origin.y = maScreenRect.size.height - (io_rRect.origin.y+io_rRect.size.height); 228cdf0e10cSrcweir else 229cdf0e10cSrcweir io_rRect.origin.y = maGeometry.nHeight - (io_rRect.origin.y+io_rRect.size.height); 230cdf0e10cSrcweir } 231cdf0e10cSrcweir 232cdf0e10cSrcweir void AquaSalFrame::VCLToCocoa( NSRect& io_rRect, bool bRelativeToScreen ) 233cdf0e10cSrcweir { 234cdf0e10cSrcweir if( bRelativeToScreen ) 235cdf0e10cSrcweir io_rRect.origin.y = maScreenRect.size.height - (io_rRect.origin.y+io_rRect.size.height); 236cdf0e10cSrcweir else 237cdf0e10cSrcweir io_rRect.origin.y = maGeometry.nHeight - (io_rRect.origin.y+io_rRect.size.height); 238cdf0e10cSrcweir } 239cdf0e10cSrcweir 240cdf0e10cSrcweir void AquaSalFrame::CocoaToVCL( NSPoint& io_rPoint, bool bRelativeToScreen ) 241cdf0e10cSrcweir { 242cdf0e10cSrcweir if( bRelativeToScreen ) 243cdf0e10cSrcweir io_rPoint.y = maScreenRect.size.height - io_rPoint.y; 244cdf0e10cSrcweir else 245cdf0e10cSrcweir io_rPoint.y = maGeometry.nHeight - io_rPoint.y; 246cdf0e10cSrcweir } 247cdf0e10cSrcweir 248cdf0e10cSrcweir void AquaSalFrame::VCLToCocoa( NSPoint& io_rPoint, bool bRelativeToScreen ) 249cdf0e10cSrcweir { 250cdf0e10cSrcweir if( bRelativeToScreen ) 251cdf0e10cSrcweir io_rPoint.y = maScreenRect.size.height - io_rPoint.y; 252cdf0e10cSrcweir else 253cdf0e10cSrcweir io_rPoint.y = maGeometry.nHeight - io_rPoint.y; 254cdf0e10cSrcweir } 255cdf0e10cSrcweir 256cdf0e10cSrcweir // ----------------------------------------------------------------------- 257cdf0e10cSrcweir 258cdf0e10cSrcweir void AquaSalFrame::screenParametersChanged() 259cdf0e10cSrcweir { 260cdf0e10cSrcweir UpdateFrameGeometry(); 261cdf0e10cSrcweir 262cdf0e10cSrcweir if( mpGraphics ) 263cdf0e10cSrcweir mpGraphics->updateResolution(); 264cdf0e10cSrcweir CallCallback( SALEVENT_DISPLAYCHANGED, 0 ); 265cdf0e10cSrcweir } 266cdf0e10cSrcweir 267cdf0e10cSrcweir // ----------------------------------------------------------------------- 268cdf0e10cSrcweir 269cdf0e10cSrcweir SalGraphics* AquaSalFrame::GetGraphics() 270cdf0e10cSrcweir { 271cdf0e10cSrcweir if ( mbGraphics ) 272cdf0e10cSrcweir return NULL; 273cdf0e10cSrcweir 274cdf0e10cSrcweir if ( !mpGraphics ) 275cdf0e10cSrcweir { 276cdf0e10cSrcweir mpGraphics = new AquaSalGraphics; 277cdf0e10cSrcweir mpGraphics->SetWindowGraphics( this ); 278cdf0e10cSrcweir } 279cdf0e10cSrcweir 280cdf0e10cSrcweir mbGraphics = TRUE; 281cdf0e10cSrcweir return mpGraphics; 282cdf0e10cSrcweir } 283cdf0e10cSrcweir 284cdf0e10cSrcweir // ----------------------------------------------------------------------- 285cdf0e10cSrcweir 286cdf0e10cSrcweir void AquaSalFrame::ReleaseGraphics( SalGraphics *pGraphics ) 287cdf0e10cSrcweir { 288cdf0e10cSrcweir (void)pGraphics; 289cdf0e10cSrcweir DBG_ASSERT( pGraphics == mpGraphics, "graphics released on wrong frame" ); 290cdf0e10cSrcweir mbGraphics = FALSE; 291cdf0e10cSrcweir } 292cdf0e10cSrcweir 293cdf0e10cSrcweir // ----------------------------------------------------------------------- 294cdf0e10cSrcweir 295cdf0e10cSrcweir sal_Bool AquaSalFrame::PostEvent( void *pData ) 296cdf0e10cSrcweir { 297cdf0e10cSrcweir GetSalData()->mpFirstInstance->PostUserEvent( this, SALEVENT_USEREVENT, pData ); 298cdf0e10cSrcweir return TRUE; 299cdf0e10cSrcweir } 300cdf0e10cSrcweir 301cdf0e10cSrcweir // ----------------------------------------------------------------------- 302cdf0e10cSrcweir void AquaSalFrame::SetTitle(const XubString& rTitle) 303cdf0e10cSrcweir { 304*bde8a4bdSHerbert Dürr if ( !mpNSWindow ) 305cdf0e10cSrcweir return; 306cdf0e10cSrcweir 307cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 308cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 309cdf0e10cSrcweir 310cdf0e10cSrcweir NSString* pTitle = CreateNSString( rTitle ); 311*bde8a4bdSHerbert Dürr [mpNSWindow setTitle: pTitle]; 312cdf0e10cSrcweir 313cdf0e10cSrcweir // create an entry in the dock menu 314cdf0e10cSrcweir const sal_uLong nAppWindowStyle = (SAL_FRAME_STYLE_CLOSEABLE | SAL_FRAME_STYLE_MOVEABLE); 315cdf0e10cSrcweir if( mpParent == NULL && 316cdf0e10cSrcweir (mnStyle & nAppWindowStyle) == nAppWindowStyle ) 317cdf0e10cSrcweir { 318cdf0e10cSrcweir if( mpDockMenuEntry == NULL ) 319cdf0e10cSrcweir { 320cdf0e10cSrcweir NSMenu* pDock = AquaSalInstance::GetDynamicDockMenu(); 321cdf0e10cSrcweir mpDockMenuEntry = [pDock insertItemWithTitle: pTitle 322cdf0e10cSrcweir action: @selector(dockMenuItemTriggered:) 323cdf0e10cSrcweir keyEquivalent: @"" 324cdf0e10cSrcweir atIndex: 0]; 325*bde8a4bdSHerbert Dürr [mpDockMenuEntry setTarget: mpNSWindow]; 326cdf0e10cSrcweir 327cdf0e10cSrcweir // TODO: image (either the generic window image or an icon 328cdf0e10cSrcweir // check mark (for "main" window ?) 329cdf0e10cSrcweir } 330cdf0e10cSrcweir else 331cdf0e10cSrcweir [mpDockMenuEntry setTitle: pTitle]; 332cdf0e10cSrcweir } 333cdf0e10cSrcweir 334cdf0e10cSrcweir if (pTitle) 335cdf0e10cSrcweir [pTitle release]; 336cdf0e10cSrcweir } 337cdf0e10cSrcweir 338cdf0e10cSrcweir // ----------------------------------------------------------------------- 339cdf0e10cSrcweir 340cdf0e10cSrcweir void AquaSalFrame::SetIcon( sal_uInt16 ) 341cdf0e10cSrcweir { 342cdf0e10cSrcweir } 343cdf0e10cSrcweir 344cdf0e10cSrcweir // ----------------------------------------------------------------------- 345cdf0e10cSrcweir 346cdf0e10cSrcweir void AquaSalFrame::SetRepresentedURL( const rtl::OUString& i_rDocURL ) 347cdf0e10cSrcweir { 348cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 349cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 350cdf0e10cSrcweir 351cdf0e10cSrcweir if( i_rDocURL.indexOfAsciiL( "file:", 5 ) == 0 ) 352cdf0e10cSrcweir { 353cdf0e10cSrcweir rtl::OUString aSysPath; 354cdf0e10cSrcweir osl_getSystemPathFromFileURL( i_rDocURL.pData, &aSysPath.pData ); 355cdf0e10cSrcweir NSString* pStr = CreateNSString( aSysPath ); 356cdf0e10cSrcweir if( pStr ) 357cdf0e10cSrcweir { 358cdf0e10cSrcweir [pStr autorelease]; 359*bde8a4bdSHerbert Dürr [mpNSWindow setRepresentedFilename: pStr]; 360cdf0e10cSrcweir } 361cdf0e10cSrcweir } 362cdf0e10cSrcweir } 363cdf0e10cSrcweir 364cdf0e10cSrcweir // ----------------------------------------------------------------------- 365cdf0e10cSrcweir 366cdf0e10cSrcweir void AquaSalFrame::initShow() 367cdf0e10cSrcweir { 368cdf0e10cSrcweir mbInitShow = false; 369cdf0e10cSrcweir if( ! mbPositioned && ! mbFullScreen ) 370cdf0e10cSrcweir { 371cdf0e10cSrcweir Rectangle aScreenRect; 372cdf0e10cSrcweir GetWorkArea( aScreenRect ); 373cdf0e10cSrcweir if( mpParent ) // center relative to parent 374cdf0e10cSrcweir { 375cdf0e10cSrcweir // center on parent 376cdf0e10cSrcweir long nNewX = mpParent->maGeometry.nX + ((long)mpParent->maGeometry.nWidth - (long)maGeometry.nWidth)/2; 377cdf0e10cSrcweir if( nNewX < aScreenRect.Left() ) 378cdf0e10cSrcweir nNewX = aScreenRect.Left(); 379cdf0e10cSrcweir if( long(nNewX + maGeometry.nWidth) > aScreenRect.Right() ) 380cdf0e10cSrcweir nNewX = aScreenRect.Right() - maGeometry.nWidth-1; 381cdf0e10cSrcweir long nNewY = mpParent->maGeometry.nY + ((long)mpParent->maGeometry.nHeight - (long)maGeometry.nHeight)/2; 382cdf0e10cSrcweir if( nNewY < aScreenRect.Top() ) 383cdf0e10cSrcweir nNewY = aScreenRect.Top(); 384cdf0e10cSrcweir if( nNewY > aScreenRect.Bottom() ) 385cdf0e10cSrcweir nNewY = aScreenRect.Bottom() - maGeometry.nHeight-1; 386cdf0e10cSrcweir SetPosSize( nNewX - mpParent->maGeometry.nX, 387cdf0e10cSrcweir nNewY - mpParent->maGeometry.nY, 388cdf0e10cSrcweir 0, 0, SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y ); 389cdf0e10cSrcweir } 390cdf0e10cSrcweir else if( ! (mnStyle & SAL_FRAME_STYLE_SIZEABLE) ) 391cdf0e10cSrcweir { 392cdf0e10cSrcweir // center on screen 393cdf0e10cSrcweir long nNewX = (aScreenRect.GetWidth() - maGeometry.nWidth)/2; 394cdf0e10cSrcweir long nNewY = (aScreenRect.GetHeight() - maGeometry.nHeight)/2; 395cdf0e10cSrcweir SetPosSize( nNewX, nNewY, 0, 0, SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y ); 396cdf0e10cSrcweir } 397cdf0e10cSrcweir } 398cdf0e10cSrcweir 399cdf0e10cSrcweir // make sure the view is present in the wrapper list before any children receive focus 400*bde8a4bdSHerbert Dürr [AquaA11yFactory registerView: mpNSView]; 401cdf0e10cSrcweir } 402cdf0e10cSrcweir 403cdf0e10cSrcweir void AquaSalFrame::SendPaintEvent( const Rectangle* pRect ) 404cdf0e10cSrcweir { 405cdf0e10cSrcweir SalPaintEvent aPaintEvt( 0, 0, maGeometry.nWidth, maGeometry.nHeight, true ); 406cdf0e10cSrcweir if( pRect ) 407cdf0e10cSrcweir { 408cdf0e10cSrcweir aPaintEvt.mnBoundX = pRect->Left(); 409cdf0e10cSrcweir aPaintEvt.mnBoundY = pRect->Top(); 410cdf0e10cSrcweir aPaintEvt.mnBoundWidth = pRect->GetWidth(); 411cdf0e10cSrcweir aPaintEvt.mnBoundHeight = pRect->GetHeight(); 412cdf0e10cSrcweir } 413cdf0e10cSrcweir 414cdf0e10cSrcweir CallCallback(SALEVENT_PAINT, &aPaintEvt); 415cdf0e10cSrcweir } 416cdf0e10cSrcweir 417cdf0e10cSrcweir // ----------------------------------------------------------------------- 418cdf0e10cSrcweir 419cdf0e10cSrcweir void AquaSalFrame::Show(sal_Bool bVisible, sal_Bool bNoActivate) 420cdf0e10cSrcweir { 421*bde8a4bdSHerbert Dürr if ( !mpNSWindow ) 422cdf0e10cSrcweir return; 423cdf0e10cSrcweir 424cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 425cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 426cdf0e10cSrcweir 427cdf0e10cSrcweir mbShown = bVisible; 428cdf0e10cSrcweir if(bVisible) 429cdf0e10cSrcweir { 430cdf0e10cSrcweir if( mbInitShow ) 431cdf0e10cSrcweir initShow(); 432cdf0e10cSrcweir 433cdf0e10cSrcweir CallCallback(SALEVENT_RESIZE, 0); 434cdf0e10cSrcweir // trigger filling our backbuffer 435cdf0e10cSrcweir SendPaintEvent(); 436cdf0e10cSrcweir 437*bde8a4bdSHerbert Dürr if( bNoActivate || [mpNSWindow canBecomeKeyWindow] == NO ) 438*bde8a4bdSHerbert Dürr [mpNSWindow orderFront: NSApp]; 439cdf0e10cSrcweir else 440*bde8a4bdSHerbert Dürr [mpNSWindow makeKeyAndOrderFront: NSApp]; 441cdf0e10cSrcweir 442cdf0e10cSrcweir if( mpParent ) 443cdf0e10cSrcweir { 444cdf0e10cSrcweir /* #i92674# #i96433# we do not want an invisible parent to show up (which adding a visible 445cdf0e10cSrcweir child implicitly does). However we also do not want a parentless toolbar. 446cdf0e10cSrcweir 447cdf0e10cSrcweir HACK: try to decide when we should not insert a child to its parent 448cdf0e10cSrcweir floaters and ownerdraw windows have not yet shown up in cases where 449cdf0e10cSrcweir we don't want the parent to become visible 450cdf0e10cSrcweir */ 451cdf0e10cSrcweir if( mpParent->mbShown || (mnStyle & (SAL_FRAME_STYLE_OWNERDRAWDECORATION | SAL_FRAME_STYLE_FLOAT) ) ) 452cdf0e10cSrcweir { 453*bde8a4bdSHerbert Dürr [mpParent->mpNSWindow addChildWindow: mpNSWindow ordered: NSWindowAbove]; 454cdf0e10cSrcweir } 455cdf0e10cSrcweir } 456cdf0e10cSrcweir 457cdf0e10cSrcweir if( mbPresentation ) 458*bde8a4bdSHerbert Dürr [mpNSWindow makeMainWindow]; 459cdf0e10cSrcweir } 460cdf0e10cSrcweir else 461cdf0e10cSrcweir { 462cdf0e10cSrcweir // if the frame holding the current menubar gets hidden 463cdf0e10cSrcweir // show the default menubar 464cdf0e10cSrcweir if( mpMenu && mpMenu->mbMenuBar && AquaSalMenu::pCurrentMenuBar == mpMenu ) 465cdf0e10cSrcweir AquaSalMenu::setDefaultMenu(); 466cdf0e10cSrcweir 467cdf0e10cSrcweir // #i90440# #i94443# work around the focus going back to some other window 468cdf0e10cSrcweir // if a child gets hidden for a parent window 469*bde8a4bdSHerbert Dürr if( mpParent && mpParent->mbShown && [mpNSWindow isKeyWindow] ) 470*bde8a4bdSHerbert Dürr [mpParent->mpNSWindow makeKeyAndOrderFront: NSApp]; 471cdf0e10cSrcweir 472cdf0e10cSrcweir [SalFrameView unsetMouseFrame: this]; 473*bde8a4bdSHerbert Dürr if( mpParent && [mpNSWindow parentWindow] == mpParent->mpNSWindow ) 474*bde8a4bdSHerbert Dürr [mpParent->mpNSWindow removeChildWindow: mpNSWindow]; 475cdf0e10cSrcweir 476*bde8a4bdSHerbert Dürr [mpNSWindow orderOut: NSApp]; 477cdf0e10cSrcweir } 478cdf0e10cSrcweir } 479cdf0e10cSrcweir 480cdf0e10cSrcweir // ----------------------------------------------------------------------- 481cdf0e10cSrcweir 482cdf0e10cSrcweir void AquaSalFrame::Enable( sal_Bool ) 483cdf0e10cSrcweir { 484cdf0e10cSrcweir } 485cdf0e10cSrcweir 486cdf0e10cSrcweir // ----------------------------------------------------------------------- 487cdf0e10cSrcweir 488cdf0e10cSrcweir void AquaSalFrame::SetMinClientSize( long nWidth, long nHeight ) 489cdf0e10cSrcweir { 490cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 491cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 492cdf0e10cSrcweir 493cdf0e10cSrcweir mnMinWidth = nWidth; 494cdf0e10cSrcweir mnMinHeight = nHeight; 495cdf0e10cSrcweir 496*bde8a4bdSHerbert Dürr if( mpNSWindow ) 497cdf0e10cSrcweir { 498cdf0e10cSrcweir // Always add the decoration as the dimension concerns only 499cdf0e10cSrcweir // the content rectangle 500cdf0e10cSrcweir nWidth += maGeometry.nLeftDecoration + maGeometry.nRightDecoration; 501cdf0e10cSrcweir nHeight += maGeometry.nTopDecoration + maGeometry.nBottomDecoration; 502cdf0e10cSrcweir 503cd426cceSHerbert Dürr const NSSize aSize = NSMakeSize( nWidth, nHeight); 504cdf0e10cSrcweir 505cdf0e10cSrcweir // Size of full window (content+structure) although we only 506cdf0e10cSrcweir // have the client size in arguments 507*bde8a4bdSHerbert Dürr [mpNSWindow setMinSize: aSize]; 508cdf0e10cSrcweir } 509cdf0e10cSrcweir } 510cdf0e10cSrcweir 511cdf0e10cSrcweir // ----------------------------------------------------------------------- 512cdf0e10cSrcweir 513cdf0e10cSrcweir void AquaSalFrame::SetMaxClientSize( long nWidth, long nHeight ) 514cdf0e10cSrcweir { 515cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 516cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 517cdf0e10cSrcweir 518cdf0e10cSrcweir mnMaxWidth = nWidth; 519cdf0e10cSrcweir mnMaxHeight = nHeight; 520cdf0e10cSrcweir 521*bde8a4bdSHerbert Dürr if( mpNSWindow ) 522cdf0e10cSrcweir { 523cdf0e10cSrcweir // Always add the decoration as the dimension concerns only 524cdf0e10cSrcweir // the content rectangle 525cdf0e10cSrcweir nWidth += maGeometry.nLeftDecoration + maGeometry.nRightDecoration; 526cdf0e10cSrcweir nHeight += maGeometry.nTopDecoration + maGeometry.nBottomDecoration; 527cdf0e10cSrcweir 528cdf0e10cSrcweir // Carbon windows can't have a size greater than 32767x32767 529cdf0e10cSrcweir if (nWidth>32767) nWidth=32767; 530cdf0e10cSrcweir if (nHeight>32767) nHeight=32767; 531cdf0e10cSrcweir 532cd426cceSHerbert Dürr const NSSize aSize = NSMakeSize( nWidth, nHeight); 533cdf0e10cSrcweir 534cdf0e10cSrcweir // Size of full window (content+structure) although we only 535cdf0e10cSrcweir // have the client size in arguments 536*bde8a4bdSHerbert Dürr [mpNSWindow setMaxSize: aSize]; 537cdf0e10cSrcweir } 538cdf0e10cSrcweir } 539cdf0e10cSrcweir 540cdf0e10cSrcweir // ----------------------------------------------------------------------- 541cdf0e10cSrcweir 542cdf0e10cSrcweir void AquaSalFrame::SetClientSize( long nWidth, long nHeight ) 543cdf0e10cSrcweir { 544cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 545cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 546cdf0e10cSrcweir 547*bde8a4bdSHerbert Dürr if( mpNSWindow ) 548cdf0e10cSrcweir { 549cd426cceSHerbert Dürr const NSSize aSize = NSMakeSize( nWidth, nHeight); 550cdf0e10cSrcweir 551*bde8a4bdSHerbert Dürr [mpNSWindow setContentSize: aSize]; 552cdf0e10cSrcweir UpdateFrameGeometry(); 553cdf0e10cSrcweir if( mbShown ) 554cdf0e10cSrcweir // trigger filling our backbuffer 555cdf0e10cSrcweir SendPaintEvent(); 556cdf0e10cSrcweir } 557cdf0e10cSrcweir } 558cdf0e10cSrcweir 559cdf0e10cSrcweir // ----------------------------------------------------------------------- 560cdf0e10cSrcweir 561cdf0e10cSrcweir void AquaSalFrame::GetClientSize( long& rWidth, long& rHeight ) 562cdf0e10cSrcweir { 563cdf0e10cSrcweir if( mbShown || mbInitShow ) 564cdf0e10cSrcweir { 565cdf0e10cSrcweir rWidth = maGeometry.nWidth; 566cdf0e10cSrcweir rHeight = maGeometry.nHeight; 567cdf0e10cSrcweir } 568cdf0e10cSrcweir else 569cdf0e10cSrcweir { 570cdf0e10cSrcweir rWidth = 0; 571cdf0e10cSrcweir rHeight = 0; 572cdf0e10cSrcweir } 573cdf0e10cSrcweir } 574cdf0e10cSrcweir 575cdf0e10cSrcweir // ----------------------------------------------------------------------- 576cdf0e10cSrcweir 577cdf0e10cSrcweir void AquaSalFrame::SetWindowState( const SalFrameState* pState ) 578cdf0e10cSrcweir { 579cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 580cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 581cdf0e10cSrcweir 582*bde8a4bdSHerbert Dürr if ( mpNSWindow ) 583cdf0e10cSrcweir { 584cdf0e10cSrcweir // set normal state 585*bde8a4bdSHerbert Dürr NSRect aStateRect = [mpNSWindow frame]; 586cdf0e10cSrcweir aStateRect = [NSWindow contentRectForFrameRect: aStateRect styleMask: mnStyleMask]; 587cdf0e10cSrcweir CocoaToVCL( aStateRect ); 588cdf0e10cSrcweir if( pState->mnMask & SAL_FRAMESTATE_MASK_X ) 589cdf0e10cSrcweir aStateRect.origin.x = float(pState->mnX); 590cdf0e10cSrcweir if( pState->mnMask & SAL_FRAMESTATE_MASK_Y ) 591cdf0e10cSrcweir aStateRect.origin.y = float(pState->mnY); 592cdf0e10cSrcweir if( pState->mnMask & SAL_FRAMESTATE_MASK_WIDTH ) 593cdf0e10cSrcweir aStateRect.size.width = float(pState->mnWidth); 594cdf0e10cSrcweir if( pState->mnMask & SAL_FRAMESTATE_MASK_HEIGHT ) 595cdf0e10cSrcweir aStateRect.size.height = float(pState->mnHeight); 596cdf0e10cSrcweir VCLToCocoa( aStateRect ); 597cdf0e10cSrcweir aStateRect = [NSWindow frameRectForContentRect: aStateRect styleMask: mnStyleMask]; 598cdf0e10cSrcweir 599*bde8a4bdSHerbert Dürr [mpNSWindow setFrame: aStateRect display: NO]; 600cdf0e10cSrcweir if( pState->mnState == SAL_FRAMESTATE_MINIMIZED ) 601*bde8a4bdSHerbert Dürr [mpNSWindow miniaturize: NSApp]; 602*bde8a4bdSHerbert Dürr else if( [mpNSWindow isMiniaturized] ) 603*bde8a4bdSHerbert Dürr [mpNSWindow deminiaturize: NSApp]; 604cdf0e10cSrcweir 605cdf0e10cSrcweir 606cdf0e10cSrcweir /* ZOOMED is not really maximized (actually it toggles between a user set size and 607cdf0e10cSrcweir the program specified one), but comes closest since the default behavior is 608cdf0e10cSrcweir "maximized" if the user did not intervene 609cdf0e10cSrcweir */ 610cdf0e10cSrcweir if( pState->mnState == SAL_FRAMESTATE_MAXIMIZED ) 611cdf0e10cSrcweir { 612*bde8a4bdSHerbert Dürr if(! [mpNSWindow isZoomed]) 613*bde8a4bdSHerbert Dürr [mpNSWindow zoom: NSApp]; 614cdf0e10cSrcweir } 615cdf0e10cSrcweir else 616cdf0e10cSrcweir { 617*bde8a4bdSHerbert Dürr if( [mpNSWindow isZoomed] ) 618*bde8a4bdSHerbert Dürr [mpNSWindow zoom: NSApp]; 619cdf0e10cSrcweir } 620cdf0e10cSrcweir } 621cdf0e10cSrcweir 622cdf0e10cSrcweir // get new geometry 623cdf0e10cSrcweir UpdateFrameGeometry(); 624cdf0e10cSrcweir 625cdf0e10cSrcweir sal_uInt16 nEvent = 0; 626cdf0e10cSrcweir if( pState->mnMask & (SAL_FRAMESTATE_MASK_X | SAL_FRAMESTATE_MASK_X) ) 627cdf0e10cSrcweir { 628cdf0e10cSrcweir mbPositioned = true; 629cdf0e10cSrcweir nEvent = SALEVENT_MOVE; 630cdf0e10cSrcweir } 631cdf0e10cSrcweir 632cdf0e10cSrcweir if( pState->mnMask & (SAL_FRAMESTATE_MASK_WIDTH | SAL_FRAMESTATE_MASK_HEIGHT) ) 633cdf0e10cSrcweir { 634cdf0e10cSrcweir mbSized = true; 635cdf0e10cSrcweir nEvent = (nEvent == SALEVENT_MOVE) ? SALEVENT_MOVERESIZE : SALEVENT_RESIZE; 636cdf0e10cSrcweir } 637cdf0e10cSrcweir // send event that we were moved/sized 638cdf0e10cSrcweir if( nEvent ) 639cdf0e10cSrcweir CallCallback( nEvent, NULL ); 640cdf0e10cSrcweir 641*bde8a4bdSHerbert Dürr if( mbShown && mpNSWindow ) 642cdf0e10cSrcweir { 643cdf0e10cSrcweir // trigger filling our backbuffer 644cdf0e10cSrcweir SendPaintEvent(); 645cdf0e10cSrcweir 646cdf0e10cSrcweir // tell the system the views need to be updated 647*bde8a4bdSHerbert Dürr [mpNSWindow display]; 648cdf0e10cSrcweir } 649cdf0e10cSrcweir } 650cdf0e10cSrcweir 651cdf0e10cSrcweir // ----------------------------------------------------------------------- 652cdf0e10cSrcweir 653cdf0e10cSrcweir sal_Bool AquaSalFrame::GetWindowState( SalFrameState* pState ) 654cdf0e10cSrcweir { 655*bde8a4bdSHerbert Dürr if ( !mpNSWindow ) 656cdf0e10cSrcweir return FALSE; 657cdf0e10cSrcweir 658cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 659cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 660cdf0e10cSrcweir 661cdf0e10cSrcweir pState->mnMask = SAL_FRAMESTATE_MASK_X | 662cdf0e10cSrcweir SAL_FRAMESTATE_MASK_Y | 663cdf0e10cSrcweir SAL_FRAMESTATE_MASK_WIDTH | 664cdf0e10cSrcweir SAL_FRAMESTATE_MASK_HEIGHT | 665cdf0e10cSrcweir #if 0 666cdf0e10cSrcweir SAL_FRAMESTATE_MASK_MAXIMIZED_X | 667cdf0e10cSrcweir SAL_FRAMESTATE_MASK_MAXIMIZED_Y | 668cdf0e10cSrcweir SAL_FRAMESTATE_MASK_MAXIMIZED_WIDTH | 669cdf0e10cSrcweir SAL_FRAMESTATE_MASK_MAXIMIZED_HEIGHT | 670cdf0e10cSrcweir #endif 671cdf0e10cSrcweir SAL_FRAMESTATE_MASK_STATE; 672cdf0e10cSrcweir 673*bde8a4bdSHerbert Dürr NSRect aStateRect = [mpNSWindow frame]; 674cdf0e10cSrcweir aStateRect = [NSWindow contentRectForFrameRect: aStateRect styleMask: mnStyleMask]; 675cdf0e10cSrcweir CocoaToVCL( aStateRect ); 676cdf0e10cSrcweir pState->mnX = long(aStateRect.origin.x); 677cdf0e10cSrcweir pState->mnY = long(aStateRect.origin.y); 678cdf0e10cSrcweir pState->mnWidth = long(aStateRect.size.width); 679cdf0e10cSrcweir pState->mnHeight = long(aStateRect.size.height); 680cdf0e10cSrcweir 681*bde8a4bdSHerbert Dürr if( [mpNSWindow isMiniaturized] ) 682cdf0e10cSrcweir pState->mnState = SAL_FRAMESTATE_MINIMIZED; 683*bde8a4bdSHerbert Dürr else if( ! [mpNSWindow isZoomed] ) 684cdf0e10cSrcweir pState->mnState = SAL_FRAMESTATE_NORMAL; 685cdf0e10cSrcweir else 686cdf0e10cSrcweir pState->mnState = SAL_FRAMESTATE_MAXIMIZED; 687cdf0e10cSrcweir 688cdf0e10cSrcweir return TRUE; 689cdf0e10cSrcweir } 690cdf0e10cSrcweir 691cdf0e10cSrcweir // ----------------------------------------------------------------------- 692cdf0e10cSrcweir 693cdf0e10cSrcweir void AquaSalFrame::SetScreenNumber(unsigned int nScreen) 694cdf0e10cSrcweir { 695*bde8a4bdSHerbert Dürr if ( !mpNSWindow ) 696cdf0e10cSrcweir return; 697cdf0e10cSrcweir 698cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 699cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 700cdf0e10cSrcweir 701cdf0e10cSrcweir NSArray* pScreens = [NSScreen screens]; 702cdf0e10cSrcweir Rectangle aRet; 703cdf0e10cSrcweir NSScreen* pScreen = nil; 704cdf0e10cSrcweir if( pScreens && nScreen < [pScreens count] ) 705cdf0e10cSrcweir { 706cdf0e10cSrcweir // get new screen frame 707cdf0e10cSrcweir pScreen = [pScreens objectAtIndex: nScreen]; 708cdf0e10cSrcweir NSRect aNewScreen = [pScreen frame]; 709cdf0e10cSrcweir 710cdf0e10cSrcweir // get current screen frame 711*bde8a4bdSHerbert Dürr pScreen = [mpNSWindow screen]; 712cdf0e10cSrcweir if( pScreen ) 713cdf0e10cSrcweir { 714cdf0e10cSrcweir NSRect aCurScreen = [pScreen frame]; 715cdf0e10cSrcweir if( aCurScreen.origin.x != aNewScreen.origin.x || 716cdf0e10cSrcweir aCurScreen.origin.y != aNewScreen.origin.y ) 717cdf0e10cSrcweir { 718*bde8a4bdSHerbert Dürr NSRect aFrameRect = [mpNSWindow frame]; 719cdf0e10cSrcweir aFrameRect.origin.x += aNewScreen.origin.x - aCurScreen.origin.x; 720cdf0e10cSrcweir aFrameRect.origin.y += aNewScreen.origin.y - aCurScreen.origin.y; 721*bde8a4bdSHerbert Dürr [mpNSWindow setFrame: aFrameRect display: NO]; 722cdf0e10cSrcweir UpdateFrameGeometry(); 723cdf0e10cSrcweir } 724cdf0e10cSrcweir } 725cdf0e10cSrcweir } 726cdf0e10cSrcweir } 727cdf0e10cSrcweir 728cdf0e10cSrcweir // ----------------------------------------------------------------------- 729cdf0e10cSrcweir 730cdf0e10cSrcweir void AquaSalFrame::ShowFullScreen( sal_Bool bFullScreen, sal_Int32 nDisplay ) 731cdf0e10cSrcweir { 732*bde8a4bdSHerbert Dürr if ( !mpNSWindow ) 733cdf0e10cSrcweir return; 734cdf0e10cSrcweir 735cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 736cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 737cdf0e10cSrcweir 738cdf0e10cSrcweir if( mbFullScreen == bFullScreen ) 739cdf0e10cSrcweir return; 740cdf0e10cSrcweir 741cdf0e10cSrcweir mbFullScreen = bFullScreen; 742cdf0e10cSrcweir if( bFullScreen ) 743cdf0e10cSrcweir { 744cdf0e10cSrcweir // hide the dock and the menubar if we are on the menu screen 745cdf0e10cSrcweir // which is always on index 0 according to documentation 746cdf0e10cSrcweir bool bHideMenu = (nDisplay == 0); 747cdf0e10cSrcweir 748cdf0e10cSrcweir NSRect aNewContentRect = { { 0, 0 }, { 0, 0 } }; 749cdf0e10cSrcweir // get correct screen 750cdf0e10cSrcweir NSScreen* pScreen = nil; 751cdf0e10cSrcweir NSArray* pScreens = [NSScreen screens]; 752cdf0e10cSrcweir if( pScreens ) 753cdf0e10cSrcweir { 754cdf0e10cSrcweir if( nDisplay >= 0 && (unsigned int)nDisplay < [pScreens count] ) 755cdf0e10cSrcweir pScreen = [pScreens objectAtIndex: nDisplay]; 756cdf0e10cSrcweir else 757cdf0e10cSrcweir { 758cdf0e10cSrcweir // this means span all screens 759cdf0e10cSrcweir bHideMenu = true; 760cdf0e10cSrcweir NSEnumerator* pEnum = [pScreens objectEnumerator]; 761cdf0e10cSrcweir while( (pScreen = [pEnum nextObject]) != nil ) 762cdf0e10cSrcweir { 763cdf0e10cSrcweir NSRect aScreenRect = [pScreen frame]; 764cdf0e10cSrcweir if( aScreenRect.origin.x < aNewContentRect.origin.x ) 765cdf0e10cSrcweir { 766cdf0e10cSrcweir aNewContentRect.size.width += aNewContentRect.origin.x - aScreenRect.origin.x; 767cdf0e10cSrcweir aNewContentRect.origin.x = aScreenRect.origin.x; 768cdf0e10cSrcweir } 769cdf0e10cSrcweir if( aScreenRect.origin.y < aNewContentRect.origin.y ) 770cdf0e10cSrcweir { 771cdf0e10cSrcweir aNewContentRect.size.height += aNewContentRect.origin.y - aScreenRect.origin.y; 772cdf0e10cSrcweir aNewContentRect.origin.y = aScreenRect.origin.y; 773cdf0e10cSrcweir } 774cdf0e10cSrcweir if( aScreenRect.origin.x + aScreenRect.size.width > aNewContentRect.origin.x + aNewContentRect.size.width ) 775cdf0e10cSrcweir aNewContentRect.size.width = aScreenRect.origin.x + aScreenRect.size.width - aNewContentRect.origin.x; 776cdf0e10cSrcweir if( aScreenRect.origin.y + aScreenRect.size.height > aNewContentRect.origin.y + aNewContentRect.size.height ) 777cdf0e10cSrcweir aNewContentRect.size.height = aScreenRect.origin.y + aScreenRect.size.height - aNewContentRect.origin.y; 778cdf0e10cSrcweir } 779cdf0e10cSrcweir } 780cdf0e10cSrcweir } 781cdf0e10cSrcweir if( aNewContentRect.size.width == 0 && aNewContentRect.size.height == 0 ) 782cdf0e10cSrcweir { 783cdf0e10cSrcweir if( pScreen == nil ) 784*bde8a4bdSHerbert Dürr pScreen = [mpNSWindow screen]; 785cdf0e10cSrcweir if( pScreen == nil ) 786cdf0e10cSrcweir pScreen = [NSScreen mainScreen]; 787cdf0e10cSrcweir 788cdf0e10cSrcweir aNewContentRect = [pScreen frame]; 789cdf0e10cSrcweir } 790cdf0e10cSrcweir 791cdf0e10cSrcweir if( bHideMenu ) 792cdf0e10cSrcweir [NSMenu setMenuBarVisible:NO]; 793cdf0e10cSrcweir 794*bde8a4bdSHerbert Dürr maFullScreenRect = [mpNSWindow frame]; 795cdf0e10cSrcweir { 796*bde8a4bdSHerbert Dürr [mpNSWindow setFrame: [NSWindow frameRectForContentRect: aNewContentRect styleMask: mnStyleMask] display: mbShown ? YES : NO]; 797cdf0e10cSrcweir } 798cdf0e10cSrcweir 799cdf0e10cSrcweir UpdateFrameGeometry(); 800cdf0e10cSrcweir 801cdf0e10cSrcweir if( mbShown ) 802cdf0e10cSrcweir CallCallback( SALEVENT_MOVERESIZE, NULL ); 803cdf0e10cSrcweir } 804cdf0e10cSrcweir else 805cdf0e10cSrcweir { 806cdf0e10cSrcweir { 807*bde8a4bdSHerbert Dürr [mpNSWindow setFrame: maFullScreenRect display: mbShown ? YES : NO]; 808cdf0e10cSrcweir } 809cdf0e10cSrcweir UpdateFrameGeometry(); 810cdf0e10cSrcweir 811cdf0e10cSrcweir if( mbShown ) 812cdf0e10cSrcweir CallCallback( SALEVENT_MOVERESIZE, NULL ); 813cdf0e10cSrcweir 814cdf0e10cSrcweir // show the dock and the menubar 815cdf0e10cSrcweir [NSMenu setMenuBarVisible:YES]; 816cdf0e10cSrcweir } 817cdf0e10cSrcweir if( mbShown ) 818cdf0e10cSrcweir // trigger filling our backbuffer 819cdf0e10cSrcweir SendPaintEvent(); 820cdf0e10cSrcweir } 821cdf0e10cSrcweir 822cdf0e10cSrcweir // ----------------------------------------------------------------------- 823cdf0e10cSrcweir 824cdf0e10cSrcweir class PreventSleepTimer : public AutoTimer 825cdf0e10cSrcweir { 826cdf0e10cSrcweir public: 827cdf0e10cSrcweir PreventSleepTimer() 828cdf0e10cSrcweir { 829cdf0e10cSrcweir SetTimeout( 30000 ); 830cdf0e10cSrcweir Start(); 831cdf0e10cSrcweir } 832cdf0e10cSrcweir 833cdf0e10cSrcweir virtual ~PreventSleepTimer() 834cdf0e10cSrcweir { 835cdf0e10cSrcweir } 836cdf0e10cSrcweir 837cdf0e10cSrcweir virtual void Timeout() 838cdf0e10cSrcweir { 839cdf0e10cSrcweir UpdateSystemActivity(OverallAct); 840cdf0e10cSrcweir } 841cdf0e10cSrcweir }; 842cdf0e10cSrcweir 843cdf0e10cSrcweir void AquaSalFrame::StartPresentation( sal_Bool bStart ) 844cdf0e10cSrcweir { 845*bde8a4bdSHerbert Dürr if ( !mpNSWindow ) 846cdf0e10cSrcweir return; 847cdf0e10cSrcweir 848cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 849cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 850cdf0e10cSrcweir 851cdf0e10cSrcweir if( bStart ) 852cdf0e10cSrcweir { 853ff005604SEike Rathke GetSalData()->maPresentationFrames.push_back( this ); 854cdf0e10cSrcweir mpActivityTimer.reset( new PreventSleepTimer() ); 855*bde8a4bdSHerbert Dürr [mpNSWindow setLevel: NSPopUpMenuWindowLevel]; 856cdf0e10cSrcweir if( mbShown ) 857*bde8a4bdSHerbert Dürr [mpNSWindow makeMainWindow]; 858cdf0e10cSrcweir } 859cdf0e10cSrcweir else 860cdf0e10cSrcweir { 861ff005604SEike Rathke GetSalData()->maPresentationFrames.remove( this ); 862cdf0e10cSrcweir mpActivityTimer.reset(); 863*bde8a4bdSHerbert Dürr [mpNSWindow setLevel: NSNormalWindowLevel]; 864cdf0e10cSrcweir } 865cdf0e10cSrcweir } 866cdf0e10cSrcweir 867cdf0e10cSrcweir // ----------------------------------------------------------------------- 868cdf0e10cSrcweir 869cdf0e10cSrcweir void AquaSalFrame::SetAlwaysOnTop( sal_Bool ) 870cdf0e10cSrcweir { 871cdf0e10cSrcweir } 872cdf0e10cSrcweir 873cdf0e10cSrcweir // ----------------------------------------------------------------------- 874cdf0e10cSrcweir 875cdf0e10cSrcweir void AquaSalFrame::ToTop(sal_uInt16 nFlags) 876cdf0e10cSrcweir { 877*bde8a4bdSHerbert Dürr if ( !mpNSWindow ) 878cdf0e10cSrcweir return; 879cdf0e10cSrcweir 880cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 881cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 882cdf0e10cSrcweir 883cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 884cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 885cdf0e10cSrcweir 886cdf0e10cSrcweir if( ! (nFlags & SAL_FRAME_TOTOP_RESTOREWHENMIN) ) 887cdf0e10cSrcweir { 888*bde8a4bdSHerbert Dürr if( ! [mpNSWindow isVisible] || [mpNSWindow isMiniaturized] ) 889cdf0e10cSrcweir return; 890cdf0e10cSrcweir } 891cdf0e10cSrcweir if( nFlags & SAL_FRAME_TOTOP_GRABFOCUS ) 892*bde8a4bdSHerbert Dürr [mpNSWindow makeKeyAndOrderFront: NSApp]; 893cdf0e10cSrcweir else 894*bde8a4bdSHerbert Dürr [mpNSWindow orderFront: NSApp]; 895cdf0e10cSrcweir } 896cdf0e10cSrcweir 897cdf0e10cSrcweir // ----------------------------------------------------------------------- 898cdf0e10cSrcweir 899cdf0e10cSrcweir NSCursor* AquaSalFrame::getCurrentCursor() const 900cdf0e10cSrcweir { 901cdf0e10cSrcweir NSCursor* pCursor = nil; 902cdf0e10cSrcweir switch( mePointerStyle ) 903cdf0e10cSrcweir { 904cdf0e10cSrcweir case POINTER_TEXT: pCursor = [NSCursor IBeamCursor]; break; 905cdf0e10cSrcweir case POINTER_CROSS: pCursor = [NSCursor crosshairCursor]; break; 906cdf0e10cSrcweir case POINTER_HAND: 907cdf0e10cSrcweir case POINTER_MOVE: pCursor = [NSCursor openHandCursor]; break; 908cdf0e10cSrcweir case POINTER_NSIZE: pCursor = [NSCursor resizeUpCursor]; break; 909cdf0e10cSrcweir case POINTER_SSIZE: pCursor = [NSCursor resizeDownCursor]; break; 910cdf0e10cSrcweir case POINTER_ESIZE: pCursor = [NSCursor resizeRightCursor]; break; 911cdf0e10cSrcweir case POINTER_WSIZE: pCursor = [NSCursor resizeLeftCursor]; break; 912cdf0e10cSrcweir case POINTER_ARROW: pCursor = [NSCursor arrowCursor]; break; 913cdf0e10cSrcweir case POINTER_VSPLIT: 914cdf0e10cSrcweir case POINTER_VSIZEBAR: 915cdf0e10cSrcweir case POINTER_WINDOW_NSIZE: 916cdf0e10cSrcweir case POINTER_WINDOW_SSIZE: 917cdf0e10cSrcweir pCursor = [NSCursor resizeUpDownCursor]; break; 918cdf0e10cSrcweir case POINTER_HSPLIT: 919cdf0e10cSrcweir case POINTER_HSIZEBAR: 920cdf0e10cSrcweir case POINTER_WINDOW_ESIZE: 921cdf0e10cSrcweir case POINTER_WINDOW_WSIZE: 922cdf0e10cSrcweir pCursor = [NSCursor resizeLeftRightCursor]; break; 923cdf0e10cSrcweir case POINTER_REFHAND: pCursor = [NSCursor pointingHandCursor]; break; 924cdf0e10cSrcweir 925cdf0e10cSrcweir default: 926cdf0e10cSrcweir pCursor = GetSalData()->getCursor( mePointerStyle ); 927cdf0e10cSrcweir if( pCursor == nil ) 928cdf0e10cSrcweir { 929cdf0e10cSrcweir DBG_ERROR( "unmapped cursor" ); 930cdf0e10cSrcweir pCursor = [NSCursor arrowCursor]; 931cdf0e10cSrcweir } 932cdf0e10cSrcweir break; 933cdf0e10cSrcweir } 934cdf0e10cSrcweir return pCursor; 935cdf0e10cSrcweir } 936cdf0e10cSrcweir 937cdf0e10cSrcweir void AquaSalFrame::SetPointer( PointerStyle ePointerStyle ) 938cdf0e10cSrcweir { 939*bde8a4bdSHerbert Dürr if ( !mpNSWindow ) 940cdf0e10cSrcweir return; 941cdf0e10cSrcweir 942cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 943cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 944cdf0e10cSrcweir 945cdf0e10cSrcweir if( ePointerStyle >= POINTER_COUNT || ePointerStyle == mePointerStyle ) 946cdf0e10cSrcweir return; 947cdf0e10cSrcweir mePointerStyle = ePointerStyle; 948cdf0e10cSrcweir 949*bde8a4bdSHerbert Dürr [mpNSWindow invalidateCursorRectsForView: mpNSView]; 950cdf0e10cSrcweir } 951cdf0e10cSrcweir 952cdf0e10cSrcweir // ----------------------------------------------------------------------- 953cdf0e10cSrcweir 954cdf0e10cSrcweir void AquaSalFrame::SetPointerPos( long nX, long nY ) 955cdf0e10cSrcweir { 956cdf0e10cSrcweir // FIXME: use Cocoa functions 957cdf0e10cSrcweir 958cdf0e10cSrcweir // FIXME: multiscreen support 959cd426cceSHerbert Dürr const CGPoint aPoint = CGPointMake( nX + maGeometry.nX, nY + maGeometry.nY); 960cdf0e10cSrcweir CGDirectDisplayID mainDisplayID = CGMainDisplayID(); 961cdf0e10cSrcweir CGDisplayMoveCursorToPoint( mainDisplayID, aPoint ); 962cdf0e10cSrcweir } 963cdf0e10cSrcweir 964cdf0e10cSrcweir // ----------------------------------------------------------------------- 965cdf0e10cSrcweir 966cdf0e10cSrcweir void AquaSalFrame::Flush( void ) 967cdf0e10cSrcweir { 968*bde8a4bdSHerbert Dürr if( !(mbGraphics && mpGraphics && mpNSView && mbShown) ) 969cdf0e10cSrcweir return; 970cdf0e10cSrcweir 971cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 972cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 973cdf0e10cSrcweir 974cdf0e10cSrcweir 975*bde8a4bdSHerbert Dürr [mpNSView setNeedsDisplay: YES]; 976cdf0e10cSrcweir 977cdf0e10cSrcweir // outside of the application's event loop (e.g. IntroWindow) 978cdf0e10cSrcweir // nothing would trigger paint event handling 979cdf0e10cSrcweir // => fall back to synchronous painting 980cdf0e10cSrcweir if( ImplGetSVData()->maAppData.mnDispatchLevel <= 0 ) 981cdf0e10cSrcweir { 982*bde8a4bdSHerbert Dürr [mpNSView display]; 983cdf0e10cSrcweir } 984cdf0e10cSrcweir } 985cdf0e10cSrcweir 986cdf0e10cSrcweir // ----------------------------------------------------------------------- 987cdf0e10cSrcweir 988cdf0e10cSrcweir void AquaSalFrame::Flush( const Rectangle& rRect ) 989cdf0e10cSrcweir { 990*bde8a4bdSHerbert Dürr if( !(mbGraphics && mpGraphics && mpNSView && mbShown) ) 991cdf0e10cSrcweir return; 992cdf0e10cSrcweir 993cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 994cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 995cdf0e10cSrcweir 996cd426cceSHerbert Dürr NSRect aNSRect = NSMakeRect( rRect.Left(), rRect.Top(), rRect.GetWidth(), rRect.GetHeight()); 997cdf0e10cSrcweir VCLToCocoa( aNSRect, false ); 998*bde8a4bdSHerbert Dürr [mpNSView setNeedsDisplayInRect: aNSRect]; 999cdf0e10cSrcweir 1000cdf0e10cSrcweir // outside of the application's event loop (e.g. IntroWindow) 1001cdf0e10cSrcweir // nothing would trigger paint event handling 1002cdf0e10cSrcweir // => fall back to synchronous painting 1003cdf0e10cSrcweir if( ImplGetSVData()->maAppData.mnDispatchLevel <= 0 ) 1004cdf0e10cSrcweir { 1005*bde8a4bdSHerbert Dürr [mpNSView display]; 1006cdf0e10cSrcweir } 1007cdf0e10cSrcweir } 1008cdf0e10cSrcweir 1009cdf0e10cSrcweir // ----------------------------------------------------------------------- 1010cdf0e10cSrcweir 1011cdf0e10cSrcweir void AquaSalFrame::Sync() 1012cdf0e10cSrcweir { 1013*bde8a4bdSHerbert Dürr if( mbGraphics && mpGraphics && mpNSView && mbShown ) 1014cdf0e10cSrcweir { 1015cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 1016cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 1017cdf0e10cSrcweir 1018*bde8a4bdSHerbert Dürr [mpNSView setNeedsDisplay: YES]; 1019*bde8a4bdSHerbert Dürr [mpNSView display]; 1020cdf0e10cSrcweir } 1021cdf0e10cSrcweir } 1022cdf0e10cSrcweir 1023cdf0e10cSrcweir // ----------------------------------------------------------------------- 1024cdf0e10cSrcweir 1025cdf0e10cSrcweir void AquaSalFrame::SetInputContext( SalInputContext* pContext ) 1026cdf0e10cSrcweir { 1027cdf0e10cSrcweir if (!pContext) 1028cdf0e10cSrcweir { 1029cdf0e10cSrcweir mnICOptions = 0; 1030cdf0e10cSrcweir return; 1031cdf0e10cSrcweir } 1032cdf0e10cSrcweir 1033cdf0e10cSrcweir mnICOptions = pContext->mnOptions; 1034cdf0e10cSrcweir 1035cdf0e10cSrcweir if(!(pContext->mnOptions & SAL_INPUTCONTEXT_TEXT)) 1036cdf0e10cSrcweir return; 1037cdf0e10cSrcweir } 1038cdf0e10cSrcweir 1039cdf0e10cSrcweir // ----------------------------------------------------------------------- 1040cdf0e10cSrcweir 1041cdf0e10cSrcweir void AquaSalFrame::EndExtTextInput( sal_uInt16 ) 1042cdf0e10cSrcweir { 1043cdf0e10cSrcweir } 1044cdf0e10cSrcweir 1045cdf0e10cSrcweir // ----------------------------------------------------------------------- 1046cdf0e10cSrcweir 1047cdf0e10cSrcweir XubString AquaSalFrame::GetKeyName( sal_uInt16 nKeyCode ) 1048cdf0e10cSrcweir { 1049cdf0e10cSrcweir static std::map< sal_uInt16, rtl::OUString > aKeyMap; 1050cdf0e10cSrcweir if( aKeyMap.empty() ) 1051cdf0e10cSrcweir { 1052cdf0e10cSrcweir sal_uInt16 i; 1053cdf0e10cSrcweir for( i = KEY_A; i <= KEY_Z; i++ ) 1054cdf0e10cSrcweir aKeyMap[ i ] = rtl::OUString( sal_Unicode( 'A' + (i - KEY_A) ) ); 1055cdf0e10cSrcweir for( i = KEY_0; i <= KEY_9; i++ ) 1056cdf0e10cSrcweir aKeyMap[ i ] = rtl::OUString( sal_Unicode( '0' + (i - KEY_0) ) ); 1057cdf0e10cSrcweir for( i = KEY_F1; i <= KEY_F26; i++ ) 1058cdf0e10cSrcweir { 1059cdf0e10cSrcweir rtl::OUStringBuffer aKey( 3 ); 1060cdf0e10cSrcweir aKey.append( sal_Unicode( 'F' ) ); 1061cdf0e10cSrcweir aKey.append( sal_Int32( i - KEY_F1 + 1 ) ); 1062cdf0e10cSrcweir aKeyMap[ i ] = aKey.makeStringAndClear(); 1063cdf0e10cSrcweir } 1064cdf0e10cSrcweir 1065cdf0e10cSrcweir aKeyMap[ KEY_DOWN ] = rtl::OUString( sal_Unicode( 0x21e3 ) ); 1066cdf0e10cSrcweir aKeyMap[ KEY_UP ] = rtl::OUString( sal_Unicode( 0x21e1 ) ); 1067cdf0e10cSrcweir aKeyMap[ KEY_LEFT ] = rtl::OUString( sal_Unicode( 0x21e0 ) ); 1068cdf0e10cSrcweir aKeyMap[ KEY_RIGHT ] = rtl::OUString( sal_Unicode( 0x21e2 ) ); 1069cdf0e10cSrcweir aKeyMap[ KEY_HOME ] = rtl::OUString( sal_Unicode( 0x2196 ) ); 1070cdf0e10cSrcweir aKeyMap[ KEY_END ] = rtl::OUString( sal_Unicode( 0x2198 ) ); 1071cdf0e10cSrcweir aKeyMap[ KEY_PAGEUP ] = rtl::OUString( sal_Unicode( 0x21de ) ); 1072cdf0e10cSrcweir aKeyMap[ KEY_PAGEDOWN ] = rtl::OUString( sal_Unicode( 0x21df ) ); 1073cdf0e10cSrcweir aKeyMap[ KEY_RETURN ] = rtl::OUString( sal_Unicode( 0x21a9 ) ); 1074cdf0e10cSrcweir aKeyMap[ KEY_ESCAPE ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "esc" ) ); 1075cdf0e10cSrcweir aKeyMap[ KEY_TAB ] = rtl::OUString( sal_Unicode( 0x21e5 ) ); 1076cdf0e10cSrcweir aKeyMap[ KEY_BACKSPACE ]= rtl::OUString( sal_Unicode( 0x232b ) ); 1077cdf0e10cSrcweir aKeyMap[ KEY_SPACE ] = rtl::OUString( sal_Unicode( 0x2423 ) ); 1078cdf0e10cSrcweir aKeyMap[ KEY_DELETE ] = rtl::OUString( sal_Unicode( 0x2326 ) ); 1079cdf0e10cSrcweir aKeyMap[ KEY_ADD ] = rtl::OUString( sal_Unicode( '+' ) ); 1080cdf0e10cSrcweir aKeyMap[ KEY_SUBTRACT ] = rtl::OUString( sal_Unicode( '-' ) ); 1081cdf0e10cSrcweir aKeyMap[ KEY_DIVIDE ] = rtl::OUString( sal_Unicode( '/' ) ); 1082cdf0e10cSrcweir aKeyMap[ KEY_MULTIPLY ] = rtl::OUString( sal_Unicode( '*' ) ); 1083cdf0e10cSrcweir aKeyMap[ KEY_POINT ] = rtl::OUString( sal_Unicode( '.' ) ); 1084cdf0e10cSrcweir aKeyMap[ KEY_COMMA ] = rtl::OUString( sal_Unicode( ',' ) ); 1085cdf0e10cSrcweir aKeyMap[ KEY_LESS ] = rtl::OUString( sal_Unicode( '<' ) ); 1086cdf0e10cSrcweir aKeyMap[ KEY_GREATER ] = rtl::OUString( sal_Unicode( '>' ) ); 1087cdf0e10cSrcweir aKeyMap[ KEY_EQUAL ] = rtl::OUString( sal_Unicode( '=' ) ); 1088cdf0e10cSrcweir aKeyMap[ KEY_OPEN ] = rtl::OUString( sal_Unicode( 0x23cf ) ); 1089cdf0e10cSrcweir 1090cdf0e10cSrcweir /* yet unmapped KEYCODES: 1091cdf0e10cSrcweir aKeyMap[ KEY_INSERT ] = rtl::OUString( sal_Unicode( ) ); 1092cdf0e10cSrcweir aKeyMap[ KEY_CUT ] = rtl::OUString( sal_Unicode( ) ); 1093cdf0e10cSrcweir aKeyMap[ KEY_COPY ] = rtl::OUString( sal_Unicode( ) ); 1094cdf0e10cSrcweir aKeyMap[ KEY_PASTE ] = rtl::OUString( sal_Unicode( ) ); 1095cdf0e10cSrcweir aKeyMap[ KEY_UNDO ] = rtl::OUString( sal_Unicode( ) ); 1096cdf0e10cSrcweir aKeyMap[ KEY_REPEAT ] = rtl::OUString( sal_Unicode( ) ); 1097cdf0e10cSrcweir aKeyMap[ KEY_FIND ] = rtl::OUString( sal_Unicode( ) ); 1098cdf0e10cSrcweir aKeyMap[ KEY_PROPERTIES ] = rtl::OUString( sal_Unicode( ) ); 1099cdf0e10cSrcweir aKeyMap[ KEY_FRONT ] = rtl::OUString( sal_Unicode( ) ); 1100cdf0e10cSrcweir aKeyMap[ KEY_CONTEXTMENU ] = rtl::OUString( sal_Unicode( ) ); 1101cdf0e10cSrcweir aKeyMap[ KEY_MENU ] = rtl::OUString( sal_Unicode( ) ); 1102cdf0e10cSrcweir aKeyMap[ KEY_HELP ] = rtl::OUString( sal_Unicode( ) ); 1103cdf0e10cSrcweir aKeyMap[ KEY_HANGUL_HANJA ] = rtl::OUString( sal_Unicode( ) ); 1104cdf0e10cSrcweir aKeyMap[ KEY_DECIMAL ] = rtl::OUString( sal_Unicode( ) ); 1105cdf0e10cSrcweir aKeyMap[ KEY_TILDE ] = rtl::OUString( sal_Unicode( ) ); 1106cdf0e10cSrcweir aKeyMap[ KEY_QUOTELEFT ]= rtl::OUString( sal_Unicode( ) ); 1107cdf0e10cSrcweir */ 1108cdf0e10cSrcweir 1109cdf0e10cSrcweir } 1110cdf0e10cSrcweir 1111cdf0e10cSrcweir rtl::OUStringBuffer aResult( 16 ); 1112cdf0e10cSrcweir 1113cdf0e10cSrcweir sal_uInt16 nUnmodifiedCode = (nKeyCode & KEY_CODE); 1114cdf0e10cSrcweir std::map< sal_uInt16, rtl::OUString >::const_iterator it = aKeyMap.find( nUnmodifiedCode ); 1115cdf0e10cSrcweir if( it != aKeyMap.end() ) 1116cdf0e10cSrcweir { 1117cdf0e10cSrcweir if( (nKeyCode & KEY_SHIFT) != 0 ) 1118cdf0e10cSrcweir aResult.append( sal_Unicode( 0x21e7 ) ); 1119cdf0e10cSrcweir if( (nKeyCode & KEY_MOD1) != 0 ) 1120cdf0e10cSrcweir aResult.append( sal_Unicode( 0x2318 ) ); 1121cdf0e10cSrcweir // we do not really handle Alt (see below) 1122cdf0e10cSrcweir // we map it to MOD3, whichis actually Command 1123cdf0e10cSrcweir if( (nKeyCode & (KEY_MOD2|KEY_MOD3)) != 0 ) 1124cdf0e10cSrcweir aResult.append( sal_Unicode( 0x2303 ) ); 1125cdf0e10cSrcweir 1126cdf0e10cSrcweir aResult.append( it->second ); 1127cdf0e10cSrcweir } 1128cdf0e10cSrcweir 1129cdf0e10cSrcweir return aResult.makeStringAndClear(); 1130cdf0e10cSrcweir } 1131cdf0e10cSrcweir 1132cdf0e10cSrcweir // ----------------------------------------------------------------------- 1133cdf0e10cSrcweir 1134cdf0e10cSrcweir XubString AquaSalFrame::GetSymbolKeyName( const XubString&, sal_uInt16 nKeyCode ) 1135cdf0e10cSrcweir { 1136cdf0e10cSrcweir return GetKeyName( nKeyCode ); 1137cdf0e10cSrcweir } 1138cdf0e10cSrcweir 1139cdf0e10cSrcweir // ----------------------------------------------------------------------- 1140cdf0e10cSrcweir 1141cdf0e10cSrcweir static void getAppleScrollBarVariant(void) 1142cdf0e10cSrcweir { 1143cdf0e10cSrcweir bool bIsScrollbarDoubleMax = true; // default is DoubleMax 1144cdf0e10cSrcweir 1145cdf0e10cSrcweir CFStringRef AppleScrollBarType = CFSTR("AppleScrollBarVariant"); 1146cdf0e10cSrcweir if( AppleScrollBarType ) 1147cdf0e10cSrcweir { 1148cdf0e10cSrcweir CFStringRef ScrollBarVariant = ((CFStringRef)CFPreferencesCopyAppValue( AppleScrollBarType, kCFPreferencesCurrentApplication )); 1149cdf0e10cSrcweir if( ScrollBarVariant ) 1150cdf0e10cSrcweir { 1151cdf0e10cSrcweir if( CFGetTypeID( ScrollBarVariant ) == CFStringGetTypeID() ) 1152cdf0e10cSrcweir { 1153cdf0e10cSrcweir // TODO: check for the less important variants "DoubleMin" and "DoubleBoth" too 1154cdf0e10cSrcweir CFStringRef DoubleMax = CFSTR("DoubleMax"); 1155cdf0e10cSrcweir if (DoubleMax) 1156cdf0e10cSrcweir { 1157cdf0e10cSrcweir if ( !CFStringCompare(ScrollBarVariant, DoubleMax, kCFCompareCaseInsensitive) ) 1158cdf0e10cSrcweir bIsScrollbarDoubleMax = true; 1159cdf0e10cSrcweir else 1160cdf0e10cSrcweir bIsScrollbarDoubleMax = false; 1161cdf0e10cSrcweir CFRelease(DoubleMax); 1162cdf0e10cSrcweir } 1163cdf0e10cSrcweir } 1164cdf0e10cSrcweir CFRelease( ScrollBarVariant ); 1165cdf0e10cSrcweir } 1166cdf0e10cSrcweir CFRelease(AppleScrollBarType); 1167cdf0e10cSrcweir } 1168cdf0e10cSrcweir 1169cdf0e10cSrcweir GetSalData()->mbIsScrollbarDoubleMax = bIsScrollbarDoubleMax; 1170cdf0e10cSrcweir 1171cdf0e10cSrcweir CFStringRef jumpScroll = CFSTR("AppleScrollerPagingBehavior"); 1172cdf0e10cSrcweir if( jumpScroll ) 1173cdf0e10cSrcweir { 1174cdf0e10cSrcweir CFBooleanRef jumpStr = ((CFBooleanRef)CFPreferencesCopyAppValue( jumpScroll, kCFPreferencesCurrentApplication )); 1175cdf0e10cSrcweir if( jumpStr ) 1176cdf0e10cSrcweir { 1177cdf0e10cSrcweir if( CFGetTypeID( jumpStr ) == CFBooleanGetTypeID() ) 1178cdf0e10cSrcweir ImplGetSVData()->maNWFData.mbScrollbarJumpPage = (jumpStr == kCFBooleanTrue); 1179cdf0e10cSrcweir CFRelease( jumpStr ); 1180cdf0e10cSrcweir } 1181cdf0e10cSrcweir CFRelease( jumpScroll ); 1182cdf0e10cSrcweir } 1183cdf0e10cSrcweir } 1184cdf0e10cSrcweir 1185cdf0e10cSrcweir static Color getColor( NSColor* pSysColor, const Color& rDefault, NSWindow* pWin ) 1186cdf0e10cSrcweir { 1187cdf0e10cSrcweir Color aRet( rDefault ); 1188cdf0e10cSrcweir if( pSysColor ) 1189cdf0e10cSrcweir { 1190cdf0e10cSrcweir // transform to RGB 1191cdf0e10cSrcweir NSColor* pRBGColor = [pSysColor colorUsingColorSpaceName: NSDeviceRGBColorSpace device: [pWin deviceDescription]]; 1192cdf0e10cSrcweir if( pRBGColor ) 1193cdf0e10cSrcweir { 1194cdf0e10cSrcweir float r = 0, g = 0, b = 0, a = 0; 1195cdf0e10cSrcweir [pRBGColor getRed: &r green: &g blue: &b alpha: &a]; 1196cdf0e10cSrcweir aRet = Color( int(r*255.999), int(g*255.999), int(b*255.999) ); 1197cdf0e10cSrcweir /* 1198cdf0e10cSrcweir do not release here; leads to duplicate free in yield 1199cdf0e10cSrcweir it seems the converted color comes out autoreleased, although this 1200cdf0e10cSrcweir is not documented 1201cdf0e10cSrcweir [pRBGColor release]; 1202cdf0e10cSrcweir */ 1203cdf0e10cSrcweir } 1204cdf0e10cSrcweir } 1205cdf0e10cSrcweir return aRet; 1206cdf0e10cSrcweir } 1207cdf0e10cSrcweir 1208cdf0e10cSrcweir static Font getFont( NSFont* pFont, long nDPIY, const Font& rDefault ) 1209cdf0e10cSrcweir { 1210cdf0e10cSrcweir Font aResult( rDefault ); 1211cdf0e10cSrcweir if( pFont ) 1212cdf0e10cSrcweir { 1213cdf0e10cSrcweir aResult.SetName( GetOUString( [pFont familyName] ) ); 1214cdf0e10cSrcweir aResult.SetHeight( static_cast<int>(([pFont pointSize] * 72.0 / (float)nDPIY)+0.5) ); 1215cdf0e10cSrcweir aResult.SetItalic( ([pFont italicAngle] != 0.0) ? ITALIC_NORMAL : ITALIC_NONE ); 1216cdf0e10cSrcweir // FIMXE: bold ? 1217cdf0e10cSrcweir } 1218cdf0e10cSrcweir 1219cdf0e10cSrcweir return aResult; 1220cdf0e10cSrcweir } 1221cdf0e10cSrcweir 1222cdf0e10cSrcweir void AquaSalFrame::getResolution( long& o_rDPIX, long& o_rDPIY ) 1223cdf0e10cSrcweir { 1224cdf0e10cSrcweir if( ! mpGraphics ) 1225cdf0e10cSrcweir { 1226cdf0e10cSrcweir GetGraphics(); 1227cdf0e10cSrcweir ReleaseGraphics( mpGraphics ); 1228cdf0e10cSrcweir } 1229cdf0e10cSrcweir mpGraphics->GetResolution( o_rDPIX, o_rDPIY ); 1230cdf0e10cSrcweir } 1231cdf0e10cSrcweir 1232cdf0e10cSrcweir // on OSX-Aqua the style settings are independent of the frame, so it does 1233cdf0e10cSrcweir // not really belong here. Since the connection to the Appearance_Manager 1234cdf0e10cSrcweir // is currently done in salnativewidgets.cxx this would be a good place. 1235cdf0e10cSrcweir // On the other hand VCL's platform independent code currently only asks 1236cdf0e10cSrcweir // SalFrames for system settings anyway, so moving the code somewhere else 1237cdf0e10cSrcweir // doesn't make the anything cleaner for now 1238cdf0e10cSrcweir void AquaSalFrame::UpdateSettings( AllSettings& rSettings ) 1239cdf0e10cSrcweir { 1240*bde8a4bdSHerbert Dürr if ( !mpNSWindow ) 1241cdf0e10cSrcweir return; 1242cdf0e10cSrcweir 1243cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 1244cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 1245cdf0e10cSrcweir 1246*bde8a4bdSHerbert Dürr [mpNSView lockFocus]; 1247cdf0e10cSrcweir 1248cdf0e10cSrcweir StyleSettings aStyleSettings = rSettings.GetStyleSettings(); 1249cdf0e10cSrcweir 1250cdf0e10cSrcweir // Background Color 1251cdf0e10cSrcweir Color aBackgroundColor = Color( 0xEC, 0xEC, 0xEC ); 1252cdf0e10cSrcweir aStyleSettings.Set3DColors( aBackgroundColor ); 1253cdf0e10cSrcweir aStyleSettings.SetFaceColor( aBackgroundColor ); 1254cdf0e10cSrcweir Color aInactiveTabColor( aBackgroundColor ); 1255cdf0e10cSrcweir aInactiveTabColor.DecreaseLuminance( 32 ); 1256cdf0e10cSrcweir aStyleSettings.SetInactiveTabColor( aInactiveTabColor ); 1257cdf0e10cSrcweir 1258cdf0e10cSrcweir aStyleSettings.SetDialogColor( aBackgroundColor ); 1259cdf0e10cSrcweir aStyleSettings.SetLightBorderColor( aBackgroundColor ); 1260cdf0e10cSrcweir Color aShadowColor( aStyleSettings.GetShadowColor() ); 1261cdf0e10cSrcweir aStyleSettings.SetDarkShadowColor( aShadowColor ); 1262cdf0e10cSrcweir aShadowColor.IncreaseLuminance( 32 ); 1263cdf0e10cSrcweir aStyleSettings.SetShadowColor( aShadowColor ); 1264cdf0e10cSrcweir 1265cdf0e10cSrcweir // get the system font settings 1266cdf0e10cSrcweir Font aAppFont = aStyleSettings.GetAppFont(); 1267cdf0e10cSrcweir long nDPIX = 72, nDPIY = 72; 1268cdf0e10cSrcweir getResolution( nDPIX, nDPIY ); 1269cdf0e10cSrcweir aAppFont = getFont( [NSFont systemFontOfSize: 0], nDPIY, aAppFont ); 1270cdf0e10cSrcweir 1271cdf0e10cSrcweir // TODO: better mapping of aqua<->ooo font settings 1272cdf0e10cSrcweir aStyleSettings.SetAppFont( aAppFont ); 1273cdf0e10cSrcweir aStyleSettings.SetHelpFont( aAppFont ); 1274cdf0e10cSrcweir aStyleSettings.SetPushButtonFont( aAppFont ); 1275cdf0e10cSrcweir 1276cdf0e10cSrcweir Font aTitleFont( getFont( [NSFont titleBarFontOfSize: 0], nDPIY, aAppFont ) ); 1277cdf0e10cSrcweir aStyleSettings.SetTitleFont( aTitleFont ); 1278cdf0e10cSrcweir aStyleSettings.SetFloatTitleFont( aTitleFont ); 1279cdf0e10cSrcweir 1280cdf0e10cSrcweir Font aMenuFont( getFont( [NSFont menuFontOfSize: 0], nDPIY, aAppFont ) ); 1281cdf0e10cSrcweir aStyleSettings.SetMenuFont( aMenuFont ); 1282cdf0e10cSrcweir 1283cdf0e10cSrcweir aStyleSettings.SetToolFont( aAppFont ); 1284cdf0e10cSrcweir 1285cdf0e10cSrcweir Font aLabelFont( getFont( [NSFont labelFontOfSize: 0], nDPIY, aAppFont ) ); 1286cdf0e10cSrcweir aStyleSettings.SetLabelFont( aLabelFont ); 1287cdf0e10cSrcweir aStyleSettings.SetInfoFont( aLabelFont ); 1288cdf0e10cSrcweir aStyleSettings.SetRadioCheckFont( aLabelFont ); 1289cdf0e10cSrcweir aStyleSettings.SetFieldFont( aLabelFont ); 1290cdf0e10cSrcweir aStyleSettings.SetGroupFont( aLabelFont ); 1291cdf0e10cSrcweir aStyleSettings.SetIconFont( aLabelFont ); 1292cdf0e10cSrcweir 1293cdf0e10cSrcweir Color aHighlightColor( getColor( [NSColor selectedTextBackgroundColor], 1294*bde8a4bdSHerbert Dürr aStyleSettings.GetHighlightColor(), mpNSWindow ) ); 1295cdf0e10cSrcweir aStyleSettings.SetHighlightColor( aHighlightColor ); 1296cdf0e10cSrcweir Color aHighlightTextColor( getColor( [NSColor selectedTextColor], 1297*bde8a4bdSHerbert Dürr aStyleSettings.GetHighlightTextColor(), mpNSWindow ) ); 1298cdf0e10cSrcweir aStyleSettings.SetHighlightTextColor( aHighlightTextColor ); 1299cdf0e10cSrcweir 1300cdf0e10cSrcweir Color aMenuHighlightColor( getColor( [NSColor selectedMenuItemColor], 1301*bde8a4bdSHerbert Dürr aStyleSettings.GetMenuHighlightColor(), mpNSWindow ) ); 1302cdf0e10cSrcweir aStyleSettings.SetMenuHighlightColor( aMenuHighlightColor ); 1303cdf0e10cSrcweir Color aMenuHighlightTextColor( getColor( [NSColor selectedMenuItemTextColor], 1304*bde8a4bdSHerbert Dürr aStyleSettings.GetMenuHighlightTextColor(), mpNSWindow ) ); 1305cdf0e10cSrcweir aStyleSettings.SetMenuHighlightTextColor( aMenuHighlightTextColor ); 1306cdf0e10cSrcweir 1307cdf0e10cSrcweir aStyleSettings.SetMenuColor( aBackgroundColor ); 1308cdf0e10cSrcweir Color aMenuTextColor( getColor( [NSColor textColor], 1309*bde8a4bdSHerbert Dürr aStyleSettings.GetMenuTextColor(), mpNSWindow ) ); 1310cdf0e10cSrcweir aStyleSettings.SetMenuTextColor( aMenuTextColor ); 1311cdf0e10cSrcweir aStyleSettings.SetMenuBarTextColor( aMenuTextColor ); 1312cdf0e10cSrcweir 1313cdf0e10cSrcweir aStyleSettings.SetCursorBlinkTime( 500 ); 1314cdf0e10cSrcweir 1315cdf0e10cSrcweir // no mnemonics on aqua 1316cdf0e10cSrcweir aStyleSettings.SetOptions( aStyleSettings.GetOptions() | STYLE_OPTION_NOMNEMONICS ); 1317cdf0e10cSrcweir 1318cdf0e10cSrcweir getAppleScrollBarVariant(); 1319cdf0e10cSrcweir 1320cdf0e10cSrcweir // set scrollbar size 1321cdf0e10cSrcweir aStyleSettings.SetScrollBarSize( static_cast<long int>([NSScroller scrollerWidth]) ); 1322cdf0e10cSrcweir 1323cdf0e10cSrcweir // images in menus false for MacOSX 1324cdf0e10cSrcweir aStyleSettings.SetUseImagesInMenus( false ); 1325cdf0e10cSrcweir 1326cdf0e10cSrcweir rSettings.SetStyleSettings( aStyleSettings ); 1327cdf0e10cSrcweir 1328*bde8a4bdSHerbert Dürr [mpNSView unlockFocus]; 1329cdf0e10cSrcweir } 1330cdf0e10cSrcweir 1331cdf0e10cSrcweir // ----------------------------------------------------------------------- 1332cdf0e10cSrcweir 1333cdf0e10cSrcweir const SystemEnvData* AquaSalFrame::GetSystemData() const 1334cdf0e10cSrcweir { 1335cdf0e10cSrcweir return &maSysData; 1336cdf0e10cSrcweir } 1337cdf0e10cSrcweir 1338cdf0e10cSrcweir // ----------------------------------------------------------------------- 1339cdf0e10cSrcweir 1340cdf0e10cSrcweir void AquaSalFrame::Beep( SoundType eSoundType ) 1341cdf0e10cSrcweir { 1342cdf0e10cSrcweir switch( eSoundType ) 1343cdf0e10cSrcweir { 1344cdf0e10cSrcweir case SOUND_DISABLE: 1345cdf0e10cSrcweir // don't beep 1346cdf0e10cSrcweir break; 1347cdf0e10cSrcweir default: 1348cdf0e10cSrcweir NSBeep(); 1349cdf0e10cSrcweir break; 1350cdf0e10cSrcweir } 1351cdf0e10cSrcweir } 1352cdf0e10cSrcweir 1353cdf0e10cSrcweir // ----------------------------------------------------------------------- 1354cdf0e10cSrcweir 1355cdf0e10cSrcweir void AquaSalFrame::SetPosSize(long nX, long nY, long nWidth, long nHeight, sal_uInt16 nFlags) 1356cdf0e10cSrcweir { 1357*bde8a4bdSHerbert Dürr if ( !mpNSWindow ) 1358cdf0e10cSrcweir return; 1359cdf0e10cSrcweir 1360cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 1361cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 1362cdf0e10cSrcweir 1363cdf0e10cSrcweir sal_uInt16 nEvent = 0; 1364cdf0e10cSrcweir 1365*bde8a4bdSHerbert Dürr if( [mpNSWindow isMiniaturized] ) 1366*bde8a4bdSHerbert Dürr [mpNSWindow deminiaturize: NSApp]; // expand the window 1367cdf0e10cSrcweir 1368cdf0e10cSrcweir if (nFlags & (SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y)) 1369cdf0e10cSrcweir { 1370cdf0e10cSrcweir mbPositioned = true; 1371cdf0e10cSrcweir nEvent = SALEVENT_MOVE; 1372cdf0e10cSrcweir } 1373cdf0e10cSrcweir 1374cdf0e10cSrcweir if (nFlags & (SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT)) 1375cdf0e10cSrcweir { 1376cdf0e10cSrcweir mbSized = true; 1377cdf0e10cSrcweir nEvent = (nEvent == SALEVENT_MOVE) ? SALEVENT_MOVERESIZE : SALEVENT_RESIZE; 1378cdf0e10cSrcweir } 1379cdf0e10cSrcweir 1380*bde8a4bdSHerbert Dürr NSRect aFrameRect = [mpNSWindow frame]; 1381cdf0e10cSrcweir NSRect aContentRect = [NSWindow contentRectForFrameRect: aFrameRect styleMask: mnStyleMask]; 1382cdf0e10cSrcweir 1383cdf0e10cSrcweir // position is always relative to parent frame 1384cdf0e10cSrcweir NSRect aParentContentRect; 1385cdf0e10cSrcweir 1386cdf0e10cSrcweir if( mpParent ) 1387cdf0e10cSrcweir { 1388cdf0e10cSrcweir if( Application::GetSettings().GetLayoutRTL() ) 1389cdf0e10cSrcweir { 1390cdf0e10cSrcweir if( (nFlags & SAL_FRAME_POSSIZE_WIDTH) != 0 ) 1391cdf0e10cSrcweir nX = mpParent->maGeometry.nWidth - nWidth-1 - nX; 1392cdf0e10cSrcweir else 1393cdf0e10cSrcweir nX = mpParent->maGeometry.nWidth - static_cast<long int>( aContentRect.size.width-1) - nX; 1394cdf0e10cSrcweir } 1395*bde8a4bdSHerbert Dürr NSRect aParentFrameRect = [mpParent->mpNSWindow frame]; 1396cdf0e10cSrcweir aParentContentRect = [NSWindow contentRectForFrameRect: aParentFrameRect styleMask: mpParent->mnStyleMask]; 1397cdf0e10cSrcweir } 1398cdf0e10cSrcweir else 1399cdf0e10cSrcweir aParentContentRect = maScreenRect; // use screen if no parent 1400cdf0e10cSrcweir 1401cdf0e10cSrcweir CocoaToVCL( aContentRect ); 1402cdf0e10cSrcweir CocoaToVCL( aParentContentRect ); 1403cdf0e10cSrcweir 1404cdf0e10cSrcweir bool bPaint = false; 1405cdf0e10cSrcweir if( (nFlags & (SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT)) != 0 ) 1406cdf0e10cSrcweir { 1407cdf0e10cSrcweir if( nWidth != aContentRect.size.width || nHeight != aContentRect.size.height ) 1408cdf0e10cSrcweir bPaint = true; 1409cdf0e10cSrcweir } 1410cdf0e10cSrcweir 1411cdf0e10cSrcweir // use old window pos if no new pos requested 1412cdf0e10cSrcweir if( (nFlags & SAL_FRAME_POSSIZE_X) != 0 ) 1413cdf0e10cSrcweir aContentRect.origin.x = nX + aParentContentRect.origin.x; 1414cdf0e10cSrcweir if( (nFlags & SAL_FRAME_POSSIZE_Y) != 0) 1415cdf0e10cSrcweir aContentRect.origin.y = nY + aParentContentRect.origin.y; 1416cdf0e10cSrcweir 1417cdf0e10cSrcweir // use old size if no new size requested 1418cdf0e10cSrcweir if( (nFlags & SAL_FRAME_POSSIZE_WIDTH) != 0 ) 1419cdf0e10cSrcweir aContentRect.size.width = nWidth; 1420cdf0e10cSrcweir if( (nFlags & SAL_FRAME_POSSIZE_HEIGHT) != 0) 1421cdf0e10cSrcweir aContentRect.size.height = nHeight; 1422cdf0e10cSrcweir 1423cdf0e10cSrcweir VCLToCocoa( aContentRect ); 1424cdf0e10cSrcweir 1425cdf0e10cSrcweir // do not display yet, we need to update our backbuffer 1426cdf0e10cSrcweir { 1427*bde8a4bdSHerbert Dürr [mpNSWindow setFrame: [NSWindow frameRectForContentRect: aContentRect styleMask: mnStyleMask] display: NO]; 1428cdf0e10cSrcweir } 1429cdf0e10cSrcweir 1430cdf0e10cSrcweir UpdateFrameGeometry(); 1431cdf0e10cSrcweir 1432cdf0e10cSrcweir if (nEvent) 1433cdf0e10cSrcweir CallCallback(nEvent, NULL); 1434cdf0e10cSrcweir 1435cdf0e10cSrcweir if( mbShown && bPaint ) 1436cdf0e10cSrcweir { 1437cdf0e10cSrcweir // trigger filling our backbuffer 1438cdf0e10cSrcweir SendPaintEvent(); 1439cdf0e10cSrcweir 1440cdf0e10cSrcweir // now inform the system that the views need to be drawn 1441*bde8a4bdSHerbert Dürr [mpNSWindow display]; 1442cdf0e10cSrcweir } 1443cdf0e10cSrcweir } 1444cdf0e10cSrcweir 1445cdf0e10cSrcweir void AquaSalFrame::GetWorkArea( Rectangle& rRect ) 1446cdf0e10cSrcweir { 1447*bde8a4bdSHerbert Dürr if ( !mpNSWindow ) 1448cdf0e10cSrcweir return; 1449cdf0e10cSrcweir 1450cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 1451cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 1452cdf0e10cSrcweir 1453*bde8a4bdSHerbert Dürr NSScreen* pScreen = [mpNSWindow screen]; 1454cdf0e10cSrcweir if( pScreen == nil ) 1455cdf0e10cSrcweir pScreen = [NSScreen mainScreen]; 1456cdf0e10cSrcweir NSRect aRect = [pScreen visibleFrame]; 1457cdf0e10cSrcweir CocoaToVCL( aRect ); 1458cdf0e10cSrcweir rRect.nLeft = static_cast<long>(aRect.origin.x); 1459cdf0e10cSrcweir rRect.nTop = static_cast<long>(aRect.origin.y); 1460cdf0e10cSrcweir rRect.nRight = static_cast<long>(aRect.origin.x + aRect.size.width - 1); 1461cdf0e10cSrcweir rRect.nBottom = static_cast<long>(aRect.origin.y + aRect.size.height - 1); 1462cdf0e10cSrcweir } 1463cdf0e10cSrcweir 1464cdf0e10cSrcweir SalPointerState AquaSalFrame::GetPointerState() 1465cdf0e10cSrcweir { 1466cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 1467cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 1468cdf0e10cSrcweir 1469cdf0e10cSrcweir SalPointerState state; 1470cdf0e10cSrcweir state.mnState = 0; 1471cdf0e10cSrcweir 1472cdf0e10cSrcweir // get position 1473*bde8a4bdSHerbert Dürr NSPoint aPt = [mpNSWindow mouseLocationOutsideOfEventStream]; 1474cdf0e10cSrcweir CocoaToVCL( aPt, false ); 1475cdf0e10cSrcweir state.maPos = Point(static_cast<long>(aPt.x), static_cast<long>(aPt.y)); 1476cdf0e10cSrcweir 1477cdf0e10cSrcweir NSEvent* pCur = [NSApp currentEvent]; 1478cdf0e10cSrcweir bool bMouseEvent = false; 1479cdf0e10cSrcweir if( pCur ) 1480cdf0e10cSrcweir { 1481cdf0e10cSrcweir bMouseEvent = true; 1482cdf0e10cSrcweir switch( [pCur type] ) 1483cdf0e10cSrcweir { 1484cdf0e10cSrcweir case NSLeftMouseDown: state.mnState |= MOUSE_LEFT; break; 1485cdf0e10cSrcweir case NSLeftMouseUp: break; 1486cdf0e10cSrcweir case NSRightMouseDown: state.mnState |= MOUSE_RIGHT; break; 1487cdf0e10cSrcweir case NSRightMouseUp: break; 1488cdf0e10cSrcweir case NSOtherMouseDown: state.mnState |= ([pCur buttonNumber] == 2) ? MOUSE_MIDDLE : 0; break; 1489cdf0e10cSrcweir case NSOtherMouseUp: break; 1490cdf0e10cSrcweir case NSMouseMoved: break; 1491cdf0e10cSrcweir case NSLeftMouseDragged: state.mnState |= MOUSE_LEFT; break; 1492cdf0e10cSrcweir case NSRightMouseDragged: state.mnState |= MOUSE_RIGHT; break; 1493cdf0e10cSrcweir case NSOtherMouseDragged: state.mnState |= ([pCur buttonNumber] == 2) ? MOUSE_MIDDLE : 0; break; 1494cdf0e10cSrcweir break; 1495cdf0e10cSrcweir default: 1496cdf0e10cSrcweir bMouseEvent = false; 1497cdf0e10cSrcweir break; 1498cdf0e10cSrcweir } 1499cdf0e10cSrcweir } 1500cdf0e10cSrcweir if( bMouseEvent ) 1501cdf0e10cSrcweir { 1502cdf0e10cSrcweir unsigned int nMask = (unsigned int)[pCur modifierFlags]; 1503cdf0e10cSrcweir if( (nMask & NSShiftKeyMask) != 0 ) 1504cdf0e10cSrcweir state.mnState |= KEY_SHIFT; 1505cdf0e10cSrcweir if( (nMask & NSControlKeyMask) != 0 ) 1506cdf0e10cSrcweir state.mnState |= KEY_MOD3; 1507cdf0e10cSrcweir if( (nMask & NSAlternateKeyMask) != 0 ) 1508cdf0e10cSrcweir state.mnState |= KEY_MOD2; 1509cdf0e10cSrcweir if( (nMask & NSCommandKeyMask) != 0 ) 1510cdf0e10cSrcweir state.mnState |= KEY_MOD1; 1511cdf0e10cSrcweir 1512cdf0e10cSrcweir } 1513cdf0e10cSrcweir else 1514cdf0e10cSrcweir { 1515cdf0e10cSrcweir // FIXME: replace Carbon by Cocoa 1516cdf0e10cSrcweir // Cocoa does not have an equivalent for GetCurrentEventButtonState 1517cdf0e10cSrcweir // and GetCurrentEventKeyModifiers. 1518cdf0e10cSrcweir // we could try to get away with tracking all events for modifierKeys 1519cdf0e10cSrcweir // and all mouse events for button state in VCL_NSApllication::sendEvent, 1520cdf0e10cSrcweir // but it is unclear whether this will get us the same result. 1521cdf0e10cSrcweir // leave in GetCurrentEventButtonState and GetCurrentEventKeyModifiers for now 1522cdf0e10cSrcweir 1523cdf0e10cSrcweir // fill in button state 1524cdf0e10cSrcweir UInt32 nState = GetCurrentEventButtonState(); 1525cdf0e10cSrcweir state.mnState = 0; 1526cdf0e10cSrcweir if( nState & 1 ) 1527cdf0e10cSrcweir state.mnState |= MOUSE_LEFT; // primary button 1528cdf0e10cSrcweir if( nState & 2 ) 1529cdf0e10cSrcweir state.mnState |= MOUSE_RIGHT; // secondary button 1530cdf0e10cSrcweir if( nState & 4 ) 1531cdf0e10cSrcweir state.mnState |= MOUSE_MIDDLE; // tertiary button 1532cdf0e10cSrcweir 1533cdf0e10cSrcweir // fill in modifier state 1534cdf0e10cSrcweir nState = GetCurrentEventKeyModifiers(); 1535cdf0e10cSrcweir if( nState & shiftKey ) 1536cdf0e10cSrcweir state.mnState |= KEY_SHIFT; 1537cdf0e10cSrcweir if( nState & controlKey ) 1538cdf0e10cSrcweir state.mnState |= KEY_MOD3; 1539cdf0e10cSrcweir if( nState & optionKey ) 1540cdf0e10cSrcweir state.mnState |= KEY_MOD2; 1541cdf0e10cSrcweir if( nState & cmdKey ) 1542cdf0e10cSrcweir state.mnState |= KEY_MOD1; 1543cdf0e10cSrcweir } 1544cdf0e10cSrcweir 1545cdf0e10cSrcweir 1546cdf0e10cSrcweir return state; 1547cdf0e10cSrcweir } 1548cdf0e10cSrcweir 1549cdf0e10cSrcweir bool AquaSalFrame::SetPluginParent( SystemParentData* ) 1550cdf0e10cSrcweir { 1551cdf0e10cSrcweir // plugin parent may be killed unexpectedly by 1552cdf0e10cSrcweir // plugging process; 1553cdf0e10cSrcweir 1554cdf0e10cSrcweir //TODO: implement 1555cdf0e10cSrcweir return sal_False; 1556cdf0e10cSrcweir } 1557cdf0e10cSrcweir 1558cdf0e10cSrcweir sal_Bool AquaSalFrame::MapUnicodeToKeyCode( sal_Unicode , LanguageType , KeyCode& ) 1559cdf0e10cSrcweir { 1560cdf0e10cSrcweir // not supported yet 1561cdf0e10cSrcweir return FALSE; 1562cdf0e10cSrcweir } 1563cdf0e10cSrcweir 1564cdf0e10cSrcweir LanguageType AquaSalFrame::GetInputLanguage() 1565cdf0e10cSrcweir { 1566cdf0e10cSrcweir //TODO: implement 1567cdf0e10cSrcweir return LANGUAGE_DONTKNOW; 1568cdf0e10cSrcweir } 1569cdf0e10cSrcweir 1570cdf0e10cSrcweir void AquaSalFrame::DrawMenuBar() 1571cdf0e10cSrcweir { 1572cdf0e10cSrcweir } 1573cdf0e10cSrcweir 1574cdf0e10cSrcweir void AquaSalFrame::SetMenu( SalMenu* pSalMenu ) 1575cdf0e10cSrcweir { 1576cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 1577cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 1578cdf0e10cSrcweir 1579cdf0e10cSrcweir AquaSalMenu* pMenu = static_cast<AquaSalMenu*>(pSalMenu); 1580cdf0e10cSrcweir DBG_ASSERT( ! pMenu || pMenu->mbMenuBar, "setting non menubar on frame" ); 1581cdf0e10cSrcweir mpMenu = pMenu; 1582cdf0e10cSrcweir if( mpMenu ) 1583cdf0e10cSrcweir mpMenu->setMainMenu(); 1584cdf0e10cSrcweir } 1585cdf0e10cSrcweir 1586cdf0e10cSrcweir void AquaSalFrame::SetExtendedFrameStyle( SalExtStyle nStyle ) 1587cdf0e10cSrcweir { 1588*bde8a4bdSHerbert Dürr if ( mpNSWindow ) 1589cdf0e10cSrcweir { 1590cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 1591cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 1592cdf0e10cSrcweir 1593cdf0e10cSrcweir if( (mnExtStyle & SAL_FRAME_EXT_STYLE_DOCMODIFIED) != (nStyle & SAL_FRAME_EXT_STYLE_DOCMODIFIED) ) 1594*bde8a4bdSHerbert Dürr [mpNSWindow setDocumentEdited: (nStyle & SAL_FRAME_EXT_STYLE_DOCMODIFIED) ? YES : NO]; 1595cdf0e10cSrcweir } 1596cdf0e10cSrcweir 1597cdf0e10cSrcweir mnExtStyle = nStyle; 1598cdf0e10cSrcweir } 1599cdf0e10cSrcweir 1600cdf0e10cSrcweir void AquaSalFrame::SetBackgroundBitmap( SalBitmap* ) 1601cdf0e10cSrcweir { 1602cdf0e10cSrcweir //TODO: implement 1603cdf0e10cSrcweir } 1604cdf0e10cSrcweir 1605cdf0e10cSrcweir SalBitmap* AquaSalFrame::SnapShot() 1606cdf0e10cSrcweir { 1607cdf0e10cSrcweir return mpGraphics ? mpGraphics->getBitmap( 0, 0, maGeometry.nWidth, maGeometry.nHeight ) : NULL; 1608cdf0e10cSrcweir } 1609cdf0e10cSrcweir 1610cdf0e10cSrcweir SalFrame* AquaSalFrame::GetParent() const 1611cdf0e10cSrcweir { 1612cdf0e10cSrcweir return mpParent; 1613cdf0e10cSrcweir } 1614cdf0e10cSrcweir 1615cdf0e10cSrcweir void AquaSalFrame::SetParent( SalFrame* pNewParent ) 1616cdf0e10cSrcweir { 1617cdf0e10cSrcweir bool bShown = mbShown; 1618cdf0e10cSrcweir // remove from child list 1619cdf0e10cSrcweir Show( FALSE ); 1620cdf0e10cSrcweir mpParent = (AquaSalFrame*)pNewParent; 1621cdf0e10cSrcweir // insert to correct parent and paint 1622cdf0e10cSrcweir Show( bShown ); 1623cdf0e10cSrcweir } 1624cdf0e10cSrcweir 1625cdf0e10cSrcweir void AquaSalFrame::UpdateFrameGeometry() 1626cdf0e10cSrcweir { 1627*bde8a4bdSHerbert Dürr if ( !mpNSWindow ) 1628cdf0e10cSrcweir { 1629cdf0e10cSrcweir return; 1630cdf0e10cSrcweir } 1631cdf0e10cSrcweir 1632cdf0e10cSrcweir // keep in mind that view and window coordinates are lower left 1633cdf0e10cSrcweir // whereas vcl's are upper left 1634cdf0e10cSrcweir 1635cdf0e10cSrcweir // update screen rect 1636*bde8a4bdSHerbert Dürr NSScreen * pScreen = [mpNSWindow screen]; 1637cdf0e10cSrcweir if( pScreen ) 1638cdf0e10cSrcweir { 1639cdf0e10cSrcweir maScreenRect = [pScreen frame]; 1640cdf0e10cSrcweir NSArray* pScreens = [NSScreen screens]; 1641cdf0e10cSrcweir if( pScreens ) 1642cdf0e10cSrcweir maGeometry.nScreenNumber = [pScreens indexOfObject: pScreen]; 1643cdf0e10cSrcweir } 1644cdf0e10cSrcweir 1645*bde8a4bdSHerbert Dürr NSRect aFrameRect = [mpNSWindow frame]; 1646cdf0e10cSrcweir NSRect aContentRect = [NSWindow contentRectForFrameRect: aFrameRect styleMask: mnStyleMask]; 1647cdf0e10cSrcweir 1648cdf0e10cSrcweir // release old track rect 1649*bde8a4bdSHerbert Dürr [mpNSView removeTrackingRect: mnTrackingRectTag]; 1650cdf0e10cSrcweir // install the new track rect 1651cdf0e10cSrcweir NSRect aTrackRect = { { 0, 0 }, aContentRect.size }; 1652*bde8a4bdSHerbert Dürr mnTrackingRectTag = [mpNSView addTrackingRect: aTrackRect owner: mpNSView userData: nil assumeInside: NO]; 1653cdf0e10cSrcweir 1654cdf0e10cSrcweir // convert to vcl convention 1655cdf0e10cSrcweir CocoaToVCL( aFrameRect ); 1656cdf0e10cSrcweir CocoaToVCL( aContentRect ); 1657cdf0e10cSrcweir 1658cdf0e10cSrcweir maGeometry.nX = static_cast<int>(aContentRect.origin.x); 1659cdf0e10cSrcweir maGeometry.nY = static_cast<int>(aContentRect.origin.y); 1660cdf0e10cSrcweir 1661cdf0e10cSrcweir maGeometry.nLeftDecoration = static_cast<unsigned int>(aContentRect.origin.x - aFrameRect.origin.x); 1662cdf0e10cSrcweir maGeometry.nRightDecoration = static_cast<unsigned int>((aFrameRect.origin.x + aFrameRect.size.width) - 1663cdf0e10cSrcweir (aContentRect.origin.x + aContentRect.size.width)); 1664cdf0e10cSrcweir 1665cdf0e10cSrcweir maGeometry.nTopDecoration = static_cast<unsigned int>(aContentRect.origin.y - aFrameRect.origin.y); 1666cdf0e10cSrcweir maGeometry.nBottomDecoration = static_cast<unsigned int>((aFrameRect.origin.y + aFrameRect.size.height) - 1667cdf0e10cSrcweir (aContentRect.origin.y + aContentRect.size.height)); 1668cdf0e10cSrcweir 1669cdf0e10cSrcweir maGeometry.nWidth = static_cast<unsigned int>(aContentRect.size.width); 1670cdf0e10cSrcweir maGeometry.nHeight = static_cast<unsigned int>(aContentRect.size.height); 1671cdf0e10cSrcweir } 1672cdf0e10cSrcweir 1673cdf0e10cSrcweir // ----------------------------------------------------------------------- 1674cdf0e10cSrcweir 1675cdf0e10cSrcweir void AquaSalFrame::CaptureMouse( sal_Bool bCapture ) 1676cdf0e10cSrcweir { 1677cdf0e10cSrcweir /* Remark: 1678cdf0e10cSrcweir we'll try to use a pidgin version of capture mouse 1679cdf0e10cSrcweir on MacOSX (neither carbon nor cocoa) there is a 1680cdf0e10cSrcweir CaptureMouse equivalent (in Carbon there is TrackMouseLocation 1681cdf0e10cSrcweir but this is useless to use since it is blocking) 1682cdf0e10cSrcweir 1683cdf0e10cSrcweir However on cocoa the active frame seems to get mouse events 1684cdf0e10cSrcweir also outside the window, so we'll try to forward mouse events 1685cdf0e10cSrcweir to the capture frame in the hope that one of our frames 1686cdf0e10cSrcweir gets a mouse event. 1687cdf0e10cSrcweir 1688cdf0e10cSrcweir This will break as soon as the user activates another app, but 1689cdf0e10cSrcweir a mouse click will normally lead to a release of the mouse anyway. 1690cdf0e10cSrcweir 1691cdf0e10cSrcweir Let's see how far we get this way. Alternatively we could use one 1692cdf0e10cSrcweir large overlay window like we did for the carbon implementation, 1693cdf0e10cSrcweir however that is resource intensive. 1694cdf0e10cSrcweir */ 1695cdf0e10cSrcweir 1696cdf0e10cSrcweir if( bCapture ) 1697cdf0e10cSrcweir s_pCaptureFrame = this; 1698cdf0e10cSrcweir else if( ! bCapture && s_pCaptureFrame == this ) 1699cdf0e10cSrcweir s_pCaptureFrame = NULL; 1700cdf0e10cSrcweir } 1701cdf0e10cSrcweir 1702cdf0e10cSrcweir void AquaSalFrame::ResetClipRegion() 1703cdf0e10cSrcweir { 1704*bde8a4bdSHerbert Dürr if ( !mpNSWindow ) 1705cdf0e10cSrcweir { 1706cdf0e10cSrcweir return; 1707cdf0e10cSrcweir } 1708cdf0e10cSrcweir 1709cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 1710cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 1711cdf0e10cSrcweir 1712cdf0e10cSrcweir // release old path and indicate no clipping 1713cdf0e10cSrcweir CGPathRelease( mrClippingPath ); 1714cdf0e10cSrcweir mrClippingPath = NULL; 1715cdf0e10cSrcweir 1716*bde8a4bdSHerbert Dürr if( mpNSView && mbShown ) 1717*bde8a4bdSHerbert Dürr [mpNSView setNeedsDisplay: YES]; 1718*bde8a4bdSHerbert Dürr if( mpNSWindow ) 1719cdf0e10cSrcweir { 1720*bde8a4bdSHerbert Dürr [mpNSWindow setOpaque: YES]; 1721*bde8a4bdSHerbert Dürr [mpNSWindow invalidateShadow]; 1722cdf0e10cSrcweir } 1723cdf0e10cSrcweir } 1724cdf0e10cSrcweir 1725cdf0e10cSrcweir void AquaSalFrame::BeginSetClipRegion( sal_uLong nRects ) 1726cdf0e10cSrcweir { 1727*bde8a4bdSHerbert Dürr if ( !mpNSWindow ) 1728cdf0e10cSrcweir { 1729cdf0e10cSrcweir return; 1730cdf0e10cSrcweir } 1731cdf0e10cSrcweir 1732cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 1733cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 1734cdf0e10cSrcweir 1735cdf0e10cSrcweir // release old path 1736cdf0e10cSrcweir if( mrClippingPath ) 1737cdf0e10cSrcweir { 1738cdf0e10cSrcweir CGPathRelease( mrClippingPath ); 1739cdf0e10cSrcweir mrClippingPath = NULL; 1740cdf0e10cSrcweir } 1741cdf0e10cSrcweir 1742cdf0e10cSrcweir if( maClippingRects.size() > SAL_CLIPRECT_COUNT && nRects < maClippingRects.size() ) 1743cdf0e10cSrcweir { 1744cdf0e10cSrcweir std::vector<CGRect> aEmptyVec; 1745cdf0e10cSrcweir maClippingRects.swap( aEmptyVec ); 1746cdf0e10cSrcweir } 1747cdf0e10cSrcweir maClippingRects.clear(); 1748cdf0e10cSrcweir maClippingRects.reserve( nRects ); 1749cdf0e10cSrcweir } 1750cdf0e10cSrcweir 1751cdf0e10cSrcweir void AquaSalFrame::UnionClipRegion( long nX, long nY, long nWidth, long nHeight ) 1752cdf0e10cSrcweir { 1753cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 1754cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 1755cdf0e10cSrcweir 1756cdf0e10cSrcweir if( nWidth && nHeight ) 1757cdf0e10cSrcweir { 1758cd426cceSHerbert Dürr NSRect aRect = NSMakeRect( nX, nY, nWidth, nHeight); 1759cdf0e10cSrcweir VCLToCocoa( aRect, false ); 1760cdf0e10cSrcweir maClippingRects.push_back( CGRectMake(aRect.origin.x, aRect.origin.y, aRect.size.width, aRect.size.height) ); 1761cdf0e10cSrcweir } 1762cdf0e10cSrcweir } 1763cdf0e10cSrcweir 1764cdf0e10cSrcweir void AquaSalFrame::EndSetClipRegion() 1765cdf0e10cSrcweir { 1766*bde8a4bdSHerbert Dürr if ( !mpNSWindow ) 1767cdf0e10cSrcweir { 1768cdf0e10cSrcweir return; 1769cdf0e10cSrcweir } 1770cdf0e10cSrcweir 1771cdf0e10cSrcweir // #i113170# may not be the main thread if called from UNO API 1772cdf0e10cSrcweir SalData::ensureThreadAutoreleasePool(); 1773cdf0e10cSrcweir 1774cdf0e10cSrcweir if( ! maClippingRects.empty() ) 1775cdf0e10cSrcweir { 1776cdf0e10cSrcweir mrClippingPath = CGPathCreateMutable(); 1777cdf0e10cSrcweir CGPathAddRects( mrClippingPath, NULL, &maClippingRects[0], maClippingRects.size() ); 1778cdf0e10cSrcweir } 1779*bde8a4bdSHerbert Dürr if( mpNSView && mbShown ) 1780*bde8a4bdSHerbert Dürr [mpNSView setNeedsDisplay: YES]; 1781*bde8a4bdSHerbert Dürr if( mpNSWindow ) 1782cdf0e10cSrcweir { 1783*bde8a4bdSHerbert Dürr [mpNSWindow setOpaque: (mrClippingPath != NULL) ? NO : YES]; 1784*bde8a4bdSHerbert Dürr [mpNSWindow setBackgroundColor: [NSColor clearColor]]; 1785cdf0e10cSrcweir // shadow is invalidated when view gets drawn again 1786cdf0e10cSrcweir } 1787cdf0e10cSrcweir } 1788cdf0e10cSrcweir 1789