accessibility_core 0.1.2 → 0.3.1
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.
- 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,132 @@
|
|
1
|
+
#include "ruby.h"
|
2
|
+
#import <Cocoa/Cocoa.h>
|
3
|
+
|
4
|
+
|
5
|
+
// these functions are available on MacRuby as well as MRI
|
6
|
+
void spin(double seconds);
|
7
|
+
|
8
|
+
// initialize all the dynamic data (e.g. class pointers)
|
9
|
+
void Init_bridge();
|
10
|
+
|
11
|
+
|
12
|
+
#ifdef NOT_MACRUBY
|
13
|
+
|
14
|
+
extern VALUE rb_mAccessibility;
|
15
|
+
extern VALUE rb_cElement;
|
16
|
+
extern VALUE rb_cCGPoint;
|
17
|
+
extern VALUE rb_cCGSize;
|
18
|
+
extern VALUE rb_cCGRect;
|
19
|
+
extern VALUE rb_mURI; // URI module
|
20
|
+
extern VALUE rb_cURI; // URI::Generic class
|
21
|
+
extern VALUE rb_cScreen;
|
22
|
+
|
23
|
+
extern ID sel_x;
|
24
|
+
extern ID sel_y;
|
25
|
+
extern ID sel_width;
|
26
|
+
extern ID sel_height;
|
27
|
+
extern ID sel_origin;
|
28
|
+
extern ID sel_size;
|
29
|
+
extern ID sel_to_point;
|
30
|
+
extern ID sel_to_size;
|
31
|
+
extern ID sel_to_rect;
|
32
|
+
extern ID sel_to_s;
|
33
|
+
extern ID sel_parse;
|
34
|
+
|
35
|
+
|
36
|
+
#define WRAP_ARRAY(wrapper) do { \
|
37
|
+
CFIndex length = CFArrayGetCount(array); \
|
38
|
+
VALUE ary = rb_ary_new2(length); \
|
39
|
+
\
|
40
|
+
for (CFIndex idx = 0; idx < length; idx++) \
|
41
|
+
rb_ary_store( \
|
42
|
+
ary, \
|
43
|
+
idx, \
|
44
|
+
wrapper(CFArrayGetValueAtIndex(array, idx)) \
|
45
|
+
); \
|
46
|
+
return ary; \
|
47
|
+
} while (false);
|
48
|
+
|
49
|
+
|
50
|
+
void cf_finalizer(void* obj);
|
51
|
+
void objc_finalizer(void* obj);
|
52
|
+
|
53
|
+
VALUE wrap_unknown(CFTypeRef obj);
|
54
|
+
CFTypeRef unwrap_unknown(VALUE obj);
|
55
|
+
|
56
|
+
VALUE wrap_point(CGPoint point);
|
57
|
+
CGPoint unwrap_point(VALUE point);
|
58
|
+
|
59
|
+
VALUE wrap_size(CGSize size);
|
60
|
+
CGSize unwrap_size(VALUE size);
|
61
|
+
|
62
|
+
VALUE wrap_rect(CGRect rect);
|
63
|
+
VALUE coerce_to_rect(VALUE obj);
|
64
|
+
CGRect unwrap_rect(VALUE rect);
|
65
|
+
|
66
|
+
VALUE convert_cf_range(CFRange range);
|
67
|
+
CFRange convert_rb_range(VALUE range);
|
68
|
+
|
69
|
+
VALUE wrap_value_point(AXValueRef value);
|
70
|
+
VALUE wrap_value_size(AXValueRef value);
|
71
|
+
VALUE wrap_value_rect(AXValueRef value);
|
72
|
+
VALUE wrap_value_range(AXValueRef value);
|
73
|
+
VALUE wrap_value_error(AXValueRef value);
|
74
|
+
VALUE wrap_value(AXValueRef value);
|
75
|
+
VALUE wrap_array_values(CFArrayRef array);
|
76
|
+
|
77
|
+
AXValueRef unwrap_value_point(VALUE val);
|
78
|
+
AXValueRef unwrap_value_size(VALUE val);
|
79
|
+
AXValueRef unwrap_value_rect(VALUE val);
|
80
|
+
AXValueRef unwrap_value_range(VALUE val);
|
81
|
+
AXValueRef unwrap_value(VALUE value);
|
82
|
+
|
83
|
+
VALUE wrap_ref(AXUIElementRef ref);
|
84
|
+
VALUE wrap_array_refs(CFArrayRef array);
|
85
|
+
AXUIElementRef unwrap_ref(VALUE obj);
|
86
|
+
|
87
|
+
VALUE wrap_string(CFStringRef string);
|
88
|
+
VALUE wrap_nsstring(NSString* string);
|
89
|
+
VALUE wrap_array_strings(CFArrayRef array);
|
90
|
+
VALUE wrap_array_nsstrings(NSArray* ary);
|
91
|
+
CFStringRef unwrap_string(VALUE string);
|
92
|
+
NSString* unwrap_nsstring(VALUE string);
|
93
|
+
|
94
|
+
VALUE wrap_long(CFNumberRef num);
|
95
|
+
VALUE wrap_long_long(CFNumberRef num);
|
96
|
+
VALUE wrap_float(CFNumberRef num);
|
97
|
+
// Generic CFNumber wrapper, use it if you do not
|
98
|
+
// know the primitive type of number
|
99
|
+
VALUE wrap_number(CFNumberRef number);
|
100
|
+
VALUE wrap_array_numbers(CFArrayRef array);
|
101
|
+
|
102
|
+
CFNumberRef unwrap_long(VALUE num);
|
103
|
+
CFNumberRef unwrap_long_long(VALUE num);
|
104
|
+
CFNumberRef unwrap_float(VALUE num);
|
105
|
+
CFNumberRef unwrap_number(VALUE number);
|
106
|
+
|
107
|
+
VALUE wrap_url(CFURLRef url);
|
108
|
+
VALUE wrap_nsurl(NSURL* url);
|
109
|
+
CFURLRef unwrap_url(VALUE url);
|
110
|
+
VALUE wrap_array_urls(CFArrayRef array);
|
111
|
+
|
112
|
+
VALUE wrap_date(CFDateRef date);
|
113
|
+
VALUE wrap_nsdate(NSDate* date);
|
114
|
+
VALUE wrap_array_dates(CFArrayRef array);
|
115
|
+
CFDateRef unwrap_date(VALUE date);
|
116
|
+
|
117
|
+
VALUE wrap_boolean(CFBooleanRef bool_val);
|
118
|
+
VALUE wrap_array_booleans(CFArrayRef array);
|
119
|
+
CFBooleanRef unwrap_boolean(VALUE bool_val);
|
120
|
+
|
121
|
+
// this function assumes that arrays are homogeneous;
|
122
|
+
// which is usually the case coming from the CF world
|
123
|
+
VALUE wrap_array(CFArrayRef array);
|
124
|
+
|
125
|
+
VALUE to_ruby(CFTypeRef obj);
|
126
|
+
CFTypeRef to_ax(VALUE obj);
|
127
|
+
|
128
|
+
VALUE wrap_screen(NSScreen* screen);
|
129
|
+
VALUE wrap_array_screens(CFArrayRef array);
|
130
|
+
NSScreen* unwrap_screen(VALUE screen);
|
131
|
+
|
132
|
+
#endif
|
@@ -3,7 +3,7 @@
|
|
3
3
|
#ifdef NOT_MACRUBY /* This entire extension is pointless when running on MacRuby */
|
4
4
|
|
5
5
|
#import <Cocoa/Cocoa.h>
|
6
|
-
#include "bridge.h"
|
6
|
+
#include "../bridge/bridge.h"
|
7
7
|
|
8
8
|
|
9
9
|
static ID ivar_attrs;
|
@@ -613,7 +613,7 @@ rb_acore_element_at(VALUE self, VALUE point)
|
|
613
613
|
else
|
614
614
|
return Qnil;
|
615
615
|
default:
|
616
|
-
return handle_error(self, code);
|
616
|
+
return handle_error(self, code);
|
617
617
|
}
|
618
618
|
}
|
619
619
|
|
@@ -633,6 +633,8 @@ rb_acore_equality(VALUE self, VALUE other)
|
|
633
633
|
void
|
634
634
|
Init_core()
|
635
635
|
{
|
636
|
+
Init_bridge();
|
637
|
+
|
636
638
|
#ifdef NOT_MACRUBY
|
637
639
|
if (!AXAPIEnabled())
|
638
640
|
rb_raise(
|
@@ -645,7 +647,23 @@ Init_core()
|
|
645
647
|
"------------------------------------------------------------------------\n"
|
646
648
|
);
|
647
649
|
|
648
|
-
|
650
|
+
// bs that needs to be initialized from the bridge.c import
|
651
|
+
sel_x = rb_intern("x");
|
652
|
+
sel_y = rb_intern("y");
|
653
|
+
sel_width = rb_intern("width");
|
654
|
+
sel_height = rb_intern("height");
|
655
|
+
sel_origin = rb_intern("origin");
|
656
|
+
sel_size = rb_intern("size");
|
657
|
+
sel_to_point = rb_intern("to_point");
|
658
|
+
sel_to_size = rb_intern("to_size");
|
659
|
+
sel_to_s = rb_intern("to_s");
|
660
|
+
|
661
|
+
rb_mAccessibility = rb_const_get(rb_cObject, rb_intern("Accessibility"));
|
662
|
+
rb_cElement = rb_define_class_under(rb_mAccessibility, "Element", rb_cObject);
|
663
|
+
rb_cCGPoint = rb_const_get(rb_cObject, rb_intern("CGPoint"));
|
664
|
+
rb_cCGSize = rb_const_get(rb_cObject, rb_intern("CGSize"));
|
665
|
+
rb_cCGRect = rb_const_get(rb_cObject, rb_intern("CGRect"));
|
666
|
+
|
649
667
|
|
650
668
|
// these should be defined by now
|
651
669
|
rb_mAccessibility = rb_const_get(rb_cObject, rb_intern("Accessibility"));
|
@@ -19,4 +19,10 @@ else
|
|
19
19
|
$CFLAGS << ' -DNOT_MACRUBY'
|
20
20
|
end
|
21
21
|
|
22
|
-
create_makefile 'accessibility/core'
|
22
|
+
create_makefile 'accessibility/core/core'
|
23
|
+
|
24
|
+
# modify the bugger so we can depend on bridge.h properly
|
25
|
+
makefile = File.read 'Makefile'
|
26
|
+
makefile.gsub! '$(DLLIB): $(OBJS) Makefile', '$(DLLIB): $(OBJS) Makefile ../bridge/bridge.o'
|
27
|
+
makefile.gsub! '$(Q) $(LDSHARED) -o $@', '$(Q) $(LDSHARED) -o $@ ../bridge/bridge.o'
|
28
|
+
File.open('Makefile', 'w') { |f| f.write makefile }
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
|
3
|
+
$CFLAGS << ' -std=c99 -Wall -Werror -pedantic -ObjC'
|
4
|
+
$LIBS << ' -framework CoreFoundation -framework Cocoa -framework IOKit'
|
5
|
+
|
6
|
+
if RUBY_ENGINE == 'macruby'
|
7
|
+
$CFLAGS << ' -fobjc-gc'
|
8
|
+
$CFLAGS.sub! /-Werror/, '' # :(
|
9
|
+
else
|
10
|
+
unless RbConfig::CONFIG["CC"].match /clang/
|
11
|
+
clang = `which clang`.chomp
|
12
|
+
if clang.empty?
|
13
|
+
raise "Clang not installed. Cannot build C extension"
|
14
|
+
else
|
15
|
+
RbConfig::MAKEFILE_CONFIG["CC"] = clang
|
16
|
+
RbConfig::MAKEFILE_CONFIG["CXX"] = clang
|
17
|
+
end
|
18
|
+
end
|
19
|
+
$CFLAGS << ' -DNOT_MACRUBY'
|
20
|
+
end
|
21
|
+
|
22
|
+
create_makefile 'accessibility/extras/extras'
|
23
|
+
|
24
|
+
# modify the bugger so we can depend on bridge.h properly
|
25
|
+
makefile = File.read 'Makefile'
|
26
|
+
makefile.gsub! '$(DLLIB): $(OBJS) Makefile', '$(DLLIB): $(OBJS) Makefile ../bridge/bridge.o'
|
27
|
+
makefile.gsub! '$(Q) $(LDSHARED) -o $@', '$(Q) $(LDSHARED) -o $@ ../bridge/bridge.o'
|
28
|
+
File.open('Makefile', 'w') { |f| f.write makefile }
|
@@ -0,0 +1,842 @@
|
|
1
|
+
#include "ruby.h"
|
2
|
+
|
3
|
+
#include "../bridge/bridge.h"
|
4
|
+
|
5
|
+
#import <IOKit/IOKitlib.h>
|
6
|
+
#import <IOKit/ps/IOPowerSources.h>
|
7
|
+
#import <IOKit/ps/IOPSKeys.h>
|
8
|
+
#import <IOKit/pwr_mgt/IOPMLib.h>
|
9
|
+
#import <IOKit/hidsystem/IOHIDShared.h>
|
10
|
+
|
11
|
+
static VALUE rb_mBattery;
|
12
|
+
#ifndef NOT_MACRUBY
|
13
|
+
static VALUE rb_cScreen;
|
14
|
+
#endif
|
15
|
+
|
16
|
+
static VALUE battery_not_installed;
|
17
|
+
static VALUE battery_charged;
|
18
|
+
static VALUE battery_charging;
|
19
|
+
static VALUE battery_discharging;
|
20
|
+
|
21
|
+
static io_connect_t screen_connection = MACH_PORT_NULL;
|
22
|
+
|
23
|
+
|
24
|
+
#ifdef NOT_MACRUBY
|
25
|
+
|
26
|
+
#import <Cocoa/Cocoa.h>
|
27
|
+
|
28
|
+
static VALUE rb_cRunningApp;
|
29
|
+
static VALUE rb_cWorkspace;
|
30
|
+
static VALUE rb_cProcInfo;
|
31
|
+
static VALUE rb_cHost;
|
32
|
+
|
33
|
+
static VALUE key_opts;
|
34
|
+
//static VALUE key_event_params;
|
35
|
+
//static VALUE key_launch_id;
|
36
|
+
|
37
|
+
|
38
|
+
static
|
39
|
+
VALUE
|
40
|
+
wrap_app(NSRunningApplication* app)
|
41
|
+
{
|
42
|
+
return Data_Wrap_Struct(rb_cRunningApp, NULL, objc_finalizer, (void*)app);
|
43
|
+
}
|
44
|
+
|
45
|
+
static
|
46
|
+
NSRunningApplication*
|
47
|
+
unwrap_app(VALUE app)
|
48
|
+
{
|
49
|
+
NSRunningApplication* running_app;
|
50
|
+
Data_Get_Struct(app, NSRunningApplication, running_app);
|
51
|
+
return running_app;
|
52
|
+
}
|
53
|
+
|
54
|
+
static VALUE wrap_array_apps(NSArray* ary)
|
55
|
+
{
|
56
|
+
CFArrayRef array = (CFArrayRef)ary;
|
57
|
+
WRAP_ARRAY(wrap_app);
|
58
|
+
}
|
59
|
+
|
60
|
+
|
61
|
+
static
|
62
|
+
VALUE
|
63
|
+
rb_running_app_with_pid(VALUE self, VALUE pid)
|
64
|
+
{
|
65
|
+
NSRunningApplication* app = [NSRunningApplication
|
66
|
+
runningApplicationWithProcessIdentifier:NUM2PIDT(pid)];
|
67
|
+
if (app)
|
68
|
+
return wrap_app(app);
|
69
|
+
return Qnil; // ruby behaviour would be to raise, but we want "drop-in" compat
|
70
|
+
}
|
71
|
+
|
72
|
+
static
|
73
|
+
VALUE
|
74
|
+
rb_running_app_with_bundle_id(VALUE self, VALUE bundle_id)
|
75
|
+
{
|
76
|
+
return wrap_array_apps([NSRunningApplication
|
77
|
+
runningApplicationsWithBundleIdentifier:unwrap_nsstring(bundle_id)]);
|
78
|
+
}
|
79
|
+
|
80
|
+
static
|
81
|
+
VALUE
|
82
|
+
rb_running_app_current_app(VALUE self)
|
83
|
+
{
|
84
|
+
NSRunningApplication* app = [NSRunningApplication currentApplication];
|
85
|
+
if (app)
|
86
|
+
return wrap_app(app);
|
87
|
+
return Qnil;
|
88
|
+
}
|
89
|
+
|
90
|
+
static
|
91
|
+
VALUE
|
92
|
+
rb_running_app_drop_nuke(VALUE self)
|
93
|
+
{
|
94
|
+
[NSRunningApplication terminateAutomaticallyTerminableApplications];
|
95
|
+
return rb_cRunningApp; // return this to be MacRuby compatible
|
96
|
+
}
|
97
|
+
|
98
|
+
|
99
|
+
static
|
100
|
+
VALUE
|
101
|
+
rb_running_app_is_active(VALUE self)
|
102
|
+
{
|
103
|
+
return unwrap_app(self).isActive ? Qtrue : Qfalse;
|
104
|
+
}
|
105
|
+
|
106
|
+
static
|
107
|
+
VALUE
|
108
|
+
rb_running_app_activate(VALUE self, VALUE options)
|
109
|
+
{
|
110
|
+
return ([unwrap_app(self) activateWithOptions:FIX2INT(options)] ? Qtrue : Qfalse);
|
111
|
+
}
|
112
|
+
|
113
|
+
static
|
114
|
+
VALUE
|
115
|
+
rb_running_app_activation_policy(VALUE self)
|
116
|
+
{
|
117
|
+
return INT2FIX(unwrap_app(self).activationPolicy);
|
118
|
+
}
|
119
|
+
|
120
|
+
static
|
121
|
+
VALUE
|
122
|
+
rb_running_app_hide(VALUE self)
|
123
|
+
{
|
124
|
+
return ([unwrap_app(self) hide] ? Qtrue : Qfalse);
|
125
|
+
}
|
126
|
+
|
127
|
+
static
|
128
|
+
VALUE
|
129
|
+
rb_running_app_unhide(VALUE self)
|
130
|
+
{
|
131
|
+
return ([unwrap_app(self) unhide] ? Qtrue : Qfalse);
|
132
|
+
}
|
133
|
+
|
134
|
+
static
|
135
|
+
VALUE
|
136
|
+
rb_running_app_is_hidden(VALUE self)
|
137
|
+
{
|
138
|
+
return (unwrap_app(self).isHidden ? Qtrue : Qfalse);
|
139
|
+
}
|
140
|
+
|
141
|
+
static
|
142
|
+
VALUE
|
143
|
+
rb_running_app_localized_name(VALUE self)
|
144
|
+
{
|
145
|
+
NSString* string = [unwrap_app(self) localizedName];
|
146
|
+
VALUE str = Qnil;
|
147
|
+
if (string)
|
148
|
+
str = wrap_nsstring(string);
|
149
|
+
[string release];
|
150
|
+
return str;
|
151
|
+
}
|
152
|
+
|
153
|
+
static
|
154
|
+
VALUE
|
155
|
+
rb_running_app_bundle_id(VALUE self)
|
156
|
+
{
|
157
|
+
NSString* name = [unwrap_app(self) bundleIdentifier];
|
158
|
+
if (name)
|
159
|
+
return wrap_nsstring(name);
|
160
|
+
return Qnil;
|
161
|
+
}
|
162
|
+
|
163
|
+
static
|
164
|
+
VALUE
|
165
|
+
rb_running_app_bundle_url(VALUE self)
|
166
|
+
{
|
167
|
+
NSURL* url = [unwrap_app(self) bundleURL];
|
168
|
+
VALUE rburl = Qnil;
|
169
|
+
if (url)
|
170
|
+
rburl = wrap_nsurl(url);
|
171
|
+
[url release];
|
172
|
+
return rburl;
|
173
|
+
}
|
174
|
+
|
175
|
+
static
|
176
|
+
VALUE
|
177
|
+
rb_running_app_executable_arch(VALUE self)
|
178
|
+
{
|
179
|
+
return INT2FIX(unwrap_app(self).executableArchitecture);
|
180
|
+
}
|
181
|
+
|
182
|
+
static
|
183
|
+
VALUE
|
184
|
+
rb_running_app_executable_url(VALUE self)
|
185
|
+
{
|
186
|
+
return wrap_nsurl(unwrap_app(self).executableURL);
|
187
|
+
}
|
188
|
+
|
189
|
+
static
|
190
|
+
VALUE
|
191
|
+
rb_running_app_launch_date(VALUE self)
|
192
|
+
{
|
193
|
+
return wrap_nsdate(unwrap_app(self).launchDate);
|
194
|
+
}
|
195
|
+
|
196
|
+
static
|
197
|
+
VALUE
|
198
|
+
rb_running_app_is_launched(VALUE self)
|
199
|
+
{
|
200
|
+
return (unwrap_app(self).isFinishedLaunching ? Qtrue : Qfalse);
|
201
|
+
}
|
202
|
+
|
203
|
+
static
|
204
|
+
VALUE
|
205
|
+
rb_running_app_pid(VALUE self)
|
206
|
+
{
|
207
|
+
return PIDT2NUM(unwrap_app(self).processIdentifier);
|
208
|
+
}
|
209
|
+
|
210
|
+
static
|
211
|
+
VALUE
|
212
|
+
rb_running_app_owns_menu_bar(VALUE self)
|
213
|
+
{
|
214
|
+
return (unwrap_app(self).ownsMenuBar ? Qtrue : Qfalse);
|
215
|
+
}
|
216
|
+
|
217
|
+
static
|
218
|
+
VALUE
|
219
|
+
rb_running_app_force_terminate(VALUE self)
|
220
|
+
{
|
221
|
+
return ([unwrap_app(self) forceTerminate] ? Qtrue : Qfalse);
|
222
|
+
}
|
223
|
+
|
224
|
+
static
|
225
|
+
VALUE
|
226
|
+
rb_running_app_terminate(VALUE self)
|
227
|
+
{
|
228
|
+
return ([unwrap_app(self) terminate] ? Qtrue : Qfalse);
|
229
|
+
}
|
230
|
+
|
231
|
+
static
|
232
|
+
VALUE
|
233
|
+
rb_running_app_is_terminated(VALUE self)
|
234
|
+
{
|
235
|
+
return (unwrap_app(self).isTerminated ? Qtrue : Qfalse);
|
236
|
+
}
|
237
|
+
|
238
|
+
static
|
239
|
+
VALUE
|
240
|
+
rb_running_app_equality(VALUE self, VALUE other)
|
241
|
+
{
|
242
|
+
if (CLASS_OF(other) == rb_cRunningApp)
|
243
|
+
if ([unwrap_app(self) isEqual:unwrap_app(other)])
|
244
|
+
return Qtrue;
|
245
|
+
return Qfalse;
|
246
|
+
}
|
247
|
+
|
248
|
+
|
249
|
+
static
|
250
|
+
VALUE
|
251
|
+
rb_workspace_shared(VALUE self)
|
252
|
+
{
|
253
|
+
return self;
|
254
|
+
}
|
255
|
+
|
256
|
+
|
257
|
+
static
|
258
|
+
VALUE
|
259
|
+
rb_workspace_running_apps(VALUE self)
|
260
|
+
{
|
261
|
+
NSArray* apps = [[NSWorkspace sharedWorkspace] runningApplications];
|
262
|
+
VALUE rb_apps = wrap_array_apps(apps);
|
263
|
+
[apps enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
|
264
|
+
[obj retain];
|
265
|
+
}];
|
266
|
+
[apps release];
|
267
|
+
return rb_apps;
|
268
|
+
}
|
269
|
+
|
270
|
+
static
|
271
|
+
VALUE
|
272
|
+
rb_workspace_frontmost_app(VALUE self)
|
273
|
+
{
|
274
|
+
return wrap_app([[NSWorkspace sharedWorkspace] frontmostApplication]);
|
275
|
+
}
|
276
|
+
|
277
|
+
static
|
278
|
+
VALUE
|
279
|
+
rb_workspace_menu_bar_owner(VALUE self)
|
280
|
+
{
|
281
|
+
return wrap_app([[NSWorkspace sharedWorkspace] menuBarOwningApplication]);
|
282
|
+
}
|
283
|
+
|
284
|
+
static
|
285
|
+
VALUE
|
286
|
+
rb_workspace_find(VALUE self, VALUE query)
|
287
|
+
{
|
288
|
+
BOOL result =
|
289
|
+
[[NSWorkspace sharedWorkspace] showSearchResultsForQueryString:unwrap_nsstring(query)];
|
290
|
+
return (result ? Qtrue : Qfalse);
|
291
|
+
}
|
292
|
+
|
293
|
+
/*
|
294
|
+
* @todo One thing we want to look into is using Launch Services instead of
|
295
|
+
* NSWorkspace for app launching. The reason is that we will avoid the
|
296
|
+
* problem launching new apps that have not been registered yet. But the
|
297
|
+
* big thing is that we can get the PSN for the application, which will
|
298
|
+
* allow for more directed input using CGEvents and it also gives us a
|
299
|
+
* data structure to wait on that indicates when the app has properly
|
300
|
+
* started up.
|
301
|
+
*
|
302
|
+
* The `additonalEventParamDescriptor` option is not supported by the bridge rigt now
|
303
|
+
*/
|
304
|
+
static
|
305
|
+
VALUE
|
306
|
+
rb_workspace_launch(VALUE self, VALUE bundle_id, VALUE opts)
|
307
|
+
{
|
308
|
+
NSString* identifier = unwrap_nsstring(bundle_id);
|
309
|
+
NSWorkspaceLaunchOptions options = NUM2INT(rb_hash_lookup(opts, key_opts));
|
310
|
+
|
311
|
+
BOOL result = [[NSWorkspace sharedWorkspace]
|
312
|
+
launchAppWithBundleIdentifier:identifier
|
313
|
+
options:options
|
314
|
+
additionalEventParamDescriptor:nil
|
315
|
+
launchIdentifier:nil];
|
316
|
+
|
317
|
+
[identifier release];
|
318
|
+
return result ? Qtrue : Qfalse;
|
319
|
+
}
|
320
|
+
|
321
|
+
|
322
|
+
static
|
323
|
+
VALUE
|
324
|
+
rb_procinfo_self(VALUE self)
|
325
|
+
{
|
326
|
+
return self;
|
327
|
+
}
|
328
|
+
|
329
|
+
static
|
330
|
+
VALUE
|
331
|
+
rb_procinfo_os_version(VALUE self)
|
332
|
+
{
|
333
|
+
NSString* value = [[NSProcessInfo processInfo] operatingSystemVersionString];
|
334
|
+
VALUE obj = wrap_nsstring(value);
|
335
|
+
[value release];
|
336
|
+
return obj;
|
337
|
+
}
|
338
|
+
|
339
|
+
static
|
340
|
+
VALUE
|
341
|
+
rb_procinfo_sys_uptime(VALUE self)
|
342
|
+
{
|
343
|
+
return DBL2NUM([[NSProcessInfo processInfo] systemUptime]);
|
344
|
+
}
|
345
|
+
|
346
|
+
static
|
347
|
+
VALUE
|
348
|
+
rb_procinfo_cpu_count(VALUE self)
|
349
|
+
{
|
350
|
+
return INT2FIX([[NSProcessInfo processInfo] processorCount]);
|
351
|
+
}
|
352
|
+
|
353
|
+
static
|
354
|
+
VALUE
|
355
|
+
rb_procinfo_active_cpus(VALUE self)
|
356
|
+
{
|
357
|
+
return INT2FIX([[NSProcessInfo processInfo] activeProcessorCount]);
|
358
|
+
}
|
359
|
+
|
360
|
+
static
|
361
|
+
VALUE
|
362
|
+
rb_procinfo_total_ram(VALUE self)
|
363
|
+
{
|
364
|
+
return ULL2NUM([[NSProcessInfo processInfo] physicalMemory]);
|
365
|
+
}
|
366
|
+
|
367
|
+
|
368
|
+
static
|
369
|
+
VALUE
|
370
|
+
rb_host_self(VALUE self)
|
371
|
+
{
|
372
|
+
return self; // hack
|
373
|
+
}
|
374
|
+
|
375
|
+
static
|
376
|
+
VALUE
|
377
|
+
rb_host_names(VALUE self)
|
378
|
+
{
|
379
|
+
NSArray* nsnames = [[NSHost currentHost] names];
|
380
|
+
VALUE rbnames = wrap_array_nsstrings(nsnames);
|
381
|
+
[nsnames release];
|
382
|
+
return rbnames;
|
383
|
+
}
|
384
|
+
|
385
|
+
static
|
386
|
+
VALUE
|
387
|
+
rb_host_addresses(VALUE self)
|
388
|
+
{
|
389
|
+
NSArray* nsaddrs = [[NSHost currentHost] addresses];
|
390
|
+
VALUE rbaddrs = wrap_array_nsstrings(nsaddrs);
|
391
|
+
[nsaddrs release];
|
392
|
+
return rbaddrs;
|
393
|
+
}
|
394
|
+
|
395
|
+
static
|
396
|
+
VALUE
|
397
|
+
rb_host_localized_name(VALUE self)
|
398
|
+
{
|
399
|
+
NSString* name = [[NSHost currentHost] localizedName];
|
400
|
+
VALUE rb_name = wrap_nsstring(name);
|
401
|
+
[name release];
|
402
|
+
return rb_name;
|
403
|
+
}
|
404
|
+
|
405
|
+
|
406
|
+
VALUE
|
407
|
+
wrap_screen(NSScreen* screen)
|
408
|
+
{
|
409
|
+
return Data_Wrap_Struct(rb_cScreen, NULL, NULL, (void*)screen);
|
410
|
+
}
|
411
|
+
|
412
|
+
VALUE wrap_array_screens(CFArrayRef array) { WRAP_ARRAY(wrap_screen); }
|
413
|
+
|
414
|
+
NSScreen*
|
415
|
+
unwrap_screen(VALUE screen)
|
416
|
+
{
|
417
|
+
NSScreen* ns_screen;
|
418
|
+
Data_Get_Struct(screen, NSScreen, ns_screen);
|
419
|
+
return ns_screen;
|
420
|
+
}
|
421
|
+
|
422
|
+
static
|
423
|
+
VALUE
|
424
|
+
rb_screen_main(VALUE self)
|
425
|
+
{
|
426
|
+
return wrap_screen([NSScreen mainScreen]);
|
427
|
+
}
|
428
|
+
|
429
|
+
static
|
430
|
+
VALUE
|
431
|
+
rb_screen_screens(VALUE self)
|
432
|
+
{
|
433
|
+
return wrap_array_screens((CFArrayRef)[NSScreen screens]);
|
434
|
+
}
|
435
|
+
|
436
|
+
static
|
437
|
+
VALUE
|
438
|
+
rb_screen_frame(VALUE self)
|
439
|
+
{
|
440
|
+
return wrap_rect([unwrap_screen(self) frame]);
|
441
|
+
}
|
442
|
+
|
443
|
+
#endif
|
444
|
+
|
445
|
+
|
446
|
+
static
|
447
|
+
VALUE
|
448
|
+
#ifdef NOT_MACRUBY
|
449
|
+
rb_screen_wake(VALUE self)
|
450
|
+
#else
|
451
|
+
rb_screen_wake(VALUE self, SEL sel)
|
452
|
+
#endif
|
453
|
+
{
|
454
|
+
// don't bother if we are awake
|
455
|
+
if (!CGDisplayIsAsleep(CGMainDisplayID()))
|
456
|
+
return Qtrue;
|
457
|
+
|
458
|
+
if (screen_connection == MACH_PORT_NULL) {
|
459
|
+
io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching(kIOHIDSystemClass));
|
460
|
+
if (service != MACH_PORT_NULL) {
|
461
|
+
IOServiceOpen(service, mach_task_self(), kIOHIDParamConnectType, &screen_connection);
|
462
|
+
IOObjectRelease(service);
|
463
|
+
}
|
464
|
+
else { // give up
|
465
|
+
return Qfalse;
|
466
|
+
}
|
467
|
+
}
|
468
|
+
|
469
|
+
CGPoint mouse = [NSEvent mouseLocation];
|
470
|
+
IOGPoint point = { mouse.x, mouse.y };
|
471
|
+
unsigned int flags = (unsigned int)[NSEvent modifierFlags];
|
472
|
+
NXEventData data;
|
473
|
+
|
474
|
+
IOHIDPostEvent(screen_connection, NX_FLAGSCHANGED, point, &data, kNXEventDataVersion, flags, 0);
|
475
|
+
|
476
|
+
// spin rims while we wait for the screen to fully wake up
|
477
|
+
spin(1);
|
478
|
+
|
479
|
+
return Qtrue;
|
480
|
+
}
|
481
|
+
|
482
|
+
|
483
|
+
|
484
|
+
|
485
|
+
// Find and return the dictionary that has the battery info
|
486
|
+
static
|
487
|
+
CFDictionaryRef
|
488
|
+
battery_info()
|
489
|
+
{
|
490
|
+
CFTypeRef psource_info = IOPSCopyPowerSourcesInfo();
|
491
|
+
CFArrayRef psources = IOPSCopyPowerSourcesList(psource_info);
|
492
|
+
|
493
|
+
// constant global strings (like ruby symbols, or lisp atoms, NXAtom, etc)
|
494
|
+
// so we do not need to release it later (unless you really want to)
|
495
|
+
CFStringRef type_key = CFSTR(kIOPSTypeKey);
|
496
|
+
CFStringRef battery_key = CFSTR(kIOPSInternalBatteryType);
|
497
|
+
|
498
|
+
CFIndex length = CFArrayGetCount(psources);
|
499
|
+
for (CFIndex i = 0; i < length; i++) {
|
500
|
+
|
501
|
+
CFTypeRef psource = CFArrayGetValueAtIndex(psources, i);
|
502
|
+
CFDictionaryRef source_info = IOPSGetPowerSourceDescription(psource_info, psource);
|
503
|
+
CFRetain(source_info);
|
504
|
+
|
505
|
+
if (CFEqual(CFDictionaryGetValue(source_info, type_key), battery_key)) {
|
506
|
+
CFRelease(psources);
|
507
|
+
CFRelease(psource_info);
|
508
|
+
return source_info;
|
509
|
+
}
|
510
|
+
else {
|
511
|
+
CFRelease(source_info);
|
512
|
+
}
|
513
|
+
}
|
514
|
+
|
515
|
+
CFRelease(psources);
|
516
|
+
CFRelease(psource_info);
|
517
|
+
return NULL;
|
518
|
+
}
|
519
|
+
|
520
|
+
/*
|
521
|
+
* Returns the current battery state
|
522
|
+
*
|
523
|
+
* The state will be one of:
|
524
|
+
*
|
525
|
+
* - `:not_installed`
|
526
|
+
* - `:charged`
|
527
|
+
* - `:charging`
|
528
|
+
* - `:discharging`
|
529
|
+
*
|
530
|
+
* @return [Symbol]
|
531
|
+
*/
|
532
|
+
static
|
533
|
+
VALUE
|
534
|
+
rb_battery_state(VALUE self)
|
535
|
+
{
|
536
|
+
// constant global strings (like ruby symbols, or lisp atoms, NXAtom, etc)
|
537
|
+
// so we do not need to release it later (unless you really want to)
|
538
|
+
CFStringRef charged_key = CFSTR(kIOPSIsChargedKey);
|
539
|
+
CFStringRef charging_key = CFSTR(kIOPSIsChargingKey);
|
540
|
+
|
541
|
+
VALUE state = battery_not_installed;
|
542
|
+
CFDictionaryRef info = battery_info();
|
543
|
+
|
544
|
+
if (info) {
|
545
|
+
if (CFDictionaryGetValue(info, charged_key) == kCFBooleanTrue)
|
546
|
+
state = battery_charged;
|
547
|
+
else if (CFDictionaryGetValue(info, charging_key) == kCFBooleanTrue)
|
548
|
+
state = battery_charging;
|
549
|
+
else
|
550
|
+
state = battery_discharging;
|
551
|
+
|
552
|
+
CFRelease(info);
|
553
|
+
}
|
554
|
+
|
555
|
+
return state;
|
556
|
+
}
|
557
|
+
|
558
|
+
/*
|
559
|
+
* Returns the batteries charge level as a percentage from 0 to 1
|
560
|
+
*
|
561
|
+
* A special value of `-1.0` is returned when there is no battery present.
|
562
|
+
*
|
563
|
+
* @return [Float]
|
564
|
+
*/
|
565
|
+
static
|
566
|
+
VALUE
|
567
|
+
rb_battery_level(VALUE self)
|
568
|
+
{
|
569
|
+
// constant global strings (like ruby symbols, or lisp atoms, NXAtom, etc)
|
570
|
+
// so we do not need to release it later (unless you really want to)
|
571
|
+
CFStringRef capacity_key = CFSTR(kIOPSCurrentCapacityKey);
|
572
|
+
CFStringRef max_capacity_key = CFSTR(kIOPSMaxCapacityKey);
|
573
|
+
|
574
|
+
double level = -1.0;
|
575
|
+
CFDictionaryRef info = battery_info();
|
576
|
+
|
577
|
+
if (info) {
|
578
|
+
CFNumberRef current_cap = CFDictionaryGetValue(info, capacity_key);
|
579
|
+
CFNumberRef max_cap = CFDictionaryGetValue(info, max_capacity_key);
|
580
|
+
|
581
|
+
if (current_cap && max_cap) {
|
582
|
+
int current = 0;
|
583
|
+
int max = 0;
|
584
|
+
|
585
|
+
CFNumberGetValue(current_cap, kCFNumberIntType, ¤t);
|
586
|
+
CFNumberGetValue(max_cap, kCFNumberIntType, &max);
|
587
|
+
|
588
|
+
level = ((double)current)/((double)max);
|
589
|
+
}
|
590
|
+
|
591
|
+
CFRelease(info);
|
592
|
+
}
|
593
|
+
|
594
|
+
return DBL2NUM(level);
|
595
|
+
}
|
596
|
+
|
597
|
+
|
598
|
+
/*
|
599
|
+
* Returns the estimated number of minutes until the battery is fully discharged
|
600
|
+
*
|
601
|
+
* A special value of `-1` indicates that the value is currently being
|
602
|
+
* estimated and you should try again later.
|
603
|
+
*
|
604
|
+
* A special value of `0` indicates that the battery is not discharging,
|
605
|
+
* which usually means that the battery does not exist or is in a
|
606
|
+
* charging/charged state.
|
607
|
+
*
|
608
|
+
* @return [Fixnum]
|
609
|
+
*/
|
610
|
+
static
|
611
|
+
VALUE
|
612
|
+
rb_battery_time_to_empty(VALUE self)
|
613
|
+
{
|
614
|
+
CFStringRef ttempty_key = CFSTR(kIOPSTimeToEmptyKey);
|
615
|
+
int time = -1;
|
616
|
+
CFDictionaryRef info = battery_info();
|
617
|
+
|
618
|
+
if (info) {
|
619
|
+
CFNumberRef current_time = CFDictionaryGetValue(info, ttempty_key);
|
620
|
+
if (current_time)
|
621
|
+
CFNumberGetValue(current_time, kCFNumberIntType, &time);
|
622
|
+
|
623
|
+
CFRelease(info);
|
624
|
+
}
|
625
|
+
|
626
|
+
if (time)
|
627
|
+
return INT2FIX(time);
|
628
|
+
else
|
629
|
+
return INT2FIX(0);
|
630
|
+
}
|
631
|
+
|
632
|
+
|
633
|
+
/*
|
634
|
+
* Returns the estimated number of minutes until the battery is fully charged
|
635
|
+
*
|
636
|
+
* A special value of `-1` indicates that the value is currently being
|
637
|
+
* estimated and you should try again later.
|
638
|
+
*
|
639
|
+
* @return [Fixnum]
|
640
|
+
*/
|
641
|
+
static
|
642
|
+
VALUE
|
643
|
+
rb_battery_time_full_charge(VALUE self)
|
644
|
+
{
|
645
|
+
CFStringRef ttfull_key = CFSTR(kIOPSTimeToFullChargeKey);
|
646
|
+
int time = -1;
|
647
|
+
CFDictionaryRef info = battery_info();
|
648
|
+
|
649
|
+
if (info) {
|
650
|
+
CFNumberRef current_time = CFDictionaryGetValue(info, ttfull_key);
|
651
|
+
if (current_time)
|
652
|
+
CFNumberGetValue(current_time, kCFNumberIntType, &time);
|
653
|
+
|
654
|
+
CFRelease(info);
|
655
|
+
}
|
656
|
+
|
657
|
+
return INT2FIX(time);
|
658
|
+
}
|
659
|
+
|
660
|
+
|
661
|
+
|
662
|
+
|
663
|
+
void
|
664
|
+
Init_extras()
|
665
|
+
{
|
666
|
+
Init_bridge();
|
667
|
+
|
668
|
+
// force Ruby to be registered as an app with the system
|
669
|
+
[NSApplication sharedApplication];
|
670
|
+
|
671
|
+
#ifdef NOT_MACRUBY
|
672
|
+
|
673
|
+
/*
|
674
|
+
* Document-class: NSRunningApplication
|
675
|
+
*
|
676
|
+
* A 99% drop-in replacement for Cocoa's `NSWorkspace` class on MRI and other
|
677
|
+
* non-MacRuby rubies.
|
678
|
+
*
|
679
|
+
* See [Apple's Developer Reference](https://developer.apple.com/library/mac/#documentation/AppKit/Reference/NSRunningApplication_Class/Reference/Reference.html)
|
680
|
+
* for documentation on the methods in this class.
|
681
|
+
*/
|
682
|
+
rb_cRunningApp = rb_define_class("NSRunningApplication", rb_cObject);
|
683
|
+
|
684
|
+
rb_define_singleton_method(rb_cRunningApp, "runningApplicationWithProcessIdentifier", rb_running_app_with_pid, 1);
|
685
|
+
rb_define_singleton_method(rb_cRunningApp, "runningApplicationsWithBundleIdentifier", rb_running_app_with_bundle_id, 1);
|
686
|
+
rb_define_singleton_method(rb_cRunningApp, "currentApplication", rb_running_app_current_app, 0);
|
687
|
+
rb_define_singleton_method(rb_cRunningApp, "terminateAutomaticallyTerminableApplications", rb_running_app_drop_nuke, 0);
|
688
|
+
|
689
|
+
rb_define_method(rb_cRunningApp, "active?", rb_running_app_is_active, 0);
|
690
|
+
rb_define_method(rb_cRunningApp, "activateWithOptions", rb_running_app_activate, 1);
|
691
|
+
rb_define_method(rb_cRunningApp, "activationPolicy", rb_running_app_activation_policy, 0);
|
692
|
+
rb_define_method(rb_cRunningApp, "hide", rb_running_app_hide, 0);
|
693
|
+
rb_define_method(rb_cRunningApp, "unhide", rb_running_app_unhide, 0);
|
694
|
+
rb_define_method(rb_cRunningApp, "hidden?", rb_running_app_is_hidden, 0);
|
695
|
+
rb_define_method(rb_cRunningApp, "localizedName", rb_running_app_localized_name, 0);
|
696
|
+
//rb_define_method(rb_cRunningApp, "icon", rb_running_app_icon, 0);
|
697
|
+
rb_define_method(rb_cRunningApp, "bundleIdentifier", rb_running_app_bundle_id, 0);
|
698
|
+
rb_define_method(rb_cRunningApp, "bundleURL", rb_running_app_bundle_url, 0);
|
699
|
+
rb_define_method(rb_cRunningApp, "executableArchitecture", rb_running_app_executable_arch, 0);
|
700
|
+
rb_define_method(rb_cRunningApp, "executableURL", rb_running_app_executable_url, 0);
|
701
|
+
rb_define_method(rb_cRunningApp, "launchDate", rb_running_app_launch_date, 0);
|
702
|
+
rb_define_method(rb_cRunningApp, "finishedLaunching?", rb_running_app_is_launched, 0);
|
703
|
+
rb_define_method(rb_cRunningApp, "processIdentifier", rb_running_app_pid, 0);
|
704
|
+
rb_define_method(rb_cRunningApp, "ownsMenuBar", rb_running_app_owns_menu_bar, 0);
|
705
|
+
rb_define_alias(rb_cRunningApp, "ownsMenuBar?", "ownsMenuBar");
|
706
|
+
rb_define_method(rb_cRunningApp, "forceTerminate", rb_running_app_force_terminate, 0);
|
707
|
+
rb_define_method(rb_cRunningApp, "terminate", rb_running_app_terminate, 0);
|
708
|
+
rb_define_method(rb_cRunningApp, "terminated?", rb_running_app_is_terminated, 0);
|
709
|
+
rb_define_method(rb_cRunningApp, "==", rb_running_app_equality, 1);
|
710
|
+
|
711
|
+
// Technically these are global constants, but in MacRuby you can still access them from any
|
712
|
+
// namespace. So, we will try by first adding them to the NSRunningApplication namespae only
|
713
|
+
#define RUNNING_APP_CONST(str, val) rb_define_const(rb_cRunningApp, str, INT2FIX(val));
|
714
|
+
if (!rb_const_defined_at(rb_cRunningApp, rb_intern("NSApplicationActivateAllWindows"))) {
|
715
|
+
RUNNING_APP_CONST("NSApplicationActivateAllWindows", NSApplicationActivateAllWindows);
|
716
|
+
RUNNING_APP_CONST("NSApplicationActivateIgnoringOtherApps", NSApplicationActivateIgnoringOtherApps);
|
717
|
+
|
718
|
+
RUNNING_APP_CONST("NSBundleExecutableArchitectureI386", NSBundleExecutableArchitectureI386);
|
719
|
+
RUNNING_APP_CONST("NSBundleExecutableArchitecturePPC", NSBundleExecutableArchitecturePPC);
|
720
|
+
RUNNING_APP_CONST("NSBundleExecutableArchitectureX86_64", NSBundleExecutableArchitectureX86_64);
|
721
|
+
RUNNING_APP_CONST("NSBundleExecutableArchitecturePPC64", NSBundleExecutableArchitecturePPC64);
|
722
|
+
}
|
723
|
+
|
724
|
+
|
725
|
+
/*
|
726
|
+
* Document-class: NSWorkspace
|
727
|
+
*
|
728
|
+
* A subset of Cocoa's `NSWorkspace` class.
|
729
|
+
*
|
730
|
+
* See [Apple's Developer Reference](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSWorkspace_Class/Reference/Reference.html)
|
731
|
+
* for documentation on the methods available in this class.
|
732
|
+
*/
|
733
|
+
rb_cWorkspace = rb_define_class("NSWorkspace", rb_cObject);
|
734
|
+
|
735
|
+
rb_define_singleton_method(rb_cWorkspace, "runningApplications", rb_workspace_running_apps, 0);
|
736
|
+
rb_define_singleton_method(rb_cWorkspace, "sharedWorkspace", rb_workspace_shared, 0);
|
737
|
+
rb_define_singleton_method(rb_cWorkspace, "frontmostApplication", rb_workspace_frontmost_app, 0);
|
738
|
+
rb_define_singleton_method(rb_cWorkspace, "menuBarOwningApplication", rb_workspace_menu_bar_owner, 0);
|
739
|
+
rb_define_singleton_method(rb_cWorkspace, "showSearchResultsForQueryString", rb_workspace_find, 1);
|
740
|
+
rb_define_singleton_method(rb_cWorkspace, "launchAppWithBundleIdentifier", rb_workspace_launch, 2);
|
741
|
+
|
742
|
+
key_opts = ID2SYM(rb_intern("options"));
|
743
|
+
// key_event_params = ID2SYM(rb_intern("additionalEventParamDescriptor"));
|
744
|
+
// key_launch_id = ID2SYM(rb_intern("launchIdentifier"));
|
745
|
+
|
746
|
+
#define WORKSPACE_CONST(str, val) rb_define_const(rb_cWorkspace, str, INT2FIX(val));
|
747
|
+
if (!rb_const_defined_at(rb_cWorkspace, rb_intern("NSWorkspaceLaunchAndPrint"))) {
|
748
|
+
WORKSPACE_CONST("NSWorkspaceLaunchAndPrint", NSWorkspaceLaunchAndPrint);
|
749
|
+
WORKSPACE_CONST("NSWorkspaceLaunchInhibitingBackgroundOnly", NSWorkspaceLaunchInhibitingBackgroundOnly);
|
750
|
+
WORKSPACE_CONST("NSWorkspaceLaunchWithoutAddingToRecents", NSWorkspaceLaunchWithoutAddingToRecents);
|
751
|
+
WORKSPACE_CONST("NSWorkspaceLaunchWithoutActivation", NSWorkspaceLaunchWithoutActivation);
|
752
|
+
WORKSPACE_CONST("NSWorkspaceLaunchAsync", NSWorkspaceLaunchAsync);
|
753
|
+
WORKSPACE_CONST("NSWorkspaceLaunchAllowingClassicStartup", NSWorkspaceLaunchAllowingClassicStartup);
|
754
|
+
WORKSPACE_CONST("NSWorkspaceLaunchPreferringClassic", NSWorkspaceLaunchPreferringClassic);
|
755
|
+
WORKSPACE_CONST("NSWorkspaceLaunchNewInstance", NSWorkspaceLaunchNewInstance);
|
756
|
+
WORKSPACE_CONST("NSWorkspaceLaunchAndHide", NSWorkspaceLaunchAndHide);
|
757
|
+
WORKSPACE_CONST("NSWorkspaceLaunchAndHideOthers", NSWorkspaceLaunchAndHideOthers);
|
758
|
+
WORKSPACE_CONST("NSWorkspaceLaunchDefault", NSWorkspaceLaunchDefault);
|
759
|
+
}
|
760
|
+
|
761
|
+
|
762
|
+
/*
|
763
|
+
* Document-class: NSProcessInfo
|
764
|
+
*
|
765
|
+
* A subset of Cocoa's `NSProcessInfo` class. Methods that might be
|
766
|
+
* useful to have been bridged.
|
767
|
+
*
|
768
|
+
* See [Apple's Developer Reference](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSProcessInfo_Class/Reference/Reference.html)
|
769
|
+
* for documentation on the methods available in this class.
|
770
|
+
*/
|
771
|
+
rb_cProcInfo = rb_define_class("NSProcessInfo", rb_cObject);
|
772
|
+
|
773
|
+
rb_define_singleton_method(rb_cProcInfo, "processInfo", rb_procinfo_self, 0);
|
774
|
+
rb_define_singleton_method(rb_cProcInfo, "operatingSystemVersionString", rb_procinfo_os_version, 0);
|
775
|
+
rb_define_singleton_method(rb_cProcInfo, "systemUptime", rb_procinfo_sys_uptime, 0);
|
776
|
+
rb_define_singleton_method(rb_cProcInfo, "processorCount", rb_procinfo_cpu_count, 0);
|
777
|
+
rb_define_singleton_method(rb_cProcInfo, "activeProcessorCount", rb_procinfo_active_cpus, 0);
|
778
|
+
rb_define_singleton_method(rb_cProcInfo, "physicalMemory", rb_procinfo_total_ram, 0);
|
779
|
+
|
780
|
+
|
781
|
+
/*
|
782
|
+
* Document-class: NSHost
|
783
|
+
*
|
784
|
+
* A large subset of Cocoa's `NSHost` class. Methods that might be
|
785
|
+
* useful to have have been bridged.
|
786
|
+
*
|
787
|
+
* See [Apple's Developer Reference](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSHost_Class/Reference/Reference.html)
|
788
|
+
* for documentation on the methods available in this class.
|
789
|
+
*/
|
790
|
+
rb_cHost = rb_define_class("NSHost", rb_cObject);
|
791
|
+
|
792
|
+
rb_define_singleton_method(rb_cHost, "currentHost", rb_host_self, 0);
|
793
|
+
rb_define_singleton_method(rb_cHost, "names", rb_host_names, 0);
|
794
|
+
rb_define_singleton_method(rb_cHost, "addresses", rb_host_addresses, 0);
|
795
|
+
rb_define_singleton_method(rb_cHost, "localizedName", rb_host_localized_name, 0);
|
796
|
+
#endif
|
797
|
+
|
798
|
+
|
799
|
+
/*
|
800
|
+
* Document-class: NSScreen
|
801
|
+
*
|
802
|
+
* A small subset of Cocoa's `NSScreen` class. Methods that might be
|
803
|
+
* useful to have have been bridged.
|
804
|
+
*
|
805
|
+
* See [Apple's Developer Reference](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSScreen_Class/Reference/Reference.html)
|
806
|
+
* for documentation on the methods available in this class.
|
807
|
+
*/
|
808
|
+
rb_cScreen = rb_define_class("NSScreen", rb_cObject);
|
809
|
+
|
810
|
+
#ifdef NOT_MACRUBY
|
811
|
+
rb_define_singleton_method(rb_cScreen, "mainScreen", rb_screen_main, 0);
|
812
|
+
rb_define_singleton_method(rb_cScreen, "screens", rb_screen_screens, 0);
|
813
|
+
rb_define_singleton_method(rb_cScreen, "wakeup", rb_screen_wake, 0); // our custom method
|
814
|
+
rb_define_method( rb_cScreen, "frame", rb_screen_frame, 0);
|
815
|
+
#else
|
816
|
+
rb_objc_define_method(*(VALUE*)rb_cScreen, "wakeup", rb_screen_wake, 0);
|
817
|
+
#endif
|
818
|
+
|
819
|
+
|
820
|
+
/*
|
821
|
+
* Document-module: Battery
|
822
|
+
*
|
823
|
+
* Utility methods for getting information about the system battery
|
824
|
+
* (if present).
|
825
|
+
*/
|
826
|
+
rb_mBattery = rb_define_module("Battery");
|
827
|
+
rb_extend_object(rb_mBattery, rb_mBattery);
|
828
|
+
|
829
|
+
battery_not_installed = ID2SYM(rb_intern("not_installed"));
|
830
|
+
battery_charged = ID2SYM(rb_intern("charged"));
|
831
|
+
battery_charging = ID2SYM(rb_intern("charging"));
|
832
|
+
battery_discharging = ID2SYM(rb_intern("discharging"));
|
833
|
+
|
834
|
+
rb_define_method(rb_mBattery, "state", rb_battery_state, 0);
|
835
|
+
rb_define_method(rb_mBattery, "level", rb_battery_level, 0);
|
836
|
+
rb_define_method(rb_mBattery, "time_to_discharged", rb_battery_time_to_empty, 0);
|
837
|
+
rb_define_method(rb_mBattery, "time_to_charged", rb_battery_time_full_charge, 0);
|
838
|
+
|
839
|
+
rb_define_alias(rb_mBattery, "charge_level", "level");
|
840
|
+
rb_define_alias(rb_mBattery, "time_to_empty", "time_to_discharged");
|
841
|
+
rb_define_alias(rb_mBattery, "time_to_full_charge", "time_to_charged");
|
842
|
+
}
|