rwm 0.0.1.alpha.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/bin/rwm ADDED
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rwm/x11'
4
+ include X11::Events
5
+
6
+ dpy = X11::Display.new(ENV['DISPLAY'])
7
+ root = dpy.default_screen.root_window
8
+
9
+ p X11::Mask
10
+ root.grab_key("F1", X11::Mask[:Mod1])
11
+ root.grab_button(1, X11::Mask[:Mod1])
12
+ root.grab_button(3, X11::Mask[:Mod1])
13
+
14
+ start, attr = []
15
+
16
+ dpy.each_event {|ev|
17
+ case ev
18
+ when KeyPress
19
+ ev.subwindow.raise unless ev.subwindow.nil?
20
+ when ButtonPress
21
+ unless ev.subwindow.nil?
22
+ ev.subwindow.grab_pointer(true, X11::Mask[:PointerMotion] | X11::Mask[:ButtonRelease])
23
+ attr = ev.subwindow.attributes
24
+ start = ev
25
+ end
26
+ when MotionNotify
27
+ nil while (dpy.check_typed_event(MotionNotify).tap {|x| ev = x if x })
28
+
29
+ xdiff = ev.x_root - start.x_root
30
+ ydiff = ev.y_root - start.y_root
31
+ ev.window.move_resize(attr.x + (start.button == 1 ? xdiff : 0),
32
+ attr.y + (start.button == 1 ? ydiff : 0),
33
+ [1, attr.width + (start.button == 3 ? xdiff : 0)].max,
34
+ [1, attr.height + (start.button == 3 ? ydiff : 0)].max)
35
+ when ButtonRelease
36
+ dpy.ungrab_pointer
37
+ end
38
+ }
@@ -0,0 +1,41 @@
1
+ #--
2
+ # Copyleft shura. [ shura1991@gmail.com ]
3
+ #
4
+ # This file is part of rwm.
5
+ #
6
+ # rwm is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # rwm is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with rwm. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ require 'rwm/client'
21
+
22
+ module Arbi
23
+ class << self
24
+ def connect(address = '127.0.0.1', port = 6969)
25
+ @@connection = Arbi::Client.new(address, port)
26
+ end
27
+
28
+ def connected?
29
+ @@connection ? true : false
30
+ end
31
+
32
+ def connection
33
+ @@connection.sock
34
+ end
35
+
36
+ def get(what)
37
+ self.connect unless self.connected?
38
+ @@connection.get(what)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,66 @@
1
+ #--
2
+ # Copyleft shura. [ shura1991@gmail.com ]
3
+ #
4
+ # This file is part of rwm.
5
+ #
6
+ # rwm is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # rwm is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with rwm. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ require 'ffi'
21
+
22
+ module FFI
23
+ module Library
24
+ def has_function? (sym, libraries=[])
25
+ if libraries.empty?
26
+ libraries << FFI::Library::LIBC
27
+ end
28
+
29
+ libraries.any? {|lib|
30
+ DynamicLibrary.new(lib, 0).find_function(sym.to_s) rescue nil
31
+ }
32
+ end
33
+
34
+ def attach_function! (*args, &block)
35
+ begin
36
+ attach_function(*args, &block)
37
+ rescue Exception => e
38
+ false
39
+ end
40
+ end
41
+ end
42
+
43
+ class Type::Builtin
44
+ def name
45
+ @__name__ ||= Type::Builtin.constants.find {|name|
46
+ Type::Builtin.const_get(name) == self
47
+ }
48
+ end
49
+ end
50
+
51
+ class Pointer
52
+ def typecast (type)
53
+ if type.is_a?(Symbol)
54
+ type = FFI.find_type(type)
55
+ end
56
+
57
+ if type.is_a?(Class) && type.ancestors.member?(FFI::Struct)
58
+ type.new(self)
59
+ elsif type.is_a?(Type::Builtin)
60
+ send "read_#{type.name.downcase}"
61
+ else
62
+ ArgumentError.new "You have to pass a Struct, a Builtin type or a Symbol"
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,61 @@
1
+ #--
2
+ # Copyleft shura. [ shura1991@gmail.com ]
3
+ #
4
+ # This file is part of rwm.
5
+ #
6
+ # rwm is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # rwm is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with rwm. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ require 'rwm/x11/c'
21
+ require 'rwm/x11/types'
22
+ require 'rwm/x11/events'
23
+ require 'rwm/x11/masks'
24
+
25
+ class String
26
+ def to_keysym
27
+ X11::C.XStringToKeysym(self)
28
+ end
29
+
30
+ def to_keycode (dpy=nil)
31
+ to_keysym.to_keycode(dpy)
32
+ end
33
+ end
34
+
35
+ class Fixnum
36
+ def to_keycode! (dpy=nil)
37
+ (dpy || ObjectSpace.each_object(X11::Display).first || X11::Display.new).
38
+ keysym_to_keycode(self).tap {|kc|
39
+ kc.instance_eval {
40
+ keycode!
41
+ }
42
+ }
43
+ end
44
+
45
+ def to_keycode (dpy=nil)
46
+ keycoded? ? self : to_keycode!
47
+ end
48
+
49
+ def to_c
50
+ self
51
+ end
52
+
53
+ private
54
+ def keycoded?
55
+ @kc ||= false
56
+ end
57
+
58
+ def keycode!
59
+ @kc = true
60
+ end
61
+ end
@@ -0,0 +1,31 @@
1
+ #--
2
+ # Copyleft shura. [ shura1991@gmail.com ]
3
+ #
4
+ # This file is part of rwm.
5
+ #
6
+ # rwm is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # rwm is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with rwm. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ require 'rwm/extensions'
21
+
22
+ module X11
23
+ module C
24
+ extend FFI::Library
25
+
26
+ ffi_lib 'X11'
27
+ end
28
+ end
29
+
30
+ require 'rwm/x11/c/types'
31
+ require 'rwm/x11/c/functions'
@@ -0,0 +1,45 @@
1
+ #--
2
+ # Copyleft shura. [ shura1991@gmail.com ]
3
+ #
4
+ # This file is part of rwm.
5
+ #
6
+ # rwm is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # rwm is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with rwm. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+
21
+ module X11
22
+ module C
23
+ attach_function :XOpenDisplay, [:string], :pointer
24
+
25
+ attach_function :XGrabButton, [:pointer, :uint, :uint, :Window, :Bool, :uint, :int, :int, :Window, :Cursor], :int
26
+ attach_function :XGrabKey, [:pointer, :int, :uint, :Window, :Bool, :int, :int], :int
27
+ attach_function :XGrabKeyboard, [:pointer, :Window, :Bool, :int, :int, :Time], :int
28
+ attach_function :XGrabPointer, [:pointer, :Window, :Bool, :uint, :int, :int, :Window, :Cursor, :Time], :int
29
+
30
+ attach_function :XUngrabButton, [:pointer, :uint, :uint, :Window], :int
31
+ attach_function :XUngrabKey, [:pointer, :int, :uint, :Window], :int
32
+ attach_function :XUngrabKeyboard, [:pointer, :Time], :int
33
+ attach_function :XUngrabPointer, [:pointer, :Time], :int
34
+
35
+ attach_function :XGetWindowAttributes, [:pointer, :Window, :pointer], :int
36
+ attach_function :XMoveResizeWindow, [:pointer, :Window, :int, :int, :uint, :uint], :int
37
+ attach_function :XRaiseWindow, [:pointer, :Window], :int
38
+
39
+ attach_function :XNextEvent, [:pointer, :pointer], :int
40
+ attach_function :XCheckTypedEvent, [:pointer, :int, :pointer], :Bool
41
+
42
+ attach_function :XStringToKeysym, [:string], :KeySym
43
+ attach_function :XKeysymToKeycode, [:pointer, :KeySym], :KeyCode
44
+ end
45
+ end
@@ -0,0 +1,647 @@
1
+ #--
2
+ # Copyleft shura. [ shura1991@gmail.com ]
3
+ #
4
+ # This file is part of rwm.
5
+ #
6
+ # rwm is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # rwm is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with rwm. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ module X11
21
+ module C
22
+ module Bool
23
+ extend FFI::DataConverter
24
+ native_type FFI::Type::INT
25
+
26
+ def self.to_native (value, ctx)
27
+ value ? 1 : 0
28
+ end
29
+
30
+ def self.from_native (value, ctx)
31
+ !value.zero?
32
+ end
33
+ end
34
+ FFI.typedef(Bool, :Bool)
35
+
36
+ FFI.typedef(:uint32, :CARD32)
37
+ XID = FFI.typedef(:ulong, :XID)
38
+
39
+ VisualID = FFI.typedef(:CARD32, :VisualID)
40
+ Window = FFI.typedef(:XID, :Window)
41
+ Colormap = FFI.typedef(:XID, :Colormap)
42
+ GContext = FFI.typedef(:XID, :GContext)
43
+ Cursor = FFI.typedef(:XID, :Cursor)
44
+ KeySym = FFI.typedef(:XID, :KeySym)
45
+ Drawable = FFI.typedef(:XID, :Drawable)
46
+ KeyCode = FFI.typedef(:uchar, :KeyCode)
47
+ Time = FFI.typedef(:ulong, :Time)
48
+ Atom = FFI.typedef(:ulong, :Atom)
49
+
50
+ class Display < FFI::Struct
51
+ layout \
52
+ :ext_data, :pointer,
53
+ :private1, :pointer,
54
+ :fd, :int,
55
+ :private2, :int,
56
+ :proto_major_version, :int,
57
+ :proto_minor_version, :int,
58
+ :vendor, :string,
59
+ :private3, XID,
60
+ :private4, XID,
61
+ :private5, XID,
62
+ :private6, :int,
63
+ :resource_alloc, :pointer,
64
+ :byte_order, :int,
65
+ :bitmap_unit, :int,
66
+ :bitmap_pad, :int,
67
+ :bitmap_bit_order, :int,
68
+ :nformats, :int,
69
+ :pixmap_format, :pointer,
70
+ :private8, :int,
71
+ :release, :int,
72
+ :private9, :pointer,
73
+ :private10, :pointer,
74
+ :qlen, :int,
75
+ :last_request_read, :ulong,
76
+ :request, :ulong,
77
+ :private11, :pointer,
78
+ :private12, :pointer,
79
+ :private13, :pointer,
80
+ :private14, :pointer,
81
+ :max_request_size, :uint,
82
+ :db, :pointer,
83
+ :private15, :pointer,
84
+ :display_name, :string,
85
+ :default_screen, :int,
86
+ :nscreens, :int,
87
+ :screens, :pointer,
88
+ :motion_buffer, :ulong,
89
+ :private16, :ulong,
90
+ :min_keycode, :int,
91
+ :max_keycode, :int,
92
+ :private17, :pointer,
93
+ :private18, :pointer,
94
+ :private19, :int,
95
+ :xdefaults, :string
96
+ end
97
+
98
+ class GC < FFI::Struct
99
+ layout \
100
+ :ext_data, :pointer,
101
+ :gid, GContext
102
+ end
103
+
104
+ class Screen < FFI::Struct
105
+ layout \
106
+ :ext_data, :pointer,
107
+ :display, :pointer,
108
+ :root, :Window,
109
+ :width, :int,
110
+ :height, :int,
111
+ :mwidth, :int,
112
+ :mheight, :int,
113
+ :ndepths, :int,
114
+ :depths, :pointer,
115
+ :root_depth, :int,
116
+ :root_visual, :pointer,
117
+ :default_gc, GC,
118
+ :cmap, Colormap,
119
+ :white_pixel, :ulong,
120
+ :black_pixel, :ulong,
121
+ :max_maps, :int,
122
+ :min_maps, :int,
123
+ :save_unders, :Bool,
124
+ :root_input_mask, :long
125
+ end
126
+
127
+ class XWindowAttributes < FFI::Struct
128
+ layout \
129
+ :x, :int,
130
+ :y, :int,
131
+ :width, :int,
132
+ :height, :int,
133
+ :border_width, :int,
134
+ :depth, :int,
135
+ :visual, :pointer,
136
+ :root, :Window,
137
+ :class, :int,
138
+ :bit_gravity, :int,
139
+ :win_gravity, :int,
140
+ :backing_store, :int,
141
+ :backing_planes, :ulong,
142
+ :backing_pixel, :ulong,
143
+ :save_under, :Bool,
144
+ :colormap, Colormap,
145
+ :map_installed, :Bool,
146
+ :map_state, :int,
147
+ :all_event_masks, :long,
148
+ :your_event_masks, :long,
149
+ :do_not_propagate_mask, :long,
150
+ :override_redirect, :Bool,
151
+ :screen, :pointer
152
+ end
153
+
154
+ class Visual < FFI::Struct
155
+ layout \
156
+ :ext_data, :pointer,
157
+ :visualid, :VisualID,
158
+ :class, :int,
159
+ :read_mask, :ulong,
160
+ :green_mask, :ulong,
161
+ :blue_mask, :ulong,
162
+ :buts_per_rgb, :int,
163
+ :map_entries, :int
164
+ end
165
+
166
+ class XAnyEvent < FFI::Struct
167
+ layout \
168
+ :type, :int,
169
+ :serial, :ulong,
170
+ :send_event, :Bool,
171
+ :display, :pointer,
172
+ :window, :Window
173
+ end
174
+
175
+ class XKeyEvent < FFI::Struct
176
+ layout \
177
+ :type, :int,
178
+ :serial, :ulong,
179
+ :send_event, :Bool,
180
+ :display, :pointer,
181
+ :window, :Window,
182
+ :root, :Window,
183
+ :subwindow, :Window,
184
+ :time, :Time,
185
+ :x, :int,
186
+ :y, :int,
187
+ :x_root, :int,
188
+ :y_root, :int,
189
+ :state, :uint,
190
+ :keycode, :uint,
191
+ :same_screen, :Bool
192
+ end
193
+
194
+ class XButtonEvent < FFI::Struct
195
+ layout \
196
+ :type, :int,
197
+ :serial, :ulong,
198
+ :send_event, :Bool,
199
+ :display, :pointer,
200
+ :window, :Window,
201
+ :root, :Window,
202
+ :subwindow, :Window,
203
+ :time, :Time,
204
+ :x, :int,
205
+ :y, :int,
206
+ :x_root, :int,
207
+ :y_root, :int,
208
+ :state, :uint,
209
+ :button, :uint,
210
+ :same_screen, :Bool
211
+ end
212
+
213
+ class XMotionEvent < FFI::Struct
214
+ layout \
215
+ :type, :int,
216
+ :serial, :ulong,
217
+ :send_event, :Bool,
218
+ :display, :pointer,
219
+ :window, :Window,
220
+ :root, :Window,
221
+ :subwindow, :Window,
222
+ :time, :Time,
223
+ :x, :int,
224
+ :y, :int,
225
+ :x_root, :int,
226
+ :y_root, :int,
227
+ :state, :uint,
228
+ :is_hint, :char,
229
+ :same_screen, :Bool
230
+ end
231
+
232
+ class XCrossingEvent < FFI::Struct
233
+ layout \
234
+ :type, :int,
235
+ :serial, :ulong,
236
+ :send_event, :Bool,
237
+ :display, :pointer,
238
+ :window, :Window,
239
+ :root, :Window,
240
+ :subwindow, :Window,
241
+ :time, :Time,
242
+ :x, :int,
243
+ :y, :int,
244
+ :x_root, :int,
245
+ :y_root, :int,
246
+ :mode, :int,
247
+ :detail, :int,
248
+ :same_screen, :Bool,
249
+ :focus, :Bool,
250
+ :state, :uint
251
+ end
252
+
253
+ class XFocusChangeEvent < FFI::Union
254
+ layout \
255
+ :type, :int,
256
+ :serial, :ulong,
257
+ :send_event, :Bool,
258
+ :display, :pointer,
259
+ :window, :Window,
260
+ :mode, :int,
261
+ :detail, :int
262
+ end
263
+
264
+ class XExposeEvent < FFI::Struct
265
+ layout \
266
+ :type, :int,
267
+ :serial, :ulong,
268
+ :send_event, :Bool,
269
+ :display, :pointer,
270
+ :window, :Window,
271
+ :x, :int,
272
+ :y, :int,
273
+ :width, :int,
274
+ :height, :int,
275
+ :count, :int
276
+ end
277
+
278
+ class XGraphicsExposeEvent < FFI::Struct
279
+ layout \
280
+ :type, :int,
281
+ :serial, :ulong,
282
+ :send_event, :Bool,
283
+ :display, :pointer,
284
+ :window, :Window,
285
+ :drawable, :Drawable,
286
+ :x, :int,
287
+ :y, :int,
288
+ :width, :int,
289
+ :height, :int,
290
+ :count, :int,
291
+ :major_code, :int,
292
+ :minor_code, :int
293
+ end
294
+
295
+ class XNoExposeEvent < FFI::Struct
296
+ layout \
297
+ :type, :int,
298
+ :serial, :ulong,
299
+ :send_event, :Bool,
300
+ :display, :pointer,
301
+ :drawable, :Drawable,
302
+ :major_code, :int,
303
+ :minor_code, :int
304
+ end
305
+
306
+ class XVisibilityEvent < FFI::Struct
307
+ layout \
308
+ :type, :int,
309
+ :serial, :ulong,
310
+ :send_event, :Bool,
311
+ :display, :pointer,
312
+ :window, :Window,
313
+ :state, :int
314
+ end
315
+
316
+ class XCreateWindowEvent < FFI::Struct
317
+ layout \
318
+ :type, :int,
319
+ :serial, :ulong,
320
+ :send_event, :Bool,
321
+ :display, :pointer,
322
+ :parent, :Window,
323
+ :window, :Window,
324
+ :x, :int,
325
+ :y, :int,
326
+ :width, :int,
327
+ :height, :int,
328
+ :border_width, :int,
329
+ :override_redirect, :Bool
330
+ end
331
+
332
+ class XDestroyWindowEvent < FFI::Struct
333
+ layout \
334
+ :type, :int,
335
+ :serial, :ulong,
336
+ :send_event, :Bool,
337
+ :display, :pointer,
338
+ :event, :Window,
339
+ :window, :Window
340
+ end
341
+
342
+ class XUnmapEvent < FFI::Struct
343
+ layout \
344
+ :type, :int,
345
+ :serial, :ulong,
346
+ :send_event, :Bool,
347
+ :display, :pointer,
348
+ :event, :Window,
349
+ :window, :Window,
350
+ :from_configure, :Bool
351
+ end
352
+
353
+ class XMapEvent < FFI::Struct
354
+ layout \
355
+ :type, :int,
356
+ :serial, :ulong,
357
+ :send_event, :Bool,
358
+ :display, :pointer,
359
+ :event, :Window,
360
+ :window, :Window,
361
+ :override_redirect, :Bool
362
+ end
363
+
364
+ class XMapRequestEvent < FFI::Struct
365
+ layout \
366
+ :type, :int,
367
+ :serial, :ulong,
368
+ :send_event, :Bool,
369
+ :display, :pointer,
370
+ :event, :Window,
371
+ :window, :Window,
372
+ :parent, :Window,
373
+ :x, :int,
374
+ :y, :int,
375
+ :override_redirect, :Bool
376
+ end
377
+
378
+ class XReparentEvent < FFI::Struct
379
+ layout \
380
+ :type, :int,
381
+ :serial, :ulong,
382
+ :send_event, :Bool,
383
+ :display, :pointer,
384
+ :event, :Window,
385
+ :window, :Window,
386
+ :parent, :Window,
387
+ :x, :int,
388
+ :y, :int,
389
+ :override_redirect, :Bool
390
+ end
391
+
392
+ class XConfigureEvent < FFI::Struct
393
+ layout \
394
+ :type, :int,
395
+ :serial, :ulong,
396
+ :send_event, :Bool,
397
+ :display, :pointer,
398
+ :event, :Window,
399
+ :window, :Window,
400
+ :x, :int,
401
+ :y, :int,
402
+ :width, :int,
403
+ :height, :int,
404
+ :border_width, :int,
405
+ :above, :Window,
406
+ :override_redirect, :Bool
407
+ end
408
+
409
+ class XGravityEvent < FFI::Struct
410
+ layout \
411
+ :type, :int,
412
+ :serial, :ulong,
413
+ :send_event, :Bool,
414
+ :display, :pointer,
415
+ :event, :Window,
416
+ :window, :Window,
417
+ :x, :int,
418
+ :y, :int
419
+ end
420
+
421
+ class XResizeRequestEvent < FFI::Struct
422
+ layout \
423
+ :type, :int,
424
+ :serial, :ulong,
425
+ :send_event, :Bool,
426
+ :display, :pointer,
427
+ :window, :Window,
428
+ :width, :int,
429
+ :height, :int
430
+ end
431
+
432
+ class XConfigureRequestEvent < FFI::Struct
433
+ layout \
434
+ :type, :int,
435
+ :serial, :ulong,
436
+ :send_event, :Bool,
437
+ :display, :pointer,
438
+ :event, :Window,
439
+ :window, :Window,
440
+ :x, :int,
441
+ :y, :int,
442
+ :width, :int,
443
+ :height, :int,
444
+ :border_width, :int,
445
+ :above, :Window,
446
+ :detail, :int,
447
+ :value_mask, :ulong
448
+ end
449
+
450
+ class XCirculateEvent < FFI::Struct
451
+ layout \
452
+ :type, :int,
453
+ :serial, :ulong,
454
+ :send_event, :Bool,
455
+ :display, :pointer,
456
+ :event, :Window,
457
+ :window, :Window,
458
+ :place, :int
459
+ end
460
+
461
+ class XCirculateRequestEvent < FFI::Struct
462
+ layout \
463
+ :type, :int,
464
+ :serial, :ulong,
465
+ :send_event, :Bool,
466
+ :display, :pointer,
467
+ :event, :Window,
468
+ :window, :Window,
469
+ :place, :int
470
+ end
471
+
472
+ class XPropertyEvent < FFI::Struct
473
+ layout \
474
+ :type, :int,
475
+ :serial, :ulong,
476
+ :send_event, :Bool,
477
+ :display, :pointer,
478
+ :window, :Window,
479
+ :atom, :Atom,
480
+ :time, :Time,
481
+ :state, :int
482
+ end
483
+
484
+ class XSelectionClearEvent < FFI::Struct
485
+ layout \
486
+ :type, :int,
487
+ :serial, :ulong,
488
+ :send_event, :Bool,
489
+ :display, :pointer,
490
+ :window, :Window,
491
+ :selection, :Atom,
492
+ :time, :Time
493
+ end
494
+
495
+ class XSelectionRequestEvent < FFI::Struct
496
+ layout \
497
+ :type, :int,
498
+ :serial, :ulong,
499
+ :send_event, :Bool,
500
+ :display, :pointer,
501
+ :owner, :Window,
502
+ :requestor, :Window,
503
+ :selection, :Atom,
504
+ :target, :Atom,
505
+ :property, :Atom,
506
+ :time, :Time
507
+ end
508
+
509
+ class XSelectionEvent < FFI::Struct
510
+ layout \
511
+ :type, :int,
512
+ :serial, :ulong,
513
+ :send_event, :Bool,
514
+ :display, :pointer,
515
+ :requestor, :Window,
516
+ :selection, :Atom,
517
+ :target, :Atom,
518
+ :property, :Atom,
519
+ :time, :Time
520
+ end
521
+
522
+ class XColormapEvent < FFI::Struct
523
+ layout \
524
+ :type, :int,
525
+ :serial, :ulong,
526
+ :send_event, :Bool,
527
+ :display, :pointer,
528
+ :window, :Window,
529
+ :colormap, :Colormap,
530
+ :new, :Bool,
531
+ :state, :int
532
+ end
533
+
534
+ class XClientMessageEvent < FFI::Struct
535
+ class Data < FFI::Struct
536
+ layout \
537
+ :b, [:char, 20],
538
+ :s, [:short, 10],
539
+ :l, [:long, 5]
540
+ end
541
+
542
+ layout \
543
+ :type, :int,
544
+ :serial, :ulong,
545
+ :send_event, :Bool,
546
+ :display, :pointer,
547
+ :window, :Window,
548
+ :message_type, :Atom,
549
+ :format, :int,
550
+ :data, Data
551
+ end
552
+
553
+ class XMappingEvent < FFI::Struct
554
+ layout \
555
+ :type, :int,
556
+ :serial, :ulong,
557
+ :send_event, :Bool,
558
+ :display, :pointer,
559
+ :window, :Window,
560
+ :request, :int,
561
+ :first_keycode, :int,
562
+ :count, :int
563
+ end
564
+
565
+ class XErrorEvent < FFI::Struct
566
+ layout \
567
+ :type, :int,
568
+ :display, :pointer,
569
+ :resourceid, :XID,
570
+ :serial, :ulong,
571
+ :error_code, :uchar,
572
+ :request_code, :uchar,
573
+ :minor_code, :uchar
574
+ end
575
+
576
+ class XKeymapEvent < FFI::Struct
577
+ layout \
578
+ :type, :int,
579
+ :serial, :ulong,
580
+ :send_event, :Bool,
581
+ :display, :pointer,
582
+ :window, :Window,
583
+ :key_vector, [:char, 32]
584
+ end
585
+
586
+ class XGenericEvent < FFI::Struct
587
+ layout \
588
+ :type, :int,
589
+ :serial, :ulong,
590
+ :send_event, :Bool,
591
+ :display, :pointer,
592
+ :extension, :int,
593
+ :evtype, :int
594
+ end
595
+
596
+ class XGenericEventCookie < FFI::Struct
597
+ layout \
598
+ :type, :int,
599
+ :serial, :ulong,
600
+ :send_event, :Bool,
601
+ :display, :pointer,
602
+ :extension, :int,
603
+ :evtype, :int,
604
+ :cookie, :uint,
605
+ :data, :pointer
606
+ end
607
+
608
+ class XEvent < FFI::Union
609
+ layout \
610
+ :type, :int,
611
+ :xany, XAnyEvent,
612
+ :xkey, XKeyEvent,
613
+ :xbutton, XButtonEvent,
614
+ :xmotion, XMotionEvent,
615
+ :xcrossing, XCrossingEvent,
616
+ :xfocus, XFocusChangeEvent,
617
+ :xexpose, XExposeEvent,
618
+ :xgraphicsexpose, XGraphicsExposeEvent,
619
+ :xnoexpose, XNoExposeEvent,
620
+ :xvisibility, XVisibilityEvent,
621
+ :xcreatewindow, XCreateWindowEvent,
622
+ :xdestroywindow, XDestroyWindowEvent,
623
+ :xunmap, XUnmapEvent,
624
+ :xmap, XMapEvent,
625
+ :xmaprequest, XMapRequestEvent,
626
+ :xreparent, XReparentEvent,
627
+ :xconfigure, XConfigureEvent,
628
+ :xgravity, XGravityEvent,
629
+ :xresizerequest, XResizeRequestEvent,
630
+ :xconfigurerequest, XConfigureRequestEvent,
631
+ :xcirculate, XCirculateEvent,
632
+ :xcirculaterequest, XCirculateRequestEvent,
633
+ :xproperty, XPropertyEvent,
634
+ :xselectionclear, XSelectionClearEvent,
635
+ :xselectionrequest, XSelectionRequestEvent,
636
+ :xselection, XSelectionEvent,
637
+ :xcolormap, XColormapEvent,
638
+ :xclient, XClientMessageEvent,
639
+ :xmapping, XMappingEvent,
640
+ :xerror, XErrorEvent,
641
+ :xkeymap, XKeymapEvent,
642
+ :xgeneric, XGenericEvent,
643
+ :xcookie, XGenericEventCookie,
644
+ :pad, [:long, 24]
645
+ end
646
+ end
647
+ end