winwindow 0.4.0 → 0.4.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/lib/winwindow.rb +6 -61
- metadata +20 -4
data/lib/winwindow.rb
CHANGED
@@ -47,7 +47,6 @@ class WinWindow
|
|
47
47
|
module AttachLib # :nodoc: all
|
48
48
|
IsWin64=nil # TODO/FIX: detect this!
|
49
49
|
|
50
|
-
#=begin
|
51
50
|
# here begins the FFI version. this one needs to hack improperly into FFI's internals, bypassing its
|
52
51
|
# broken API for #callback which doesn't set the calling convention, causing segfaults.
|
53
52
|
begin
|
@@ -103,14 +102,15 @@ class WinWindow
|
|
103
102
|
|
104
103
|
cb = FFI::CallbackInfo.new(find_type(types[return_type]), arg_types.map{|e| find_type(types[e]) }, options)
|
105
104
|
|
105
|
+
# the below is for ffi < 1.0; @ffi_callbacks goes away in the future. it's ignored by
|
106
|
+
# newer versions of ffi. so no harm in continuing to set it here.
|
106
107
|
@ffi_callbacks = Hash.new unless defined?(@ffi_callbacks)
|
107
108
|
@ffi_callbacks[callback_type_name] = cb
|
109
|
+
# and the below is for newer versions of ffi (1.0.*). of course, @ffi_module.callback
|
110
|
+
# works in newer. at some point I'll drop support for older broken versions and just
|
111
|
+
# use ffi's #callback.
|
112
|
+
typedef cb, callback_type_name
|
108
113
|
end
|
109
|
-
#options[:convention] = @ffi_module.instance_variable_defined?('@ffi_convention') ? @ffi_module.instance_variable_get('@ffi_convention') : :default
|
110
|
-
#options[:enums] = @ffi_module.instance_variable_get('@ffi_enums') if @ffi_module.instance_variable_defined?('@ffi_enums')
|
111
|
-
#unless @ffi_module.instance_variable_defined?('@ffi_callbacks')
|
112
|
-
# @ffi_module.instance_variable_set('@ffi_callbacks', cb)
|
113
|
-
#end
|
114
114
|
|
115
115
|
# perform some hideous class_eval'ing to dynamically define the callback method such that it will take a block
|
116
116
|
metaclass=class << self;self;end
|
@@ -129,61 +129,6 @@ class WinWindow
|
|
129
129
|
#end
|
130
130
|
nil
|
131
131
|
end
|
132
|
-
#=end
|
133
|
-
=begin
|
134
|
-
# here begins the Win32::API version. this one doesn't work because of a hard-coded limit on
|
135
|
-
# callbacks in win32/api.c combined with a lack of any capacity to remove any callbacks.
|
136
|
-
require 'win32/api'
|
137
|
-
|
138
|
-
# basic types that Win32::API recognizes
|
139
|
-
Types={ :char => 'I', # no 8-bit type in Win32::API?
|
140
|
-
:uchar => 'I', # no unsigned types in Win32::API?
|
141
|
-
:int => 'I',
|
142
|
-
:uint => 'I',
|
143
|
-
:long => 'L',
|
144
|
-
:ulong => 'L',
|
145
|
-
:void => 'V',
|
146
|
-
:pointer => 'P',
|
147
|
-
:callback => 'K',
|
148
|
-
:string => 'P', # 'S' works here on mingw32, but not on mswin32
|
149
|
-
}
|
150
|
-
|
151
|
-
def use_lib(lib)
|
152
|
-
@lib=lib
|
153
|
-
end
|
154
|
-
# this takes arguments in the order that they're given in c/c++ so that signatures look kind of like the source
|
155
|
-
def attach(return_type, function_name, *arg_types)
|
156
|
-
the_function=Win32::API.new(function_name.to_s, arg_types.map{|arg_type| Types[arg_type] }.join(''), Types[return_type], @lib)
|
157
|
-
metaclass=class << self;self;end
|
158
|
-
metaclass.send(:define_method, function_name) do |*args|
|
159
|
-
the_function.call(*args)
|
160
|
-
end
|
161
|
-
nil
|
162
|
-
end
|
163
|
-
# this takes arguments like #attach, but with a name for the callback's type on the front.
|
164
|
-
def callback(callback_type_name, return_type, callback_method_name, *arg_types)
|
165
|
-
Types[callback_type_name]=Types[:callback]
|
166
|
-
|
167
|
-
# perform some hideous class_eval'ing to dynamically define the callback method such that it will take a block
|
168
|
-
metaclass=class << self;self;end
|
169
|
-
metaclass.class_eval("def #{callback_method_name}(&block)
|
170
|
-
#{callback_method_name}_with_arg_stuff_in_scope(block)
|
171
|
-
end")
|
172
|
-
types=Types
|
173
|
-
metaclass.send(:define_method, callback_method_name.to_s+"_with_arg_stuff_in_scope") do |block|
|
174
|
-
return Win32::API::Callback.new(arg_types.map{|t| types[t]}.join(''), types[return_type], &block)
|
175
|
-
end
|
176
|
-
def remove_#{callback_method_name}(callback_method)
|
177
|
-
# Win32::API has no support for removing callbacks?
|
178
|
-
nil
|
179
|
-
end")
|
180
|
-
# don't use define_method as this will be called from an ensure block which segfaults ruby 1.9.1. see http://redmine.ruby-lang.org/issues/show/2728
|
181
|
-
#metaclass.send(:define_method, "remove_"+callback_method_name.to_s) do |callback_method|
|
182
|
-
# nil
|
183
|
-
#end
|
184
|
-
nil
|
185
|
-
end
|
186
|
-
=end
|
187
132
|
def self.add_type(hash)
|
188
133
|
hash.each_pair do |key, value|
|
189
134
|
unless Types.key?(value)
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: winwindow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 13
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 0
|
7
8
|
- 4
|
8
|
-
-
|
9
|
-
version: 0.4.
|
9
|
+
- 1
|
10
|
+
version: 0.4.1
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Ethan
|
@@ -14,21 +15,31 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date:
|
18
|
+
date: 2011-02-05 00:00:00 -05:00
|
18
19
|
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
21
22
|
name: ffi
|
22
23
|
prerelease: false
|
23
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
24
26
|
requirements:
|
25
27
|
- - ">="
|
26
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
27
30
|
segments:
|
28
31
|
- 0
|
29
32
|
- 5
|
30
33
|
- 4
|
31
34
|
version: 0.5.4
|
35
|
+
- - <
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
hash: 19
|
38
|
+
segments:
|
39
|
+
- 1
|
40
|
+
- 1
|
41
|
+
- 0
|
42
|
+
version: 1.1.0
|
32
43
|
type: :runtime
|
33
44
|
version_requirements: *id001
|
34
45
|
description: A Ruby library to wrap windows API calls relating to hWnd window handles.
|
@@ -42,6 +53,7 @@ extra_rdoc_files: []
|
|
42
53
|
files:
|
43
54
|
- lib/winwindow.rb
|
44
55
|
- lib/winwindow/ext.rb
|
56
|
+
- test/winwindow_test.rb
|
45
57
|
has_rdoc: true
|
46
58
|
homepage: http://winwindow.vapir.org/
|
47
59
|
licenses: []
|
@@ -62,23 +74,27 @@ rdoc_options:
|
|
62
74
|
require_paths:
|
63
75
|
- lib
|
64
76
|
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
65
78
|
requirements:
|
66
79
|
- - ">="
|
67
80
|
- !ruby/object:Gem::Version
|
81
|
+
hash: 3
|
68
82
|
segments:
|
69
83
|
- 0
|
70
84
|
version: "0"
|
71
85
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
+
none: false
|
72
87
|
requirements:
|
73
88
|
- - ">="
|
74
89
|
- !ruby/object:Gem::Version
|
90
|
+
hash: 3
|
75
91
|
segments:
|
76
92
|
- 0
|
77
93
|
version: "0"
|
78
94
|
requirements:
|
79
95
|
- Microsoft Windows, probably with some sort of NT kernel
|
80
96
|
rubyforge_project:
|
81
|
-
rubygems_version: 1.3.
|
97
|
+
rubygems_version: 1.3.7
|
82
98
|
signing_key:
|
83
99
|
specification_version: 3
|
84
100
|
summary: A Ruby library to wrap windows API calls relating to hWnd window handles.
|