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