clipboard 1.3.2 → 1.3.6
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/MIT-LICENSE.txt +1 -1
- data/README.md +18 -7
- data/clipboard.gemspec +9 -8
- data/lib/clipboard.rb +1 -1
- data/lib/clipboard/cygwin.rb +2 -2
- data/lib/clipboard/linux.rb +1 -1
- data/lib/clipboard/version.rb +1 -1
- data/lib/clipboard/windows.rb +39 -36
- data/spec/clipboard_file_spec.rb +4 -0
- data/spec/clipboard_spec.rb +21 -12
- data/spec/spec_helper.rb +2 -0
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bce074b10a99ccac1cae0b51ab4a896cd366409376f54a93f39d3405fca795a7
|
4
|
+
data.tar.gz: 0676b27cf0ab8ecb7ba8eed63c72e7785c5d1c786546ade903a2e59e093dcf61
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a81a237755008ec1f8ea650b585d0f751e50b5e53e14db7e0490514e5f6894fe04333ebff7f0f4a2106d23c552ac2a84c7696f37bfba6c3e3361aaee89d8391
|
7
|
+
data.tar.gz: 97099eb3b2ac762e79d4aa63da3bc3c6c4c8bcd510f3d846c551bb9ff3312c3e85466bd3edc332cc421be8f9dff319035a59f8ec6195bae91e3780eb36b06200
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 1.3.6
|
4
|
+
* Fix Windows implementation (so it works on more recent Windows), patch by @P3t3rU5
|
5
|
+
|
6
|
+
## 1.3.5
|
7
|
+
* Fix missing String#+@ method on Ruby <2.3, patch by @AaronC81
|
8
|
+
|
9
|
+
## 1.3.4
|
10
|
+
* Don't break on Ruby 2.1, patch by @grosser
|
11
|
+
|
12
|
+
## 1.3.3
|
13
|
+
* Fix Cygwin implementation to work when File constant is loaded, fix by @ntachino
|
14
|
+
|
3
15
|
## 1.3.2
|
4
16
|
* Windows version actually mutates a string, fix by @scivola
|
5
17
|
|
data/MIT-LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Clipboard Ruby Gem [](https://badge.fury.io/rb/clipboard) [
|
1
|
+
# Clipboard Ruby Gem [](https://badge.fury.io/rb/clipboard) [![[ci]](https://github.com/janlelis/clipboard/workflows/Test/badge.svg)](https://github.com/janlelis/clipboard/actions?query=workflow%3ATest)
|
2
2
|
|
3
3
|
Lets you access the clipboard from everywhere. Currently supported platforms:
|
4
4
|
|
@@ -10,10 +10,14 @@ Lets you access the clipboard from everywhere. Currently supported platforms:
|
|
10
10
|
- Gtk+ (Cross Platform Widget Toolkit)
|
11
11
|
- Java (on JRuby)
|
12
12
|
|
13
|
+
Supported Rubies: **3.0**, **2.7**, **2.6**
|
14
|
+
|
15
|
+
Unsupported, but might still work: **2.5**, **2.4**, **2.3**, **2.2**, **2.1**, **2.0**
|
16
|
+
|
13
17
|
## Usage
|
14
18
|
|
15
19
|
* `Clipboard.copy` - Copies a string to system clipboard
|
16
|
-
* `Clipboard.paste` - Paste contents from system clipboard as string
|
20
|
+
* `Clipboard.paste` - Paste text contents from system clipboard as string
|
17
21
|
* `Clipboard.clear` - Empties the system clipboard
|
18
22
|
|
19
23
|
## Setup
|
@@ -21,11 +25,11 @@ Lets you access the clipboard from everywhere. Currently supported platforms:
|
|
21
25
|
Add the following lines to your `Gemfile`:
|
22
26
|
|
23
27
|
```ruby
|
24
|
-
gem
|
25
|
-
gem
|
28
|
+
gem "clipboard"
|
29
|
+
gem "ffi", :platforms => [:mswin, :mingw] # Required by Clipboard on Windows
|
26
30
|
```
|
27
31
|
|
28
|
-
- Important note for
|
32
|
+
- **Important note for Linux** users: The clipboard requires the *xsel* or the *xclip* command-line program. On debian and ubuntu, *xsel* can be installed with: `sudo apt-get install xsel`
|
29
33
|
|
30
34
|
## Clipboard Implementations
|
31
35
|
|
@@ -82,6 +86,13 @@ $ blip FILE_NAME
|
|
82
86
|
|
83
87
|
Without any arguments, it will just paste the contents of the clipboard.
|
84
88
|
|
85
|
-
|
89
|
+
## Further Development
|
90
|
+
|
91
|
+
This is a list of nice-to-have features - feel free to open a PR or let me know if you want to work on one of these:
|
92
|
+
|
93
|
+
- Wayland support (via FFI?)
|
94
|
+
- Support clipboard meta data
|
95
|
+
|
96
|
+
## MIT
|
86
97
|
|
87
|
-
Copyright (c) 2010-
|
98
|
+
Copyright (c) 2010-2021 Jan Lelis <https://janlelis.com> released under the MIT license. Contributions by and thanks to [Michael Grosser and all the other contributors!](https://github.com/janlelis/clipboard/graphs/contributors)
|
data/clipboard.gemspec
CHANGED
@@ -1,16 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
$:.unshift File.expand_path("../lib", __FILE__)
|
2
4
|
require 'clipboard/version'
|
3
5
|
|
4
6
|
Gem::Specification.new do |s|
|
5
|
-
s.name
|
6
|
-
s.version
|
7
|
-
|
8
|
-
s.
|
9
|
-
s.summary
|
7
|
+
s.name = 'clipboard'
|
8
|
+
s.version = Clipboard::VERSION
|
9
|
+
s.authors = ["Jan Lelis"]
|
10
|
+
s.email = ["hi@ruby.consulting"]
|
11
|
+
s.summary = "Access to the clipboard on Linux, MacOS, Windows, and Cygwin."
|
10
12
|
s.description = "Access to the clipboard on Linux, MacOS, Windows, and Cygwin: Clipboard.copy, Clipboard.paste, Clipboard.clear"
|
11
|
-
s.email = "mail@janlelis.de"
|
12
13
|
s.homepage = "https://github.com/janlelis/clipboard"
|
13
|
-
s.license
|
14
|
+
s.license = "MIT"
|
14
15
|
s.requirements = [
|
15
16
|
"Linux: You need xclip or xsel. On debian/ubuntu run: sudo apt-get install xsel",
|
16
17
|
"Windows: You need the ffi gem",
|
@@ -18,7 +19,7 @@ Gem::Specification.new do |s|
|
|
18
19
|
s.files = Dir.glob(%w[{lib,spec}/**/*.rb [A-Z]*.txt [A-Z]*.md]) + %w{clipboard.gemspec}
|
19
20
|
|
20
21
|
s.required_ruby_version = '>= 1.9.3'
|
21
|
-
s.add_development_dependency 'rake', '~>
|
22
|
+
s.add_development_dependency 'rake', '~> 13.0'
|
22
23
|
s.add_development_dependency 'rspec', '~> 3'
|
23
24
|
# s.add_development_dependency 'ffi', '~> 1.9'
|
24
25
|
# s.add_development_dependency 'gtk3', '~> 3'
|
data/lib/clipboard.rb
CHANGED
@@ -35,7 +35,7 @@ module Clipboard
|
|
35
35
|
# Running additional check to detect if running in Microsoft WSL
|
36
36
|
if os == :Linux
|
37
37
|
require "etc"
|
38
|
-
if Etc.uname[:release] =~ /Microsoft/
|
38
|
+
if Etc.respond_to?(:uname) && Etc.uname[:release] =~ /Microsoft/ # uname was added in ruby 2.2
|
39
39
|
os = :Wsl
|
40
40
|
end
|
41
41
|
end
|
data/lib/clipboard/cygwin.rb
CHANGED
@@ -5,11 +5,11 @@ module Clipboard
|
|
5
5
|
extend self
|
6
6
|
|
7
7
|
def paste(_ = nil)
|
8
|
-
File.read("/dev/clipboard")
|
8
|
+
::File.read("/dev/clipboard")
|
9
9
|
end
|
10
10
|
|
11
11
|
def copy(data)
|
12
|
-
File.open("/dev/clipboard", "w"){ |f| f.write(data) }
|
12
|
+
::File.open("/dev/clipboard", "w"){ |f| f.write(data) }
|
13
13
|
paste
|
14
14
|
end
|
15
15
|
|
data/lib/clipboard/linux.rb
CHANGED
@@ -27,7 +27,7 @@ module Clipboard
|
|
27
27
|
}.freeze
|
28
28
|
else
|
29
29
|
raise Clipboard::ClipboardLoadError, "clipboard: Could not find required program xclip or xsel\n" \
|
30
|
-
|
30
|
+
"On debian/ubuntu, you can install it with: sudo apt-get install xsel"
|
31
31
|
end
|
32
32
|
|
33
33
|
def paste(which = nil)
|
data/lib/clipboard/version.rb
CHANGED
data/lib/clipboard/windows.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative 'utils'
|
4
4
|
|
5
5
|
module Clipboard
|
6
6
|
module Windows
|
@@ -19,14 +19,14 @@ module Clipboard
|
|
19
19
|
|
20
20
|
module User32
|
21
21
|
extend FFI::Library
|
22
|
-
ffi_lib
|
22
|
+
ffi_lib 'user32'
|
23
23
|
ffi_convention :stdcall
|
24
24
|
|
25
|
-
attach_function :open, :OpenClipboard, [ :
|
26
|
-
attach_function :close, :CloseClipboard, [ ], :
|
27
|
-
attach_function :empty, :EmptyClipboard, [ ], :
|
28
|
-
attach_function :get, :GetClipboardData, [ :long ], :
|
29
|
-
attach_function :set, :SetClipboardData, [ :long, :
|
25
|
+
attach_function :open, :OpenClipboard, [ :pointer ], :bool
|
26
|
+
attach_function :close, :CloseClipboard, [ ], :bool
|
27
|
+
attach_function :empty, :EmptyClipboard, [ ], :bool
|
28
|
+
attach_function :get, :GetClipboardData, [ :long ], :pointer
|
29
|
+
attach_function :set, :SetClipboardData, [ :long, :pointer ], :pointer
|
30
30
|
end
|
31
31
|
|
32
32
|
module Kernel32
|
@@ -34,53 +34,56 @@ module Clipboard
|
|
34
34
|
ffi_lib 'kernel32'
|
35
35
|
ffi_convention :stdcall
|
36
36
|
|
37
|
-
attach_function :lock, :GlobalLock, [ :
|
38
|
-
attach_function :unlock, :GlobalUnlock, [ :
|
39
|
-
attach_function :size, :GlobalSize, [ :
|
40
|
-
attach_function :alloc, :GlobalAlloc, [ :long, :long ], :
|
37
|
+
attach_function :lock, :GlobalLock, [ :pointer ], :pointer
|
38
|
+
attach_function :unlock, :GlobalUnlock, [ :pointer ], :bool
|
39
|
+
attach_function :size, :GlobalSize, [ :pointer ], :long
|
40
|
+
attach_function :alloc, :GlobalAlloc, [ :long, :long ], :pointer
|
41
41
|
end
|
42
42
|
|
43
43
|
# see http://www.codeproject.com/KB/clipboard/archerclipboard1.aspx
|
44
44
|
def paste(_ = nil)
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
data
|
45
|
+
return String.new unless User32.open(nil)
|
46
|
+
|
47
|
+
hclip = User32.get( CF_UNICODETEXT )
|
48
|
+
return String.new if hclip.null?
|
49
|
+
|
50
|
+
pointer_to_data = Kernel32.lock( hclip )
|
51
|
+
# Windows Unicode is ended by two null bytes, so get the whole string
|
52
|
+
size = Kernel32.size( hclip )
|
53
|
+
data = pointer_to_data.read_string( size - 2 )
|
54
|
+
data.force_encoding(Encoding::UTF_16LE)
|
55
|
+
ensure
|
56
|
+
Kernel32.unlock(hclip) if hclip && !hclip.null?
|
57
|
+
User32.close
|
59
58
|
end
|
60
59
|
|
61
60
|
def clear
|
62
|
-
if
|
63
|
-
User32.empty( )
|
64
|
-
User32.close( )
|
65
|
-
end
|
61
|
+
User32.empty if User32.open(nil)
|
66
62
|
paste
|
63
|
+
ensure
|
64
|
+
User32.close
|
67
65
|
end
|
68
66
|
|
69
67
|
def copy(data_to_copy)
|
70
|
-
if
|
71
|
-
User32.empty
|
72
|
-
data = data_to_copy.encode(
|
68
|
+
if User32.open(nil)
|
69
|
+
User32.empty
|
70
|
+
data = data_to_copy.encode(Encoding::UTF_16LE) # TODO: catch bad encodings
|
73
71
|
data << 0
|
74
72
|
handler = Kernel32.alloc( GMEM_MOVEABLE, data.bytesize )
|
75
73
|
pointer_to_data = Kernel32.lock( handler )
|
76
|
-
|
77
|
-
|
74
|
+
begin
|
75
|
+
pointer_to_data.write_string( data )
|
76
|
+
ensure
|
77
|
+
Kernel32.unlock( handler )
|
78
|
+
end
|
78
79
|
User32.set( CF_UNICODETEXT, handler )
|
79
|
-
|
80
|
+
data.chop
|
80
81
|
else # don't touch anything
|
81
82
|
Utils.popen "clip", data_to_copy # depends on clip (available by default since Vista)
|
83
|
+
paste
|
82
84
|
end
|
83
|
-
|
85
|
+
ensure
|
86
|
+
User32.close
|
84
87
|
end
|
85
88
|
end
|
86
89
|
end
|
data/spec/clipboard_file_spec.rb
CHANGED
data/spec/clipboard_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Please note: cannot test, if it really accesses your platform clipboard.
|
2
4
|
|
3
5
|
require_relative "spec_helper"
|
@@ -7,31 +9,37 @@ os_to_restore = RbConfig::CONFIG['host_os']
|
|
7
9
|
describe Clipboard do
|
8
10
|
before do
|
9
11
|
RbConfig::CONFIG['host_os'] = os_to_restore
|
12
|
+
@is_windows = Clipboard.implementation.name == 'Clipboard::Windows'
|
10
13
|
end
|
11
14
|
|
15
|
+
let(:expected) { ->(text) { @is_windows ? text.encode(Encoding::UTF_16LE) : text } }
|
16
|
+
|
12
17
|
it "has a VERSION" do
|
13
18
|
expect( Clipboard::VERSION ).to match /^\d+\.\d+\.\d+$/
|
14
19
|
end
|
15
20
|
|
16
21
|
it "can copy & paste" do
|
17
|
-
|
18
|
-
|
22
|
+
text = "FOO\nBAR"
|
23
|
+
Clipboard.copy(text)
|
24
|
+
expect( Clipboard.paste.bytes ).to eq expected.(text).bytes
|
19
25
|
end
|
20
26
|
|
21
27
|
it "can copy & paste with multibyte char" do
|
22
|
-
Encoding.default_external =
|
23
|
-
|
24
|
-
|
28
|
+
Encoding.default_external = 'utf-8'
|
29
|
+
text = '日本語'
|
30
|
+
Clipboard.copy(text)
|
31
|
+
expect( Clipboard.paste ).to eq expected.(text)
|
25
32
|
end
|
26
33
|
|
27
34
|
it "returns data on copy" do
|
28
|
-
|
35
|
+
text = 'xxx'
|
36
|
+
expect( Clipboard.copy(text) ).to eq expected.(text)
|
29
37
|
end
|
30
38
|
|
31
39
|
it "can clear" do
|
32
40
|
Clipboard.copy('xxx')
|
33
41
|
Clipboard.clear
|
34
|
-
expect( Clipboard.paste ).to eq ''
|
42
|
+
expect( Clipboard.paste ).to eq expected.('')
|
35
43
|
end
|
36
44
|
|
37
45
|
describe "when included" do
|
@@ -41,10 +49,11 @@ describe Clipboard do
|
|
41
49
|
|
42
50
|
it "can copy & paste & clear" do
|
43
51
|
a = A.new
|
44
|
-
|
45
|
-
expect( a.send(:
|
52
|
+
text = 'XXX'
|
53
|
+
expect( a.send(:copy, text) ).to eq expected.(text)
|
54
|
+
expect( a.send(:paste) ).to eq expected.(text)
|
46
55
|
a.send(:clear)
|
47
|
-
expect( a.send(:paste) ).to eq ''
|
56
|
+
expect( a.send(:paste) ).to eq expected.('')
|
48
57
|
end
|
49
58
|
end
|
50
59
|
|
@@ -54,13 +63,13 @@ describe Clipboard do
|
|
54
63
|
data1 = Random.new.bytes(2**14).unpack("H*").first
|
55
64
|
data2 = Clipboard.copy(data1)
|
56
65
|
|
57
|
-
expect(data2).to eq data1
|
66
|
+
expect(data2).to eq expected.(data1)
|
58
67
|
|
59
68
|
# second batch
|
60
69
|
data1 = Random.new.bytes(2**14).unpack("H*").first
|
61
70
|
data2 = Clipboard.copy(data1)
|
62
71
|
|
63
|
-
expect(data2).to eq data1
|
72
|
+
expect(data2).to eq expected.(data1)
|
64
73
|
end
|
65
74
|
|
66
75
|
describe :implementation do
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: clipboard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Lelis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-07-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '13.0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '13.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -40,7 +40,8 @@ dependencies:
|
|
40
40
|
version: '3'
|
41
41
|
description: 'Access to the clipboard on Linux, MacOS, Windows, and Cygwin: Clipboard.copy,
|
42
42
|
Clipboard.paste, Clipboard.clear'
|
43
|
-
email:
|
43
|
+
email:
|
44
|
+
- hi@ruby.consulting
|
44
45
|
executables: []
|
45
46
|
extensions: []
|
46
47
|
extra_rdoc_files: []
|
@@ -85,8 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
85
86
|
requirements:
|
86
87
|
- 'Linux: You need xclip or xsel. On debian/ubuntu run: sudo apt-get install xsel'
|
87
88
|
- 'Windows: You need the ffi gem'
|
88
|
-
|
89
|
-
rubygems_version: 2.7.7
|
89
|
+
rubygems_version: 3.2.3
|
90
90
|
signing_key:
|
91
91
|
specification_version: 4
|
92
92
|
summary: Access to the clipboard on Linux, MacOS, Windows, and Cygwin.
|