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:
@@ -507,6 +507,7 @@ OSX:
|
|||||||
- wxGetOsVersion() now returns more sensible version numbers, e.g. 10 and 6
|
- wxGetOsVersion() now returns more sensible version numbers, e.g. 10 and 6
|
||||||
for OS X 10.6.
|
for OS X 10.6.
|
||||||
- Added wxApp::MacOpenFiles and deprecated wxApp::MacOpenFile.
|
- Added wxApp::MacOpenFiles and deprecated wxApp::MacOpenFile.
|
||||||
|
- Implement wxEVT_CHAR_HOOK event generation in wxOSX/Cocoa.
|
||||||
|
|
||||||
GTK:
|
GTK:
|
||||||
|
|
||||||
|
@@ -1372,8 +1372,7 @@ enum wxKeyCategoryFlags
|
|||||||
generated. Notice that this event is not generated when the mouse is
|
generated. Notice that this event is not generated when the mouse is
|
||||||
captured as it is considered that the window which has the capture
|
captured as it is considered that the window which has the capture
|
||||||
should receive all the keyboard events too without allowing its parent
|
should receive all the keyboard events too without allowing its parent
|
||||||
wxTopLevelWindow to interfere with their processing. Also please note
|
wxTopLevelWindow to interfere with their processing.
|
||||||
that currently this event is not generated by wxOSX/Cocoa port.
|
|
||||||
@endEventTable
|
@endEventTable
|
||||||
|
|
||||||
@see wxKeyboardState
|
@see wxKeyboardState
|
||||||
|
@@ -41,18 +41,32 @@ private:
|
|||||||
{ m_logText->AppendText("Test accelerator \"Esc\" used.\n"); }
|
{ m_logText->AppendText("Test accelerator \"Esc\" used.\n"); }
|
||||||
|
|
||||||
void OnClear(wxCommandEvent& WXUNUSED(event)) { m_logText->Clear(); }
|
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 OnKeyUp(wxKeyEvent& event) { LogEvent("KeyUp", event); }
|
||||||
void OnChar(wxKeyEvent& event) { LogEvent("Char", 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 OnPaintInputWin(wxPaintEvent& event);
|
||||||
|
|
||||||
void LogEvent(const wxString& name, wxKeyEvent& event);
|
void LogEvent(const wxString& name, wxKeyEvent& event);
|
||||||
|
|
||||||
wxTextCtrl *m_logText;
|
wxTextCtrl *m_logText;
|
||||||
wxWindow *m_inputWin;
|
wxWindow *m_inputWin;
|
||||||
bool m_skip;
|
bool m_skipHook,
|
||||||
|
m_skipDown;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -87,7 +101,8 @@ IMPLEMENT_APP(MyApp)
|
|||||||
MyFrame::MyFrame(const wxString& title)
|
MyFrame::MyFrame(const wxString& title)
|
||||||
: wxFrame(NULL, wxID_ANY, title),
|
: wxFrame(NULL, wxID_ANY, title),
|
||||||
m_inputWin(NULL),
|
m_inputWin(NULL),
|
||||||
m_skip(true)
|
m_skipHook(true),
|
||||||
|
m_skipDown(true)
|
||||||
{
|
{
|
||||||
SetIcon(wxICON(sample));
|
SetIcon(wxICON(sample));
|
||||||
|
|
||||||
@@ -96,7 +111,8 @@ MyFrame::MyFrame(const wxString& title)
|
|||||||
{
|
{
|
||||||
QuitID = wxID_EXIT,
|
QuitID = wxID_EXIT,
|
||||||
ClearID = wxID_CLEAR,
|
ClearID = wxID_CLEAR,
|
||||||
SkipID = 100,
|
SkipHook = 100,
|
||||||
|
SkipDown,
|
||||||
TestAccelA,
|
TestAccelA,
|
||||||
TestAccelCtrlA,
|
TestAccelCtrlA,
|
||||||
TestAccelEsc
|
TestAccelEsc
|
||||||
@@ -113,8 +129,14 @@ MyFrame::MyFrame(const wxString& title)
|
|||||||
menuFile->Append(TestAccelEsc, "Test accelerator &3\tEsc");
|
menuFile->Append(TestAccelEsc, "Test accelerator &3\tEsc");
|
||||||
menuFile->AppendSeparator();
|
menuFile->AppendSeparator();
|
||||||
|
|
||||||
menuFile->AppendCheckItem(SkipID, "Call event.&Skip()\tCtrl-S");
|
menuFile->AppendCheckItem(SkipHook, "Skip CHAR_HOOK event",
|
||||||
menuFile->Check(SkipID, true);
|
"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->AppendSeparator();
|
||||||
|
|
||||||
menuFile->Append(QuitID, "E&xit\tAlt-X", "Quit this program");
|
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,
|
Connect(ClearID, wxEVT_COMMAND_MENU_SELECTED,
|
||||||
wxCommandEventHandler(MyFrame::OnClear));
|
wxCommandEventHandler(MyFrame::OnClear));
|
||||||
|
|
||||||
Connect(SkipID, wxEVT_COMMAND_MENU_SELECTED,
|
Connect(SkipHook, wxEVT_COMMAND_MENU_SELECTED,
|
||||||
wxCommandEventHandler(MyFrame::OnSkip));
|
wxCommandEventHandler(MyFrame::OnSkipHook));
|
||||||
|
Connect(SkipDown, wxEVT_COMMAND_MENU_SELECTED,
|
||||||
|
wxCommandEventHandler(MyFrame::OnSkipDown));
|
||||||
|
|
||||||
Connect(TestAccelA, wxEVT_COMMAND_MENU_SELECTED,
|
Connect(TestAccelA, wxEVT_COMMAND_MENU_SELECTED,
|
||||||
wxCommandEventHandler(MyFrame::OnTestAccelA));
|
wxCommandEventHandler(MyFrame::OnTestAccelA));
|
||||||
@@ -198,6 +222,13 @@ MyFrame::MyFrame(const wxString& title)
|
|||||||
wxPaintEventHandler(MyFrame::OnPaintInputWin),
|
wxPaintEventHandler(MyFrame::OnPaintInputWin),
|
||||||
NULL, this);
|
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
|
// and show itself (the frames, unlike simple controls, are not shown when
|
||||||
// created initially)
|
// created initially)
|
||||||
Show(true);
|
Show(true);
|
||||||
@@ -404,9 +435,6 @@ void MyFrame::LogEvent(const wxString& name, wxKeyEvent& event)
|
|||||||
);
|
);
|
||||||
|
|
||||||
m_logText->AppendText(msg);
|
m_logText->AppendText(msg);
|
||||||
|
|
||||||
if ( m_skip )
|
|
||||||
event.Skip();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -2299,6 +2299,18 @@ bool wxWidgetCocoaImpl::DoHandleKeyEvent(NSEvent *event)
|
|||||||
{
|
{
|
||||||
wxKeyEvent wxevent(wxEVT_KEY_DOWN);
|
wxKeyEvent wxevent(wxEVT_KEY_DOWN);
|
||||||
SetupKeyEvent( wxevent, event );
|
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);
|
bool result = GetWXPeer()->OSXHandleKeyEvent(wxevent);
|
||||||
|
|
||||||
// this will fire higher level events, like insertText, to help
|
// this will fire higher level events, like insertText, to help
|
||||||
|
Reference in New Issue
Block a user