white_gold 0.0.1
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 +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
|