clipboard 0.9.3 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source :rubygems
2
+
3
+ group :dev do
4
+ gem 'rake'
5
+ gem 'rspec', '>=2'
6
+ end
@@ -0,0 +1,20 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ diff-lcs (1.1.2)
5
+ rake (0.8.7)
6
+ rspec (2.4.0)
7
+ rspec-core (~> 2.4.0)
8
+ rspec-expectations (~> 2.4.0)
9
+ rspec-mocks (~> 2.4.0)
10
+ rspec-core (2.4.0)
11
+ rspec-expectations (2.4.0)
12
+ diff-lcs (~> 1.1.2)
13
+ rspec-mocks (2.4.0)
14
+
15
+ PLATFORMS
16
+ ruby
17
+
18
+ DEPENDENCIES
19
+ rake
20
+ rspec (>= 2)
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010 Jan Lelis
1
+ Copyright (c) 2010-2011 Jan Lelis
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -11,7 +11,7 @@ You have <tt>Clipboard.copy</tt>,
11
11
  Have fun ;)
12
12
 
13
13
  ==== Multiple clipboards
14
- On Linux, you can choose, from which clipboard you want to +paste+, default is PRIMARY.
14
+ On Linux, you can choose, from which clipboard you want to +paste+, default is CLIPBOARD.
15
15
 
16
16
  +copy+ copies to all clipboards in Clipboard::CLIPBOARDS.
17
17
 
@@ -29,7 +29,14 @@ Copying with 1.8 will fallback to the +clip+ utility, which is installed by defa
29
29
 
30
30
  Feel free to report bugs or to implement one of the Todo entries ;)
31
31
 
