Merge branch 'mac-fixes'

Miscellaneous fixes for wxOSX.

See https://github.com/wxWidgets/wxWidgets/pull/2185
This commit is contained in:
Vadim Zeitlin
2021-01-27 17:54:45 +01:00
4 changed files with 87 additions and 61 deletions

View File

@@ -1937,6 +1937,57 @@ outlineView:(NSOutlineView*)outlineView
dvc->GetEventHandler()->ProcessEvent(event); dvc->GetEventHandler()->ProcessEvent(event);
} }
-(void) sendEditingDoneEvent:(BOOL)isCancelled
{
// under OSX an event indicating the end of an editing session can be sent
// even if no event indicating a start of an editing session has been sent
// (see Documentation for NSControl controlTextDidEndEditing:); this is
// not expected by a user of the wxWidgets library and therefore an
// wxEVT_DATAVIEW_ITEM_EDITING_DONE event is only sent if a
// corresponding wxEVT_DATAVIEW_ITEM_EDITING_STARTED has been sent
// before; to check if a wxEVT_DATAVIEW_ITEM_EDITING_STARTED has
// been sent the last edited column/row are valid:
if ( currentlyEditedColumn != -1 && currentlyEditedRow != -1 )
{
NSTableColumn*
tableColumn = [[self tableColumns] objectAtIndex:currentlyEditedColumn];
wxDataViewColumn* const
col([static_cast<wxDVCNSTableColumn*>(tableColumn) getColumnPointer]);
wxDataViewCtrl* const dvc = implementation->GetDataViewCtrl();
const wxDataViewItem
item = wxDataViewItemFromItem([self itemAtRow:currentlyEditedRow]);
// send event to wxWidgets:
wxDataViewEvent event(wxEVT_DATAVIEW_ITEM_EDITING_DONE, dvc, col, item);
if ( isCancelled )
event.SetEditCancelled();
dvc->GetEventHandler()->ProcessEvent(event);
// we're not editing any more
currentlyEditedColumn =
currentlyEditedRow = -1;
}
}
-(void) editColumn:(NSInteger)column row:(NSInteger)row withEvent:(NSEvent*)event select:(BOOL)select
{
[super editColumn:column row:row withEvent:event select:select];
currentlyEditedColumn = column;
currentlyEditedRow = row;
}
-(void) cancelOperation:(id)sender
{
[self abortEditing];
[[self window] makeFirstResponder:self];
[self sendEditingDoneEvent:YES];
}
-(BOOL) textShouldBeginEditing:(NSText*)textEditor -(BOOL) textShouldBeginEditing:(NSText*)textEditor
{ {
wxUnusedVar(textEditor); wxUnusedVar(textEditor);
@@ -2007,35 +2058,7 @@ outlineView:(NSOutlineView*)outlineView
// have the checks for IsDeleting() in several other methods of this class. // have the checks for IsDeleting() in several other methods of this class.
[super textDidEndEditing:notification]; [super textDidEndEditing:notification];
// under OSX an event indicating the end of an editing session can be sent [self sendEditingDoneEvent:NO];
// even if no event indicating a start of an editing session has been sent
// (see Documentation for NSControl controlTextDidEndEditing:); this is
// not expected by a user of the wxWidgets library and therefore an
// wxEVT_DATAVIEW_ITEM_EDITING_DONE event is only sent if a
// corresponding wxEVT_DATAVIEW_ITEM_EDITING_STARTED has been sent
// before; to check if a wxEVT_DATAVIEW_ITEM_EDITING_STARTED has
// been sent the last edited column/row are valid:
if ( currentlyEditedColumn != -1 && currentlyEditedRow != -1 )
{
NSTableColumn*
tableColumn = [[self tableColumns] objectAtIndex:currentlyEditedColumn];
wxDataViewColumn* const
col([static_cast<wxDVCNSTableColumn*>(tableColumn) getColumnPointer]);
wxDataViewCtrl* const dvc = implementation->GetDataViewCtrl();
const wxDataViewItem
item = wxDataViewItemFromItem([self itemAtRow:currentlyEditedRow]);
// send event to wxWidgets:
wxDataViewEvent event(wxEVT_DATAVIEW_ITEM_EDITING_DONE, dvc, col, item);
dvc->GetEventHandler()->ProcessEvent(event);
// we're not editing any more
currentlyEditedColumn =
currentlyEditedRow = -1;
}
} }
-(BOOL) becomeFirstResponder -(BOOL) becomeFirstResponder

View File

