mouse 3.0.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +2 -0
- data.tar.gz.sig +0 -0
- data/History.markdown +8 -0
- data/README.markdown +14 -1
- data/Rakefile +12 -13
- data/ext/mouse/extconf.rb +13 -18
- data/ext/mouse/mouse.c +613 -497
- data/ext/mouse/mouser.c +321 -333
- data/ext/mouse/mouser.h +53 -54
- data/lib/mouse.rb +2 -0
- data/lib/mouse/version.rb +2 -2
- metadata +39 -59
- metadata.gz.sig +1 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2ddfe16e59a8a567e6ebd72a64bde83a5975b70a
|
4
|
+
data.tar.gz: 5903fd9b63b5071d4076d71a67ab30fd32bee76f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d0cc22ad9e05aa6a5b4aed1619b505be16204a9a961cae862b7fcf6e0ef42ef42506d9791a59e8729faf5db0043e470403566114aab54f043b79cf9f96e21830
|
7
|
+
data.tar.gz: ad82dcd3fff38d40cf33803a1db0adbd037a4b96b44dbbadf4355ee915c436372d05d55734e2d992d32cdaa14f451ee746dbbc91ec437da2b3bb8a723079c272
|
checksums.yaml.gz.sig
ADDED
data.tar.gz.sig
ADDED
Binary file
|
data/History.markdown
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
# 4.0.0 - Scaling Yosemite
|
2
|
+
|
3
|
+
* Finish removing MacRuby support
|
4
|
+
* Cleanup coding style and doocumentation, and also enable stricter warnings
|
5
|
+
* Begin signing the gem
|
6
|
+
* Begin distributing pre-compiled versions of the gem
|
7
|
+
* Yosemite compatability
|
8
|
+
|
1
9
|
# 3.0.0 - The death of MacRuby
|
2
10
|
|
3
11
|
* Remove MacRuby support (sort of)
|
data/README.markdown
CHANGED
@@ -15,6 +15,8 @@ testing; this is the purpose of the
|
|
15
15
|
|
16
16
|
[](https://codeclimate.com/github/AXElements/mouse)
|
17
17
|
[](https://gemnasium.com/AXElements/mouse)
|
18
|
+
[](http://badge.fury.io/rb/mouse)
|
19
|
+
[](https://bitdeli.com/free "Bitdeli Badge")
|
18
20
|
|
19
21
|
|
20
22
|
## Examples
|
@@ -91,9 +93,20 @@ change in the future if there are enough complaints.
|
|
91
93
|
- [ ] Import test app and specialize so we can have better tests
|
92
94
|
|
93
95
|
|
96
|
+
## Security
|
97
|
+
|
98
|
+
mouse is cryptographically signed. To be sure the gem you install
|
99
|
+
hasn’t been tampered with you will want to add my public key (if you
|
100
|
+
haven’t already) as a trusted certificate for Rubygems:
|
101
|
+
|
102
|
+
```sh
|
103
|
+
gem cert --add <(curl -Ls https://raw.github.com/AXElements/mouse/master/certs/markrada26@gmail.com.pem)
|
104
|
+
gem install mouse -P HighSecurity
|
105
|
+
```
|
106
|
+
|
94
107
|
## Copyright
|
95
108
|
|
96
|
-
Copyright (c) 2012-
|
109
|
+
Copyright (c) 2012-2015, Mark Rada
|
97
110
|
All rights reserved.
|
98
111
|
|
99
112
|
Redistribution and use in source and binary forms, with or without
|
data/Rakefile
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
task :
|
1
|
+
task default: :test
|
2
2
|
|
3
3
|
require 'rake/clean'
|
4
|
-
|
4
|
+
CLOBBER.include '*.plist', '*.gch'
|
5
5
|
|
6
6
|
desc 'Run the Clang static analyzer'
|
7
7
|
task :analyze do
|
8
|
-
sh
|
8
|
+
sh 'clang --analyze ext/mouse/mouser.c'
|
9
9
|
end
|
10
10
|
|
11
11
|
desc 'Startup an IRb console with Mouse loaded'
|
12
|
-
task :
|
12
|
+
task console: :compile do
|
13
13
|
sh 'irb -Ilib -rmouse'
|
14
14
|
end
|
15
15
|
|
@@ -18,24 +18,23 @@ Rake::TestTask.new do |t|
|
|
18
18
|
t.libs << '.'
|
19
19
|
t.pattern = 'test/*_test.rb'
|
20
20
|
end
|
21
|
-
task :
|
22
|
-
|
21
|
+
task test: :compile
|
23
22
|
|
24
23
|
# Gem stuff
|
25
24
|
|
26
25
|
require 'rubygems/package_task'
|
27
26
|
mouse_spec = Gem::Specification.load('mouse.gemspec')
|
28
27
|
|
29
|
-
Gem::PackageTask.new(mouse_spec) {
|
30
|
-
|
31
|
-
desc 'Build and install gem (not including deps)'
|
32
|
-
task :install => :gem do
|
33
|
-
require 'rubygems/installer'
|
34
|
-
Gem::Installer.new("pkg/#{mouse_spec.file_name}").install
|
35
|
-
end
|
28
|
+
Gem::PackageTask.new(mouse_spec) {}
|
36
29
|
|
37
30
|
require 'rake/extensiontask'
|
38
31
|
Rake::ExtensionTask.new('mouse', mouse_spec) do |t|
|
39
32
|
t.lib_dir = 'lib/mouse'
|
33
|
+
t.ext_dir = 'ext/mouse'
|
40
34
|
end
|
41
35
|
|
36
|
+
desc 'Build and install gem (not including deps)'
|
37
|
+
task install: :gem do
|
38
|
+
require 'rubygems/installer'
|
39
|
+
Gem::Installer.new("pkg/#{mouse_spec.file_name}").install
|
40
|
+
end
|
data/ext/mouse/extconf.rb
CHANGED
@@ -1,24 +1,19 @@
|
|
1
1
|
require 'mkmf'
|
2
2
|
|
3
|
-
$CFLAGS << ' -std=c99 -
|
4
|
-
$
|
5
|
-
|
3
|
+
$CFLAGS << ' -std=c99 -Weverything'
|
4
|
+
$CFLAGS << ' -Wno-disabled-macro-expansion -Wno-gnu -Wno-documentation'
|
5
|
+
# @todo REALLY NEED TO CLEAR ALL THESE WARNINGS
|
6
|
+
$CFLAGS << ' -Wno-conversion'
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
else
|
17
|
-
RbConfig::MAKEFILE_CONFIG["CC"] = clang
|
18
|
-
RbConfig::MAKEFILE_CONFIG["CXX"] = clang
|
19
|
-
end
|
20
|
-
end
|
21
|
-
$CFLAGS << ' -DNOT_MACRUBY'
|
8
|
+
$LIBS << ' -framework Foundation'
|
9
|
+
$LIBS << ' -framework ApplicationServices'
|
10
|
+
$LIBS << ' -framework CoreGraphics'
|
11
|
+
|
12
|
+
unless RbConfig::CONFIG['CC'].match(/clang/)
|
13
|
+
clang = `which clang`.chomp
|
14
|
+
fail 'Clang not installed. Cannot build C extension' if clang.empty?
|
15
|
+
RbConfig::MAKEFILE_CONFIG['CC'] = clang
|
16
|
+
RbConfig::MAKEFILE_CONFIG['CXX'] = clang
|
22
17
|
end
|
23
18
|
|
24
19
|
create_makefile 'mouse/mouse'
|
data/ext/mouse/mouse.c
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
#include "mouser.h"
|
2
2
|
#include "ruby.h"
|
3
3
|
|
4
|
+
#ifndef UNUSED
|
5
|
+
#define UNUSED __attribute__ ((unused))
|
6
|
+
#endif
|
7
|
+
|
8
|
+
|
4
9
|
static VALUE rb_mMouse, rb_cCGPoint;
|
5
10
|
|
6
11
|
static ID sel_x, sel_y, sel_to_point, sel_new;
|
@@ -15,32 +20,19 @@ static VALUE sym_pixel, sym_line,
|
|
15
20
|
|
16
21
|
static
|
17
22
|
VALUE
|
18
|
-
rb_mouse_wrap_point(CGPoint point)
|
23
|
+
rb_mouse_wrap_point(const CGPoint point)
|
19
24
|
{
|
20
|
-
|
21
|
-
return rb_struct_new(rb_cCGPoint, DBL2NUM(point.x), DBL2NUM(point.y));
|
22
|
-
#else
|
23
|
-
return rb_funcall(rb_cCGPoint, sel_new, 2, DBL2NUM(point.x), DBL2NUM(point.y));
|
24
|
-
#endif
|
25
|
+
return rb_struct_new(rb_cCGPoint, DBL2NUM(point.x), DBL2NUM(point.y));
|
25
26
|
}
|
26
27
|
|
27
28
|
static
|
28
29
|
CGPoint
|
29
|
-
rb_mouse_unwrap_point(VALUE
|
30
|
+
rb_mouse_unwrap_point(const VALUE maybe_point)
|
30
31
|
{
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
double y = NUM2DBL(rb_struct_getmember(point, sel_y));
|
36
|
-
return CGPointMake(x, y);
|
37
|
-
|
38
|
-
#else
|
39
|
-
CGPoint* ptr;
|
40
|
-
Data_Get_Struct(point, CGPoint, ptr);
|
41
|
-
return *ptr;
|
42
|
-
|
43
|
-
#endif
|
32
|
+
const VALUE point = rb_funcall(maybe_point, sel_to_point, 0);
|
33
|
+
const double x = NUM2DBL(rb_struct_getmember(point, sel_x));
|
34
|
+
const double y = NUM2DBL(rb_struct_getmember(point, sel_y));
|
35
|
+
return CGPointMake(x, y);
|
44
36
|
}
|
45
37
|
|
46
38
|
/*
|
@@ -50,36 +42,42 @@ rb_mouse_unwrap_point(VALUE point)
|
|
50
42
|
*/
|
51
43
|
static
|
52
44
|
VALUE
|
53
|
-
rb_mouse_current_position(VALUE self)
|
45
|
+
rb_mouse_current_position(UNUSED const VALUE self)
|
54
46
|
{
|
55
|
-
|
47
|
+
return CURRENT_POSITION;
|
56
48
|
}
|
57
49
|
|
58
50
|
/*
|
59
51
|
* Move the mouse cursor to the given co-ordinates
|
60
52
|
*
|
61
|
-
*
|
62
|
-
*
|
63
|
-
* @
|
53
|
+
* The default duration is 0.2 seconds.
|
54
|
+
*
|
55
|
+
* @overload move_to(point)
|
56
|
+
* @param point [CGPoint,Array(Number,Number),#to_point]
|
57
|
+
* @return [CGPoint]
|
58
|
+
* @overload move_to(point, duration)
|
59
|
+
* @param point [CGPoint,Array(Number,Number),#to_point]
|
60
|
+
* @param duration [Number] animation time, in seconds
|
61
|
+
* @return [CGPoint]
|
64
62
|
*/
|
65
63
|
static
|
66
64
|
VALUE
|
67
|
-
rb_mouse_move_to(int argc,
|
65
|
+
rb_mouse_move_to(const int argc,
|
66
|
+
VALUE* const argv,
|
67
|
+
UNUSED const VALUE self)
|
68
68
|
{
|
69
|
-
|
70
|
-
{
|
69
|
+
switch (argc) {
|
71
70
|
case 0:
|
72
|
-
|
73
|
-
break;
|
71
|
+
rb_raise(rb_eArgError, "move_to requires at least a one arg");
|
74
72
|
case 1:
|
75
|
-
|
76
|
-
|
73
|
+
mouse_move_to(rb_mouse_unwrap_point(argv[0]));
|
74
|
+
break;
|
77
75
|
case 2:
|
78
76
|
default:
|
79
|
-
|
77
|
+
mouse_move_to2(rb_mouse_unwrap_point(argv[0]), NUM2DBL(argv[1]));
|
80
78
|
}
|
81
79
|
|
82
|
-
|
80
|
+
return CURRENT_POSITION;
|
83
81
|
}
|
84
82
|
|
85
83
|
/*
|
@@ -90,71 +88,83 @@ rb_mouse_move_to(int argc, VALUE *argv, VALUE self)
|
|
90
88
|
*/
|
91
89
|
static
|
92
90
|
VALUE
|
93
|
-
rb_mouse_drag_to(int argc,
|
91
|
+
rb_mouse_drag_to(const int argc,
|
92
|
+
VALUE* const argv,
|
93
|
+
UNUSED const VALUE self)
|
94
94
|
{
|
95
|
-
|
96
|
-
{
|
95
|
+
switch (argc) {
|
97
96
|
case 0:
|
98
|
-
|
99
|
-
break;
|
97
|
+
rb_raise(rb_eArgError, "drag_to requires at least a one arg");
|
100
98
|
case 1:
|
101
|
-
|
102
|
-
|
99
|
+
mouse_drag_to(rb_mouse_unwrap_point(argv[0]));
|
100
|
+
break;
|
103
101
|
case 2:
|
104
102
|
default:
|
105
|
-
|
103
|
+
mouse_drag_to2(rb_mouse_unwrap_point(argv[0]), NUM2DBL(argv[1]));
|
106
104
|
}
|
107
105
|
|
108
|
-
|
106
|
+
return CURRENT_POSITION;
|
109
107
|
}
|
110
108
|
|
111
109
|
/*
|
112
110
|
* @note Scrolling by `:pixel` may not actually be by real pixels, but instead
|
113
|
-
* correspond to Cocoa co-ords (I don't have a retina display, so I
|
114
|
-
* checked it out yet).
|
111
|
+
* correspond to Cocoa co-ords (I don't have a retina display, so I
|
112
|
+
* haven't checked it out yet).
|
115
113
|
*
|
116
114
|
* Generate `amount` scroll events at the current cursor position
|
117
115
|
*
|
118
|
-
* Returns number of lines scrolled
|
119
|
-
* and a negative `amount` will scroll down.
|
120
|
-
*
|
121
|
-
* An animation duration can also be specified.
|
122
|
-
*
|
123
|
-
* @
|
124
|
-
*
|
125
|
-
*
|
126
|
-
* @
|
116
|
+
* Returns number of lines/pixels scrolled, default `units` are by `line`.
|
117
|
+
* A positive `amount` will scroll up and a negative `amount` will scroll down.
|
118
|
+
*
|
119
|
+
* An animation duration can also be specified, which defaults to 0.2 seconds.
|
120
|
+
*
|
121
|
+
* @overload scroll(amount)
|
122
|
+
* @param amount [Number]
|
123
|
+
* @return [Number]
|
124
|
+
* @overload scroll(amount, units)
|
125
|
+
* @param amount [Number]
|
126
|
+
* @param units [Symbol] `:pixel` or `:line`
|
127
|
+
* @return [Number]
|
128
|
+
* @overload scroll(amount, units, duration)
|
129
|
+
* @param amount [Number]
|
130
|
+
* @param units [Symbol] `:pixel` or `:line`
|
131
|
+
* @param duration [Number] animation time, in seconds
|
132
|
+
* @return [Number]
|
127
133
|
*/
|
128
134
|
static
|
129
135
|
VALUE
|
130
|
-
rb_mouse_scroll(int argc, VALUE
|
136
|
+
rb_mouse_scroll(const int argc, VALUE* const argv, UNUSED const VALUE self)
|
131
137
|
{
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
138
|
+
if (argc == 0 || argc > 3)
|
139
|
+
rb_raise(rb_eArgError,
|
140
|
+
"scroll requires 1..3 arguments, you gave %d",
|
141
|
+
argc);
|
142
|
+
|
143
|
+
const int amt = NUM2INT(argv[0]);
|
144
|
+
|
145
|
+
if (argc == 1) {
|
146
|
+
mouse_scroll(amt);
|
147
|
+
|
148
|
+
} else {
|
149
|
+
const VALUE input_units = argv[1];
|
150
|
+
CGScrollEventUnit units;
|
151
|
+
|
152
|
+
if (input_units == sym_pixel)
|
153
|
+
units = kCGScrollEventUnitPixel;
|
154
|
+
else if (input_units == sym_line)
|
155
|
+
units = kCGScrollEventUnitLine;
|
156
|
+
else
|
157
|
+
rb_raise(rb_eArgError,
|
158
|
+
"unknown units `%s'",
|
159
|
+
rb_id2name(input_units));
|
160
|
+
|
161
|
+
if (argc == 2)
|
162
|
+
mouse_scroll2(amt, units);
|
163
|
+
else
|
164
|
+
mouse_scroll3(amt, units, NUM2DBL(argv[2]));
|
165
|
+
}
|
156
166
|
|
157
|
-
|
167
|
+
return argv[0];
|
158
168
|
}
|
159
169
|
|
160
170
|
/*
|
@@ -164,46 +174,60 @@ rb_mouse_scroll(int argc, VALUE *argv, VALUE self)
|
|
164
174
|
*
|
165
175
|
* Generate `amount` of horizontal scroll events at the current cursor position
|
166
176
|
*
|
167
|
-
* Returns number of lines scrolled
|
168
|
-
* and a negative `amount` will scroll
|
169
|
-
*
|
170
|
-
* An animation duration can also be specified.
|
171
|
-
*
|
172
|
-
* @
|
173
|
-
*
|
174
|
-
*
|
175
|
-
* @
|
177
|
+
* Returns number of lines/pixels scrolled, default `units` are by `line`.
|
178
|
+
* A positive `amount` will scroll up and a negative `amount` will scroll down.
|
179
|
+
*
|
180
|
+
* An animation duration can also be specified, which defaults to 0.2 seconds.
|
181
|
+
*
|
182
|
+
* @overload horizontal_scroll(amount)
|
183
|
+
* @param amount [Number]
|
184
|
+
* @return [Number]
|
185
|
+
* @overload horizontal_scroll(amount, units)
|
186
|
+
* @param amount [Number]
|
187
|
+
* @param units [Symbol] `:pixel` or `:line`
|
188
|
+
* @return [Number]
|
189
|
+
* @overload horizontal_scroll(amount, units, duration)
|
190
|
+
* @param amount [Number]
|
191
|
+
* @param units [Symbol] `:pixel` or `:line`
|
192
|
+
* @param duration [Number] animation time, in seconds
|
193
|
+
* @return [Number]
|
176
194
|
*/
|
177
195
|
static
|
178
196
|
VALUE
|
179
|
-
rb_mouse_horizontal_scroll(int argc,
|
197
|
+
rb_mouse_horizontal_scroll(const int argc,
|
198
|
+
VALUE* const argv,
|
199
|
+
UNUSED const VALUE self)
|
180
200
|
{
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
201
|
+
if (argc == 0 || argc > 3)
|
202
|
+
rb_raise(rb_eArgError,
|
203
|
+
"scroll requires 1..3 arguments, you gave %d",
|
204
|
+
argc);
|
205
|
+
|
206
|
+
const int amt = NUM2INT(argv[0]);
|
207
|
+
|
208
|
+
if (argc == 1) {
|
209
|
+
mouse_horizontal_scroll(amt);
|
210
|
+
|
211
|
+
} else {
|
212
|
+
const VALUE input_units = argv[1];
|
213
|
+
CGScrollEventUnit units;
|
214
|
+
|
215
|
+
if (input_units == sym_pixel)
|
216
|
+
units = kCGScrollEventUnitPixel;
|
217
|
+
else if (input_units == sym_line)
|
218
|
+
units = kCGScrollEventUnitLine;
|
219
|
+
else
|
220
|
+
rb_raise(rb_eArgError,
|
221
|
+
"unknown units `%s'",
|
222
|
+
rb_id2name(input_units));
|
223
|
+
|
224
|
+
if (argc == 2)
|
225
|
+
mouse_horizontal_scroll2(amt, units);
|
226
|
+
else
|
227
|
+
mouse_horizontal_scroll3(amt, units, NUM2DBL(argv[2]));
|
228
|
+
}
|
205
229
|
|
206
|
-
|
230
|
+
return argv[0];
|
207
231
|
}
|
208
232
|
|
209
233
|
/*
|
@@ -213,26 +237,31 @@ rb_mouse_horizontal_scroll(int argc, VALUE *argv, VALUE self)
|
|
213
237
|
* to inject some behaviour between the down and up click events.
|
214
238
|
*
|
215
239
|
* You can optionally specify a point to click; the mouse cursor will
|
216
|
-
* instantly jump to the given point
|
217
|
-
*
|
218
|
-
*
|
219
|
-
* @
|
240
|
+
* instantly jump to the given point; otherwise the click event happens
|
241
|
+
* at the current cursor position.
|
242
|
+
*
|
243
|
+
* @overload click_down()
|
244
|
+
* @return [CGPoint]
|
245
|
+
* @overload click_down(point)
|
246
|
+
* @param point [CGPoint]
|
247
|
+
* @return [CGPoint]
|
220
248
|
*/
|
221
249
|
static
|
222
250
|
VALUE
|
223
|
-
rb_mouse_click_down(int argc,
|
251
|
+
rb_mouse_click_down(const int argc,
|
252
|
+
VALUE* const argv,
|
253
|
+
UNUSED const VALUE self)
|
224
254
|
{
|
225
|
-
|
226
|
-
{
|
255
|
+
switch (argc) {
|
227
256
|
case 0:
|
228
|
-
|
229
|
-
|
257
|
+
mouse_click_down();
|
258
|
+
break;
|
230
259
|
case 1:
|
231
260
|
default:
|
232
|
-
|
261
|
+
mouse_click_down2(rb_mouse_unwrap_point(argv[0]));
|
233
262
|
}
|
234
263
|
|
235
|
-
|
264
|
+
return CURRENT_POSITION;
|
236
265
|
}
|
237
266
|
|
238
267
|
/*
|
@@ -242,52 +271,58 @@ rb_mouse_click_down(int argc, VALUE *argv, VALUE self)
|
|
242
271
|
* to inject some behaviour between the down and up click events.
|
243
272
|
*
|
244
273
|
* You can optionally specify a point to click; the mouse cursor will
|
245
|
-
* instantly jump to the given point
|
246
|
-
*
|
247
|
-
*
|
248
|
-
* @
|
274
|
+
* instantly jump to the given point; otherwise the click event happens
|
275
|
+
* at the current cursor position.
|
276
|
+
*
|
277
|
+
* @overload click_up()
|
278
|
+
* @return [CGPoint]
|
279
|
+
* @overload click_up(point)
|
280
|
+
* @param point [CGPoint]
|
281
|
+
* @return [CGPoint]
|
249
282
|
*/
|
250
283
|
static
|
251
284
|
VALUE
|
252
|
-
rb_mouse_click_up(int argc, VALUE
|
285
|
+
rb_mouse_click_up(const int argc, VALUE* const argv, UNUSED const VALUE self)
|
253
286
|
{
|
254
|
-
|
255
|
-
{
|
287
|
+
switch (argc) {
|
256
288
|
case 0:
|
257
|
-
|
258
|
-
|
289
|
+
mouse_click_up();
|
290
|
+
break;
|
259
291
|
case 1:
|
260
292
|
default:
|
261
|
-
|
293
|
+
mouse_click_up2(rb_mouse_unwrap_point(argv[0]));
|
262
294
|
}
|
263
295
|
|
264
|
-
|
296
|
+
return CURRENT_POSITION;
|
265
297
|
}
|
266
298
|
|
267
299
|
/*
|
268
300
|
* Generate a regular click event (both up and down events)
|
269
301
|
*
|
270
302
|
* You can optionally specify a point to click; the mouse cursor will
|
271
|
-
* instantly jump to the given point
|
272
|
-
*
|
273
|
-
*
|
274
|
-
* @
|
303
|
+
* instantly jump to the given point; otherwise the click event happens
|
304
|
+
* at the current cursor position.
|
305
|
+
*
|
306
|
+
* @overload click()
|
307
|
+
* @return [CGPoint]
|
308
|
+
* @overload click()
|
309
|
+
* @param point [CGPoint]
|
310
|
+
* @return [CGPoint]
|
275
311
|
*/
|
276
312
|
static
|
277
313
|
VALUE
|
278
|
-
rb_mouse_click(int argc, VALUE
|
314
|
+
rb_mouse_click(const int argc, VALUE* const argv, UNUSED const VALUE self)
|
279
315
|
{
|
280
|
-
|
281
|
-
{
|
316
|
+
switch (argc) {
|
282
317
|
case 0:
|
283
|
-
|
284
|
-
|
318
|
+
mouse_click();
|
319
|
+
break;
|
285
320
|
case 1:
|
286
321
|
default:
|
287
|
-
|
322
|
+
mouse_click2(rb_mouse_unwrap_point(argv[0]));
|
288
323
|
}
|
289
324
|
|
290
|
-
|
325
|
+
return CURRENT_POSITION;
|
291
326
|
}
|
292
327
|
|
293
328
|
/*
|
@@ -298,26 +333,31 @@ rb_mouse_click(int argc, VALUE *argv, VALUE self)
|
|
298
333
|
* events.
|
299
334
|
*
|
300
335
|
* You can optionally specify a point to click; the mouse cursor will
|
301
|
-
* instantly jump to the given point
|
302
|
-
*
|
303
|
-
*
|
304
|
-
* @
|
336
|
+
* instantly jump to the given point; otherwise the click event happens
|
337
|
+
* at the current cursor position.
|
338
|
+
*
|
339
|
+
* @overload secondary_click_down()
|
340
|
+
* @return [CGPoint]
|
341
|
+
* @overload secondary_click_down(point)
|
342
|
+
* @param point [CGPoint]
|
343
|
+
* @return [CGPoint]
|
305
344
|
*/
|
306
345
|
static
|
307
346
|
VALUE
|
308
|
-
rb_mouse_secondary_click_down(int argc,
|
347
|
+
rb_mouse_secondary_click_down(const int argc,
|
348
|
+
VALUE* const argv,
|
349
|
+
UNUSED const VALUE self)
|
309
350
|
{
|
310
|
-
|
311
|
-
{
|
351
|
+
switch (argc) {
|
312
352
|
case 0:
|
313
|
-
|
314
|
-
|
353
|
+
mouse_secondary_click_down();
|
354
|
+
break;
|
315
355
|
case 1:
|
316
356
|
default:
|
317
|
-
|
357
|
+
mouse_secondary_click_down2(rb_mouse_unwrap_point(argv[0]));
|
318
358
|
}
|
319
359
|
|
320
|
-
|
360
|
+
return CURRENT_POSITION;
|
321
361
|
}
|
322
362
|
|
323
363
|
/*
|
@@ -327,26 +367,31 @@ rb_mouse_secondary_click_down(int argc, VALUE* argv, VALUE self)
|
|
327
367
|
* you want to inject some behaviour between the down and up click events.
|
328
368
|
*
|
329
369
|
* You can optionally specify a point to click; the mouse cursor will
|
330
|
-
* instantly jump to the given point
|
331
|
-
*
|
332
|
-
*
|
333
|
-
* @
|
370
|
+
* instantly jump to the given point; otherwise the click event happens
|
371
|
+
* at the current cursor position.
|
372
|
+
*
|
373
|
+
* @overload secondary_click_up()
|
374
|
+
* @return [CGPoint]
|
375
|
+
* @overload secondary_click_up(point)
|
376
|
+
* @param point [CGPoint]
|
377
|
+
* @return [CGPoint]
|
334
378
|
*/
|
335
379
|
static
|
336
380
|
VALUE
|
337
|
-
rb_mouse_secondary_click_up(int argc,
|
381
|
+
rb_mouse_secondary_click_up(const int argc,
|
382
|
+
VALUE* const argv,
|
383
|
+
UNUSED const VALUE self)
|
338
384
|
{
|
339
|
-
|
340
|
-
{
|
385
|
+
switch (argc) {
|
341
386
|
case 0:
|
342
|
-
|
343
|
-
|
387
|
+
mouse_secondary_click_up();
|
388
|
+
break;
|
344
389
|
case 1:
|
345
390
|
default:
|
346
|
-
|
391
|
+
mouse_secondary_click_up2(rb_mouse_unwrap_point(argv[0]));
|
347
392
|
}
|
348
393
|
|
349
|
-
|
394
|
+
return CURRENT_POSITION;
|
350
395
|
}
|
351
396
|
|
352
397
|
/*
|
@@ -355,26 +400,31 @@ rb_mouse_secondary_click_up(int argc, VALUE* argv, VALUE self)
|
|
355
400
|
* Secondary click is often referred to as "right click".
|
356
401
|
*
|
357
402
|
* You can optionally specify a point to click; the mouse cursor will
|
358
|
-
* instantly jump to the given point
|
359
|
-
*
|
360
|
-
*
|
361
|
-
* @
|
403
|
+
* instantly jump to the given point; otherwise the click event happens
|
404
|
+
* at the current cursor position.
|
405
|
+
*
|
406
|
+
* @overload secondary_click()
|
407
|
+
* @return [CGPoint]
|
408
|
+
* @overload secondary_click(point)
|
409
|
+
* @param point [CGPoint]
|
410
|
+
* @return [CGPoint]
|
362
411
|
*/
|
363
412
|
static
|
364
413
|
VALUE
|
365
|
-
rb_mouse_secondary_click(int argc,
|
414
|
+
rb_mouse_secondary_click(const int argc,
|
415
|
+
VALUE* const argv,
|
416
|
+
UNUSED const VALUE self)
|
366
417
|
{
|
367
|
-
|
368
|
-
{
|
418
|
+
switch (argc) {
|
369
419
|
case 0:
|
370
|
-
|
371
|
-
|
420
|
+
mouse_secondary_click();
|
421
|
+
break;
|
372
422
|
case 1:
|
373
423
|
default:
|
374
|
-
|
424
|
+
mouse_secondary_click2(rb_mouse_unwrap_point(argv[0]));
|
375
425
|
}
|
376
426
|
|
377
|
-
|
427
|
+
return CURRENT_POSITION;
|
378
428
|
}
|
379
429
|
|
380
430
|
/*
|
@@ -385,31 +435,37 @@ rb_mouse_secondary_click(int argc, VALUE *argv, VALUE self)
|
|
385
435
|
* events.
|
386
436
|
*
|
387
437
|
* You can optionally specify a point to click; the mouse cursor will
|
388
|
-
* instantly jump to the given point
|
389
|
-
*
|
390
|
-
*
|
391
|
-
* @
|
438
|
+
* instantly jump to the given point; otherwise the click event happens
|
439
|
+
* at the current cursor position.
|
440
|
+
*
|
441
|
+
* @overload arbitrary_click_down()
|
442
|
+
* @return [CGPoint]
|
443
|
+
* @overload arbitrary_click_down(point)
|
444
|
+
* @param point [CGPoint]
|
445
|
+
* @return [CGPoint]
|
392
446
|
*/
|
393
447
|
static
|
394
448
|
VALUE
|
395
|
-
rb_mouse_arbitrary_click_down(int argc,
|
449
|
+
rb_mouse_arbitrary_click_down(const int argc,
|
450
|
+
VALUE* const argv,
|
451
|
+
UNUSED const VALUE self)
|
396
452
|
{
|
397
|
-
|
398
|
-
|
453
|
+
if (argc == 0)
|
454
|
+
rb_raise(rb_eArgError,
|
455
|
+
"arbitrary_click_down requires at least one arg");
|
399
456
|
|
400
|
-
|
457
|
+
const uint_t button = NUM2UINT(argv[0]);
|
401
458
|
|
402
|
-
|
403
|
-
{
|
459
|
+
switch (argc) {
|
404
460
|
case 1:
|
405
|
-
|
406
|
-
|
461
|
+
mouse_arbitrary_click_down(button);
|
462
|
+
break;
|
407
463
|
case 2:
|
408
464
|
default:
|
409
|
-
|
465
|
+
mouse_arbitrary_click_down2(button, rb_mouse_unwrap_point(argv[1]));
|
410
466
|
}
|
411
467
|
|
412
|
-
|
468
|
+
return CURRENT_POSITION;
|
413
469
|
}
|
414
470
|
|
415
471
|
/*
|
@@ -419,31 +475,37 @@ rb_mouse_arbitrary_click_down(int argc, VALUE* argv, VALUE self)
|
|
419
475
|
* you want to inject some behaviour between the down and up click events.
|
420
476
|
*
|
421
477
|
* You can optionally specify a point to click; the mouse cursor will
|
422
|
-
* instantly jump to the given point
|
423
|
-
*
|
424
|
-
*
|
425
|
-
* @
|
478
|
+
* instantly jump to the given point; otherwise the click event happens
|
479
|
+
* at the current cursor position.
|
480
|
+
*
|
481
|
+
* @overload arbitrary_click_up()
|
482
|
+
* @return [CGPoint]
|
483
|
+
* @overload arbitrary_click_up(point)
|
484
|
+
* @param point [CGPoint]
|
485
|
+
* @return [CGPoint]
|
426
486
|
*/
|
427
487
|
static
|
428
488
|
VALUE
|
429
|
-
rb_mouse_arbitrary_click_up(int argc,
|
489
|
+
rb_mouse_arbitrary_click_up(const int argc,
|
490
|
+
VALUE* const argv,
|
491
|
+
UNUSED const VALUE self)
|
430
492
|
{
|
431
|
-
|
432
|
-
|
493
|
+
if (argc == 0)
|
494
|
+
rb_raise(rb_eArgError,
|
495
|
+
"arbitrary_click_up requires at least one arg");
|
433
496
|
|
434
|
-
|
497
|
+
const uint_t button = NUM2UINT(argv[0]);
|
435
498
|
|
436
|
-
|
437
|
-
{
|
499
|
+
switch (argc) {
|
438
500
|
case 1:
|
439
|
-
|
440
|
-
|
501
|
+
mouse_arbitrary_click_up(button);
|
502
|
+
break;
|
441
503
|
case 2:
|
442
504
|
default:
|
443
|
-
|
505
|
+
mouse_arbitrary_click_up2(button, rb_mouse_unwrap_point(argv[1]));
|
444
506
|
}
|
445
507
|
|
446
|
-
|
508
|
+
return CURRENT_POSITION;
|
447
509
|
}
|
448
510
|
|
449
511
|
/*
|
@@ -461,34 +523,40 @@ rb_mouse_arbitrary_click_up(int argc, VALUE* argv, VALUE self)
|
|
461
523
|
* documentation for the most up to date list.
|
462
524
|
*
|
463
525
|
* You can optionally specify a point to click; the mouse cursor will
|
464
|
-
* instantly jump to the given point
|
465
|
-
*
|
466
|
-
*
|
467
|
-
* @
|
468
|
-
*
|
526
|
+
* instantly jump to the given point; otherwise the click event happens
|
527
|
+
* at the current cursor position.
|
528
|
+
*
|
529
|
+
* @overload arbitrary_click(button)
|
530
|
+
* @param button [Number,#to_i]
|
531
|
+
* @return [CGPoint]
|
532
|
+
* @overload arbitrary_click(button, point)
|
533
|
+
* @param button [Number,#to_i]
|
534
|
+
* @param point [CGPoint]
|
535
|
+
* @return [CGPoint]
|
469
536
|
*/
|
470
537
|
static
|
471
538
|
VALUE
|
472
|
-
rb_mouse_arbitrary_click(int argc,
|
539
|
+
rb_mouse_arbitrary_click(const int argc,
|
540
|
+
VALUE* const argv,
|
541
|
+
UNUSED const VALUE self)
|
473
542
|
{
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
543
|
+
if (argc == 0) {
|
544
|
+
rb_raise(rb_eArgError, "arbitrary_click requires at least one arg");
|
545
|
+
return Qnil;
|
546
|
+
}
|
478
547
|
|
479
|
-
|
548
|
+
const uint_t button = NUM2UINT(argv[0]);
|
480
549
|
|
481
|
-
|
482
|
-
{
|
550
|
+
switch (argc) {
|
483
551
|
case 1:
|
484
|
-
|
485
|
-
|
552
|
+
mouse_arbitrary_click(button);
|
553
|
+
break;
|
486
554
|
case 2:
|
487
555
|
default:
|
488
|
-
|
556
|
+
mouse_arbitrary_click2(button, rb_mouse_unwrap_point(argv[1]));
|
489
557
|
}
|
490
558
|
|
491
|
-
|
559
|
+
return CURRENT_POSITION;
|
492
560
|
}
|
493
561
|
|
494
562
|
/*
|
@@ -497,26 +565,31 @@ rb_mouse_arbitrary_click(int argc, VALUE *argv, VALUE self)
|
|
497
565
|
* It doesn't matter if you don't have a middle mouse button.
|
498
566
|
*
|
499
567
|
* You can optionally specify a point to click; the mouse cursor will
|
500
|
-
* instantly jump to the given point
|
501
|
-
*
|
502
|
-
*
|
503
|
-
* @
|
568
|
+
* instantly jump to the given point; otherwise the click event happens
|
569
|
+
* at the current cursor position.
|
570
|
+
*
|
571
|
+
* @overload middle_click()
|
572
|
+
* @return [CGPoint]
|
573
|
+
* @overload middle_click(point)
|
574
|
+
* @param point [CGPoint]
|
575
|
+
* @return [CGPoint]
|
504
576
|
*/
|
505
577
|
static
|
506
578
|
VALUE
|
507
|
-
rb_mouse_middle_click(int argc,
|
579
|
+
rb_mouse_middle_click(const int argc,
|
580
|
+
VALUE* const argv,
|
581
|
+
UNUSED const VALUE self)
|
508
582
|
{
|
509
|
-
|
510
|
-
{
|
583
|
+
switch (argc) {
|
511
584
|
case 0:
|
512
|
-
|
513
|
-
|
585
|
+
mouse_middle_click();
|
586
|
+
break;
|
514
587
|
case 1:
|
515
588
|
default:
|
516
|
-
|
589
|
+
mouse_middle_click2(rb_mouse_unwrap_point(argv[0]));
|
517
590
|
}
|
518
591
|
|
519
|
-
|
592
|
+
return CURRENT_POSITION;
|
520
593
|
}
|
521
594
|
|
522
595
|
/*
|
@@ -526,36 +599,42 @@ rb_mouse_middle_click(int argc, VALUE *argv, VALUE self)
|
|
526
599
|
* a single event with the given number of clicks.
|
527
600
|
*
|
528
601
|
* You can optionally specify a point to click; the mouse cursor will
|
529
|
-
* instantly jump to the given point
|
530
|
-
*
|
531
|
-
*
|
532
|
-
* @
|
533
|
-
*
|
602
|
+
* instantly jump to the given point; otherwise the click event happens
|
603
|
+
* at the current cursor position.
|
604
|
+
*
|
605
|
+
* @overload multi_click(num_clicks)
|
606
|
+
* @param num_clicks [Number,#to_i]
|
607
|
+
* @return [CGPoint]
|
608
|
+
* @overload multi_click(num_clicks, point)
|
609
|
+
* @param num_clicks [Number,#to_i]
|
610
|
+
* @param point [CGPoint]
|
611
|
+
* @return [CGPoint]
|
534
612
|
*/
|
535
613
|
static
|
536
614
|
VALUE
|
537
|
-
rb_mouse_multi_click(int argc,
|
615
|
+
rb_mouse_multi_click(const int argc,
|
616
|
+
VALUE* const argv,
|
617
|
+
UNUSED const VALUE self)
|
538
618
|
{
|
539
619
|
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
620
|
+
if (argc == 0) {
|
621
|
+
rb_raise(rb_eArgError, "multi_click requires at least one arg");
|
622
|
+
return Qnil;
|
623
|
+
}
|
544
624
|
|
545
|
-
|
546
|
-
|
625
|
+
// TODO: there has got to be a more idiomatic way to do this coercion
|
626
|
+
const size_t num_clicks = NUM2SIZET(argv[0]);
|
547
627
|
|
548
|
-
|
549
|
-
{
|
628
|
+
switch (argc) {
|
550
629
|
case 1:
|
551
|
-
|
552
|
-
|
630
|
+
mouse_multi_click(num_clicks);
|
631
|
+
break;
|
553
632
|
case 2:
|
554
633
|
default:
|
555
|
-
|
634
|
+
mouse_multi_click2(num_clicks, rb_mouse_unwrap_point(argv[1]));
|
556
635
|
}
|
557
636
|
|
558
|
-
|
637
|
+
return CURRENT_POSITION;
|
559
638
|
}
|
560
639
|
|
561
640
|
/*
|
@@ -566,26 +645,31 @@ rb_mouse_multi_click(int argc, VALUE *argv, VALUE self)
|
|
566
645
|
* how a human would have to generate a double click event.
|
567
646
|
*
|
568
647
|
* You can optionally specify a point to click; the mouse cursor will
|
569
|
-
* instantly jump to the given point
|
570
|
-
*
|
571
|
-
*
|
572
|
-
* @
|
648
|
+
* instantly jump to the given point; otherwise the click event happens
|
649
|
+
* at the current cursor position.
|
650
|
+
*
|
651
|
+
* @overload double_click()
|
652
|
+
* @return [CGPoint]
|
653
|
+
* @overload double_click(point)
|
654
|
+
* @param point [CGPoint]
|
655
|
+
* @return [CGPoint]
|
573
656
|
*/
|
574
657
|
static
|
575
658
|
VALUE
|
576
|
-
rb_mouse_double_click(int argc,
|
659
|
+
rb_mouse_double_click(const int argc,
|
660
|
+
VALUE* const argv,
|
661
|
+
UNUSED const VALUE self)
|
577
662
|
{
|
578
|
-
|
579
|
-
{
|
663
|
+
switch (argc) {
|
580
664
|
case 0:
|
581
|
-
|
582
|
-
|
665
|
+
mouse_double_click();
|
666
|
+
break;
|
583
667
|
case 1:
|
584
668
|
default:
|
585
|
-
|
669
|
+
mouse_double_click2(rb_mouse_unwrap_point(argv[0]));
|
586
670
|
}
|
587
671
|
|
588
|
-
|
672
|
+
return CURRENT_POSITION;
|
589
673
|
}
|
590
674
|
|
591
675
|
/*
|
@@ -597,26 +681,31 @@ rb_mouse_double_click(int argc, VALUE *argv, VALUE self)
|
|
597
681
|
* triple click event.
|
598
682
|
*
|
599
683
|
* You can optionally specify a point to click; the mouse cursor will
|
600
|
-
* instantly jump to the given point
|
601
|
-
*
|
602
|
-
*
|
603
|
-
* @
|
684
|
+
* instantly jump to the given point; otherwise the click event happens
|
685
|
+
* at the current cursor position.
|
686
|
+
*
|
687
|
+
* @overload triple_click()
|
688
|
+
* @return [CGPoint]
|
689
|
+
* @overload triple_click(point)
|
690
|
+
* @param point [CGPoint]
|
691
|
+
* @return [CGPoint]
|
604
692
|
*/
|
605
693
|
static
|
606
694
|
VALUE
|
607
|
-
rb_mouse_triple_click(int argc,
|
695
|
+
rb_mouse_triple_click(const int argc,
|
696
|
+
VALUE* const argv,
|
697
|
+
UNUSED const VALUE self)
|
608
698
|
{
|
609
|
-
|
610
|
-
{
|
699
|
+
switch (argc) {
|
611
700
|
case 0:
|
612
|
-
|
613
|
-
|
701
|
+
mouse_triple_click();
|
702
|
+
break;
|
614
703
|
case 1:
|
615
704
|
default:
|
616
|
-
|
705
|
+
mouse_triple_click2(rb_mouse_unwrap_point(argv[0]));
|
617
706
|
}
|
618
707
|
|
619
|
-
|
708
|
+
return CURRENT_POSITION;
|
620
709
|
}
|
621
710
|
|
622
711
|
|
@@ -625,27 +714,32 @@ rb_mouse_triple_click(int argc, VALUE *argv, VALUE self)
|
|
625
714
|
/*
|
626
715
|
* Perform a smart magnify (double tap on trackpad)
|
627
716
|
*
|
628
|
-
* You can optionally specify
|
629
|
-
* the
|
630
|
-
*
|
631
|
-
*
|
632
|
-
* @
|
717
|
+
* You can optionally specify a point to click; the mouse cursor will
|
718
|
+
* instantly jump to the given point; otherwise the click event happens
|
719
|
+
* at the current cursor position.
|
720
|
+
*
|
721
|
+
* @overload smart_magnify()
|
722
|
+
* @return [CGPoint]
|
723
|
+
* @overload smart_magnify(point)
|
724
|
+
* @param point [CGPoint]
|
725
|
+
* @return [CGPoint]
|
633
726
|
*/
|
634
727
|
static
|
635
728
|
VALUE
|
636
|
-
rb_mouse_smart_magnify(int argc,
|
729
|
+
rb_mouse_smart_magnify(const int argc,
|
730
|
+
VALUE* const argv,
|
731
|
+
UNUSED const VALUE self)
|
637
732
|
{
|
638
|
-
|
639
|
-
{
|
733
|
+
switch (argc) {
|
640
734
|
case 0:
|
641
|
-
|
642
|
-
|
735
|
+
mouse_smart_magnify();
|
736
|
+
break;
|
643
737
|
case 1:
|
644
738
|
default:
|
645
|
-
|
739
|
+
mouse_smart_magnify2(rb_mouse_unwrap_point(argv[0]));
|
646
740
|
}
|
647
741
|
|
648
|
-
|
742
|
+
return CURRENT_POSITION;
|
649
743
|
}
|
650
744
|
|
651
745
|
/*
|
@@ -653,52 +747,55 @@ rb_mouse_smart_magnify(int argc, VALUE* argv, VALUE self)
|
|
653
747
|
*
|
654
748
|
* You can optionally specify a point on screen for the mouse
|
655
749
|
* pointer to be moved to before the gesture begins. The movement will
|
656
|
-
* be instantaneous
|
657
|
-
*
|
658
|
-
*
|
659
|
-
*
|
660
|
-
*
|
661
|
-
*
|
662
|
-
* @
|
663
|
-
*
|
750
|
+
* be instantaneous; otherwise the click event happens
|
751
|
+
* at the current cursor position.
|
752
|
+
*
|
753
|
+
* You can also optionally specify the duration of the swipe event;
|
754
|
+
* the default `duration` is 0.2 seconds.
|
755
|
+
*
|
756
|
+
* @overload swipe(direction)
|
757
|
+
* @param direction [Symbol]
|
758
|
+
* @return [CGPoint]
|
759
|
+
* @overload swipe(direction, point)
|
760
|
+
* @param direction [Symbol]
|
761
|
+
* @param point [CGPoint]
|
762
|
+
* @return [CGPoint]
|
763
|
+
* @overload swipe(direction, point, duration)
|
764
|
+
* @param direction [Symbol]
|
765
|
+
* @param point [CGPoint]
|
766
|
+
* @param duration [Float]
|
767
|
+
* @return [CGPoint]
|
664
768
|
*/
|
665
769
|
static
|
666
770
|
VALUE
|
667
|
-
rb_mouse_swipe(int argc, VALUE* argv, VALUE self)
|
771
|
+
rb_mouse_swipe(const int argc, VALUE* const argv, UNUSED const VALUE self)
|
668
772
|
{
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
rb_id2name(SYM2ID(direction_input))
|
687
|
-
);
|
688
|
-
|
689
|
-
if (argc == 1) {
|
690
|
-
mouse_swipe(direction);
|
691
|
-
return CURRENT_POSITION;
|
692
|
-
}
|
773
|
+
if (!argc)
|
774
|
+
rb_raise(rb_eArgError, "wrong number of arguments (0 for 1+)");
|
775
|
+
|
776
|
+
const VALUE direction_input = argv[0];
|
777
|
+
CGSwipeDirection direction;
|
778
|
+
if (direction_input == sym_up)
|
779
|
+
direction = kCGSwipeDirectionUp;
|
780
|
+
else if (direction_input == sym_down)
|
781
|
+
direction = kCGSwipeDirectionDown;
|
782
|
+
else if (direction_input == sym_left)
|
783
|
+
direction = kCGSwipeDirectionLeft;
|
784
|
+
else if (direction_input == sym_right)
|
785
|
+
direction = kCGSwipeDirectionRight;
|
786
|
+
else
|
787
|
+
rb_raise(rb_eArgError,
|
788
|
+
"invalid swipe direction `%s'",
|
789
|
+
rb_id2name(SYM2ID(direction_input)));
|
693
790
|
|
694
|
-
|
791
|
+
if (argc == 1) {
|
792
|
+
mouse_swipe(direction);
|
793
|
+
return CURRENT_POSITION;
|
794
|
+
}
|
695
795
|
|
696
|
-
|
796
|
+
const CGPoint point = rb_mouse_unwrap_point(argv[1]);
|
697
797
|
mouse_swipe2(direction, point);
|
698
|
-
|
699
|
-
mouse_swipe3(direction, point, NUM2DBL(argv[1]));
|
700
|
-
|
701
|
-
return CURRENT_POSITION;
|
798
|
+
return CURRENT_POSITION;
|
702
799
|
}
|
703
800
|
|
704
801
|
/*
|
@@ -714,61 +811,72 @@ rb_mouse_swipe(int argc, VALUE* argv, VALUE self)
|
|
714
811
|
*
|
715
812
|
* Magnification is a relative magnification setting. A zoom value of
|
716
813
|
* `1.0` means `1.0` more than the current zoom level. `2.0` would be
|
717
|
-
* `2.0` levels higher than the current zoom.
|
814
|
+
* `2.0` levels higher than the current zoom. Default is `1.0`.
|
718
815
|
*
|
719
816
|
* You can also optionally specify a point on screen for the mouse
|
720
817
|
* pointer to be moved to before the gesture begins. The movement will
|
721
|
-
* be instantaneous.
|
722
|
-
*
|
723
|
-
* An animation duration can also be specified.
|
724
|
-
*
|
725
|
-
* @
|
726
|
-
*
|
727
|
-
*
|
728
|
-
* @
|
729
|
-
*
|
818
|
+
* be instantaneous. Default `point` is {#current_position}.
|
819
|
+
*
|
820
|
+
* An animation duration can also be specified. The default is 0.2 seconds.
|
821
|
+
*
|
822
|
+
* @overload pinch(direction)
|
823
|
+
* @param direction [Symbol]
|
824
|
+
* @return [CGPoint]
|
825
|
+
* @overload pinch(direction, magnification)
|
826
|
+
* @param direction [Symbol]
|
827
|
+
* @param magnification [Float]
|
828
|
+
* @return [CGPoint]
|
829
|
+
* @overload pinch(direction, magnification, point)
|
830
|
+
* @param direction [Symbol]
|
831
|
+
* @param magnification [Float]
|
832
|
+
* @param point [CGPoint]
|
833
|
+
* @return [CGPoint]
|
834
|
+
* @overload pinch(direction, magnification, point, duration)
|
835
|
+
* @param direction [Symbol]
|
836
|
+
* @param magnification [Float]
|
837
|
+
* @param point [CGPoint]
|
838
|
+
* @param duration [Float]
|
839
|
+
* @return [CGPoint]
|
730
840
|
*/
|
731
841
|
static
|
732
842
|
VALUE
|
733
|
-
rb_mouse_pinch(int argc, VALUE* argv, VALUE self)
|
843
|
+
rb_mouse_pinch(const int argc, VALUE* const argv, UNUSED const VALUE self)
|
734
844
|
{
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
VALUE input_direction = argv[0];
|
739
|
-
CGPinchDirection direction = kCGPinchNone;
|
740
|
-
|
741
|
-
if (input_direction == sym_expand || input_direction == sym_zoom)
|
742
|
-
direction = kCGPinchExpand;
|
743
|
-
else if (input_direction == sym_contract || input_direction == sym_unzoom)
|
744
|
-
direction = kCGPinchContract;
|
745
|
-
else
|
746
|
-
rb_raise(
|
747
|
-
rb_eArgError,
|
748
|
-
"invalid pinch direction `%s'",
|
749
|
-
rb_id2name(SYM2ID(input_direction))
|
750
|
-
);
|
751
|
-
|
752
|
-
if (argc == 1) {
|
753
|
-
mouse_pinch(direction);
|
754
|
-
return CURRENT_POSITION;
|
755
|
-
}
|
845
|
+
if (!argc)
|
846
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1+)", argc);
|
756
847
|
|
757
|
-
|
758
|
-
|
759
|
-
mouse_pinch2(direction, magnification);
|
760
|
-
return CURRENT_POSITION;
|
761
|
-
}
|
848
|
+
const VALUE input_direction = argv[0];
|
849
|
+
CGPinchDirection direction = kCGPinchNone;
|
762
850
|
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
851
|
+
if (input_direction == sym_expand || input_direction == sym_zoom)
|
852
|
+
direction = kCGPinchExpand;
|
853
|
+
else if (input_direction == sym_contract || input_direction == sym_unzoom)
|
854
|
+
direction = kCGPinchContract;
|
855
|
+
else
|
856
|
+
rb_raise(rb_eArgError,
|
857
|
+
"invalid pinch direction `%s'",
|
858
|
+
rb_id2name(SYM2ID(input_direction)));
|
859
|
+
|
860
|
+
if (argc == 1) {
|
861
|
+
mouse_pinch(direction);
|
862
|
+
return CURRENT_POSITION;
|
863
|
+
}
|
768
864
|
|
769
|
-
|
770
|
-
|
771
|
-
|
865
|
+
const double magnification = NUM2DBL(argv[1]);
|
866
|
+
if (argc == 2) {
|
867
|
+
mouse_pinch2(direction, magnification);
|
868
|
+
return CURRENT_POSITION;
|
869
|
+
}
|
870
|
+
|
871
|
+
const CGPoint point = rb_mouse_unwrap_point(argv[2]);
|
872
|
+
if (argc == 3) {
|
873
|
+
mouse_pinch3(direction, magnification, point);
|
874
|
+
return CURRENT_POSITION;
|
875
|
+
}
|
876
|
+
|
877
|
+
const double duration = NUM2DBL(argv[3]);
|
878
|
+
mouse_pinch4(direction, magnification, point, duration);
|
879
|
+
return CURRENT_POSITION;
|
772
880
|
}
|
773
881
|
|
774
882
|
/*
|
@@ -786,142 +894,150 @@ rb_mouse_pinch(int argc, VALUE* argv, VALUE self)
|
|
786
894
|
*
|
787
895
|
* You can also optionally specify a point on screen for the mouse
|
788
896
|
* pointer to be moved to before the gesture begins. The movement will
|
789
|
-
* be instantaneous.
|
790
|
-
*
|
791
|
-
* An animation duration can also be specified.
|
792
|
-
*
|
793
|
-
* @
|
794
|
-
*
|
795
|
-
*
|
796
|
-
*
|
797
|
-
* @
|
897
|
+
* be instantaneous. Default `point` is {#current_position}.
|
898
|
+
*
|
899
|
+
* An animation duration can also be specified. The default is 0.2 seconds.
|
900
|
+
*
|
901
|
+
* @overload rotate(direction, angle)
|
902
|
+
* @param direction [Symbol]
|
903
|
+
* @param angle [Float]
|
904
|
+
* @return [CGPoint]
|
905
|
+
* @overload rotate(direction, angle, point)
|
906
|
+
* @param direction [Symbol]
|
907
|
+
* @param angle [Float]
|
908
|
+
* @param point [CGPoint]
|
909
|
+
* @return [CGPoint]
|
910
|
+
* @overload rotate(direction, angle, point, duration)
|
911
|
+
* @param direction [Symbol]
|
912
|
+
* @param angle [Float]
|
913
|
+
* @param point [CGPoint]
|
914
|
+
* @param duration [Float]
|
915
|
+
* @return [CGPoint]
|
798
916
|
*/
|
799
917
|
static
|
800
918
|
VALUE
|
801
|
-
rb_mouse_rotate(int argc, VALUE* argv, VALUE self)
|
919
|
+
rb_mouse_rotate(const int argc, VALUE* const argv, UNUSED const VALUE self)
|
802
920
|
{
|
803
|
-
|
804
|
-
|
805
|
-
|
806
|
-
CGRotateDirection direction = kCGRotateNone;
|
807
|
-
VALUE input_dir = argv[0];
|
808
|
-
if (
|
809
|
-
input_dir == sym_cw ||
|
810
|
-
input_dir == sym_clockwise ||
|
811
|
-
input_dir == sym_clock_wise
|
812
|
-
)
|
813
|
-
direction = kCGRotateClockwise;
|
814
|
-
else if (
|
815
|
-
input_dir == sym_ccw ||
|
816
|
-
input_dir == sym_counter_clockwise ||
|
817
|
-
input_dir == sym_counter_clock_wise
|
818
|
-
)
|
819
|
-
direction = kCGRotateCounterClockwise;
|
820
|
-
else
|
821
|
-
rb_raise(
|
822
|
-
rb_eArgError,
|
823
|
-
"invalid rotation direction `%s'",
|
824
|
-
rb_id2name(SYM2ID(input_dir))
|
825
|
-
);
|
826
|
-
|
827
|
-
double angle = NUM2DBL(argv[1]);
|
828
|
-
|
829
|
-
if (argc == 2) {
|
830
|
-
mouse_rotate(direction, angle);
|
831
|
-
return CURRENT_POSITION;
|
832
|
-
}
|
921
|
+
if (argc < 2)
|
922
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 2+)", argc);
|
833
923
|
|
834
|
-
CGPoint point = rb_mouse_unwrap_point(argv[2]);
|
835
|
-
if (argc == 3) {
|
836
|
-
mouse_rotate2(direction, angle, point);
|
837
|
-
return CURRENT_POSITION;
|
838
|
-
}
|
839
924
|
|
840
|
-
|
841
|
-
|
925
|
+
const VALUE input_dir = argv[0];
|
926
|
+
CGRotateDirection direction;
|
927
|
+
|
928
|
+
if (input_dir == sym_cw ||
|
929
|
+
input_dir == sym_clockwise ||
|
930
|
+
input_dir == sym_clock_wise)
|
931
|
+
direction = kCGRotateClockwise;
|
932
|
+
|
933
|
+
else if (input_dir == sym_ccw ||
|
934
|
+
input_dir == sym_counter_clockwise ||
|
935
|
+
input_dir == sym_counter_clock_wise)
|
936
|
+
direction = kCGRotateCounterClockwise;
|
937
|
+
else
|
938
|
+
rb_raise(rb_eArgError,
|
939
|
+
"invalid rotation direction `%s'",
|
940
|
+
rb_id2name(SYM2ID(input_dir)));
|
941
|
+
|
942
|
+
const double angle = NUM2DBL(argv[1]);
|
943
|
+
|
944
|
+
if (argc == 2) {
|
945
|
+
mouse_rotate(direction, angle);
|
946
|
+
return CURRENT_POSITION;
|
947
|
+
}
|
948
|
+
|
949
|
+
const CGPoint point = rb_mouse_unwrap_point(argv[2]);
|
950
|
+
if (argc == 3) {
|
951
|
+
mouse_rotate2(direction, angle, point);
|
952
|
+
return CURRENT_POSITION;
|
953
|
+
}
|
954
|
+
|
955
|
+
mouse_rotate3(direction, angle, point, NUM2DBL(argv[3]));
|
956
|
+
return CURRENT_POSITION;
|
842
957
|
}
|
843
958
|
|
844
959
|
/* @!endgroup */
|
845
960
|
|
846
961
|
|
962
|
+
void Init_mouse(void);
|
963
|
+
|
847
964
|
void
|
848
965
|
Init_mouse()
|
849
966
|
{
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
|
855
|
-
|
856
|
-
|
857
|
-
|
858
|
-
|
859
|
-
|
860
|
-
|
861
|
-
|
862
|
-
|
863
|
-
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
|
871
|
-
|
872
|
-
|
873
|
-
|
874
|
-
|
875
|
-
|
876
|
-
|
877
|
-
|
878
|
-
|
879
|
-
|
880
|
-
|
881
|
-
|
882
|
-
|
883
|
-
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
|
907
|
-
|
908
|
-
|
909
|
-
|
910
|
-
|
911
|
-
|
912
|
-
|
913
|
-
|
914
|
-
|
915
|
-
|
916
|
-
|
917
|
-
|
918
|
-
|
919
|
-
|
920
|
-
|
921
|
-
|
922
|
-
|
923
|
-
|
924
|
-
|
925
|
-
|
926
|
-
rb_define_alias(rb_mMouse, "two_finger_double_tap", "smart_magnify");
|
967
|
+
// on either supported Ruby, this should be defined by now
|
968
|
+
rb_cCGPoint = rb_const_get(rb_cObject, rb_intern("CGPoint"));
|
969
|
+
|
970
|
+
sel_x = rb_intern("x");
|
971
|
+
sel_y = rb_intern("y");
|
972
|
+
sel_to_point = rb_intern("to_point");
|
973
|
+
sel_new = rb_intern("new");
|
974
|
+
|
975
|
+
sym_pixel = ID2SYM(rb_intern("pixel"));
|
976
|
+
sym_line = ID2SYM(rb_intern("line"));
|
977
|
+
|
978
|
+
sym_up = ID2SYM(rb_intern("up"));
|
979
|
+
sym_down = ID2SYM(rb_intern("down"));
|
980
|
+
sym_left = ID2SYM(rb_intern("left"));
|
981
|
+
sym_right = ID2SYM(rb_intern("right"));
|
982
|
+
|
983
|
+
sym_zoom = ID2SYM(rb_intern("zoom"));
|
984
|
+
sym_unzoom = ID2SYM(rb_intern("unzoom"));
|
985
|
+
sym_expand = ID2SYM(rb_intern("expand"));
|
986
|
+
sym_contract = ID2SYM(rb_intern("contract"));
|
987
|
+
|
988
|
+
sym_cw = ID2SYM(rb_intern("cw"));
|
989
|
+
sym_clockwise = ID2SYM(rb_intern("clockwise"));
|
990
|
+
sym_clock_wise = ID2SYM(rb_intern("clock_wise"));
|
991
|
+
sym_ccw = ID2SYM(rb_intern("ccw"));
|
992
|
+
sym_counter_clockwise = ID2SYM(rb_intern("counter_clockwise"));
|
993
|
+
sym_counter_clock_wise = ID2SYM(rb_intern("counter_clock_wise"));
|
994
|
+
|
995
|
+
/*
|
996
|
+
* Document-module: Mouse
|
997
|
+
*
|
998
|
+
* A module with methods that "tap" into the system input methods.
|
999
|
+
* This is done by wrapping wrapping around the CoreGraphics event
|
1000
|
+
* taps API provided by OS X.
|
1001
|
+
*
|
1002
|
+
* The module provides a simple Ruby interface to performing mouse
|
1003
|
+
* interactions such as moving and clicking.
|
1004
|
+
*
|
1005
|
+
* This module can be used in a stand alone fashion or you can mix
|
1006
|
+
* it into another class.
|
1007
|
+
*
|
1008
|
+
* [Reference](http://developer.apple.com/library/mac/#documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html)
|
1009
|
+
*/
|
1010
|
+
rb_mMouse = rb_define_module("Mouse");
|
1011
|
+
|
1012
|
+
rb_extend_object(rb_mMouse, rb_mMouse);
|
1013
|
+
|
1014
|
+
rb_define_method(rb_mMouse, "current_position", rb_mouse_current_position, 0);
|
1015
|
+
rb_define_method(rb_mMouse, "move_to", rb_mouse_move_to, -1);
|
1016
|
+
rb_define_method(rb_mMouse, "drag_to", rb_mouse_drag_to, -1);
|
1017
|
+
rb_define_method(rb_mMouse, "scroll", rb_mouse_scroll, -1);
|
1018
|
+
rb_define_method(rb_mMouse, "horizontal_scroll", rb_mouse_horizontal_scroll, -1);
|
1019
|
+
rb_define_method(rb_mMouse, "click_down", rb_mouse_click_down, -1);
|
1020
|
+
rb_define_method(rb_mMouse, "click_up", rb_mouse_click_up, -1);
|
1021
|
+
rb_define_method(rb_mMouse, "click", rb_mouse_click, -1);
|
1022
|
+
rb_define_method(rb_mMouse, "secondary_click_down", rb_mouse_secondary_click_down, -1);
|
1023
|
+
rb_define_method(rb_mMouse, "secondary_click_up", rb_mouse_secondary_click_up, -1);
|
1024
|
+
rb_define_method(rb_mMouse, "secondary_click", rb_mouse_secondary_click, -1);
|
1025
|
+
rb_define_method(rb_mMouse, "middle_click", rb_mouse_middle_click, -1);
|
1026
|
+
rb_define_method(rb_mMouse, "arbitrary_click_down", rb_mouse_arbitrary_click_down, -1);
|
1027
|
+
rb_define_method(rb_mMouse, "arbitrary_click_up", rb_mouse_arbitrary_click_up, -1);
|
1028
|
+
rb_define_method(rb_mMouse, "arbitrary_click", rb_mouse_arbitrary_click, -1);
|
1029
|
+
rb_define_method(rb_mMouse, "multi_click", rb_mouse_multi_click, -1);
|
1030
|
+
rb_define_method(rb_mMouse, "double_click", rb_mouse_double_click, -1);
|
1031
|
+
rb_define_method(rb_mMouse, "triple_click", rb_mouse_triple_click, -1);
|
1032
|
+
|
1033
|
+
rb_define_method(rb_mMouse, "smart_magnify", rb_mouse_smart_magnify, -1);
|
1034
|
+
rb_define_method(rb_mMouse, "swipe", rb_mouse_swipe, -1);
|
1035
|
+
rb_define_method(rb_mMouse, "pinch", rb_mouse_pinch, -1);
|
1036
|
+
rb_define_method(rb_mMouse, "rotate", rb_mouse_rotate, -1);
|
1037
|
+
|
1038
|
+
rb_define_alias(rb_mMouse, "hscroll", "horizontal_scroll");
|
1039
|
+
rb_define_alias(rb_mMouse, "right_click_down", "secondary_click_down");
|
1040
|
+
rb_define_alias(rb_mMouse, "right_click_up", "secondary_click_up");
|
1041
|
+
rb_define_alias(rb_mMouse, "right_click", "secondary_click");
|
1042
|
+
rb_define_alias(rb_mMouse, "two_finger_double_tap", "smart_magnify");
|
927
1043
|
}
|