]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/msw/uiaction.cpp
Don't exclude tests from wxMSW-Setup.exe.
[wxWidgets.git] / src / msw / uiaction.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: src/msw/uiaction.cpp
3// Purpose: wxUIActionSimulator implementation
4// Author: Kevin Ollivier, Steven Lamerton, Vadim Zeitlin
5// Modified by:
6// Created: 2010-03-06
7// RCS-ID: $Id$
8// Copyright: (c) Kevin Ollivier
9// (c) 2010 Steven Lamerton
10// (c) 2010 Vadim Zeitlin
11// Licence: wxWindows licence
12/////////////////////////////////////////////////////////////////////////////
13
14#include "wx/wxprec.h"
15
16#if wxUSE_UIACTIONSIMULATOR
17
18#ifndef WX_PRECOMP
19 #include "wx/msw/private.h" // For wxGetCursorPosMSW()
20#endif
21
22#include "wx/uiaction.h"
23#include "wx/msw/wrapwin.h"
24
25#include "wx/msw/private/keyboard.h"
26
27#include "wx/math.h"
28
29namespace
30{
31
32DWORD EventTypeForMouseButton(int button, bool isDown)
33{
34 switch (button)
35 {
36 case wxMOUSE_BTN_LEFT:
37 return isDown ? MOUSEEVENTF_LEFTDOWN : MOUSEEVENTF_LEFTUP;
38
39 case wxMOUSE_BTN_RIGHT:
40 return isDown ? MOUSEEVENTF_RIGHTDOWN : MOUSEEVENTF_RIGHTUP;
41
42 case wxMOUSE_BTN_MIDDLE:
43 return isDown ? MOUSEEVENTF_MIDDLEDOWN : MOUSEEVENTF_MIDDLEUP;
44
45 default:
46 wxFAIL_MSG("Unsupported button passed in.");
47 return (DWORD)-1;
48 }
49}
50
51} // anonymous namespace
52
53bool wxUIActionSimulator::MouseDown(int button)
54{
55 POINT p;
56 wxGetCursorPosMSW(&p);
57 mouse_event(EventTypeForMouseButton(button, true), p.x, p.y, 0, 0);
58 return true;
59}
60
61bool wxUIActionSimulator::MouseMove(long x, long y)
62{
63 // Because MOUSEEVENTF_ABSOLUTE takes measurements scaled between 0 & 65535
64 // we need to scale our input too
65 int displayx, displayy;
66 wxDisplaySize(&displayx, &displayy);
67
68 // Casts are safe because x and y are supposed to be less than the display
69 // size, so there is no danger of overflow.
70 DWORD scaledx = static_cast<DWORD>(ceil(x * 65535.0 / (displayx-1)));
71 DWORD scaledy = static_cast<DWORD>(ceil(y * 65535.0 / (displayy-1)));
72 mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, scaledx, scaledy, 0, 0);
73
74 return true;
75}
76
77bool wxUIActionSimulator::MouseUp(int button)
78{
79 POINT p;
80 wxGetCursorPosMSW(&p);
81 mouse_event(EventTypeForMouseButton(button, false), p.x, p.y, 0, 0);
82 return true;
83}
84
85bool
86wxUIActionSimulator::DoKey(int keycode, int WXUNUSED(modifiers), bool isDown)
87{
88 bool isExtended;
89 DWORD vkkeycode = wxMSWKeyboard::WXToVK(keycode, &isExtended);
90
91 DWORD flags = 0;
92 if ( isExtended )
93 flags |= KEYEVENTF_EXTENDEDKEY;
94 if ( !isDown )
95 flags |= KEYEVENTF_KEYUP;
96
97 keybd_event(vkkeycode, 0, flags, 0);
98
99 return true;
100}
101
102#endif // wxUSE_UIACTIONSIMULATOR