]> git.saurik.com Git - wxWidgets.git/commitdiff
Implement EVT_CHAR_HOOK for wxOSX/Cocoa.
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 2 Dec 2011 00:50:12 +0000 (00:50 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 2 Dec 2011 00:50:12 +0000 (00:50 +0000)
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

docs/changes.txt
interface/wx/event.h
samples/keyboard/keyboard.cpp
src/osx/cocoa/window.mm

index ac3273f5bf56ff3e0f3e3f80ed123e6625726d89..605ad3055c2d41a0f832def9ebd8488e30812e57 100644 (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:
 
index e61807c55d57a3957586b3862ff95a5ddc278de8..d715fac7cdfb9ba5b83e777ba32d529a823b1d34 100644 (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
index 25907b5a4c4b9f16f7b0bce7953c5af4a0dbbce2..c9e1ff9fccbe9e3e99a85677a4bb011af48cda0c 100644 (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();
 }
 
 
index 841b89426ce825c5571d550509e1a3e2de5a787a..0bf187240188e2410ee8a873c8b3a9666ad63359 100644 (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