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 if char <> '`' then 28 update_focus 29 if focus ? Some control then 30 if control is TextEditControl then 31 control.process_char char } 32 33 let keys_token = os_window.keys.subscribe { key, action, mods -> 34 update_focus 35 if focus ? Some control then 36 if control is TextEditControl then 37 control.process_key key action mods } 38 39 fun destruct = 40 keys_token.discard 41 chars_token.discard 42 focus_token.discard 43