mirror of
https://github.com/vidarh/ruby-x11
synced 2024-12-27 09:59:21 +01:00
Added significant number of new request types.
This commit is contained in:
parent
3dd9f85468
commit
a5ca257272
4 changed files with 246 additions and 17 deletions
|
@ -86,6 +86,8 @@ module X11
|
||||||
return Form::KeyRelease.from_packet(StringIO.new(data))
|
return Form::KeyRelease.from_packet(StringIO.new(data))
|
||||||
when 4
|
when 4
|
||||||
return Form::ButtonPress.from_packet(StringIO.new(data))
|
return Form::ButtonPress.from_packet(StringIO.new(data))
|
||||||
|
when 5
|
||||||
|
return Form::ButtonRelease.from_packet(StringIO.new(data))
|
||||||
when 6
|
when 6
|
||||||
return Form::MotionNotify.from_packet(StringIO.new(data))
|
return Form::MotionNotify.from_packet(StringIO.new(data))
|
||||||
when 12
|
when 12
|
||||||
|
@ -177,9 +179,46 @@ module X11
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def find_visual(screen, depth, qlass = 4)
|
||||||
|
self.display_info.screens[screen].depths.find{|d|
|
||||||
|
d.depth == depth }.visuals.find{|v| v.qlass = qlass }
|
||||||
|
end
|
||||||
|
|
||||||
# Requests
|
# Requests
|
||||||
def create_window(*args)
|
def create_window(x,y,w,h,
|
||||||
write_request(X11::Form::CreateWindow.new(*args))
|
values: {},
|
||||||
|
depth: 32, parent: nil, border_width: 0, wclass: X11::Form::InputOutput, visual: nil
|
||||||
|
)
|
||||||
|
wid = new_id
|
||||||
|
parent ||= screens.first.root
|
||||||
|
|
||||||
|
|
||||||
|
if visual.nil?
|
||||||
|
visual = find_visual(0, depth).visual_id
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
values[X11::Form::CWColorMap] ||= create_colormap(0, parent, visual)
|
||||||
|
|
||||||
|
values = values.sort_by{_1[0]}
|
||||||
|
mask = values.inject(0) {|acc,v| (acc | v[0]) }
|
||||||
|
values = values.map{_1[1]}
|
||||||
|
write_request(
|
||||||
|
X11::Form::CreateWindow.new(
|
||||||
|
depth, wid, parent,
|
||||||
|
x,y,w,h,border_width, wclass, visual, mask, values)
|
||||||
|
)
|
||||||
|
return wid
|
||||||
|
end
|
||||||
|
|
||||||
|
def change_window_attributes(wid,
|
||||||
|
values: {})
|
||||||
|
values = values.sort_by{_1[0]}
|
||||||
|
mask = values.inject(0) {|acc,v| (acc | v[0]) }
|
||||||
|
values = values.map{_1[1]}
|
||||||
|
write_request(
|
||||||
|
X11::Form::ChangeWindowAttributes.new(wid, mask, values)
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def atom(name)
|
def atom(name)
|
||||||
|
@ -211,6 +250,14 @@ module X11
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def destroy_window(window)
|
||||||
|
write_request(X11::Form::DestroyWindow.new(window))
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_geometry(drawable)
|
||||||
|
write_sync(X11::Form::GetGeometry.new(drawable), X11::Form::Geometry)
|
||||||
|
end
|
||||||
|
|
||||||
def get_keyboard_mapping(min_keycode=display_info.min_keycode, count= display_info.max_keycode - min_keycode)
|
def get_keyboard_mapping(min_keycode=display_info.min_keycode, count= display_info.max_keycode - min_keycode)
|
||||||
write_sync(X11::Form::GetKeyboardMapping.new(min_keycode, count), X11::Form::GetKeyboardMappingReply)
|
write_sync(X11::Form::GetKeyboardMapping.new(min_keycode, count), X11::Form::GetKeyboardMappingReply)
|
||||||
end
|
end
|
||||||
|
@ -242,6 +289,77 @@ module X11
|
||||||
write_request(X11::Form::MapWindow.new(*args))
|
write_request(X11::Form::MapWindow.new(*args))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def grab_key(owner_events, grab_window, modifiers, keycode, pointer_mode, keyboard_mode)
|
||||||
|
write_request(X11::Form::GrabKey.new(
|
||||||
|
owner_events,
|
||||||
|
grab_window,
|
||||||
|
modifiers,
|
||||||
|
keycode,
|
||||||
|
pointer_mode == :async ? 1 : 0,
|
||||||
|
keyboard_mode == :async ? 1 : 0
|
||||||
|
))
|
||||||
|
end
|
||||||
|
|
||||||
|
def grab_button(owner_events, grab_window, event_mask, pointer_mode,
|
||||||
|
keyboard_mode, confine_to, cursor, button, modifiers)
|
||||||
|
write_request(X11::Form::GrabButton.new(
|
||||||
|
owner_events, grab_window, event_mask,
|
||||||
|
pointer_mode == :async ? 1 : 0,
|
||||||
|
keyboard_mode == :async ? 1 : 0,
|
||||||
|
confine_to.to_i, cursor.to_i, button, modifiers)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def configure_window(window, x: nil, y: nil, width: nil, height: nil,
|
||||||
|
border_width: nil, sibling: nil, stack_mode: nil)
|
||||||
|
|
||||||
|
mask = 0
|
||||||
|
values = []
|
||||||
|
|
||||||
|
if x
|
||||||
|
mask |= 0x001
|
||||||
|
values << x
|
||||||
|
end
|
||||||
|
|
||||||
|
if y
|
||||||
|
mask |= 0x002
|
||||||
|
values << y
|
||||||
|
end
|
||||||
|
|
||||||
|
if width
|
||||||
|
mask |= 0x004
|
||||||
|
values << width
|
||||||
|
end
|
||||||
|
|
||||||
|
if height
|
||||||
|
mask |= 0x008
|
||||||
|
values << height
|
||||||
|
end
|
||||||
|
|
||||||
|
if border_width
|
||||||
|
mask |= 0x010
|
||||||
|
values << border_width
|
||||||
|
end
|
||||||
|
|
||||||
|
if sibling
|
||||||
|
mask |= 0x020
|
||||||
|
values << sibling
|
||||||
|
end
|
||||||
|
|
||||||
|
if stack_mode
|
||||||
|
mask |= 0x040
|
||||||
|
values << case stack_mode
|
||||||
|
when :above then 0
|
||||||
|
when :below then 1
|
||||||
|
when :top_if then 2
|
||||||
|
when :bottom_if then 3
|
||||||
|
when :opposite then 4
|
||||||
|
else raise "Unknown stack_mode #{stack_mode.inspect}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
write_request(X11::Form::ConfigureWindow.new(window, mask, values))
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
def create_gc(window, foreground: nil, background: nil)
|
def create_gc(window, foreground: nil, background: nil)
|
||||||
mask = 0
|
mask = 0
|
||||||
|
@ -329,7 +447,7 @@ module X11
|
||||||
s.depths.map do |d|
|
s.depths.map do |d|
|
||||||
d.visuals.map {|v| v.visual == visual ? v : nil }
|
d.visuals.map {|v| v.visual == visual ? v : nil }
|
||||||
end
|
end
|
||||||
end.flatten.compact.first.format
|
end.flatten.compact.first&.format
|
||||||
end
|
end
|
||||||
|
|
||||||
def render_find_standard_format(sym)
|
def render_find_standard_format(sym)
|
||||||
|
|
130
lib/X11/form.rb
130
lib/X11/form.rb
|
@ -332,14 +332,26 @@ module X11
|
||||||
InputOutput = 1
|
InputOutput = 1
|
||||||
InputOnly = 2
|
InputOnly = 2
|
||||||
|
|
||||||
CWBackPixel = 0x0002
|
CWBackPixmap = 0x0001
|
||||||
|
CWBackPixel = 0x0002
|
||||||
|
CWBorderPixmap= 0x0004
|
||||||
CWBorderPixel = 0x0008
|
CWBorderPixel = 0x0008
|
||||||
CWEventMask = 0x0800
|
CWBitGravity = 0x0010
|
||||||
CWColorMap = 0x2000
|
CWWinGravity = 0x0020
|
||||||
|
CWBackingStore= 0x0040
|
||||||
|
CWSaveUnder = 0x0400
|
||||||
|
CWEventMask = 0x0800
|
||||||
|
CWColorMap = 0x2000
|
||||||
|
|
||||||
KeyPressMask = 0x00001
|
KeyPressMask = 0x00001
|
||||||
|
KeyReleaseMask = 0x00002
|
||||||
ButtonPressMask = 0x00004
|
ButtonPressMask = 0x00004
|
||||||
|
ButtonReleaseMask = 0x00008
|
||||||
|
EnterWindowMask = 0x00010
|
||||||
|
LeaveWindowMask = 0x00020
|
||||||
PointerMotionMask = 0x00040
|
PointerMotionMask = 0x00040
|
||||||
|
PointerMotionHintMask = 0x00080
|
||||||
|
Button1MotionMask = 0x00100
|
||||||
ExposureMask = 0x08000
|
ExposureMask = 0x08000
|
||||||
StructureNotifyMask = 0x20000
|
StructureNotifyMask = 0x20000
|
||||||
SubstructureNotifyMask = 0x80000
|
SubstructureNotifyMask = 0x80000
|
||||||
|
@ -361,6 +373,51 @@ module X11
|
||||||
field :value_list, Uint32, :list
|
field :value_list, Uint32, :list
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class ChangeWindowAttributes < BaseForm
|
||||||
|
field :opcode, Uint8, value: 2
|
||||||
|
unused 1
|
||||||
|
field :request_length, Uint16, value: ->(cw) { 3 + cw.value_list.length }
|
||||||
|
field :window, Window
|
||||||
|
field :value_mask, Bitmask
|
||||||
|
field :value_list, Uint32, :list
|
||||||
|
end
|
||||||
|
|
||||||
|
class GetWindowAttributes < BaseForm
|
||||||
|
field :opcode, Uint8, value: 3
|
||||||
|
unused 1
|
||||||
|
field :request_length, Uint16, value: 2
|
||||||
|
field :window, Window
|
||||||
|
end
|
||||||
|
|
||||||
|
class WindowAttributes < BaseForm
|
||||||
|
field :reply, Uint8, value: 1
|
||||||
|
field :backing_store, Uint8
|
||||||
|
field :sequence_number, Uint16
|
||||||
|
field :reply_length, Uint32
|
||||||
|
field :visual, VisualID
|
||||||
|
field :class, Uint16
|
||||||
|
field :bit_gravity, Uint8
|
||||||
|
field :win_gravity, Uint8
|
||||||
|
field :backing_planes, Uint32
|
||||||
|
field :backing_pixel, Uint32
|
||||||
|
field :save_under, Bool
|
||||||
|
field :map_is_installed, Bool
|
||||||
|
field :map_state, Bool
|
||||||
|
field :override_redirect, Bool
|
||||||
|
field :colormap, Colormap
|
||||||
|
field :all_event_masks, Uint32
|
||||||
|
field :your_event_masks, Uint32
|
||||||
|
field :do_not_propagate_mask, Uint16
|
||||||
|
unused 2
|
||||||
|
end
|
||||||
|
|
||||||
|
class DestroyWindow < BaseForm
|
||||||
|
field :opcode, Uint8, value: 4
|
||||||
|
unused 1
|
||||||
|
field :request_length, Uint16, value: 2
|
||||||
|
field :window, Window
|
||||||
|
end
|
||||||
|
|
||||||
class MapWindow < BaseForm
|
class MapWindow < BaseForm
|
||||||
field :opcode, Uint8, value: 8
|
field :opcode, Uint8, value: 8
|
||||||
unused 1
|
unused 1
|
||||||
|
@ -368,6 +425,37 @@ module X11
|
||||||
field :window, Window
|
field :window, Window
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class ConfigureWindow < BaseForm
|
||||||
|
field :opcode, Uint8, value: 12
|
||||||
|
unused 1
|
||||||
|
field :request_length, Uint16, value: ->(cw) { 3 + cw.values.length }
|
||||||
|
field :window, Window
|
||||||
|
field :value_mask, Uint16
|
||||||
|
unused 2
|
||||||
|
field :values, Uint32, :list
|
||||||
|
end
|
||||||
|
|
||||||
|
class GetGeometry < BaseForm
|
||||||
|
field :opcode, Uint8, value: 14
|
||||||
|
unused 1
|
||||||
|
field :request_length, Uint16, value: 2
|
||||||
|
field :drawable, Drawable
|
||||||
|
end
|
||||||
|
|
||||||
|
class Geometry < BaseForm
|
||||||
|
field :reply, Uint8, value: 1
|
||||||
|
field :depth, Uint8
|
||||||
|
field :sequence_number, Uint16
|
||||||
|
field :reply_length, Uint32
|
||||||
|
field :root, Window
|
||||||
|
field :x, Int16
|
||||||
|
field :y, Int16
|
||||||
|
field :width, Uint16
|
||||||
|
field :height, Uint16
|
||||||
|
field :border_width, Uint16
|
||||||
|
unused 10
|
||||||
|
end
|
||||||
|
|
||||||
class InternAtom < BaseForm
|
class InternAtom < BaseForm
|
||||||
field :opcode, Uint8, value: 16
|
field :opcode, Uint8, value: 16
|
||||||
field :only_if_exists, Bool
|
field :only_if_exists, Bool
|
||||||
|
@ -415,16 +503,31 @@ module X11
|
||||||
field :data, Uint8, :list
|
field :data, Uint8, :list
|
||||||
end
|
end
|
||||||
|
|
||||||
class OpenFont < BaseForm
|
class GrabButton < BaseForm
|
||||||
field :opcode, Uint8, value: 45
|
field :opcode, Uint8, value: 28
|
||||||
|
field :owner_events, Bool
|
||||||
|
field :request_length, Uint16, value: 6
|
||||||
|
field :grab_window, Window
|
||||||
|
field :event_mask, Uint16
|
||||||
|
field :pointer_mode, Uint8
|
||||||
|
field :keyboard_mode, Uint8
|
||||||
|
field :confine_to, Window
|
||||||
|
field :cursor, Cursor
|
||||||
|
field :button, Uint8
|
||||||
unused 1
|
unused 1
|
||||||
field :request_length, Uint16, value: ->(of) {
|
field :modifiers, Uint16
|
||||||
3+(of.name.length+3)/4
|
end
|
||||||
}
|
|
||||||
field :fid, Font
|
class GrabKey < BaseForm
|
||||||
field :name, Uint16, :length
|
field :opcode, Uint8, value: 33
|
||||||
unused 2
|
field :owner_event, Bool
|
||||||
field :name, String8, :string
|
field :request_length, Uint16, value: 4
|
||||||
|
field :grab_window, Window
|
||||||
|
field :modifiers, Uint16
|
||||||
|
field :keycode, Uint8
|
||||||
|
field :pointer_mode, Uint8
|
||||||
|
field :keyboard_mode, Uint8
|
||||||
|
unused 3
|
||||||
end
|
end
|
||||||
|
|
||||||
class ListFonts < BaseForm
|
class ListFonts < BaseForm
|
||||||
|
@ -678,6 +781,9 @@ module X11
|
||||||
class MotionNotify < PressEvent
|
class MotionNotify < PressEvent
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class ButtonRelease < PressEvent
|
||||||
|
end
|
||||||
|
|
||||||
class Expose < SimpleEvent
|
class Expose < SimpleEvent
|
||||||
field :window, Window
|
field :window, Window
|
||||||
field :x, Uint16
|
field :x, Uint16
|
||||||
|
|
|
@ -114,13 +114,18 @@ module X11
|
||||||
0xff9d => :XK_KP_Begin,
|
0xff9d => :XK_KP_Begin,
|
||||||
0xff9e => :XK_KP_Insert,
|
0xff9e => :XK_KP_Insert,
|
||||||
0xff9f => :XK_KP_Delete,
|
0xff9f => :XK_KP_Delete,
|
||||||
0xffbd => :XK_KP_Equal,
|
|
||||||
0xffaa => :XK_KP_Multiply,
|
0xffaa => :XK_KP_Multiply,
|
||||||
0xffab => :XK_KP_Add,
|
0xffab => :XK_KP_Add,
|
||||||
0xffac => :XK_KP_Separator,
|
0xffac => :XK_KP_Separator,
|
||||||
0xffad => :XK_KP_Subtract,
|
0xffad => :XK_KP_Subtract,
|
||||||
0xffae => :XK_KP_Decimal,
|
0xffae => :XK_KP_Decimal,
|
||||||
0xffaf => :XK_KP_Divide,
|
0xffaf => :XK_KP_Divide,
|
||||||
|
0xffbd => :XK_KP_Equal,
|
||||||
|
0xffbe => :f1,
|
||||||
|
0xffbf => :f2,
|
||||||
|
0xffc0 => :f3,
|
||||||
|
0xffc1 => :f4, # And so on
|
||||||
|
|
||||||
|
|
||||||
0xffe1 => :XK_Shift_L,
|
0xffe1 => :XK_Shift_L,
|
||||||
0xffe2 => :XK_Shift_R,
|
0xffe2 => :XK_Shift_R,
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
module X11
|
module X11
|
||||||
VERSION = "0.0.2"
|
VERSION = "0.0.4"
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue