UInt32 keyCode ;
UInt32 modifiers ;
Point point ;
- UInt32 when = EventTimeToTicks( GetEventTime( event ) ) ;
EventRef rawEvent ;
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 ;
}
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
// ---------------------------------------------------------------------------
attr |= kWindowCloseBoxAttribute ;
}
+#if TARGET_CARBON
+#if 0 // having problems right now with that
if (HasFlag(wxSTAY_ON_TOP))
wclass = kUtilityWindowClass;
+#endif
+#endif
#if TARGET_CARBON
if ( HasFlag(wxFRAME_SHAPED) )
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 ;
{
wxMacPortStateHelper help( (GrafPtr) GetWindowPort( (WindowRef) m_macWindow) ) ;
+ RgnHandle visRgn = NewRgn() ;
+ GetPortVisibleRegion( GetWindowPort( (WindowRef)m_macWindow ), visRgn );
BeginUpdate( (WindowRef)m_macWindow ) ;
RgnHandle updateRgn = NewRgn();
RgnHandle diffRgn = NewRgn() ;
+
if ( updateRgn && diffRgn )
{
#if 1
// macos internal control redraws clean up areas we'd like to redraw ourselves
// therefore we pick the boundary rect and make sure we can redraw it
+ // this has to be intersected by the visRgn in order to avoid drawing over its own
+ // boundaries
RgnHandle trueUpdateRgn = NewRgn() ;
Rect trueUpdateRgnBoundary ;
GetPortVisibleRegion( GetWindowPort( (WindowRef)m_macWindow ), trueUpdateRgn );
GetRegionBounds( trueUpdateRgn , &trueUpdateRgnBoundary ) ;
- RectRgn( (RgnHandle) updateRgn , &trueUpdateRgnBoundary ) ;
+ RectRgn( updateRgn , &trueUpdateRgnBoundary ) ;
+ SectRgn( updateRgn , visRgn , updateRgn ) ;
if ( trueUpdateRgn )
DisposeRgn( trueUpdateRgn ) ;
SetPortVisibleRegion( GetWindowPort( (WindowRef)m_macWindow ), updateRgn ) ;
DisposeRgn( updateRgn );
if ( diffRgn )
DisposeRgn( diffRgn );
+ if ( visRgn )
+ DisposeRgn( visRgn ) ;
+
EndUpdate( (WindowRef)m_macWindow ) ;
SetEmptyRgn( (RgnHandle) m_macNoEraseUpdateRgn ) ;
m_macNeedsErasing = false ;
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 )
{
// Early versions of MacOS X don't refresh backgrounds properly,
// so refresh the whole window on activation and deactivation.
long osVersion = UMAGetSystemVersion();
- if (osVersion >= 0x1000 && osVersion < 0x1020)
+ if (osVersion >= 0x1000 && osVersion < 0x1020 )
{
Refresh(TRUE);
}
if (show)
{
- // this is leading to incorrect window layering in some situations
- // ::TransitionWindow((WindowRef)m_macWindow,kWindowZoomTransitionEffect,kWindowShowTransitionAction,nil);
- ::ShowWindow( (WindowRef)m_macWindow ) ;
+ ::TransitionWindow((WindowRef)m_macWindow,kWindowZoomTransitionEffect,kWindowShowTransitionAction,nil);
::SelectWindow( (WindowRef)m_macWindow ) ;
// no need to generate events here, they will get them triggered by macos
// actually they should be , but apparently they are not
}
else
{
- // this is leading to incorrect window layering in some situations
- // ::TransitionWindow((WindowRef)m_macWindow,kWindowZoomTransitionEffect,kWindowHideTransitionAction,nil);
- ::HideWindow( (WindowRef)m_macWindow ) ;
+ ::TransitionWindow((WindowRef)m_macWindow,kWindowZoomTransitionEffect,kWindowHideTransitionAction,nil);
}
if ( !show )
#endif
}
-
-
// ---------------------------------------------------------------------------
// 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
// ---------------------------------------------------------------------------
#if TARGET_CARBON
+
static void wxShapedMacWindowGetPos(WindowRef window, Rect* inRect)
{
GetWindowPortBounds(window, inRect);
return 0;
}
+
#endif
// ---------------------------------------------------------------------------
+