pure-x11 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|