]> git.saurik.com Git - wxWidgets.git/commitdiff
Explicitly send events for modifier keys in wxUIActionSimulator.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 11 Sep 2010 10:18:15 +0000 (10:18 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 11 Sep 2010 10:18:15 +0000 (10:18 +0000)
Key down/up events for the modifiers were already explicitly sent under wxMSW
and wxOSX but not under wxGTK where, as the result, the corresponding events
were not generated at all.

Do send these events explicitly to make the events generation consistent under
all platforms now. This means that wxUIActionSimulator::DoKey() now generates
exactly one event everywhere.

Notice that the modifiers for the key events generated by the modifier keys
are also the same under all platforms now which is not the case for the events
actually generated by the user (wxMSW sets the corresponding bit for the
modifier key down event but not the key up one while wxGTK does exactly the
contrary). This should be fixed in the future so that wxUIActionSimulator
generates the same sequence of events as the user would and that it's still
the same for all platforms.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65516 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/uiaction.h
src/common/uiactioncmn.cpp
src/msw/uiaction.cpp
src/osx/uiaction_osx.cpp

index e662b2c3c32e780464a6c29dffdc29cebe300c3c..d681d5944a142b5a44d46c880eafa8a71dadbdc0 100644 (file)
@@ -70,11 +70,17 @@ private:
     // implementation level it makes more sense to have them in a single
     // function.
     //
-    // This is a simple wrapper verifying the input parameters validity around
-    // the platform-specific DoKey() method implemented in platform-specific
-    // files.
+    // It calls DoModifiers() to simulate pressing the modifier keys if
+    // necessary and then DoKey() for the key itself.
     bool Key(int keycode, int modifiers, bool isDown);
 
+    // Call DoKey() for all modifier keys whose bits are set in the parameter.
+    void SimulateModifiers(int modifier, bool isDown);
+
+
+    // The low-level port-specific function which really generates the key
+    // presses. It should generate exactly one key event with the given
+    // parameters.
     bool DoKey(int keycode, int modifiers, bool isDown);
 };
 
index a109097bd031977d7a1d8263d3d3a819ccc72bf0..5afc7dae6a70095eea0fc485415b72931eb614f7 100644 (file)
@@ -57,10 +57,28 @@ wxUIActionSimulator::Key(int keycode, int modifiers, bool isDown)
     wxASSERT_MSG( !(modifiers & wxMOD_WIN ),
         "wxMOD_WIN is not implemented" );
 
-    return DoKey(keycode, modifiers, isDown);
+    if ( isDown )
+        SimulateModifiers(modifiers, true);
+
+    bool rc = DoKey(keycode, modifiers, isDown);
+
+    if ( !isDown )
+        SimulateModifiers(modifiers, false);
+
+    return rc;
+}
+
+void wxUIActionSimulator::SimulateModifiers(int modifiers, bool isDown)
+{
+    if ( modifiers & wxMOD_SHIFT )
+        DoKey(WXK_SHIFT, modifiers, isDown);
+    if ( modifiers & wxMOD_ALT )
+        DoKey(WXK_ALT, modifiers, isDown);
+    if ( modifiers & wxMOD_CONTROL )
+        DoKey(WXK_CONTROL, modifiers, isDown);
 }
 
-bool  wxUIActionSimulator::Char(int keycode, int modifiers)
+bool wxUIActionSimulator::Char(int keycode, int modifiers)
 {
     Key(keycode, modifiers, true);
     Key(keycode, modifiers, false);
index 293cf510784e4a92c9b3d4f6f798e25b2d072599..d8f498cbd8165137c86dccea285d42e027d1ca59 100644 (file)
@@ -41,11 +41,6 @@ DWORD EventTypeForMouseButton(int button, bool isDown)
     }
 }
 
-void DoSimulateKbdEvent(DWORD vk, bool isDown)
-{
-    keybd_event(vk, 0, isDown ? 0 : KEYEVENTF_KEYUP, 0);
-}
-
 } // anonymous namespace
 
 bool wxUIActionSimulator::MouseDown(int button)
@@ -76,31 +71,12 @@ bool wxUIActionSimulator::MouseUp(int button)
     return true;
 }
 
-bool wxUIActionSimulator::DoKey(int keycode, int modifiers, bool isDown)
+bool
+wxUIActionSimulator::DoKey(int keycode, int WXUNUSED(modifiers), bool isDown)
 {
-    if (isDown)
-    {
-        if (modifiers & wxMOD_SHIFT)
-            DoSimulateKbdEvent(VK_SHIFT, true);
-        if (modifiers & wxMOD_ALT)
-            DoSimulateKbdEvent(VK_MENU, true);
-        if (modifiers & wxMOD_CMD)
-            DoSimulateKbdEvent(VK_CONTROL, true);
-    }
-
     DWORD vkkeycode = wxCharCodeWXToMSW(keycode);
     keybd_event(vkkeycode, 0, isDown ? 0 : KEYEVENTF_KEYUP, 0);
 
-    if (!isDown)
-    {
-        if (modifiers & wxMOD_SHIFT)
-            DoSimulateKbdEvent(VK_SHIFT, false);
-        if (modifiers & wxMOD_ALT)
-            DoSimulateKbdEvent(VK_MENU, false);
-        if (modifiers & wxMOD_CMD)
-            DoSimulateKbdEvent(VK_CONTROL, false);
-    }
-
     return true;
 }
 
index c2ebb321b301b11e20cd2bc49884a3df3f771889..2f8088f8c2106d8086f77c12b052eeb3388dd3a9 100644 (file)
@@ -60,17 +60,6 @@ CGPoint GetMousePosition()
     return pos;
 }
 
-bool SendCharCode(CGKeyCode keycode, bool isDown)
-{
-    wxCFRef<CGEventRef>
-        event(CGEventCreateKeyboardEvent(NULL, keycode, isDown));
-    if ( !event )
-        return false;
-
-    CGEventPost(kCGHIDEventTap, event);
-    return true;
-}
-
 CGKeyCode wxCharCodeWXToOSX(wxKeyCode code)
 {
     CGKeyCode keycode;
@@ -241,32 +230,18 @@ bool wxUIActionSimulator::MouseUp(int button)
 
 bool wxUIActionSimulator::DoKey(int keycode, int modifiers, bool isDown)
 {
-    if (isDown)
-    {
-        if (modifiers & wxMOD_SHIFT)
-            SendCharCode(kVK_Shift, true);
-        if (modifiers & wxMOD_ALT)
-            SendCharCode(kVK_Option, true);
-        if (modifiers & wxMOD_CMD)
-            SendCharCode(kVK_Command, true);
-    }
-
     CGKeyCode cgcode = wxCharCodeWXToOSX((wxKeyCode)keycode);
-    if ( !SendCharCode(cgcode, isDown) )
-        return false;
 
-    if(!isDown)
-    {
-        if (modifiers & wxMOD_SHIFT)
-            SendCharCode(kVK_Shift, false);
-        if (modifiers & wxMOD_ALT)
-            SendCharCode(kVK_Option, false);
-        if (modifiers & wxMOD_CMD)
-            SendCharCode(kVK_Command, false);
-    }
+    wxCFRef<CGEventRef>
+        event(CGEventCreateKeyboardEvent(NULL, cgcode, isDown));
+    if ( !event )
+        return false;
 
+    CGEventPost(kCGHIDEventTap, event);
     return true;
 }
 
+}
+
 #endif // wxUSE_UIACTIONSIMULATOR