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 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: