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