#include "wx/string.h"
#include "wx/log.h"
#include "wx/intl.h"
+ #include "wx/settings.h"
#endif //WX_PRECOMP
#include "wx/mac/uma.h"
static const EventTypeSpec eventList[] =
{
// TODO remove control related event like key and mouse (except for WindowLeave events)
-#if !TARGET_API_MAC_OSX
+#if 1
{ kEventClassTextInput, kEventTextInputUnicodeForKeyEvent } ,
{ kEventClassKeyboard, kEventRawKeyDown } ,
OSStatus result = eventNotHandledErr ;
wxWindow* focus = wxWindow::FindFocus() ;
+ if ( focus == NULL )
+ return result ;
+
char charCode ;
UInt32 keyCode ;
UInt32 modifiers ;
if ( button == kEventMouseButtonSecondary )
{
if (cEvent.GetKind() == kEventMouseDown )
- wxevent.SetEventType( clickCount > 1 ? wxEVT_RIGHT_DOWN : wxEVT_RIGHT_DCLICK ) ;
+ wxevent.SetEventType( clickCount > 1 ? wxEVT_RIGHT_DCLICK : wxEVT_RIGHT_DOWN ) ;
else if ( cEvent.GetKind() == kEventMouseUp )
wxevent.SetEventType(wxEVT_RIGHT_UP ) ;
}
ControlRef wxMacFindControlUnderMouse( Point location , WindowRef window , ControlPartCode *outPart )
{
#if TARGET_API_MAC_OSX
- return FindControlUnderMouse( location , window , outPart ) ;
-#else
+ if ( UMAGetSystemVersion() >= 1030 )
+ return FindControlUnderMouse( location , window , outPart ) ;
+#endif
ControlRef rootControl = NULL ;
verify_noerr( GetRootControl( window , &rootControl ) ) ;
return wxMacFindSubControl( location , rootControl , outPart ) ;
-#endif
+
}
pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
{
{
ControlPartCode part ;
ControlRef control = wxMacFindControlUnderMouse( windowMouseLocation , window , &part ) ;
- currentMouseWindow = wxFindControlFromMacControl( control ) ;
+ if ( control == 0 )
+ currentMouseWindow = (wxWindow*) data ;
+ else
+ currentMouseWindow = wxFindControlFromMacControl( control ) ;
}
}
#endif // wxUSE_TOOLTIPS
if ( currentMouseWindow->GetEventHandler()->ProcessEvent(wxevent) )
result = noErr;
+ else
+ {
+ ControlPartCode dummyPart ;
+ // if built-in find control is finding the wrong control (ie static box instead of overlaid
+ // button, we cannot let the standard handler do its job, but must handle manually
+
+ if ( ( cEvent.GetKind() == kEventMouseDown ) &&
+ (FindControlUnderMouse(windowMouseLocation , window , &dummyPart) !=
+ wxMacFindControlUnderMouse( windowMouseLocation , window , &dummyPart ) ) )
+ {
+ EventModifiers modifiers = cEvent.GetParameter<EventModifiers>(kEventParamKeyModifiers, typeUInt32) ;
+ HandleControlClick( (ControlRef) currentMouseWindow->GetHandle() , windowMouseLocation ,
+ modifiers , (ControlActionUPP ) -1 ) ;
+ result = noErr ;
+ }
+ }
if ( cEvent.GetKind() == kEventMouseUp && wxTheApp->s_captureWindow )
{
wxTheApp->s_captureWindow = NULL ;
case kEventWindowActivated :
{
toplevelWindow->MacActivate( cEvent.GetTicks() , true) ;
-
wxActivateEvent wxevent(wxEVT_ACTIVATE, true , toplevelWindow->GetId());
wxevent.SetTimestamp( cEvent.GetTicks() ) ;
wxevent.SetEventObject(toplevelWindow);
toplevelWindow->GetEventHandler()->ProcessEvent(wxevent);
- result = noErr ;
+ // we still sending an eventNotHandledErr in order to allow for default processing
break ;
}
case kEventWindowDeactivated :
wxevent.SetTimestamp( cEvent.GetTicks() ) ;
wxevent.SetEventObject(toplevelWindow);
toplevelWindow->GetEventHandler()->ProcessEvent(wxevent);
- result = noErr ;
+ // we still sending an eventNotHandledErr in order to allow for default processing
break ;
}
case kEventWindowShown :
{
UInt32 attributes = cEvent.GetParameter<UInt32>(kEventParamAttributes,typeUInt32) ;
Rect newRect = cEvent.GetParameter<Rect>(kEventParamCurrentBounds) ;
- wxRect r( newRect.left , newRect.top , newRect.right - newRect.left , newRect.bottom - newRect.top ) ;
if ( (attributes & kWindowBoundsChangeSizeChanged) || (attributes & kWindowBoundsChangeOriginChanged) )
{
+ // all (Mac) rects are in content area coordinates, all wxRects in structure coordinates
+ int left , top , right , bottom ;
+ toplevelWindow->MacGetContentAreaInset( left , top , right , bottom ) ;
+ wxRect r( newRect.left - left , newRect.top - top ,
+ newRect.right - newRect.left + left + right , newRect.bottom - newRect.top + top + bottom ) ;
// this is a EVT_SIZING not a EVT_SIZE type !
wxSizeEvent wxevent( r , toplevelWindow->GetId() ) ;
wxevent.SetEventObject( toplevelWindow ) ;
wxRect adjustR = r ;
if ( toplevelWindow->GetEventHandler()->ProcessEvent(wxevent) )
- {
adjustR = wxevent.GetRect() ;
- }
+
if ( toplevelWindow->GetMaxWidth() != -1 && adjustR.GetWidth() > toplevelWindow->GetMaxWidth() )
adjustR.SetWidth( toplevelWindow->GetMaxWidth() ) ;
- if ( toplevelWindow->GetMaxHeight() != -1 && adjustR.GetWidth() > toplevelWindow->GetMaxHeight() )
+ if ( toplevelWindow->GetMaxHeight() != -1 && adjustR.GetHeight() > toplevelWindow->GetMaxHeight() )
adjustR.SetHeight( toplevelWindow->GetMaxHeight() ) ;
if ( toplevelWindow->GetMinWidth() != -1 && adjustR.GetWidth() < toplevelWindow->GetMinWidth() )
adjustR.SetWidth( toplevelWindow->GetMinWidth() ) ;
- if ( toplevelWindow->GetMinHeight() != -1 && adjustR.GetWidth() < toplevelWindow->GetMinHeight() )
+ if ( toplevelWindow->GetMinHeight() != -1 && adjustR.GetHeight() < toplevelWindow->GetMinHeight() )
adjustR.SetHeight( toplevelWindow->GetMinHeight() ) ;
- Rect adjustedRect = { adjustR.y , adjustR.x , adjustR.y + adjustR.height , adjustR.x + adjustR.width } ;
+ Rect adjustedRect = { adjustR.y + top , adjustR.x + left , adjustR.y + adjustR.height - bottom , adjustR.x + adjustR.width - right } ;
if ( !EqualRect( &newRect , &adjustedRect ) )
cEvent.SetParameter( kEventParamCurrentBounds , &adjustedRect ) ;
}
// init our fields
Init();
+ style = style & ~wxFRAME_SHAPED ;
+
m_windowStyle = style;
SetName(name);
MacCreateRealWindow( title, pos , size , MacRemoveBordersFromStyle(style) , name ) ;
+ SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
+
wxTopLevelWindows.Append(this);
if ( parent )
}
}
+void wxTopLevelWindowMac::MacInstallTopLevelWindowEventHandler()
+{
+ if ( m_macEventHandler != NULL )
+ {
+ verify_noerr( ::RemoveEventHandler( (EventHandlerRef) m_macEventHandler ) ) ;
+ }
+ InstallWindowEventHandler(MAC_WXHWND(m_macWindow), GetwxMacTopLevelEventHandlerUPP(),
+ GetEventTypeCount(eventList), eventList, this, (EventHandlerRef *)&m_macEventHandler);
+}
+
void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title,
const wxPoint& pos,
const wxSize& size,
else
{
::CreateRootControl( (WindowRef)m_macWindow , (ControlRef*)&m_macControl ) ;
- MacInstallEventHandler() ;
}
+ // the root control level handleer
+ MacInstallEventHandler() ;
+ // the frame window event handler
InstallStandardEventHandler( GetWindowEventTarget(MAC_WXHWND(m_macWindow)) ) ;
- InstallWindowEventHandler(MAC_WXHWND(m_macWindow), GetwxMacTopLevelEventHandlerUPP(),
- GetEventTypeCount(eventList), eventList, this, (EventHandlerRef *)&m_macEventHandler);
+ MacInstallTopLevelWindowEventHandler() ;
m_macFocus = NULL ;
if(s_macDeactivateWindow==this)
s_macDeactivateWindow=NULL;
MacDelayedDeactivation(timestamp);
+ MacPropagateHiliteChanged() ;
}
void wxTopLevelWindowMac::SetTitle(const wxString& title)
// 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 ;
+ GetWindowBounds( (WindowRef) m_macWindow, kWindowStructureRgn , &structure ) ;
+ GetWindowBounds( (WindowRef) m_macWindow, kWindowContentRgn , &content ) ;
+
+ left = content.left - structure.left ;
+ top = content.top - structure.top ;
+ right = structure.right - content.right ;
+ bottom = structure.bottom - content.bottom ;
+}
+
void wxTopLevelWindowMac::DoMoveWindow(int x, int y, int width, int height)
{
Rect bounds = { y , x , y + height , x + width } ;
#endif
}
+bool wxTopLevelWindowMac::MacGetMetalAppearance() const
+{
+#if TARGET_API_MAC_OSX
+ return MacGetWindowAttributes() & kWindowMetalAttribute ;
+#else
+ return false ;
+#endif
+}
+
void wxTopLevelWindowMac::MacChangeWindowAttributes( wxUint32 attributesToSet , wxUint32 attributesToClear )
{
ChangeWindowAttributes ( (WindowRef) m_macWindow , attributesToSet, attributesToClear ) ;
wxTopLevelWindowMac* win = wxFindWinFromMacWindow(window);
if (win)
{
- wxRect r = win->GetRect();
- SetRectRgn(rgn, r.GetLeft(), r.GetTop(), r.GetRight(), r.GetBottom());
+ Rect r ;
+ wxShapedMacWindowGetPos(window, &r ) ;
+ RectRgn( rgn , &r ) ;
}
}