win32-clipboard 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/CHANGES +4 -0
- data/MANIFEST +2 -2
- data/README +7 -7
- data/lib/win32/clipboard.rb +56 -70
- data/test/tc_clipboard.rb +9 -1
- metadata +14 -5
data/CHANGES
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
== 0.4.1 - 30-Jul-2006
|
2
|
+
* Now uses the windows-pr package. No API changes.
|
3
|
+
* Made Clipboard.get_data a true alias (instead of a facade).
|
4
|
+
|
1
5
|
== 0.4.0 - 24-Feb-2006
|
2
6
|
* Removed the C version entirely and replaced it with a pure Ruby version
|
3
7
|
that uses the Win32API package.
|
data/MANIFEST
CHANGED
data/README
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
puts "Number of available formats: " + Clipboard.num_formats
|
10
10
|
|
11
11
|
puts "Setting data to 'foobar'"
|
12
|
-
Clipboard.
|
12
|
+
Clipboard.set_data("foobar")
|
13
13
|
|
14
14
|
puts "Clipboard now contains: " + Clipboard.data
|
15
15
|
|
@@ -27,12 +27,6 @@ Clipboard.get_data(format=nil)
|
|
27
27
|
Note that this method does implicit conversions on formats with regards
|
28
28
|
to text data. See the MSDN documentation for more details.
|
29
29
|
|
30
|
-
Clipboard.set_data(data, format=nil)
|
31
|
-
Sets the clipboard contents to the data that you specify. You may
|
32
|
-
optionally specify a clipboard format. The default is Clipboard::TEXT.
|
33
|
-
|
34
|
-
See the 'Constants' section for a list of the supported formats.
|
35
|
-
|
36
30
|
Clipboard.empty
|
37
31
|
Empty the contents of the clipboard
|
38
32
|
|
@@ -64,6 +58,12 @@ Clipboard.register_format(format)
|
|
64
58
|
Registered clipboard formats are identified by values in the range 0xC000
|
65
59
|
through 0xFFFF.
|
66
60
|
|
61
|
+
Clipboard.set_data(data, format=nil)
|
62
|
+
Sets the clipboard contents to the data that you specify. You may
|
63
|
+
optionally specify a clipboard format. The default is Clipboard::TEXT.
|
64
|
+
|
65
|
+
See the 'Constants' section for a list of the supported formats.
|
66
|
+
|
67
67
|
== Error Classes
|
68
68
|
ClipboardError
|
69
69
|
Typically only raised if the clipboard fails to open or if you attempt to
|
data/lib/win32/clipboard.rb
CHANGED
@@ -1,58 +1,34 @@
|
|
1
|
-
require
|
1
|
+
require 'windows/clipboard'
|
2
|
+
require 'windows/memory'
|
3
|
+
require 'windows/error'
|
2
4
|
|
3
5
|
module Win32
|
4
6
|
class ClipboardError < StandardError; end
|
5
7
|
class Clipboard
|
6
|
-
|
8
|
+
include Windows::Clipboard
|
9
|
+
include Windows::Memory
|
10
|
+
include Windows::Error
|
11
|
+
extend Windows::Clipboard
|
12
|
+
extend Windows::Memory
|
13
|
+
extend Windows::Error
|
14
|
+
|
15
|
+
VERSION = '0.4.1'
|
7
16
|
|
8
17
|
# Clipboard data types
|
9
|
-
TEXT =
|
10
|
-
OEMTEXT =
|
11
|
-
UNICODETEXT =
|
12
|
-
|
13
|
-
# Alloc constants
|
14
|
-
GMEM_MOVEABLE = 0x0002
|
15
|
-
GMEM_ZEROINIT = 0x0040
|
16
|
-
GHND = 0x0042
|
17
|
-
|
18
|
-
# Clipboard specific functions
|
19
|
-
@@OpenClipboard = Win32API.new('user32', 'OpenClipboard', 'L', 'I')
|
20
|
-
@@CloseClipboard = Win32API.new('user32', 'CloseClipboard', 'V', 'I')
|
21
|
-
@@GetClipboardData = Win32API.new('user32', 'GetClipboardData', 'I', 'P')
|
22
|
-
@@SetClipboardData = Win32API.new('user32', 'SetClipboardData', 'II', 'I')
|
23
|
-
@@EmptyClipboard = Win32API.new('user32', 'EmptyClipboard', 'V', 'I')
|
18
|
+
TEXT = CF_TEXT
|
19
|
+
OEMTEXT = CF_OEMTEXT
|
20
|
+
UNICODETEXT = CF_UNICODETEXT
|
24
21
|
|
25
|
-
|
26
|
-
|
27
|
-
)
|
28
|
-
|
29
|
-
@@IsClipboardFormatAvailable = Win32API.new(
|
30
|
-
'user32', 'IsClipboardFormatAvailable', 'I', 'I'
|
31
|
-
)
|
32
|
-
|
33
|
-
@@GetClipboardFormatName = Win32API.new(
|
34
|
-
'user32', 'GetClipboardFormatName', 'IPI', 'I'
|
35
|
-
)
|
36
|
-
|
37
|
-
@@EnumClipboardFormats = Win32API.new(
|
38
|
-
'user32', 'EnumClipboardFormats', 'I', 'I'
|
39
|
-
)
|
40
|
-
|
41
|
-
@@RegisterClipboardFormat = Win32API.new(
|
42
|
-
'user32', 'RegisterClipboardFormat', 'P', 'I'
|
43
|
-
)
|
44
|
-
|
45
|
-
# Generic Win32 functions
|
46
|
-
@@GlobalAlloc = Win32API.new('kernel32', 'GlobalAlloc', 'II' ,'I')
|
47
|
-
@@GlobalLock = Win32API.new('kernel32', 'GlobalLock', 'I' ,'I')
|
48
|
-
@@GlobalFree = Win32API.new('kernel32', 'GlobalFree', 'I' ,'I')
|
49
|
-
@@Memcpy = Win32API.new('msvcrt', 'memcpy', 'IPI', 'I')
|
22
|
+
# We'll use a custom definition of memcpy since this is different than
|
23
|
+
# what's in the Windows::MSVCRT::Buffer module.
|
24
|
+
@@Memcpy = Win32API.new('msvcrt', 'memcpy', 'IPI', 'I')
|
50
25
|
|
51
26
|
# Sets the clipboard contents to the data that you specify. You may
|
52
27
|
# optionally specify a clipboard format. The default is Clipboard::TEXT.
|
28
|
+
#
|
53
29
|
def self.set_data(clip_data, format = TEXT)
|
54
30
|
self.open
|
55
|
-
|
31
|
+
EmptyClipboard()
|
56
32
|
|
57
33
|
# NULL terminate text
|
58
34
|
case format
|
@@ -61,73 +37,80 @@ module Win32
|
|
61
37
|
end
|
62
38
|
|
63
39
|
# Global Allocate a movable piece of memory.
|
64
|
-
hmem =
|
65
|
-
mem =
|
40
|
+
hmem = GlobalAlloc(GHND, clip_data.length + 4)
|
41
|
+
mem = GlobalLock(hmem)
|
66
42
|
@@Memcpy.call(mem, clip_data, clip_data.length)
|
67
43
|
|
68
44
|
# Set the new data
|
69
|
-
if
|
70
|
-
|
45
|
+
if SetClipboardData(format, hmem) == 0
|
46
|
+
error = get_last_error
|
47
|
+
GlobalFree(hmem)
|
71
48
|
self.close
|
72
|
-
raise ClipboardError, "SetClipboardData() failed"
|
49
|
+
raise ClipboardError, "SetClipboardData() failed: #{error}"
|
73
50
|
end
|
74
51
|
|
75
|
-
|
52
|
+
GlobalFree(hmem)
|
76
53
|
self.close
|
77
54
|
self
|
78
55
|
end
|
79
56
|
|
80
|
-
# Returns the data currently in the clipboard. If
|
57
|
+
# Returns the data currently in the clipboard. If +format+ is
|
81
58
|
# specified, it will attempt to retrieve the data in that format. The
|
82
|
-
# default is Clipboard::TEXT.
|
59
|
+
# default is Clipboard::TEXT.
|
60
|
+
#
|
83
61
|
def self.data(format = TEXT)
|
84
62
|
clipdata = ""
|
85
63
|
self.open
|
86
64
|
begin
|
87
|
-
clipdata =
|
65
|
+
clipdata = GetClipboardData(format)
|
88
66
|
rescue ArgumentError
|
89
67
|
# Assume failure is caused by no data in clipboard
|
90
68
|
end
|
91
69
|
self.close
|
92
70
|
clipdata
|
93
71
|
end
|
94
|
-
|
95
|
-
#
|
96
|
-
|
97
|
-
|
72
|
+
|
73
|
+
# Singleton aliases
|
74
|
+
#
|
75
|
+
class << self
|
76
|
+
alias :get_data :data
|
98
77
|
end
|
99
78
|
|
100
79
|
# Empties the contents of the clipboard.
|
80
|
+
#
|
101
81
|
def self.empty
|
102
82
|
self.open
|
103
|
-
|
83
|
+
EmptyClipboard()
|
104
84
|
self.close
|
105
85
|
self
|
106
86
|
end
|
107
87
|
|
108
88
|
# Returns the number of different data formats currently on the
|
109
89
|
# clipboard.
|
90
|
+
#
|
110
91
|
def self.num_formats
|
111
92
|
count = 0
|
112
93
|
self.open
|
113
|
-
count =
|
94
|
+
count = CountClipboardFormats()
|
114
95
|
self.close
|
115
96
|
count
|
116
97
|
end
|
117
98
|
|
118
99
|
# Returns whether or not +format+ (an int) is currently available.
|
100
|
+
#
|
119
101
|
def self.format_available?(format)
|
120
|
-
|
102
|
+
IsClipboardFormatAvailable(format)
|
121
103
|
end
|
122
104
|
|
123
|
-
# Returns the corresponding name for the given
|
105
|
+
# Returns the corresponding name for the given +format_num+, or nil
|
124
106
|
# if it does not exist. You cannot specify any of the predefined
|
125
107
|
# clipboard formats (or nil is returned), only registered formats.
|
126
|
-
|
108
|
+
#
|
109
|
+
def self.format_name(format_num)
|
127
110
|
val = nil
|
128
111
|
buf = 0.chr * 80
|
129
112
|
self.open
|
130
|
-
if
|
113
|
+
if GetClipboardFormatName(format_num, buf, buf.length) != 0
|
131
114
|
val = buf
|
132
115
|
end
|
133
116
|
self.close
|
@@ -136,21 +119,22 @@ module Win32
|
|
136
119
|
|
137
120
|
# Returns a hash of all the current formats, with the format number as
|
138
121
|
# the key and the format name as the value for that key.
|
122
|
+
#
|
139
123
|
def self.formats
|
140
124
|
formats = {}
|
141
125
|
format = 0
|
142
126
|
|
143
127
|
self.open
|
144
|
-
while 0 != (format =
|
128
|
+
while 0 != (format = EnumClipboardFormats(format))
|
145
129
|
buf = 0.chr * 80
|
146
|
-
|
130
|
+
GetClipboardFormatName(format, buf, buf.length)
|
147
131
|
formats[format] = buf.split(0.chr).first
|
148
132
|
end
|
149
133
|
self.close
|
150
134
|
formats
|
151
135
|
end
|
152
136
|
|
153
|
-
# Registers the given
|
137
|
+
# Registers the given +format+ (a String) as a clipboard format, which
|
154
138
|
# can then be used as a valid clipboard format.
|
155
139
|
#
|
156
140
|
# If a registered format with the specified name already exists, a new
|
@@ -161,22 +145,24 @@ module Win32
|
|
161
145
|
#
|
162
146
|
# Registered clipboard formats are identified by values in the range 0xC000
|
163
147
|
# through 0xFFFF.
|
148
|
+
#
|
164
149
|
def self.register_format(format)
|
165
|
-
if
|
166
|
-
|
150
|
+
if RegisterClipboardFormat(format) == 0
|
151
|
+
error = "RegisterClipboardFormat() call failed: " + get_last_error
|
152
|
+
raise ClipboardError, error
|
167
153
|
end
|
168
154
|
end
|
169
155
|
|
170
156
|
private
|
171
157
|
|
172
158
|
def self.open
|
173
|
-
if 0 ==
|
174
|
-
raise ClipboardError, "OpenClipboard() failed"
|
159
|
+
if 0 == OpenClipboard(0)
|
160
|
+
raise ClipboardError, "OpenClipboard() failed: " + get_last_error
|
175
161
|
end
|
176
162
|
end
|
177
163
|
|
178
164
|
def self.close
|
179
|
-
|
165
|
+
CloseClipboard()
|
180
166
|
end
|
181
167
|
end
|
182
168
|
end
|
data/test/tc_clipboard.rb
CHANGED
@@ -18,7 +18,7 @@ include Win32
|
|
18
18
|
|
19
19
|
class TC_Win32ClipBoard < Test::Unit::TestCase
|
20
20
|
def test_version
|
21
|
-
assert_equal('0.4.
|
21
|
+
assert_equal('0.4.1', Clipboard::VERSION)
|
22
22
|
end
|
23
23
|
|
24
24
|
def test_data
|
@@ -28,6 +28,14 @@ class TC_Win32ClipBoard < Test::Unit::TestCase
|
|
28
28
|
assert_raises(NameError){ Clipboard.data(CF_FOO) }
|
29
29
|
end
|
30
30
|
|
31
|
+
# Alias
|
32
|
+
def test_get_data
|
33
|
+
assert_respond_to(Clipboard, :get_data)
|
34
|
+
assert_nothing_raised{ Clipboard.get_data }
|
35
|
+
assert_kind_of(String, Clipboard.get_data, 'bad data type')
|
36
|
+
assert_raises(NameError){ Clipboard.get_data(CF_FOO) }
|
37
|
+
end
|
38
|
+
|
31
39
|
def test_set_data
|
32
40
|
assert_respond_to(Clipboard, :set_data)
|
33
41
|
assert_nothing_raised{ Clipboard.set_data("foo") }
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.
|
2
|
+
rubygems_version: 0.9.0
|
3
3
|
specification_version: 1
|
4
4
|
name: win32-clipboard
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.4.
|
7
|
-
date: 2006-
|
6
|
+
version: 0.4.1
|
7
|
+
date: 2006-07-30 00:00:00 -06:00
|
8
8
|
summary: A package for interacting with the Windows clipboard
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -25,6 +25,7 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
25
25
|
platform: ruby
|
26
26
|
signing_key:
|
27
27
|
cert_chain:
|
28
|
+
post_install_message:
|
28
29
|
authors:
|
29
30
|
- Daniel J. Berger
|
30
31
|
files:
|
@@ -47,5 +48,13 @@ extensions: []
|
|
47
48
|
|
48
49
|
requirements: []
|
49
50
|
|
50
|
-
dependencies:
|
51
|
-
|
51
|
+
dependencies:
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
name: windows-pr
|
54
|
+
version_requirement:
|
55
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 0.4.1
|
60
|
+
version:
|