pure-x11 0.0.5 → 0.0.6
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.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/Gemfile.lock +1 -1
- data/example/test.rb +3 -3
- data/lib/X11/display.rb +59 -94
- data/lib/X11/form.rb +0 -7
- data/lib/X11/type.rb +35 -53
- 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: 927c52f35913e7d8bc466563bb5d238919c4a43d6a9f9fb1be8a6df4735cc5fb
|
4
|
+
data.tar.gz: 3b92ed556881c32486ed189c9de27fdd373988379118fefdbd6f40ff6268c0e7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 580ab719f597acaecfa467389f26526dc50c1d25cacb14dbda9d63f61e3cb63f3665fd010408fc093501893a229a4b6a6f314734f6cf35786c58d965d0ec51cd
|
7
|
+
data.tar.gz: 211b56d642b773c29769e9620c746a657596b6314e1d5a89487ace79bf29c6f01f4675ec2456a8668b8723912b2c81f2c95309dcdaf9eac459682150b884f726
|
data/Gemfile.lock
CHANGED
data/example/test.rb
CHANGED
@@ -143,7 +143,7 @@ def render_glyph(display, wid, x,y, ch)
|
|
143
143
|
#p img
|
144
144
|
# p ch
|
145
145
|
display.put_image(
|
146
|
-
|
146
|
+
:ZPixmap, wid, $gc2,
|
147
147
|
mtx.min_width,mtx.min_height,
|
148
148
|
x, y - mtx.y_offset, 0, depth, data
|
149
149
|
)
|
@@ -158,12 +158,12 @@ def render_str(display, wid, x,y, str)
|
|
158
158
|
end
|
159
159
|
|
160
160
|
def redraw(dpy, wid, gc)
|
161
|
-
dpy.poly_fill_rectangle(wid, gc, [
|
161
|
+
dpy.poly_fill_rectangle(wid, gc, [20,20, 60, 80])
|
162
162
|
dpy.clear_area(false, wid, 30, 30, 5, 5)
|
163
163
|
dpy.image_text16(wid, $gc2, 30, 70, "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ")
|
164
164
|
#"\u25f0\u25ef Hello World")
|
165
165
|
dpy.put_image(
|
166
|
-
|
166
|
+
:ZPixmap, wid, $gc2,
|
167
167
|
$png.width, $png.height, 80, 120, 0, 24, $data
|
168
168
|
)
|
169
169
|
render_str(dpy, wid, 30,90, 'HelloWorld')
|
data/lib/X11/display.rb
CHANGED
@@ -116,7 +116,7 @@ module X11
|
|
116
116
|
# FIXME: 30: SelectionRequest
|
117
117
|
# FIXME: 31: SelectionNotify
|
118
118
|
# FIXME: 32: ColormapNotify
|
119
|
-
when 33 then return Form::ClientMessage.from_packet(
|
119
|
+
when 33 then return Form::ClientMessage.from_packet(io)
|
120
120
|
# FIXME: 34: MappingNotify
|
121
121
|
else
|
122
122
|
STDERR.puts "FIXME: Event: #{type}"
|
@@ -165,11 +165,7 @@ module X11
|
|
165
165
|
end
|
166
166
|
|
167
167
|
def write_request ob
|
168
|
-
#p data
|
169
|
-
#p [:write_request, @requestseq, ob.class]
|
170
168
|
data = ob.to_packet if ob.respond_to?(:to_packet)
|
171
|
-
#p [:AddGlyph,data] if ob.is_a?(X11::Form::XRenderAddGlyphs)
|
172
|
-
#p [ob.request_length.to_i*4, data.size]
|
173
169
|
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
|
174
170
|
write_raw_packet(data)
|
175
171
|
end
|
@@ -252,24 +248,21 @@ module X11
|
|
252
248
|
values = values.sort_by{_1[0]}
|
253
249
|
mask = values.inject(0) {|acc,v| (acc | v[0]) }
|
254
250
|
values = values.map{_1[1]}
|
255
|
-
write_request(
|
256
|
-
X11::Form::ChangeWindowAttributes.new(wid, mask, values)
|
257
|
-
)
|
251
|
+
write_request(Form::ChangeWindowAttributes.new(wid, mask, values))
|
258
252
|
end
|
259
253
|
|
260
254
|
def select_input(w, events) = change_window_attributes(w, values: {Form::CWEventMask => events})
|
261
255
|
|
262
256
|
def atom(name)
|
257
|
+
return name if name.is_a?(Integer) # Allow atom(atom_integer_or_symbol)
|
263
258
|
name = name.to_sym
|
264
259
|
intern_atom(false, name) if !@atoms[name]
|
265
260
|
@atoms[name]
|
266
261
|
end
|
267
262
|
|
268
263
|
def query_extension(name)
|
269
|
-
r = write_sync(
|
270
|
-
@extensions[name] = {
|
271
|
-
major: r.major_opcode
|
272
|
-
}
|
264
|
+
r = write_sync(Form::QueryExtension.new(name), Form::QueryExtensionReply)
|
265
|
+
@extensions[name] = { major: r.major_opcode }
|
273
266
|
r
|
274
267
|
end
|
275
268
|
|
@@ -282,38 +275,33 @@ module X11
|
|
282
275
|
end
|
283
276
|
|
284
277
|
def intern_atom(flag, name)
|
285
|
-
reply = write_sync(
|
286
|
-
X11::Form::InternAtomReply)
|
278
|
+
reply = write_sync(Form::InternAtom.new(flag, name.to_s),Form::InternAtomReply)
|
287
279
|
if reply
|
288
280
|
@atoms[name.to_sym] = reply.atom
|
289
281
|
end
|
290
282
|
end
|
291
283
|
|
292
|
-
def get_atom_name(atom)
|
293
|
-
|
294
|
-
|
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)
|
284
|
+
def get_atom_name(atom) = write_sync(Form::GetAtomName.new(atom), Form::AtomName)&.name
|
285
|
+
def destroy_window(window) = write_request(Form::DestroyWindow.new(window))
|
286
|
+
def get_geometry(drawable) = write_sync(Form::GetGeometry.new(drawable), Form::Geometry)
|
299
287
|
|
300
288
|
def get_keyboard_mapping(min_keycode=display_info.min_keycode, count= display_info.max_keycode - min_keycode)
|
301
|
-
write_sync(
|
289
|
+
write_sync(Form::GetKeyboardMapping.new(min_keycode, count), Form::GetKeyboardMappingReply)
|
302
290
|
end
|
303
291
|
|
304
292
|
def create_colormap(alloc, window, visual)
|
305
293
|
mid = new_id
|
306
|
-
write_request(
|
294
|
+
write_request(Form::CreateColormap.new(alloc, mid, window, visual))
|
307
295
|
mid
|
308
296
|
end
|
309
297
|
|
310
298
|
def get_property(window, property, type, offset: 0, length: 4, delete: false)
|
311
|
-
property = atom(property)
|
299
|
+
property = atom(property)
|
312
300
|
type = atom_enum(type)
|
313
301
|
|
314
|
-
result = write_sync(
|
302
|
+
result = write_sync(Form::GetProperty.new(
|
315
303
|
delete, window, property, type, offset, length
|
316
|
-
),
|
304
|
+
), Form::Property)
|
317
305
|
|
318
306
|
if result && result.format != 0
|
319
307
|
case result.format
|
@@ -335,25 +323,22 @@ module X11
|
|
335
323
|
|
336
324
|
mode = open_enum(mode, {replace: 0, prepend: 1, append: 2})
|
337
325
|
type = atom_enum(type)
|
338
|
-
write_request(
|
326
|
+
write_request(Form::ChangeProperty.new(mode, window, property, type, format, data))
|
339
327
|
end
|
340
328
|
|
341
|
-
def list_fonts(
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
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(...))
|
329
|
+
def list_fonts(...) = write_sync(Form::ListFonts.new(...), Form::ListFontsReply)
|
330
|
+
def open_font(...) = write_request(Form::OpenFont.new(...))
|
331
|
+
def change_gc(...) = write_request(Form::ChangeGC.new(...))
|
332
|
+
def change_save_set(...)= write_request(Form::ChangeSaveSet.new(...))
|
333
|
+
|
349
334
|
def reparent_window(window, parent, x, y, save: true)
|
350
335
|
# You so almost always want this that it should've been a single request
|
351
336
|
change_save_set(0, window) if save
|
352
|
-
write_request(
|
337
|
+
write_request(Form::ReparentWindow.new(window, parent, x,y))
|
353
338
|
end
|
354
339
|
|
355
|
-
def map_window(
|
356
|
-
def unmap_window(
|
340
|
+
def map_window(...) = write_request(Form::MapWindow.new(...))
|
341
|
+
def unmap_window(...) = write_request(Form::UnmapWindow.new(...))
|
357
342
|
|
358
343
|
def u8(*args) = args.pack("c*")
|
359
344
|
def u16(*args) = args.pack("v*")
|
@@ -375,9 +360,9 @@ module X11
|
|
375
360
|
time = open_enum(time, {current_time: 0, now: 0})
|
376
361
|
write_packet(u8(42,revert_to), u16(3), window(focus), u32(time))
|
377
362
|
end
|
378
|
-
|
363
|
+
|
379
364
|
def grab_key(owner_events, grab_window, modifiers, keycode, pointer_mode, keyboard_mode)
|
380
|
-
write_request(
|
365
|
+
write_request(Form::GrabKey.new(
|
381
366
|
owner_events,
|
382
367
|
grab_window,
|
383
368
|
modifiers,
|
@@ -389,7 +374,7 @@ module X11
|
|
389
374
|
|
390
375
|
def grab_button(owner_events, grab_window, event_mask, pointer_mode,
|
391
376
|
keyboard_mode, confine_to, cursor, button, modifiers)
|
392
|
-
write_request(
|
377
|
+
write_request(Form::GrabButton.new(
|
393
378
|
owner_events, grab_window, event_mask,
|
394
379
|
pointer_mode == :async ? 1 : 0,
|
395
380
|
keyboard_mode == :async ? 1 : 0,
|
@@ -397,41 +382,27 @@ module X11
|
|
397
382
|
)
|
398
383
|
end
|
399
384
|
|
385
|
+
def set_value(values, mask, x)
|
386
|
+
if x
|
387
|
+
values << x
|
388
|
+
mask
|
389
|
+
else
|
390
|
+
0
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
400
394
|
def configure_window(window, x: nil, y: nil, width: nil, height: nil,
|
401
395
|
border_width: nil, sibling: nil, stack_mode: nil)
|
402
396
|
|
403
397
|
mask = 0
|
404
398
|
values = []
|
405
399
|
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
mask |= 0x002
|
413
|
-
values << y
|
414
|
-
end
|
415
|
-
|
416
|
-
if width
|
417
|
-
mask |= 0x004
|
418
|
-
values << width
|
419
|
-
end
|
420
|
-
|
421
|
-
if height
|
422
|
-
mask |= 0x008
|
423
|
-
values << height
|
424
|
-
end
|
425
|
-
|
426
|
-
if border_width
|
427
|
-
mask |= 0x010
|
428
|
-
values << border_width
|
429
|
-
end
|
430
|
-
|
431
|
-
if sibling
|
432
|
-
mask |= 0x020
|
433
|
-
values << sibling
|
434
|
-
end
|
400
|
+
mask |= set_value(values, 0x001, x)
|
401
|
+
mask |= set_value(values, 0x002, y)
|
402
|
+
mask |= set_value(values, 0x004, width)
|
403
|
+
mask |= set_value(values, 0x008, height)
|
404
|
+
mask |= set_value(values, 0x010, border_width)
|
405
|
+
mask |= set_value(values, 0x020, sibling)
|
435
406
|
|
436
407
|
if stack_mode
|
437
408
|
mask |= 0x040
|
@@ -455,15 +426,8 @@ module X11
|
|
455
426
|
# FIXME:
|
456
427
|
# The rest can be found here:
|
457
428
|
# https://tronche.com/gui/x/xlib/GC/manipulating.html#XGCValues
|
458
|
-
|
459
|
-
|
460
|
-
args << foreground
|
461
|
-
end
|
462
|
-
if background
|
463
|
-
mask |= 0x08
|
464
|
-
args << background
|
465
|
-
end
|
466
|
-
|
429
|
+
mask |= set_value(args, 0x04, foreground)
|
430
|
+
mask |= set_value(args, 0x08, background)
|
467
431
|
|
468
432
|
gc = new_id
|
469
433
|
write_request(X11::Form::CreateGC.new(gc, window, mask, args))
|
@@ -475,12 +439,13 @@ module X11
|
|
475
439
|
def copy_area(*args) = write_request(X11::Form::CopyArea.new(*args))
|
476
440
|
def image_text8(*args) = write_request(X11::Form::ImageText8.new(*args))
|
477
441
|
def image_text16(*args)= write_request(X11::Form::ImageText16.new(*args))
|
478
|
-
def poly_fill_rectangle(
|
442
|
+
def poly_fill_rectangle(wid, gc, *rects)
|
443
|
+
rects = rects.map{|r| r.is_a?(Array) ? Form::Rectangle.new(*r) : r}
|
444
|
+
write_request(X11::Form::PolyFillRectangle.new(wid, gc, rects))
|
445
|
+
end
|
479
446
|
|
480
447
|
def create_pixmap(depth, drawable, w,h)
|
481
|
-
pid
|
482
|
-
write_request(X11::Form::CreatePixmap.new(depth, pid, drawable, w,h))
|
483
|
-
pid
|
448
|
+
new_id.tap{|pid| write_request(Form::CreatePixmap.new(depth, pid, drawable, w,h)) }
|
484
449
|
end
|
485
450
|
|
486
451
|
# XRender
|
@@ -506,8 +471,8 @@ module X11
|
|
506
471
|
|
507
472
|
def render_query_pict_formats
|
508
473
|
@render_formats ||= write_sync(
|
509
|
-
|
510
|
-
|
474
|
+
Form::XRenderQueryPictFormats.new(render_opcode),
|
475
|
+
Form::XRenderQueryPictFormatsReply
|
511
476
|
)
|
512
477
|
end
|
513
478
|
|
@@ -528,26 +493,26 @@ module X11
|
|
528
493
|
case sym
|
529
494
|
when :a8
|
530
495
|
@a8 ||= formats.formats.find do |f|
|
531
|
-
f.type
|
496
|
+
f.type == 1 &&
|
532
497
|
f.depth == 8 &&
|
533
498
|
f.direct.alpha_mask == 255
|
534
499
|
end
|
535
500
|
when :rgb24
|
536
501
|
@rgb24 ||= formats.formats.find do |f|
|
537
|
-
f.type
|
538
|
-
f.depth
|
539
|
-
f.direct.red
|
502
|
+
f.type == 1 &&
|
503
|
+
f.depth == 24 &&
|
504
|
+
f.direct.red == 16 &&
|
540
505
|
f.direct.green == 8 &&
|
541
|
-
f.direct.blue
|
506
|
+
f.direct.blue == 0
|
542
507
|
end
|
543
508
|
when :argb24
|
544
509
|
@argb24 ||= formats.formats.find do |f|
|
545
|
-
f.type
|
546
|
-
f.depth
|
510
|
+
f.type == 1 &&
|
511
|
+
f.depth == 32 &&
|
547
512
|
f.direct.alpha == 24 &&
|
548
|
-
f.direct.red
|
513
|
+
f.direct.red == 16 &&
|
549
514
|
f.direct.green == 8 &&
|
550
|
-
f.direct.blue
|
515
|
+
f.direct.blue == 0
|
551
516
|
end
|
552
517
|
else
|
553
518
|
raise "Unsupported format (a4/a1 by omission)"
|
data/lib/X11/form.rb
CHANGED
@@ -65,13 +65,6 @@ module X11
|
|
65
65
|
|
66
66
|
if value.is_a?(BaseForm)
|
67
67
|
v = value.to_packet
|
68
|
-
elsif value.is_a?(Symbol)
|
69
|
-
#if !@atoms[value]
|
70
|
-
# reply = write_sync(X11::Forms::InternAtom.new(false, value.to_s), X11::Forms::InternAtomReply)
|
71
|
-
# @
|
72
|
-
#end
|
73
|
-
#value = @atoms[value]
|
74
|
-
raise "FIXME"
|
75
68
|
else
|
76
69
|
#p [s,value]
|
77
70
|
v = s.type_klass.pack(value)
|
data/lib/X11/type.rb
CHANGED
@@ -1,54 +1,50 @@
|
|
1
1
|
# This module is used for encoding Ruby Objects to binary
|
2
2
|
# data. The types Int8, Int16, etc. are data-types defined
|
3
|
-
# in the X11 protocol.
|
4
|
-
# which gets evaluated when a packet is created.
|
3
|
+
# in the X11 protocol.
|
5
4
|
|
6
5
|
module X11
|
7
6
|
module Type
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
def self.pack(x)
|
13
|
-
[x].pack(\"#{directive}\")
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.unpack(x)
|
17
|
-
x.unpack(\"#{directive}\").first
|
18
|
-
end
|
8
|
+
class BaseType
|
9
|
+
@directive = nil
|
10
|
+
@bytesize = nil
|
19
11
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
r ? unpack(r) : nil
|
12
|
+
def self.config(d,b) = (@directive, @bytesize = d,b)
|
13
|
+
|
14
|
+
def self.pack(x)
|
15
|
+
if x.is_a?(Symbol)
|
16
|
+
if (t = X11::Form.const_get(x)) && t.is_a?(Numeric)
|
17
|
+
x = t
|
27
18
|
end
|
28
19
|
end
|
29
|
-
|
30
|
-
|
20
|
+
[x].pack(@directive)
|
21
|
+
rescue TypeError => e
|
22
|
+
raise "Expected #{self.name}, got #{x.class} (value: #{x})"
|
23
|
+
end
|
31
24
|
|
25
|
+
def self.unpack(x) = x.nil? ? nil : x.unpack1(@directive)
|
26
|
+
def self.size = @bytesize
|
27
|
+
def self.from_packet(sock) = unpack(sock.read(size))
|
28
|
+
end
|
29
|
+
|
32
30
|
# Primitive Types
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
31
|
+
class Int8 < BaseType; config("c",1); end
|
32
|
+
class Int16 < BaseType; config("s",2); end
|
33
|
+
class Int32 < BaseType; config("l",4); end
|
34
|
+
class Uint8 < BaseType; config("C",1); end
|
35
|
+
class Uint16 < BaseType; config("S",2); end
|
36
|
+
class Uint32 < BaseType; config("L",4); end
|
39
37
|
|
40
|
-
define "Message", "c*", 20
|
41
|
-
|
42
38
|
class Message
|
43
|
-
def self.pack(x)
|
39
|
+
def self.pack(x) = x.b
|
44
40
|
def self.unpack(x) = x.b
|
45
|
-
def self.size
|
41
|
+
def self.size = 20
|
46
42
|
def self.from_packet(sock) = sock.read(2).b
|
47
43
|
end
|
48
44
|
|
49
45
|
class String8
|
50
46
|
def self.pack(x)
|
51
|
-
x.
|
47
|
+
x.b + "\x00"*(-x.length & 3)
|
52
48
|
end
|
53
49
|
|
54
50
|
def self.unpack(socket, size)
|
@@ -62,7 +58,7 @@ module X11
|
|
62
58
|
|
63
59
|
class String16
|
64
60
|
def self.pack(x)
|
65
|
-
x.encode("UTF-16BE").
|
61
|
+
x.encode("UTF-16BE").b + "\x00\x00"*(-x.length & 1)
|
66
62
|
end
|
67
63
|
|
68
64
|
def self.unpack(socket, size)
|
@@ -75,28 +71,14 @@ module X11
|
|
75
71
|
|
76
72
|
|
77
73
|
class String8Unpadded
|
78
|
-
def self.pack(x)
|
79
|
-
|
80
|
-
end
|
81
|
-
|
82
|
-
|
83
|
-
def self.unpack(socket, size)
|
84
|
-
val = socket.read(size)
|
85
|
-
end
|
74
|
+
def self.pack(x) = x
|
75
|
+
def self.unpack(socket, size) = socket.read(size)
|
86
76
|
end
|
87
|
-
|
77
|
+
|
88
78
|
class Bool
|
89
|
-
def self.pack(x)
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
def self.unpack(str)
|
94
|
-
str[0] == "\x01"
|
95
|
-
end
|
96
|
-
|
97
|
-
def self.size
|
98
|
-
1
|
99
|
-
end
|
79
|
+
def self.pack(x) = (x ? "\x01" : "\x00")
|
80
|
+
def self.unpack(str) = (str[0] == "\x01")
|
81
|
+
def self.size = 1
|
100
82
|
end
|
101
83
|
|
102
84
|
KeyCode = Uint8
|
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.6
|
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-
|
12
|
+
date: 2023-12-28 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Pure Ruby X11 bindings
|
15
15
|
email:
|