X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/aa960026e66caffe0138f9689955c0b6df140cef..d5b98eb928bfd29060cd5974d5346b1bfac34012:/src/osx/cocoa/nonownedwnd.mm diff --git a/src/osx/cocoa/nonownedwnd.mm b/src/osx/cocoa/nonownedwnd.mm index 73d60292d3..c2bf25e06b 100644 --- a/src/osx/cocoa/nonownedwnd.mm +++ b/src/osx/cocoa/nonownedwnd.mm @@ -57,6 +57,26 @@ wxPoint wxFromNSPoint( NSView* parent, const NSPoint& p ) return wxPoint( x, y); } +bool shouldHandleSelector(SEL selector) +{ + if (selector == @selector(noop:) + || selector == @selector(complete:) + || selector == @selector(deleteBackward:) + || selector == @selector(deleteForward:) + || selector == @selector(insertNewline:) + || selector == @selector(insertTab:) + || selector == @selector(keyDown:) + || selector == @selector(keyUp:) + || selector == @selector(scrollPageUp:) + || selector == @selector(scrollPageDown:) + || selector == @selector(scrollToBeginningOfDocument:) + || selector == @selector(scrollToEndOfDocument:)) + return false; + + return true; + +} + // // wx native implementation classes // @@ -64,7 +84,6 @@ wxPoint wxFromNSPoint( NSView* parent, const NSPoint& p ) typedef void (*wxOSX_NoResponderHandlerPtr)(NSView* self, SEL _cmd, SEL selector); @interface wxNSWindow : NSWindow - { wxNonOwnedWindowCocoaImpl* impl; } @@ -86,13 +105,22 @@ typedef void (*wxOSX_NoResponderHandlerPtr)(NSView* self, SEL _cmd, SEL selector return impl; } +- (void)doCommandBySelector:(SEL)selector +{ + if (shouldHandleSelector(selector) && + !(selector == @selector(cancel:) || selector == @selector(cancelOperation:)) ) + [super doCommandBySelector:selector]; +} + + // NB: if we don't do this, all key downs that get handled lead to a NSBeep - (void)noResponderFor: (SEL) selector { - if (selector != @selector(keyDown:)) + if (selector != @selector(keyDown:) && selector != @selector(keyUp:)) { - wxOSX_NoResponderHandlerPtr superimpl = (wxOSX_NoResponderHandlerPtr) [[self superclass] instanceMethodForSelector:@selector(noResponderFor:)]; - superimpl(self, @selector(noResponderFor:), selector); + [super noResponderFor:selector]; +// wxOSX_NoResponderHandlerPtr superimpl = (wxOSX_NoResponderHandlerPtr) [[self superclass] instanceMethodForSelector:@selector(noResponderFor:)]; +// superimpl(self, @selector(noResponderFor:), selector); } } @@ -116,18 +144,30 @@ typedef void (*wxOSX_NoResponderHandlerPtr)(NSView* self, SEL _cmd, SEL selector impl = theImplementation; } +- (BOOL)canBecomeKeyWindow +{ + return YES; +} + - (wxNonOwnedWindowCocoaImpl*) implementation { return impl; } -// NB: if we don't do this, all key downs that get handled lead to a NSBeep +- (void)doCommandBySelector:(SEL)selector +{ + if (shouldHandleSelector(selector)) + [super doCommandBySelector:selector]; +} + +// NB: if we don't do this, it seems that all events that end here lead to a NSBeep - (void)noResponderFor: (SEL) selector { - if (selector != @selector(keyDown:)) + if (selector != @selector(keyDown:) && selector != @selector(keyUp:)) { - wxOSX_NoResponderHandlerPtr superimpl = (wxOSX_NoResponderHandlerPtr) [[self superclass] instanceMethodForSelector:@selector(noResponderFor:)]; - superimpl(self, @selector(noResponderFor:), selector); + [super noResponderFor:selector]; +// wxOSX_NoResponderHandlerPtr superimpl = (wxOSX_NoResponderHandlerPtr) [[self superclass] instanceMethodForSelector:@selector(noResponderFor:)]; +// superimpl(self, @selector(noResponderFor:), selector); } } @@ -144,8 +184,8 @@ typedef void (*wxOSX_NoResponderHandlerPtr)(NSView* self, SEL _cmd, SEL selector - (void)windowDidResize:(NSNotification *)notification; - (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)proposedFrameSize; -- (void)windowDidResignMain:(NSNotification *)notification; -- (void)windowDidBecomeMain:(NSNotification *)notification; +- (void)windowDidResignKey:(NSNotification *)notification; +- (void)windowDidBecomeKey:(NSNotification *)notification; - (void)windowDidMove:(NSNotification *)notification; - (BOOL)windowShouldClose:(id)window; @@ -219,7 +259,7 @@ typedef void (*wxOSX_NoResponderHandlerPtr)(NSView* self, SEL _cmd, SEL selector } } -- (void)windowDidBecomeMain:(NSNotification *)notification +- (void)windowDidBecomeKey:(NSNotification *)notification { wxNSWindow* window = (wxNSWindow*) [notification object]; wxNonOwnedWindowCocoaImpl* windowimpl = [window implementation]; @@ -231,7 +271,7 @@ typedef void (*wxOSX_NoResponderHandlerPtr)(NSView* self, SEL _cmd, SEL selector } } -- (void)windowDidResignMain:(NSNotification *)notification +- (void)windowDidResignKey:(NSNotification *)notification { wxNSWindow* window = (wxNSWindow*) [notification object]; wxNonOwnedWindowCocoaImpl* windowimpl = [window implementation]; @@ -239,10 +279,38 @@ typedef void (*wxOSX_NoResponderHandlerPtr)(NSView* self, SEL _cmd, SEL selector { wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer(); if ( wxpeer ) + { wxpeer->HandleActivated(0, false); + // Needed for popup window since the firstResponder + // (focus in wx) doesn't change when this + // TLW becomes inactive. + wxFocusEvent event( wxEVT_KILL_FOCUS, wxpeer->GetId()); + event.SetEventObject(wxpeer); + wxpeer->HandleWindowEvent(event); + } } } +- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)anObject +{ + wxUnusedVar(sender); + + if ([anObject isKindOfClass:[wxNSTextField class]]) + { + wxNSTextField* tf = (wxNSTextField*) anObject; + wxNSTextFieldEditor* editor = [tf fieldEditor]; + if ( editor == nil ) + { + editor = [[wxNSTextFieldEditor alloc] init]; + [editor setFieldEditor:YES]; + [tf setFieldEditor:editor]; + } + return editor; + } + + return nil; +} + @end IMPLEMENT_DYNAMIC_CLASS( wxNonOwnedWindowCocoaImpl , wxNonOwnedWindowImpl ) @@ -272,8 +340,8 @@ void wxNonOwnedWindowCocoaImpl::Destroy() wxPendingDelete.Append( new wxDeferredObjectDeleter( this ) ); } -void wxNonOwnedWindowCocoaImpl::Create( wxWindow* parent, const wxPoint& pos, const wxSize& size, -long style, long extraStyle, const wxString& name ) +void wxNonOwnedWindowCocoaImpl::Create( wxWindow* WXUNUSED(parent), const wxPoint& pos, const wxSize& size, +long style, long extraStyle, const wxString& WXUNUSED(name) ) { static wxNonOwnedWindowController* controller = NULL; @@ -283,8 +351,11 @@ long style, long extraStyle, const wxString& name ) int windowstyle = NSBorderlessWindowMask; - if ( style & wxFRAME_TOOL_WINDOW ) + if ( style & wxFRAME_TOOL_WINDOW || ( style & wxPOPUP_WINDOW ) || + GetWXPeer()->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG ) + { m_macWindow = [wxNSPanel alloc]; + } else m_macWindow = [wxNSWindow alloc]; @@ -381,7 +452,7 @@ long style, long extraStyle, const wxString& name ) [m_macWindow setDelegate:controller]; - // [m_macWindow makeKeyAndOrderFront:nil]; + [m_macWindow setAcceptsMouseMovedEvents: YES]; } @@ -404,7 +475,7 @@ bool wxNonOwnedWindowCocoaImpl::Show(bool show) { if ( show ) { - [m_macWindow orderFront:nil]; + [m_macWindow makeKeyAndOrderFront:nil]; [[m_macWindow contentView] setNeedsDisplay:YES]; } else @@ -412,7 +483,7 @@ bool wxNonOwnedWindowCocoaImpl::Show(bool show) return true; } -bool wxNonOwnedWindowCocoaImpl::ShowWithEffect(bool show, wxShowEffect effect, unsigned timeout) +bool wxNonOwnedWindowCocoaImpl::ShowWithEffect(bool show, wxShowEffect WXUNUSED(effect), unsigned WXUNUSED(timeout)) { return Show(show); } @@ -428,7 +499,7 @@ bool wxNonOwnedWindowCocoaImpl::SetTransparent(wxByte alpha) return true; } -bool wxNonOwnedWindowCocoaImpl::SetBackgroundColour(const wxColour& col ) +bool wxNonOwnedWindowCocoaImpl::SetBackgroundColour(const wxColour& WXUNUSED(col) ) { return true; } @@ -450,7 +521,7 @@ void wxNonOwnedWindowCocoaImpl::SetExtraStyle( long exStyle ) } } -bool wxNonOwnedWindowCocoaImpl::SetBackgroundStyle(wxBackgroundStyle style) +bool wxNonOwnedWindowCocoaImpl::SetBackgroundStyle(wxBackgroundStyle WXUNUSED(style)) { return true; } @@ -481,16 +552,18 @@ void wxNonOwnedWindowCocoaImpl::GetSize( int &width, int &height ) const height = rect.size.height; } -void wxNonOwnedWindowCocoaImpl::GetContentArea( int& left, int &right, int &width, int &height ) const +void wxNonOwnedWindowCocoaImpl::GetContentArea( int& left, int &top, int &width, int &height ) const { NSRect outer = NSMakeRect(100,100,100,100); NSRect content = [NSWindow contentRectForFrameRect:outer styleMask:[m_macWindow styleMask] ]; NSRect rect = [[m_macWindow contentView] frame]; + left = rect.origin.x; + top = rect.origin.y; width = rect.size.width; height = rect.size.height; } -bool wxNonOwnedWindowCocoaImpl::SetShape(const wxRegion& region) +bool wxNonOwnedWindowCocoaImpl::SetShape(const wxRegion& WXUNUSED(region)) { return false; } @@ -518,7 +591,7 @@ void wxNonOwnedWindowCocoaImpl::Iconize( bool iconize ) [m_macWindow deminiaturize:nil]; } -void wxNonOwnedWindowCocoaImpl::Maximize(bool maximize) +void wxNonOwnedWindowCocoaImpl::Maximize(bool WXUNUSED(maximize)) { [m_macWindow zoom:nil]; } @@ -537,7 +610,7 @@ bool wxNonOwnedWindowCocoaImpl::IsFullScreen() const return m_macFullScreenData != NULL ; } -bool wxNonOwnedWindowCocoaImpl::ShowFullScreen(bool show, long style) +bool wxNonOwnedWindowCocoaImpl::ShowFullScreen(bool show, long WXUNUSED(style)) { if ( show ) {