From 17e2694c5957fa82f3da9b338cd0937a98106005 Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Tue, 13 Apr 2010 20:24:59 +0000 Subject: [PATCH] adding wrapping possibility for native tlws git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63969 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/osx/carbon/private.h | 2 + include/wx/osx/cocoa/private.h | 1 + include/wx/osx/core/private.h | 2 + include/wx/osx/nonownedwnd.h | 4 +- include/wx/osx/window.h | 4 ++ src/osx/carbon/nonownedwnd.cpp | 87 +++++++++++++++++++-------------- src/osx/carbon/window.cpp | 12 ++++- src/osx/cocoa/nonownedwnd.mm | 25 ++++++++-- src/osx/cocoa/window.mm | 18 +++++-- src/osx/nonownedwnd_osx.cpp | 17 +++++-- src/osx/window_osx.cpp | 1 + 11 files changed, 122 insertions(+), 51 deletions(-) diff --git a/include/wx/osx/carbon/private.h b/include/wx/osx/carbon/private.h index c677e83316..ab9ac47ed4 100644 --- a/include/wx/osx/carbon/private.h +++ b/include/wx/osx/carbon/private.h @@ -1002,12 +1002,14 @@ class wxNonOwnedWindowCarbonImpl : public wxNonOwnedWindowImpl { public : wxNonOwnedWindowCarbonImpl( wxNonOwnedWindow* nonownedwnd) ; + wxNonOwnedWindowCarbonImpl(); virtual ~wxNonOwnedWindowCarbonImpl(); virtual void WillBeDestroyed() ; void Create( wxWindow* parent, const wxPoint& pos, const wxSize& size, long style, long extraStyle, const wxString& name ) ; + void Create( wxWindow* parent, WXWindow nativeWindow ); WXWindow GetWXWindow() const; void Raise(); diff --git a/include/wx/osx/cocoa/private.h b/include/wx/osx/cocoa/private.h index b8b0e07d31..893aba3ac2 100644 --- a/include/wx/osx/cocoa/private.h +++ b/include/wx/osx/cocoa/private.h @@ -209,6 +209,7 @@ public : virtual void WillBeDestroyed() ; void Create( wxWindow* parent, const wxPoint& pos, const wxSize& size, long style, long extraStyle, const wxString& name ) ; + void Create( wxWindow* parent, WXWindow nativeWindow ); WXWindow GetWXWindow() const; void Raise(); diff --git a/include/wx/osx/core/private.h b/include/wx/osx/core/private.h index 8844689e36..b3ff76448d 100644 --- a/include/wx/osx/core/private.h +++ b/include/wx/osx/core/private.h @@ -796,6 +796,8 @@ public : // static creation methods, must be implemented by all toolkits + static wxNonOwnedWindowImpl* CreateNonOwnedWindow( wxNonOwnedWindow* wxpeer, wxWindow* parent, WXWindow native) ; + static wxNonOwnedWindowImpl* CreateNonOwnedWindow( wxNonOwnedWindow* wxpeer, wxWindow* parent, const wxPoint& pos, const wxSize& size, long style, long extraStyle, const wxString& name ) ; diff --git a/include/wx/osx/nonownedwnd.h b/include/wx/osx/nonownedwnd.h index 57de414d6c..8a82458f8e 100644 --- a/include/wx/osx/nonownedwnd.h +++ b/include/wx/osx/nonownedwnd.h @@ -55,6 +55,8 @@ public: long style = 0, const wxString& name = wxPanelNameStr); + bool Create(wxWindow *parent, WXWindow nativeWindow); + virtual ~wxNonOwnedWindow(); virtual wxPoint GetClientAreaOrigin() const; @@ -106,7 +108,7 @@ public: virtual void HandleResizing( double timestampsec, wxRect* rect ); virtual bool Destroy(); - + protected: // common part of all ctors void Init(); diff --git a/include/wx/osx/window.h b/include/wx/osx/window.h index 51f34e91d7..9f5b7ae7bf 100644 --- a/include/wx/osx/window.h +++ b/include/wx/osx/window.h @@ -263,6 +263,8 @@ public: virtual bool OSXHandleClicked( double timestampsec ); virtual bool OSXHandleKeyEvent( wxKeyEvent& event ); + + bool IsNativeWindowWrapper() const { return m_isNativeWindowWrapper; } protected: // For controls like radio buttons which are genuinely composite wxList m_subControls; @@ -297,6 +299,8 @@ protected: bool m_vScrollBarAlwaysShown; wxWindow* m_growBox ; wxString m_label ; + + bool m_isNativeWindowWrapper; // set to true if we do a sharp clip at the content area of this window // must be dynamic as eg a panel normally is not clipping precisely, but if diff --git a/src/osx/carbon/nonownedwnd.cpp b/src/osx/carbon/nonownedwnd.cpp index f5e87300b6..bdebc836a5 100644 --- a/src/osx/carbon/nonownedwnd.cpp +++ b/src/osx/carbon/nonownedwnd.cpp @@ -1134,7 +1134,7 @@ wxNonOwnedWindowCarbonImpl::~wxNonOwnedWindowCarbonImpl() m_macEventHandler = NULL ; } - if ( m_macWindow ) + if ( m_macWindow && !m_wxPeer->IsNativeWindowWrapper()) DisposeWindow( m_macWindow ); FullScreenData *data = (FullScreenData *) m_macFullScreenData ; @@ -1192,30 +1192,37 @@ void wxNonOwnedWindowCarbonImpl::MacInstallTopLevelWindowEventHandler() void wxNonOwnedWindowCarbonImpl::Create( wxWindow* parent, - const wxPoint& pos, - const wxSize& size, - long style, long extraStyle, - const wxString& WXUNUSED(name) ) + WXWindow nativeWindow ) { + m_macWindow = nativeWindow; +} +void wxNonOwnedWindowCarbonImpl::Create( + wxWindow* parent, + const wxPoint& pos, + const wxSize& size, + long style, long extraStyle, + const wxString& WXUNUSED(name) ) +{ + OSStatus err = noErr ; Rect theBoundsRect; - + int x = (int)pos.x; int y = (int)pos.y; - + int w = size.x; int h = size.y; - + ::SetRect(&theBoundsRect, x, y , x + w, y + h); - + // translate the window attributes in the appropriate window class and attributes WindowClass wclass = 0; WindowAttributes attr = kWindowNoAttributes ; WindowGroupRef group = NULL ; bool activationScopeSet = false; WindowActivationScope activationScope = kWindowActivationScopeNone; - + if ( style & wxFRAME_TOOL_WINDOW ) { if ( @@ -1228,7 +1235,7 @@ void wxNonOwnedWindowCarbonImpl::Create( wclass = kUtilityWindowClass; else wclass = kFloatingWindowClass ; - + if ( ( style &wxTINY_CAPTION_VERT) ) attr |= kWindowSideTitlebarAttribute ; } @@ -1287,81 +1294,81 @@ void wxNonOwnedWindowCarbonImpl::Create( wclass = kPlainWindowClass ; } } - + if ( wclass != kPlainWindowClass ) { if ( ( style & wxMINIMIZE_BOX ) ) attr |= kWindowCollapseBoxAttribute ; - + if ( ( style & wxMAXIMIZE_BOX ) ) attr |= kWindowFullZoomAttribute ; - + if ( ( style & wxRESIZE_BORDER ) ) attr |= kWindowResizableAttribute ; - + if ( ( style & wxCLOSE_BOX) ) attr |= kWindowCloseBoxAttribute ; } attr |= kWindowLiveResizeAttribute; - + if ( ( style &wxSTAY_ON_TOP) ) group = GetWindowGroupOfClass(kUtilityWindowClass) ; - + if ( ( style & wxFRAME_FLOAT_ON_PARENT ) ) group = GetWindowGroupOfClass(kFloatingWindowClass) ; - + if ( group == NULL && parent != NULL ) { WindowRef parenttlw = (WindowRef) parent->MacGetTopLevelWindowRef(); if( parenttlw ) group = GetWindowGroupParent( GetWindowGroup( parenttlw ) ); } - + attr |= kWindowCompositingAttribute; #if 0 // TODO : decide on overall handling of high dpi screens (pixel vs userscale) attr |= kWindowFrameworkScaledAttribute; #endif - + if ( ( style &wxFRAME_SHAPED) ) { WindowDefSpec customWindowDefSpec; customWindowDefSpec.defType = kWindowDefProcPtr; customWindowDefSpec.u.defProc = #ifdef __LP64__ - (WindowDefUPP) wxShapedMacWindowDef; + (WindowDefUPP) wxShapedMacWindowDef; #else - NewWindowDefUPP(wxShapedMacWindowDef); + NewWindowDefUPP(wxShapedMacWindowDef); #endif err = ::CreateCustomWindow( &customWindowDefSpec, wclass, - attr, &theBoundsRect, - (WindowRef*) &m_macWindow); + attr, &theBoundsRect, + (WindowRef*) &m_macWindow); } else { err = ::CreateNewWindow( wclass , attr , &theBoundsRect , (WindowRef*)&m_macWindow ) ; } - + if ( err == noErr && m_macWindow != NULL && group != NULL ) SetWindowGroup( (WindowRef) m_macWindow , group ) ; - + wxCHECK_RET( err == noErr, wxT("Mac OS error when trying to create new window") ); - + // setup a separate group for each window, so that overlays can be handled easily - + WindowGroupRef overlaygroup = NULL; verify_noerr( CreateWindowGroup( kWindowGroupAttrMoveTogether | kWindowGroupAttrLayerTogether | kWindowGroupAttrHideOnCollapse, &overlaygroup )); verify_noerr( SetWindowGroupParent( overlaygroup, GetWindowGroup( (WindowRef) m_macWindow ))); verify_noerr( SetWindowGroup( (WindowRef) m_macWindow , overlaygroup )); - + if ( activationScopeSet ) { verify_noerr( SetWindowActivationScope( (WindowRef) m_macWindow , activationScope )); } - + // the create commands are only for content rect, // so we have to set the size again as structure bounds SetWindowBounds( m_macWindow , kWindowStructureRgn , &theBoundsRect ) ; - + // Causes the inner part of the window not to be metal // if the style is used before window creation. #if 0 // TARGET_API_MAC_OSX @@ -1371,24 +1378,24 @@ void wxNonOwnedWindowCarbonImpl::Create( MacSetMetalAppearance( true ) ; } #endif - + if ( m_macWindow != NULL ) { MacSetUnifiedAppearance( true ) ; } - + HIViewRef growBoxRef = 0 ; err = HIViewFindByID( HIViewGetRoot( m_macWindow ), kHIViewWindowGrowBoxID, &growBoxRef ); if ( err == noErr && growBoxRef != 0 ) HIGrowBoxViewSetTransparent( growBoxRef, true ) ; - + // the frame window event handler InstallStandardEventHandler( GetWindowEventTarget(m_macWindow) ) ; MacInstallTopLevelWindowEventHandler() ; - + if ( extraStyle & wxFRAME_EX_METAL) MacSetMetalAppearance(true); - + if ( ( style &wxFRAME_SHAPED) ) { // default shape matches the window size @@ -1689,3 +1696,11 @@ wxNonOwnedWindowImpl* wxNonOwnedWindowImpl::CreateNonOwnedWindow( wxNonOwnedWind now->Create( parent, pos, size, style , extraStyle, name ); return now; } + +wxNonOwnedWindowImpl* wxNonOwnedWindowImpl::CreateNonOwnedWindow( wxNonOwnedWindow* wxpeer, wxWindow* parent, WXWindow nativeWindow ) +{ + wxNonOwnedWindowCarbonImpl* now = new wxNonOwnedWindowCarbonImpl( wxpeer ); + now->Create( parent, nativeWindow ); + return now; +} + diff --git a/src/osx/carbon/window.cpp b/src/osx/carbon/window.cpp index 1e54d5a279..cab7af9aad 100644 --- a/src/osx/carbon/window.cpp +++ b/src/osx/carbon/window.cpp @@ -188,7 +188,13 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl OSStatus err = cEvent.GetParameter(kEventParamCGContextRef, &cgContext) ; if ( err != noErr ) { - wxFAIL_MSG("Unable to retrieve CGContextRef"); + // for non-composite drawing, since we don't support it ourselves, send it through the + // the default handler + // CallNextEventHandler( handler,event ) ; + // result = noErr ; + if ( allocatedRgn ) + CFRelease( allocatedRgn ) ; + break; } thisWindow->MacSetCGContextRef( cgContext ) ; @@ -1515,6 +1521,8 @@ wxWidgetImplType* wxWidgetImpl::CreateContentView( wxNonOwnedWindow* now ) } // the root control level handler - contentview->InstallEventHandler() ; + if ( !now->IsNativeWindowWrapper() ) + contentview->InstallEventHandler() ; + return contentview; } diff --git a/src/osx/cocoa/nonownedwnd.mm b/src/osx/cocoa/nonownedwnd.mm index 666864b9ad..ce605c4161 100644 --- a/src/osx/cocoa/nonownedwnd.mm +++ b/src/osx/cocoa/nonownedwnd.mm @@ -361,14 +361,20 @@ wxNonOwnedWindowCocoaImpl::wxNonOwnedWindowCocoaImpl() wxNonOwnedWindowCocoaImpl::~wxNonOwnedWindowCocoaImpl() { - [m_macWindow setImplementation:nil]; - [m_macWindow setDelegate:nil]; - [m_macWindow release]; + if ( !m_wxPeer->IsNativeWindowWrapper() ) + { + [m_macWindow setImplementation:nil]; + [m_macWindow setDelegate:nil]; + [m_macWindow release]; + } } void wxNonOwnedWindowCocoaImpl::WillBeDestroyed() { - [m_macWindow setDelegate:nil]; + if ( !m_wxPeer->IsNativeWindowWrapper() ) + { + [m_macWindow setDelegate:nil]; + } } void wxNonOwnedWindowCocoaImpl::Create( wxWindow* WXUNUSED(parent), const wxPoint& pos, const wxSize& size, @@ -493,6 +499,10 @@ long style, long extraStyle, const wxString& WXUNUSED(name) ) } } +void wxNonOwnedWindowCocoaImpl::Create( wxWindow* WXUNUSED(parent), WXWindow nativeWindow ) +{ + m_macWindow = nativeWindow; +} WXWindow wxNonOwnedWindowCocoaImpl::GetWXWindow() const { @@ -787,6 +797,13 @@ bool wxNonOwnedWindowCocoaImpl::IsModified() const return [m_macWindow isDocumentEdited]; } +wxNonOwnedWindowImpl* wxNonOwnedWindowImpl::CreateNonOwnedWindow( wxNonOwnedWindow* wxpeer, wxWindow* parent, WXWindow nativeWindow) +{ + wxNonOwnedWindowCocoaImpl* now = new wxNonOwnedWindowCocoaImpl( wxpeer ); + now->Create( parent, nativeWindow ); + return now; +} + wxNonOwnedWindowImpl* wxNonOwnedWindowImpl::CreateNonOwnedWindow( wxNonOwnedWindow* wxpeer, wxWindow* parent, const wxPoint& pos, const wxSize& size, long style, long extraStyle, const wxString& name ) { diff --git a/src/osx/cocoa/window.mm b/src/osx/cocoa/window.mm index f2e96c78d9..6acdec29ee 100644 --- a/src/osx/cocoa/window.mm +++ b/src/osx/cocoa/window.mm @@ -2084,10 +2084,18 @@ wxWidgetImpl* wxWidgetImpl::CreateUserPane( wxWindowMac* wxpeer, wxWindowMac* WX wxWidgetImpl* wxWidgetImpl::CreateContentView( wxNonOwnedWindow* now ) { NSWindow* tlw = now->GetWXWindow(); - wxNSView* v = [[wxNSView alloc] initWithFrame:[[tlw contentView] frame]]; - - wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( now, v, true ); - c->InstallEventHandler(); - [tlw setContentView:v]; + + wxWidgetCocoaImpl* c = NULL; + if ( now->IsNativeWindowWrapper() ) + { + c = new wxWidgetCocoaImpl( now, [tlw contentView], true ); + } + else + { + wxNSView* v = [[wxNSView alloc] initWithFrame:[[tlw contentView] frame]]; + c = new wxWidgetCocoaImpl( now, v, true ); + c->InstallEventHandler(); + [tlw setContentView:v]; + } return c; } diff --git a/src/osx/nonownedwnd_osx.cpp b/src/osx/nonownedwnd_osx.cpp index a75e778ba8..741b646877 100644 --- a/src/osx/nonownedwnd_osx.cpp +++ b/src/osx/nonownedwnd_osx.cpp @@ -98,6 +98,7 @@ wxNonOwnedWindow *wxNonOwnedWindow::s_macDeactivateWindow = NULL; void wxNonOwnedWindow::Init() { m_nowpeer = NULL; + m_isNativeWindowWrapper = false; } bool wxNonOwnedWindow::Create(wxWindow *parent, @@ -107,9 +108,6 @@ bool wxNonOwnedWindow::Create(wxWindow *parent, long style, const wxString& name) { - // init our fields - Init(); - m_windowStyle = style; SetName( name ); @@ -150,6 +148,19 @@ bool wxNonOwnedWindow::Create(wxWindow *parent, return true; } +bool wxNonOwnedWindow::Create(wxWindow *parent, WXWindow nativeWindow) +{ + m_nowpeer = wxNonOwnedWindowImpl::CreateNonOwnedWindow(this, parent, nativeWindow ); + m_isNativeWindowWrapper = true; + wxAssociateWindowWithWXWindow( m_nowpeer->GetWXWindow() , this ) ; + m_peer = wxWidgetImpl::CreateContentView(this); + + if ( parent ) + parent->AddChild(this); + + return true; +} + wxNonOwnedWindow::~wxNonOwnedWindow() { SendDestroyEvent(); diff --git a/src/osx/window_osx.cpp b/src/osx/window_osx.cpp index 89afdc7171..04e3a9e127 100644 --- a/src/osx/window_osx.cpp +++ b/src/osx/window_osx.cpp @@ -206,6 +206,7 @@ void wxWindowMac::Init() m_macIsUserPane = true; m_clipChildren = false ; m_cachedClippedRectValid = false ; + m_isNativeWindowWrapper = false; } wxWindowMac::~wxWindowMac() -- 2.45.2