2012-05-13 01:46:48 +02:00
|
|
|
# This module is used for encoding Ruby Objects to binary
|
|
|
|
# data. The types Int8, Int16, etc. are data-types defined
|
|
|
|
# in the X11 protocol. We wrap each data-type in a lambda expression
|
|
|
|
# which gets evaluated when a packet is created.
|
|
|
|
|
|
|
|
module X11
|
|
|
|
module Type
|
|
|
|
|
|
|
|
def self.define(type, directive, bytesize)
|
|
|
|
eval %{
|
|
|
|
class X11::Type::#{type}
|
|
|
|
def self.pack(x)
|
|
|
|
[x].pack(\"#{directive}\")
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.unpack(x)
|
|
|
|
x.unpack(\"#{directive}\").first
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.size
|
|
|
|
#{bytesize}
|
|
|
|
end
|
2023-09-25 19:55:00 +02:00
|
|
|
|
|
|
|
def self.from_packet(sock)
|
|
|
|
r = sock.read(size)
|
|
|
|
r ? unpack(r) : nil
|
|
|
|
end
|
2012-05-13 01:46:48 +02:00
|
|
|
end
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
# Primitive Types
|
|
|
|
define "Int8", "c", 1
|
|
|
|
define "Int16", "s", 2
|
|
|
|
define "Int32", "l", 4
|
|
|
|
define "Uint8", "C", 1
|
|
|
|
define "Uint16", "S", 2
|
|
|
|
define "Uint32", "L", 4
|
2023-12-16 15:49:10 +01:00
|
|
|
|
|
|
|
define "Message", "c*", 20
|
|
|
|
|
|
|
|
class Message
|
|
|
|
def self.pack(x) = x.b
|
|
|
|
def self.unpack(x) = x.b
|
|
|
|
def self.size = 20
|
|
|
|
def self.from_packet(sock) = sock.read(2).b
|
|
|
|
end
|
2012-05-13 01:46:48 +02:00
|
|
|
|
2012-05-19 20:59:21 +02:00
|
|
|
class String8
|
|
|
|
def self.pack(x)
|
2023-09-25 19:55:00 +02:00
|
|
|
x.force_encoding("ASCII-8BIT") + "\x00"*(-x.length & 3)
|
2012-05-19 20:59:21 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
def self.unpack(socket, size)
|
2023-12-16 15:49:10 +01:00
|
|
|
raise "Expected size for String8" if size.nil?
|
2012-05-19 20:59:21 +02:00
|
|
|
val = socket.read(size)
|
|
|
|
unused_padding = (4 - (size % 4)) % 4
|
|
|
|
socket.read(unused_padding)
|
|
|
|
val
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-09-25 19:55:00 +02:00
|
|
|
class String16
|
|
|
|
def self.pack(x)
|
|
|
|
x.encode("UTF-16BE").force_encoding("ASCII-8BIT") + "\x00\x00"*(-x.length & 1)
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.unpack(socket, size)
|
|
|
|
val = socket.read(size)
|
|
|
|
unused_padding = (4 - (size % 4)) % 4
|
|
|
|
socket.read(unused_padding)
|
|
|
|
val.force_encoding("UTF-16BE")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
2023-08-01 21:16:11 +02:00
|
|
|
class String8Unpadded
|
|
|
|
def self.pack(x)
|
|
|
|
x
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def self.unpack(socket, size)
|
|
|
|
val = socket.read(size)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class Bool
|
|
|
|
def self.pack(x)
|
|
|
|
x ? "\x01" : "\x00"
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.unpack(str)
|
2023-09-25 19:55:00 +02:00
|
|
|
str[0] == "\x01"
|
2023-08-01 21:16:11 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
def self.size
|
|
|
|
1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-05-13 01:46:48 +02:00
|
|
|
KeyCode = Uint8
|
|
|
|
Signifigance = Uint8
|
2012-05-19 20:59:21 +02:00
|
|
|
BitGravity = Uint8
|
|
|
|
WinGravity = Uint8
|
|
|
|
BackingStore = Uint8
|
2012-05-13 01:46:48 +02:00
|
|
|
Bitmask = Uint32
|
|
|
|
Window = Uint32
|
|
|
|
Pixmap = Uint32
|
|
|
|
Cursor = Uint32
|
|
|
|
Colornum = Uint32
|
|
|
|
Font = Uint32
|
|
|
|
Gcontext = Uint32
|
|
|
|
Colormap = Uint32
|
|
|
|
Drawable = Uint32
|
|
|
|
Fontable = Uint32
|
|
|
|
Atom = Uint32
|
|
|
|
VisualID = Uint32
|
2012-05-19 20:59:21 +02:00
|
|
|
Mask = Uint32
|
|
|
|
Timestamp = Uint32
|
2023-09-25 19:55:00 +02:00
|
|
|
Keysym = Uint32
|
2012-05-13 01:46:48 +02:00
|
|
|
end
|
|
|
|
end
|