X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f574489317d55d53c8985f576c4276a4736764ae..80c82e01758cd838aa5c922b848454277b11da26:/src/mac/toplevel.cpp diff --git a/src/mac/toplevel.cpp b/src/mac/toplevel.cpp index 3eb3b4787f..efcf1a737d 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,6 +111,7 @@ void wxTopLevelWindowMac::Init() m_macNoEraseUpdateRgn = NewRgn() ; m_macNeedsErasing = false ; m_macWindow = NULL ; + m_macEventHandler = NULL ; } class wxMacDeferredWindowDeleter : public wxObject @@ -159,24 +161,19 @@ wxTopLevelWindowMac::~wxTopLevelWindowMac() wxToolTip::NotifyWindowDelete(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); - if ( wxModelessWindows.Find(this) ) wxModelessWindows.DeleteObject(this); - // If this is the last top-level window, exit. - if ( wxTheApp && (wxTopLevelWindows.Number() == 0) ) - { - wxTheApp->SetTopWindow(NULL); - - if ( wxTheApp->GetExitOnFrameDelete() ) - { - wxTheApp->ExitMainLoop() ; - } - } DisposeRgn( (RgnHandle) m_macNoEraseUpdateRgn ) ; } @@ -221,6 +218,59 @@ void wxTopLevelWindowMac::SetIcon(const wxIcon& icon) wxTopLevelWindowBase::SetIcon(icon); } +#if TARGET_CARBON + +EventHandlerUPP wxMacWindowEventHandlerUPP = NULL ; + +extern long wxMacTranslateKey(unsigned char key, unsigned char code) ; + +pascal OSStatus wxMacWindowEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) +{ + OSStatus result = eventNotHandledErr ; + EventRecord rec ; + switch ( GetEventClass( event ) ) + { + case kEventClassTextInput : + if ( wxMacConvertEventToRecord( event , &rec ) ) + { + wxTheApp->m_macCurrentEvent = &rec ; + wxWindow* focus = wxWindow::FindFocus() ; + if ( (focus != NULL) && wxTheApp->MacSendKeyDownEvent( focus , rec.message , rec.modifiers , rec.when , rec.where.h , rec.where.v ) ) + { + // was handled internally + 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, @@ -322,6 +372,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 ; }