+ wxPoint m_position ;
+ wxSize m_size ;
+ bool m_wasResizable ;
+} FullScreenData ;
+
+void wxTopLevelWindowMac::Init()
+{
+ m_iconized =
+ m_maximizeOnShow = false;
+ m_macWindow = NULL ;
+
+ m_macEventHandler = NULL ;
+ m_macFullScreenData = NULL ;
+}
+
+class wxMacDeferredWindowDeleter : public wxObject
+{
+public :
+ wxMacDeferredWindowDeleter( WindowRef windowRef )
+ {
+ m_macWindow = windowRef ;
+ }
+
+ virtual ~wxMacDeferredWindowDeleter()
+ {
+ UMADisposeWindow( (WindowRef) m_macWindow ) ;
+ }
+
+protected :
+ WindowRef m_macWindow ;
+} ;
+
+bool wxTopLevelWindowMac::Create(wxWindow *parent,
+ wxWindowID id,
+ const wxString& title,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxString& name)
+{
+ // init our fields
+ Init();
+
+ m_windowStyle = style;
+
+ SetName( name );
+
+ m_windowId = id == -1 ? NewControlId() : id;
+ wxWindow::SetLabel( title ) ;
+
+ MacCreateRealWindow( title, pos , size , MacRemoveBordersFromStyle(style) , name ) ;
+
+ SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
+
+ if (GetExtraStyle() & wxFRAME_EX_METAL)
+ MacSetMetalAppearance(true);
+
+ wxTopLevelWindows.Append(this);
+
+ if ( parent )
+ parent->AddChild(this);
+
+ return true;
+}
+
+wxTopLevelWindowMac::~wxTopLevelWindowMac()
+{
+ if ( m_macWindow )
+ {
+#if wxUSE_TOOLTIPS
+ wxToolTip::NotifyWindowDelete(m_macWindow) ;
+#endif
+ wxPendingDelete.Append( new wxMacDeferredWindowDeleter( (WindowRef) m_macWindow ) ) ;
+ }
+
+ if ( m_macEventHandler )
+ {
+ ::RemoveEventHandler((EventHandlerRef) m_macEventHandler);
+ m_macEventHandler = NULL ;
+ }
+
+ wxRemoveMacWindowAssociation( this ) ;
+
+ if ( wxModelessWindows.Find(this) )
+ wxModelessWindows.DeleteObject(this);
+
+ FullScreenData *data = (FullScreenData *) m_macFullScreenData ;
+ delete data ;
+ m_macFullScreenData = NULL ;
+}
+
+
+// ----------------------------------------------------------------------------
+// wxTopLevelWindowMac maximize/minimize
+// ----------------------------------------------------------------------------
+
+void wxTopLevelWindowMac::Maximize(bool maximize)
+{
+ Point idealSize = { 0 , 0 } ;
+ if ( maximize )
+ {
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
+ HIRect bounds ;
+ HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay,kHICoordSpace72DPIGlobal,
+ &bounds);
+ idealSize.h = bounds.size.width;
+ idealSize.v = bounds.size.height;
+#else
+ Rect rect ;
+ GetAvailableWindowPositioningBounds(GetMainDevice(),&rect) ;
+ idealSize.h = rect.right - rect.left ;
+ idealSize.v = rect.bottom - rect.top ;
+#endif
+ }
+ ZoomWindowIdeal( (WindowRef)m_macWindow , maximize ? inZoomOut : inZoomIn , &idealSize ) ;
+}
+
+bool wxTopLevelWindowMac::IsMaximized() const
+{
+ return IsWindowInStandardState( (WindowRef)m_macWindow , NULL , NULL ) ;
+}
+
+void wxTopLevelWindowMac::Iconize(bool iconize)
+{
+ if ( IsWindowCollapsable( (WindowRef)m_macWindow) )
+ CollapseWindow( (WindowRef)m_macWindow , iconize ) ;
+}
+
+bool wxTopLevelWindowMac::IsIconized() const
+{
+ return IsWindowCollapsed((WindowRef)m_macWindow ) ;
+}
+
+void wxTopLevelWindowMac::Restore()
+{
+ if ( IsMaximized() )
+ Maximize(false);
+ else if ( IsIconized() )
+ Iconize(false);
+}
+
+// ----------------------------------------------------------------------------
+// wxTopLevelWindowMac misc
+// ----------------------------------------------------------------------------
+
+wxPoint wxTopLevelWindowMac::GetClientAreaOrigin() const
+{
+ return wxPoint(0, 0) ;
+}
+
+void wxTopLevelWindowMac::SetIcon(const wxIcon& icon)
+{
+ // this sets m_icon
+ wxTopLevelWindowBase::SetIcon(icon);
+}
+
+void wxTopLevelWindowMac::MacSetBackgroundBrush( const wxBrush &brush )
+{
+ wxTopLevelWindowBase::MacSetBackgroundBrush( brush ) ;
+
+ if ( m_macBackgroundBrush.Ok() && m_macBackgroundBrush.GetStyle() != wxTRANSPARENT && m_macBackgroundBrush.MacGetBrushKind() == kwxMacBrushTheme )
+ {
+ SetThemeWindowBackground( (WindowRef) m_macWindow , m_macBackgroundBrush.MacGetTheme() , false ) ;
+ }
+}
+
+void wxTopLevelWindowMac::MacInstallTopLevelWindowEventHandler()
+{
+ if ( m_macEventHandler != NULL )
+ {
+ verify_noerr( ::RemoveEventHandler( (EventHandlerRef) m_macEventHandler ) ) ;
+ }
+
+ InstallWindowEventHandler(
+ MAC_WXHWND(m_macWindow), GetwxMacTopLevelEventHandlerUPP(),
+ GetEventTypeCount(eventList), eventList, this, (EventHandlerRef *)&m_macEventHandler );
+}
+
+void wxTopLevelWindowMac::MacCreateRealWindow(
+ const wxString& title,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxString& name )
+{
+ OSStatus err = noErr ;
+ SetName(name);
+ m_windowStyle = style;
+ m_isShown = false;
+
+ // create frame.
+ int x = (int)pos.x;
+ int y = (int)pos.y;
+
+ Rect theBoundsRect;
+ wxRect display = wxGetClientDisplayRect() ;
+
+ if ( x == wxDefaultPosition.x )
+ x = display.x ;
+
+ if ( y == wxDefaultPosition.y )
+ y = display.y ;
+
+ int w = WidthDefault(size.x);
+ int h = HeightDefault(size.y);
+
+ ::SetRect(&theBoundsRect, x, y , x + w, y + h);
+
+ // translate the window attributes in the appropriate window class and attributes
+ WindowClass wclass = 0;
+ WindowAttributes attr = kWindowNoAttributes ;
+ WindowGroupRef group = NULL ;
+
+ if ( HasFlag( wxFRAME_TOOL_WINDOW) )
+ {
+ if (
+ HasFlag( wxMINIMIZE_BOX ) || HasFlag( wxMAXIMIZE_BOX ) ||
+ HasFlag( wxSYSTEM_MENU ) || HasFlag( wxCAPTION ) ||
+ HasFlag(wxTINY_CAPTION_HORIZ) || HasFlag(wxTINY_CAPTION_VERT)
+ )
+ {
+ wclass = kFloatingWindowClass ;
+
+ if ( HasFlag(wxTINY_CAPTION_VERT) )
+ attr |= kWindowSideTitlebarAttribute ;
+ }
+ else
+ {
+ wclass = kPlainWindowClass ;
+ }
+ }
+ else if ( HasFlag( wxCAPTION ) )
+ {
+ wclass = kDocumentWindowClass ;
+ attr |= kWindowInWindowMenuAttribute ;
+ }
+#if defined( __WXMAC__ ) && TARGET_API_MAC_OSX && ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2 )
+ else if ( HasFlag( wxFRAME_DRAWER ) )
+ {
+ wclass = kDrawerWindowClass;
+ }
+#endif //10.2 and up
+ else
+ {
+ if ( HasFlag( wxMINIMIZE_BOX ) || HasFlag( wxMAXIMIZE_BOX ) ||
+ HasFlag( wxCLOSE_BOX ) || HasFlag( wxSYSTEM_MENU ) )
+ {
+ wclass = kDocumentWindowClass ;
+ }
+ else
+ {
+ wclass = kPlainWindowClass ;
+ }
+ }
+
+ if ( wclass != kPlainWindowClass )
+ {
+ if ( HasFlag( wxMINIMIZE_BOX ) )
+ attr |= kWindowCollapseBoxAttribute ;
+
+ if ( HasFlag( wxMAXIMIZE_BOX ) )
+ attr |= kWindowFullZoomAttribute ;
+
+ if ( HasFlag( wxRESIZE_BORDER ) )
+ attr |= kWindowResizableAttribute ;
+
+ if ( HasFlag( wxCLOSE_BOX) )
+ attr |= kWindowCloseBoxAttribute ;
+ }
+
+ // turn on live resizing (OS X only)
+ if (UMAGetSystemVersion() >= 0x1000)
+ attr |= kWindowLiveResizeAttribute;
+
+ if ( HasFlag(wxSTAY_ON_TOP) )
+ group = GetWindowGroupOfClass(kUtilityWindowClass) ;
+
+ attr |= kWindowCompositingAttribute;
+#if 0 // wxMAC_USE_CORE_GRAPHICS ; TODO : decide on overall handling of high dpi screens (pixel vs userscale)
+ attr |= kWindowFrameworkScaledAttribute;
+#endif
+
+ if ( HasFlag(wxFRAME_SHAPED) )
+ {
+ WindowDefSpec customWindowDefSpec;
+ customWindowDefSpec.defType = kWindowDefProcPtr;
+ customWindowDefSpec.u.defProc =
+#ifdef __LP64__
+ (WindowDefUPP) wxShapedMacWindowDef;
+#else
+ NewWindowDefUPP(wxShapedMacWindowDef);
+#endif
+ err = ::CreateCustomWindow( &customWindowDefSpec, wclass,
+ attr, &theBoundsRect,
+ (WindowRef*) &m_macWindow);
+ }
+ else
+ {
+ err = ::CreateNewWindow( wclass , attr , &theBoundsRect , (WindowRef*)&m_macWindow ) ;
+ }
+
+ if ( err == noErr && m_macWindow != NULL && group != NULL )
+ SetWindowGroup( (WindowRef) m_macWindow , group ) ;
+
+ wxCHECK_RET( err == noErr, wxT("Mac OS error when trying to create new window") );
+
+ // setup a separate group for each window, so that overlays can be handled easily
+ verify_noerr( CreateWindowGroup( kWindowGroupAttrMoveTogether | kWindowGroupAttrLayerTogether | kWindowGroupAttrHideOnCollapse, &group ));
+ verify_noerr( SetWindowGroupParent( group, GetWindowGroup( (WindowRef) m_macWindow )));
+ verify_noerr( SetWindowGroup( (WindowRef) m_macWindow , group ));
+
+ // the create commands are only for content rect,
+ // so we have to set the size again as structure bounds
+ SetWindowBounds( (WindowRef) m_macWindow , kWindowStructureRgn , &theBoundsRect ) ;
+
+ wxAssociateWinWithMacWindow( (WindowRef) m_macWindow , this ) ;
+ UMASetWTitle( (WindowRef) m_macWindow , title , m_font.GetEncoding() ) ;
+ m_peer = new wxMacControl(this , true /*isRootControl*/) ;
+
+ // There is a bug in 10.2.X for ::GetRootControl returning the window view instead of
+ // the content view, so we have to retrieve it explicitly
+ HIViewFindByID( HIViewGetRoot( (WindowRef) m_macWindow ) , kHIViewWindowContentID ,
+ m_peer->GetControlRefAddr() ) ;
+ if ( !m_peer->Ok() )
+ {
+ // compatibility mode fallback
+ GetRootControl( (WindowRef) m_macWindow , m_peer->GetControlRefAddr() ) ;
+ }
+
+ // the root control level handler
+ MacInstallEventHandler( (WXWidget) m_peer->GetControlRef() ) ;
+
+ // Causes the inner part of the window not to be metal
+ // if the style is used before window creation.
+#if 0 // TARGET_API_MAC_OSX
+ if ( m_macUsesCompositing && m_macWindow != NULL )
+ {
+ if ( GetExtraStyle() & wxFRAME_EX_METAL )
+ MacSetMetalAppearance( true ) ;
+ }
+#endif
+
+ // the frame window event handler
+ InstallStandardEventHandler( GetWindowEventTarget(MAC_WXHWND(m_macWindow)) ) ;
+ MacInstallTopLevelWindowEventHandler() ;
+
+ DoSetWindowVariant( m_windowVariant ) ;
+
+ m_macFocus = NULL ;
+
+ if ( HasFlag(wxFRAME_SHAPED) )
+ {
+ // default shape matches the window size
+ wxRegion rgn( 0, 0, w, h );
+ SetShape( rgn );
+ }
+
+ wxWindowCreateEvent event(this);
+ GetEventHandler()->ProcessEvent(event);
+}
+
+void wxTopLevelWindowMac::ClearBackground()
+{
+ wxWindow::ClearBackground() ;
+}
+
+// Raise the window to the top of the Z order
+void wxTopLevelWindowMac::Raise()
+{
+ ::SelectWindow( (WindowRef)m_macWindow ) ;
+}
+
+// Lower the window to the bottom of the Z order
+void wxTopLevelWindowMac::Lower()
+{
+ ::SendBehind( (WindowRef)m_macWindow , NULL ) ;
+}
+
+void wxTopLevelWindowMac::MacDelayedDeactivation(long timestamp)
+{
+ if (s_macDeactivateWindow)
+ {
+ wxLogTrace(TRACE_ACTIVATE,
+ wxT("Doing delayed deactivation of %p"),
+ s_macDeactivateWindow);
+
+ s_macDeactivateWindow->MacActivate(timestamp, false);
+ }
+}
+
+void wxTopLevelWindowMac::MacActivate( long timestamp , bool inIsActivating )
+{
+ wxLogTrace(TRACE_ACTIVATE, wxT("TopLevel=%p::MacActivate"), this);
+
+ if (s_macDeactivateWindow == this)
+ s_macDeactivateWindow = NULL;
+
+ MacDelayedDeactivation(timestamp);
+ MacPropagateHiliteChanged() ;
+}
+
+void wxTopLevelWindowMac::SetTitle(const wxString& title)
+{
+ wxWindow::SetLabel( title ) ;
+ UMASetWTitle( (WindowRef)m_macWindow , title , m_font.GetEncoding() ) ;
+}
+
+wxString wxTopLevelWindowMac::GetTitle() const
+{
+ return wxWindow::GetLabel();
+}
+
+bool wxTopLevelWindowMac::Show(bool show)
+{
+ if ( !wxTopLevelWindowBase::Show(show) )
+ return false;
+
+ bool plainTransition = false;
+
+#if wxUSE_SYSTEM_OPTIONS
+ // code contributed by Ryan Wilcox December 18, 2003
+ plainTransition = UMAGetSystemVersion() >= 0x1000 ;
+ if ( wxSystemOptions::HasOption(wxMAC_WINDOW_PLAIN_TRANSITION) )
+ plainTransition = ( wxSystemOptions::GetOptionInt( wxMAC_WINDOW_PLAIN_TRANSITION ) == 1 ) ;
+#endif
+
+ if (show)
+ {
+ if ( plainTransition )
+ ::ShowWindow( (WindowRef)m_macWindow );
+ else
+ ::TransitionWindow( (WindowRef)m_macWindow, kWindowZoomTransitionEffect, kWindowShowTransitionAction, NULL );
+
+ ::SelectWindow( (WindowRef)m_macWindow ) ;
+
+ // because apps expect a size event to occur at this moment
+ wxSizeEvent event(GetSize() , m_windowId);
+ event.SetEventObject(this);
+ GetEventHandler()->ProcessEvent(event);
+ }
+ else
+ {
+ if ( plainTransition )
+ ::HideWindow( (WindowRef)m_macWindow );
+ else
+ ::TransitionWindow( (WindowRef)m_macWindow, kWindowZoomTransitionEffect, kWindowHideTransitionAction, NULL );
+ }
+
+ MacPropagateVisibilityChanged() ;
+
+ return true ;
+}
+
+bool wxTopLevelWindowMac::ShowFullScreen(bool show, long style)
+{
+ if ( show )
+ {
+ FullScreenData *data = (FullScreenData *)m_macFullScreenData ;
+ delete data ;
+ data = new FullScreenData() ;
+
+ m_macFullScreenData = data ;
+ data->m_position = GetPosition() ;
+ data->m_size = GetSize() ;
+ data->m_wasResizable = MacGetWindowAttributes() & kWindowResizableAttribute ;
+
+ if ( style & wxFULLSCREEN_NOMENUBAR )
+ HideMenuBar() ;
+
+ wxRect client = wxGetClientDisplayRect() ;
+
+ int left , top , right , bottom ;
+ int x, y, w, h ;
+
+ x = client.x ;
+ y = client.y ;
+ w = client.width ;
+ h = client.height ;
+
+ MacGetContentAreaInset( left , top , right , bottom ) ;
+
+ if ( style & wxFULLSCREEN_NOCAPTION )
+ {
+ y -= top ;
+ h += top ;
+ }
+
+ if ( style & wxFULLSCREEN_NOBORDER )
+ {
+ x -= left ;
+ w += left + right ;
+ h += bottom ;
+ }
+
+ if ( style & wxFULLSCREEN_NOTOOLBAR )
+ {
+ // TODO
+ }
+
+ if ( style & wxFULLSCREEN_NOSTATUSBAR )
+ {
+ // TODO
+ }
+
+ SetSize( x , y , w, h ) ;
+ if ( data->m_wasResizable )
+ MacChangeWindowAttributes( kWindowNoAttributes , kWindowResizableAttribute ) ;
+ }
+ else
+ {
+ ShowMenuBar() ;
+ FullScreenData *data = (FullScreenData *) m_macFullScreenData ;
+ if ( data->m_wasResizable )
+ MacChangeWindowAttributes( kWindowResizableAttribute , kWindowNoAttributes ) ;
+ SetPosition( data->m_position ) ;
+ SetSize( data->m_size ) ;
+
+ delete data ;
+ m_macFullScreenData = NULL ;
+ }
+
+ return false;
+}
+
+bool wxTopLevelWindowMac::IsFullScreen() const
+{
+ return m_macFullScreenData != NULL ;
+}
+
+
+bool wxTopLevelWindowMac::SetTransparent(wxByte alpha)
+{
+ OSStatus result = SetWindowAlpha((WindowRef)m_macWindow, float(alpha)/255.0);
+ return result == noErr;
+}
+
+
+bool wxTopLevelWindowMac::CanSetTransparent()
+{
+ return true;
+}
+
+
+void wxTopLevelWindowMac::SetExtraStyle(long exStyle)
+{
+ if ( GetExtraStyle() == exStyle )
+ return ;
+
+ wxTopLevelWindowBase::SetExtraStyle( exStyle ) ;
+
+#if TARGET_API_MAC_OSX
+ if ( m_macWindow != NULL )
+ {
+ bool metal = GetExtraStyle() & wxFRAME_EX_METAL ;
+ if ( MacGetMetalAppearance() != metal )
+ MacSetMetalAppearance( metal ) ;
+ }
+#endif
+}
+
+// TODO: switch to structure bounds -
+// we are still using coordinates of the content view
+//
+void wxTopLevelWindowMac::MacGetContentAreaInset( int &left , int &top , int &right , int &bottom )
+{
+ Rect content, structure ;
+
+ GetWindowBounds( (WindowRef) m_macWindow, kWindowStructureRgn , &structure ) ;
+ GetWindowBounds( (WindowRef) m_macWindow, kWindowContentRgn , &content ) ;
+
+ left = content.left - structure.left ;
+ top = content.top - structure.top ;
+ right = structure.right - content.right ;
+ bottom = structure.bottom - content.bottom ;
+}
+
+void wxTopLevelWindowMac::DoMoveWindow(int x, int y, int width, int height)
+{
+ m_cachedClippedRectValid = false ;
+ Rect bounds = { y , x , y + height , x + width } ;
+ verify_noerr(SetWindowBounds( (WindowRef) m_macWindow, kWindowStructureRgn , &bounds )) ;
+ wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified
+}
+
+void wxTopLevelWindowMac::DoGetPosition( int *x, int *y ) const
+{
+ Rect bounds ;
+
+ verify_noerr(GetWindowBounds((WindowRef) m_macWindow, kWindowStructureRgn , &bounds )) ;
+
+ if (x)
+ *x = bounds.left ;
+ if (y)
+ *y = bounds.top ;
+}
+
+void wxTopLevelWindowMac::DoGetSize( int *width, int *height ) const
+{
+ Rect bounds ;
+
+ verify_noerr(GetWindowBounds((WindowRef) m_macWindow, kWindowStructureRgn , &bounds )) ;
+
+ if (width)
+ *width = bounds.right - bounds.left ;
+ if (height)
+ *height = bounds.bottom - bounds.top ;
+}
+
+void wxTopLevelWindowMac::DoGetClientSize( int *width, int *height ) const
+{
+ Rect bounds ;
+
+ verify_noerr(GetWindowBounds((WindowRef) m_macWindow, kWindowContentRgn , &bounds )) ;
+
+ if (width)
+ *width = bounds.right - bounds.left ;
+ if (height)
+ *height = bounds.bottom - bounds.top ;
+}
+
+void wxTopLevelWindowMac::MacSetMetalAppearance( bool set )
+{
+#if TARGET_API_MAC_OSX
+ MacChangeWindowAttributes( set ? kWindowMetalAttribute : kWindowNoAttributes ,
+ set ? kWindowNoAttributes : kWindowMetalAttribute ) ;
+#endif
+}
+
+bool wxTopLevelWindowMac::MacGetMetalAppearance() const
+{
+#if TARGET_API_MAC_OSX
+ return MacGetWindowAttributes() & kWindowMetalAttribute ;
+#else
+ return false ;
+#endif
+}
+
+void wxTopLevelWindowMac::MacChangeWindowAttributes( wxUint32 attributesToSet , wxUint32 attributesToClear )
+{
+ ChangeWindowAttributes( (WindowRef)m_macWindow, attributesToSet, attributesToClear ) ;
+}
+
+wxUint32 wxTopLevelWindowMac::MacGetWindowAttributes() const
+{
+ UInt32 attr = 0 ;
+ GetWindowAttributes( (WindowRef) m_macWindow, &attr ) ;
+
+ return attr ;
+}
+
+void wxTopLevelWindowMac::MacPerformUpdates()
+{
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
+ // for composited windows this also triggers a redraw of all
+ // invalid views in the window
+ if ( UMAGetSystemVersion() >= 0x1030 )
+ HIWindowFlush((WindowRef) m_macWindow) ;
+ else
+#endif
+ {
+ // the only way to trigger the redrawing on earlier systems is to call
+ // ReceiveNextEvent
+
+ EventRef currentEvent = (EventRef) wxTheApp->MacGetCurrentEvent() ;
+ UInt32 currentEventClass = 0 ;
+ if ( currentEvent != NULL )
+ {
+ currentEventClass = ::GetEventClass( currentEvent ) ;
+ ::GetEventKind( currentEvent ) ;
+ }
+
+ if ( currentEventClass != kEventClassMenu )
+ {
+ // when tracking a menu, strange redraw errors occur if we flush now, so leave..
+ EventRef theEvent;
+ ReceiveNextEvent( 0 , NULL , kEventDurationNoWait , false , &theEvent ) ;
+ }
+ }
+}
+
+// Attracts the users attention to this window if the application is
+// inactive (should be called when a background event occurs)
+
+static pascal void wxMacNMResponse( NMRecPtr ptr )
+{
+ NMRemove( ptr ) ;
+ DisposePtr( (Ptr)ptr ) ;
+}
+
+void wxTopLevelWindowMac::RequestUserAttention(int flags )
+{
+ NMRecPtr notificationRequest = (NMRecPtr) NewPtr( sizeof( NMRec) ) ;
+ static wxMacNMUPP nmupp( wxMacNMResponse );
+
+ memset( notificationRequest , 0 , sizeof(*notificationRequest) ) ;
+ notificationRequest->qType = nmType ;
+ notificationRequest->nmMark = 1 ;
+ notificationRequest->nmIcon = 0 ;
+ notificationRequest->nmSound = 0 ;
+ notificationRequest->nmStr = NULL ;
+ notificationRequest->nmResp = nmupp ;
+
+ verify_noerr( NMInstall( notificationRequest ) ) ;
+}
+
+// ---------------------------------------------------------------------------
+// Shape implementation
+// ---------------------------------------------------------------------------
+
+
+bool wxTopLevelWindowMac::SetShape(const wxRegion& region)
+{
+ wxCHECK_MSG( HasFlag(wxFRAME_SHAPED), false,
+ _T("Shaped windows must be created with the wxFRAME_SHAPED style."));
+
+ // The empty region signifies that the shape
+ // should be removed from the window.
+ if ( region.IsEmpty() )
+ {
+ wxSize sz = GetClientSize();
+ wxRegion rgn(0, 0, sz.x, sz.y);
+ if ( rgn.IsEmpty() )
+ return false ;
+ else
+ return SetShape(rgn);
+ }
+
+ // Make a copy of the region
+ RgnHandle shapeRegion = NewRgn();
+ CopyRgn( (RgnHandle)region.GetWXHRGN(), shapeRegion );
+
+ // Dispose of any shape region we may already have
+ RgnHandle oldRgn = (RgnHandle)GetWRefCon( (WindowRef)MacGetWindowRef() );
+ if ( oldRgn )
+ DisposeRgn(oldRgn);
+
+ // Save the region so we can use it later
+ SetWRefCon((WindowRef)MacGetWindowRef(), (URefCon)shapeRegion);
+
+ // inform the window manager that the window has changed shape
+ ReshapeCustomWindow((WindowRef)MacGetWindowRef());
+
+ return true;
+}
+
+// ---------------------------------------------------------------------------
+// Support functions for shaped windows, based on Apple's CustomWindow sample at
+// http://developer.apple.com/samplecode/Sample_Code/Human_Interface_Toolbox/Mac_OS_High_Level_Toolbox/CustomWindow.htm
+// ---------------------------------------------------------------------------
+
+static void wxShapedMacWindowGetPos(WindowRef window, Rect* inRect)
+{
+ GetWindowPortBounds(window, inRect);
+ Point pt = { inRect->top ,inRect->left };
+ wxMacLocalToGlobal( window, &pt ) ;
+ inRect->bottom += pt.v - inRect->top;
+ inRect->right += pt.h - inRect->left;
+ inRect->top = pt.v;
+ inRect->left = pt.h;
+}
+
+static SInt32 wxShapedMacWindowGetFeatures(WindowRef window, SInt32 param)
+{
+ /*------------------------------------------------------
+ Define which options your custom window supports.
+ --------------------------------------------------------*/
+ //just enable everything for our demo
+ *(OptionBits*)param =
+ //kWindowCanGrow |
+ //kWindowCanZoom |
+ //kWindowCanCollapse |
+ //kWindowCanGetWindowRegion |
+ //kWindowHasTitleBar |
+ //kWindowSupportsDragHilite |
+ kWindowCanDrawInCurrentPort |
+ //kWindowCanMeasureTitle |
+ kWindowWantsDisposeAtProcessDeath |
+ kWindowSupportsGetGrowImageRegion |
+ kWindowDefSupportsColorGrafPort;
+
+ return 1;
+}
+
+// The content region is left as a rectangle matching the window size, this is
+// so the origin in the paint event, and etc. still matches what the
+// programmer expects.
+static void wxShapedMacWindowContentRegion(WindowRef window, RgnHandle rgn)
+{
+ SetEmptyRgn(rgn);
+ wxTopLevelWindowMac* win = wxFindWinFromMacWindow(window);
+ if (win)
+ {
+ Rect r ;
+ wxShapedMacWindowGetPos( window, &r ) ;
+ RectRgn( rgn , &r ) ;
+ }
+}
+
+// The structure region is set to the shape given to the SetShape method.
+static void wxShapedMacWindowStructureRegion(WindowRef window, RgnHandle rgn)
+{
+ RgnHandle cachedRegion = (RgnHandle) GetWRefCon(window);
+
+ SetEmptyRgn(rgn);
+ if (cachedRegion)
+ {
+ Rect windowRect;
+ wxShapedMacWindowGetPos(window, &windowRect); // how big is the window
+ CopyRgn(cachedRegion, rgn); // make a copy of our cached region
+ OffsetRgn(rgn, windowRect.left, windowRect.top); // position it over window
+ //MapRgn(rgn, &mMaskSize, &windowRect); //scale it to our actual window size
+ }
+}
+
+static SInt32 wxShapedMacWindowGetRegion(WindowRef window, SInt32 param)
+{
+ GetWindowRegionPtr rgnRec = (GetWindowRegionPtr)param;
+
+ if (rgnRec == NULL)
+ return paramErr;
+
+ switch (rgnRec->regionCode)
+ {
+ case kWindowStructureRgn:
+ wxShapedMacWindowStructureRegion(window, rgnRec->winRgn);
+ break;
+
+ case kWindowContentRgn:
+ wxShapedMacWindowContentRegion(window, rgnRec->winRgn);
+ break;
+
+ default:
+ SetEmptyRgn(rgnRec->winRgn);
+ break;
+ }
+
+ return noErr;
+}
+
+// Determine the region of the window which was hit
+//
+static SInt32 wxShapedMacWindowHitTest(WindowRef window, SInt32 param)
+{
+ Point hitPoint;
+ static RgnHandle tempRgn = NULL;
+
+ if (tempRgn == NULL)
+ tempRgn = NewRgn();
+
+ // get the point clicked
+ SetPt( &hitPoint, LoWord(param), HiWord(param) );
+
+ // Mac OS 8.5 or later
+ wxShapedMacWindowStructureRegion(window, tempRgn);
+ if (PtInRgn( hitPoint, tempRgn )) //in window content region?
+ return wInContent;
+
+ // no significant area was hit
+ return wNoHit;
+}
+
+static pascal long wxShapedMacWindowDef(short varCode, WindowRef window, SInt16 message, SInt32 param)
+{
+ switch (message)
+ {
+ case kWindowMsgHitTest:
+ return wxShapedMacWindowHitTest(window, param);
+
+ case kWindowMsgGetFeatures:
+ return wxShapedMacWindowGetFeatures(window, param);
+
+ // kWindowMsgGetRegion is sent during CreateCustomWindow and ReshapeCustomWindow
+ case kWindowMsgGetRegion:
+ return wxShapedMacWindowGetRegion(window, param);
+
+ default:
+ break;
+ }
+
+ return 0;