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.
Files changed (154) hide show
  1. checksums.yaml +7 -0
  2. data/ext/dll/openal32.dll +0 -0
  3. data/ext/dll/sfml-audio-2.dll +0 -0
  4. data/ext/dll/sfml-graphics-2.dll +0 -0
  5. data/ext/dll/sfml-network-2.dll +0 -0
  6. data/ext/dll/sfml-system-2.dll +0 -0
  7. data/ext/dll/sfml-window-2.dll +0 -0
  8. data/ext/dll/tgui.dll +0 -0
  9. data/ext/so/libsfml-audio.so +0 -0
  10. data/ext/so/libsfml-graphics.so +0 -0
  11. data/ext/so/libsfml-network.so +0 -0
  12. data/ext/so/libsfml-system.so +0 -0
  13. data/ext/so/libsfml-window.so +0 -0
  14. data/ext/so/libtgui.so +0 -0
  15. data/lib/white_gold/abi/alias.rb +50 -0
  16. data/lib/white_gold/abi/enum.rb +43 -0
  17. data/lib/white_gold/abi/extern_object.rb +180 -0
  18. data/lib/white_gold/abi/interface/interface.rb +114 -0
  19. data/lib/white_gold/abi/interface/interface_collection_out.rb +29 -0
  20. data/lib/white_gold/abi/interface/interface_composed_out.rb +28 -0
  21. data/lib/white_gold/abi/interface/interface_single_out.rb +19 -0
  22. data/lib/white_gold/abi/packer.rb +28 -0
  23. data/lib/white_gold/abi/reducer.rb +12 -0
  24. data/lib/white_gold/abi/unpacker.rb +27 -0
  25. data/lib/white_gold/convention/api_child.rb +30 -0
  26. data/lib/white_gold/convention/bang_def.rb +5 -0
  27. data/lib/white_gold/convention/bang_nest.rb +16 -0
  28. data/lib/white_gold/convention/bang_nested_caller.rb +48 -0
  29. data/lib/white_gold/convention/bool_property.rb +13 -0
  30. data/lib/white_gold/convention/boolean.rb +2 -0
  31. data/lib/white_gold/convention/club.rb +26 -0
  32. data/lib/white_gold/convention/container_widgets.rb +181 -0
  33. data/lib/white_gold/convention/page.rb +96 -0
  34. data/lib/white_gold/convention/proc_method_factory.rb +22 -0
  35. data/lib/white_gold/convention/unit.rb +22 -0
  36. data/lib/white_gold/convention/widget_like.rb +146 -0
  37. data/lib/white_gold/dsl/backend_gui.rb +37 -0
  38. data/lib/white_gold/dsl/bitmap_button.rb +11 -0
  39. data/lib/white_gold/dsl/box_layout.rb +47 -0
  40. data/lib/white_gold/dsl/box_layout_ratios.rb +13 -0
  41. data/lib/white_gold/dsl/button.rb +10 -0
  42. data/lib/white_gold/dsl/button_base.rb +18 -0
  43. data/lib/white_gold/dsl/chat_box.rb +65 -0
  44. data/lib/white_gold/dsl/checkbox.rb +6 -0
  45. data/lib/white_gold/dsl/child_window.rb +47 -0
  46. data/lib/white_gold/dsl/clickable_widget.rb +15 -0
  47. data/lib/white_gold/dsl/color.rb +124 -0
  48. data/lib/white_gold/dsl/color_picker.rb +12 -0
  49. data/lib/white_gold/dsl/combo_box.rb +135 -0
  50. data/lib/white_gold/dsl/container.rb +95 -0
  51. data/lib/white_gold/dsl/edit_box.rb +38 -0
  52. data/lib/white_gold/dsl/file_dialog.rb +86 -0
  53. data/lib/white_gold/dsl/font.rb +23 -0
  54. data/lib/white_gold/dsl/grid.rb +131 -0
  55. data/lib/white_gold/dsl/group.rb +6 -0
  56. data/lib/white_gold/dsl/gui.rb +16 -0
  57. data/lib/white_gold/dsl/horizontal_layout.rb +6 -0
  58. data/lib/white_gold/dsl/horizontal_wrap.rb +6 -0
  59. data/lib/white_gold/dsl/knob.rb +16 -0
  60. data/lib/white_gold/dsl/label.rb +21 -0
  61. data/lib/white_gold/dsl/list_box.rb +125 -0
  62. data/lib/white_gold/dsl/list_view.rb +239 -0
  63. data/lib/white_gold/dsl/menu_bar.rb +252 -0
  64. data/lib/white_gold/dsl/message_box.rb +90 -0
  65. data/lib/white_gold/dsl/outline.rb +52 -0
  66. data/lib/white_gold/dsl/panel.rb +16 -0
  67. data/lib/white_gold/dsl/panel_list_box.rb +83 -0
  68. data/lib/white_gold/dsl/picture.rb +12 -0
  69. data/lib/white_gold/dsl/progress_bar.rb +19 -0
  70. data/lib/white_gold/dsl/radio_button.rb +18 -0
  71. data/lib/white_gold/dsl/radio_button_group.rb +14 -0
  72. data/lib/white_gold/dsl/range_slider.rb +15 -0
  73. data/lib/white_gold/dsl/rich_text_label.rb +6 -0
  74. data/lib/white_gold/dsl/scrollable_panel.rb +53 -0
  75. data/lib/white_gold/dsl/scrollbar.rb +28 -0
  76. data/lib/white_gold/dsl/separator_line.rb +6 -0
  77. data/lib/white_gold/dsl/signal/global_signal.rb +33 -0
  78. data/lib/white_gold/dsl/signal/signal.rb +44 -0
  79. data/lib/white_gold/dsl/signal/signal_animation_type.rb +16 -0
  80. data/lib/white_gold/dsl/signal/signal_bool.rb +16 -0
  81. data/lib/white_gold/dsl/signal/signal_color.rb +16 -0
  82. data/lib/white_gold/dsl/signal/signal_float.rb +16 -0
  83. data/lib/white_gold/dsl/signal/signal_int.rb +16 -0
  84. data/lib/white_gold/dsl/signal/signal_item.rb +6 -0
  85. data/lib/white_gold/dsl/signal/signal_item_hierarchy.rb +9 -0
  86. data/lib/white_gold/dsl/signal/signal_panel_list_box_item.rb +7 -0
  87. data/lib/white_gold/dsl/signal/signal_pointer.rb +15 -0
  88. data/lib/white_gold/dsl/signal/signal_range.rb +15 -0
  89. data/lib/white_gold/dsl/signal/signal_show_effect.rb +17 -0
  90. data/lib/white_gold/dsl/signal/signal_string.rb +16 -0
  91. data/lib/white_gold/dsl/signal/signal_typed_int_bool_ptr.rb +15 -0
  92. data/lib/white_gold/dsl/signal/signal_typed_size_t.rb +6 -0
  93. data/lib/white_gold/dsl/signal/signal_u_int.rb +16 -0
  94. data/lib/white_gold/dsl/signal/signal_vector2f.rb +14 -0
  95. data/lib/white_gold/dsl/slider.rb +26 -0
  96. data/lib/white_gold/dsl/spin_button.rb +24 -0
  97. data/lib/white_gold/dsl/spin_control.rb +15 -0
  98. data/lib/white_gold/dsl/subwidget_container.rb +9 -0
  99. data/lib/white_gold/dsl/tab_container.rb +121 -0
  100. data/lib/white_gold/dsl/tabs.rb +91 -0
  101. data/lib/white_gold/dsl/text_area.rb +34 -0
  102. data/lib/white_gold/dsl/texture.rb +53 -0
  103. data/lib/white_gold/dsl/theme/boolean_attribute.rb +13 -0
  104. data/lib/white_gold/dsl/theme/button_theme.rb +19 -0
  105. data/lib/white_gold/dsl/theme/chat_box_theme.rb +16 -0
  106. data/lib/white_gold/dsl/theme/child_window_theme.rb +25 -0
  107. data/lib/white_gold/dsl/theme/color_attribute.rb +13 -0
  108. data/lib/white_gold/dsl/theme/color_picker_theme.rb +14 -0
  109. data/lib/white_gold/dsl/theme/combo_box_theme.rb +33 -0
  110. data/lib/white_gold/dsl/theme/common_renderer.rb +7 -0
  111. data/lib/white_gold/dsl/theme/edit_box_theme.rb +34 -0
  112. data/lib/white_gold/dsl/theme/file_dialog_theme.rb +22 -0
  113. data/lib/white_gold/dsl/theme/float_attribute.rb +13 -0
  114. data/lib/white_gold/dsl/theme/group_theme.rb +9 -0
  115. data/lib/white_gold/dsl/theme/knob_theme.rb +15 -0
  116. data/lib/white_gold/dsl/theme/label_theme.rb +20 -0
  117. data/lib/white_gold/dsl/theme/list_box_theme.rb +25 -0
  118. data/lib/white_gold/dsl/theme/list_view_theme.rb +27 -0
  119. data/lib/white_gold/dsl/theme/menu_bar_theme.rb +21 -0
  120. data/lib/white_gold/dsl/theme/message_box_theme.rb +11 -0
  121. data/lib/white_gold/dsl/theme/outline_attribute.rb +13 -0
  122. data/lib/white_gold/dsl/theme/progress_bar_theme.rb +19 -0
  123. data/lib/white_gold/dsl/theme/radio_button_theme.rb +30 -0
  124. data/lib/white_gold/dsl/theme/scrollbar_theme.rb +24 -0
  125. data/lib/white_gold/dsl/theme/separator_line_theme.rb +9 -0
  126. data/lib/white_gold/dsl/theme/slider_theme.rb +20 -0
  127. data/lib/white_gold/dsl/theme/spin_button_theme.rb +19 -0
  128. data/lib/white_gold/dsl/theme/tabs_theme.rb +29 -0
  129. data/lib/white_gold/dsl/theme/text_area_theme.rb +22 -0
  130. data/lib/white_gold/dsl/theme/text_styles_attribute.rb +13 -0
  131. data/lib/white_gold/dsl/theme/texture_attribute.rb +17 -0
  132. data/lib/white_gold/dsl/theme/theme_attributed.rb +51 -0
  133. data/lib/white_gold/dsl/theme/theme_component.rb +23 -0
  134. data/lib/white_gold/dsl/theme/tree_view_theme.rb +26 -0
  135. data/lib/white_gold/dsl/theme/widget_theme.rb +12 -0
  136. data/lib/white_gold/dsl/theme.rb +144 -0
  137. data/lib/white_gold/dsl/toggle_button.rb +10 -0
  138. data/lib/white_gold/dsl/tool_tip.rb +21 -0
  139. data/lib/white_gold/dsl/tree_view.rb +186 -0
  140. data/lib/white_gold/dsl/util.rb +17 -0
  141. data/lib/white_gold/dsl/vertical_layout.rb +6 -0
  142. data/lib/white_gold/dsl/widget.rb +279 -0
  143. data/lib/white_gold/dsl/window.rb +16 -0
  144. data/lib/white_gold/generated/tgui-abi-loader.gf.rb +1813 -0
  145. data/lib/white_gold/library/theme/light.rb +111 -0
  146. data/lib/white_gold/master.rb +170 -0
  147. data/lib/white_gold/path/kernel.path.rb +3 -0
  148. data/lib/white_gold/path/numeric.path.rb +9 -0
  149. data/lib/white_gold/path/object.path.rb +22 -0
  150. data/lib/white_gold/path/string.path.rb +5 -0
  151. data/lib/white_gold/tgui-abi.rb +255 -0
  152. data/lib/white_gold/tgui-config.rb +20 -0
  153. data/lib/white_gold.rb +47 -0
  154. 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,12 @@
1
+ class Reducer
2
+ def initialize reduction, &block
3
+ @reduction = reduction
4
+ @block = block
5
+ end
6
+
7
+ def call *a
8
+ block.call *a
9
+ end
10
+
11
+ attr :reduction
12
+ end
@@ -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,5 @@
1
+ module BangDef
2
+ def def! name, &b
3
+ define_method "api_bang_#{name}", &b
4
+ end
5
+ 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