Fix warnings about implicit float or double to int conversions in wxMSW.
[wxWidgets.git] / src / msw / uiaction.cpp
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
29 namespace
30 {
31
32 DWORD 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
53 bool 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
61 bool 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
77 bool 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
85 bool
86 wxUIActionSimulator::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