X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a7b9865d30b4e74f5a879901c47b45c108578caf..8ec413ce46f5590f2cfcba50f6f1cf1a60392b63:/src/osx/cocoa/window.mm diff --git a/src/osx/cocoa/window.mm b/src/osx/cocoa/window.mm index a2aea90d23..a34d05129a 100644 --- a/src/osx/cocoa/window.mm +++ b/src/osx/cocoa/window.mm @@ -13,7 +13,7 @@ #ifndef WX_PRECOMP #include "wx/dcclient.h" - #include "wx/nonownedwnd.h" + #include "wx/frame.h" #include "wx/log.h" #include "wx/textctrl.h" #endif @@ -131,6 +131,8 @@ NSRect wxOSXGetFrameForControl( wxWindowMac* window , const wxPoint& pos , const - (void)setAction:(SEL)aSelector; - (void)setDoubleAction:(SEL)aSelector; - (void)setBackgroundColor:(NSColor*)aColor; +- (void)setOpaque:(BOOL)opaque; +- (void)setTextColor:(NSColor *)color; - (void)setImagePosition:(NSCellImagePosition)aPosition; @end @@ -392,14 +394,28 @@ void wxWidgetCocoaImpl::SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEve { int eventType = [nsEvent type]; UInt32 modifiers = [nsEvent modifierFlags] ; - wxPoint screenMouseLocation = wxFromNSPoint( NULL, [nsEvent locationInWindow]); + + NSPoint locationInWindow = [nsEvent locationInWindow]; + + // adjust coordinates for the window of the target view + if ( [nsEvent window] != [m_osxView window] ) + { + if ( [nsEvent window] != nil ) + locationInWindow = [[nsEvent window] convertBaseToScreen:locationInWindow]; + + if ( [m_osxView window] != nil ) + locationInWindow = [[m_osxView window] convertScreenToBase:locationInWindow]; + } + + NSPoint locationInView = [m_osxView convertPoint:locationInWindow fromView:nil]; + wxPoint locationInViewWX = wxFromNSPoint( m_osxView, locationInView ); // these parameters are not given for all events UInt32 button = [nsEvent buttonNumber]; UInt32 clickCount = 0; - wxevent.m_x = screenMouseLocation.x; - wxevent.m_y = screenMouseLocation.y; + wxevent.m_x = locationInViewWX.x; + wxevent.m_y = locationInViewWX.y; wxevent.m_shiftDown = modifiers & NSShiftKeyMask; wxevent.m_controlDown = modifiers & NSControlKeyMask; wxevent.m_altDown = modifiers & NSAlternateKeyMask; @@ -688,7 +704,7 @@ void wxOSX_mouseEvent(NSView* self, SEL _cmd, NSEvent *event) impl->mouseEvent(event, self, _cmd); } -BOOL wxOSX_acceptsFirstMouse(NSView* self, SEL _cmd, NSEvent *event) +BOOL wxOSX_acceptsFirstMouse(NSView* WXUNUSED(self), SEL WXUNUSED(_cmd), NSEvent *WXUNUSED(event)) { // This is needed to support click through, otherwise the first click on a window // will not do anything unless it is the active window already. @@ -1091,15 +1107,23 @@ void wxWidgetCocoaImpl::drawRect(void* rect, WXWidget slf, void *WXUNUSED(_cmd)) [slf getRectsBeingDrawn:&rects count:&count]; for ( int i = 0 ; i < count ; ++i ) { - updateRgn.Union(wxFromNSRect(slf, rects[i]) ); + updateRgn.Union(wxFromNSRect(slf, rects[i])); } wxWindow* wxpeer = GetWXPeer(); + if ( wxpeer->MacGetTopLevelWindow()->GetWindowStyle() & wxFRAME_SHAPED ) + { + int xoffset = 0, yoffset = 0; + wxRegion rgn = wxpeer->MacGetTopLevelWindow()->GetShape(); + wxpeer->MacRootWindowToWindow( &xoffset, &yoffset ); + rgn.Offset( xoffset, yoffset ); + updateRgn.Intersect(rgn); + } + wxpeer->GetUpdateRegion() = updateRgn; wxpeer->MacSetCGContextRef( context ); bool handled = wxpeer->MacDoRedraw( 0 ); - CGContextRestoreGState( context ); CGContextSaveGState( context ); @@ -1332,6 +1356,7 @@ void wxWidgetCocoaImpl::SetVisibility( bool visible ) - (void)animationDidEnd:(NSAnimation*)animation { + wxUnusedVar(animation); m_isDone = true; } @@ -1644,11 +1669,11 @@ bool wxWidgetCocoaImpl::HasFocus() const bool wxWidgetCocoaImpl::SetFocus() { - if ( [m_osxView canBecomeKeyView] == NO ) + if ( !CanFocus() ) return false; - [[m_osxView window] makeFirstResponder: m_osxView] ; [[m_osxView window] makeKeyAndOrderFront:nil] ; + [[m_osxView window] makeFirstResponder: m_osxView] ; return true; } @@ -1680,6 +1705,18 @@ void wxWidgetCocoaImpl::SetBackgroundColour( const wxColour &col ) } } +bool wxWidgetCocoaImpl::SetBackgroundStyle( wxBackgroundStyle style ) +{ + BOOL opaque = ( style == wxBG_STYLE_PAINT ); + + if ( [m_osxView respondsToSelector:@selector(setOpaque:) ] ) + { + [m_osxView setOpaque: opaque]; + } + + return true ; +} + void wxWidgetCocoaImpl::SetLabel( const wxString& title, wxFontEncoding encoding ) { if ( [m_osxView respondsToSelector:@selector(setTitle:) ] ) @@ -1888,10 +1925,15 @@ void wxWidgetCocoaImpl::SetControlSize( wxWindowVariant variant ) } } -void wxWidgetCocoaImpl::SetFont(wxFont const& font, wxColour const&, long, bool) +void wxWidgetCocoaImpl::SetFont(wxFont const& font, wxColour const&col, long, bool) { if ([m_osxView respondsToSelector:@selector(setFont:)]) [m_osxView setFont: font.OSXGetNSFont()]; + if ([m_osxView respondsToSelector:@selector(setTextColor:)]) + [m_osxView setTextColor:[NSColor colorWithCalibratedRed:(CGFloat) (col.Red() / 255.0) + green:(CGFloat) (col.Green() / 255.0) + blue:(CGFloat) (col.Blue() / 255.0) + alpha:(CGFloat) (col.Alpha() / 255.0)]]; } void wxWidgetCocoaImpl::SetToolTip(wxToolTip* tooltip) @@ -1943,10 +1985,20 @@ bool wxWidgetCocoaImpl::DoHandleKeyEvent(NSEvent *event) { if ( !result ) { - if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) - [[(NSScrollView*)m_osxView documentView] interpretKeyEvents:[NSArray arrayWithObject:event]]; + if ( wxevent.GetKeyCode() < WXK_SPACE || wxevent.GetKeyCode() == WXK_DELETE || wxevent.GetKeyCode() >= WXK_START ) + { + // eventually we could setup a doCommandBySelector catcher and retransform this into the wx key chars + wxKeyEvent wxevent2(wxevent) ; + wxevent2.SetEventType(wxEVT_CHAR); + GetWXPeer()->OSXHandleKeyEvent(wxevent2); + } else - [m_osxView interpretKeyEvents:[NSArray arrayWithObject:event]]; + { + if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) + [[(NSScrollView*)m_osxView documentView] interpretKeyEvents:[NSArray arrayWithObject:event]]; + else + [m_osxView interpretKeyEvents:[NSArray arrayWithObject:event]]; + } result = true; } } @@ -1956,13 +2008,8 @@ bool wxWidgetCocoaImpl::DoHandleKeyEvent(NSEvent *event) bool wxWidgetCocoaImpl::DoHandleMouseEvent(NSEvent *event) { - NSPoint clickLocation; - clickLocation = [m_osxView convertPoint:[event locationInWindow] fromView:nil]; - wxPoint pt = wxFromNSPoint( m_osxView, clickLocation ); wxMouseEvent wxevent(wxEVT_LEFT_DOWN); SetupMouseEvent(wxevent , event) ; - wxevent.m_x = pt.x; - wxevent.m_y = pt.y; return GetWXPeer()->HandleWindowEvent(wxevent); } @@ -2059,9 +2106,24 @@ 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() ) + { + NSView* cv = [tlw contentView]; + c = new wxWidgetCocoaImpl( now, cv, true ); + // increase ref count, because the impl destructor will decrement it again + CFRetain(cv); + if ( !now->IsShown() ) + [cv setHidden:NO]; + + } + else + { + wxNSView* v = [[wxNSView alloc] initWithFrame:[[tlw contentView] frame]]; + c = new wxWidgetCocoaImpl( now, v, true ); + c->InstallEventHandler(); + [tlw setContentView:v]; + } return c; }