X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5706de1cf469f1ca53be7c402365d47e12a616cf..505f0a85c9b59d8be30f2be1f7cf4fd3d663f721:/src/mac/toplevel.cpp diff --git a/src/mac/toplevel.cpp b/src/mac/toplevel.cpp index 34db5c2604..b4864e8f21 100644 --- a/src/mac/toplevel.cpp +++ b/src/mac/toplevel.cpp @@ -111,7 +111,6 @@ static pascal OSStatus TextInputEventHandler( EventHandlerCallRef handler , Even UInt32 keyCode ; UInt32 modifiers ; Point point ; - UInt32 when = EventTimeToTicks( GetEventTime( event ) ) ; EventRef rawEvent ; @@ -123,16 +122,32 @@ static pascal OSStatus TextInputEventHandler( EventHandlerCallRef handler , Even GetEventParameter( rawEvent, kEventParamMouseLocation, typeQDPoint, NULL, sizeof( Point ), NULL, &point ); - UInt32 message = (keyCode << 8) + charCode; - switch ( GetEventKind( event ) ) { case kEventTextInputUnicodeForKeyEvent : + // this is only called when no default handler has jumped in, eg a wxControl on a floater window does not + // get its own kEventTextInputUnicodeForKeyEvent, so we route back the + wxControl* control = wxDynamicCast( focus , wxControl ) ; + if ( control ) + { + ControlHandle macControl = (ControlHandle) control->GetMacControl() ; + if ( macControl ) + { + ::HandleControlKey( macControl , keyCode , charCode , modifiers ) ; + result = noErr ; + } + } + /* + // this may lead to double events sent to a window in case all handlers have skipped the key down event + UInt32 when = EventTimeToTicks( GetEventTime( event ) ) ; + UInt32 message = (keyCode << 8) + charCode; + if ( (focus != NULL) && wxTheApp->MacSendKeyDownEvent( focus , message , modifiers , when , point.h , point.v ) ) { result = noErr ; } + */ break ; } @@ -317,6 +332,43 @@ static pascal OSStatus WindowEventHandler( EventHandlerCallRef handler , EventRe result = noErr; } break ; + case kEventWindowBoundsChanging : + err = GetEventParameter( event, kEventParamAttributes, typeUInt32, + NULL, sizeof( UInt32 ), NULL, &attributes ); + if ( err == noErr ) + { + Rect newContentRect ; + + GetEventParameter( event, kEventParamCurrentBounds, typeQDRectangle, NULL, + sizeof( newContentRect ), NULL, &newContentRect ); + + wxRect contentRect(newContentRect.left , newContentRect.top , + newContentRect.right - newContentRect.left , + newContentRect.bottom - newContentRect.top) ; + + bool handled = false ; + if ((attributes & kWindowBoundsChangeSizeChanged) != 0) + { + wxSizeEvent event(contentRect , toplevelWindow->GetId()); + event.SetEventObject(toplevelWindow); + handled = toplevelWindow->GetEventHandler()->ProcessEvent(event); + contentRect = event.GetRect() ; + } + else if ( attributes & kWindowBoundsChangeOriginChanged != 0) + { + wxMoveEvent event(contentRect , toplevelWindow->GetId()); + event.SetEventObject(toplevelWindow); + handled = toplevelWindow->GetEventHandler()->ProcessEvent(event); + contentRect = event.GetRect() ; + } + if ( handled ) + { + SetRect( &newContentRect , contentRect.GetLeft() , contentRect.GetTop() , contentRect.GetRight() , contentRect.GetBottom() ) ; + SetEventParameter( event, kEventParamCurrentBounds, typeQDRectangle, sizeof( newContentRect ), &newContentRect ); + } + result = noErr ; + } + break ; default : break ; } @@ -349,64 +401,6 @@ pascal OSStatus wxMacWindowEventHandler( EventHandlerCallRef handler , EventRef DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacWindowEventHandler ) -// Patch 531199 defined a window event handler, as follows. -// TODO: merge the moving/sizing event handling with the event -// handler above. -#if 0 -static pascal OSStatus -WindowHandler( EventHandlerCallRef inHandler, EventRef inEvent, void* userData ) -{ - Rect bounds; - SInt16 height, width; - UInt32 attributes; - OSStatus result = eventNotHandledErr; - - GetEventParameter( inEvent, kEventParamAttributes, typeUInt32, NULL, sizeof( UInt32 ), NULL, &attributes ); - - if ((attributes & (kWindowBoundsChangeSizeChanged | kWindowBoundsChangeOriginChanged)) != 0) - { - // Extract the current bounds. This is the paramter you get to modify to - // alter the window position or size during a window resizing. - GetEventParameter( inEvent, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof( bounds ), NULL, &bounds ); - - wxRect rect; - rect.SetLeft(bounds.left); - rect.SetTop(bounds.top); - rect.SetRight(bounds.right); - rect.SetBottom(bounds.bottom); - - bool rc; - wxWindowMac *pWindow = (wxWindowMac*)userData; - if ((attributes & kWindowBoundsChangeSizeChanged) != 0) { - wxSizeEvent event(rect, pWindow->GetId()); - event.SetEventObject(pWindow); - rc = pWindow->GetEventHandler()->ProcessEvent(event); - rect = event.GetRect(); - } - else { - wxMoveEvent event(rect, pWindow->GetId()); - event.SetEventObject(pWindow); - rc = pWindow->GetEventHandler()->ProcessEvent(event); - rect = event.GetRect(); - } - - if (rc) { - bounds.left = rect.GetLeft(); - bounds.top = rect.GetTop(); - bounds.right = rect.GetRight(); - bounds.bottom = rect.GetBottom(); - } - - // Set the current bounds parameter to our adjusted bounds. Return - // noErr to indicate we handled this event. - SetEventParameter( inEvent, kEventParamCurrentBounds, typeQDRectangle, sizeof( bounds ), &bounds ); - result = noErr; - } - return result; -} -#endif - // WindowHandler - #endif // --------------------------------------------------------------------------- @@ -445,6 +439,7 @@ void wxRemoveMacWindowAssociation(wxTopLevelWindowMac *win) // ---------------------------------------------------------------------------- WXHWND wxTopLevelWindowMac::s_macWindowInUpdate = NULL; +wxTopLevelWindowMac *wxTopLevelWindowMac::s_macDeactivateWindow = NULL; void wxTopLevelWindowMac::Init() { @@ -687,17 +682,6 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, InstallStandardEventHandler( GetWindowEventTarget(MAC_WXHWND(m_macWindow)) ) ; InstallWindowEventHandler(MAC_WXHWND(m_macWindow), GetwxMacWindowEventHandlerUPP(), GetEventTypeCount(eventList), eventList, this, &((EventHandlerRef)m_macEventHandler)); - - // Patch 531199 also defined a window event handler, as follows: -#if 0 - // install a window event handler to send wxEVT_MOVING and wxEVT_SIZING events - EventTypeSpec events[] = { { kEventClassWindow, kEventWindowBoundsChanging } }; - EventHandlerUPP handlerProc = NewEventHandlerUPP( WindowHandler ); - EventHandlerRef eventHandlerRef; - InstallWindowEventHandler( m_macWindowData->m_macWindow, handlerProc, GetEventTypeCount(events), - events, (void*)this, &eventHandlerRef); -#endif - #endif m_macFocus = NULL ; @@ -844,7 +828,7 @@ void wxTopLevelWindowMac::MacFireMouseEvent( if ( kind == mouseDown ) { - if ( timestamp - gs_lastWhen <= GetDblTime() ) + if ( timestamp - gs_lastWhen <= (long) GetDblTime() ) { if ( abs( localwhere.h - gs_lastWhere.h ) < 3 && abs( localwhere.v - gs_lastWhere.v ) < 3 ) { @@ -933,8 +917,21 @@ void wxTopLevelWindowMac::MacMouseMoved( WXEVENTREF ev , short part) #endif +void wxTopLevelWindowMac::MacDelayedDeactivation(long timestamp) +{ + if(s_macDeactivateWindow) + { + wxLogDebug("Doing delayed deactivation of %p",s_macDeactivateWindow); + s_macDeactivateWindow->MacActivate(timestamp, false); + } +} + void wxTopLevelWindowMac::MacActivate( long timestamp , bool inIsActivating ) { + wxLogDebug("TopLevel=%p::MacActivate",this); + if(s_macDeactivateWindow==this) + s_macDeactivateWindow=NULL; + MacDelayedDeactivation(timestamp); wxActivateEvent event(wxEVT_ACTIVATE, inIsActivating , m_windowId); event.m_timeStamp = timestamp ; event.SetEventObject(this);