sleipnir-api 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +72 -40
- data/Manifest.txt +10 -1
- data/README.txt +10 -0
- data/TODO.txt +5 -4
- data/examples/screenshot.rb +33 -0
- data/lib/sleipnir_api.rb +6 -2
- data/lib/sleipnir_api/bitmap.rb +113 -0
- data/lib/sleipnir_api/ffi.rb +4 -0
- data/lib/sleipnir_api/ffi/base.rb +22 -0
- data/lib/sleipnir_api/ffi/gdi32.rb +165 -0
- data/lib/sleipnir_api/ffi/kernel32.rb +20 -0
- data/lib/sleipnir_api/ffi/struct.rb +246 -0
- data/lib/sleipnir_api/ffi/user32.rb +116 -0
- data/lib/sleipnir_api/process.rb +6 -3
- data/lib/sleipnir_api/profile.rb +6 -3
- data/lib/sleipnir_api/profile/ini.rb +2 -2
- data/lib/sleipnir_api/profile/section.rb +2 -2
- data/lib/sleipnir_api/registry.rb +3 -3
- data/lib/sleipnir_api/screen_captor.rb +138 -0
- data/lib/sleipnir_api/sleipnir.rb +35 -0
- data/lib/sleipnir_api/tab.rb +90 -5
- data/lib/sleipnir_api/version.rb +1 -1
- data/spec/sleipnir_api/ffi_spec.rb +38 -0
- metadata +12 -3
- data/lib/sleipnir_api/win32api.rb +0 -17
@@ -116,7 +116,7 @@ module SleipnirAPI
|
|
116
116
|
@parent.delete(@name, key)
|
117
117
|
end
|
118
118
|
|
119
|
-
# キーを操作する
|
119
|
+
# キーを操作する SleipnirAPI::Profile::Key オブジェクトを返します。
|
120
120
|
#
|
121
121
|
# pnir = SleipnirAPI.connect
|
122
122
|
# proxy = pnir.profile.ini("Proxy.ini", :default => 123)
|
@@ -129,7 +129,7 @@ module SleipnirAPI
|
|
129
129
|
Key.new(self, str(name), options(opts))
|
130
130
|
end
|
131
131
|
|
132
|
-
# メソッド名をキー名とみなして
|
132
|
+
# メソッド名をキー名とみなして SleipnirAPI::Profile::Key オブジェクトを返します。
|
133
133
|
#
|
134
134
|
# pnir = SleipnirAPI.connect
|
135
135
|
# proxy = pnir.profile.Proxy(:default => 123)
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require "win32/registry"
|
2
2
|
|
3
|
-
require "sleipnir_api/
|
3
|
+
require "sleipnir_api/ffi"
|
4
4
|
|
5
5
|
module SleipnirAPI
|
6
6
|
module Registry # :nodoc:
|
7
|
-
include SleipnirAPI::
|
8
|
-
extend SleipnirAPI::
|
7
|
+
include SleipnirAPI::FFI::Kernel32
|
8
|
+
extend SleipnirAPI::FFI::Kernel32
|
9
9
|
|
10
10
|
PROG_ID = "Sleipnir.API"
|
11
11
|
|
@@ -0,0 +1,138 @@
|
|
1
|
+
require "timeout"
|
2
|
+
require "sleipnir_api/ffi"
|
3
|
+
require "sleipnir_api/bitmap"
|
4
|
+
|
5
|
+
module SleipnirAPI
|
6
|
+
|
7
|
+
class ScreenCaptor #:nodoc:
|
8
|
+
include SleipnirAPI::Util
|
9
|
+
include SleipnirAPI::FFI
|
10
|
+
include SleipnirAPI::FFI::Kernel32
|
11
|
+
include SleipnirAPI::FFI::User32
|
12
|
+
include SleipnirAPI::FFI::GDI32
|
13
|
+
|
14
|
+
attr_reader :sleipnir, :tab, :body
|
15
|
+
def initialize(sleipnir, tab)
|
16
|
+
@sleipnir = sleipnir
|
17
|
+
@tab = tab
|
18
|
+
if tab
|
19
|
+
if tab.compatible_mode?
|
20
|
+
@body = tab.document.body
|
21
|
+
else
|
22
|
+
@body = tab.document.body.parentNode
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def capture_browser
|
28
|
+
sleipnir.bring_window_to_top
|
29
|
+
wait_for_redraw_sleipnir_window
|
30
|
+
capture_hwnd(sleipnir.hwnd)
|
31
|
+
end
|
32
|
+
|
33
|
+
def capture_page
|
34
|
+
sleipnir.bring_window_to_top
|
35
|
+
tab.activate
|
36
|
+
wait_for_redraw_sleipnir_window
|
37
|
+
capture_area(0, 0, body.scrollWidth, body.scrollHeight)
|
38
|
+
end
|
39
|
+
|
40
|
+
def wait_for_redraw_sleipnir_window
|
41
|
+
sleep(0.3) # �`��҂� ... ������
|
42
|
+
end
|
43
|
+
|
44
|
+
def capture_area(px, py, w, h)
|
45
|
+
px = 0 if px < 0
|
46
|
+
py = 0 if py < 0
|
47
|
+
|
48
|
+
w = body.scrollWidth - px if px + w > body.scrollWidth
|
49
|
+
h = body.scrollHeight - py if py + h > body.scrollHeight
|
50
|
+
|
51
|
+
# Scrolls the page so that top of the object is visible at the top of the window.
|
52
|
+
body.scrollTop = py - 2
|
53
|
+
body.scrollLeft = px - 2
|
54
|
+
|
55
|
+
# The position on the screen is different due to page scrolling and Body border
|
56
|
+
sx = px - body.scrollLeft + body.clientLeft
|
57
|
+
sy = py - body.scrollTop + body.clientTop
|
58
|
+
|
59
|
+
if sx + w < body.clientWidth && sy + h < body.clientHeight
|
60
|
+
# If the whole object is visible
|
61
|
+
capture_hwnd_area(tab.embedding_ie_hwnd, sx, sy, w, h)
|
62
|
+
else
|
63
|
+
# If only part of it is visible
|
64
|
+
capture_and_scroll(px, py, w, h)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def capture_and_scroll(px, py, w, h)
|
69
|
+
# Captured area
|
70
|
+
result = BitMap.new(0, 0)
|
71
|
+
|
72
|
+
# We will do the screen capturing in more steps by areas of maximum dimensions maxw x maxh
|
73
|
+
maxw = body.clientWidth;
|
74
|
+
maxh = body.clientHeight;
|
75
|
+
|
76
|
+
cw = 0
|
77
|
+
ch = 0
|
78
|
+
cnt_x = 0
|
79
|
+
while cw < w
|
80
|
+
# Scroll to the top and right
|
81
|
+
body.scrollTop = px - 2;
|
82
|
+
body.scrollLeft = px - 2 + cnt_x * (maxw * 0.9).to_i
|
83
|
+
|
84
|
+
ch = 0;
|
85
|
+
cnt_y = 0
|
86
|
+
strip = BitMap.new(0, 0)
|
87
|
+
while ch < h
|
88
|
+
body.scrollTop = px - 2 + cnt_y * (maxh * 0.9).to_i
|
89
|
+
|
90
|
+
# Recalculate the position on the screen
|
91
|
+
sx = px - body.scrollLeft + body.clientLeft + cw
|
92
|
+
sy = py - body.scrollTop + body.clientTop + ch
|
93
|
+
|
94
|
+
# Calculate the dimensions of the part to be captured
|
95
|
+
pw = (px + cw - body.scrollLeft + maxw) > maxw ? maxw - (px + cw) + body.scrollLeft : maxw
|
96
|
+
pw = cw + pw > w ? w - cw : pw
|
97
|
+
|
98
|
+
ph = (py + ch - body.scrollTop + maxh) > maxh ? maxh - (py + ch) + body.scrollTop : maxh
|
99
|
+
ph = ch + ph > h ? h - ch : ph
|
100
|
+
|
101
|
+
# Capture the part and append it to the strip
|
102
|
+
strip << capture_hwnd_area(tab.embedding_ie_hwnd, sx, sy, pw, ph)
|
103
|
+
ch += ph
|
104
|
+
cnt_y += 1
|
105
|
+
end
|
106
|
+
|
107
|
+
result.concat_right!(strip)
|
108
|
+
cw += pw
|
109
|
+
cnt_x += 1
|
110
|
+
end
|
111
|
+
|
112
|
+
result
|
113
|
+
end
|
114
|
+
|
115
|
+
def capture_hwnd(hwnd)
|
116
|
+
left, top, right, bottom = get_window_rect(hwnd)
|
117
|
+
capture_hwnd_area(hwnd, 0, 0, right - left, bottom - top)
|
118
|
+
end
|
119
|
+
|
120
|
+
def capture_hwnd_area(hwnd, x, y, w, h)
|
121
|
+
with_window_dc(hwnd) do |hdc|
|
122
|
+
with_delete_dc(CreateCompatibleDC(hdc)) do |memdc|
|
123
|
+
with_delete_object(CreateCompatibleBitmap(hdc, w, h)) do |hbmp|
|
124
|
+
SelectObject(memdc, hbmp)
|
125
|
+
BitBlt(memdc, 0, 0, w, h, hdc, x, y, SRCCOPY)
|
126
|
+
|
127
|
+
bmp = SleipnirAPI::BitMap.new(w, h)
|
128
|
+
r = GetDIBits(memdc, hbmp, 0, h, bmp.data, bmp.info.pack, DIB_RGB_COLORS)
|
129
|
+
raise Win32APIError, "GetDIBits failed: #{r}" if r.nil? or r.zero?
|
130
|
+
|
131
|
+
bmp
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
end
|
@@ -50,6 +50,7 @@ module SleipnirAPI
|
|
50
50
|
include SleipnirAPI::Util
|
51
51
|
include SleipnirAPI::KeyState
|
52
52
|
include SleipnirAPI::Dialog
|
53
|
+
include SleipnirAPI::FFI::User32
|
53
54
|
|
54
55
|
# Sleipnir.API WIN32OLE Object
|
55
56
|
attr_reader :api
|
@@ -324,6 +325,16 @@ module SleipnirAPI
|
|
324
325
|
end
|
325
326
|
end
|
326
327
|
|
328
|
+
# 現在アクティブなタブを保存して block を実行します。
|
329
|
+
def save_active_tab
|
330
|
+
actived = active_tab
|
331
|
+
begin
|
332
|
+
yield
|
333
|
+
ensure
|
334
|
+
actived.activate unless actived.closed?
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
327
338
|
|
328
339
|
# 指定されたファイルにお気に入りを保存します。
|
329
340
|
#
|
@@ -381,6 +392,18 @@ module SleipnirAPI
|
|
381
392
|
end
|
382
393
|
|
383
394
|
|
395
|
+
# Sleipnir ウィンドウ全体のスクリーンショットを指定されたファイルに保存します。
|
396
|
+
#
|
397
|
+
# * ファイル形式は BMP です。
|
398
|
+
# * Sleipnir のスクロールバーやツールバーも保存されます。
|
399
|
+
# * ページが複数ページからなる場合、表示中の部分しか保存されません。
|
400
|
+
def capture_browser(filename)
|
401
|
+
captor = SleipnirAPI::ScreenCaptor.new(sleipnir, nil)
|
402
|
+
bmp = captor.capture_browser
|
403
|
+
bmp.save(filename)
|
404
|
+
end
|
405
|
+
|
406
|
+
|
384
407
|
# アウトプットバーを操作するオブジェクトを取得します。
|
385
408
|
#
|
386
409
|
# See Also: SleipnirAPI::Output
|
@@ -436,6 +459,18 @@ module SleipnirAPI
|
|
436
459
|
end
|
437
460
|
end
|
438
461
|
|
462
|
+
# Sleipnir ウィンドウをフォアグランドにする。
|
463
|
+
def bring_window_to_top(timeout=3)
|
464
|
+
timeout(timeout) {
|
465
|
+
while GetForegroundWindow() != hwnd
|
466
|
+
BringWindowToTop(hwnd)
|
467
|
+
CloseWindow(hwnd)
|
468
|
+
OpenIcon(hwnd)
|
469
|
+
sleep(0.1)
|
470
|
+
end
|
471
|
+
}
|
472
|
+
end
|
473
|
+
|
439
474
|
end
|
440
475
|
end
|
441
476
|
|
data/lib/sleipnir_api/tab.rb
CHANGED
@@ -4,6 +4,8 @@ require "sleipnir_api/dialog"
|
|
4
4
|
require "sleipnir_api/security"
|
5
5
|
require "sleipnir_api/tabbed_ie"
|
6
6
|
require "sleipnir_api/searcher"
|
7
|
+
require "sleipnir_api/screen_captor"
|
8
|
+
|
7
9
|
|
8
10
|
module SleipnirAPI
|
9
11
|
|
@@ -37,12 +39,24 @@ module SleipnirAPI
|
|
37
39
|
# Sleipnir の ドキュメント ID (ドキュメント固有の ID)
|
38
40
|
attr_reader :id
|
39
41
|
|
42
|
+
# このタブの IE コンポーネント (Internet Explorer_Server)
|
43
|
+
# のウィンドウハンドルを返します。
|
44
|
+
attr_reader :embedding_ie_hwnd
|
45
|
+
|
46
|
+
# このタブの Sleipnir_IEView のウィンドウハンドルを返します。
|
47
|
+
alias sleipnir_ieview_hwnd id
|
48
|
+
|
40
49
|
def initialize(sleipnir, id)
|
41
50
|
@sleipnir = sleipnir
|
42
51
|
@id = id
|
52
|
+
@embedding_ie_hwnd = find_embedding_ie_hwnd
|
43
53
|
@searcher = SleipnirAPI::Searcher.new(self)
|
44
54
|
end
|
45
55
|
|
56
|
+
def find_embedding_ie_hwnd #:nodoc:
|
57
|
+
SleipnirAPI::FFI::User32.list_window(sleipnir_ieview_hwnd).flatten.last
|
58
|
+
end
|
59
|
+
|
46
60
|
# call-seq:
|
47
61
|
# window -> WIN32OLE object (DispHTMLWindow2)
|
48
62
|
# window{|window| ... }
|
@@ -112,6 +126,35 @@ module SleipnirAPI
|
|
112
126
|
end
|
113
127
|
end
|
114
128
|
|
129
|
+
# IE の互換モード (document.compatMode) を返します。
|
130
|
+
def compatible_mode
|
131
|
+
document.compatMode
|
132
|
+
end
|
133
|
+
alias compat_mode compatible_mode
|
134
|
+
|
135
|
+
# IE が互換モードなら (compatMode が nil か "BackCompat" なら) true を返します。
|
136
|
+
def compatible_mode?
|
137
|
+
v = compatible_mode
|
138
|
+
return (v.nil? or v == "BackCompat")
|
139
|
+
end
|
140
|
+
alias compat_mode? compatible_mode?
|
141
|
+
|
142
|
+
# call-seq:
|
143
|
+
# get_elements_by_tag(tag, parent=nil) -> Array of IHTMLElement
|
144
|
+
#
|
145
|
+
# 指定された +tag+ 名の IHTMLElement の配列を取得します。
|
146
|
+
#
|
147
|
+
# * 指定された +tag+ の要素が存在しない場合、空配列を返します。
|
148
|
+
# * +parent+ を指定した場合は、+parent+ 配下から指定されたタグを探します。
|
149
|
+
# 指定しない場合はドキュメント全体から探します。
|
150
|
+
#
|
151
|
+
def get_elements_by_tag(tag, parent=nil)
|
152
|
+
parent ||= document
|
153
|
+
tags = parent.getElementsByTagName(tag)
|
154
|
+
return [] unless tags
|
155
|
+
tags.extend(Enumerable).to_a
|
156
|
+
end
|
157
|
+
|
115
158
|
# call-seq:
|
116
159
|
# elem_by_tag(tag, parent=nil) -> Array of IHTMLElement
|
117
160
|
# elem_by_tag(tag, index=0, parent=nil) -> IHTMLElement
|
@@ -124,11 +167,12 @@ module SleipnirAPI
|
|
124
167
|
# 指定しない場合はドキュメント全体から探します。
|
125
168
|
#
|
126
169
|
def elem_by_tag(tag, index=nil, parent=nil)
|
127
|
-
parent
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
170
|
+
tags = get_elements_by_tag(tag, parent) || []
|
171
|
+
if index
|
172
|
+
tags[index]
|
173
|
+
else
|
174
|
+
tags
|
175
|
+
end
|
132
176
|
end
|
133
177
|
|
134
178
|
# このタブの base URI を返します。
|
@@ -194,6 +238,11 @@ module SleipnirAPI
|
|
194
238
|
self.api.GetIndex(self.id)
|
195
239
|
end
|
196
240
|
|
241
|
+
# このタブが close 済みなら true
|
242
|
+
def closed?
|
243
|
+
index == -1
|
244
|
+
end
|
245
|
+
|
197
246
|
# このタブを閉じます。
|
198
247
|
#
|
199
248
|
# * +force+ が +true+ の場合、ナビゲートロックされたタブも close します。
|
@@ -267,6 +316,42 @@ module SleipnirAPI
|
|
267
316
|
self.api.SetAutoRefresh(self.id, sec)
|
268
317
|
end
|
269
318
|
|
319
|
+
|
320
|
+
# このタブに埋め込んでいる IE コンポーネントの描画領域 (left, top, width, height)
|
321
|
+
# を返します。
|
322
|
+
#
|
323
|
+
# 戻り値は IE コンポーネント内の相対値です。
|
324
|
+
def client_area
|
325
|
+
if compatible_mode?
|
326
|
+
body = document.body
|
327
|
+
else
|
328
|
+
body = document.body.parentNode
|
329
|
+
end
|
330
|
+
[body.clientLeft, body.clientTop, body.clientWidth, body.clientHeight]
|
331
|
+
end
|
332
|
+
|
333
|
+
# このタブに埋め込んでいる IE コンポーネントの描画領域 (left, top, width, height)
|
334
|
+
# を返します。
|
335
|
+
#
|
336
|
+
# 戻り値は IE コンポーネント内の相対値です。
|
337
|
+
def embedding_ie_area
|
338
|
+
browser{|br|
|
339
|
+
[0, 0, br.Width, br.Height]
|
340
|
+
}
|
341
|
+
end
|
342
|
+
|
343
|
+
# このページのスクリーンショットを指定されたファイルに保存します。
|
344
|
+
#
|
345
|
+
# * ファイル形式は BMP です。
|
346
|
+
# * ページの描画領域のみをキャプチャします。Sleipnir のスクロールバーやツールバーは保存されません。
|
347
|
+
# * ページが複数ページからなる場合、スクロールしてすべてキャプチャします。
|
348
|
+
# * このタブが表示されていない場合はタブをアクティブにします。
|
349
|
+
def capture_page(filename)
|
350
|
+
captor = SleipnirAPI::ScreenCaptor.new(sleipnir, self)
|
351
|
+
bmp = captor.capture_page
|
352
|
+
bmp.save(filename)
|
353
|
+
end
|
354
|
+
|
270
355
|
# 指定された引き数が同じドキュメントの場合 true を返します。
|
271
356
|
#
|
272
357
|
# 同値性の判定には Sleipnir のドキュメント ID を利用します。
|
data/lib/sleipnir_api/version.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "../spec_helper.rb")
|
2
|
+
|
3
|
+
describe SleipnirAPI::FFI::Kernel32 do
|
4
|
+
|
5
|
+
it "#get_long_path_name" do
|
6
|
+
SleipnirAPI::FFI::Kernel32::GetLongPathName.should be_an_instance_of(::Win32API)
|
7
|
+
SleipnirAPI::FFI::Kernel32.should respond_to(:get_long_path_name)
|
8
|
+
|
9
|
+
Dir.chdir(File.dirname(__FILE__)) do
|
10
|
+
SleipnirAPI::FFI::Kernel32.get_long_path_name("KEY_ST~2.RB").should == "key_state_mock_spec.rb"
|
11
|
+
SleipnirAPI::FFI::Kernel32.get_long_path_name("ffi_spec.rb").should == "ffi_spec.rb"
|
12
|
+
SleipnirAPI::FFI::Kernel32.get_long_path_name("no_such_file.rb").should == ""
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
describe SleipnirAPI::FFI::User32 do
|
19
|
+
|
20
|
+
it "#get_window_thread_process_id" do
|
21
|
+
pnir = SleipnirAPI.connect
|
22
|
+
locator = WIN32OLE.new("WbemScripting.SWbemLocator")
|
23
|
+
wbem = locator.ConnectServer(".")
|
24
|
+
set = wbem.ExecQuery("select * from Win32_Process where Name='Sleipnir.exe'").extend(Enumerable)
|
25
|
+
|
26
|
+
thread_id, proc_id = SleipnirAPI::FFI::User32::GetWindowThreadProcessId.should be_an_instance_of(::Win32API)
|
27
|
+
thread_id, proc_id = SleipnirAPI::FFI::User32.get_window_thread_process_id(pnir.handle)
|
28
|
+
set.map{|e| e.ProcessId }.should be_include(proc_id)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "#get_window_thread_id / get_window_process_id" do
|
32
|
+
pnir = SleipnirAPI.connect
|
33
|
+
thread_id, proc_id = SleipnirAPI::FFI::User32.get_window_thread_process_id(pnir.handle)
|
34
|
+
thread_id.should == SleipnirAPI::FFI::User32.get_window_thread_id(pnir.handle)
|
35
|
+
proc_id.should == SleipnirAPI::FFI::User32.get_window_process_id(pnir.handle)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: sleipnir-api
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.4.0
|
7
|
+
date: 2007-10-27 00:00:00 +09:00
|
8
8
|
summary: Ruby interface to the Sleipnir.API WIN32OLE object.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -42,16 +42,24 @@ files:
|
|
42
42
|
- examples/open_last_url_by_firefox.rb
|
43
43
|
- examples/open_selected_links.rb
|
44
44
|
- examples/reload.rb
|
45
|
+
- examples/screenshot.rb
|
45
46
|
- helper/rake.rb
|
46
47
|
- helper/rake/rake.rb
|
47
48
|
- helper/rake/rake_sh_filter.rb
|
48
49
|
- helper/rake/util.rb
|
49
50
|
- lib/sleipnir_api.rb
|
51
|
+
- lib/sleipnir_api/bitmap.rb
|
50
52
|
- lib/sleipnir_api/cli/base.rb
|
51
53
|
- lib/sleipnir_api/cli/grepnir.rb
|
52
54
|
- lib/sleipnir_api/command.rb
|
53
55
|
- lib/sleipnir_api/commands.rb
|
54
56
|
- lib/sleipnir_api/dialog.rb
|
57
|
+
- lib/sleipnir_api/ffi.rb
|
58
|
+
- lib/sleipnir_api/ffi/base.rb
|
59
|
+
- lib/sleipnir_api/ffi/gdi32.rb
|
60
|
+
- lib/sleipnir_api/ffi/kernel32.rb
|
61
|
+
- lib/sleipnir_api/ffi/struct.rb
|
62
|
+
- lib/sleipnir_api/ffi/user32.rb
|
55
63
|
- lib/sleipnir_api/key_state.rb
|
56
64
|
- lib/sleipnir_api/output.rb
|
57
65
|
- lib/sleipnir_api/process.rb
|
@@ -61,6 +69,7 @@ files:
|
|
61
69
|
- lib/sleipnir_api/profile/section.rb
|
62
70
|
- lib/sleipnir_api/profile/util.rb
|
63
71
|
- lib/sleipnir_api/registry.rb
|
72
|
+
- lib/sleipnir_api/screen_captor.rb
|
64
73
|
- lib/sleipnir_api/searcher.rb
|
65
74
|
- lib/sleipnir_api/security.rb
|
66
75
|
- lib/sleipnir_api/sleipnir.rb
|
@@ -68,7 +77,6 @@ files:
|
|
68
77
|
- lib/sleipnir_api/tabbed_ie.rb
|
69
78
|
- lib/sleipnir_api/util.rb
|
70
79
|
- lib/sleipnir_api/version.rb
|
71
|
-
- lib/sleipnir_api/win32api.rb
|
72
80
|
- scripts/gesture2rb.rb
|
73
81
|
- scripts/make_gesture.rb
|
74
82
|
- scripts/rdoc_filter.rb
|
@@ -79,6 +87,7 @@ files:
|
|
79
87
|
- spec/matchers/path_eql.rb
|
80
88
|
- spec/sleipnir_api/cli/grepnir_spec.rb
|
81
89
|
- spec/sleipnir_api/dialog_mock_spec.rb
|
90
|
+
- spec/sleipnir_api/ffi_spec.rb
|
82
91
|
- spec/sleipnir_api/key_state_mock_spec.rb
|
83
92
|
- spec/sleipnir_api/output_spec.rb
|
84
93
|
- spec/sleipnir_api/profile_mock_spec.rb
|