X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a02a5cfcf33bb2c0edae246c1b19e286bf86d422..43f4e852a1b2ac37c3db6a2b87315192ac549191:/src/msw/uiaction.cpp diff --git a/src/msw/uiaction.cpp b/src/msw/uiaction.cpp index 6bbbf1abdc..5aff359052 100644 --- a/src/msw/uiaction.cpp +++ b/src/msw/uiaction.cpp @@ -1,78 +1,100 @@ ///////////////////////////////////////////////////////////////////////////// // Name: src/msw/uiaction.cpp // Purpose: wxUIActionSimulator implementation -// Author: Kevin Ollivier +// Author: Kevin Ollivier, Steven Lamerton, Vadim Zeitlin // Modified by: // Created: 2010-03-06 -// RCS-ID: $Id: menu.cpp 54129 2008-06-11 19:30:52Z SC $ +// RCS-ID: $Id$ // Copyright: (c) Kevin Ollivier +// (c) 2010 Steven Lamerton +// (c) 2010 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" +#if wxUSE_UIACTIONSIMULATOR + #ifndef WX_PRECOMP -#include "wx/defs.h" + #include "wx/msw/private.h" // For wxGetCursorPosMSW() #endif #include "wx/uiaction.h" +#include "wx/msw/wrapwin.h" + +#include "wx/msw/private/keyboard.h" -#include +#include "wx/math.h" + +namespace +{ DWORD EventTypeForMouseButton(int button, bool isDown) { switch (button) { case wxMOUSE_BTN_LEFT: - if (isDown) - return MOUSEEVENTF_LEFTDOWN; - else - return MOUSEEVENTF_LEFTUP; + return isDown ? MOUSEEVENTF_LEFTDOWN : MOUSEEVENTF_LEFTUP; + case wxMOUSE_BTN_RIGHT: - if (isDown) - return MOUSEEVENTF_RIGHTDOWN; - else - return MOUSEEVENTF_RIGHTUP; + return isDown ? MOUSEEVENTF_RIGHTDOWN : MOUSEEVENTF_RIGHTUP; + case wxMOUSE_BTN_MIDDLE: - if (isDown) - return MOUSEEVENTF_MIDDLEDOWN; - else - return MOUSEEVENTF_MIDDLEUP; - + return isDown ? MOUSEEVENTF_MIDDLEDOWN : MOUSEEVENTF_MIDDLEUP; + default: wxFAIL_MSG("Unsupported button passed in."); - return -1; + return (DWORD)-1; } } +} // anonymous namespace + bool wxUIActionSimulator::MouseDown(int button) { POINT p; - GetCursorPos(&p); + wxGetCursorPosMSW(&p); mouse_event(EventTypeForMouseButton(button, true), p.x, p.y, 0, 0); return true; } bool wxUIActionSimulator::MouseMove(long x, long y) -{ - mouse_event(MOUSEEVENTF_MOVE, x, y, 0, 0); +{ + // Because MOUSEEVENTF_ABSOLUTE takes measurements scaled between 0 & 65535 + // we need to scale our input too + int displayx, displayy; + wxDisplaySize(&displayx, &displayy); + + int scaledx = ceil((float)x * 65535.0 / (displayx-1)); + int scaledy = ceil((float)y * 65535.0 / (displayy-1)); + mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, scaledx, scaledy, 0, 0); + return true; } bool wxUIActionSimulator::MouseUp(int button) { POINT p; - GetCursorPos(&p); + wxGetCursorPosMSW(&p); mouse_event(EventTypeForMouseButton(button, false), p.x, p.y, 0, 0); return true; } -bool wxUIActionSimulator::Key(int keycode, bool isDown, bool shiftDown, bool cmdDown, bool altDown) +bool +wxUIActionSimulator::DoKey(int keycode, int WXUNUSED(modifiers), bool isDown) { + bool isExtended; + DWORD vkkeycode = wxMSWKeyboard::WXToVK(keycode, &isExtended); + DWORD flags = 0; - if (!isDown) - flags = KEYEVENTF_KEYUP; - keybd_event(keycode, 0, flags, 0); + if ( isExtended ) + flags |= KEYEVENTF_EXTENDEDKEY; + if ( !isDown ) + flags |= KEYEVENTF_KEYUP; + + keybd_event(vkkeycode, 0, flags, 0); + return true; } +#endif // wxUSE_UIACTIONSIMULATOR