accessibility_core 0.1.2 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.yardopts +2 -0
- data/History.markdown +33 -0
- data/README.markdown +11 -0
- data/Rakefile +18 -49
- data/ext/accessibility/bridge/{ext/accessibility/bridge/bridge.c → bridge.c} +136 -56
- data/ext/accessibility/bridge/bridge.h +132 -0
- data/ext/accessibility/bridge/{ext/accessibility/bridge/extconf.rb → extconf.rb} +1 -1
- data/ext/accessibility/core/core.c +21 -3
- data/ext/accessibility/core/extconf.rb +7 -1
- data/ext/accessibility/extras/extconf.rb +28 -0
- data/ext/accessibility/extras/extras.c +842 -0
- data/ext/accessibility/extras/extras.h +1 -0
- data/ext/accessibility/highlighter/extconf.rb +9 -2
- data/ext/accessibility/highlighter/highlighter.c +291 -1
- data/{ext/accessibility/bridge/lib → lib}/accessibility/bridge.rb +3 -3
- data/{ext/accessibility/bridge/lib → lib}/accessibility/bridge/common.rb +0 -0
- data/{ext/accessibility/bridge/lib → lib}/accessibility/bridge/macruby.rb +17 -0
- data/{ext/accessibility/bridge/lib → lib}/accessibility/bridge/mri.rb +10 -7
- data/lib/accessibility/core.rb +1 -1
- data/lib/accessibility/core/macruby.rb +1 -1
- data/lib/accessibility/core/version.rb +1 -1
- data/lib/accessibility/extras.rb +5 -0
- data/lib/accessibility/extras/common.rb +19 -0
- data/lib/accessibility/highlighter.rb +8 -0
- data/lib/accessibility/highlighter/macruby.rb +85 -0
- data/test/helper.rb +18 -28
- metadata +33 -56
- data/ext/accessibility/bridge/lib/accessibility/bridge/version.rb +0 -6
- data/ext/accessibility/bridge/test/array_test.rb +0 -31
- data/ext/accessibility/bridge/test/boxed_test.rb +0 -23
- data/ext/accessibility/bridge/test/cfrange_test.rb +0 -21
- data/ext/accessibility/bridge/test/cgpoint_test.rb +0 -54
- data/ext/accessibility/bridge/test/cgrect_test.rb +0 -60
- data/ext/accessibility/bridge/test/cgsize_test.rb +0 -54
- data/ext/accessibility/bridge/test/helper.rb +0 -19
- data/ext/accessibility/bridge/test/nsstring_test.rb +0 -22
- data/ext/accessibility/bridge/test/nsurl_test.rb +0 -17
- data/ext/accessibility/bridge/test/object_test.rb +0 -19
- data/ext/accessibility/bridge/test/range_test.rb +0 -16
- data/ext/accessibility/bridge/test/string_test.rb +0 -35
- data/ext/accessibility/bridge/test/uri_test.rb +0 -15
- data/ext/accessibility/core/bridge.h +0 -1
@@ -0,0 +1 @@
|
|
1
|
+
void Init_extras();
|
@@ -1,11 +1,12 @@
|
|
1
1
|
require 'mkmf'
|
2
2
|
|
3
3
|
$CFLAGS << ' -std=c99 -Wall -Werror -pedantic -ObjC'
|
4
|
-
$LIBS << ' -framework CoreFoundation -framework Cocoa'
|
4
|
+
$LIBS << ' -framework CoreFoundation -framework ApplicationServices -framework Cocoa'
|
5
5
|
$LIBS << ' -framework CoreGraphics' unless `sw_vers -productVersion`.to_f == 10.7
|
6
6
|
|
7
7
|
if RUBY_ENGINE == 'macruby'
|
8
8
|
$CFLAGS << ' -fobjc-gc'
|
9
|
+
$CFLAGS.sub! /-Werror/, ''
|
9
10
|
else
|
10
11
|
unless RbConfig::CONFIG["CC"].match /clang/
|
11
12
|
clang = `which clang`.chomp
|
@@ -19,4 +20,10 @@ else
|
|
19
20
|
$CFLAGS << ' -DNOT_MACRUBY'
|
20
21
|
end
|
21
22
|
|
22
|
-
create_makefile 'accessibility/highlighter'
|
23
|
+
create_makefile 'accessibility/highlighter/highlighter'
|
24
|
+
|
25
|
+
# modify the bugger so we can depend on bridge.h properly
|
26
|
+
makefile = File.read 'Makefile'
|
27
|
+
makefile.gsub! '$(DLLIB): $(OBJS) Makefile', '$(DLLIB): $(OBJS) Makefile ../bridge/bridge.o ../extras/extras.o'
|
28
|
+
makefile.gsub! '$(Q) $(LDSHARED) -o $@', '$(Q) $(LDSHARED) -o $@ ../bridge/bridge.o ../extras/extras.o'
|
29
|
+
File.open('Makefile', 'w') { |f| f.write makefile }
|
@@ -1,7 +1,297 @@
|
|
1
1
|
#include "ruby.h"
|
2
|
+
#import <Cocoa/Cocoa.h>
|
3
|
+
#include "../bridge/bridge.h"
|
4
|
+
#include "../extras/extras.h"
|
5
|
+
|
6
|
+
|
7
|
+
#ifdef NOT_MACRUBY
|
8
|
+
|
9
|
+
static VALUE rb_cHighlighter;
|
10
|
+
static VALUE rb_cColor;
|
11
|
+
|
12
|
+
static ID ivar_color;
|
13
|
+
|
14
|
+
static VALUE color_key;
|
15
|
+
static VALUE colour_key;
|
16
|
+
static VALUE timeout_key;
|
17
|
+
|
18
|
+
|
19
|
+
static
|
20
|
+
VALUE
|
21
|
+
wrap_window(NSWindow* window)
|
22
|
+
{
|
23
|
+
return Data_Wrap_Struct(rb_cHighlighter, NULL, objc_finalizer, (void*)window);
|
24
|
+
}
|
25
|
+
|
26
|
+
static
|
27
|
+
NSWindow*
|
28
|
+
unwrap_window(VALUE window)
|
29
|
+
{
|
30
|
+
NSWindow* nswindow;
|
31
|
+
Data_Get_Struct(window, NSWindow, nswindow);
|
32
|
+
return nswindow;
|
33
|
+
}
|
34
|
+
|
35
|
+
static
|
36
|
+
VALUE
|
37
|
+
wrap_color(NSColor* color)
|
38
|
+
{
|
39
|
+
return Data_Wrap_Struct(rb_cColor, NULL, objc_finalizer, (void*)color);
|
40
|
+
}
|
41
|
+
|
42
|
+
static
|
43
|
+
NSColor*
|
44
|
+
unwrap_color(VALUE color)
|
45
|
+
{
|
46
|
+
NSColor* nscolor;
|
47
|
+
Data_Get_Struct(color, NSColor, nscolor);
|
48
|
+
return nscolor;
|
49
|
+
}
|
50
|
+
|
51
|
+
|
52
|
+
static
|
53
|
+
CGRect
|
54
|
+
flip(CGRect rect)
|
55
|
+
{
|
56
|
+
double screen_height = NSMaxY([[NSScreen mainScreen] frame]);
|
57
|
+
rect.origin.y = screen_height - NSMaxY(rect);
|
58
|
+
return rect;
|
59
|
+
}
|
60
|
+
|
61
|
+
static
|
62
|
+
VALUE
|
63
|
+
rb_highlighter_new(int argc, VALUE* argv, VALUE self)
|
64
|
+
{
|
65
|
+
if (!argc)
|
66
|
+
rb_raise(rb_eArgError, "wrong number of arguments (0 for 1+)");
|
67
|
+
|
68
|
+
CGRect bounds = unwrap_rect(coerce_to_rect(argv[0]));
|
69
|
+
bounds = flip(bounds); // we assume the rect is in the other co-ordinate system
|
70
|
+
|
71
|
+
NSWindow* window =
|
72
|
+
[[NSWindow alloc] initWithContentRect:bounds
|
73
|
+
styleMask:NSBorderlessWindowMask
|
74
|
+
backing:NSBackingStoreBuffered
|
75
|
+
defer:true];
|
76
|
+
|
77
|
+
NSColor* color = [NSColor magentaColor];
|
78
|
+
|
79
|
+
if (argc > 1) {
|
80
|
+
VALUE rb_color = rb_hash_lookup(argv[1], color_key);
|
81
|
+
if (rb_color == Qnil)
|
82
|
+
rb_color = rb_hash_lookup(argv[1], colour_key);
|
83
|
+
if (rb_color != Qnil)
|
84
|
+
color = unwrap_color(rb_color);
|
85
|
+
}
|
86
|
+
|
87
|
+
[window setOpaque:false];
|
88
|
+
[window setAlphaValue:0.20];
|
89
|
+
[window setLevel:NSStatusWindowLevel];
|
90
|
+
[window setBackgroundColor:color];
|
91
|
+
[window setIgnoresMouseEvents:true];
|
92
|
+
[window setFrame:bounds display:false];
|
93
|
+
[window makeKeyAndOrderFront:NSApp];
|
94
|
+
[window setReleasedWhenClosed:false];
|
95
|
+
|
96
|
+
if (argc > 1) {
|
97
|
+
VALUE rb_timeout = rb_hash_lookup(argv[1], timeout_key);
|
98
|
+
if (rb_timeout != Qnil) {
|
99
|
+
dispatch_time_t timeout = dispatch_time(
|
100
|
+
DISPATCH_TIME_NOW,
|
101
|
+
NUM2LL(rb_timeout) * NSEC_PER_SEC
|
102
|
+
);
|
103
|
+
dispatch_after(
|
104
|
+
timeout,
|
105
|
+
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
|
106
|
+
^(void) { [window close]; }
|
107
|
+
);
|
108
|
+
}
|
109
|
+
}
|
110
|
+
|
111
|
+
VALUE highlighter = wrap_window(window);
|
112
|
+
rb_ivar_set(highlighter, ivar_color, wrap_color(color));
|
113
|
+
return highlighter;
|
114
|
+
}
|
115
|
+
|
116
|
+
static
|
117
|
+
VALUE
|
118
|
+
rb_highlighter_stop(VALUE self)
|
119
|
+
{
|
120
|
+
[unwrap_window(self) close];
|
121
|
+
return self;
|
122
|
+
}
|
123
|
+
|
124
|
+
static
|
125
|
+
VALUE
|
126
|
+
rb_highlighter_color(VALUE self)
|
127
|
+
{
|
128
|
+
return wrap_color([unwrap_window(self) backgroundColor]);
|
129
|
+
}
|
130
|
+
|
131
|
+
static
|
132
|
+
VALUE
|
133
|
+
rb_highlighter_frame(VALUE self)
|
134
|
+
{
|
135
|
+
return wrap_rect([unwrap_window(self) frame]);
|
136
|
+
}
|
137
|
+
|
138
|
+
static
|
139
|
+
VALUE
|
140
|
+
rb_highlighter_is_visible(VALUE self)
|
141
|
+
{
|
142
|
+
return ([unwrap_window(self) isVisible] ? Qtrue : Qfalse);
|
143
|
+
}
|
144
|
+
|
145
|
+
|
146
|
+
/*
|
147
|
+
* @return [NSColor]
|
148
|
+
*/
|
149
|
+
static VALUE rb_color_black(VALUE self) { return wrap_color([NSColor blackColor]); }
|
150
|
+
/*
|
151
|
+
* @return [NSColor]
|
152
|
+
*/
|
153
|
+
static VALUE rb_color_blue(VALUE self) { return wrap_color([NSColor blueColor]); }
|
154
|
+
/*
|
155
|
+
* @return [NSColor]
|
156
|
+
*/
|
157
|
+
static VALUE rb_color_brown(VALUE self) { return wrap_color([NSColor brownColor]); }
|
158
|
+
/*
|
159
|
+
* @return [NSColor]
|
160
|
+
*/
|
161
|
+
static VALUE rb_color_clear(VALUE self) { return wrap_color([NSColor clearColor]); }
|
162
|
+
/*
|
163
|
+
* @return [NSColor]
|
164
|
+
*/
|
165
|
+
static VALUE rb_color_cyan(VALUE self) { return wrap_color([NSColor cyanColor]); }
|
166
|
+
/*
|
167
|
+
* @return [NSColor]
|
168
|
+
*/
|
169
|
+
static VALUE rb_color_dark_gray(VALUE self) { return wrap_color([NSColor darkGrayColor]); }
|
170
|
+
/*
|
171
|
+
* @return [NSColor]
|
172
|
+
*/
|
173
|
+
static VALUE rb_color_gray(VALUE self) { return wrap_color([NSColor grayColor]); }
|
174
|
+
/*
|
175
|
+
* @return [NSColor]
|
176
|
+
*/
|
177
|
+
static VALUE rb_color_green(VALUE self) { return wrap_color([NSColor greenColor]); }
|
178
|
+
/*
|
179
|
+
* @return [NSColor]
|
180
|
+
*/
|
181
|
+
static VALUE rb_color_light_gray(VALUE self) { return wrap_color([NSColor lightGrayColor]); }
|
182
|
+
/*
|
183
|
+
* @return [NSColor]
|
184
|
+
*/
|
185
|
+
static VALUE rb_color_magenta(VALUE self) { return wrap_color([NSColor magentaColor]); }
|
186
|
+
/*
|
187
|
+
* @return [NSColor]
|
188
|
+
*/
|
189
|
+
static VALUE rb_color_orange(VALUE self) { return wrap_color([NSColor orangeColor]); }
|
190
|
+
/*
|
191
|
+
* @return [NSColor]
|
192
|
+
*/
|
193
|
+
static VALUE rb_color_purple(VALUE self) { return wrap_color([NSColor purpleColor]); }
|
194
|
+
/*
|
195
|
+
* @return [NSColor]
|
196
|
+
*/
|
197
|
+
static VALUE rb_color_red(VALUE self) { return wrap_color([NSColor redColor]); }
|
198
|
+
/*
|
199
|
+
* @return [NSColor]
|
200
|
+
*/
|
201
|
+
static VALUE rb_color_white(VALUE self) { return wrap_color([NSColor whiteColor]); }
|
202
|
+
/*
|
203
|
+
* @return [NSColor]
|
204
|
+
*/
|
205
|
+
static VALUE rb_color_yellow(VALUE self) { return wrap_color([NSColor yellowColor]); }
|
206
|
+
|
207
|
+
/* static */
|
208
|
+
/* VALUE */
|
209
|
+
/* rb_color_rgb(VALUE self, VALUE red_val, VALUE other_vals) */
|
210
|
+
/* { */
|
211
|
+
/* return Qnil; */
|
212
|
+
/* } */
|
213
|
+
|
214
|
+
/*
|
215
|
+
* @return [Boolean]
|
216
|
+
*/
|
217
|
+
static
|
218
|
+
VALUE
|
219
|
+
rb_color_equality(VALUE self, VALUE other)
|
220
|
+
{
|
221
|
+
if (CLASS_OF(other) == rb_cColor)
|
222
|
+
if ([unwrap_color(self) isEqual:unwrap_color(other)])
|
223
|
+
return Qtrue;
|
224
|
+
|
225
|
+
return Qfalse;
|
226
|
+
}
|
227
|
+
|
228
|
+
#endif
|
229
|
+
|
2
230
|
|
3
231
|
void
|
4
232
|
Init_highlighter()
|
5
233
|
{
|
6
|
-
|
234
|
+
Init_bridge();
|
235
|
+
Init_extras();
|
236
|
+
|
237
|
+
#ifdef NOT_MACRUBY
|
238
|
+
|
239
|
+
// force initialization or NSWindow won't work
|
240
|
+
[NSApplication sharedApplication];
|
241
|
+
|
242
|
+
// TODO: can we replace this bs with dispatch_once?
|
243
|
+
rb_mAccessibility = rb_define_module("Accessibility");
|
244
|
+
rb_cCGPoint = rb_const_get(rb_cObject, rb_intern("CGPoint"));
|
245
|
+
rb_cCGSize = rb_const_get(rb_cObject, rb_intern("CGSize"));
|
246
|
+
rb_cCGRect = rb_const_get(rb_cObject, rb_intern("CGRect"));
|
247
|
+
|
248
|
+
|
249
|
+
rb_cHighlighter = rb_define_class_under(rb_mAccessibility, "Highlighter", rb_cObject);
|
250
|
+
|
251
|
+
rb_define_singleton_method(rb_cHighlighter, "new", rb_highlighter_new, -1);
|
252
|
+
|
253
|
+
rb_define_method(rb_cHighlighter, "stop", rb_highlighter_stop, 0);
|
254
|
+
rb_define_method(rb_cHighlighter, "color", rb_highlighter_color, 0);
|
255
|
+
rb_define_method(rb_cHighlighter, "frame", rb_highlighter_frame, 0);
|
256
|
+
rb_define_method(rb_cHighlighter, "visible?", rb_highlighter_is_visible, 0);
|
7
257
|
|
258
|
+
rb_define_alias(rb_cHighlighter, "colour", "color");
|
259
|
+
|
260
|
+
ivar_color = rb_intern("color");
|
261
|
+
|
262
|
+
color_key = ID2SYM(rb_intern("color"));
|
263
|
+
colour_key = ID2SYM(rb_intern("colour")); // fuck yeah, Canada
|
264
|
+
timeout_key = ID2SYM(rb_intern("timeout"));
|
265
|
+
|
266
|
+
|
267
|
+
/*
|
268
|
+
* Document-class: NSColor
|
269
|
+
*
|
270
|
+
* A subset of Cocoa's `NSColor` class.
|
271
|
+
*
|
272
|
+
* See [Apple's Developer Reference](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSColor_Class/Reference/Reference.html)
|
273
|
+
* for documentation on the methods available in this class.
|
274
|
+
*/
|
275
|
+
rb_cColor = rb_define_class("NSColor", rb_cObject);
|
276
|
+
|
277
|
+
rb_define_singleton_method(rb_cColor, "blackColor", rb_color_black, 0);
|
278
|
+
rb_define_singleton_method(rb_cColor, "blueColor", rb_color_blue, 0);
|
279
|
+
rb_define_singleton_method(rb_cColor, "brownColor", rb_color_brown, 0);
|
280
|
+
rb_define_singleton_method(rb_cColor, "clearColor", rb_color_clear, 0);
|
281
|
+
rb_define_singleton_method(rb_cColor, "cyanColor", rb_color_cyan, 0);
|
282
|
+
rb_define_singleton_method(rb_cColor, "darkGrayColor", rb_color_dark_gray, 0);
|
283
|
+
rb_define_singleton_method(rb_cColor, "grayColor", rb_color_gray, 0);
|
284
|
+
rb_define_singleton_method(rb_cColor, "greenColor", rb_color_green, 0);
|
285
|
+
rb_define_singleton_method(rb_cColor, "lightGrayColor", rb_color_light_gray, 0);
|
286
|
+
rb_define_singleton_method(rb_cColor, "magentaColor", rb_color_magenta, 0);
|
287
|
+
rb_define_singleton_method(rb_cColor, "orangeColor", rb_color_orange, 0);
|
288
|
+
rb_define_singleton_method(rb_cColor, "purpleColor", rb_color_purple, 0);
|
289
|
+
rb_define_singleton_method(rb_cColor, "redColor", rb_color_red, 0);
|
290
|
+
rb_define_singleton_method(rb_cColor, "whiteColor", rb_color_white, 0);
|
291
|
+
rb_define_singleton_method(rb_cColor, "yellowColor", rb_color_yellow, 0);
|
292
|
+
//rb_define_singleton_method(rb_cColor, "colorWithSRGBRed", rb_color_rgb, 2);
|
293
|
+
|
294
|
+
rb_define_method(rb_cColor, "==", rb_color_equality, 1);
|
295
|
+
|
296
|
+
#endif
|
297
|
+
}
|
@@ -1,6 +1,7 @@
|
|
1
|
-
require 'accessibility/
|
1
|
+
require 'accessibility/core/version'
|
2
2
|
|
3
|
-
|
3
|
+
|
4
|
+
if defined? MACRUBY_REVISION
|
4
5
|
|
5
6
|
##
|
6
7
|
# Whether or not we are running on MacRuby
|
@@ -30,4 +31,3 @@ else
|
|
30
31
|
require 'accessibility/bridge/mri'
|
31
32
|
|
32
33
|
end
|
33
|
-
|
File without changes
|
@@ -183,3 +183,20 @@ class NSArray
|
|
183
183
|
map do |obj| obj.to_ruby end
|
184
184
|
end
|
185
185
|
end
|
186
|
+
|
187
|
+
##
|
188
|
+
# `accessibility-core` extensions to `Object`
|
189
|
+
class Object
|
190
|
+
|
191
|
+
##
|
192
|
+
# Spin the run loop for the given number of seconds
|
193
|
+
#
|
194
|
+
# The script will effectively be paused while the run loop
|
195
|
+
# is "spinning".
|
196
|
+
#
|
197
|
+
# @param seconds [Number]
|
198
|
+
def spin seconds
|
199
|
+
CFRunLoopRunInMode(KCFRunLoopDefaultMode, seconds, false)
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
##
|
2
2
|
# A structure that contains a point in a two-dimensional coordinate system
|
3
|
-
CGPoint = Struct.new(:x, :y)
|
3
|
+
CGPoint = Struct.new(:x, :y)
|
4
|
+
class CGPoint
|
4
5
|
|
5
6
|
# @param x [Number]
|
6
7
|
# @param y [Number]
|
@@ -10,11 +11,11 @@ CGPoint = Struct.new(:x, :y) do
|
|
10
11
|
|
11
12
|
# @!attribute [rw] x
|
12
13
|
# The `x` co-ordinate of the screen point
|
13
|
-
# @return [
|
14
|
+
# @return [Float]
|
14
15
|
|
15
16
|
# @!attribute [rw] y
|
16
17
|
# The `y` co-ordinate of the screen point
|
17
|
-
# @return [
|
18
|
+
# @return [Float]
|
18
19
|
|
19
20
|
##
|
20
21
|
# Return a nice string representation of the point
|
@@ -31,7 +32,8 @@ end
|
|
31
32
|
|
32
33
|
##
|
33
34
|
# A structure that contains the size of a rectangle in a 2D co-ordinate system
|
34
|
-
CGSize = Struct.new(:width, :height)
|
35
|
+
CGSize = Struct.new(:width, :height)
|
36
|
+
class CGSize
|
35
37
|
|
36
38
|
# @param width [Number]
|
37
39
|
# @param height [Number]
|
@@ -41,11 +43,11 @@ CGSize = Struct.new(:width, :height) do
|
|
41
43
|
|
42
44
|
# @!attribute [rw] width
|
43
45
|
# The `width` of the box
|
44
|
-
# @return [
|
46
|
+
# @return [Float]
|
45
47
|
|
46
48
|
# @!attribute [rw] height
|
47
49
|
# The `heighth` of the box
|
48
|
-
# @return [
|
50
|
+
# @return [Float]
|
49
51
|
|
50
52
|
##
|
51
53
|
# Return a nice string representation of the size
|
@@ -62,7 +64,8 @@ end
|
|
62
64
|
|
63
65
|
##
|
64
66
|
# Complete definition of a rectangle in a 2D coordinate system
|
65
|
-
CGRect = Struct.new(:origin, :size)
|
67
|
+
CGRect = Struct.new(:origin, :size)
|
68
|
+
class CGRect
|
66
69
|
|
67
70
|
# @param origin [CGPoint,#to_point]
|
68
71
|
# @param size [CGSize,#to_size]
|
data/lib/accessibility/core.rb
CHANGED
@@ -159,7 +159,7 @@ module Accessibility::Element
|
|
159
159
|
# The `:zomg` setting will be too fast in almost all cases, but
|
160
160
|
# it is fun to watch.
|
161
161
|
#
|
162
|
-
# @param [Number,Symbol]
|
162
|
+
# @param value [Number,Symbol]
|
163
163
|
def self.key_rate= value
|
164
164
|
@key_rate = case value
|
165
165
|
when :very_slow then 0.9
|