pure-x11 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +48 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +19 -0
- data/LICENSE.txt +20 -0
- data/README.md +12 -0
- data/Rakefile +7 -0
- data/docs/protocol.pdf +0 -0
- data/example/genie.png +0 -0
- data/example/test.rb +108 -0
- data/lib/X11/auth.rb +69 -0
- data/lib/X11/display.rb +450 -0
- data/lib/X11/event.rb +0 -0
- data/lib/X11/form.rb +865 -0
- data/lib/X11/keysyms.rb +328 -0
- data/lib/X11/protocol.rb +16 -0
- data/lib/X11/screen.rb +34 -0
- data/lib/X11/type.rb +116 -0
- data/lib/X11/version.rb +3 -0
- data/lib/X11.rb +12 -0
- data/ruby-x11.gemspec +24 -0
- data/test/core_test.rb +15 -0
- data/test/form_test.rb +66 -0
- data/test/helper.rb +11 -0
- metadata +66 -0
data/lib/X11/keysyms.rb
ADDED
@@ -0,0 +1,328 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
module X11
|
4
|
+
# From /usr/lib/X11; FIXME: Not complete
|
5
|
+
KeySyms = {
|
6
|
+
0x01b7 => :XK_caron,
|
7
|
+
0x01bd => :XK_doubleacute,
|
8
|
+
|
9
|
+
0xff08 => :backspace,
|
10
|
+
0xff09 => :tab,
|
11
|
+
0xff0a => :linefeed,
|
12
|
+
0xff0b => :clear,
|
13
|
+
0xff0d => :enter,
|
14
|
+
0xfe01 => :XK_ISO_Lock,
|
15
|
+
0xfe02 => :XK_ISO_Level2_Latch,
|
16
|
+
0xfe03 => :XK_ISO_Level3_Shift,
|
17
|
+
0xfe04 => :XK_ISO_Level3_Latch,
|
18
|
+
0xfe05 => :XK_ISO_Level3_Lock,
|
19
|
+
0xfe06 => :XK_ISO_Group_Latch,
|
20
|
+
0xfe07 => :XK_ISO_Group_Lock,
|
21
|
+
0xfe08 => :XK_ISO_Next_Group,
|
22
|
+
0xfe09 => :XK_ISO_Next_Group_Lock,
|
23
|
+
0xfe0a => :XK_ISO_Prev_Group,
|
24
|
+
0xfe0b => :XK_ISO_Prev_Group_Lock,
|
25
|
+
0xfe0c => :XK_ISO_First_Group,
|
26
|
+
0xfe0d => :XK_ISO_First_Group_Lock,
|
27
|
+
0xfe0e => :XK_ISO_Last_Group,
|
28
|
+
0xfe0f => :XK_ISO_Last_Group_Lock,
|
29
|
+
0xfe11 => :XK_ISO_Level5_Shift,
|
30
|
+
0xfe12 => :XK_ISO_Level5_Latch,
|
31
|
+
0xfe13 => :XK_ISO_Level5_Lock,
|
32
|
+
0xfe20 => :XK_ISO_Left_Tab,
|
33
|
+
0xfe21 => :XK_ISO_Move_Line_Up,
|
34
|
+
0xfe22 => :XK_ISO_Move_Line_Down,
|
35
|
+
0xfe23 => :XK_ISO_Partial_Line_Up,
|
36
|
+
0xfe24 => :XK_ISO_Partial_Line_Down,
|
37
|
+
0xfe25 => :XK_ISO_Partial_Space_Left,
|
38
|
+
0xfe26 => :XK_ISO_Partial_Space_Right,
|
39
|
+
0xfe27 => :XK_ISO_Set_Margin_Left,
|
40
|
+
0xfe28 => :XK_ISO_Set_Margin_Right,
|
41
|
+
0xfe29 => :XK_ISO_Release_Margin_Left,
|
42
|
+
0xfe2a => :XK_ISO_Release_Margin_Right,
|
43
|
+
0xfe2b => :XK_ISO_Release_Both_Margins,
|
44
|
+
0xfe2c => :XK_ISO_Fast_Cursor_Left,
|
45
|
+
0xfe2d => :XK_ISO_Fast_Cursor_Right,
|
46
|
+
0xfe2e => :XK_ISO_Fast_Cursor_Up,
|
47
|
+
0xfe2f => :XK_ISO_Fast_Cursor_Down,
|
48
|
+
0xfe30 => :XK_ISO_Continuous_Underline,
|
49
|
+
0xfe31 => :XK_ISO_Discontinuous_Underline,
|
50
|
+
0xfe32 => :XK_ISO_Emphasize,
|
51
|
+
0xfe33 => :XK_ISO_Center_Object,
|
52
|
+
0xfe34 => :XK_ISO_Enter,
|
53
|
+
0xff13 => :XK_Pause,
|
54
|
+
0xff14 => :XK_Scroll_Lock,
|
55
|
+
0xff15 => :XK_Sys_Req,
|
56
|
+
0xff1b => :XK_Escape,
|
57
|
+
0xffff => :XK_Delete,
|
58
|
+
0xff20 => :XK_Multi_key,
|
59
|
+
0xff21 => :XK_Kanji,
|
60
|
+
0xff22 => :XK_Muhenkan,
|
61
|
+
0xff23 => :XK_Henkan,
|
62
|
+
0xff24 => :XK_Romaji,
|
63
|
+
0xff25 => :XK_Hiragana,
|
64
|
+
0xff26 => :XK_Katakana,
|
65
|
+
0xff27 => :XK_Hiragana_Katakana,
|
66
|
+
0xff28 => :XK_Zenkaku,
|
67
|
+
0xff29 => :XK_Hankaku,
|
68
|
+
0xff2a => :XK_Zenkaku_Hankaku,
|
69
|
+
0xff2b => :XK_Touroku,
|
70
|
+
0xff2c => :XK_Massyo,
|
71
|
+
0xff2d => :XK_Kana_Lock,
|
72
|
+
0xff2e => :XK_Kana_Shift,
|
73
|
+
0xff2f => :XK_Eisu_Shift,
|
74
|
+
0xff30 => :XK_Eisu_toggle,
|
75
|
+
0xff31 => :Unknown_FF31,
|
76
|
+
0xff34 => :Unknown_FF34,
|
77
|
+
0xff37 => :XK_Codeinput,
|
78
|
+
0xff3c => :XK_SingleCandidate,
|
79
|
+
0xff3d => :XK_MultipleCandidate,
|
80
|
+
0xff3e => :XK_PreviousCandidate,
|
81
|
+
0xff50 => :XK_Home,
|
82
|
+
0xff51 => :XK_Left,
|
83
|
+
0xff52 => :XK_Up,
|
84
|
+
0xff53 => :XK_Right,
|
85
|
+
0xff54 => :XK_Down,
|
86
|
+
0xff55 => :XK_Page_Up,
|
87
|
+
0xff56 => :XK_Page_Down,
|
88
|
+
0xff57 => :XK_End,
|
89
|
+
0xff58 => :XK_Begin,
|
90
|
+
0xff60 => :XK_Select,
|
91
|
+
0xff61 => :XK_Print,
|
92
|
+
0xff62 => :XK_Execute,
|
93
|
+
0xff63 => :XK_Insert,
|
94
|
+
0xff65 => :XK_Undo,
|
95
|
+
0xff66 => :XK_Redo,
|
96
|
+
0xff67 => :XK_Menu,
|
97
|
+
0xff68 => :XK_Find,
|
98
|
+
0xff69 => :XK_Cancel,
|
99
|
+
0xff6a => :XK_Help,
|
100
|
+
0xff6b => :XK_Break,
|
101
|
+
0xff7e => :XK_Mode_switch,
|
102
|
+
0xff7f => :XK_Num_Lock,
|
103
|
+
0xff80 => :XK_KP_Space,
|
104
|
+
0xff89 => :XK_KP_Tab,
|
105
|
+
0xff8d => :XK_KP_Enter,
|
106
|
+
0xff95 => :XK_KP_Home,
|
107
|
+
0xff96 => :XK_KP_Left,
|
108
|
+
0xff97 => :XK_KP_Up,
|
109
|
+
0xff98 => :XK_KP_Right,
|
110
|
+
0xff99 => :XK_KP_Down,
|
111
|
+
0xff9a => :XK_KP_Page_Up,
|
112
|
+
0xff9b => :XK_KP_Page_Down,
|
113
|
+
0xff9c => :XK_KP_End,
|
114
|
+
0xff9d => :XK_KP_Begin,
|
115
|
+
0xff9e => :XK_KP_Insert,
|
116
|
+
0xff9f => :XK_KP_Delete,
|
117
|
+
0xffbd => :XK_KP_Equal,
|
118
|
+
0xffaa => :XK_KP_Multiply,
|
119
|
+
0xffab => :XK_KP_Add,
|
120
|
+
0xffac => :XK_KP_Separator,
|
121
|
+
0xffad => :XK_KP_Subtract,
|
122
|
+
0xffae => :XK_KP_Decimal,
|
123
|
+
0xffaf => :XK_KP_Divide,
|
124
|
+
|
125
|
+
0xffe1 => :XK_Shift_L,
|
126
|
+
0xffe2 => :XK_Shift_R,
|
127
|
+
0xffe3 => :XK_Control_L,
|
128
|
+
0xffe4 => :XK_Control_R,
|
129
|
+
0xffe5 => :XK_Caps_Lock,
|
130
|
+
0xffe6 => :XK_Shift_Lock,
|
131
|
+
0xffe7 => :XK_Meta_L,
|
132
|
+
0xffe8 => :XK_Meta_R,
|
133
|
+
0xffe9 => :XK_Alt_L,
|
134
|
+
0xffea => :XK_Alt_R,
|
135
|
+
0xffeb => :XK_Super_L,
|
136
|
+
0xffec => :XK_Super_R,
|
137
|
+
0xffed => :XK_Hyper_L,
|
138
|
+
0xffee => :XK_Hyper_R,
|
139
|
+
|
140
|
+
0x1005FF70 => :SunProps,
|
141
|
+
0x1005FF71 => :SunFront,
|
142
|
+
|
143
|
+
0x1008FF01 => :XF86XK_ModeLock,
|
144
|
+
0x1008FF02 => :XF86XK_MonBrightnessUp,
|
145
|
+
0x1008FF03 => :XF86XK_MonBrightnessDown,
|
146
|
+
0x1008FF04 => :XF86XK_KbdLightOnOff,
|
147
|
+
0x1008FF05 => :XF86XK_KbdBrightnessUp,
|
148
|
+
0x1008FF06 => :XF86XK_KbdBrightnessDown,
|
149
|
+
0x1008FF07 => :XF86XK_MonBrightnessCycle,
|
150
|
+
0x1008FF10 => :XF86XK_Standby,
|
151
|
+
0x1008FF11 => :XF86XK_AudioLowerVolume,
|
152
|
+
0x1008FF12 => :XF86XK_AudioMute,
|
153
|
+
0x1008FF13 => :XF86XK_AudioRaiseVolume,
|
154
|
+
0x1008FF14 => :XF86XK_AudioPlay,
|
155
|
+
0x1008FF15 => :XF86XK_AudioStop,
|
156
|
+
0x1008FF16 => :XF86XK_AudioPrev,
|
157
|
+
0x1008FF17 => :XF86XK_AudioNext,
|
158
|
+
0x1008FF18 => :XF86XK_HomePage,
|
159
|
+
0x1008FF19 => :XF86XK_Mail,
|
160
|
+
0x1008FF1A => :XF86XK_Start,
|
161
|
+
0x1008FF1B => :XF86XK_Search,
|
162
|
+
0x1008FF1C => :XF86XK_AudioRecord,
|
163
|
+
0x1008FF1D => :XF86XK_Calculator,
|
164
|
+
0x1008FF1E => :XF86XK_Memo,
|
165
|
+
0x1008FF1F => :XF86XK_ToDoList,
|
166
|
+
0x1008FF20 => :XF86XK_Calendar,
|
167
|
+
0x1008FF21 => :XF86XK_PowerDown,
|
168
|
+
0x1008FF22 => :XF86XK_ContrastAdjust,
|
169
|
+
0x1008FF23 => :XF86XK_RockerUp,
|
170
|
+
0x1008FF24 => :XF86XK_RockerDown,
|
171
|
+
0x1008FF25 => :XF86XK_RockerEnter,
|
172
|
+
0x1008FF26 => :XF86XK_Back,
|
173
|
+
0x1008FF27 => :XF86XK_Forward,
|
174
|
+
0x1008FF28 => :XF86XK_Stop,
|
175
|
+
0x1008FF29 => :XF86XK_Refresh,
|
176
|
+
0x1008FF2A => :XF86XK_PowerOff,
|
177
|
+
0x1008FF2B => :XF86XK_WakeUp,
|
178
|
+
0x1008FF2C => :XF86XK_Eject,
|
179
|
+
0x1008FF2D => :XF86XK_ScreenSaver,
|
180
|
+
0x1008FF2E => :XF86XK_WWW,
|
181
|
+
0x1008FF2F => :XF86XK_Sleep,
|
182
|
+
0x1008FF30 => :XF86XK_Favorites,
|
183
|
+
0x1008FF31 => :XF86XK_AudioPause,
|
184
|
+
0x1008FF32 => :XF86XK_AudioMedia,
|
185
|
+
0x1008FF33 => :XF86XK_MyComputer,
|
186
|
+
0x1008FF34 => :XF86XK_VendorHome,
|
187
|
+
0x1008FF35 => :XF86XK_LightBulb,
|
188
|
+
0x1008FF36 => :XF86XK_Shop,
|
189
|
+
0x1008FF37 => :XF86XK_History,
|
190
|
+
0x1008FF38 => :XF86XK_OpenURL,
|
191
|
+
0x1008FF39 => :XF86XK_AddFavorite,
|
192
|
+
0x1008FF3A => :XF86XK_HotLinks,
|
193
|
+
0x1008FF3B => :XF86XK_BrightnessAdjust,
|
194
|
+
0x1008FF3C => :XF86XK_Finance,
|
195
|
+
0x1008FF3D => :XF86XK_Community,
|
196
|
+
0x1008FF3E => :XF86XK_AudioRewind,
|
197
|
+
0x1008FF3F => :XF86XK_BackForward,
|
198
|
+
0x1008FF40 => :XF86XK_Launch0,
|
199
|
+
0x1008FF41 => :XF86XK_Launch1,
|
200
|
+
0x1008FF42 => :XF86XK_Launch2,
|
201
|
+
0x1008FF43 => :XF86XK_Launch3,
|
202
|
+
0x1008FF44 => :XF86XK_Launch4,
|
203
|
+
0x1008FF45 => :XF86XK_Launch5,
|
204
|
+
0x1008FF46 => :XF86XK_Launch6,
|
205
|
+
0x1008FF47 => :XF86XK_Launch7,
|
206
|
+
0x1008FF48 => :XF86XK_Launch8,
|
207
|
+
0x1008FF49 => :XF86XK_Launch9,
|
208
|
+
0x1008FF4A => :XF86XK_LaunchA,
|
209
|
+
0x1008FF4B => :XF86XK_LaunchB,
|
210
|
+
0x1008FF4C => :XF86XK_LaunchC,
|
211
|
+
0x1008FF4D => :XF86XK_LaunchD,
|
212
|
+
0x1008FF4E => :XF86XK_LaunchE,
|
213
|
+
0x1008FF4F => :XF86XK_LaunchF,
|
214
|
+
0x1008FF50 => :XF86XK_ApplicationLeft,
|
215
|
+
0x1008FF51 => :XF86XK_ApplicationRight,
|
216
|
+
0x1008FF52 => :XF86XK_Book,
|
217
|
+
0x1008FF53 => :XF86XK_CD,
|
218
|
+
0x1008FF54 => :XF86XK_Calculater,
|
219
|
+
0x1008FF55 => :XF86XK_Clear,
|
220
|
+
0x1008FF56 => :XF86XK_Close,
|
221
|
+
0x1008FF57 => :XF86XK_Copy,
|
222
|
+
0x1008FF58 => :XF86XK_Cut,
|
223
|
+
0x1008FF59 => :XF86XK_Display,
|
224
|
+
0x1008FF5A => :XF86XK_DOS,
|
225
|
+
0x1008FF5B => :XF86XK_Documents,
|
226
|
+
0x1008FF5C => :XF86XK_Excel,
|
227
|
+
0x1008FF5D => :XF86XK_Explorer,
|
228
|
+
0x1008FF5E => :XF86XK_Game,
|
229
|
+
0x1008FF5F => :XF86XK_Go,
|
230
|
+
0x1008FF60 => :XF86XK_iTouch,
|
231
|
+
0x1008FF61 => :XF86XK_LogOff,
|
232
|
+
0x1008FF62 => :XF86XK_Market,
|
233
|
+
0x1008FF63 => :XF86XK_Meeting,
|
234
|
+
0x1008FF65 => :XF86XK_MenuKB,
|
235
|
+
0x1008FF66 => :XF86XK_MenuPB,
|
236
|
+
0x1008FF67 => :XF86XK_MySites,
|
237
|
+
0x1008FF68 => :XF86XK_New,
|
238
|
+
0x1008FF69 => :XF86XK_News,
|
239
|
+
0x1008FF6A => :XF86XK_OfficeHome,
|
240
|
+
0x1008FF6B => :XF86XK_Open,
|
241
|
+
0x1008FF6C => :XF86XK_Option,
|
242
|
+
0x1008FF6D => :XF86XK_Paste,
|
243
|
+
0x1008FF6E => :XF86XK_Phone,
|
244
|
+
0x1008FF70 => :XF86XK_Q,
|
245
|
+
0x1008FF72 => :XF86XK_Reply,
|
246
|
+
0x1008FF73 => :XF86XK_Reload,
|
247
|
+
0x1008FF74 => :XF86XK_RotateWindows,
|
248
|
+
0x1008FF75 => :XF86XK_RotationPB,
|
249
|
+
0x1008FF76 => :XF86XK_RotationKB,
|
250
|
+
0x1008FF77 => :XF86XK_Save,
|
251
|
+
0x1008FF78 => :XF86XK_ScrollUp,
|
252
|
+
0x1008FF79 => :XF86XK_ScrollDown,
|
253
|
+
0x1008FF7A => :XF86XK_ScrollClick,
|
254
|
+
0x1008FF7B => :XF86XK_Send,
|
255
|
+
0x1008FF7C => :XF86XK_Spell,
|
256
|
+
0x1008FF7D => :XF86XK_SplitScreen,
|
257
|
+
0x1008FF7E => :XF86XK_Support,
|
258
|
+
0x1008FF7F => :XF86XK_TaskPane,
|
259
|
+
0x1008FF80 => :XF86XK_Terminal,
|
260
|
+
0x1008FF81 => :XF86XK_Tools,
|
261
|
+
0x1008FF82 => :XF86XK_Travel,
|
262
|
+
0x1008FF84 => :XF86XK_UserPB,
|
263
|
+
0x1008FF85 => :XF86XK_User1KB,
|
264
|
+
0x1008FF86 => :XF86XK_User2KB,
|
265
|
+
0x1008FF87 => :XF86XK_Video,
|
266
|
+
0x1008FF88 => :XF86XK_WheelButton,
|
267
|
+
0x1008FF89 => :XF86XK_Word,
|
268
|
+
0x1008FF8A => :XF86XK_Xfer,
|
269
|
+
0x1008FF8B => :XF86XK_ZoomIn,
|
270
|
+
0x1008FF8C => :XF86XK_ZoomOut,
|
271
|
+
0x1008FF8D => :XF86XK_Away,
|
272
|
+
0x1008FF8E => :XF86XK_Messenger,
|
273
|
+
0x1008FF8F => :XF86XK_WebCam,
|
274
|
+
0x1008FF90 => :XF86XK_MailForward,
|
275
|
+
0x1008FF91 => :XF86XK_Pictures,
|
276
|
+
0x1008FF92 => :XF86XK_Music,
|
277
|
+
0x1008FF93 => :XF86XK_Battery,
|
278
|
+
0x1008FF94 => :XF86XK_Bluetooth,
|
279
|
+
0x1008FF95 => :XF86XK_WLAN,
|
280
|
+
0x1008FF96 => :XF86XK_UWB,
|
281
|
+
0x1008FF97 => :XF86XK_AudioForward,
|
282
|
+
0x1008FF98 => :XF86XK_AudioRepeat,
|
283
|
+
0x1008FF99 => :XF86XK_AudioRandomPlay,
|
284
|
+
0x1008FF9A => :XF86XK_Subtitle,
|
285
|
+
0x1008FF9B => :XF86XK_AudioCycleTrack,
|
286
|
+
0x1008FF9C => :XF86XK_CycleAngle,
|
287
|
+
0x1008FF9D => :XF86XK_FrameBack,
|
288
|
+
0x1008FF9E => :XF86XK_FrameForward,
|
289
|
+
0x1008FF9F => :XF86XK_Time,
|
290
|
+
0x1008FFA0 => :XF86XK_Select,
|
291
|
+
0x1008FFA1 => :XF86XK_View,
|
292
|
+
0x1008FFA2 => :XF86XK_TopMenu,
|
293
|
+
0x1008FFA3 => :XF86XK_Red,
|
294
|
+
0x1008FFA4 => :XF86XK_Green,
|
295
|
+
0x1008FFA5 => :XF86XK_Yellow,
|
296
|
+
0x1008FFA6 => :XF86XK_Blue,
|
297
|
+
0x1008FFA7 => :XF86XK_Suspend,
|
298
|
+
0x1008FFA8 => :XF86XK_Hibernate,
|
299
|
+
0x1008FFA9 => :XF86XK_TouchpadToggle,
|
300
|
+
0x1008FFB0 => :XF86XK_TouchpadOn,
|
301
|
+
0x1008FFB1 => :XF86XK_TouchpadOff,
|
302
|
+
0x1008FFB2 => :XF86XK_AudioMicMute,
|
303
|
+
0x1008FFB3 => :XF86XK_Keyboard,
|
304
|
+
0x1008FFB4 => :XF86XK_WWAN,
|
305
|
+
0x1008FFB5 => :XF86XK_RFKill,
|
306
|
+
0x1008FFB6 => :XF86XK_AudioPreset,
|
307
|
+
0x1008FFB7 => :XF86XK_RotationLockToggle,
|
308
|
+
0x1008FFB8 => :XF86XK_FullScreen,
|
309
|
+
0x1008FE01 => :XF86XK_Switch_VT_1,
|
310
|
+
0x1008FE02 => :XF86XK_Switch_VT_2,
|
311
|
+
0x1008FE03 => :XF86XK_Switch_VT_3,
|
312
|
+
0x1008FE04 => :XF86XK_Switch_VT_4,
|
313
|
+
0x1008FE05 => :XF86XK_Switch_VT_5,
|
314
|
+
0x1008FE06 => :XF86XK_Switch_VT_6,
|
315
|
+
0x1008FE07 => :XF86XK_Switch_VT_7,
|
316
|
+
0x1008FE08 => :XF86XK_Switch_VT_8,
|
317
|
+
0x1008FE09 => :XF86XK_Switch_VT_9,
|
318
|
+
0x1008FE0A => :XF86XK_Switch_VT_10,
|
319
|
+
0x1008FE0B => :XF86XK_Switch_VT_11,
|
320
|
+
0x1008FE0C => :XF86XK_Switch_VT_12,
|
321
|
+
0x1008FE20 => :XF86XK_Ungrab,
|
322
|
+
0x1008FE21 => :XF86XK_ClearGrab,
|
323
|
+
0x1008FE22 => :XF86XK_Next_VMode,
|
324
|
+
0x1008FE23 => :XF86XK_Prev_VMode,
|
325
|
+
0x1008FE24 => :XF86XK_LogWindowTree,
|
326
|
+
0x1008FE25 => :XF86XK_LogGrabInfo,
|
327
|
+
}
|
328
|
+
end
|
data/lib/X11/protocol.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
module X11
|
2
|
+
module Protocol
|
3
|
+
# endiness of your machine
|
4
|
+
BYTE_ORDER = case [1].pack("L")
|
5
|
+
when "\0\0\0\1"
|
6
|
+
"B".ord
|
7
|
+
when "\1\0\0\0"
|
8
|
+
"l".ord
|
9
|
+
else
|
10
|
+
raise ByteOrderError.new "Cannot determine byte order"
|
11
|
+
end
|
12
|
+
|
13
|
+
MAJOR = 11
|
14
|
+
MINOR = 0
|
15
|
+
end
|
16
|
+
end
|
data/lib/X11/screen.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
module X11
|
2
|
+
class Screen
|
3
|
+
attr_reader :display
|
4
|
+
|
5
|
+
def initialize(display, data)
|
6
|
+
@display = display
|
7
|
+
@internal = data
|
8
|
+
end
|
9
|
+
|
10
|
+
def root
|
11
|
+
@internal.root
|
12
|
+
end
|
13
|
+
|
14
|
+
def root_depth
|
15
|
+
@internal.root_depth
|
16
|
+
end
|
17
|
+
|
18
|
+
def root_visual
|
19
|
+
@internal.root_visual
|
20
|
+
end
|
21
|
+
|
22
|
+
def width
|
23
|
+
@internal.width_in_pixels
|
24
|
+
end
|
25
|
+
|
26
|
+
def height
|
27
|
+
@internal.height_in_pixels
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_s
|
31
|
+
"#<X11::Screen(#{id}) width=#{width} height=#{height}>"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/X11/type.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
# This module is used for encoding Ruby Objects to binary
|
2
|
+
# data. The types Int8, Int16, etc. are data-types defined
|
3
|
+
# in the X11 protocol. We wrap each data-type in a lambda expression
|
4
|
+
# which gets evaluated when a packet is created.
|
5
|
+
|
6
|
+
module X11
|
7
|
+
module Type
|
8
|
+
|
9
|
+
def self.define(type, directive, bytesize)
|
10
|
+
eval %{
|
11
|
+
class X11::Type::#{type}
|
12
|
+
def self.pack(x)
|
13
|
+
[x].pack(\"#{directive}\")
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.unpack(x)
|
17
|
+
x.unpack(\"#{directive}\").first
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.size
|
21
|
+
#{bytesize}
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.from_packet(sock)
|
25
|
+
r = sock.read(size)
|
26
|
+
r ? unpack(r) : nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
# Primitive Types
|
33
|
+
define "Int8", "c", 1
|
34
|
+
define "Int16", "s", 2
|
35
|
+
define "Int32", "l", 4
|
36
|
+
define "Uint8", "C", 1
|
37
|
+
define "Uint16", "S", 2
|
38
|
+
define "Uint32", "L", 4
|
39
|
+
|
40
|
+
class String8
|
41
|
+
def self.pack(x)
|
42
|
+
x.force_encoding("ASCII-8BIT") + "\x00"*(-x.length & 3)
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
def self.unpack(socket, size)
|
49
|
+
val = socket.read(size)
|
50
|
+
unused_padding = (4 - (size % 4)) % 4
|
51
|
+
socket.read(unused_padding)
|
52
|
+
val
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class String16
|
57
|
+
def self.pack(x)
|
58
|
+
x.encode("UTF-16BE").force_encoding("ASCII-8BIT") + "\x00\x00"*(-x.length & 1)
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.unpack(socket, size)
|
62
|
+
val = socket.read(size)
|
63
|
+
unused_padding = (4 - (size % 4)) % 4
|
64
|
+
socket.read(unused_padding)
|
65
|
+
val.force_encoding("UTF-16BE")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
class String8Unpadded
|
71
|
+
def self.pack(x)
|
72
|
+
x
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
def self.unpack(socket, size)
|
77
|
+
val = socket.read(size)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
class Bool
|
82
|
+
def self.pack(x)
|
83
|
+
x ? "\x01" : "\x00"
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.unpack(str)
|
87
|
+
str[0] == "\x01"
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.size
|
91
|
+
1
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
KeyCode = Uint8
|
96
|
+
Signifigance = Uint8
|
97
|
+
BitGravity = Uint8
|
98
|
+
WinGravity = Uint8
|
99
|
+
BackingStore = Uint8
|
100
|
+
Bitmask = Uint32
|
101
|
+
Window = Uint32
|
102
|
+
Pixmap = Uint32
|
103
|
+
Cursor = Uint32
|
104
|
+
Colornum = Uint32
|
105
|
+
Font = Uint32
|
106
|
+
Gcontext = Uint32
|
107
|
+
Colormap = Uint32
|
108
|
+
Drawable = Uint32
|
109
|
+
Fontable = Uint32
|
110
|
+
Atom = Uint32
|
111
|
+
VisualID = Uint32
|
112
|
+
Mask = Uint32
|
113
|
+
Timestamp = Uint32
|
114
|
+
Keysym = Uint32
|
115
|
+
end
|
116
|
+
end
|
data/lib/X11/version.rb
ADDED
data/lib/X11.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
module X11
|
2
|
+
class X11Error < StandardError; end
|
3
|
+
end
|
4
|
+
|
5
|
+
require 'socket'
|
6
|
+
require_relative './X11/protocol'
|
7
|
+
require_relative './X11/auth'
|
8
|
+
require_relative './X11/display'
|
9
|
+
require_relative './X11/screen'
|
10
|
+
require_relative './X11/type'
|
11
|
+
require_relative './X11/form'
|
12
|
+
require_relative './X11/keysyms'
|
data/ruby-x11.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "X11/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "pure-x11"
|
7
|
+
s.version = X11::VERSION
|
8
|
+
s.authors = ["Vidar Hokstad", "Richard Ramsden"]
|
9
|
+
s.email = ["vidar@hokstad.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = "Pure Ruby X11 bindings"
|
12
|
+
s.description = "Pure Ruby X11 bindings"
|
13
|
+
|
14
|
+
#s.rubyforge_project = "ruby-x11"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
# s.add_development_dependency "rspec"
|
23
|
+
# s.add_runtime_dependency "rest-client"
|
24
|
+
end
|
data/test/core_test.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.expand_path('../helper', __FILE__)
|
2
|
+
|
3
|
+
describe X11 do
|
4
|
+
describe X11::Display do
|
5
|
+
before(:each) do
|
6
|
+
@display = X11::Display.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should generate a unique id" do
|
10
|
+
collection = 1000.times.collect { @display.new_id }
|
11
|
+
expected = collection.size
|
12
|
+
collection.uniq.size.must_equal expected
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/test/form_test.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require File.expand_path('../helper', __FILE__)
|
2
|
+
|
3
|
+
class MockSocket
|
4
|
+
def initialize(packet)
|
5
|
+
@packet = packet
|
6
|
+
end
|
7
|
+
|
8
|
+
def read(amount)
|
9
|
+
@packet.slice!(0..amount-1)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Point < X11::Form::BaseForm
|
14
|
+
field :x, Int8
|
15
|
+
field :y, Int8
|
16
|
+
end
|
17
|
+
|
18
|
+
class Child < X11::Form::BaseForm
|
19
|
+
field :name, Uint16, :length
|
20
|
+
field :name, String8, :string
|
21
|
+
end
|
22
|
+
|
23
|
+
class Parent < X11::Form::BaseForm
|
24
|
+
field :value, Uint8
|
25
|
+
field :point, Point
|
26
|
+
|
27
|
+
field :name, Uint16, :length
|
28
|
+
field :name, String8, :string
|
29
|
+
|
30
|
+
field :children, Uint16, :length
|
31
|
+
field :children, Child, :list
|
32
|
+
end
|
33
|
+
|
34
|
+
describe X11::Form::BaseForm do
|
35
|
+
it "setters and getters on form should work" do
|
36
|
+
|
37
|
+
# we can create partial form objects
|
38
|
+
# without specifying all parameters.
|
39
|
+
parent = Parent.new(1337)
|
40
|
+
|
41
|
+
# To fill in the rest of the parameters
|
42
|
+
# we use attr_accessors
|
43
|
+
parent.name = "Parent Form"
|
44
|
+
parent.point = Point.new(0,0)
|
45
|
+
|
46
|
+
_(parent.point).must_be_instance_of Point
|
47
|
+
_(parent.name).must_equal "Parent Form"
|
48
|
+
|
49
|
+
parent.children = []
|
50
|
+
parent.children << Child.new
|
51
|
+
parent.children << Child.new
|
52
|
+
|
53
|
+
assert_equal parent.children.size, 2
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should encode/decode a packet" do
|
57
|
+
parent = Parent.new(255,Point.new(23,17), "Parent Form", [])
|
58
|
+
socket = MockSocket.new(parent.to_packet)
|
59
|
+
|
60
|
+
decoded = Parent.from_packet(socket)
|
61
|
+
_(decoded.value).must_equal 255
|
62
|
+
_(decoded.name).must_equal "Parent Form"
|
63
|
+
_(decoded.point.x).must_equal 23
|
64
|
+
_(decoded.point.y).must_equal 17
|
65
|
+
end
|
66
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
Bundler.setup(:default, :development)
|
4
|
+
|
5
|
+
require 'minitest/spec'
|
6
|
+
require 'minitest/autorun'
|
7
|
+
|
8
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
9
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
10
|
+
|
11
|
+
require 'X11'
|
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pure-x11
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Vidar Hokstad
|
8
|
+
- Richard Ramsden
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2023-09-25 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: Pure Ruby X11 bindings
|
15
|
+
email:
|
16
|
+
- vidar@hokstad.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- ".gitignore"
|
22
|
+
- Gemfile
|
23
|
+
- Gemfile.lock
|
24
|
+
- LICENSE.txt
|
25
|
+
- README.md
|
26
|
+
- Rakefile
|
27
|
+
- docs/protocol.pdf
|
28
|
+
- example/genie.png
|
29
|
+
- example/test.rb
|
30
|
+
- lib/X11.rb
|
31
|
+
- lib/X11/auth.rb
|
32
|
+
- lib/X11/display.rb
|
33
|
+
- lib/X11/event.rb
|
34
|
+
- lib/X11/form.rb
|
35
|
+
- lib/X11/keysyms.rb
|
36
|
+
- lib/X11/protocol.rb
|
37
|
+
- lib/X11/screen.rb
|
38
|
+
- lib/X11/type.rb
|
39
|
+
- lib/X11/version.rb
|
40
|
+
- ruby-x11.gemspec
|
41
|
+
- test/core_test.rb
|
42
|
+
- test/form_test.rb
|
43
|
+
- test/helper.rb
|
44
|
+
homepage: ''
|
45
|
+
licenses: []
|
46
|
+
metadata: {}
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options: []
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
requirements: []
|
62
|
+
rubygems_version: 3.4.10
|
63
|
+
signing_key:
|
64
|
+
specification_version: 4
|
65
|
+
summary: Pure Ruby X11 bindings
|
66
|
+
test_files: []
|