]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/osx/uiaction_osx.cpp
Applied Blit system options optimization to StretchBlit
[wxWidgets.git] / src / osx / uiaction_osx.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: src/osx/uiaction_osx.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/defs.h"
15
16#if wxUSE_UIACTIONSIMULATOR
17
18#include "wx/uiaction.h"
19
20#include "wx/log.h"
21
22#include "wx/osx/private.h"
23#include "wx/osx/core/cfref.h"
24
25namespace
26{
27
28CGEventTapLocation tap = kCGSessionEventTap;
29
30CGEventType CGEventTypeForMouseButton(int button, bool isDown)
31{
32 switch ( button )
33 {
34 case wxMOUSE_BTN_LEFT:
35 return isDown ? kCGEventLeftMouseDown : kCGEventLeftMouseUp;
36
37 case wxMOUSE_BTN_RIGHT:
38 return isDown ? kCGEventRightMouseDown : kCGEventRightMouseUp;
39
40 // All the other buttons use the constant OtherMouseDown but we still
41 // want to check for invalid parameters so assert first
42 default:
43 wxFAIL_MSG("Unsupported button passed in.");
44 // fall back to the only known remaining case
45
46 case wxMOUSE_BTN_MIDDLE:
47 return isDown ? kCGEventOtherMouseDown : kCGEventOtherMouseUp;
48 }
49}
50
51CGPoint GetMousePosition()
52{
53 int x, y;
54 wxGetMousePosition(&x, &y);
55
56 CGPoint pos;
57 pos.x = x;
58 pos.y = y;
59
60 return pos;
61}
62
63} // anonymous namespace
64
65bool wxUIActionSimulator::MouseDown(int button)
66{
67 CGEventType type = CGEventTypeForMouseButton(button, true);
68 wxCFRef<CGEventRef> event(
69 CGEventCreateMouseEvent(NULL, type, GetMousePosition(), button));
70
71 if ( !event )
72 return false;
73
74 CGEventSetType(event, type);
75 CGEventPost(tap, event);
76
77 return true;
78}
79
80bool wxUIActionSimulator::MouseMove(long x, long y)
81{
82 CGPoint pos;
83 pos.x = x;
84 pos.y = y;
85
86 CGEventType type = kCGEventMouseMoved;
87 wxCFRef<CGEventRef> event(
88 CGEventCreateMouseEvent(NULL, type, pos, kCGMouseButtonLeft));
89
90 if ( !event )
91 return false;
92
93 CGEventSetType(event, type);
94 CGEventPost(tap, event);
95
96 return true;
97}
98
99bool wxUIActionSimulator::MouseUp(int button)
100{
101 CGEventType type = CGEventTypeForMouseButton(button, false);
102 wxCFRef<CGEventRef> event(
103 CGEventCreateMouseEvent(NULL, type, GetMousePosition(), button));
104
105 if ( !event )
106 return false;
107
108 CGEventSetType(event, type);
109 CGEventPost(tap, event);
110
111 return true;
112}
113
114bool
115wxUIActionSimulator::DoKey(int keycode, int WXUNUSED(modifiers), bool isDown)
116{
117 CGKeyCode cgcode = wxCharCodeWXToOSX((wxKeyCode)keycode);
118
119 wxCFRef<CGEventRef>
120 event(CGEventCreateKeyboardEvent(NULL, cgcode, isDown));
121 if ( !event )
122 return false;
123
124 CGEventPost(kCGHIDEventTap, event);
125 return true;
126}
127
128#endif // wxUSE_UIACTIONSIMULATOR
129