white_gold 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/ext/dll/openal32.dll +0 -0
- data/ext/dll/sfml-audio-2.dll +0 -0
- data/ext/dll/sfml-graphics-2.dll +0 -0
- data/ext/dll/sfml-network-2.dll +0 -0
- data/ext/dll/sfml-system-2.dll +0 -0
- data/ext/dll/sfml-window-2.dll +0 -0
- data/ext/dll/tgui.dll +0 -0
- data/ext/so/libsfml-audio.so +0 -0
- data/ext/so/libsfml-graphics.so +0 -0
- data/ext/so/libsfml-network.so +0 -0
- data/ext/so/libsfml-system.so +0 -0
- data/ext/so/libsfml-window.so +0 -0
- data/ext/so/libtgui.so +0 -0
- data/lib/white_gold/abi/alias.rb +50 -0
- data/lib/white_gold/abi/enum.rb +43 -0
- data/lib/white_gold/abi/extern_object.rb +180 -0
- data/lib/white_gold/abi/interface/interface.rb +114 -0
- data/lib/white_gold/abi/interface/interface_collection_out.rb +29 -0
- data/lib/white_gold/abi/interface/interface_composed_out.rb +28 -0
- data/lib/white_gold/abi/interface/interface_single_out.rb +19 -0
- data/lib/white_gold/abi/packer.rb +28 -0
- data/lib/white_gold/abi/reducer.rb +12 -0
- data/lib/white_gold/abi/unpacker.rb +27 -0
- data/lib/white_gold/convention/api_child.rb +30 -0
- data/lib/white_gold/convention/bang_def.rb +5 -0
- data/lib/white_gold/convention/bang_nest.rb +16 -0
- data/lib/white_gold/convention/bang_nested_caller.rb +48 -0
- data/lib/white_gold/convention/bool_property.rb +13 -0
- data/lib/white_gold/convention/boolean.rb +2 -0
- data/lib/white_gold/convention/club.rb +26 -0
- data/lib/white_gold/convention/container_widgets.rb +181 -0
- data/lib/white_gold/convention/page.rb +96 -0
- data/lib/white_gold/convention/proc_method_factory.rb +22 -0
- data/lib/white_gold/convention/unit.rb +22 -0
- data/lib/white_gold/convention/widget_like.rb +146 -0
- data/lib/white_gold/dsl/backend_gui.rb +37 -0
- data/lib/white_gold/dsl/bitmap_button.rb +11 -0
- data/lib/white_gold/dsl/box_layout.rb +47 -0
- data/lib/white_gold/dsl/box_layout_ratios.rb +13 -0
- data/lib/white_gold/dsl/button.rb +10 -0
- data/lib/white_gold/dsl/button_base.rb +18 -0
- data/lib/white_gold/dsl/chat_box.rb +65 -0
- data/lib/white_gold/dsl/checkbox.rb +6 -0
- data/lib/white_gold/dsl/child_window.rb +47 -0
- data/lib/white_gold/dsl/clickable_widget.rb +15 -0
- data/lib/white_gold/dsl/color.rb +124 -0
- data/lib/white_gold/dsl/color_picker.rb +12 -0
- data/lib/white_gold/dsl/combo_box.rb +135 -0
- data/lib/white_gold/dsl/container.rb +95 -0
- data/lib/white_gold/dsl/edit_box.rb +38 -0
- data/lib/white_gold/dsl/file_dialog.rb +86 -0
- data/lib/white_gold/dsl/font.rb +23 -0
- data/lib/white_gold/dsl/grid.rb +131 -0
- data/lib/white_gold/dsl/group.rb +6 -0
- data/lib/white_gold/dsl/gui.rb +16 -0
- data/lib/white_gold/dsl/horizontal_layout.rb +6 -0
- data/lib/white_gold/dsl/horizontal_wrap.rb +6 -0
- data/lib/white_gold/dsl/knob.rb +16 -0
- data/lib/white_gold/dsl/label.rb +21 -0
- data/lib/white_gold/dsl/list_box.rb +125 -0
- data/lib/white_gold/dsl/list_view.rb +239 -0
- data/lib/white_gold/dsl/menu_bar.rb +252 -0
- data/lib/white_gold/dsl/message_box.rb +90 -0
- data/lib/white_gold/dsl/outline.rb +52 -0
- data/lib/white_gold/dsl/panel.rb +16 -0
- data/lib/white_gold/dsl/panel_list_box.rb +83 -0
- data/lib/white_gold/dsl/picture.rb +12 -0
- data/lib/white_gold/dsl/progress_bar.rb +19 -0
- data/lib/white_gold/dsl/radio_button.rb +18 -0
- data/lib/white_gold/dsl/radio_button_group.rb +14 -0
- data/lib/white_gold/dsl/range_slider.rb +15 -0
- data/lib/white_gold/dsl/rich_text_label.rb +6 -0
- data/lib/white_gold/dsl/scrollable_panel.rb +53 -0
- data/lib/white_gold/dsl/scrollbar.rb +28 -0
- data/lib/white_gold/dsl/separator_line.rb +6 -0
- data/lib/white_gold/dsl/signal/global_signal.rb +33 -0
- data/lib/white_gold/dsl/signal/signal.rb +44 -0
- data/lib/white_gold/dsl/signal/signal_animation_type.rb +16 -0
- data/lib/white_gold/dsl/signal/signal_bool.rb +16 -0
- data/lib/white_gold/dsl/signal/signal_color.rb +16 -0
- data/lib/white_gold/dsl/signal/signal_float.rb +16 -0
- data/lib/white_gold/dsl/signal/signal_int.rb +16 -0
- data/lib/white_gold/dsl/signal/signal_item.rb +6 -0
- data/lib/white_gold/dsl/signal/signal_item_hierarchy.rb +9 -0
- data/lib/white_gold/dsl/signal/signal_panel_list_box_item.rb +7 -0
- data/lib/white_gold/dsl/signal/signal_pointer.rb +15 -0
- data/lib/white_gold/dsl/signal/signal_range.rb +15 -0
- data/lib/white_gold/dsl/signal/signal_show_effect.rb +17 -0
- data/lib/white_gold/dsl/signal/signal_string.rb +16 -0
- data/lib/white_gold/dsl/signal/signal_typed_int_bool_ptr.rb +15 -0
- data/lib/white_gold/dsl/signal/signal_typed_size_t.rb +6 -0
- data/lib/white_gold/dsl/signal/signal_u_int.rb +16 -0
- data/lib/white_gold/dsl/signal/signal_vector2f.rb +14 -0
- data/lib/white_gold/dsl/slider.rb +26 -0
- data/lib/white_gold/dsl/spin_button.rb +24 -0
- data/lib/white_gold/dsl/spin_control.rb +15 -0
- data/lib/white_gold/dsl/subwidget_container.rb +9 -0
- data/lib/white_gold/dsl/tab_container.rb +121 -0
- data/lib/white_gold/dsl/tabs.rb +91 -0
- data/lib/white_gold/dsl/text_area.rb +34 -0
- data/lib/white_gold/dsl/texture.rb +53 -0
- data/lib/white_gold/dsl/theme/boolean_attribute.rb +13 -0
- data/lib/white_gold/dsl/theme/button_theme.rb +19 -0
- data/lib/white_gold/dsl/theme/chat_box_theme.rb +16 -0
- data/lib/white_gold/dsl/theme/child_window_theme.rb +25 -0
- data/lib/white_gold/dsl/theme/color_attribute.rb +13 -0
- data/lib/white_gold/dsl/theme/color_picker_theme.rb +14 -0
- data/lib/white_gold/dsl/theme/combo_box_theme.rb +33 -0
- data/lib/white_gold/dsl/theme/common_renderer.rb +7 -0
- data/lib/white_gold/dsl/theme/edit_box_theme.rb +34 -0
- data/lib/white_gold/dsl/theme/file_dialog_theme.rb +22 -0
- data/lib/white_gold/dsl/theme/float_attribute.rb +13 -0
- data/lib/white_gold/dsl/theme/group_theme.rb +9 -0
- data/lib/white_gold/dsl/theme/knob_theme.rb +15 -0
- data/lib/white_gold/dsl/theme/label_theme.rb +20 -0
- data/lib/white_gold/dsl/theme/list_box_theme.rb +25 -0
- data/lib/white_gold/dsl/theme/list_view_theme.rb +27 -0
- data/lib/white_gold/dsl/theme/menu_bar_theme.rb +21 -0
- data/lib/white_gold/dsl/theme/message_box_theme.rb +11 -0
- data/lib/white_gold/dsl/theme/outline_attribute.rb +13 -0
- data/lib/white_gold/dsl/theme/progress_bar_theme.rb +19 -0
- data/lib/white_gold/dsl/theme/radio_button_theme.rb +30 -0
- data/lib/white_gold/dsl/theme/scrollbar_theme.rb +24 -0
- data/lib/white_gold/dsl/theme/separator_line_theme.rb +9 -0
- data/lib/white_gold/dsl/theme/slider_theme.rb +20 -0
- data/lib/white_gold/dsl/theme/spin_button_theme.rb +19 -0
- data/lib/white_gold/dsl/theme/tabs_theme.rb +29 -0
- data/lib/white_gold/dsl/theme/text_area_theme.rb +22 -0
- data/lib/white_gold/dsl/theme/text_styles_attribute.rb +13 -0
- data/lib/white_gold/dsl/theme/texture_attribute.rb +17 -0
- data/lib/white_gold/dsl/theme/theme_attributed.rb +51 -0
- data/lib/white_gold/dsl/theme/theme_component.rb +23 -0
- data/lib/white_gold/dsl/theme/tree_view_theme.rb +26 -0
- data/lib/white_gold/dsl/theme/widget_theme.rb +12 -0
- data/lib/white_gold/dsl/theme.rb +144 -0
- data/lib/white_gold/dsl/toggle_button.rb +10 -0
- data/lib/white_gold/dsl/tool_tip.rb +21 -0
- data/lib/white_gold/dsl/tree_view.rb +186 -0
- data/lib/white_gold/dsl/util.rb +17 -0
- data/lib/white_gold/dsl/vertical_layout.rb +6 -0
- data/lib/white_gold/dsl/widget.rb +279 -0
- data/lib/white_gold/dsl/window.rb +16 -0
- data/lib/white_gold/generated/tgui-abi-loader.gf.rb +1813 -0
- data/lib/white_gold/library/theme/light.rb +111 -0
- data/lib/white_gold/master.rb +170 -0
- data/lib/white_gold/path/kernel.path.rb +3 -0
- data/lib/white_gold/path/numeric.path.rb +9 -0
- data/lib/white_gold/path/object.path.rb +22 -0
- data/lib/white_gold/path/string.path.rb +5 -0
- data/lib/white_gold/tgui-abi.rb +255 -0
- data/lib/white_gold/tgui-config.rb +20 -0
- data/lib/white_gold.rb +47 -0
- metadata +209 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2602400f722a11d0ea3f31366f29c3b31471fa0b001061e3c614518c0ae4f52e
|
4
|
+
data.tar.gz: d1c55ab3f33f03c59d389fe2739bd6ddcc10d13d9ecab594b826a365a9d41ec3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fe6e0e9ce7881149ed8d5912fda0dc7dcbcb3e4ae4ca8dcc242765a35f8066499eb89fed57d05a47906ab66e910e92a48ff6e60522473cff7604974498b1bdb3
|
7
|
+
data.tar.gz: 3ec8c60dcd97eacd677ddcd158c71db4e7947036f1f6313ec3805f9e7b18c4e1160fbfb996524143dc9bf3b4d30770e679f7666a4a5ddfeb234fe90a7ed2eb41
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/ext/dll/tgui.dll
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/ext/so/libtgui.so
ADDED
Binary file
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Alias
|
2
|
+
def abi_def name, original_name = nil, **na
|
3
|
+
if original_name
|
4
|
+
if original_name.end_with? "_"
|
5
|
+
abi_name = "_abi_#{original_name}#{name}".delete_suffix("=").delete_suffix("?").to_sym
|
6
|
+
else
|
7
|
+
abi_name = "_abi_#{original_name}".to_sym
|
8
|
+
end
|
9
|
+
else
|
10
|
+
if name.end_with? "?"
|
11
|
+
abi_name = "_abi_is_#{name}".delete_suffix("?").to_sym
|
12
|
+
elsif name.end_with? "="
|
13
|
+
abi_name = "_abi_set_#{name}".delete_suffix("=").to_sym
|
14
|
+
else
|
15
|
+
abi_name = "_abi_#{name}".to_sym
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
interface = na.map{|k, v| Interface.from k, v }.first
|
20
|
+
self_abi_def name, abi_name, interface
|
21
|
+
end
|
22
|
+
|
23
|
+
def self_abi_def name, abi_name, abi_interface
|
24
|
+
define_method name do |*a|
|
25
|
+
abi_interface.call self, abi_name, *a
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def abi_attr name, type = nil, original_name = nil
|
30
|
+
if original_name
|
31
|
+
if original_name.end_with? "_"
|
32
|
+
getter = "_abi_#{original_name}#{name}".delete_suffix("?").to_sym
|
33
|
+
setter = "_abi_set_#{name}".delete_suffix("?").to_sym
|
34
|
+
else
|
35
|
+
getter = "_abi_get_#{original_name}".to_sym
|
36
|
+
setter = "_abi_set_#{original_name}".to_sym
|
37
|
+
end
|
38
|
+
else
|
39
|
+
if name.end_with? "?"
|
40
|
+
getter = "_abi_is_#{name}".delete_suffix("?").to_sym
|
41
|
+
else
|
42
|
+
getter = "_abi_get_#{name}".to_sym
|
43
|
+
end
|
44
|
+
setter = "_abi_set_#{name}".delete_suffix("?").to_sym
|
45
|
+
end
|
46
|
+
type ||= Boolean if name.end_with? "?"
|
47
|
+
abi_def "#{name.to_s.delete_suffix("?")}=".to_sym, setter, type => nil
|
48
|
+
abi_def name, getter, nil => type
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
class Enum
|
2
|
+
def initialize *keywords, **indexed_keywords
|
3
|
+
@symbol_to_int = keywords.each_with_index.to_h
|
4
|
+
indexed_keywords.each do |k, i|
|
5
|
+
@symbol_to_int[k] = Integer === i ? i : @symbol_to_int[i]
|
6
|
+
end
|
7
|
+
@int_to_symbol = @symbol_to_int.invert
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_accessor :name
|
11
|
+
|
12
|
+
def sym_to_i sym
|
13
|
+
@symbol_to_int[sym] || raise("No value at #{sym}")
|
14
|
+
end
|
15
|
+
|
16
|
+
def i_to_sym i
|
17
|
+
@int_to_symbol[i] || raise("No keyword at #{i}")
|
18
|
+
end
|
19
|
+
|
20
|
+
def [](k)
|
21
|
+
k.is_a?(Integer) ? i_to_sym(k) : sym_to_i(k)
|
22
|
+
end
|
23
|
+
|
24
|
+
def pack *k
|
25
|
+
k.map{ @symbol_to_int[_1] }.reduce(0, &:|)
|
26
|
+
end
|
27
|
+
|
28
|
+
def unpack m
|
29
|
+
@int_to_symbol.filter{|k, v| k != 0 and m & k == k }.map{ _1[1] }
|
30
|
+
end
|
31
|
+
|
32
|
+
def symbols
|
33
|
+
@symbol_to_int
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_abi o
|
37
|
+
self[o]
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_api o
|
41
|
+
self[o]
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,180 @@
|
|
1
|
+
require_relative '../convention/bang_def'
|
2
|
+
require_relative 'packer'
|
3
|
+
require_relative 'unpacker'
|
4
|
+
|
5
|
+
class ExternObject
|
6
|
+
extend Packer
|
7
|
+
extend Unpacker
|
8
|
+
extend BangDef
|
9
|
+
|
10
|
+
def initialize pointer:, autofree: true
|
11
|
+
@pointer = pointer
|
12
|
+
|
13
|
+
if autofree
|
14
|
+
cl = self.class
|
15
|
+
while !cl.respond_to?(:finalizer)
|
16
|
+
cl = cl.superclass
|
17
|
+
end
|
18
|
+
ObjectSpace.define_finalizer(self, cl.proc.finalizer(pointer))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialized
|
23
|
+
end
|
24
|
+
|
25
|
+
attr :pointer
|
26
|
+
|
27
|
+
@@callback_storage = {}
|
28
|
+
@@global_callback_storage = {}
|
29
|
+
@@data_storage = {}
|
30
|
+
|
31
|
+
def abi_pack type, *a
|
32
|
+
ExternObject.abi_pack self, type, *a
|
33
|
+
end
|
34
|
+
|
35
|
+
def abi_unpack type, object
|
36
|
+
ExternObject.abi_unpack self, type, object
|
37
|
+
end
|
38
|
+
|
39
|
+
class << self
|
40
|
+
|
41
|
+
def callback_storage=(callback_storage)
|
42
|
+
@@callback_storage = callback_storage
|
43
|
+
end
|
44
|
+
|
45
|
+
def callback_storage
|
46
|
+
@@callback_storage
|
47
|
+
end
|
48
|
+
|
49
|
+
def global_callback_storage=(global_callback_storage)
|
50
|
+
@@global_callback_storage = global_callback_storage
|
51
|
+
end
|
52
|
+
|
53
|
+
def global_callback_storage
|
54
|
+
@@global_callback_storage
|
55
|
+
end
|
56
|
+
|
57
|
+
def data_storage=(data_storage)
|
58
|
+
@@data_storage = data_storage
|
59
|
+
end
|
60
|
+
|
61
|
+
def abi_def name, original_name = nil, **na
|
62
|
+
if original_name
|
63
|
+
if original_name.end_with? "_"
|
64
|
+
abi_name = "_abi_#{original_name}#{name}".delete_suffix("=").delete_suffix("?").to_sym
|
65
|
+
else
|
66
|
+
abi_name = "_abi_#{original_name}".to_sym
|
67
|
+
end
|
68
|
+
else
|
69
|
+
if name.end_with? "?"
|
70
|
+
abi_name = "_abi_is_#{name}".delete_suffix("?").to_sym
|
71
|
+
elsif name.end_with? "="
|
72
|
+
abi_name = "_abi_set_#{name}".delete_suffix("=").to_sym
|
73
|
+
else
|
74
|
+
abi_name = "_abi_#{name}".to_sym
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
na = {nil => nil} if na.empty?
|
79
|
+
interface = na.map{|k, v| Interface.from k, v }.first
|
80
|
+
if name.to_s.end_with? "="
|
81
|
+
self_abi_def_setter name, abi_name, interface
|
82
|
+
else
|
83
|
+
self_abi_def name, abi_name, interface
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def self_abi_def name, abi_name, abi_interface, *def_attr
|
88
|
+
define_method name do |*a|
|
89
|
+
abi_interface.call self, abi_name, *def_attr, *a
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def self_abi_def_setter name, abi_name, abi_interface, *def_attr
|
94
|
+
define_method name do |a = VOID|
|
95
|
+
abi_interface.call self, abi_name, *def_attr, *a
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def abi_attr name, type = nil, original_name = nil
|
100
|
+
if original_name
|
101
|
+
if original_name.end_with? "_"
|
102
|
+
getter = "#{original_name}#{name}".delete_suffix("?").to_sym
|
103
|
+
setter = "set_#{name}".delete_suffix("?").to_sym
|
104
|
+
else
|
105
|
+
getter = "get_#{original_name}".to_sym
|
106
|
+
setter = "set_#{original_name}".to_sym
|
107
|
+
end
|
108
|
+
else
|
109
|
+
if name.end_with? "?"
|
110
|
+
getter = "is_#{name}".delete_suffix("?").to_sym
|
111
|
+
else
|
112
|
+
getter = "get_#{name}".to_sym
|
113
|
+
end
|
114
|
+
setter = "set_#{name}".delete_suffix("?").to_sym
|
115
|
+
end
|
116
|
+
type ||= Boolean if name.end_with? "?"
|
117
|
+
abi_def "#{name.to_s.delete_suffix("?")}=".to_sym, setter, type => nil
|
118
|
+
abi_def name, getter, nil => type
|
119
|
+
end
|
120
|
+
|
121
|
+
def abi_enum base, *keywords, **indexed_keywords
|
122
|
+
if base.is_a? Enum
|
123
|
+
enum = base
|
124
|
+
else
|
125
|
+
enum = Enum.new *keywords, **indexed_keywords
|
126
|
+
const_set base, enum
|
127
|
+
enum.name = base
|
128
|
+
end
|
129
|
+
abi_packer enum do |o|
|
130
|
+
enum.sym_to_i(o)
|
131
|
+
end
|
132
|
+
abi_unpacker enum do |o|
|
133
|
+
enum.i_to_sym(o)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def abi_bit_enum base, zero, *keywords, **indexed_keywords
|
138
|
+
if base.is_a? Enum
|
139
|
+
enum = base
|
140
|
+
else
|
141
|
+
enum = Enum.new zero, **(keywords.each_with_index.map{[_1, 1 << _2]}.to_h), **indexed_keywords
|
142
|
+
const_set base, enum
|
143
|
+
enum.name = base
|
144
|
+
end
|
145
|
+
abi_packer enum do |*o|
|
146
|
+
enum.pack(*o)
|
147
|
+
end
|
148
|
+
abi_unpacker enum do |o|
|
149
|
+
enum.unpack(o)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def abi_signal name, signal_class = Signal, original_name = nil
|
154
|
+
abi_getter = "_abi_#{original_name || name}".to_sym
|
155
|
+
define_method name do |*a, &b|
|
156
|
+
signal_pointer = send(abi_getter, *a)
|
157
|
+
signal = signal_class.new signal_pointer, self
|
158
|
+
b ? signal.connect(&b) : signal
|
159
|
+
end
|
160
|
+
define_method "#{name}=" do |a|
|
161
|
+
send(name, &a)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def abi_static name, original_name = nil
|
166
|
+
if original_name
|
167
|
+
if original_name.end_with? "_"
|
168
|
+
abi_name = "_abi_#{original_name}#{name}".delete_suffix("=").delete_suffix("?").to_sym
|
169
|
+
else
|
170
|
+
abi_name = "_abi_#{original_name}".delete_suffix("=").to_sym
|
171
|
+
end
|
172
|
+
else
|
173
|
+
abi_name = "_abi_#{name}".delete_suffix("=").delete_suffix("?").to_sym
|
174
|
+
end
|
175
|
+
define_singleton_method name do |*a|
|
176
|
+
send(abi_name, *a)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require_relative '../reducer'
|
2
|
+
|
3
|
+
module Interface
|
4
|
+
|
5
|
+
def self.abi_const_string_method_suffix str
|
6
|
+
return str.gsub(/([A-Z])/, '_\1').gsub(/::/, '__').downcase
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.parse_packer packer
|
10
|
+
case packer
|
11
|
+
when Proc, Reducer
|
12
|
+
packer
|
13
|
+
when Array
|
14
|
+
packers = packer.map{ parse_packer _1 }
|
15
|
+
proc do |host, *a|
|
16
|
+
ai = a.each
|
17
|
+
packers.map do |packer|
|
18
|
+
case packer
|
19
|
+
when Proc then packer.call host, *ai.next
|
20
|
+
when nil then ai.next
|
21
|
+
when Reducer then packer.call host, *(0..packer.reduction).map{ ai.next }
|
22
|
+
else packer
|
23
|
+
end
|
24
|
+
end.flatten
|
25
|
+
end
|
26
|
+
when Symbol
|
27
|
+
if packer.to_s.start_with? "_"
|
28
|
+
parse_packer "abi_pack#{packer}".to_sym
|
29
|
+
else
|
30
|
+
proc do |host, *a|
|
31
|
+
host.send packer, *a
|
32
|
+
end
|
33
|
+
end
|
34
|
+
when Class, Module, Enum
|
35
|
+
parse_packer "abi_pack#{abi_const_string_method_suffix packer.name}".to_sym
|
36
|
+
when String
|
37
|
+
parse_packer "abi_pack#{abi_const_string_method_suffix packer}".to_sym
|
38
|
+
when Range
|
39
|
+
subpacker = parse_packer packer.min
|
40
|
+
fiddle_type = packer_fiddle_type packer.min
|
41
|
+
if packer.exclude_end?
|
42
|
+
proc do |host, *a|
|
43
|
+
it = a.each
|
44
|
+
block_caller = Fiddle::Closure::BlockCaller.new(fiddle_type, [0]) do
|
45
|
+
subpacker.call host, it.next
|
46
|
+
rescue StopIteration
|
47
|
+
subpacker.call host, nil
|
48
|
+
end
|
49
|
+
block_caller
|
50
|
+
end
|
51
|
+
else
|
52
|
+
proc do |host, *a|
|
53
|
+
it = a.each
|
54
|
+
block_caller = Fiddle::Closure::BlockCaller.new(fiddle_type, [0]) do
|
55
|
+
subpacker.call host, it.next
|
56
|
+
end
|
57
|
+
[a.size, block_caller]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
when nil
|
61
|
+
proc{}
|
62
|
+
else raise "Unknown packer type #{packer.class}"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.packer_fiddle_type type
|
67
|
+
if type == Integer || type == Boolean then Fiddle::TYPE_INT
|
68
|
+
elsif type == Float then Fiddle::TYPE_FLOAT
|
69
|
+
elsif type == String then Fiddle::TYPE_CONST_STRING
|
70
|
+
else Fiddle::TYPE_VOIDP
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.parse_unpacker unpacker
|
75
|
+
case unpacker
|
76
|
+
when Proc
|
77
|
+
unpacker
|
78
|
+
when Symbol
|
79
|
+
if unpacker.to_s.start_with? "_"
|
80
|
+
parse_unpacker "abi_unpack#{unpacker}".to_sym
|
81
|
+
else
|
82
|
+
proc do |host, *a|
|
83
|
+
host.send unpacker, *a
|
84
|
+
end
|
85
|
+
end
|
86
|
+
when Class, Module, Enum
|
87
|
+
parse_unpacker "abi_unpack#{abi_const_string_method_suffix unpacker.name}".to_sym
|
88
|
+
when String
|
89
|
+
parse_unpacker "abi_unpack#{abi_const_string_method_suffix unpacker}".to_sym
|
90
|
+
when nil
|
91
|
+
nil
|
92
|
+
else raise "Unknown unpacker type #{unpacker.class}"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.fiddle_type type
|
97
|
+
if type == Integer || type == Boolean then Fiddle::TYPE_INT
|
98
|
+
elsif type == Float then Fiddle::TYPE_FLOAT
|
99
|
+
else Fiddle::TYPE_VOIDP
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
require_relative 'interface_collection_out'
|
104
|
+
require_relative 'interface_composed_out'
|
105
|
+
require_relative 'interface_single_out'
|
106
|
+
|
107
|
+
def self.from packer, unpacker
|
108
|
+
case unpacker
|
109
|
+
when Array then InterfaceComposedOut
|
110
|
+
when Range then InterfaceCollectionOut
|
111
|
+
else InterfaceSingleOut
|
112
|
+
end.from packer, unpacker
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class InterfaceCollectionOut
|
2
|
+
include Interface
|
3
|
+
|
4
|
+
def self.from packer, unpacker
|
5
|
+
self.new Interface.parse_packer(packer), Interface.parse_unpacker(unpacker.min), Interface.fiddle_type(unpacker.min)
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
def initialize packer, unpacker, fiddle_type
|
10
|
+
@packer = packer
|
11
|
+
@unpacker = unpacker
|
12
|
+
# unpacking in block caller allows abi side to free memory on return eg. for strings passed by value
|
13
|
+
@block_caller = Fiddle::Closure::BlockCaller.new(0, [fiddle_type]) do |a|
|
14
|
+
@unpacked << @unpacker.call(@host, a)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Works propertly only for single thread (like whole TGUI btw.)
|
19
|
+
def call host, name, *a
|
20
|
+
a = @packer.call host, *a if @packer
|
21
|
+
@host = host
|
22
|
+
@unpacked = []
|
23
|
+
host.send name, *a, @block_caller
|
24
|
+
unpacked = @unpacked
|
25
|
+
@unpacked = nil
|
26
|
+
@host = nil
|
27
|
+
unpacked
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class InterfaceComposedOut
|
2
|
+
include Interface
|
3
|
+
|
4
|
+
def self.from packer, unpacker
|
5
|
+
self.new Interface.parse_packer(packer), unpacker.map{ Interface.parse_unpacker _1 }, unpacker.map{ Interface.fiddle_type _1 }
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
def initialize packer, unpacker, fiddle_types
|
10
|
+
@packer = packer
|
11
|
+
@unpacker = unpacker
|
12
|
+
# unpacking in block caller allows abi side to free memory on return eg. for strings passed by value
|
13
|
+
@block_caller = Fiddle::Closure::BlockCaller.new(0, fiddle_types) do |*a|
|
14
|
+
@unpacked = @unpacker.zip(a).map{ _1.call @host, _2 }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Works propertly only for single thread (like whole TGUI btw.)
|
19
|
+
def call host, name, *a
|
20
|
+
a = @packer.call host, *a if @packer
|
21
|
+
@host = host
|
22
|
+
host.send name, *a, @block_caller
|
23
|
+
unpacked = @unpacked
|
24
|
+
@unpacked = nil
|
25
|
+
@host = nil
|
26
|
+
unpacked
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class InterfaceSingleOut
|
2
|
+
include Interface
|
3
|
+
|
4
|
+
def self.from packer, unpacker
|
5
|
+
self.new Interface.parse_packer(packer), Interface.parse_unpacker(unpacker)
|
6
|
+
end
|
7
|
+
|
8
|
+
def initialize packer, unpacker
|
9
|
+
@packer = packer
|
10
|
+
@unpacker = unpacker
|
11
|
+
end
|
12
|
+
|
13
|
+
def call host, name, *a
|
14
|
+
a = @packer.call host, *a if @packer
|
15
|
+
received = host.send name, *a
|
16
|
+
@unpacker&.call host, received
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative 'interface/interface'
|
2
|
+
|
3
|
+
module Packer
|
4
|
+
def abi_packer base, &body
|
5
|
+
if block_given?
|
6
|
+
define_method abi_packer_method_name(base), &body
|
7
|
+
elsif base.is_a? Module
|
8
|
+
define_method abi_packer_method_name(base) do |*o|
|
9
|
+
base.from *o
|
10
|
+
end
|
11
|
+
else
|
12
|
+
raise "..."
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def abi_packer_method_name base
|
17
|
+
case base
|
18
|
+
when String then "abi_pack#{Interface.abi_const_string_method_suffix base}".to_sym
|
19
|
+
when Symbol then base.to_s.start_with?("_") ? "abi_pack#{base}".to_sym : base
|
20
|
+
else "abi_pack#{Interface.abi_const_string_method_suffix base.name}".to_sym
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def abi_pack host, type, *a
|
25
|
+
Interface.parse_packer(type).call host, *a
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative 'interface/interface'
|
2
|
+
|
3
|
+
module Unpacker
|
4
|
+
def abi_unpacker base, &body
|
5
|
+
if block_given?
|
6
|
+
define_method abi_unpacker_method_name(base), &body
|
7
|
+
elsif base.is_a? Module
|
8
|
+
define_method abi_unpacker_method_name(base) do |o|
|
9
|
+
base.new pointer: o
|
10
|
+
end
|
11
|
+
else
|
12
|
+
raise "..."
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def abi_unpacker_method_name base
|
17
|
+
case base
|
18
|
+
when String then "abi_unpack#{Interface.abi_const_string_method_suffix base}".to_sym
|
19
|
+
when Symbol then base.to_s.start_with?("_") ? "abi_unpack#{base}".to_sym : base
|
20
|
+
else "abi_unpack#{Interface.abi_const_string_method_suffix base.name}".to_sym
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def abi_unpack host, type, object
|
25
|
+
Interface.parse_unpacker(type).call host, object
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Tgui
|
2
|
+
module ApiChild
|
3
|
+
API_CHILD_PREFIX = "api_child_".freeze
|
4
|
+
|
5
|
+
def api_child name, original_name = nil, &b
|
6
|
+
if block_given?
|
7
|
+
define_method "#{API_CHILD_PREFIX}#{name}", &b
|
8
|
+
else
|
9
|
+
if original_name
|
10
|
+
if original_name.end_with? "_"
|
11
|
+
abi_name = "_abi_#{original_name}#{name}".delete_suffix("=").delete_suffix("?").to_sym
|
12
|
+
else
|
13
|
+
abi_name = "_abi_#{original_name}".to_sym
|
14
|
+
end
|
15
|
+
else
|
16
|
+
if name.end_with? "?"
|
17
|
+
abi_name = "_abi_is_#{name}".delete_suffix("?").to_sym
|
18
|
+
elsif name.end_with? "="
|
19
|
+
abi_name = "_abi_set_#{name}".delete_suffix("=").to_sym
|
20
|
+
else
|
21
|
+
abi_name = "_abi_#{name}".to_sym
|
22
|
+
end
|
23
|
+
end
|
24
|
+
define_method "#{API_CHILD_PREFIX}#{name}" do |*a|
|
25
|
+
send(abi_name, *a)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require_relative 'bang_nested_caller'
|
2
|
+
|
3
|
+
module BangNest
|
4
|
+
include BangNestedCaller
|
5
|
+
|
6
|
+
def respond_to? name
|
7
|
+
super || bang_respond_to?(name)
|
8
|
+
end
|
9
|
+
|
10
|
+
def method_missing name, *a, **na, &b
|
11
|
+
if name.end_with? "!"
|
12
|
+
bang_method_missing name, *a, **na, &b
|
13
|
+
else super
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module BangNestedCaller
|
2
|
+
def bang_respond_to? name
|
3
|
+
name.end_with?("!") && (respond_to?("#{name[...-1]}=") || respond_to?("api_bang_#{name[...-1]}") || (@bang_target && @bang_target.respond_to?(name)))
|
4
|
+
end
|
5
|
+
|
6
|
+
def bang_method_missing name, *a, **na, &b
|
7
|
+
return @bang_target.send(name, *a, **na, &b) if @bang_target && @bang_target.respond_to?(name)
|
8
|
+
|
9
|
+
api_name = "api_bang_#{name[...-1]}".to_sym
|
10
|
+
return send(api_name, *a, **na, &b) if respond_to? api_name
|
11
|
+
|
12
|
+
setter = "#{name[...-1]}=".to_sym
|
13
|
+
if respond_to? setter
|
14
|
+
return send(setter, a) if !a.empty?
|
15
|
+
return send(setter, na) if !na.empty?
|
16
|
+
return send(setter, b) if block_given?
|
17
|
+
return send(setter)
|
18
|
+
end
|
19
|
+
|
20
|
+
no_method_error = NoMethodError.new("undefined bang nested method `#{name}` for #{bang_object_stack.map(&:class).join("/")}")
|
21
|
+
raise no_method_error
|
22
|
+
end
|
23
|
+
|
24
|
+
def self!
|
25
|
+
@bang_target&.respond_to?(:self!) ? @bang_target.self! : self
|
26
|
+
end
|
27
|
+
|
28
|
+
def bang_object_stack root = true
|
29
|
+
stack = []
|
30
|
+
stack << self if root
|
31
|
+
stack << @bang_target if @bang_target
|
32
|
+
stack += @bang_target.bang_object_stack(false) if @bang_target&.respond_to? :bang_object_stack
|
33
|
+
return stack
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
def upon! item, **na, &b
|
38
|
+
na.each do |k, v|
|
39
|
+
item.send("#{k}=", v)
|
40
|
+
end
|
41
|
+
if b
|
42
|
+
@bang_target, original_bang_target = item, @bang_target
|
43
|
+
b.call item
|
44
|
+
@bang_target = original_bang_target
|
45
|
+
end
|
46
|
+
item
|
47
|
+
end
|
48
|
+
end
|