imitator_x 0.0.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/COPYING.LESSER.rdoc +169 -0
- data/COPYING.rdoc +678 -0
- data/README.rdoc +70 -0
- data/Rakefile.rb +99 -0
- data/TODO.rdoc +8 -0
- data/ext/clipboard.c +429 -0
- data/ext/clipboard.h +61 -0
- data/ext/extconf.rb +55 -0
- data/ext/keyboard.c +711 -0
- data/ext/keyboard.h +29 -0
- data/ext/mouse.c +456 -0
- data/ext/mouse.h +28 -0
- data/ext/x.c +84 -0
- data/ext/x.h +48 -0
- data/ext/xwindow.c +1434 -0
- data/ext/xwindow.h +38 -0
- data/lib/imitator/x/drive.rb +179 -0
- data/lib/imitator/x.rb +29 -0
- data/lib/imitator_x_special_chars.yml +179 -0
- data/test/test_clipboard.rb +46 -0
- data/test/test_keyboard.rb +117 -0
- data/test/test_mouse.rb +40 -0
- data/test/test_xdrive.rb +47 -0
- data/test/test_xwindow.rb +106 -0
- metadata +123 -0
data/ext/xwindow.h
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
/*********************************************************************************
|
2
|
+
Imitator for X is a library allowing you to fake input to systems using X11.
|
3
|
+
Copyright � 2010 Marvin G�lker
|
4
|
+
|
5
|
+
This file is part of Imitator for X.
|
6
|
+
|
7
|
+
Imitator for X is free software: you can redistribute it and/or modify
|
8
|
+
it under the terms of the GNU Lesser General Public License as published by
|
9
|
+
the Free Software Foundation, either version 3 of the License, or
|
10
|
+
(at your option) any later version.
|
11
|
+
|
12
|
+
Imitator for X is distributed in the hope that it will be useful,
|
13
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
GNU Lesser General Public License for more details.
|
16
|
+
|
17
|
+
You should have received a copy of the GNU Lesser General Public License
|
18
|
+
along with Imitator for X. If not, see <http://www.gnu.org/licenses/>.
|
19
|
+
*********************************************************************************/
|
20
|
+
#ifndef IMITATOR_XWINDOW_HEADER
|
21
|
+
#define IMITATOR_XWINDOW_HEADER
|
22
|
+
|
23
|
+
/*Gets the window ID of self and converts it to a Window. A Window is just a long. */
|
24
|
+
#define GET_WINDOW (Window) NUM2LONG(rb_ivar_get(self, rb_intern("@window_id")))
|
25
|
+
|
26
|
+
/*Converts a string returned by a X function (cp), a char *, to a ruby string
|
27
|
+
*(encoded in ISO-88591; I couldn't find out how to get the locale encoding out of X,
|
28
|
+
*so you may have to change this if ISO-8859-1 isn't your X Server's locale) and then
|
29
|
+
*to an UTF-8-encoded string. */
|
30
|
+
#define XSTR_TO_RSTR(cp) rb_str_export_to_enc(rb_enc_str_new(cp, strlen(cp), rb_enc_find("ISO-8859-1")), rb_utf8_encoding())
|
31
|
+
|
32
|
+
/*Imitator::X::XWindow*/
|
33
|
+
VALUE XWindow;
|
34
|
+
|
35
|
+
/*XWindow initialization function*/
|
36
|
+
void Init_xwindow(void);
|
37
|
+
|
38
|
+
#endif
|
@@ -0,0 +1,179 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#Encoding: UTF-8
|
3
|
+
=begin
|
4
|
+
--
|
5
|
+
Imitator for X is a library allowing you to fake input to systems using X11.
|
6
|
+
Copyright © 2010 Marvin Gülker
|
7
|
+
|
8
|
+
This file is part of Imitator for X.
|
9
|
+
|
10
|
+
Imitator for X is free software: you can redistribute it and/or modify
|
11
|
+
it under the terms of the GNU Lesser General Public License as published by
|
12
|
+
the Free Software Foundation, either version 3 of the License, or
|
13
|
+
(at your option) any later version.
|
14
|
+
|
15
|
+
Imitator for X is distributed in the hope that it will be useful,
|
16
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
17
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
18
|
+
GNU Lesser General Public License for more details.
|
19
|
+
|
20
|
+
You should have received a copy of the GNU Lesser General Public License
|
21
|
+
along with Imitator for X. If not, see <http://www.gnu.org/licenses/>.
|
22
|
+
++
|
23
|
+
=end
|
24
|
+
|
25
|
+
module Imitator
|
26
|
+
|
27
|
+
module X
|
28
|
+
|
29
|
+
#This class wraps CD/DVD devices. After creating an object of this class
|
30
|
+
#you can open or close your drives. Also, you're able to lock and unlock them.
|
31
|
+
class XDrive
|
32
|
+
include Open3
|
33
|
+
|
34
|
+
#The +eject+ command.
|
35
|
+
EJECT = "eject"
|
36
|
+
|
37
|
+
#Returns the mount point of the default drive.
|
38
|
+
#===Return value
|
39
|
+
#A string describing the default drive.
|
40
|
+
#===Raises
|
41
|
+
#[XError] +eject+ command failed.
|
42
|
+
#===Example
|
43
|
+
# p Imitator::X::Drive.default #=> "cdrom"
|
44
|
+
def self.default
|
45
|
+
err = ""
|
46
|
+
out = ""
|
47
|
+
Open3.popen3("#{EJECT} -d") do |stdin, stdout, stderr|
|
48
|
+
stdin.close_write
|
49
|
+
out << stdout.read.chomp
|
50
|
+
err << stderr.read.chomp
|
51
|
+
end
|
52
|
+
raise(XError, err) unless err.empty?
|
53
|
+
out.match(/`(.*)'/)[1]
|
54
|
+
end
|
55
|
+
|
56
|
+
#Creates a new XDrive object.
|
57
|
+
#===Parameters
|
58
|
+
#[+drive+] (<tt>XDrive.default()</tt>) The drive to wrap. Either a device file like <tt>/dev/scd1</tt> or a mount point like <tt>cdrom1</tt>.
|
59
|
+
#===Return value
|
60
|
+
#The newly created object.
|
61
|
+
#===Raises
|
62
|
+
#[ArgumentError] Invalid drive.
|
63
|
+
#===Example
|
64
|
+
# #Get a handle to the default drive
|
65
|
+
# drive = Imitator::X::XDrive.new
|
66
|
+
# #By device file
|
67
|
+
# drive = Imitator::X::XDrive.new("/dev/scd1")
|
68
|
+
# #By mount point
|
69
|
+
# drive = Imitator::X::Drive.new("cdrom1")
|
70
|
+
def initialize(drive = XDrive.default)
|
71
|
+
@drive = drive
|
72
|
+
@locked = false
|
73
|
+
raise(ArgumentError, "No such drive: '#{@drive}'!") unless system("#{EJECT} -n #{@drive} > /dev/null 2>&1")
|
74
|
+
end
|
75
|
+
|
76
|
+
#call-seq:
|
77
|
+
# eject() ==> nil
|
78
|
+
# open() ==> nil
|
79
|
+
#
|
80
|
+
#Opens a drive.
|
81
|
+
#===Return value
|
82
|
+
#nil.
|
83
|
+
#===Raises
|
84
|
+
#[XError] +eject+ command failed.
|
85
|
+
#===Example
|
86
|
+
# drive.eject
|
87
|
+
def eject
|
88
|
+
err = ""
|
89
|
+
popen3(EJECT + " " + @drive) do |stdin, stdout, stderr|
|
90
|
+
#stdin.close_write
|
91
|
+
err << stderr.read.chomp
|
92
|
+
end
|
93
|
+
raise(XError, err) unless err.empty?
|
94
|
+
nil
|
95
|
+
end
|
96
|
+
alias open eject
|
97
|
+
|
98
|
+
#Closes a drive.
|
99
|
+
#===Return value
|
100
|
+
#nil.
|
101
|
+
#===Raises
|
102
|
+
#[XError] +eject+ command failed.
|
103
|
+
#===Example
|
104
|
+
# #The drive should be opened first, otherwise this has no effect
|
105
|
+
# drive.eject
|
106
|
+
# drive.close
|
107
|
+
#===Remarks
|
108
|
+
#Laptop devices usually can't be closed. If you try this, you'll
|
109
|
+
#get an XError saying that an Input/Output error occured.
|
110
|
+
def close
|
111
|
+
err = ""
|
112
|
+
popen3("eject -t #{@drive}") do |stdin, stdout, stderr|
|
113
|
+
stdin.close_write
|
114
|
+
err << stderr.read.chomp
|
115
|
+
end
|
116
|
+
raise(XError, err) unless err.empty?
|
117
|
+
nil
|
118
|
+
end
|
119
|
+
|
120
|
+
#Locks a drive. That means, it can't be opened by
|
121
|
+
#using the eject button.
|
122
|
+
#===Return value
|
123
|
+
#nil.
|
124
|
+
#===Example
|
125
|
+
# Imitator::X::Drive.lock!
|
126
|
+
def lock!
|
127
|
+
err = ""
|
128
|
+
popen3("#{EJECT} -i on #{@drive}") do |stdin, stdout, stderr|
|
129
|
+
stdin.close_write
|
130
|
+
err << stderr.read.chomp
|
131
|
+
end
|
132
|
+
raise(XError, err) unless err.empty?
|
133
|
+
@locked = true
|
134
|
+
nil
|
135
|
+
end
|
136
|
+
|
137
|
+
#Unlocks a drive. That means, it can be opened by the eject
|
138
|
+
#button.
|
139
|
+
#===Return value
|
140
|
+
#nil.
|
141
|
+
#===Raises
|
142
|
+
#[XError] +eject+ command failed.
|
143
|
+
#===Example
|
144
|
+
# #First, we have to lock a drive.
|
145
|
+
# Imitator::X::Drive.lock!
|
146
|
+
# Imitator::X::Drive.release!
|
147
|
+
def release!
|
148
|
+
err = ""
|
149
|
+
popen3("#{EJECT} -i off #{@drive}") do |stdin, stdout, stderr|
|
150
|
+
stdin.close_write
|
151
|
+
err << stderr.read.chomp
|
152
|
+
end
|
153
|
+
raise(XError, err) unless err.empty?
|
154
|
+
@locked = false
|
155
|
+
nil
|
156
|
+
end
|
157
|
+
|
158
|
+
#Checks wheather or not we locked a drive.
|
159
|
+
#===Return value
|
160
|
+
#true or false
|
161
|
+
#===Example
|
162
|
+
# puts drive.locked?#=> false
|
163
|
+
# drive.lock!
|
164
|
+
# puts drive.locked? #=> true
|
165
|
+
# drive.release!
|
166
|
+
# puts drive.locked? #=> false
|
167
|
+
#===Remarks
|
168
|
+
#This method works only within one Ruby application - if the drive is locked
|
169
|
+
#from outside, for example by the user typing "eject -i on cdrom1" that won't be
|
170
|
+
#recognized by this method.
|
171
|
+
def locked?
|
172
|
+
@locked
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|
data/lib/imitator/x.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#Encoding: UTF-8
|
3
|
+
=begin
|
4
|
+
--
|
5
|
+
Imitator for X is a library allowing you to fake input to systems using X11.
|
6
|
+
Copyright © 2010 Marvin Gülker
|
7
|
+
|
8
|
+
This file is part of Imitator for X.
|
9
|
+
|
10
|
+
Imitator for X is free software: you can redistribute it and/or modify
|
11
|
+
it under the terms of the GNU Lesser General Public License as published by
|
12
|
+
the Free Software Foundation, either version 3 of the License, or
|
13
|
+
(at your option) any later version.
|
14
|
+
|
15
|
+
Imitator for X is distributed in the hope that it will be useful,
|
16
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
17
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
18
|
+
GNU Lesser General Public License for more details.
|
19
|
+
|
20
|
+
You should have received a copy of the GNU Lesser General Public License
|
21
|
+
along with Imitator for X. If not, see <http://www.gnu.org/licenses/>.
|
22
|
+
++
|
23
|
+
=end
|
24
|
+
|
25
|
+
require "yaml"
|
26
|
+
require "open3"
|
27
|
+
require "strscan"
|
28
|
+
require_relative "../../ext/x"
|
29
|
+
require_relative "x/drive"
|
@@ -0,0 +1,179 @@
|
|
1
|
+
#Encoding: UTF-8
|
2
|
+
################################################
|
3
|
+
#Imitator for X is a library allowing you to fake input to systems using X11.
|
4
|
+
#Copyright © 2010 Marvin Gülker
|
5
|
+
#
|
6
|
+
#This file is part of Imitator for X.
|
7
|
+
#
|
8
|
+
#Imitator for X is free software: you can redistribute it and/or modify
|
9
|
+
#it under the terms of the GNU Lesser General Public License as published by
|
10
|
+
#the Free Software Foundation, either version 3 of the License, or
|
11
|
+
#(at your option) any later version.
|
12
|
+
#
|
13
|
+
#Imitator for X is distributed in the hope that it will be useful,
|
14
|
+
#but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
+
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
16
|
+
#GNU Lesser General Public License for more details.
|
17
|
+
#
|
18
|
+
#You should have received a copy of the GNU Lesser General Public License
|
19
|
+
#along with Imitator for X. If not, see <http://www.gnu.org/licenses/>.
|
20
|
+
################################################
|
21
|
+
#
|
22
|
+
#This file instructs Imitator for X how to simulate characters
|
23
|
+
#that can't be faked just by pressing one key, i.e. those keys
|
24
|
+
#that need modifier keys like the [SHIFT], [ALT], [ALT_GR] keys pressed.
|
25
|
+
#Beside the regular key upcase combinations which are just
|
26
|
+
#simulated by pressing the [SHIFT] key and than hitting the wanted letter key
|
27
|
+
#before releasing the [SHIFT] key again it's highly keyboard and locale-dependant
|
28
|
+
#how a special character is created. For example, to create an @ character on
|
29
|
+
#a German keyboard you'd press [ALT_GR] + [Q]. In Switzerland, it's [ALT_GR] + [2].
|
30
|
+
#Another one is the backslash - on my German keyboard I create one via [ALT_GR] + [ß],
|
31
|
+
#an american keyboard doesn't need a modifier key at all - it's there where on my keyboard the
|
32
|
+
#[Ä] or [Ü] key resides.
|
33
|
+
#
|
34
|
+
#Since it's likely that the mappings in this file don't represent your keybaord,
|
35
|
+
#you can change them. Just look for the character that isn't simulated correctly,
|
36
|
+
#and change the key sequence to the one belonging to your keyboard.
|
37
|
+
#In order to do this correctly, you should use the keysym names shown to you
|
38
|
+
#when you manually press this key while running the "xev" program.
|
39
|
+
#( I reccomand using "xev | grep keysym").
|
40
|
+
#
|
41
|
+
#Also, if you change this file, you may want to email me at sutniuq<>gmx<>net,
|
42
|
+
#in the future I may then be able to code some kind of locale selector that automatically
|
43
|
+
#chooses the correct key combinations.
|
44
|
+
---
|
45
|
+
#=========Regular key upcase mappings==========
|
46
|
+
#You won't change these, won't you?
|
47
|
+
A: Shift_L+a
|
48
|
+
B: Shift_L+b
|
49
|
+
C: Shift_L+c
|
50
|
+
D: Shift_L+d
|
51
|
+
E: Shift_L+e
|
52
|
+
F: Shift_L+f
|
53
|
+
G: Shift_L+g
|
54
|
+
H: Shift_L+h
|
55
|
+
I: Shift_L+i
|
56
|
+
J: Shift_L+j
|
57
|
+
K: Shift_L+k
|
58
|
+
L: Shift_L+l
|
59
|
+
M: Shift_L+m
|
60
|
+
N: Shift_L+n
|
61
|
+
O: Shift_L+o
|
62
|
+
P: Shift_L+p
|
63
|
+
Q: Shift_L+q
|
64
|
+
R: Shift_L+r
|
65
|
+
S: Shift_L+s
|
66
|
+
T: Shift_L+t
|
67
|
+
U: Shift_L+u
|
68
|
+
V: Shift_L+v
|
69
|
+
W: Shift_L+w
|
70
|
+
X: Shift_L+x
|
71
|
+
Y: Shift_L+y
|
72
|
+
Z: Shift_L+z
|
73
|
+
#==========Special letter mappings===========
|
74
|
+
#Characters that are letters, but not defined in ASCII.
|
75
|
+
#Use this section for those parts of your local alphabet that
|
76
|
+
#isn't covered by ASCII.
|
77
|
+
Ä: Shift_L+adiaeresis
|
78
|
+
Ö: Shift_L+odiaeresis
|
79
|
+
Ü: Shift_L+udiaeresis
|
80
|
+
ẞ: ISO_Level3_Shift+Shift+s
|
81
|
+
á: dead_acute+a
|
82
|
+
é: dead_acute+e
|
83
|
+
#==========Special sign mappings=============
|
84
|
+
#Non-letter chracters.
|
85
|
+
#Put in here those keys that doesn't have literal meaning in
|
86
|
+
#your language.
|
87
|
+
;: Shift_L+semicolon
|
88
|
+
":": Shift_L+colon
|
89
|
+
"_": Shift_L+underscore
|
90
|
+
"'": Shift_L+apostrophe
|
91
|
+
"*": Shift_L+asterisk
|
92
|
+
">": Shift_L+greater
|
93
|
+
"!": Shift_L+exclam
|
94
|
+
"\"": Shift_L+quotedbl
|
95
|
+
§: Shift_L+section
|
96
|
+
$: Shift_L+dollar
|
97
|
+
%: Shift_L+percent
|
98
|
+
&: Shift_L+ampersand
|
99
|
+
/: Shift_L+slash
|
100
|
+
(: Shift_L+parenleft
|
101
|
+
): Shift_L+parenright
|
102
|
+
"=": Shift_L+equal
|
103
|
+
"?": Shift_L+question
|
104
|
+
°: Shift_L+degree
|
105
|
+
¹: ISO_Level3_Shift+onesuperior
|
106
|
+
²: ISO_Level3_Shift+twosuperior
|
107
|
+
³: ISO_Level3_Shift+threesuperior
|
108
|
+
¼: ISO_Level3_Shift+onequarter
|
109
|
+
½: ISO_Level3_Shift+onehalf
|
110
|
+
¬: ISO_Level3_Shift+notsign
|
111
|
+
"{": ISO_Level3_Shift+braceleft
|
112
|
+
"[": ISO_Level3_Shift+bracketleft
|
113
|
+
"]": ISO_Level3_Shift+bracketright
|
114
|
+
"}": ISO_Level3_Shift+braceright
|
115
|
+
\: ISO_Level3_Shift+backslash
|
116
|
+
@: ISO_Level3_Shift+at
|
117
|
+
ł: ISO_Level3_Shift+lstroke
|
118
|
+
€: ISO_Level3_Shift+EuroSign
|
119
|
+
¶: ISO_Level3_Shift+paragraph
|
120
|
+
ŧ: ISO_Level3_Shift+tslash
|
121
|
+
←: ISO_Level3_Shift+leftarrow
|
122
|
+
↓: ISO_Level3_Shift+downarrow
|
123
|
+
→: ISO_Level3_Shift+rightarrow
|
124
|
+
ø: ISO_Level3_Shift+oslash
|
125
|
+
þ: ISO_Level3_Shift+thorn
|
126
|
+
æ: ISO_Level3_Shift+ae
|
127
|
+
ſ: ISO_Level3_Shift+U017F
|
128
|
+
ð: ISO_Level3_Shift+eth
|
129
|
+
đ: ISO_Level3_Shift+dstroke
|
130
|
+
ŋ: ISO_Level3_Shift+eng
|
131
|
+
ħ: ISO_Level3_Shift+hstroke
|
132
|
+
ĸ: ISO_Level3_Shift+kra
|
133
|
+
ł: ISO_Level3_Shift+lstroke
|
134
|
+
|: ISO_Level3_Shift+bar
|
135
|
+
»: ISO_Level3_Shift+guillemotright
|
136
|
+
«: ISO_Level3_Shift+guillemotleft
|
137
|
+
¢: ISO_Level3_Shift+cent
|
138
|
+
„: ISO_Level3_Shift+doublelowquotemark
|
139
|
+
“: ISO_Level3_Shift+leftdoublequotemark
|
140
|
+
”: ISO_Level3_Shift+rightdoublequotemark
|
141
|
+
µ: ISO_Level3_Shift+mu
|
142
|
+
·: ISO_Level3_Shift+periodcentered
|
143
|
+
…: ISO_Level3_Shift+U2026
|
144
|
+
–: ISO_Level3_Shift+endash
|
145
|
+
¡: ISO_Level3_Shift+Shift+exclamdown
|
146
|
+
⅛: ISO_Level3_Shift+Shift+oneeigth
|
147
|
+
£: ISO_Level3_Shift+Shift+sterling
|
148
|
+
¤: ISO_Level3_Shift+Shift+currency
|
149
|
+
⅜: ISO_Level3_Shift+Shift+threeeights
|
150
|
+
⅝: ISO_Level3_Shift+Shift+fiveeights
|
151
|
+
⅞: ISO_Level3_Shift+Shift+seveneights
|
152
|
+
™: ISO_Level3_Shift+Shift+trademark
|
153
|
+
±: ISO_Level3_Shift+Shift+plusminus
|
154
|
+
¿: ISO_Level3_Shift+Shift+questiondown
|
155
|
+
Ω: ISO_Level3_Shift+Shift+Greek_OMEGA
|
156
|
+
Ł: ISO_Level3_Shift+Shift+Lstroke
|
157
|
+
®: ISO_Level3_Shift+Shift+registered
|
158
|
+
Ŧ: ISO_Level3_Shift+Shift+Tslash
|
159
|
+
¥: ISO_Level3_Shift+Shift+yen
|
160
|
+
↑: ISO_Level3_Shift+Shift+uparrow
|
161
|
+
ı: ISO_Level3_Shift+Shift+idotless
|
162
|
+
Ø: ISO_Level3_Shift+Shift+Oslash
|
163
|
+
Þ: ISO_Level3_Shift+Shift+THORN
|
164
|
+
Æ: ISO_Level3_Shift+Shift+AE
|
165
|
+
Ð: ISO_Level3_Shift+Shift+ETH
|
166
|
+
ª: ISO_Level3_Shift+Shift+ordfeminine
|
167
|
+
Ŋ: ISO_Level3_Shift+Shift+ENG
|
168
|
+
Ħ: ISO_Level3_Shift+Shift+Hstroke
|
169
|
+
¦: ISO_Level3_Shift+Shift+brokenbar
|
170
|
+
›: ISO_Level3_Shift+Shift+U203A
|
171
|
+
‹: ISO_Level3_Shift+Shift+U2039
|
172
|
+
©: ISO_Level3_Shift+Shift+copyright
|
173
|
+
‚: ISO_Level3_Shift+Shift+singlelowquotemark
|
174
|
+
‘: ISO_Level3_Shift+Shift+leftsinglequotemark
|
175
|
+
’: ISO_Level3_Shift+Shift+rightsinglequotemark
|
176
|
+
º: ISO_Level3_Shift+Shift+masculine
|
177
|
+
×: ISO_Level3_Shift+Shift+multiply
|
178
|
+
÷: ISO_Level3_Shift+Shift+division
|
179
|
+
—: ISO_Level3_Shift+Shift+emdash
|
@@ -0,0 +1,46 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#Encoding: UTF-8
|
3
|
+
=begin
|
4
|
+
--
|
5
|
+
Imitator for X is a library allowing you to fake input to systems using X11.
|
6
|
+
Copyright © 2010 Marvin Gülker
|
7
|
+
|
8
|
+
This file is part of Imitator for X.
|
9
|
+
|
10
|
+
Imitator for X is free software: you can redistribute it and/or modify
|
11
|
+
it under the terms of the GNU Lesser General Public License as published by
|
12
|
+
the Free Software Foundation, either version 3 of the License, or
|
13
|
+
(at your option) any later version.
|
14
|
+
|
15
|
+
Imitator for X is distributed in the hope that it will be useful,
|
16
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
17
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
18
|
+
GNU Lesser General Public License for more details.
|
19
|
+
|
20
|
+
You should have received a copy of the GNU Lesser General Public License
|
21
|
+
along with Imitator for X. If not, see <http://www.gnu.org/licenses/>.
|
22
|
+
++
|
23
|
+
=end
|
24
|
+
|
25
|
+
#Ensure we use the correct key combinations file
|
26
|
+
$imitator_x_charfile_path = File.join(File.expand_path(File.dirname(__FILE__)), "..", "lib", "imitator_x_special_chars.yml")
|
27
|
+
|
28
|
+
require "test/unit"
|
29
|
+
require_relative "../lib/imitator/x"
|
30
|
+
|
31
|
+
class ClipboardTest < Test::Unit::TestCase
|
32
|
+
|
33
|
+
TEST_TEXT = "This is my\ntest test\t with special chars like ä!"
|
34
|
+
|
35
|
+
def test_read_write
|
36
|
+
Imitator::X::Clipboard.write(TEST_TEXT)
|
37
|
+
assert_equal(TEST_TEXT, Imitator::X::Clipboard.read(:clipboard))
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_clear
|
41
|
+
Imitator::X::Clipboard.write(TEST_TEXT)
|
42
|
+
Imitator::X::Clipboard.clear(:clipboard)
|
43
|
+
assert_equal("", Imitator::X::Clipboard.read(:clipboard))
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#Encoding: UTF-8
|
3
|
+
=begin
|
4
|
+
--
|
5
|
+
Imitator for X is a library allowing you to fake input to systems using X11.
|
6
|
+
Copyright © 2010 Marvin Gülker
|
7
|
+
|
8
|
+
This file is part of Imitator for X.
|
9
|
+
|
10
|
+
Imitator for X is free software: you can redistribute it and/or modify
|
11
|
+
it under the terms of the GNU Lesser General Public License as published by
|
12
|
+
the Free Software Foundation, either version 3 of the License, or
|
13
|
+
(at your option) any later version.
|
14
|
+
|
15
|
+
Imitator for X is distributed in the hope that it will be useful,
|
16
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
17
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
18
|
+
GNU Lesser General Public License for more details.
|
19
|
+
|
20
|
+
You should have received a copy of the GNU Lesser General Public License
|
21
|
+
along with Imitator for X. If not, see <http://www.gnu.org/licenses/>.
|
22
|
+
++
|
23
|
+
=end
|
24
|
+
|
25
|
+
#Ensure we use the correct key combinations file
|
26
|
+
$imitator_x_charfile_path = File.join(File.expand_path(File.dirname(__FILE__)), "..", "lib", "imitator_x_special_chars.yml")
|
27
|
+
|
28
|
+
require "test/unit"
|
29
|
+
require_relative "../lib/imitator/x"
|
30
|
+
|
31
|
+
class KeyboardTest < Test::Unit::TestCase
|
32
|
+
|
33
|
+
ASCII_STRING = "The quick brown fox jumped over the lazy dog"
|
34
|
+
UTF8_STRING = "ÄÖÜä@öüßabc"
|
35
|
+
ESCAPE_STRING = "This has\t2 escseqs: {Tab}!"
|
36
|
+
INVALID_STRING = "Incorrect escape: {Nosuchkey}"
|
37
|
+
|
38
|
+
EDITOR = ["gedit", "kwrite", "mousepad", "kate"].find{|cmd| `which '#{cmd}'`; $?.exitstatus == 0}
|
39
|
+
raise("No editor found!") if EDITOR.nil?
|
40
|
+
puts "Chosen editor: '#{EDITOR}'." if $VERBOSE
|
41
|
+
|
42
|
+
def self.startup
|
43
|
+
@win_proc = spawn(EDITOR)
|
44
|
+
sleep 2
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.shutdown
|
48
|
+
Process.kill("SIGKILL", @win_proc)
|
49
|
+
end
|
50
|
+
|
51
|
+
def teardown
|
52
|
+
Imitator::X::Keyboard.ctrl_a
|
53
|
+
Imitator::X::Keyboard.delete
|
54
|
+
end
|
55
|
+
|
56
|
+
def setup
|
57
|
+
sleep 0.5
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_delete
|
61
|
+
Imitator::X::Keyboard.simulate(ASCII_STRING)
|
62
|
+
sleep 1
|
63
|
+
Imitator::X::Keyboard.ctrl_a
|
64
|
+
Imitator::X::Keyboard.delete
|
65
|
+
assert_equal("", get_text)
|
66
|
+
Imitator::X::Keyboard.simulate(ASCII_STRING)
|
67
|
+
sleep 1
|
68
|
+
Imitator::X::Keyboard.ctrl_a
|
69
|
+
Imitator::X::Keyboard.delete(true)
|
70
|
+
assert_equal("", get_text)
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_ascii
|
74
|
+
Imitator::X::Keyboard.simulate(ASCII_STRING)
|
75
|
+
assert_equal(ASCII_STRING, get_text)
|
76
|
+
Imitator::X::Keyboard.delete
|
77
|
+
Imitator::X::Keyboard.simulate(ASCII_STRING, true)
|
78
|
+
assert_equal(ASCII_STRING, get_text)
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_utf8
|
82
|
+
Imitator::X::Keyboard.simulate(UTF8_STRING)
|
83
|
+
assert_equal(UTF8_STRING, get_text)
|
84
|
+
Imitator::X::Keyboard.delete
|
85
|
+
Imitator::X::Keyboard.simulate(UTF8_STRING, true)
|
86
|
+
assert_equal(UTF8_STRING, get_text)
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_escape
|
90
|
+
Imitator::X::Keyboard.simulate(ESCAPE_STRING)
|
91
|
+
assert_equal(ESCAPE_STRING.gsub("{Tab}", "\t"), get_text)
|
92
|
+
Imitator::X::Keyboard.delete
|
93
|
+
assert_raise(Imitator::X::XError){Imitator::X::Keyboard.simulate(INVALID_STRING)}
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_hold
|
97
|
+
Imitator::X::Keyboard.down("a")
|
98
|
+
sleep 1
|
99
|
+
Imitator::X::Keyboard.up("a")
|
100
|
+
assert_block{get_text.size > 1}
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_key
|
104
|
+
Imitator::X::Keyboard.key("Shift+a")
|
105
|
+
assert_equal("A", get_text)
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
|
110
|
+
def get_text
|
111
|
+
sleep 1
|
112
|
+
Imitator::X::Keyboard.ctrl_a
|
113
|
+
sleep 1
|
114
|
+
Imitator::X::Clipboard.read(:primary)
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
data/test/test_mouse.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#Encoding: UTF-8
|
3
|
+
=begin
|
4
|
+
--
|
5
|
+
Imitator for X is a library allowing you to fake input to systems using X11.
|
6
|
+
Copyright © 2010 Marvin Gülker
|
7
|
+
|
8
|
+
This file is part of Imitator for X.
|
9
|
+
|
10
|
+
Imitator for X is free software: you can redistribute it and/or modify
|
11
|
+
it under the terms of the GNU Lesser General Public License as published by
|
12
|
+
the Free Software Foundation, either version 3 of the License, or
|
13
|
+
(at your option) any later version.
|
14
|
+
|
15
|
+
Imitator for X is distributed in the hope that it will be useful,
|
16
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
17
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
18
|
+
GNU Lesser General Public License for more details.
|
19
|
+
|
20
|
+
You should have received a copy of the GNU Lesser General Public License
|
21
|
+
along with Imitator for X. If not, see <http://www.gnu.org/licenses/>.
|
22
|
+
++
|
23
|
+
=end
|
24
|
+
|
25
|
+
#Ensure we use the correct key combinations file
|
26
|
+
$imitator_x_charfile_path = File.join(File.expand_path(File.dirname(__FILE__)), "..", "lib", "imitator_x_special_chars.yml")
|
27
|
+
|
28
|
+
require "test/unit"
|
29
|
+
require_relative "../lib/imitator/x"
|
30
|
+
|
31
|
+
class MouseTest < Test::Unit::TestCase
|
32
|
+
|
33
|
+
def test_move
|
34
|
+
Imitator::X::Mouse.move(100, 100)
|
35
|
+
assert_equal([100, 100], Imitator::X::Mouse.pos)
|
36
|
+
assert_equal([100, 100], Imitator::X::Mouse.position)
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
data/test/test_xdrive.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#Encoding: UTF-8
|
3
|
+
=begin
|
4
|
+
--
|
5
|
+
Imitator for X is a library allowing you to fake input to systems using X11.
|
6
|
+
Copyright © 2010 Marvin Gülker
|
7
|
+
|
8
|
+
This file is part of Imitator for X.
|
9
|
+
|
10
|
+
Imitator for X is free software: you can redistribute it and/or modify
|
11
|
+
it under the terms of the GNU Lesser General Public License as published by
|
12
|
+
the Free Software Foundation, either version 3 of the License, or
|
13
|
+
(at your option) any later version.
|
14
|
+
|
15
|
+
Imitator for X is distributed in the hope that it will be useful,
|
16
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
17
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
18
|
+
GNU Lesser General Public License for more details.
|
19
|
+
|
20
|
+
You should have received a copy of the GNU Lesser General Public License
|
21
|
+
along with Imitator for X. If not, see <http://www.gnu.org/licenses/>.
|
22
|
+
++
|
23
|
+
=end
|
24
|
+
|
25
|
+
#Ensure we use the correct key combinations file
|
26
|
+
$imitator_x_charfile_path = File.join(File.expand_path(File.dirname(__FILE__)), "..", "lib", "imitator_x_special_chars.yml")
|
27
|
+
|
28
|
+
require "test/unit"
|
29
|
+
require_relative "../lib/imitator/x"
|
30
|
+
|
31
|
+
class DriveTest < Test::Unit::TestCase
|
32
|
+
|
33
|
+
def test_default
|
34
|
+
assert_equal(`eject -d`.match(/`(.*?)'/)[1], Imitator::X::XDrive.default)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_eject_close
|
38
|
+
drive = Imitator::X::XDrive.new
|
39
|
+
drive.open
|
40
|
+
begin
|
41
|
+
drive.close
|
42
|
+
rescue Imitator::X::XError
|
43
|
+
notify "Coldn't close your CD-ROM drive. Are you using a laptop?"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|