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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0ecd289a7ec4a0a7f44bba1d05a437774ca6ed3d4c403b572b28a8691ef2a950
4
- data.tar.gz: ac9460f0c0db0635e33358550176802119db88c9bb4dee097807f21c970f68ba
3
+ metadata.gz: 927c52f35913e7d8bc466563bb5d238919c4a43d6a9f9fb1be8a6df4735cc5fb
4
+ data.tar.gz: 3b92ed556881c32486ed189c9de27fdd373988379118fefdbd6f40ff6268c0e7
5
5
  SHA512:
6
- metadata.gz: db23062260daabe75bfe5a9f419772be329023777c405ae7bb3a08125b9942f63ec8d635c1c11869648272d2c3ecad16a432fbca2d4d584d80ad2dbf15250d5a
7
- data.tar.gz: f303d01e2c4b43fa2c5d44af4e469288684887c3efe71ee644275f233d584b9e342f9ebd80374632afe1199ad0d4182cebb515a95a7408b79aa36d239c9c9ffb
6
+ metadata.gz: 580ab719f597acaecfa467389f26526dc50c1d25cacb14dbda9d63f61e3cb63f3665fd010408fc093501893a229a4b6a6f314734f6cf35786c58d965d0ec51cd
7
+ data.tar.gz: 211b56d642b773c29769e9620c746a657596b6314e1d5a89487ace79bf29c6f01f4675ec2456a8668b8723912b2c81f2c95309dcdaf9eac459682150b884f726
data/.gitignore CHANGED
@@ -1,3 +1,5 @@
1
+ vendor/
2
+
1
3
  # rcov generated
2
4
  coverage
3
5
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pure-x11 (0.0.4)
4
+ pure-x11 (0.0.6)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
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
- X11::Form::ZPixmap, wid, $gc2,
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, [X11::Form::Rectangle.new(20,20, 60, 80)])
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
- X11::Form::ZPixmap, wid, $gc2,
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(StringIO.new(data))
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(X11::Form::QueryExtension.new(name), X11::Form::QueryExtensionReply)
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(X11::Form::InternAtom.new(flag, name.to_s),
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
- reply = write_sync(X11::Form::GetAtomName.new(atom), X11::Form::AtomName)
294
- reply&.name
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(X11::Form::GetKeyboardMapping.new(min_keycode, count), X11::Form::GetKeyboardMappingReply)
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(X11::Form::CreateColormap.new(alloc, mid, window, visual))
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) if !property.is_a?(Integer)
299
+ property = atom(property)
312
300
  type = atom_enum(type)
313
301
 
314
- result = write_sync(X11::Form::GetProperty.new(
302
+ result = write_sync(Form::GetProperty.new(
315
303
  delete, window, property, type, offset, length
316
- ), X11::Form::Property)
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(X11::Form::ChangeProperty.new(mode, window, property, type, format, data))
326
+ write_request(Form::ChangeProperty.new(mode, window, property, type, format, data))
339
327
  end
340
328
 
341
- def list_fonts(*args)
342
- write_sync(X11::Form::ListFonts.new(*args),
343
- X11::Form::ListFontsReply)
344
- end
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(X11::Form::ReparentWindow.new(window, parent, x,y))
337
+ write_request(Form::ReparentWindow.new(window, parent, x,y))
353
338
  end
354
339
 
355
- def map_window(*args) = write_request(X11::Form::MapWindow.new(*args))
356
- def unmap_window(*args) = write_request(X11::Form::UnmapWindow.new(*args))
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(X11::Form::GrabKey.new(
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(X11::Form::GrabButton.new(
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
- if x
407
- mask |= 0x001
408
- values << x
409
- end
410
-
411
- if y
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
- if foreground
459
- mask |= 0x04
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(*args) = write_request(X11::Form::PolyFillRectangle.new(*args))
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 = new_id
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
- X11::Form::XRenderQueryPictFormats.new(render_opcode),
510
- X11::Form::XRenderQueryPictFormatsReply
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 == 1 &&
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 == 1 &&
538
- f.depth == 24 &&
539
- f.direct.red == 16 &&
502
+ f.type == 1 &&
503
+ f.depth == 24 &&
504
+ f.direct.red == 16 &&
540
505
  f.direct.green == 8 &&
541
- f.direct.blue == 0
506
+ f.direct.blue == 0
542
507
  end
543
508
  when :argb24
544
509
  @argb24 ||= formats.formats.find do |f|
545
- f.type == 1 &&
546
- f.depth == 32 &&
510
+ f.type == 1 &&
511
+ f.depth == 32 &&
547
512
  f.direct.alpha == 24 &&
548
- f.direct.red == 16 &&
513
+ f.direct.red == 16 &&
549
514
  f.direct.green == 8 &&
550
- f.direct.blue == 0
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. We wrap each data-type in a lambda expression
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
- 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
8
+ class BaseType
9
+ @directive = nil
10
+ @bytesize = nil
19
11
 
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
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
- end
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
- 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
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) = x.b
39
+ def self.pack(x) = x.b
44
40
  def self.unpack(x) = x.b
45
- def self.size = 20
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.force_encoding("ASCII-8BIT") + "\x00"*(-x.length & 3)
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").force_encoding("ASCII-8BIT") + "\x00\x00"*(-x.length & 1)
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
- x
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
- x ? "\x01" : "\x00"
91
- end
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
@@ -1,3 +1,3 @@
1
1
  module X11
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
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.5
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-16 00:00:00.000000000 Z
12
+ date: 2023-12-28 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Pure Ruby X11 bindings
15
15
  email: