Implement EVT_CHAR_HOOK for wxOSX/Cocoa.

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
This commit is contained in:
Vadim Zeitlin
2011-12-02 00:50:12 +00:00
parent 8270459a11
commit edf5822ace
4 changed files with 54 additions and 14 deletions

View File

@@ -507,6 +507,7 @@ OSX:
- 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.
GTK:

View File

@@ -1372,8 +1372,7 @@ enum wxKeyCategoryFlags
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

View File

@@ -41,18 +41,32 @@ private:
{ 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 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;
bool m_skip;
bool m_skipHook,
m_skipDown;
};
@@ -87,7 +101,8 @@ IMPLEMENT_APP(MyApp)
MyFrame::MyFrame(const wxString& title)
: wxFrame(NULL, wxID_ANY, title),
m_inputWin(NULL),
m_skip(true)
m_skipHook(true),
m_skipDown(true)
{
SetIcon(wxICON(sample));
@@ -96,7 +111,8 @@ MyFrame::MyFrame(const wxString& title)
{
QuitID = wxID_EXIT,
ClearID = wxID_CLEAR,
SkipID = 100,
SkipHook = 100,
SkipDown,
TestAccelA,
TestAccelCtrlA,
TestAccelEsc
@@ -113,8 +129,14 @@ MyFrame::MyFrame(const wxString& title)
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");
@@ -175,8 +197,10 @@ MyFrame::MyFrame(const wxString& title)
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));
@@ -198,6 +222,13 @@ MyFrame::MyFrame(const wxString& title)
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);
@@ -404,9 +435,6 @@ void MyFrame::LogEvent(const wxString& name, wxKeyEvent& event)
);
m_logText->AppendText(msg);
if ( m_skip )
event.Skip();
}

View File

@@ -2299,6 +2299,18 @@ bool wxWidgetCocoaImpl::DoHandleKeyEvent(NSEvent *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