X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/32b5be3d67ad10612ccee4887e7fd79c781e3745..ca4532668cad0441baf03cfe509d3acb84a15edd:/src/mac/toplevel.cpp diff --git a/src/mac/toplevel.cpp b/src/mac/toplevel.cpp index 06ed406854..cc6cea4a30 100644 --- a/src/mac/toplevel.cpp +++ b/src/mac/toplevel.cpp @@ -39,6 +39,7 @@ #include "wx/mac/uma.h" #include "wx/mac/aga.h" +#include "wx/app.h" #include "wx/tooltip.h" #include "wx/dnd.h" @@ -110,8 +111,24 @@ void wxTopLevelWindowMac::Init() m_macNoEraseUpdateRgn = NewRgn() ; m_macNeedsErasing = false ; m_macWindow = NULL ; + m_macEventHandler = 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, @@ -142,9 +159,16 @@ wxTopLevelWindowMac::~wxTopLevelWindowMac() if ( m_macWindow ) { wxToolTip::NotifyWindowDelete(m_macWindow) ; - UMADisposeWindow( (WindowRef) m_macWindow ) ; + wxPendingDelete.Append( new wxMacDeferredWindowDeleter( (WindowRef) m_macWindow ) ) ; } - + + #if TARGET_CARBON + if ( m_macEventHandler ) + { + ::RemoveEventHandler((EventHandlerRef) m_macEventHandler); + m_macEventHandler = NULL ; + } +#endif wxRemoveMacWindowAssociation( this ) ; wxTopLevelWindows.DeleteObject(this); @@ -206,6 +230,52 @@ void wxTopLevelWindowMac::SetIcon(const wxIcon& icon) wxTopLevelWindowBase::SetIcon(icon); } +#if TARGET_CARBON + +EventHandlerUPP wxMacWindowEventHandlerUPP = NULL ; + +pascal OSStatus wxMacWindowEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) +{ + OSStatus result = eventNotHandledErr ; + EventRecord rec ; + switch ( GetEventClass( event ) ) + { + case kEventClassTextInput : + if ( wxMacConvertEventToRecord( event , &rec ) ) + { + wxTheApp->MacHandleOneEvent( &rec ) ; + result = noErr ; + } + break ; + default : + break ; + } + return result ; +} + +#endif + +void wxTopLevelWindowMac::MacInstallEventHandler() +{ +#if TARGET_CARBON + if ( wxMacWindowEventHandlerUPP == NULL ) + { + wxMacWindowEventHandlerUPP = NewEventHandlerUPP( wxMacWindowEventHandler ) ; + } + + static const EventTypeSpec eventList[] = + { + { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent } + } ; + if ( m_macEventHandler ) + { + ::RemoveEventHandler((EventHandlerRef) m_macEventHandler); + m_macEventHandler = NULL ; + } + InstallWindowEventHandler(MAC_WXHWND(m_macWindow), wxMacWindowEventHandlerUPP, WXSIZEOF(eventList), eventList, this, &((EventHandlerRef)m_macEventHandler)); +#endif +} + void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, const wxPoint& pos, const wxSize& size, @@ -241,12 +311,23 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, WindowClass wclass = 0; WindowAttributes attr = kWindowNoAttributes ; - if ( HasFlag( wxFRAME_TOOL_WINDOW) || HasFlag(wxTINY_CAPTION_HORIZ) || HasFlag(wxTINY_CAPTION_VERT) ) + if ( HasFlag( wxFRAME_TOOL_WINDOW) ) { - wclass = kFloatingWindowClass ; - if ( HasFlag(wxTINY_CAPTION_VERT) ) + 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 { - attr |= kWindowSideTitlebarAttribute ; + wclass = kPlainWindowClass ; } } else if ( HasFlag( wxCAPTION ) ) @@ -262,7 +343,15 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, } else { - wclass = kModalWindowClass ; + if ( HasFlag( wxMINIMIZE_BOX ) || HasFlag( wxMAXIMIZE_BOX ) || + HasFlag( wxSYSTEM_MENU ) ) + { + wclass = kDocumentWindowClass ; + } + else + { + wclass = kPlainWindowClass ; + } } if ( HasFlag( wxMINIMIZE_BOX ) || HasFlag( wxMAXIMIZE_BOX ) ) @@ -288,6 +377,7 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, label = title ; UMASetWTitleC( (WindowRef)m_macWindow , label ) ; ::CreateRootControl( (WindowRef)m_macWindow , (ControlHandle*)&m_macRootControl ) ; + MacInstallEventHandler() ; m_macFocus = NULL ; }