clipboard 0.8.4 → 0.9.0
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/README.rdoc +8 -4
- data/VERSION +1 -1
- data/clipboard.gemspec +2 -2
- data/lib/clipboard.rb +52 -27
- data/version.rb +1 -1
- metadata +5 -5
data/README.rdoc
CHANGED
@@ -15,15 +15,19 @@ On Linux, you can choose, from which clipboard you want to +paste+, default is P
|
|
15
15
|
|
16
16
|
+copy+ copies to all clipboards in Clipboard::CLIPBOARDS.
|
17
17
|
|
18
|
+
==== Windows Encoding note
|
19
|
+
In you use 1.9, the Clipboard encoding will be translated into UTF-8 and then to your Encoding.default_external
|
20
|
+
If you use 1.8, it will fallback to CP850 encoding
|
21
|
+
|
18
22
|
=== Non-gem requirements
|
19
23
|
* *Linux*: +xclip+ (you can install it on debian/ubuntu with <tt>sudo apt-get install xclip</tt>)
|
20
24
|
* *Windows*: +clip+ (installed by default since Vista)
|
21
25
|
|
22
|
-
===
|
23
|
-
*
|
24
|
-
* Don't depend on +xclip+
|
26
|
+
=== Todo
|
27
|
+
* Don't depend on +clip+
|
28
|
+
* Don't depend on +xclip+
|
25
29
|
|
26
|
-
Feel free to report bugs or to implement one of the
|
30
|
+
Feel free to report bugs or to implement one of the Todo entries ;)
|
27
31
|
|
28
32
|
=== Copyright
|
29
33
|
Copyright (c) 2010 Jan Lelis, http://rbjl.net, released under the MIT license
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.9.0
|
data/clipboard.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{clipboard}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.9.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jan Lelis"]
|
12
|
-
s.date = %q{2010-10-
|
12
|
+
s.date = %q{2010-10-13}
|
13
13
|
s.description = %q{Access the clipboard on all systems (Clipboard.copy & Clipboard.paste)}
|
14
14
|
s.email = %q{mail@janlelis.de}
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/clipboard.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'zucker/os'
|
2
|
+
require 'zucker/version'
|
2
3
|
require 'zucker/alias_for'
|
3
4
|
require 'stringio'
|
4
5
|
require File.expand_path '../../version', __FILE__
|
@@ -7,42 +8,66 @@ module Clipboard
|
|
7
8
|
if OS.windows?
|
8
9
|
WriteCommands = ['clip']
|
9
10
|
CF_TEXT = 1
|
11
|
+
CF_UNICODETEXT = 13
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
-
@open = Win32API.new("user32", "OpenClipboard",['L'],'L')
|
14
|
-
@close = Win32API.new("user32", "CloseClipboard",[],'L')
|
15
|
-
@empty = Win32API.new("user32", "EmptyClipboard",[],'L')
|
16
|
-
@get = Win32API.new("user32", "GetClipboardData", ['L'], 'L')
|
17
|
-
@lock = Win32API.new("kernel32", "GlobalLock", ['L'], 'P')
|
18
|
-
@unlock = Win32API.new("kernel32", "GlobalUnlock", ['L'], 'L')
|
19
|
-
instance_variables.each{ |handler|
|
20
|
-
instance_variable_get(handler).instance_eval do
|
21
|
-
alias [] call
|
22
|
-
end
|
23
|
-
}
|
13
|
+
# get ffi function handlers
|
14
|
+
require 'ffi'
|
24
15
|
|
16
|
+
module User32
|
17
|
+
extend FFI::Library
|
18
|
+
ffi_lib "user32"
|
19
|
+
ffi_convention :stdcall
|
20
|
+
|
21
|
+
attach_function :open, :OpenClipboard, [ :long ], :long
|
22
|
+
attach_function :close, :CloseClipboard, [ ], :long
|
23
|
+
attach_function :empty, :EmptyClipboard, [ ], :long
|
24
|
+
attach_function :get, :GetClipboardData, [ :long ], :long
|
25
|
+
end
|
26
|
+
|
27
|
+
module Kernel32
|
28
|
+
extend FFI::Library
|
29
|
+
ffi_lib 'kernel32'
|
30
|
+
ffi_convention :stdcall
|
31
|
+
|
32
|
+
attach_function :lock, :GlobalLock, [ :long ], :pointer
|
33
|
+
attach_function :unlock, :GlobalUnlock, [ :long ], :long
|
34
|
+
end
|
35
|
+
|
25
36
|
# paste & clear
|
26
|
-
#
|
27
|
-
# does not work on 1.9, has probably something to do with utf8 strings ?
|
37
|
+
# see http://www.codeproject.com/KB/clipboard/archerclipboard1.aspx
|
28
38
|
def self.paste(_=nil)
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
39
|
+
ret = ""
|
40
|
+
if 0 != User32.open( 0 )
|
41
|
+
hclip = User32.get( CF_UNICODETEXT )
|
42
|
+
if hclip && 0 != hclip
|
43
|
+
pointer_to_data = Kernel32.lock( hclip )
|
44
|
+
data = ""
|
45
|
+
# Windows Unicode is ended by to null bytes, so get the whole string
|
46
|
+
current_byte = 0
|
47
|
+
until data.size >= 2 && data[-1].ord == 0 && data[-2].ord == 0
|
48
|
+
data << pointer_to_data.get_bytes( current_byte, 1 )
|
49
|
+
current_byte += 1
|
50
|
+
end
|
51
|
+
if RubyVersion >= 1.9
|
52
|
+
ret = data.chop.force_encoding("UTF-16LE").encode('UTF-8').encode(Encoding.default_external) # TODO check if direct translation is possible
|
53
|
+
else # 1.8: fallback to simple CP850 encoding
|
54
|
+
require 'iconv'
|
55
|
+
utf8 = Iconv.iconv( "UTF-8", "UTF-16LE", data.chop)[0]
|
56
|
+
ret = Iconv.iconv( "CP850", "UTF-8", utf8)[0]
|
57
|
+
end
|
58
|
+
if data && 0 != data
|
59
|
+
Kernel32.unlock( hclip )
|
35
60
|
end
|
36
61
|
end
|
37
|
-
|
62
|
+
User32.close( )
|
38
63
|
end
|
39
|
-
|
64
|
+
ret || ""
|
40
65
|
end
|
41
|
-
|
66
|
+
|
42
67
|
def self.clear
|
43
|
-
|
44
|
-
|
45
|
-
|
68
|
+
User32.open( 0 )
|
69
|
+
User32.empty( )
|
70
|
+
User32.close( )
|
46
71
|
paste
|
47
72
|
end
|
48
73
|
else #non-windows
|
data/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: clipboard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 59
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 9
|
9
|
+
- 0
|
10
|
+
version: 0.9.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jan Lelis
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-10-
|
18
|
+
date: 2010-10-13 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|