@@ -335,8 +335,20 @@ extern int wxOSXGetIdFromSelector(SEL action );
return self; return self;
} }
- (BOOL) triggerMenu:(SEL) action - (BOOL) triggerMenu:(SEL) action sender:(id)sender
{ {
// feed back into menu item, if it is ours
if ( [sender isKindOfClass:wxNSMenuItem.class] )
{
wxNSMenuItem* nsMenuItem = (wxNSMenuItem*) sender;
wxMenuItemImpl* impl = [nsMenuItem implementation];
if ( impl )
{
wxMenuItem* menuitem = impl->GetWXPeer();
return menuitem->GetMenu()->HandleCommandProcess(menuitem);
}
}
// otherwise feed back command into common menubar
wxMenuBar* mbar = wxMenuBar::MacGetInstalledMenuBar(); wxMenuBar* mbar = wxMenuBar::MacGetInstalledMenuBar();
if ( mbar ) if ( mbar )
{ {
@@ -369,43 +381,43 @@ extern int wxOSXGetIdFromSelector(SEL action );
- (void)undo:(id)sender - (void)undo:(id)sender
{ {
wxUnusedVar(sender); wxUnusedVar(sender);
[self triggerMenu:_cmd]; [self triggerMenu:_cmd sender:sender];
} }
- (void)redo:(id)sender - (void)redo:(id)sender
{ {
wxUnusedVar(sender); wxUnusedVar(sender);
[self triggerMenu:_cmd]; [self triggerMenu:_cmd sender:sender];
} }
- (void)cut:(id)sender - (void)cut:(id)sender
{ {
wxUnusedVar(sender); wxUnusedVar(sender);
[self triggerMenu:_cmd]; [self triggerMenu:_cmd sender:sender];
} }
- (void)copy:(id)sender - (void)copy:(id)sender
{ {
wxUnusedVar(sender); wxUnusedVar(sender);
[self triggerMenu:_cmd]; [self triggerMenu:_cmd sender:sender];
} }
- (void)paste:(id)sender - (void)paste:(id)sender
{ {
wxUnusedVar(sender); wxUnusedVar(sender);
[self triggerMenu:_cmd]; [self triggerMenu:_cmd sender:sender];
} }
- (void)delete:(id)sender - (void)delete:(id)sender
{ {
wxUnusedVar(sender); wxUnusedVar(sender);
[self triggerMenu:_cmd]; [self triggerMenu:_cmd sender:sender];
} }
- (void)selectAll:(id)sender - (void)selectAll:(id)sender
{ {
wxUnusedVar(sender); wxUnusedVar(sender);
[self triggerMenu:_cmd]; [self triggerMenu:_cmd sender:sender];
} }
- (void)windowDidMiniaturize:(NSNotification *)notification - (void)windowDidMiniaturize:(NSNotification *)notification

View File

@@ -3094,12 +3094,11 @@ bool wxWidgetCocoaImpl::CanFocus() const
{ {
if ( !IsVisible() ) if ( !IsVisible() )
{ {
// It's useless to call canBecomeKeyView in this case, it will always // canBecomeKeyView always returns false for hidden windows, but this
// return false. Try to return something reasonable ourselves, knowing // could be wrong because the window could still accept focus once it
// that most controls are not focusable when full keyboard access if // becomes visible, so we have no choice but to return true here to
// off and wxNSTextViewControl overrides CanFocus() to always return // avoid situations in which the expected window doesn't get the focus.
// true anyhow. return true;
return [NSApp isFullKeyboardAccessEnabled];
} }
NSView* targetView = m_osxView; NSView* targetView = m_osxView;
@@ -3712,7 +3711,7 @@ bool wxWidgetCocoaImpl::DoHandleKeyNavigation(const wxKeyEvent &event)
/* CTRL-TAB changes the (parent) window, i.e. switch notebook page */ /* CTRL-TAB changes the (parent) window, i.e. switch notebook page */
new_event.SetWindowChange( event.ControlDown() ); new_event.SetWindowChange( event.ControlDown() );
new_event.SetCurrentFocus( focus ); new_event.SetCurrentFocus( focus );
handled = iter->HandleWindowEvent( new_event ) && !new_event.GetSkipped(); handled = iter->HandleWindowEvent( new_event );
} }
iter = iter->GetParent() ; iter = iter->GetParent() ;

View File

@@ -2568,12 +2568,11 @@ bool wxWindowMac::OSXHandleKeyEvent( wxKeyEvent& event )
: "unknown", : "unknown",
wxDumpWindow(this)); wxDumpWindow(this));
bool handled = false; if ( HandleWindowEvent(event) )
return true;
// moved the ordinary key event sending AFTER the accel evaluation
#if wxUSE_ACCEL #if wxUSE_ACCEL
if (event.GetEventType() == wxEVT_KEY_DOWN) if (event.GetEventType() == wxEVT_CHAR_HOOK)
{ {
wxWindow *ancestor = this; wxWindow *ancestor = this;
while (ancestor) while (ancestor)
@@ -2584,16 +2583,16 @@ bool wxWindowMac::OSXHandleKeyEvent( wxKeyEvent& event )
wxEvtHandler * const handler = ancestor->GetEventHandler(); wxEvtHandler * const handler = ancestor->GetEventHandler();
wxCommandEvent command_event( wxEVT_MENU, command ); wxCommandEvent command_event( wxEVT_MENU, command );
handled = handler->ProcessEvent( command_event ); if ( !handler->ProcessEvent( command_event ) )
if ( !handled )
{ {
// accelerators can also be used with buttons, try them too // accelerators can also be used with buttons, try them too
command_event.SetEventType(wxEVT_BUTTON); command_event.SetEventType(wxEVT_BUTTON);
handled = handler->ProcessEvent( command_event ); handler->ProcessEvent( command_event );
} }
break; // In any case, the event was handled as it triggered an
// accelerator.
return true;
} }
if (ancestor->IsTopNavigationDomain(wxWindow::Navigation_Accel)) if (ancestor->IsTopNavigationDomain(wxWindow::Navigation_Accel))
@@ -2604,14 +2603,7 @@ bool wxWindowMac::OSXHandleKeyEvent( wxKeyEvent& event )
} }
#endif // wxUSE_ACCEL #endif // wxUSE_ACCEL
if ( !handled ) return false;
{
handled = HandleWindowEvent( event ) ;
if ( handled && event.GetSkipped() )
handled = false ;
}
return handled ;
} }
/* static */ /* static */