1 type Display = 2 let os_window : OsWindow 3 var obs focus : Option<Control> @mut = None 4 var obs frame_start_focus : Option<Control> = None 5 val controls @mut = List<Control>.new 6 val overlay = Overlay.new 7 8 let focus_token = focus@atom.option_bind_revert 9 { _.is_focused = true } 10 { _.is_focused = false } 11 12 def update_focus = 13 if focus ? Some control then 14 if not control.is_focused then 15 focus = None 16 17 def update = 18 update_focus 19 frame_start_focus = focus 20 21 for control in controls do 22 assert control.width > 0 && control.height > 0 23 control/measure_clamped control u32.max u32.max 24 control.arrange 25 26 let chars_token = os_window.chars.subscribe { char -> 27 update_focus 28 if focus ? Some control then 29 if control is TextEditControl then 30 control.process_char char } 31 32 let keys_token = os_window.keys.subscribe { key, action, mods -> 33 update_focus 34 if focus ? Some control then 35 if control is TextEditControl then 36 control.process_key key action mods } 37 38 fun destruct = 39 keys_token.discard 40 chars_token.discard 41 focus_token.discard 42