pure-x11 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/example/test.rb +19 -19
- data/lib/X11/display.rb +142 -73
- data/lib/X11/form.rb +260 -45
- data/lib/X11/type.rb +10 -3
- data/lib/X11/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0ecd289a7ec4a0a7f44bba1d05a437774ca6ed3d4c403b572b28a8691ef2a950
|
4
|
+
data.tar.gz: ac9460f0c0db0635e33358550176802119db88c9bb4dee097807f21c970f68ba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db23062260daabe75bfe5a9f419772be329023777c405ae7bb3a08125b9942f63ec8d635c1c11869648272d2c3ecad16a432fbca2d4d584d80ad2dbf15250d5a
|
7
|
+
data.tar.gz: f303d01e2c4b43fa2c5d44af4e469288684887c3efe71ee644275f233d584b9e342f9ebd80374632afe1199ad0d4182cebb515a95a7408b79aa36d239c9c9ffb
|
data/example/test.rb
CHANGED
@@ -13,37 +13,37 @@ require 'X11'
|
|
13
13
|
dpy = display = X11::Display.new
|
14
14
|
screen = dpy.screens.first
|
15
15
|
root = screen.root
|
16
|
-
wid = display.new_id
|
17
16
|
|
18
|
-
dpy.create_window(
|
19
|
-
screen.root_depth, wid, root,
|
17
|
+
wid = dpy.create_window(
|
20
18
|
0, 0, # x,y
|
21
19
|
1000, 600, # w,h
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
X11::Form::CWEventMask
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
]
|
20
|
+
# FIXME: WTH isn't depth: 32 working here?
|
21
|
+
depth: 24,
|
22
|
+
values: {
|
23
|
+
X11::Form::CWBackPixel => 0x0,
|
24
|
+
X11::Form::CWEventMask =>
|
25
|
+
(X11::Form::SubstructureNotifyMask |
|
26
|
+
X11::Form::StructureNotifyMask | ## Move
|
27
|
+
X11::Form::ExposureMask |
|
28
|
+
X11::Form::KeyPressMask |
|
29
|
+
X11::Form::ButtonPressMask)
|
30
|
+
}
|
34
31
|
)
|
32
|
+
#dpy.next_packet
|
33
|
+
#exit(0)
|
35
34
|
|
36
35
|
def set_window_opacity(dpy, wid, opacity)
|
37
36
|
dpy.change_property(
|
38
|
-
|
39
|
-
wid,
|
40
|
-
|
41
|
-
[(0xffffffff * opacity).to_i].pack("
|
37
|
+
:replace,
|
38
|
+
wid, "_NET_WM_WINDOW_OPACITY",
|
39
|
+
:cardinal, 32,
|
40
|
+
[(0xffffffff * opacity).to_i].pack("V").unpack("C*")
|
42
41
|
)
|
43
42
|
end
|
44
43
|
|
45
44
|
|
46
45
|
set_window_opacity(dpy, wid, 0.8)
|
46
|
+
|
47
47
|
#p dpy.display_info
|
48
48
|
|
49
49
|
#reply = dpy.query_extension("XKEYBOARD")
|
data/lib/X11/display.rb
CHANGED
@@ -68,6 +68,7 @@ module X11
|
|
68
68
|
def read_error data
|
69
69
|
error = Form::Error.from_packet(StringIO.new(data))
|
70
70
|
STDERR.puts "ERROR: #{error.inspect}"
|
71
|
+
raise error.inspect
|
71
72
|
error
|
72
73
|
end
|
73
74
|
|
@@ -80,28 +81,47 @@ module X11
|
|
80
81
|
end
|
81
82
|
|
82
83
|
def read_event type, data, event_class
|
84
|
+
io = StringIO.new(data)
|
83
85
|
case type
|
84
|
-
|
85
|
-
|
86
|
-
when
|
87
|
-
|
88
|
-
when 4
|
89
|
-
|
90
|
-
when
|
91
|
-
|
92
|
-
when
|
93
|
-
|
94
|
-
when
|
95
|
-
|
96
|
-
when
|
97
|
-
|
98
|
-
when
|
99
|
-
|
100
|
-
when
|
101
|
-
|
86
|
+
# 0 is error, not handled here
|
87
|
+
# 1 is reply, not handled here
|
88
|
+
when 2 then return Form::KeyPress.from_packet(io)
|
89
|
+
when 3 then return Form::KeyRelease.from_packet(io)
|
90
|
+
when 4 then return Form::ButtonPress.from_packet(io)
|
91
|
+
when 5 then return Form::ButtonRelease.from_packet(io)
|
92
|
+
when 6 then return Form::MotionNotify.from_packet(io)
|
93
|
+
when 7 then return Form::EnterNotify.from_packet(io)
|
94
|
+
when 8 then return Form::LeaveNotify.from_packet(io)
|
95
|
+
when 9 then return Form::FocusIn.from_packet(io)
|
96
|
+
when 10 then return Form::FocusOut.from_packet(io)
|
97
|
+
# FIXME 11: KeymapNotify
|
98
|
+
when 12 then return Form::Expose.from_packet(io)
|
99
|
+
# FIXME 13: GraphicsExposure
|
100
|
+
when 14 then return Form::NoExposure.from_packet(io)
|
101
|
+
# FIXME: 15: VisibilityNotify
|
102
|
+
when 16 then return Form::CreateNotify.from_packet(io)
|
103
|
+
when 17 then return Form::DestroyNotify.from_packet(io)
|
104
|
+
when 18 then return Form::UnmapNotify.from_packet(io)
|
105
|
+
when 19 then return Form::MapNotify.from_packet(io)
|
106
|
+
when 20 then return Form::MapRequest.from_packet(io)
|
107
|
+
when 21 then return Form::ReparentNotify.from_packet(io)
|
108
|
+
when 22 then return Form::ConfigureNotify.from_packet(io)
|
109
|
+
when 23 then return Form::ConfigureRequest.from_packet(io)
|
110
|
+
# FIXME: 24: GravityNotify
|
111
|
+
# FIXME: 25: ResizeRequest
|
112
|
+
# FIXME: 26: CirculateNotify
|
113
|
+
# FIXME: 27: CirculateRequest
|
114
|
+
when 28 then return Form::PropertyNotify.from_packet(io)
|
115
|
+
# FIXME: 29: SelectionClear
|
116
|
+
# FIXME: 30: SelectionRequest
|
117
|
+
# FIXME: 31: SelectionNotify
|
118
|
+
# FIXME: 32: ColormapNotify
|
119
|
+
when 33 then return Form::ClientMessage.from_packet(StringIO.new(data))
|
120
|
+
# FIXME: 34: MappingNotify
|
102
121
|
else
|
103
122
|
STDERR.puts "FIXME: Event: #{type}"
|
104
123
|
STDERR.puts "EVENT: #{data.inspect}"
|
124
|
+
data
|
105
125
|
end
|
106
126
|
end
|
107
127
|
|
@@ -122,19 +142,28 @@ module X11
|
|
122
142
|
data = read_full_packet(32)
|
123
143
|
return nil if data.nil?
|
124
144
|
|
125
|
-
|
145
|
+
# FIXME: What is bit 8 for? Synthentic?
|
146
|
+
type = data.unpack("C").first & 0x7f
|
126
147
|
case type
|
127
|
-
when 0
|
128
|
-
|
129
|
-
when
|
130
|
-
read_reply(data)
|
131
|
-
when 2..34
|
132
|
-
read_event(type, data, nil)
|
148
|
+
when 0 then read_error(data)
|
149
|
+
when 1 then read_reply(data)
|
150
|
+
when 2..34 then read_event(type, data, nil)
|
133
151
|
else
|
134
|
-
raise ProtocolError, "Unsupported reply type: #{type}"
|
152
|
+
raise ProtocolError, "Unsupported reply type: #{type} #{data.inspect}"
|
135
153
|
end
|
136
154
|
end
|
137
155
|
|
156
|
+
def write_raw_packet(pkt)
|
157
|
+
@requestseq += 1
|
158
|
+
@socket.write(pkt)
|
159
|
+
end
|
160
|
+
|
161
|
+
def write_packet(*args)
|
162
|
+
pkt = args.join
|
163
|
+
pkt[2..3] = u16(pkt.length/4)
|
164
|
+
write_raw_packet(pkt)
|
165
|
+
end
|
166
|
+
|
138
167
|
def write_request ob
|
139
168
|
#p data
|
140
169
|
#p [:write_request, @requestseq, ob.class]
|
@@ -142,14 +171,16 @@ module X11
|
|
142
171
|
#p [:AddGlyph,data] if ob.is_a?(X11::Form::XRenderAddGlyphs)
|
143
172
|
#p [ob.request_length.to_i*4, data.size]
|
144
173
|
raise "BAD LENGTH for #{ob.inspect} (#{ob.request_length.to_i*4} ! #{data.size} " if ob.request_length && ob.request_length.to_i*4 != data.size
|
145
|
-
|
146
|
-
@socket.write(data)
|
174
|
+
write_raw_packet(data)
|
147
175
|
end
|
148
176
|
|
149
177
|
def write_sync(data, reply=nil)
|
178
|
+
seq = @requestseq
|
150
179
|
write_request(data)
|
151
|
-
pkt = next_reply
|
180
|
+
pkt = next_reply(seq)
|
152
181
|
return nil if !pkt
|
182
|
+
return pkt if pkt.is_a?(X11::Form::Error)
|
183
|
+
pp reply
|
153
184
|
reply ? reply.from_packet(StringIO.new(pkt)) : pkt
|
154
185
|
end
|
155
186
|
|
@@ -161,17 +192,19 @@ module X11
|
|
161
192
|
@queue.shift || read_packet
|
162
193
|
end
|
163
194
|
|
164
|
-
def next_reply
|
195
|
+
def next_reply(errseq)
|
165
196
|
# FIXME: This is totally broken
|
166
197
|
while pkt = read_packet
|
167
198
|
if pkt.is_a?(String)
|
168
199
|
return pkt
|
200
|
+
elsif pkt.is_a?(X11::Form::Error) && pkt.sequence_number == errseq
|
201
|
+
return pkt
|
169
202
|
else
|
170
203
|
@queue.push(pkt)
|
171
204
|
end
|
172
205
|
end
|
173
206
|
end
|
174
|
-
|
207
|
+
|
175
208
|
def run
|
176
209
|
loop do
|
177
210
|
pkt = read_packet
|
@@ -193,12 +226,10 @@ module X11
|
|
193
226
|
wid = new_id
|
194
227
|
parent ||= screens.first.root
|
195
228
|
|
196
|
-
|
197
229
|
if visual.nil?
|
198
230
|
visual = find_visual(0, depth).visual_id
|
199
231
|
end
|
200
232
|
|
201
|
-
|
202
233
|
values[X11::Form::CWColorMap] ||= create_colormap(0, parent, visual)
|
203
234
|
|
204
235
|
values = values.sort_by{_1[0]}
|
@@ -212,6 +243,10 @@ module X11
|
|
212
243
|
return wid
|
213
244
|
end
|
214
245
|
|
246
|
+
def get_window_attributes(wid)
|
247
|
+
write_sync( Form::GetWindowAttributes.new(wid), Form::WindowAttributes )
|
248
|
+
end
|
249
|
+
|
215
250
|
def change_window_attributes(wid,
|
216
251
|
values: {})
|
217
252
|
values = values.sort_by{_1[0]}
|
@@ -222,7 +257,10 @@ module X11
|
|
222
257
|
)
|
223
258
|
end
|
224
259
|
|
260
|
+
def select_input(w, events) = change_window_attributes(w, values: {Form::CWEventMask => events})
|
261
|
+
|
225
262
|
def atom(name)
|
263
|
+
name = name.to_sym
|
226
264
|
intern_atom(false, name) if !@atoms[name]
|
227
265
|
@atoms[name]
|
228
266
|
end
|
@@ -251,13 +289,13 @@ module X11
|
|
251
289
|
end
|
252
290
|
end
|
253
291
|
|
254
|
-
def
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
def get_geometry(drawable)
|
259
|
-
write_sync(X11::Form::GetGeometry.new(drawable), X11::Form::Geometry)
|
292
|
+
def get_atom_name(atom)
|
293
|
+
reply = write_sync(X11::Form::GetAtomName.new(atom), X11::Form::AtomName)
|
294
|
+
reply&.name
|
260
295
|
end
|
296
|
+
|
297
|
+
def destroy_window(window) = write_request(X11::Form::DestroyWindow.new(window))
|
298
|
+
def get_geometry(drawable) = write_sync(X11::Form::GetGeometry.new(drawable), X11::Form::Geometry)
|
261
299
|
|
262
300
|
def get_keyboard_mapping(min_keycode=display_info.min_keycode, count= display_info.max_keycode - min_keycode)
|
263
301
|
write_sync(X11::Form::GetKeyboardMapping.new(min_keycode, count), X11::Form::GetKeyboardMappingReply)
|
@@ -269,8 +307,35 @@ module X11
|
|
269
307
|
mid
|
270
308
|
end
|
271
309
|
|
272
|
-
def
|
273
|
-
|
310
|
+
def get_property(window, property, type, offset: 0, length: 4, delete: false)
|
311
|
+
property = atom(property) if !property.is_a?(Integer)
|
312
|
+
type = atom_enum(type)
|
313
|
+
|
314
|
+
result = write_sync(X11::Form::GetProperty.new(
|
315
|
+
delete, window, property, type, offset, length
|
316
|
+
), X11::Form::Property)
|
317
|
+
|
318
|
+
if result && result.format != 0
|
319
|
+
case result.format
|
320
|
+
when 16
|
321
|
+
result.value = result.value.unpack("v")
|
322
|
+
result.value = result.value.first if length == 2
|
323
|
+
when 32
|
324
|
+
result.value = result.value.unpack("V")
|
325
|
+
result.value = result.value.first if length == 4
|
326
|
+
end
|
327
|
+
elsif result
|
328
|
+
result.value = nil
|
329
|
+
end
|
330
|
+
result
|
331
|
+
end
|
332
|
+
|
333
|
+
def change_property(mode, window, property, type, format, data)
|
334
|
+
property = atom(property.to_sym) if property.is_a?(Symbol) || property.is_a?(String)
|
335
|
+
|
336
|
+
mode = open_enum(mode, {replace: 0, prepend: 1, append: 2})
|
337
|
+
type = atom_enum(type)
|
338
|
+
write_request(X11::Form::ChangeProperty.new(mode, window, property, type, format, data))
|
274
339
|
end
|
275
340
|
|
276
341
|
def list_fonts(*args)
|
@@ -278,25 +343,46 @@ module X11
|
|
278
343
|
X11::Form::ListFontsReply)
|
279
344
|
end
|
280
345
|
|
281
|
-
def open_font(*args)
|
282
|
-
|
346
|
+
def open_font(*args) = write_request(X11::Form::OpenFont.new(*args))
|
347
|
+
def change_gc(*args) = write_request(X11::Form::ChangeGC.new(*args))
|
348
|
+
def change_save_set(...)= write_request(X11::Form::ChangeSaveSet.new(...))
|
349
|
+
def reparent_window(window, parent, x, y, save: true)
|
350
|
+
# You so almost always want this that it should've been a single request
|
351
|
+
change_save_set(0, window) if save
|
352
|
+
write_request(X11::Form::ReparentWindow.new(window, parent, x,y))
|
283
353
|
end
|
354
|
+
|
355
|
+
def map_window(*args) = write_request(X11::Form::MapWindow.new(*args))
|
356
|
+
def unmap_window(*args) = write_request(X11::Form::UnmapWindow.new(*args))
|
284
357
|
|
285
|
-
def
|
286
|
-
|
358
|
+
def u8(*args) = args.pack("c*")
|
359
|
+
def u16(*args) = args.pack("v*")
|
360
|
+
def u32(*args) = args.pack("V*")
|
361
|
+
def atom_enum(val) = open_enum(val, {cardinal: Form::CardinalAtom, atom: Form::AtomAtom, window: Form::WindowAtom})
|
362
|
+
def window(*args)
|
363
|
+
args.each {|a| raise "Window expected" if a.nil? }
|
364
|
+
u32(*args)
|
287
365
|
end
|
288
366
|
|
289
|
-
def
|
290
|
-
|
367
|
+
def open_enum(val, map) = (map[val].nil? ? val : map[val])
|
368
|
+
|
369
|
+
def set_input_focus(revert_to, focus, time=:now)
|
370
|
+
# FIXME: This is an experiment.
|
371
|
+
# Upside: Simpler. Downside: Doesn't work server-side.
|
372
|
+
#
|
373
|
+
revert_to = open_enum(revert_to, {none: 0, pointer_root: 1, parent: 2})
|
374
|
+
focus = open_enum(focus, {none: 0, pointer_root: 1 })
|
375
|
+
time = open_enum(time, {current_time: 0, now: 0})
|
376
|
+
write_packet(u8(42,revert_to), u16(3), window(focus), u32(time))
|
291
377
|
end
|
292
|
-
|
378
|
+
|
293
379
|
def grab_key(owner_events, grab_window, modifiers, keycode, pointer_mode, keyboard_mode)
|
294
380
|
write_request(X11::Form::GrabKey.new(
|
295
381
|
owner_events,
|
296
382
|
grab_window,
|
297
383
|
modifiers,
|
298
384
|
keycode,
|
299
|
-
pointer_mode
|
385
|
+
pointer_mode == :async ? 1 : 0,
|
300
386
|
keyboard_mode == :async ? 1 : 0
|
301
387
|
))
|
302
388
|
end
|
@@ -354,7 +440,7 @@ module X11
|
|
354
440
|
when :below then 1
|
355
441
|
when :top_if then 2
|
356
442
|
when :bottom_if then 3
|
357
|
-
when
|
443
|
+
when :opposite then 4
|
358
444
|
else raise "Unknown stack_mode #{stack_mode.inspect}"
|
359
445
|
end
|
360
446
|
end
|
@@ -384,29 +470,12 @@ module X11
|
|
384
470
|
gc
|
385
471
|
end
|
386
472
|
|
387
|
-
def put_image(*args)
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
def
|
392
|
-
|
393
|
-
end
|
394
|
-
|
395
|
-
def copy_area(*args)
|
396
|
-
write_request(X11::Form::CopyArea.new(*args))
|
397
|
-
end
|
398
|
-
|
399
|
-
def image_text8(*args)
|
400
|
-
write_request(X11::Form::ImageText8.new(*args))
|
401
|
-
end
|
402
|
-
|
403
|
-
def image_text16(*args)
|
404
|
-
write_request(X11::Form::ImageText16.new(*args))
|
405
|
-
end
|
406
|
-
|
407
|
-
def poly_fill_rectangle(*args)
|
408
|
-
write_request(X11::Form::PolyFillRectangle.new(*args))
|
409
|
-
end
|
473
|
+
def put_image(*args) = write_request(X11::Form::PutImage.new(*args))
|
474
|
+
def clear_area(*args) = write_request(X11::Form::ClearArea.new(*args))
|
475
|
+
def copy_area(*args) = write_request(X11::Form::CopyArea.new(*args))
|
476
|
+
def image_text8(*args) = write_request(X11::Form::ImageText8.new(*args))
|
477
|
+
def image_text16(*args)= write_request(X11::Form::ImageText16.new(*args))
|
478
|
+
def poly_fill_rectangle(*args) = write_request(X11::Form::PolyFillRectangle.new(*args))
|
410
479
|
|
411
480
|
def create_pixmap(depth, drawable, w,h)
|
412
481
|
pid = new_id
|
data/lib/X11/form.rb
CHANGED
@@ -81,14 +81,14 @@ module X11
|
|
81
81
|
when :unused
|
82
82
|
sz = s.size.respond_to?(:call) ? s.size.call(self) : s.size
|
83
83
|
"\x00" * sz
|
84
|
-
when :length
|
84
|
+
when :length, :format_length
|
85
85
|
#p [s,value]
|
86
86
|
#p [value.size]
|
87
87
|
s.type_klass.pack(value.size)
|
88
88
|
when :string
|
89
89
|
s.type_klass.pack(value)
|
90
90
|
when :list
|
91
|
-
value.collect do |obj|
|
91
|
+
Array(value).collect do |obj|
|
92
92
|
if obj.is_a?(BaseForm)
|
93
93
|
obj.to_packet
|
94
94
|
else
|
@@ -127,8 +127,17 @@ module X11
|
|
127
127
|
when :length
|
128
128
|
size = s.type_klass.unpack( socket.read(s.type_klass.size) )
|
129
129
|
lengths[s.name] = size
|
130
|
+
when :format_length
|
131
|
+
size = s.type_klass.unpack( socket.read(s.type_klass.size) )
|
132
|
+
lengths[s.name] = case form.format
|
133
|
+
when 8 then size
|
134
|
+
when 16 then size*2
|
135
|
+
when 32 then size*4
|
136
|
+
else 0
|
137
|
+
end
|
130
138
|
when :string
|
131
|
-
|
139
|
+
len = lengths[s.name]
|
140
|
+
val = s.type_klass.unpack(socket, len)
|
132
141
|
form.instance_variable_set("@#{s.name}", val)
|
133
142
|
when :list
|
134
143
|
len = lengths[s.name]
|
@@ -177,12 +186,14 @@ module X11
|
|
177
186
|
end
|
178
187
|
|
179
188
|
def fields
|
180
|
-
super+Array(@structs).dup.delete_if{|s| s.type == :unused or s.type == :length }
|
189
|
+
super+Array(@structs).dup.delete_if{|s| s.type == :unused or s.type == :length or s.type == :format_length}
|
181
190
|
end
|
182
191
|
end
|
183
192
|
end
|
184
193
|
|
194
|
+
AtomAtom=4
|
185
195
|
CardinalAtom=6
|
196
|
+
WindowAtom=33
|
186
197
|
|
187
198
|
##
|
188
199
|
## X11 Packet Defintions
|
@@ -247,9 +258,9 @@ module X11
|
|
247
258
|
end
|
248
259
|
|
249
260
|
class DisplayInfo < BaseForm
|
250
|
-
field :release_number,
|
251
|
-
field :resource_id_base,
|
252
|
-
field :resource_id_mask,
|
261
|
+
field :release_number, Uint32
|
262
|
+
field :resource_id_base, Uint32
|
263
|
+
field :resource_id_mask, Uint32
|
253
264
|
field :motion_buffer_size, Uint32
|
254
265
|
field :vendor, Uint16, :length
|
255
266
|
field :maximum_request_length, Uint16
|
@@ -258,11 +269,11 @@ module X11
|
|
258
269
|
field :image_byte_order, Signifigance
|
259
270
|
field :bitmap_bit_order, Signifigance
|
260
271
|
field :bitmap_format_scanline_unit, Uint8
|
261
|
-
field :bitmap_format_scanline_pad,
|
272
|
+
field :bitmap_format_scanline_pad, Uint8
|
262
273
|
field :min_keycode, KeyCode
|
263
274
|
field :max_keycode, KeyCode
|
264
275
|
unused 4
|
265
|
-
field :vendor,
|
276
|
+
field :vendor, String8, :string
|
266
277
|
field :formats, FormatInfo, :list
|
267
278
|
field :screens, ScreenInfo, :list
|
268
279
|
end
|
@@ -287,13 +298,13 @@ module X11
|
|
287
298
|
# XRender structures
|
288
299
|
|
289
300
|
class DirectFormat < BaseForm
|
290
|
-
field :red,
|
291
|
-
field :red_mask,
|
292
|
-
field :green,
|
301
|
+
field :red, Uint16
|
302
|
+
field :red_mask, Uint16
|
303
|
+
field :green, Uint16
|
293
304
|
field :green_mask, Uint16
|
294
|
-
field :blue,
|
295
|
-
field :blue_mask,
|
296
|
-
field :alpha,
|
305
|
+
field :blue, Uint16
|
306
|
+
field :blue_mask, Uint16
|
307
|
+
field :alpha, Uint16
|
297
308
|
field :alpha_mask, Uint16
|
298
309
|
end
|
299
310
|
|
@@ -328,8 +339,8 @@ module X11
|
|
328
339
|
# Requests
|
329
340
|
|
330
341
|
CopyFromParent = 0
|
331
|
-
InputOutput
|
332
|
-
InputOnly
|
342
|
+
InputOutput = 1
|
343
|
+
InputOnly = 2
|
333
344
|
|
334
345
|
CWBackPixmap = 0x0001
|
335
346
|
CWBackPixel = 0x0002
|
@@ -337,23 +348,29 @@ module X11
|
|
337
348
|
CWBorderPixel = 0x0008
|
338
349
|
CWBitGravity = 0x0010
|
339
350
|
CWWinGravity = 0x0020
|
340
|
-
CWBackingStore= 0x0040
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
351
|
+
CWBackingStore = 0x0040
|
352
|
+
CWBackingPlanes = 0x0080
|
353
|
+
CWBackingPixel = 0x0100
|
354
|
+
CWOverrideRedirect = 0x0200
|
355
|
+
CWSaveUnder = 0x0400
|
356
|
+
CWEventMask = 0x0800
|
357
|
+
CWColorMap = 0x2000
|
358
|
+
|
359
|
+
KeyPressMask = 0x000001
|
360
|
+
KeyReleaseMask = 0x000002
|
361
|
+
ButtonPressMask = 0x000004
|
362
|
+
ButtonReleaseMask = 0x000008
|
363
|
+
EnterWindowMask = 0x000010
|
364
|
+
LeaveWindowMask = 0x000020
|
365
|
+
PointerMotionMask = 0x000040
|
366
|
+
PointerMotionHintMask = 0x000080
|
367
|
+
Button1MotionMask = 0x000100
|
368
|
+
ExposureMask = 0x008000
|
369
|
+
StructureNotifyMask = 0x020000
|
370
|
+
SubstructureNotifyMask = 0x080000
|
371
|
+
SubstructureRedirectMask=0x100000
|
372
|
+
FocusChangeMask = 0x200000
|
373
|
+
PropertyChangeMask = 0x400000
|
357
374
|
|
358
375
|
class CreateWindow < BaseForm
|
359
376
|
field :opcode, Uint8, value: 1
|
@@ -394,14 +411,14 @@ module X11
|
|
394
411
|
field :sequence_number, Uint16
|
395
412
|
field :reply_length, Uint32
|
396
413
|
field :visual, VisualID
|
397
|
-
field :
|
414
|
+
field :wclass, Uint16
|
398
415
|
field :bit_gravity, Uint8
|
399
416
|
field :win_gravity, Uint8
|
400
417
|
field :backing_planes, Uint32
|
401
418
|
field :backing_pixel, Uint32
|
402
419
|
field :save_under, Bool
|
403
420
|
field :map_is_installed, Bool
|
404
|
-
field :map_state,
|
421
|
+
field :map_state, Uint8
|
405
422
|
field :override_redirect, Bool
|
406
423
|
field :colormap, Colormap
|
407
424
|
field :all_event_masks, Uint32
|
@@ -417,6 +434,23 @@ module X11
|
|
417
434
|
field :window, Window
|
418
435
|
end
|
419
436
|
|
437
|
+
class ChangeSaveSet < BaseForm
|
438
|
+
field :opcode, Uint8, value: 6
|
439
|
+
field :mode, Uint8
|
440
|
+
field :request_length, Uint16, value: 2
|
441
|
+
field :window, Window
|
442
|
+
end
|
443
|
+
|
444
|
+
class ReparentWindow < BaseForm
|
445
|
+
field :opcode, Uint8, value: 7
|
446
|
+
unused 1
|
447
|
+
field :request_length, Uint16, value: 4
|
448
|
+
field :window, Window
|
449
|
+
field :parent, Window
|
450
|
+
field :x, Int16
|
451
|
+
field :y, Int16
|
452
|
+
end
|
453
|
+
|
420
454
|
class MapWindow < BaseForm
|
421
455
|
field :opcode, Uint8, value: 8
|
422
456
|
unused 1
|
@@ -424,6 +458,13 @@ module X11
|
|
424
458
|
field :window, Window
|
425
459
|
end
|
426
460
|
|
461
|
+
class UnmapWindow < BaseForm
|
462
|
+
field :opcode, Uint8, value: 10
|
463
|
+
unused 1
|
464
|
+
field :request_length, Uint16, value: 2
|
465
|
+
field :window, Window
|
466
|
+
end
|
467
|
+
|
427
468
|
class ConfigureWindow < BaseForm
|
428
469
|
field :opcode, Uint8, value: 12
|
429
470
|
unused 1
|
@@ -455,6 +496,25 @@ module X11
|
|
455
496
|
unused 10
|
456
497
|
end
|
457
498
|
|
499
|
+
class QueryTree < BaseForm
|
500
|
+
field :opcode, Uint8, value: 15
|
501
|
+
unused 1
|
502
|
+
field :request_length, Uint16, value: 2
|
503
|
+
field :window, Window
|
504
|
+
end
|
505
|
+
|
506
|
+
class QueryTreeReply < BaseForm
|
507
|
+
field :reply, Uint8, value: 1
|
508
|
+
unused 1
|
509
|
+
field :sequence_number, Uint16
|
510
|
+
field :reply_length, Uint32
|
511
|
+
field :root, Window
|
512
|
+
field :parent, Window
|
513
|
+
field :children, Uint16, :length
|
514
|
+
unused 14
|
515
|
+
field :children, Window, :list
|
516
|
+
end
|
517
|
+
|
458
518
|
class InternAtom < BaseForm
|
459
519
|
field :opcode, Uint8, value: 16
|
460
520
|
field :only_if_exists, Bool
|
@@ -480,6 +540,22 @@ module X11
|
|
480
540
|
unused 20
|
481
541
|
end
|
482
542
|
|
543
|
+
class GetAtomName < BaseForm
|
544
|
+
field :opcode, Uint8, value: 17
|
545
|
+
unused 1
|
546
|
+
field :request_length, Uint16, value: 2
|
547
|
+
field :atom, Atom
|
548
|
+
end
|
549
|
+
|
550
|
+
class AtomName < Reply
|
551
|
+
unused 1
|
552
|
+
field :sequence_number, Uint16
|
553
|
+
field :reply_length, Uint32
|
554
|
+
field :name, Uint16, :length
|
555
|
+
unused 22
|
556
|
+
field :name, String8, :string
|
557
|
+
end
|
558
|
+
|
483
559
|
Replace = 0
|
484
560
|
Prepend = 1
|
485
561
|
Append = 2
|
@@ -496,12 +572,33 @@ module X11
|
|
496
572
|
field :type, Atom
|
497
573
|
field :format, Uint8
|
498
574
|
unused 3
|
499
|
-
field :data, Uint32, value: ->(cp) {
|
500
|
-
cp.data.length / 4
|
501
|
-
}
|
575
|
+
field :data, Uint32, value: ->(cp) { cp.data.length / (cp.format/8) }
|
502
576
|
field :data, Uint8, :list
|
503
577
|
end
|
504
578
|
|
579
|
+
class GetProperty < BaseForm
|
580
|
+
field :opcode, Uint8, value: 20
|
581
|
+
field :delete, Bool
|
582
|
+
field :request_length, Uint16, value: 6
|
583
|
+
field :window, Window
|
584
|
+
field :property, Atom
|
585
|
+
field :type, Atom
|
586
|
+
field :long_offset, Uint32
|
587
|
+
field :long_length, Uint32
|
588
|
+
end
|
589
|
+
|
590
|
+
class Property < BaseForm
|
591
|
+
field :reply, Uint8, value: 1
|
592
|
+
field :format, Uint8
|
593
|
+
field :sequence_number, Uint16
|
594
|
+
field :reply_length, Uint32
|
595
|
+
field :type, Atom
|
596
|
+
field :bytes_after, Uint32
|
597
|
+
field :value, Uint32, :format_length
|
598
|
+
unused 12
|
599
|
+
field :value, String8, :string
|
600
|
+
end
|
601
|
+
|
505
602
|
class GrabButton < BaseForm
|
506
603
|
field :opcode, Uint8, value: 28
|
507
604
|
field :owner_events, Bool
|
@@ -528,6 +625,18 @@ module X11
|
|
528
625
|
field :keyboard_mode, Uint8
|
529
626
|
unused 3
|
530
627
|
end
|
628
|
+
|
629
|
+
class OpenFont < BaseForm
|
630
|
+
field :opcode, Uint8, value: 45
|
631
|
+
unused 1
|
632
|
+
field :request_length, Uint16, value: ->(of) {
|
633
|
+
3+(of.name.length+3)/4
|
634
|
+
}
|
635
|
+
field :fid, Font
|
636
|
+
field :name, Uint16, :length
|
637
|
+
unused 2
|
638
|
+
field :name, String8, :string
|
639
|
+
end
|
531
640
|
|
532
641
|
class ListFonts < BaseForm
|
533
642
|
field :opcode, Uint8, value: 49
|
@@ -618,11 +727,11 @@ module X11
|
|
618
727
|
field :src_drawable, Drawable
|
619
728
|
field :dst_drawable, Drawable
|
620
729
|
field :gc, Gcontext
|
621
|
-
field :src_x,
|
622
|
-
field :src_y,
|
623
|
-
field :dst_x,
|
624
|
-
field :dst_y,
|
625
|
-
field :width,
|
730
|
+
field :src_x, Uint16
|
731
|
+
field :src_y, Uint16
|
732
|
+
field :dst_x, Uint16
|
733
|
+
field :dst_y, Uint16
|
734
|
+
field :width, Uint16
|
626
735
|
field :height, Uint16
|
627
736
|
end
|
628
737
|
|
@@ -754,7 +863,7 @@ module X11
|
|
754
863
|
field :sequence_number, Uint16
|
755
864
|
end
|
756
865
|
|
757
|
-
class
|
866
|
+
class InputEvent < SimpleEvent
|
758
867
|
field :time, Uint32
|
759
868
|
field :root, Window
|
760
869
|
field :event, Window
|
@@ -764,6 +873,32 @@ module X11
|
|
764
873
|
field :event_x, Int16
|
765
874
|
field :event_y, Int16
|
766
875
|
field :state, Uint16
|
876
|
+
end
|
877
|
+
|
878
|
+
class EnterLeaveNotify < InputEvent
|
879
|
+
field :mode, Uint8
|
880
|
+
field :same_screen_or_focus, Uint8
|
881
|
+
|
882
|
+
def same_screen = same_screen_or_focus.anybit?(0x02)
|
883
|
+
def focus = same_screen_or_focus.anybit?(0x01)
|
884
|
+
end
|
885
|
+
|
886
|
+
class EnterNotify < EnterLeaveNotify
|
887
|
+
end
|
888
|
+
|
889
|
+
class LeaveNotify < EnterLeaveNotify
|
890
|
+
end
|
891
|
+
|
892
|
+
class FocusIn < SimpleEvent
|
893
|
+
field :event, Window
|
894
|
+
field :mode, Uint8
|
895
|
+
unused 23
|
896
|
+
end
|
897
|
+
|
898
|
+
class FocusOut < FocusIn
|
899
|
+
end
|
900
|
+
|
901
|
+
class PressEvent < InputEvent
|
767
902
|
field :same_screen, Bool
|
768
903
|
unused 1
|
769
904
|
end
|
@@ -782,6 +917,31 @@ module X11
|
|
782
917
|
|
783
918
|
class ButtonRelease < PressEvent
|
784
919
|
end
|
920
|
+
|
921
|
+
class ReparentNotify < SimpleEvent
|
922
|
+
field :event, Window
|
923
|
+
field :window, Window
|
924
|
+
field :parent, Window
|
925
|
+
field :x, Int16
|
926
|
+
field :y, Int16
|
927
|
+
field :override_redirect, Bool
|
928
|
+
unused 11
|
929
|
+
end
|
930
|
+
|
931
|
+
class ConfigureRequest < Event # 23
|
932
|
+
field :stack_mode, Uint8
|
933
|
+
field :sequence_number, Uint16
|
934
|
+
field :parent, Window
|
935
|
+
field :window, Window
|
936
|
+
field :sibling, Window
|
937
|
+
field :x, Int16
|
938
|
+
field :y, Int16
|
939
|
+
field :width, Uint16
|
940
|
+
field :height, Uint16
|
941
|
+
field :border_width, Uint16
|
942
|
+
field :value_mask, Uint16
|
943
|
+
unused 4
|
944
|
+
end
|
785
945
|
|
786
946
|
class Expose < SimpleEvent
|
787
947
|
field :window, Window
|
@@ -800,14 +960,51 @@ module X11
|
|
800
960
|
unused 21
|
801
961
|
end
|
802
962
|
|
963
|
+
class CreateNotify < SimpleEvent # 16
|
964
|
+
field :parent, Window
|
965
|
+
field :window, Window
|
966
|
+
field :x, Int16
|
967
|
+
field :y, Int16
|
968
|
+
field :width, Uint16
|
969
|
+
field :height, Uint16
|
970
|
+
field :border_width, Uint16
|
971
|
+
field :override_redirect, Bool
|
972
|
+
end
|
973
|
+
|
974
|
+
class DestroyNotify < Event
|
975
|
+
unused 1
|
976
|
+
field :sequence_number, Uint16
|
977
|
+
field :event, Window
|
978
|
+
field :window, Window
|
979
|
+
unused 20
|
980
|
+
end
|
981
|
+
|
982
|
+
class UnmapNotify < Event
|
983
|
+
unused 1
|
984
|
+
field :sequence_number, Uint16
|
985
|
+
field :event, Window
|
986
|
+
field :window, Window
|
987
|
+
field :from_configure, Bool
|
988
|
+
unused 19
|
989
|
+
end
|
990
|
+
|
803
991
|
class MapNotify < Event
|
804
992
|
unused 1
|
805
993
|
field :sequence_number, Uint16
|
806
994
|
field :event, Window
|
995
|
+
field :window, Window
|
807
996
|
field :override_redirect, Bool
|
808
997
|
unused 19
|
809
998
|
end
|
810
999
|
|
1000
|
+
class MapRequest < Event
|
1001
|
+
unused 1
|
1002
|
+
field :sequence_number, Uint16
|
1003
|
+
field :parent, Window
|
1004
|
+
field :window, Window
|
1005
|
+
unused 20
|
1006
|
+
end
|
1007
|
+
|
811
1008
|
class ConfigureNotify < Event
|
812
1009
|
unused 1
|
813
1010
|
field :sequence_number, Uint16
|
@@ -822,6 +1019,24 @@ module X11
|
|
822
1019
|
unused 5
|
823
1020
|
end
|
824
1021
|
|
1022
|
+
class ClientMessage < Event
|
1023
|
+
field :format, Uint8
|
1024
|
+
field :sequence_number, Uint16
|
1025
|
+
field :window, Window
|
1026
|
+
field :type, Atom
|
1027
|
+
field :data, X11::Type::Message
|
1028
|
+
end
|
1029
|
+
|
1030
|
+
class PropertyNotify < Event # 28
|
1031
|
+
unused 1
|
1032
|
+
field :sequence_number, Uint16
|
1033
|
+
field :window, Window
|
1034
|
+
field :atom, Atom
|
1035
|
+
field :time, Uint32
|
1036
|
+
field :state, Uint8
|
1037
|
+
unused 15
|
1038
|
+
end
|
1039
|
+
|
825
1040
|
|
826
1041
|
# XRender extension
|
827
1042
|
# From https://cgit.freedesktop.org/xorg/proto/renderproto/tree/renderproto.h
|
data/lib/X11/type.rb
CHANGED
@@ -36,16 +36,23 @@ module X11
|
|
36
36
|
define "Uint8", "C", 1
|
37
37
|
define "Uint16", "S", 2
|
38
38
|
define "Uint32", "L", 4
|
39
|
+
|
40
|
+
define "Message", "c*", 20
|
41
|
+
|
42
|
+
class Message
|
43
|
+
def self.pack(x) = x.b
|
44
|
+
def self.unpack(x) = x.b
|
45
|
+
def self.size = 20
|
46
|
+
def self.from_packet(sock) = sock.read(2).b
|
47
|
+
end
|
39
48
|
|
40
49
|
class String8
|
41
50
|
def self.pack(x)
|
42
51
|
x.force_encoding("ASCII-8BIT") + "\x00"*(-x.length & 3)
|
43
52
|
end
|
44
53
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
54
|
def self.unpack(socket, size)
|
55
|
+
raise "Expected size for String8" if size.nil?
|
49
56
|
val = socket.read(size)
|
50
57
|
unused_padding = (4 - (size % 4)) % 4
|
51
58
|
socket.read(unused_padding)
|
data/lib/X11/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pure-x11
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vidar Hokstad
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-
|
12
|
+
date: 2023-12-16 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Pure Ruby X11 bindings
|
15
15
|
email:
|