x_do 0.1.1 → 0.1.2
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/Gemfile +5 -6
- data/Gemfile.lock +20 -17
- data/README.rdoc +1 -1
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/lib/x_do/context.rb +1 -0
- data/lib/x_do/ffi_autogen.rb +19 -6
- data/lib/x_do/ffi_functions.rb +2 -0
- data/lib/x_do/ffi_lib.rb +7 -2
- data/lib/x_do/ffi_lib_ext.rb +5 -1
- data/lib/x_do/keyboard.rb +3 -3
- data/lib/x_do/window.rb +20 -0
- data/spec/x_do/context_spec.rb +16 -0
- data/spec/x_do/ffi_lib_ext_spec.rb +14 -0
- data/spec/x_do/keyboard_spec.rb +3 -3
- data/spec/x_do/window_spec.rb +13 -4
- data/tasks/ffi_codegen.rb +9 -0
- data/x_do.gemspec +20 -26
- metadata +115 -170
data/Gemfile
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
source 'http://rubygems.org'
|
2
|
-
|
2
|
+
|
3
3
|
gem 'ffi', '>= 1.0.0'
|
4
4
|
|
5
|
-
# Add dependencies to develop your gem here.
|
6
|
-
# Include everything needed to run rake, tests, features, etc.
|
7
5
|
group :development do
|
8
|
-
gem '
|
9
|
-
gem '
|
10
|
-
gem '
|
6
|
+
gem 'rdoc', '>= 3.12'
|
7
|
+
gem 'rspec', '>= 2.8.0'
|
8
|
+
gem 'bundler', '>= 1.0.0'
|
9
|
+
gem 'jeweler', '>= 1.6.4'
|
11
10
|
gem 'rcov', '>= 0'
|
12
11
|
end
|
data/Gemfile.lock
CHANGED
@@ -1,31 +1,34 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
diff-lcs (1.1.
|
5
|
-
ffi (1.0.
|
6
|
-
rake (>= 0.8.7)
|
4
|
+
diff-lcs (1.1.3)
|
5
|
+
ffi (1.0.11)
|
7
6
|
git (1.2.5)
|
8
|
-
jeweler (1.
|
9
|
-
bundler (~> 1.0
|
7
|
+
jeweler (1.6.4)
|
8
|
+
bundler (~> 1.0)
|
10
9
|
git (>= 1.2.5)
|
11
10
|
rake
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
11
|
+
json (1.6.4)
|
12
|
+
rake (0.9.2.2)
|
13
|
+
rcov (0.9.11)
|
14
|
+
rdoc (3.12)
|
15
|
+
json (~> 1.4)
|
16
|
+
rspec (2.8.0)
|
17
|
+
rspec-core (~> 2.8.0)
|
18
|
+
rspec-expectations (~> 2.8.0)
|
19
|
+
rspec-mocks (~> 2.8.0)
|
20
|
+
rspec-core (2.8.0)
|
21
|
+
rspec-expectations (2.8.0)
|
20
22
|
diff-lcs (~> 1.1.2)
|
21
|
-
rspec-mocks (2.
|
23
|
+
rspec-mocks (2.8.0)
|
22
24
|
|
23
25
|
PLATFORMS
|
24
26
|
ruby
|
25
27
|
|
26
28
|
DEPENDENCIES
|
27
|
-
bundler (
|
29
|
+
bundler (>= 1.0.0)
|
28
30
|
ffi (>= 1.0.0)
|
29
|
-
jeweler (
|
31
|
+
jeweler (>= 1.6.4)
|
30
32
|
rcov
|
31
|
-
|
33
|
+
rdoc (>= 3.12)
|
34
|
+
rspec (>= 2.8.0)
|
data/README.rdoc
CHANGED
@@ -14,7 +14,7 @@ Up-to-date RDocs are available at http://rdoc.info/github/pwnall/x_do/frames
|
|
14
14
|
|
15
15
|
Tests require that xdotool is installed and on your path. On an Ubuntu system, you can get it by installing the xdotool package.
|
16
16
|
|
17
|
-
The terminal running the tests should remain focused while the suite runs, otherwise some tests will fail.
|
17
|
+
The terminal running the tests should remain focused while the suite runs, otherwise some tests will fail. The window should also not be maximized.
|
18
18
|
|
19
19
|
== Contributing to x_do
|
20
20
|
|
data/Rakefile
CHANGED
@@ -42,7 +42,7 @@ end
|
|
42
42
|
|
43
43
|
task :default => :spec
|
44
44
|
|
45
|
-
require '
|
45
|
+
require 'rdoc/task'
|
46
46
|
Rake::RDocTask.new do |rdoc|
|
47
47
|
version = File.exist?('VERSION') ? File.read('VERSION') : ''
|
48
48
|
|
@@ -52,6 +52,6 @@ Rake::RDocTask.new do |rdoc|
|
|
52
52
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
53
53
|
end
|
54
54
|
|
55
|
-
|
55
|
+
load 'tasks/ffi_codegen.rb'
|
56
56
|
task :package => :ffi_header
|
57
57
|
task :spec => :ffi_header
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.2
|
data/lib/x_do/context.rb
CHANGED
@@ -52,6 +52,7 @@ class XDo
|
|
52
52
|
# :class_name:: grep pattern that the window class (name?) has to match
|
53
53
|
# :pid:: only return windows whose process ID equals this
|
54
54
|
# :screen:: only return windows in this screen number
|
55
|
+
# :desktop:: only return windows with this desktop number
|
55
56
|
# :visible:: if true, only visible windows will be returned
|
56
57
|
#
|
57
58
|
# Returns an array of Window instances that match the query.
|
data/lib/x_do/ffi_autogen.rb
CHANGED
@@ -7,30 +7,43 @@ class XDo
|
|
7
7
|
module FFILib
|
8
8
|
# Constant values extracted from headers.
|
9
9
|
module Consts
|
10
|
-
XDO_SUCCESS = 0
|
11
10
|
XDO_ERROR = 1
|
12
|
-
|
13
|
-
SEARCH_ANY = nil
|
14
|
-
SEARCH_ALL = nil
|
11
|
+
XDO_SUCCESS = 0
|
15
12
|
SEARCH_TITLE = 0x0001
|
16
13
|
SEARCH_CLASS = 0x0002
|
17
14
|
SEARCH_NAME = 0x0004
|
15
|
+
SEARCH_PID = 0x0008
|
16
|
+
SEARCH_ONLYVISIBLE = 0x0010
|
18
17
|
SEARCH_SCREEN = 0x0020
|
19
18
|
SEARCH_CLASSNAME = 0x0040
|
20
|
-
|
19
|
+
SEARCH_DESKTOP = 0x0080
|
20
|
+
SEARCH_ANY = nil
|
21
|
+
SEARCH_ALL = nil
|
21
22
|
SIZE_USEHINTS = 1
|
23
|
+
SIZE_USEHINTS_X = 2
|
24
|
+
SIZE_USEHINTS_Y = 4
|
22
25
|
SIZE_TO = 0
|
23
26
|
SIZE_FROM = 1
|
27
|
+
XDO_FIND_PARENTS = 0
|
28
|
+
XDO_FIND_CHILDREN = 1
|
29
|
+
XDO_FEATURE_XTEST = nil
|
24
30
|
end # module XDo::FFILib::Consts
|
25
31
|
|
26
32
|
# Status returned by libxdo functions.
|
27
33
|
Status = enum [
|
28
|
-
:success, Consts::XDO_SUCCESS,
|
29
34
|
:error, Consts::XDO_ERROR,
|
35
|
+
:success, Consts::XDO_SUCCESS,
|
30
36
|
]
|
31
37
|
|
32
38
|
# Search directions.
|
33
39
|
Direction = enum [
|
40
|
+
:parents, Consts::XDO_FIND_PARENTS,
|
41
|
+
:children, Consts::XDO_FIND_CHILDREN,
|
42
|
+
]
|
43
|
+
|
44
|
+
# Optional features.
|
45
|
+
Feature = enum [
|
46
|
+
:xtest, Consts::XDO_FEATURE_XTEST,
|
34
47
|
]
|
35
48
|
|
36
49
|
end # namespace XDo::FFILib
|
data/lib/x_do/ffi_functions.rb
CHANGED
@@ -24,6 +24,8 @@ module FFILib
|
|
24
24
|
attach_function :xdo_window_focus, [:pointer, :window], XDo::FFILib::Status
|
25
25
|
attach_function :xdo_window_raise, [:pointer, :window], XDo::FFILib::Status
|
26
26
|
|
27
|
+
attach_function :xdo_get_window_name, [:pointer, :window, :pointer, :pointer,
|
28
|
+
:pointer], XDo::FFILib::Status
|
27
29
|
attach_function :xdo_get_window_location, [:pointer, :window, :pointer,
|
28
30
|
:pointer, :pointer],
|
29
31
|
XDo::FFILib::Status
|
data/lib/x_do/ffi_lib.rb
CHANGED
@@ -19,7 +19,10 @@ module FFILib
|
|
19
19
|
:keycode_high, :int,
|
20
20
|
:keycode_low, :int,
|
21
21
|
:keysyms_per_keycode, :int,
|
22
|
-
:close_display_when_freed, :int
|
22
|
+
:close_display_when_freed, :int,
|
23
|
+
:quiet, :int,
|
24
|
+
:debug, :int,
|
25
|
+
:features_mask, :int
|
23
26
|
end # class XDo::FFILib::XDoContext
|
24
27
|
|
25
28
|
# :nodoc: lifted from xdo.h
|
@@ -33,7 +36,9 @@ module FFILib
|
|
33
36
|
:only_visible, :int,
|
34
37
|
:screen, :int,
|
35
38
|
:require, :int,
|
36
|
-
:searchmask, :int
|
39
|
+
:searchmask, :int,
|
40
|
+
:desktop, :long,
|
41
|
+
:limit, :uint
|
37
42
|
end # class XDo::FFILib::XDoSearch
|
38
43
|
|
39
44
|
# :nodoc: Window from X11/X.h (Window -> XID -> unsigned long)
|
data/lib/x_do/ffi_lib_ext.rb
CHANGED
@@ -43,7 +43,9 @@ class XDoSearch
|
|
43
43
|
|
44
44
|
[
|
45
45
|
[:pid, :pid, XDo::FFILib::Consts::SEARCH_PID],
|
46
|
-
[:screen, :screen, XDo::FFILib::Consts::SEARCH_SCREEN]
|
46
|
+
[:screen, :screen, XDo::FFILib::Consts::SEARCH_SCREEN],
|
47
|
+
[:desktop, :desktop, XDo::FFILib::Consts::SEARCH_DESKTOP]
|
48
|
+
|
47
49
|
].each do |option, struct_key, bit|
|
48
50
|
if options[option]
|
49
51
|
search[:searchmask] |= bit
|
@@ -53,6 +55,8 @@ class XDoSearch
|
|
53
55
|
end
|
54
56
|
end
|
55
57
|
|
58
|
+
search[:limit] = options[:limit].to_i || 0
|
59
|
+
|
56
60
|
search
|
57
61
|
end
|
58
62
|
end # class XDo::FFILib::XDoSearch
|
data/lib/x_do/keyboard.rb
CHANGED
@@ -23,7 +23,7 @@ class Keyboard
|
|
23
23
|
XDo::FFILib.xdo_type @_xdo_pointer, 0, string, (delay * 1_000_000).to_i
|
24
24
|
end
|
25
25
|
|
26
|
-
# Sends a keysequence to
|
26
|
+
# Sends a keysequence to the active window.
|
27
27
|
#
|
28
28
|
# Examples: "alt+Return", "Alt_L+Tab", "l", "semicolon"
|
29
29
|
def type_keysequence(keysequence, delay = 0.012)
|
@@ -31,7 +31,7 @@ class Keyboard
|
|
31
31
|
(delay * 1_000_000).to_i
|
32
32
|
end
|
33
33
|
|
34
|
-
# Presses a keysequence in
|
34
|
+
# Presses a keysequence in the active window.
|
35
35
|
#
|
36
36
|
# Examples: "alt+Return", "Alt_L+Tab", "l", "semicolon"
|
37
37
|
def press_keysequence(keysequence, delay = 0.012)
|
@@ -39,7 +39,7 @@ class Keyboard
|
|
39
39
|
(delay * 1_000_000).to_i
|
40
40
|
end
|
41
41
|
|
42
|
-
# Releases a keysequence in
|
42
|
+
# Releases a keysequence in the active window.
|
43
43
|
#
|
44
44
|
# Examples: "alt+Return", "Alt_L+Tab", "l", "semicolon"
|
45
45
|
def release_keysequence(keysequence, delay = 0.012)
|
data/lib/x_do/window.rb
CHANGED
@@ -23,6 +23,17 @@ class Window
|
|
23
23
|
XDo::FFILib.xdo_window_get_pid @_xdo_pointer, @_window
|
24
24
|
end
|
25
25
|
|
26
|
+
# The name of the window.
|
27
|
+
def name
|
28
|
+
name_ppointer = FFI::MemoryPointer.new :pointer, 1
|
29
|
+
len_pointer = FFI::MemoryPointer.new :int, 1
|
30
|
+
name_type_pointer = FFI::MemoryPointer.new :int, 1
|
31
|
+
XDo::FFILib.xdo_get_window_name @_xdo_pointer, @_window, name_ppointer,
|
32
|
+
len_pointer, name_type_pointer
|
33
|
+
name_pointer = name_ppointer.read_pointer
|
34
|
+
name_pointer.nil? ? nil : name_pointer.read_string(len_pointer.read_int)
|
35
|
+
end
|
36
|
+
|
26
37
|
# [x, y] array containing the window's coordinates.
|
27
38
|
def location
|
28
39
|
x_pointer = FFI::MemoryPointer.new :int, 1
|
@@ -178,6 +189,15 @@ class Window
|
|
178
189
|
def hash
|
179
190
|
_window.hash
|
180
191
|
end
|
192
|
+
|
193
|
+
# :nodoc: override to_s for so Windows don't look so bad
|
194
|
+
def to_s
|
195
|
+
name_str = name.inspect
|
196
|
+
at_str = location.inspect
|
197
|
+
size_str = size.inspect
|
198
|
+
"#<XDo::Window:#{_window} pid=#{pid} title=#{name.inspect} at=#{at_str} " +
|
199
|
+
"size=#{size_str}>"
|
200
|
+
end
|
181
201
|
end # class XDo::Window
|
182
202
|
|
183
203
|
end # namespace XDo
|
data/spec/x_do/context_spec.rb
CHANGED
@@ -66,6 +66,18 @@ describe XDo do
|
|
66
66
|
it 'should include the focused window' do
|
67
67
|
windows.should include(xdo.focused_window)
|
68
68
|
end
|
69
|
+
|
70
|
+
it 'should return more than 3 windows' do
|
71
|
+
windows.should have_at_least(3).windows
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe 'with limit' do
|
76
|
+
let(:windows) { xdo.find_windows :limit => 3 }
|
77
|
+
|
78
|
+
it 'should only return 3 windows' do
|
79
|
+
windows.should have(3).windows
|
80
|
+
end
|
69
81
|
end
|
70
82
|
|
71
83
|
describe 'with the current PID' do
|
@@ -84,6 +96,10 @@ describe XDo do
|
|
84
96
|
it 'should be an XDo::Window' do
|
85
97
|
window.should be_kind_of(XDo::Window)
|
86
98
|
end
|
99
|
+
|
100
|
+
it 'should match the output of xdotool' do
|
101
|
+
window._window.should == `xdotool getactivewindow`.to_i
|
102
|
+
end
|
87
103
|
end
|
88
104
|
|
89
105
|
describe 'focused_window' do
|
@@ -18,6 +18,10 @@ describe XDo::FFILib do
|
|
18
18
|
it 'should set maximum depth to -1' do
|
19
19
|
search[:max_depth].should == -1
|
20
20
|
end
|
21
|
+
|
22
|
+
it 'should set limit to 0' do
|
23
|
+
search[:limit].should == 0
|
24
|
+
end
|
21
25
|
end
|
22
26
|
|
23
27
|
describe 'with a set maximum depth' do
|
@@ -122,5 +126,15 @@ describe XDo::FFILib do
|
|
122
126
|
search[:pid].should == 42
|
123
127
|
end
|
124
128
|
end
|
129
|
+
|
130
|
+
describe 'with a limit' do
|
131
|
+
let(:search) do
|
132
|
+
XDo::FFILib::XDoSearch.from_options :limit => 5
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'should set fields correctly' do
|
136
|
+
search[:limit].should == 5
|
137
|
+
end
|
138
|
+
end
|
125
139
|
end
|
126
140
|
end
|
data/spec/x_do/keyboard_spec.rb
CHANGED
@@ -20,13 +20,13 @@ describe XDo::Keyboard do
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
describe 'after typing
|
23
|
+
describe 'after typing kbd_injected' do
|
24
24
|
before do
|
25
|
-
keyboard.type_string "
|
25
|
+
keyboard.type_string "kbd_injected\n"
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'should reflect the string in gets' do
|
29
|
-
$stdin.gets.should == "
|
29
|
+
$stdin.gets.should == "kbd_injected\n"
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
data/spec/x_do/window_spec.rb
CHANGED
@@ -34,6 +34,14 @@ describe XDo::Window do
|
|
34
34
|
window.pid.should_not == 0
|
35
35
|
end
|
36
36
|
|
37
|
+
describe 'name' do
|
38
|
+
let(:name) { window.name }
|
39
|
+
|
40
|
+
it 'should not be empty' do
|
41
|
+
name.should_not be_empty
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
37
45
|
describe 'location' do
|
38
46
|
let(:location) { window.location }
|
39
47
|
|
@@ -88,6 +96,7 @@ describe XDo::Window do
|
|
88
96
|
size = window.size
|
89
97
|
middle = [size.first / 2, size.last / 2]
|
90
98
|
window.move_mouse(*middle)
|
99
|
+
sleep 0.1
|
91
100
|
end
|
92
101
|
after do
|
93
102
|
xdo.mouse.move(*@old_mouse_location)
|
@@ -117,7 +126,7 @@ describe XDo::Window do
|
|
117
126
|
describe 'after left click outside menu' do
|
118
127
|
before do
|
119
128
|
xdo.mouse.move_relative -20, -20
|
120
|
-
xdo.mouse.click
|
129
|
+
xdo.mouse.click 1
|
121
130
|
sleep 0.1
|
122
131
|
end
|
123
132
|
|
@@ -128,13 +137,13 @@ describe XDo::Window do
|
|
128
137
|
end
|
129
138
|
end
|
130
139
|
|
131
|
-
describe 'after typing
|
140
|
+
describe 'after typing wnd_injected in the window' do
|
132
141
|
before do
|
133
|
-
window.type_string "
|
142
|
+
window.type_string "wnd_injected\n"
|
134
143
|
end
|
135
144
|
|
136
145
|
it 'should reflect the string in gets' do
|
137
|
-
$stdin.gets.should == "
|
146
|
+
$stdin.gets.should == "wnd_injected\n"
|
138
147
|
end
|
139
148
|
end
|
140
149
|
end
|
data/tasks/ffi_codegen.rb
CHANGED
@@ -78,6 +78,10 @@ module Tasks
|
|
78
78
|
sizing_consts = resolve_constants(/^SIZE_/, '%d')
|
79
79
|
# Search direction.
|
80
80
|
direction_consts = resolve_constants(/^XDO_FIND_/, '%d')
|
81
|
+
stat_consts.delete_if { |k, v| direction_consts[k] }
|
82
|
+
# Features.
|
83
|
+
feature_consts = resolve_constants(/^XDO_FEATURE_/, '%d')
|
84
|
+
stat_consts.delete_if { |k, v| feature_consts[k] }
|
81
85
|
|
82
86
|
f.write "# :nodoc: namespace\n"
|
83
87
|
f.write "class XDo\n\n"
|
@@ -90,6 +94,7 @@ module Tasks
|
|
90
94
|
output_constants search_consts, f
|
91
95
|
output_constants sizing_consts, f
|
92
96
|
output_constants direction_consts, f
|
97
|
+
output_constants feature_consts, f
|
93
98
|
f.write " end # module XDo::FFILib::Consts\n\n"
|
94
99
|
|
95
100
|
f.write " # Status returned by libxdo functions.\n"
|
@@ -100,6 +105,10 @@ module Tasks
|
|
100
105
|
output_enum 'Direction', direction_consts, 'XDO_FIND_(.*)', f
|
101
106
|
f.write "\n"
|
102
107
|
|
108
|
+
f.write " # Optional features.\n"
|
109
|
+
output_enum 'Feature', feature_consts, 'XDO_FEATURE_(.*)', f
|
110
|
+
f.write "\n"
|
111
|
+
|
103
112
|
f.write "end # namespace XDo::FFILib\n"
|
104
113
|
f.write "end # namespace XDo\n"
|
105
114
|
end
|
data/x_do.gemspec
CHANGED
@@ -4,14 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.1.
|
7
|
+
s.name = "x_do"
|
8
|
+
s.version = "0.1.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Victor Costan"]
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
12
|
+
s.date = "2012-01-13"
|
13
|
+
s.description = "Wraps libxdo using ffi, for high performance"
|
14
|
+
s.email = "victor@costan.us"
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE.txt",
|
17
17
|
"README.rdoc"
|
@@ -45,29 +45,21 @@ Gem::Specification.new do |s|
|
|
45
45
|
"tasks/ffi_codegen.rb",
|
46
46
|
"x_do.gemspec"
|
47
47
|
]
|
48
|
-
s.homepage =
|
48
|
+
s.homepage = "http://github.com/pwnall/x_do"
|
49
49
|
s.licenses = ["MIT"]
|
50
50
|
s.require_paths = ["lib"]
|
51
|
-
s.rubygems_version =
|
52
|
-
s.summary =
|
53
|
-
s.test_files = [
|
54
|
-
"spec/spec_helper.rb",
|
55
|
-
"spec/support/stdlib.rb",
|
56
|
-
"spec/x_do/context_spec.rb",
|
57
|
-
"spec/x_do/ffi_lib_ext_spec.rb",
|
58
|
-
"spec/x_do/keyboard_spec.rb",
|
59
|
-
"spec/x_do/mouse_spec.rb",
|
60
|
-
"spec/x_do/window_spec.rb"
|
61
|
-
]
|
51
|
+
s.rubygems_version = "1.8.15"
|
52
|
+
s.summary = "Ruby FFI for libxdo (X mouse / keypress injector)"
|
62
53
|
|
63
54
|
if s.respond_to? :specification_version then
|
64
55
|
s.specification_version = 3
|
65
56
|
|
66
57
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
67
58
|
s.add_runtime_dependency(%q<ffi>, [">= 1.0.0"])
|
68
|
-
s.add_development_dependency(%q<
|
69
|
-
s.add_development_dependency(%q<
|
70
|
-
s.add_development_dependency(%q<
|
59
|
+
s.add_development_dependency(%q<rdoc>, [">= 3.12"])
|
60
|
+
s.add_development_dependency(%q<rspec>, [">= 2.8.0"])
|
61
|
+
s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
|
62
|
+
s.add_development_dependency(%q<jeweler>, [">= 1.6.4"])
|
71
63
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
72
64
|
s.add_runtime_dependency(%q<ffi>, [">= 1.0.0"])
|
73
65
|
s.add_development_dependency(%q<rspec>, ["~> 2.5.0"])
|
@@ -76,9 +68,10 @@ Gem::Specification.new do |s|
|
|
76
68
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
77
69
|
else
|
78
70
|
s.add_dependency(%q<ffi>, [">= 1.0.0"])
|
79
|
-
s.add_dependency(%q<
|
80
|
-
s.add_dependency(%q<
|
81
|
-
s.add_dependency(%q<
|
71
|
+
s.add_dependency(%q<rdoc>, [">= 3.12"])
|
72
|
+
s.add_dependency(%q<rspec>, [">= 2.8.0"])
|
73
|
+
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
74
|
+
s.add_dependency(%q<jeweler>, [">= 1.6.4"])
|
82
75
|
s.add_dependency(%q<rcov>, [">= 0"])
|
83
76
|
s.add_dependency(%q<ffi>, [">= 1.0.0"])
|
84
77
|
s.add_dependency(%q<rspec>, ["~> 2.5.0"])
|
@@ -88,9 +81,10 @@ Gem::Specification.new do |s|
|
|
88
81
|
end
|
89
82
|
else
|
90
83
|
s.add_dependency(%q<ffi>, [">= 1.0.0"])
|
91
|
-
s.add_dependency(%q<
|
92
|
-
s.add_dependency(%q<
|
93
|
-
s.add_dependency(%q<
|
84
|
+
s.add_dependency(%q<rdoc>, [">= 3.12"])
|
85
|
+
s.add_dependency(%q<rspec>, [">= 2.8.0"])
|
86
|
+
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
87
|
+
s.add_dependency(%q<jeweler>, [">= 1.6.4"])
|
94
88
|
s.add_dependency(%q<rcov>, [">= 0"])
|
95
89
|
s.add_dependency(%q<ffi>, [">= 1.0.0"])
|
96
90
|
s.add_dependency(%q<rspec>, ["~> 2.5.0"])
|
metadata
CHANGED
@@ -1,188 +1,145 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: x_do
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 1
|
10
|
-
version: 0.1.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Victor Costan
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
requirement: &
|
12
|
+
date: 2012-01-13 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: ffi
|
16
|
+
requirement: &16323440 !ruby/object:Gem::Requirement
|
22
17
|
none: false
|
23
|
-
requirements:
|
24
|
-
- -
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
hash: 23
|
27
|
-
segments:
|
28
|
-
- 1
|
29
|
-
- 0
|
30
|
-
- 0
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
31
21
|
version: 1.0.0
|
32
|
-
version_requirements: *id001
|
33
|
-
name: ffi
|
34
|
-
prerelease: false
|
35
22
|
type: :runtime
|
36
|
-
|
37
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *16323440
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rdoc
|
27
|
+
requirement: &16322640 !ruby/object:Gem::Requirement
|
38
28
|
none: false
|
39
|
-
requirements:
|
40
|
-
- -
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
|
43
|
-
|
44
|
-
- 2
|
45
|
-
- 5
|
46
|
-
- 0
|
47
|
-
version: 2.5.0
|
48
|
-
version_requirements: *id002
|
49
|
-
name: rspec
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '3.12'
|
33
|
+
type: :development
|
50
34
|
prerelease: false
|
35
|
+
version_requirements: *16322640
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rspec
|
38
|
+
requirement: &16321980 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 2.8.0
|
51
44
|
type: :development
|
52
|
-
|
53
|
-
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *16321980
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: bundler
|
49
|
+
requirement: &16321260 !ruby/object:Gem::Requirement
|
54
50
|
none: false
|
55
|
-
requirements:
|
56
|
-
- -
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
hash: 23
|
59
|
-
segments:
|
60
|
-
- 1
|
61
|
-
- 0
|
62
|
-
- 0
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
63
54
|
version: 1.0.0
|
64
|
-
version_requirements: *id003
|
65
|
-
name: bundler
|
66
|
-
prerelease: false
|
67
55
|
type: :development
|
68
|
-
- !ruby/object:Gem::Dependency
|
69
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
70
|
-
none: false
|
71
|
-
requirements:
|
72
|
-
- - ~>
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
hash: 7
|
75
|
-
segments:
|
76
|
-
- 1
|
77
|
-
- 5
|
78
|
-
- 2
|
79
|
-
version: 1.5.2
|
80
|
-
version_requirements: *id004
|
81
|
-
name: jeweler
|
82
56
|
prerelease: false
|
83
|
-
|
84
|
-
- !ruby/object:Gem::Dependency
|
85
|
-
|
57
|
+
version_requirements: *16321260
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: jeweler
|
60
|
+
requirement: &16320480 !ruby/object:Gem::Requirement
|
86
61
|
none: false
|
87
|
-
requirements:
|
88
|
-
- -
|
89
|
-
- !ruby/object:Gem::Version
|
90
|
-
|
91
|
-
|
92
|
-
- 0
|
93
|
-
version: "0"
|
94
|
-
version_requirements: *id005
|
95
|
-
name: rcov
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 1.6.4
|
66
|
+
type: :development
|
96
67
|
prerelease: false
|
68
|
+
version_requirements: *16320480
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rcov
|
71
|
+
requirement: &16319660 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
97
77
|
type: :development
|
98
|
-
|
99
|
-
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *16319660
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: ffi
|
82
|
+
requirement: &16289940 !ruby/object:Gem::Requirement
|
100
83
|
none: false
|
101
|
-
requirements:
|
102
|
-
- -
|
103
|
-
- !ruby/object:Gem::Version
|
104
|
-
hash: 23
|
105
|
-
segments:
|
106
|
-
- 1
|
107
|
-
- 0
|
108
|
-
- 0
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
109
87
|
version: 1.0.0
|
110
|
-
version_requirements: *id006
|
111
|
-
name: ffi
|
112
|
-
prerelease: false
|
113
88
|
type: :runtime
|
114
|
-
|
115
|
-
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *16289940
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: rspec
|
93
|
+
requirement: &16289280 !ruby/object:Gem::Requirement
|
116
94
|
none: false
|
117
|
-
requirements:
|
95
|
+
requirements:
|
118
96
|
- - ~>
|
119
|
-
- !ruby/object:Gem::Version
|
120
|
-
hash: 27
|
121
|
-
segments:
|
122
|
-
- 2
|
123
|
-
- 5
|
124
|
-
- 0
|
97
|
+
- !ruby/object:Gem::Version
|
125
98
|
version: 2.5.0
|
126
|
-
version_requirements: *id007
|
127
|
-
name: rspec
|
128
|
-
prerelease: false
|
129
99
|
type: :development
|
130
|
-
|
131
|
-
|
100
|
+
prerelease: false
|
101
|
+
version_requirements: *16289280
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
name: bundler
|
104
|
+
requirement: &16288220 !ruby/object:Gem::Requirement
|
132
105
|
none: false
|
133
|
-
requirements:
|
106
|
+
requirements:
|
134
107
|
- - ~>
|
135
|
-
- !ruby/object:Gem::Version
|
136
|
-
hash: 23
|
137
|
-
segments:
|
138
|
-
- 1
|
139
|
-
- 0
|
140
|
-
- 0
|
108
|
+
- !ruby/object:Gem::Version
|
141
109
|
version: 1.0.0
|
142
|
-
version_requirements: *id008
|
143
|
-
name: bundler
|
144
|
-
prerelease: false
|
145
110
|
type: :development
|
146
|
-
|
147
|
-
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: *16288220
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: jeweler
|
115
|
+
requirement: &16287340 !ruby/object:Gem::Requirement
|
148
116
|
none: false
|
149
|
-
requirements:
|
117
|
+
requirements:
|
150
118
|
- - ~>
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
hash: 7
|
153
|
-
segments:
|
154
|
-
- 1
|
155
|
-
- 5
|
156
|
-
- 2
|
119
|
+
- !ruby/object:Gem::Version
|
157
120
|
version: 1.5.2
|
158
|
-
version_requirements: *id009
|
159
|
-
name: jeweler
|
160
|
-
prerelease: false
|
161
121
|
type: :development
|
162
|
-
- !ruby/object:Gem::Dependency
|
163
|
-
requirement: &id010 !ruby/object:Gem::Requirement
|
164
|
-
none: false
|
165
|
-
requirements:
|
166
|
-
- - ">="
|
167
|
-
- !ruby/object:Gem::Version
|
168
|
-
hash: 3
|
169
|
-
segments:
|
170
|
-
- 0
|
171
|
-
version: "0"
|
172
|
-
version_requirements: *id010
|
173
|
-
name: rcov
|
174
122
|
prerelease: false
|
123
|
+
version_requirements: *16287340
|
124
|
+
- !ruby/object:Gem::Dependency
|
125
|
+
name: rcov
|
126
|
+
requirement: &16286680 !ruby/object:Gem::Requirement
|
127
|
+
none: false
|
128
|
+
requirements:
|
129
|
+
- - ! '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
175
132
|
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: *16286680
|
176
135
|
description: Wraps libxdo using ffi, for high performance
|
177
136
|
email: victor@costan.us
|
178
137
|
executables: []
|
179
|
-
|
180
138
|
extensions: []
|
181
|
-
|
182
|
-
extra_rdoc_files:
|
139
|
+
extra_rdoc_files:
|
183
140
|
- LICENSE.txt
|
184
141
|
- README.rdoc
|
185
|
-
files:
|
142
|
+
files:
|
186
143
|
- .document
|
187
144
|
- .project
|
188
145
|
- .rspec
|
@@ -211,43 +168,31 @@ files:
|
|
211
168
|
- tasks/ffi_codegen.rb
|
212
169
|
- x_do.gemspec
|
213
170
|
homepage: http://github.com/pwnall/x_do
|
214
|
-
licenses:
|
171
|
+
licenses:
|
215
172
|
- MIT
|
216
173
|
post_install_message:
|
217
174
|
rdoc_options: []
|
218
|
-
|
219
|
-
require_paths:
|
175
|
+
require_paths:
|
220
176
|
- lib
|
221
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
177
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
222
178
|
none: false
|
223
|
-
requirements:
|
224
|
-
- -
|
225
|
-
- !ruby/object:Gem::Version
|
226
|
-
|
227
|
-
segments:
|
179
|
+
requirements:
|
180
|
+
- - ! '>='
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: '0'
|
183
|
+
segments:
|
228
184
|
- 0
|
229
|
-
|
230
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
185
|
+
hash: 1270458090395256216
|
186
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
231
187
|
none: false
|
232
|
-
requirements:
|
233
|
-
- -
|
234
|
-
- !ruby/object:Gem::Version
|
235
|
-
|
236
|
-
segments:
|
237
|
-
- 0
|
238
|
-
version: "0"
|
188
|
+
requirements:
|
189
|
+
- - ! '>='
|
190
|
+
- !ruby/object:Gem::Version
|
191
|
+
version: '0'
|
239
192
|
requirements: []
|
240
|
-
|
241
193
|
rubyforge_project:
|
242
|
-
rubygems_version: 1.
|
194
|
+
rubygems_version: 1.8.15
|
243
195
|
signing_key:
|
244
196
|
specification_version: 3
|
245
197
|
summary: Ruby FFI for libxdo (X mouse / keypress injector)
|
246
|
-
test_files:
|
247
|
-
- spec/spec_helper.rb
|
248
|
-
- spec/support/stdlib.rb
|
249
|
-
- spec/x_do/context_spec.rb
|
250
|
-
- spec/x_do/ffi_lib_ext_spec.rb
|
251
|
-
- spec/x_do/keyboard_spec.rb
|
252
|
-
- spec/x_do/mouse_spec.rb
|
253
|
-
- spec/x_do/window_spec.rb
|
198
|
+
test_files: []
|