white_gold 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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