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