Send wxEVT_CHAR_HOOK event from wxOSX/Cocoa code.
Also test for wxEVT_CHAR_HOOK in the keyboard sample and show the effect of
not skipping it.
Closes #12431.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@69889
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
- wxGetOsVersion() now returns more sensible version numbers, e.g. 10 and 6
for OS X 10.6.
- Added wxApp::MacOpenFiles and deprecated wxApp::MacOpenFile.
- wxGetOsVersion() now returns more sensible version numbers, e.g. 10 and 6
for OS X 10.6.
- Added wxApp::MacOpenFiles and deprecated wxApp::MacOpenFile.
+- Implement wxEVT_CHAR_HOOK event generation in wxOSX/Cocoa.
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
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.
+ wxTopLevelWindow to interfere with their processing.
@endEventTable
@see wxKeyboardState
@endEventTable
@see wxKeyboardState
{ m_logText->AppendText("Test accelerator \"Esc\" used.\n"); }
void OnClear(wxCommandEvent& WXUNUSED(event)) { m_logText->Clear(); }
{ m_logText->AppendText("Test accelerator \"Esc\" used.\n"); }
void OnClear(wxCommandEvent& WXUNUSED(event)) { m_logText->Clear(); }
- void OnSkip(wxCommandEvent& event) { m_skip = event.IsChecked(); }
+ void OnSkipDown(wxCommandEvent& event) { m_skipDown = event.IsChecked(); }
+ void OnSkipHook(wxCommandEvent& event) { m_skipHook = event.IsChecked(); }
- void OnKeyDown(wxKeyEvent& event) { LogEvent("KeyDown", event); }
+ void OnKeyDown(wxKeyEvent& event)
+ {
+ LogEvent("KeyDown", event);
+ if ( m_skipDown )
+ event.Skip();
+ }
void OnKeyUp(wxKeyEvent& event) { LogEvent("KeyUp", event); }
void OnChar(wxKeyEvent& event) { LogEvent("Char", event); }
void OnKeyUp(wxKeyEvent& event) { LogEvent("KeyUp", event); }
void OnChar(wxKeyEvent& event) { LogEvent("Char", event); }
+ void OnCharHook(wxKeyEvent& event)
+ {
+ LogEvent("Hook", event);
+ if ( m_skipHook )
+ event.Skip();
+ }
+
void OnPaintInputWin(wxPaintEvent& event);
void LogEvent(const wxString& name, wxKeyEvent& event);
wxTextCtrl *m_logText;
wxWindow *m_inputWin;
void OnPaintInputWin(wxPaintEvent& event);
void LogEvent(const wxString& name, wxKeyEvent& event);
wxTextCtrl *m_logText;
wxWindow *m_inputWin;
+ bool m_skipHook,
+ m_skipDown;
MyFrame::MyFrame(const wxString& title)
: wxFrame(NULL, wxID_ANY, title),
m_inputWin(NULL),
MyFrame::MyFrame(const wxString& title)
: wxFrame(NULL, wxID_ANY, title),
m_inputWin(NULL),
+ m_skipHook(true),
+ m_skipDown(true)
{
SetIcon(wxICON(sample));
{
SetIcon(wxICON(sample));
{
QuitID = wxID_EXIT,
ClearID = wxID_CLEAR,
{
QuitID = wxID_EXIT,
ClearID = wxID_CLEAR,
+ SkipHook = 100,
+ SkipDown,
TestAccelA,
TestAccelCtrlA,
TestAccelEsc
TestAccelA,
TestAccelCtrlA,
TestAccelEsc
menuFile->Append(TestAccelEsc, "Test accelerator &3\tEsc");
menuFile->AppendSeparator();
menuFile->Append(TestAccelEsc, "Test accelerator &3\tEsc");
menuFile->AppendSeparator();
- menuFile->AppendCheckItem(SkipID, "Call event.&Skip()\tCtrl-S");
- menuFile->Check(SkipID, true);
+ menuFile->AppendCheckItem(SkipHook, "Skip CHAR_HOOK event",
+ "Not skipping this event disables both KEY_DOWN and CHAR events"
+ );
+ menuFile->Check(SkipHook, true);
+ menuFile->AppendCheckItem(SkipDown, "Skip KEY_DOWN event",
+ "Not skipping this event disables CHAR event generation"
+ );
+ menuFile->Check(SkipDown, true);
menuFile->AppendSeparator();
menuFile->Append(QuitID, "E&xit\tAlt-X", "Quit this program");
menuFile->AppendSeparator();
menuFile->Append(QuitID, "E&xit\tAlt-X", "Quit this program");
Connect(ClearID, wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler(MyFrame::OnClear));
Connect(ClearID, wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler(MyFrame::OnClear));
- Connect(SkipID, wxEVT_COMMAND_MENU_SELECTED,
- wxCommandEventHandler(MyFrame::OnSkip));
+ Connect(SkipHook, wxEVT_COMMAND_MENU_SELECTED,
+ wxCommandEventHandler(MyFrame::OnSkipHook));
+ Connect(SkipDown, wxEVT_COMMAND_MENU_SELECTED,
+ wxCommandEventHandler(MyFrame::OnSkipDown));
Connect(TestAccelA, wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler(MyFrame::OnTestAccelA));
Connect(TestAccelA, wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler(MyFrame::OnTestAccelA));
wxPaintEventHandler(MyFrame::OnPaintInputWin),
NULL, this);
wxPaintEventHandler(MyFrame::OnPaintInputWin),
NULL, this);
+ // notice that we don't connect OnCharHook() to the input window, unlike
+ // the usual key events this one is propagated upwards
+ Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(MyFrame::OnCharHook));
+
+ // status bar is useful for showing the menu items help strings
+ CreateStatusBar();
+
// and show itself (the frames, unlike simple controls, are not shown when
// created initially)
Show(true);
// and show itself (the frames, unlike simple controls, are not shown when
// created initially)
Show(true);
);
m_logText->AppendText(msg);
);
m_logText->AppendText(msg);
-
- if ( m_skip )
- event.Skip();
{
wxKeyEvent wxevent(wxEVT_KEY_DOWN);
SetupKeyEvent( wxevent, event );
{
wxKeyEvent wxevent(wxEVT_KEY_DOWN);
SetupKeyEvent( wxevent, event );
+
+ // Generate wxEVT_CHAR_HOOK before sending any other events but only when
+ // the key is pressed, not when it's released (the type of wxevent is
+ // changed by SetupKeyEvent() so it can be wxEVT_KEY_UP too by now).
+ if ( wxevent.GetEventType() == wxEVT_KEY_DOWN )
+ {
+ wxKeyEvent eventHook(wxevent);
+ eventHook.SetEventType(wxEVT_CHAR_HOOK);
+ if ( wxGetTopLevelParent(GetWXPeer())->OSXHandleKeyEvent(eventHook) )
+ return true;
+ }
+
bool result = GetWXPeer()->OSXHandleKeyEvent(wxevent);
// this will fire higher level events, like insertText, to help
bool result = GetWXPeer()->OSXHandleKeyEvent(wxevent);
// this will fire higher level events, like insertText, to help