diff --git a/docs/changes.txt b/docs/changes.txt index 91e69c97c0..407b501d3b 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -195,6 +195,10 @@ Changes in behaviour not resulting in compilation errors, please read this! release so you are strongly encouraged to upgrade your code to stop relying on this behaviour. +- wxEVT_CHAR_HOOK events are not generated any more if the mouse is captured to + prevent the parent wxTopLevelWindow from interfering with the keyboard + handling of the window that captured the mouse. + Changes in behaviour which may result in compilation errors ----------------------------------------------------------- diff --git a/interface/wx/event.h b/interface/wx/event.h index 863ee56c23..3a8043001b 100644 --- a/interface/wx/event.h +++ b/interface/wx/event.h @@ -1310,8 +1310,11 @@ enum wxKeyCategoryFlags keyboard events are generated giving the parent window the opportunity to intercept all the keyboard entry. If the event is handled, i.e. the handler doesn't call wxEvent::Skip(), no further keyboard events are - generated. Notice that this event is currently not generated by - wxOSX/Cocoa port. + generated. Notice that this event is not generated when the mouse is + captured as it is considered that the window which has the capture + should receive all the keyboard events too without allowing its parent + wxTopLevelWindow to interfere with their processing. Also please note + that currently this event is not generated by wxOSX/Cocoa port. @endEventTable @see wxKeyboardState diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 3c32e7dfa6..0c05229765 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -884,17 +884,21 @@ bool SendCharHookAndCharEvents(const wxKeyEvent& event, wxWindow *win) { // wxEVT_CHAR_HOOK must be sent to the top level parent window to allow it - // to handle key events in all of its children. - wxWindow * const parent = wxGetTopLevelParent(win); - if ( parent ) + // to handle key events in all of its children unless the mouse is captured + // in which case we consider that the keyboard should be "captured" too. + if ( !g_captureWindow ) { - // We need to make a copy of the event object because it is - // modified while it's handled, notably its WasProcessed() flag - // is set after it had been processed once. - wxKeyEvent eventCharHook(event); - eventCharHook.SetEventType(wxEVT_CHAR_HOOK); - if ( parent->HandleWindowEvent(eventCharHook) ) - return true; + wxWindow * const parent = wxGetTopLevelParent(win); + if ( parent ) + { + // We need to make a copy of the event object because it is + // modified while it's handled, notably its WasProcessed() flag + // is set after it had been processed once. + wxKeyEvent eventCharHook(event); + eventCharHook.SetEventType(wxEVT_CHAR_HOOK); + if ( parent->HandleWindowEvent(eventCharHook) ) + return true; + } } // As above, make a copy of the event first. diff --git a/src/msw/window.cpp b/src/msw/window.cpp index e1d2af0ad7..a310475417 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -6521,7 +6521,13 @@ wxKeyboardHook(int nCode, WORD wParam, DWORD lParam) // Don't intercept keyboard entry (notably Escape) if a modal window // (not managed by wx, e.g. IME one) is currently opened as more often // than not it needs all the keys for itself. - if ( !gs_modalEntryWindowCount ) + // + // Also don't catch it if a window currently captures the mouse as + // Escape is normally used to release the mouse capture and if you + // really need to catch all the keys in the window that has mouse + // capture it can be easily done in its own EVT_CHAR handler as it is + // certain to have focus while it has the capture. + if ( !gs_modalEntryWindowCount && !::GetCapture() ) { if ( id != WXK_NONE #if wxUSE_UNICODE