32
+ === blip
33
+
34
+ Copy and paste from the commandline (like xclip, pbpaste/pbcopy), but even easier? {blip}[http://rubygems.org/gems/blip]!
35
+
32
36
  === Copyright
33
- Copyright (c) 2010 Jan Lelis, http://rbjl.net, released under the MIT license
37
+ Copyright (c) 2010-2011 Jan Lelis, http://rbjl.net, released under the MIT license
38
+
39
+ Contributions by
40
+ * Michael Grosser
34
41
 
35
42
  J-_-L
data/Rakefile CHANGED
@@ -2,6 +2,12 @@ require 'rake'
2
2
  require 'rake/rdoctask'
3
3
  require 'fileutils'
4
4
 
5
+ task :default => :spec
6
+ require "rspec/core/rake_task"
7
+ RSpec::Core::RakeTask.new(:spec) do |t|
8
+ t.rspec_opts = '--backtrace --color'
9
+ end
10
+
5
11
  def gemspec
6
12
  @gemspec ||= eval(File.read('clipboard.gemspec'), binding, 'clipboard.gemspec')
7
13
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.3
1
+ 0.9.4
@@ -6,7 +6,7 @@ Gem::Specification.new do |s|
6
6
  s.version = File.read('VERSION').chomp
7
7
 
8
8
  s.authors = ["Jan Lelis"]
9
- s.date = '2010-12-15'
9
+ s.date = '2011-01-16'
10
10
  s.summary = 'Access the clipboard on all systems.'
11
11
  s.description = 'Access the clipboard on all systems (Clipboard.copy & Clipboard.paste).'
12
12
  s.email = 'mail@janlelis.de'
@@ -14,14 +14,5 @@ Gem::Specification.new do |s|
14
14
  s.rubygems_version = %q{1.3.7}
15
15
  s.requirements = ["On Linux (or other X), you need xclip. Install it on debian/ubuntu with sudo apt-get install xclip"]
16
16
  s.requirements << ["On Windows, you need the ffi gem."]
17
- s.files = %w[
18
- LICENSE
19
- README.rdoc
20
- Rakefile
21
- VERSION
22
- clipboard.gemspec
23
- lib/clipboard.rb
24
- ]
25
- s.extra_rdoc_files = %w[LICENSE README.rdoc]
26
- s.add_dependency 'zucker', '>= 8'
17
+ s.files = Dir.glob(%w[{lib,spec}/**/*.rb [A-Z]* [A-Z]*.rdoc]) + %w{clipboard.gemspec}
27
18
  end
@@ -1,144 +1,18 @@
1
- require 'zucker/os'
2
- require 'zucker/version'
3
-
4
1
  module Clipboard
5
2
  extend self
6
3
  VERSION = File.read( (File.dirname(__FILE__) + '/../VERSION') ).chomp
7
4
 
8
- if OS.windows?
9
- CF_TEXT = 1
10
- CF_UNICODETEXT = 13
11
- GMEM_MOVEABLE = 2
12
-
13
- # get ffi function handlers
14
- begin
15
- require 'ffi'
16
- rescue LoadError
17
- raise LoadError, 'Could not load the required ffi gem, install it with: gem install ffi'
18
- end
19
-
20
- module User32
21
- extend FFI::Library
22
- ffi_lib "user32"
23
- ffi_convention :stdcall
24
-
25
- attach_function :open, :OpenClipboard, [ :long ], :long
26
- attach_function :close, :CloseClipboard, [ ], :long
27
- attach_function :empty, :EmptyClipboard, [ ], :long
28
- attach_function :get, :GetClipboardData, [ :long ], :long
29
- attach_function :set, :SetClipboardData, [ :long, :long ], :long
30
- end
31
-
32
- module Kernel32
33
- extend FFI::Library
34
- ffi_lib 'kernel32'
35
- ffi_convention :stdcall
36
-
37
- attach_function :lock, :GlobalLock, [ :long ], :pointer
38
- attach_function :unlock, :GlobalUnlock, [ :long ], :long
39
- attach_function :alloc, :GlobalAlloc, [ :long, :long ], :long
40
- end
41
-
42
- # see http://www.codeproject.com/KB/clipboard/archerclipboard1.aspx
43
- def paste(_=nil)
44
- ret = ""
45
- if 0 != User32.open( 0 )
46
- hclip = User32.get( CF_UNICODETEXT )
47
- if hclip && 0 != hclip
48
- pointer_to_data = Kernel32.lock( hclip )
49
- data = ""
50
- # Windows Unicode is ended by to null bytes, so get the whole string
51
- current_byte = 0
52
- until data.size >= 2 && data[-1].ord == 0 && data[-2].ord == 0
53
- data << pointer_to_data.get_bytes( current_byte, 1 )
54
- current_byte += 1
55
- end
56
- if RubyVersion >= 1.9
57
- ret = data.chop.force_encoding("UTF-16LE").encode(Encoding.default_external) # TODO catch bad encodings
58
- else # 1.8: fallback to simple CP850 encoding
59
- require 'iconv'
60
- utf8 = Iconv.iconv( "UTF-8", "UTF-16LE", data.chop)[0]
61
- ret = Iconv.iconv( "CP850", "UTF-8", utf8)[0]
62
- end
63
- if data && 0 != data
64
- Kernel32.unlock( hclip )
65
- end
66
- end
67
- User32.close( )
68
- end
69
- ret || ""
70
- end
71
-
72
- def clear
73
- if 0 != User32.open( 0 )
74
- User32.empty( )
75
- User32.close( )
76
- end
77
- paste
78
- end
79
-
80
- def copy(data_to_copy)
81
- if RubyVersion >= 1.9 && 0 != User32.open( 0 )
82
- User32.empty( )
83
- data = data_to_copy.encode("UTF-16LE") # TODO catch bad encodings
84
- data << 0 << 0
85
- handler = Kernel32.alloc( GMEM_MOVEABLE, data.bytesize )
86
- pointer_to_data = Kernel32.lock( handler )
87
- pointer_to_data.put_bytes( 0, data, 0, data.bytesize )
88
- Kernel32.unlock( handler )
89
- User32.set( CF_UNICODETEXT, handler )
90
- User32.close( )
91
- else # don't touch anything
92
- IO.popen( 'clip', 'w' ){ |input| input << data_to_copy } # depends on clip (available by default since Vista)
93
- end
94
- paste
95
- end
96
- else #non-windows
97
- require 'open3'
98
-
99
- if OS.mac?
100
- CLIPBOARDS = []
101
- WriteCommands = ['pbcopy']
102
- ReadCommand = 'pbpaste'
103
- else # linuX
104
- CLIPBOARDS = %w[clipboard primary secondary]
105
- WriteCommands = CLIPBOARDS.map{|cb| 'xclip -selection ' + cb }
106
- ReadCommand = 'xclip -o'
107
-
108
- # catch dependency errors
109
- begin
110
- Open3.popen3( "xclip -version" ){ |_, _, error|
111
- unless error.read =~ /^xclip version/
112
- raise LoadError
113
- end
114
- }
115
- rescue Exception
116
- raise LoadError, "clipboard -\n" +
117
- "Could not find required prgram xclip\n" +
118
- "You can install it (on debian/ubuntu) with sudo apt-get install xclip"
119
- end
120
- end
121
-
122
- def paste(which = nil)
123
- selection_string = if CLIPBOARDS.include?(which.to_s)
124
- " -selection #{which}"
125
- else
126
- ''
127
- end
128
- %x[#{ ReadCommand + selection_string }]
129
- end
130
-
131
- def clear
132
- copy ''
133
- end
134
-
135
- def copy(data)
136
- WriteCommands.each{ |cmd|
137
- IO.popen( cmd, 'w' ){ |input| input << data }
138
- }
139
- paste
5
+ os = proc do
6
+ case RbConfig::CONFIG['host_os']
7
+ when /mac|darwin/ then 'mac'
8
+ when /linux|cygwin/ then 'linux'
9
+ when /mswin|mingw/ then 'windows'
10
+ when /bsd/ then 'linux'
11
+ # when /solaris|sunos/ then 'linux' # needs testing..
12
+ else
13
+ raise "You OS is not supported -> fork me"
140
14
  end
141
15
  end
142
- end
143
16
 
144
- # J-_-L
17
+ require "clipboard/#{os.call}"
18
+ end
@@ -0,0 +1,28 @@
1
+ module Clipboard
2
+ CLIPBOARDS = %w[clipboard primary secondary]
3
+ WriteCommands = CLIPBOARDS.map{|cb| 'xclip -selection ' + cb }
4
+ ReadCommand = 'xclip -o'
5
+
6
+ # catch dependency errors
7
+ if `which xclip`.empty?
8
+ raise LoadError, "clipboard:\n" +
9
+ "Could not find required prgram xclip\n" +
10
+ "On debian/ubuntu, you can install it with: sudo apt-get install xclip"
11
+ end
12
+
13
+ def paste(which = nil)
14
+ which ||= CLIPBOARDS.first
15
+ `#{ReadCommand} -selection #{which}`
16
+ end
17
+
18
+ def clear
19
+ copy ''
20
+ end
21
+
22
+ def copy(data)
23
+ WriteCommands.each{ |cmd|
24
+ IO.popen( cmd, 'w' ){ |input| input << data }
25
+ }
26
+ paste
27
+ end
28
+ end
@@ -0,0 +1,14 @@
1
+ module Clipboard
2
+ def paste(_ = nil)
3
+ `pbpaste`
4
+ end
5
+
6
+ def copy(data)
7
+ IO.popen('pbcopy', 'w'){|input| input << data }
8
+ paste
9
+ end
10
+
11
+ def clear
12
+ copy ''
13
+ end
14
+ end
@@ -0,0 +1,89 @@
1
+ module Clipboard
2
+ CF_TEXT = 1
3
+ CF_UNICODETEXT = 13
4
+ GMEM_MOVEABLE = 2
5
+
6
+ # get ffi function handlers
7
+ begin
8
+ require 'ffi'
9
+ rescue LoadError
10
+ raise LoadError, 'Could not load the required ffi gem, install it with: gem install ffi'
11
+ end
12
+
13
+ module User32
14
+ extend FFI::Library
15
+ ffi_lib "user32"
16
+ ffi_convention :stdcall
17
+
18
+ attach_function :open, :OpenClipboard, [ :long ], :long
19
+ attach_function :close, :CloseClipboard, [ ], :long
20
+ attach_function :empty, :EmptyClipboard, [ ], :long
21
+ attach_function :get, :GetClipboardData, [ :long ], :long
22
+ attach_function :set, :SetClipboardData, [ :long, :long ], :long
23
+ end
24
+
25
+ module Kernel32
26
+ extend FFI::Library
27
+ ffi_lib 'kernel32'
28
+ ffi_convention :stdcall
29
+
30
+ attach_function :lock, :GlobalLock, [ :long ], :pointer
31
+ attach_function :unlock, :GlobalUnlock, [ :long ], :long
32
+ attach_function :alloc, :GlobalAlloc, [ :long, :long ], :long
33
+ end
34
+
35
+ # see http://www.codeproject.com/KB/clipboard/archerclipboard1.aspx
36
+ def paste(_=nil)
37
+ ret = ""
38
+ if 0 != User32.open( 0 )
39
+ hclip = User32.get( CF_UNICODETEXT )
40
+ if hclip && 0 != hclip
41
+ pointer_to_data = Kernel32.lock( hclip )
42
+ data = ""
43
+ # Windows Unicode is ended by to null bytes, so get the whole string
44
+ current_byte = 0
45
+ until data.size >= 2 && data[-1].ord == 0 && data[-2].ord == 0
46
+ data << pointer_to_data.get_bytes( current_byte, 1 )
47
+ current_byte += 1
48
+ end
49
+ if RubyVersion >= 1.9
50
+ ret = data.chop.force_encoding("UTF-16LE").encode(Encoding.default_external) # TODO catch bad encodings
51
+ else # 1.8: fallback to simple CP850 encoding
52
+ require 'iconv'
53
+ utf8 = Iconv.iconv( "UTF-8", "UTF-16LE", data.chop)[0]
54
+ ret = Iconv.iconv( "CP850", "UTF-8", utf8)[0]
55
+ end
56
+ if data && 0 != data
57
+ Kernel32.unlock( hclip )
58
+ end
59
+ end
60
+ User32.close( )
61
+ end
62
+ ret || ""
63
+ end
64
+
65
+ def clear
66
+ if 0 != User32.open( 0 )
67
+ User32.empty( )
68
+ User32.close( )
69
+ end
70
+ paste
71
+ end
72
+
73
+ def copy(data_to_copy)
74
+ if RubyVersion >= 1.9 && 0 != User32.open( 0 )
75
+ User32.empty( )
76
+ data = data_to_copy.encode("UTF-16LE") # TODO catch bad encodings
77
+ data << 0 << 0
78
+ handler = Kernel32.alloc( GMEM_MOVEABLE, data.bytesize )
79
+ pointer_to_data = Kernel32.lock( handler )
80
+ pointer_to_data.put_bytes( 0, data, 0, data.bytesize )
81
+ Kernel32.unlock( handler )
82
+ User32.set( CF_UNICODETEXT, handler )
83
+ User32.close( )
84
+ else # don't touch anything
85
+ IO.popen( 'clip', 'w' ){ |input| input << data_to_copy } # depends on clip (available by default since Vista)
86
+ end
87
+ paste
88
+ end
89
+ end
@@ -0,0 +1,16 @@
1
+ require File.expand_path('spec/spec_helper')
2
+
3
+ describe Clipboard do
4
+ it "has a VERSION" do
5
+ Clipboard::VERSION.should =~ /^\d+\.\d+\.\d+$/
6
+ end
7
+
8
+ it "can copy & paste" do
9
+ Clipboard.copy("FOO\nBAR")
10
+ Clipboard.paste.should == "FOO\nBAR"
11
+ end
12
+
13
+ it "returns data on copy" do
14
+ Clipboard.copy('xxx').should == 'xxx'
15
+ end
16
+ end
@@ -0,0 +1,2 @@
1
+ $LOAD_PATH.unshift 'lib'
2
+ require 'clipboard'
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 9
8
- - 3
9
- version: 0.9.3
8
+ - 4
9
+ version: 0.9.4
10
10
  platform: ruby
11
11
  authors:
12
12
  - Jan Lelis
@@ -14,38 +14,32 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-12-15 00:00:00 +01:00
17
+ date: 2011-01-16 00:00:00 +01:00
18
18
  default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: zucker
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 8
30
- version: "8"
31
- type: :runtime
32
- version_requirements: *id001
19
+ dependencies: []
20
+
33
21
  description: Access the clipboard on all systems (Clipboard.copy & Clipboard.paste).
34
22
  email: mail@janlelis.de
35
23
  executables: []
36
24
 
37
25
  extensions: []
38
26
 
39
- extra_rdoc_files:
40
- - LICENSE
41
- - README.rdoc
27
+ extra_rdoc_files: []
28
+
42
29
  files:
30
+ - lib/clipboard.rb
31
+ - lib/clipboard/mac.rb
32
+ - lib/clipboard/linux.rb
33
+ - lib/clipboard/windows.rb
34
+ - spec/spec_helper.rb
35
+ - spec/clipboard_spec.rb
36
+ - Gemfile
37
+ - Rakefile
43
38
  - LICENSE
39
+ - Gemfile.lock
44
40
  - README.rdoc
45
- - Rakefile
46
41
  - VERSION
47
42
  - clipboard.gemspec
48
- - lib/clipboard.rb
49
43
  has_rdoc: true
50
44
  homepage: http://github.com/janlelis/clipboard
51
45
  licenses: []