#include "wx/app.h"
#include "wx/tooltip.h"
#include "wx/dnd.h"
+
#if wxUSE_SYSTEM_OPTIONS
#include "wx/sysopt.h"
#endif
#include <ToolUtils.h>
#endif
-//For targeting OSX
+// for targeting OSX
#include "wx/mac/private.h"
// ----------------------------------------------------------------------------
static const EventTypeSpec eventList[] =
{
- // TODO remove control related event like key and mouse (except for WindowLeave events)
+ // TODO: remove control related event like key and mouse (except for WindowLeave events)
#if 1
- { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent } ,
-
{ kEventClassKeyboard, kEventRawKeyDown } ,
{ kEventClassKeyboard, kEventRawKeyRepeat } ,
{ kEventClassKeyboard, kEventRawKeyUp } ,
{ kEventClassWindow , kEventWindowBoundsChanged } ,
{ kEventClassWindow , kEventWindowClose } ,
- // we have to catch these events on the toplevel window level, as controls don't get the
- // raw mouse events anymore
+ // we have to catch these events on the toplevel window level,
+ // as controls don't get the raw mouse events anymore
{ kEventClassMouse , kEventMouseDown } ,
{ kEventClassMouse , kEventMouseUp } ,
{ kEventClassMouse , kEventMouseDragged } ,
} ;
-static pascal OSStatus TextInputEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
-{
- OSStatus result = eventNotHandledErr ;
-
- wxWindow* focus = wxWindow::FindFocus() ;
- unsigned char charCode ;
- UInt32 keyCode ;
- UInt32 modifiers ;
- Point point ;
-
- EventRef rawEvent ;
-
- GetEventParameter( event, kEventParamTextInputSendKeyboardEvent, typeEventRef, NULL, sizeof(rawEvent), NULL, &rawEvent ) ;
-
- GetEventParameter( rawEvent, kEventParamKeyMacCharCodes, typeChar, NULL,sizeof(char), NULL,&charCode );
- GetEventParameter( rawEvent, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode );
- GetEventParameter( rawEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers );
- GetEventParameter( rawEvent, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &point );
-
- 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 )
- {
- ControlRef macControl = (ControlRef) control->GetHandle() ;
- if ( macControl )
- {
- ::HandleControlKey( macControl , keyCode , charCode , modifiers ) ;
- result = noErr ;
- }
- }
-
-#if 0
- // 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 ;
- }
-#endif
- break ;
-
- default:
- break ;
- }
-
- return result ;
-}
-
static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
{
OSStatus result = eventNotHandledErr ;
// call DoFindFocus instead of FindFocus, because for Composite Windows(like WxGenericListCtrl)
- // FindFocus does not return the actual focus window,but the enclosing window
+ // FindFocus does not return the actual focus window, but the enclosing window
wxWindow* focus = wxWindow::DoFindFocus();
if ( focus == NULL )
focus = (wxTopLevelWindowMac*) data ;
#if wxUSE_UNICODE
UInt32 dataSize = 0 ;
- if ( GetEventParameter( event, kEventParamKeyUnicodes, typeUnicodeText, NULL, 0 , &dataSize , NULL ) == noErr )
+ if ( GetEventParameter( event, kEventParamKeyUnicodes, typeUnicodeText, NULL, 0 , &dataSize, NULL ) == noErr )
{
UniChar buf[2] ;
if ( dataSize > 4 )
charBuf = new UniChar[ dataSize / sizeof( UniChar) ] ;
GetEventParameter( event, kEventParamKeyUnicodes, typeUnicodeText, NULL, dataSize , NULL , charBuf ) ;
+
#if SIZEOF_WCHAR_T == 2
uniChar = charBuf[0] ;
#else
wxMBConvUTF16 converter ;
converter.MB2WC( &uniChar , (const char*)charBuf , 1 ) ;
#endif
+
if ( dataSize > 4 )
delete[] charBuf ;
}
#endif
- GetEventParameter( event, kEventParamKeyMacCharCodes, typeChar, NULL,sizeof(char), NULL,&charCode );
+ GetEventParameter( event, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &charCode );
GetEventParameter( event, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode );
GetEventParameter( event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers );
GetEventParameter( event, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &point );
UInt32 message = (keyCode << 8) + charCode;
- switch( GetEventKind( event ) )
+ switch ( GetEventKind( event ) )
{
case kEventRawKeyRepeat :
case kEventRawKeyDown :
event.m_controlDown = modifiers & controlKey;
event.m_altDown = modifiers & optionKey;
event.m_metaDown = modifiers & cmdKey;
+ event.m_x = point.h;
+ event.m_y = point.v;
+
#if wxUSE_UNICODE
event.m_uniChar = uniChar ;
#endif
- event.m_x = point.h;
- event.m_y = point.v;
+
event.SetTimestamp(when);
event.SetEventObject(focus);
event.SetEventType( ( modifiers & cmdKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;
focus->GetEventHandler()->ProcessEvent( event ) ;
}
+
wxApp::s_lastModifiers = modifiers ;
}
break ;
// this parameter are not given for all events
EventMouseButton button = 0 ;
UInt32 clickCount = 0 ;
- cEvent.GetParameter<EventMouseButton>(kEventParamMouseButton, typeMouseButton , &button) ;
- cEvent.GetParameter<UInt32>(kEventParamClickCount, typeUInt32 , &clickCount ) ;
+ cEvent.GetParameter<EventMouseButton>( kEventParamMouseButton, typeMouseButton , &button ) ;
+ cEvent.GetParameter<UInt32>( kEventParamClickCount, typeUInt32 , &clickCount ) ;
wxevent.m_x = screenMouseLocation.h;
wxevent.m_y = screenMouseLocation.v;
else if ( lastButton )
button = lastButton ;
- // determinate the correct down state, wx does not want a 'down' for a mouseUp event, while mac delivers
- // this button
+ // determine the correct down state, wx does not want a 'down' for a mouseUp event,
+ // while mac delivers this button
if ( button != 0 && cEvent.GetKind() != kEventMouseUp )
{
- switch( button )
+ switch ( button )
{
case kEventMouseButtonPrimary :
wxevent.m_leftDown = true ;
switch ( button )
{
case kEventMouseButtonPrimary :
- wxevent.SetEventType(clickCount > 1 ? wxEVT_LEFT_DCLICK : wxEVT_LEFT_DOWN ) ;
+ wxevent.SetEventType( clickCount > 1 ? wxEVT_LEFT_DCLICK : wxEVT_LEFT_DOWN ) ;
break ;
case kEventMouseButtonSecondary :
break ;
case kEventMouseButtonTertiary :
- wxevent.SetEventType(clickCount > 1 ? wxEVT_MIDDLE_DCLICK : wxEVT_MIDDLE_DOWN ) ;
+ wxevent.SetEventType( clickCount > 1 ? wxEVT_MIDDLE_DCLICK : wxEVT_MIDDLE_DOWN ) ;
break ;
default:
case kEventMouseWheelMoved :
{
- wxevent.SetEventType(wxEVT_MOUSEWHEEL ) ;
+ wxevent.SetEventType( wxEVT_MOUSEWHEEL ) ;
// EventMouseWheelAxis axis = cEvent.GetParameter<EventMouseWheelAxis>(kEventParamMouseWheelAxis, typeMouseWheelAxis) ;
SInt32 delta = cEvent.GetParameter<SInt32>(kEventParamMouseWheelDelta, typeLongInteger) ;
break ;
default :
- wxevent.SetEventType(wxEVT_MOTION ) ;
+ wxevent.SetEventType( wxEVT_MOTION ) ;
break ;
}
}
if ( superControl )
{
UInt16 childrenCount = 0 ;
+ ControlHandle sibling ;
+ Rect r ;
OSStatus err = CountSubControls( superControl , &childrenCount ) ;
if ( err == errControlIsNotEmbedder )
return NULL ;
+
wxASSERT_MSG( err == noErr , wxT("Unexpected error when accessing subcontrols") ) ;
for ( UInt16 i = childrenCount ; i >=1 ; --i )
{
- ControlHandle sibling ;
err = GetIndexedSubControl( superControl , i , & sibling ) ;
if ( err == errControlIsNotEmbedder )
return NULL ;
wxASSERT_MSG( err == noErr , wxT("Unexpected error when accessing subcontrols") ) ;
if ( IsControlVisible( sibling ) )
{
- Rect r ;
UMAGetControlBoundsInWindowCoords( sibling , &r ) ;
if ( MacPtInRect( location , &r ) )
{
ControlHandle child = wxMacFindSubControl( toplevelWindow , location , sibling , outPart ) ;
if ( child )
+ {
return child ;
+ }
else
{
Point testLocation = location ;
}
*outPart = TestControl( sibling , testLocation ) ;
+
return sibling ;
}
}
if ( UMAGetSystemVersion() >= 0x1030 && ( toplevelWindow == 0 || toplevelWindow->MacUsesCompositing() ) )
return FindControlUnderMouse( location , window , outPart ) ;
#endif
+
ControlRef rootControl = NULL ;
verify_noerr( GetRootControl( window , &rootControl ) ) ;
- return wxMacFindSubControl( toplevelWindow , location , rootControl , outPart ) ;
+ return wxMacFindSubControl( toplevelWindow , location , rootControl , outPart ) ;
}
#define NEW_CAPTURE_HANDLING 1
control = wxMacFindControlUnderMouse( toplevelWindow , windowMouseLocation , window , &part ) ;
// if there is no control below the mouse position, send the event to the toplevel window itself
if ( control == 0 )
+ {
currentMouseWindow = (wxWindow*) data ;
+ }
else
{
currentMouseWindow = wxFindControlFromMacControl( control ) ;
#endif
}
}
+
+ // disabled windows must not get any input messages
+ if ( currentMouseWindow && !currentMouseWindow->MacIsReallyEnabled() )
+ currentMouseWindow = NULL;
}
}
g_MacLastWindow->ScreenToClient( &eventleave.m_x, &eventleave.m_y );
eventleave.SetEventObject( g_MacLastWindow ) ;
wxevent.SetId( g_MacLastWindow->GetId() ) ;
+
#if wxUSE_TOOLTIPS
wxToolTip::RelayEvent( g_MacLastWindow , eventleave);
-#endif // wxUSE_TOOLTIPS
+#endif
+
g_MacLastWindow->GetEventHandler()->ProcessEvent(eventleave);
}
currentMouseWindow->ScreenToClient( &evententer.m_x, &evententer.m_y );
evententer.SetEventObject( currentMouseWindow ) ;
wxevent.SetId( currentMouseWindow->GetId() ) ;
+
#if wxUSE_TOOLTIPS
- wxToolTip::RelayEvent( currentMouseWindow , evententer);
-#endif // wxUSE_TOOLTIPS
+ wxToolTip::RelayEvent( currentMouseWindow , evententer );
+#endif
+
currentMouseWindow->GetEventHandler()->ProcessEvent(evententer);
}
// make tooltips current
- #if wxUSE_TOOLTIPS
- if ( wxevent.GetEventType() == wxEVT_MOTION
- || wxevent.GetEventType() == wxEVT_ENTER_WINDOW
- || wxevent.GetEventType() == wxEVT_LEAVE_WINDOW )
- wxToolTip::RelayEvent( currentMouseWindow , wxevent);
- #endif // wxUSE_TOOLTIPS
+#if wxUSE_TOOLTIPS
+ if ( wxevent.GetEventType() == wxEVT_MOTION )
+ wxToolTip::RelayEvent( currentMouseWindow , wxevent );
+#endif
+
if ( currentMouseWindow->GetEventHandler()->ProcessEvent(wxevent) )
{
if ((currentMouseWindowParent != NULL) &&
if ((currentMouseWindowParent != NULL) &&
(currentMouseWindowParent->GetChildren().Find(currentMouseWindow) == NULL))
+ {
currentMouseWindow = NULL;
+ }
}
+
result = noErr ;
}
}
cursorPoint += cursorTarget->GetPosition();
}
- } // else if ( currentMouseWindow )
- else
+ }
+ else // currentMouseWindow == NULL
{
// don't mess with controls we don't know about
// for some reason returning eventNotHandledErr does not lead to the correct behaviour
{
EventModifiers modifiers = cEvent.GetParameter<EventModifiers>(kEventParamKeyModifiers, typeUInt32) ;
Point clickLocation = windowMouseLocation ;
+#if TARGET_API_MAC_OSX
if ( toplevelWindow->MacUsesCompositing() )
{
-#ifdef __WXMAC_OSX__
HIPoint hiPoint ;
hiPoint.x = clickLocation.h ;
hiPoint.y = clickLocation.v ;
HIViewConvertPoint( &hiPoint , (ControlRef) toplevelWindow->GetHandle() , control ) ;
clickLocation.h = (int)hiPoint.x ;
clickLocation.v = (int)hiPoint.y ;
-#endif
}
+#endif // TARGET_API_MAC_OSX
HandleControlClick( control , clickLocation , modifiers , (ControlActionUPP ) -1 ) ;
result = noErr ;
}
}
+
return result ;
}
wxFrame *frame = wxDynamicCast( toplevelWindow , wxFrame ) ;
if ( frame )
{
-#if wxUSE_STATUSBAR
- frame->PositionStatusBar();
-#endif
-#if wxUSE_TOOLBAR
- frame->PositionToolBar();
-#endif
+ frame->PositionBars();
}
wxSizeEvent event( r.GetSize() , toplevelWindow->GetId() ) ;
result = KeyboardEventHandler( handler, event , data ) ;
break ;
- case kEventClassTextInput :
- result = TextInputEventHandler( handler, event , data ) ;
- break ;
-
case kEventClassWindow :
result = wxMacTopLevelWindowEventHandler( handler, event , data ) ;
break ;
{
wxPoint m_position ;
wxSize m_size ;
+ bool m_wasResizable ;
}
FullScreenData ;
void wxTopLevelWindowMac::Maximize(bool maximize)
{
- // TODO Check, is this still necessary
+ // TODO: check if this is still necessary
#if 0
- wxMacPortStateHelper help( (GrafPtr) GetWindowPort( (WindowRef) m_macWindow) ) ;
- wxMacWindowClipper clip (this);
+ wxMacPortStateHelper help( (GrafPtr)GetWindowPort( (WindowRef)m_macWindow) ) ;
+ wxMacWindowClipper clip( this );
#endif
if ( !IsWindowInStandardState( (WindowRef)m_macWindow, NULL, NULL ) )
{
Rect rect;
+
GetWindowBounds((WindowRef)m_macWindow, kWindowGlobalPortRgn, &rect);
SetWindowIdealUserState((WindowRef)m_macWindow, &rect);
SetWindowUserState((WindowRef)m_macWindow, &rect);
bool wxTopLevelWindowMac::IsMaximized() const
{
- return IsWindowInStandardState( (WindowRef)m_macWindow , NULL , NULL ) ;
+ return IsWindowInStandardState( (WindowRef)m_macWindow , NULL , NULL ) ;
}
void wxTopLevelWindowMac::Iconize(bool iconize)
GetEventTypeCount(eventList), eventList, this, (EventHandlerRef *)&m_macEventHandler );
}
-void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title,
- const wxPoint& pos,
- const wxSize& size,
- long style,
- const wxString& name )
+void wxTopLevelWindowMac::MacCreateRealWindow(
+ const wxString& title,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxString& name )
{
OSStatus err = noErr ;
SetName(name);
wxCHECK_RET( err == noErr, wxT("Mac OS error when trying to create new window") );
- // the create commands are only for content rect, so we have to set the size again as
- // structure bounds
+ // 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*/) ;
-#if TARGET_API_MAC_OSX
+#if TARGET_API_MAC_OSX
if ( m_macUsesCompositing )
{
// There is a bug in 10.2.X for ::GetRootControl returning the window view instead of
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 wxUSE_SYSTEM_OPTIONS // code contributed by Ryan Wilcox December 18, 2003
- bool plainTransition = UMAGetSystemVersion() >= 0x1000 ;
- if ( wxSystemOptions::HasOption(wxMAC_WINDOW_PLAIN_TRANSITION) )
- plainTransition = ( wxSystemOptions::GetOptionInt( wxMAC_WINDOW_PLAIN_TRANSITION ) == 1 ) ;
-
if ( plainTransition )
- {
::ShowWindow( (WindowRef)m_macWindow );
- }
else
-#endif
- {
::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);
+ wxSizeEvent event(GetSize() , m_windowId);
event.SetEventObject(this);
GetEventHandler()->ProcessEvent(event);
}
else
{
-#if wxUSE_SYSTEM_OPTIONS
- bool plainTransition = UMAGetSystemVersion() >= 0x1000 ;
- if ( wxSystemOptions::HasOption(wxMAC_WINDOW_PLAIN_TRANSITION) )
- plainTransition = ( wxSystemOptions::GetOptionInt( wxMAC_WINDOW_PLAIN_TRANSITION ) == 1 ) ;
if ( plainTransition )
- {
- ::HideWindow((WindowRef) m_macWindow );
- }
+ ::HideWindow( (WindowRef)m_macWindow );
else
-#endif
- {
- ::TransitionWindow((WindowRef)m_macWindow, kWindowZoomTransitionEffect, kWindowHideTransitionAction, NULL );
- }
+ ::TransitionWindow( (WindowRef)m_macWindow, kWindowZoomTransitionEffect, kWindowHideTransitionAction, NULL );
}
MacPropagateVisibilityChanged() ;
m_macFullScreenData = data ;
data->m_position = GetPosition() ;
data->m_size = GetSize() ;
+ data->m_wasResizable = MacGetWindowAttributes() & kWindowResizableAttribute ;
if ( style & wxFULLSCREEN_NOMENUBAR )
HideMenuBar() ;
}
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 ) ;
#endif
}
-// we are still using coordinates of the content view; TODO: switch to structure bounds
-
+// we are still using coordinates of the content view
+// TODO: switch to structure bounds
+//
void wxTopLevelWindowMac::MacGetContentAreaInset( int &left , int &top , int &right , int &bottom )
{
- Rect content ;
- Rect structure ;
+ Rect content, structure ;
+
GetWindowBounds( (WindowRef) m_macWindow, kWindowStructureRgn , &structure ) ;
GetWindowBounds( (WindowRef) m_macWindow, kWindowContentRgn , &content ) ;
static pascal void wxMacNMResponse( NMRecPtr ptr )
{
NMRemove( ptr ) ;
- DisposePtr( (Ptr) ptr ) ;
+ DisposePtr( (Ptr)ptr ) ;
}
-
void wxTopLevelWindowMac::RequestUserAttention(int flags )
{
NMRecPtr notificationRequest = (NMRecPtr) NewPtr( sizeof( NMRec) ) ;
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.
+ // The empty region signifies that the shape
+ // should be removed from the window.
if ( region.IsEmpty() )
{
wxSize sz = GetClientSize();
static void wxShapedMacWindowGetPos(WindowRef window, Rect* inRect)
{
GetWindowPortBounds(window, inRect);
- Point pt = {inRect->left, inRect->top};
- QDLocalToGlobalPoint( GetWindowPort(window) , &pt ) ;
+ Point pt = { inRect->left, inRect->top };
+
+ QDLocalToGlobalPoint( GetWindowPort(window), &pt ) ;
inRect->top = pt.v;
inRect->left = pt.h;
inRect->bottom += pt.v;