makepad_platform/os/
cx_shared.rs1
2use {
3    std::collections::{HashSet, HashMap},
4    crate::{
5        makepad_error_log::*,
6        cx::Cx,
7        pass::{
8            PassId,
9            CxPassParent
10        },
11        event::{
12            DrawEvent,
13            TriggerEvent,
14            Event,
15            KeyFocusEvent,
16            NextFrameEvent,
17        },
18    }
19};
20
21impl Cx {
22    #[allow(dead_code)]
23    pub (crate) fn repaint_windows(&mut self) {
24        for pass_id in self.passes.id_iter() {
25            match self.passes[pass_id].parent {
26                CxPassParent::Window(_) => {
27                    self.passes[pass_id].paint_dirty = true;
28                },
29                _ => ()
30            }
31        }
32    }
33    
34    pub (crate) fn any_passes_dirty(&self) -> bool {
35        for pass_id in self.passes.id_iter() {
36            if self.passes[pass_id].paint_dirty {
37                return true
38            }
39        }
40        false
41    }
42    
43    pub (crate) fn compute_pass_repaint_order(&mut self, passes_todo: &mut Vec<PassId>) {
44        passes_todo.clear();
45        
46        loop { let mut altered = false;
49            for pass_id in self.passes.id_iter(){
50                if self.passes[pass_id].paint_dirty {
51                    let other = match self.passes[pass_id].parent {
52                        CxPassParent::Pass(parent_pass_id) => {
53                            Some(parent_pass_id)
54                        }
55                        _ => None
56                    };
57                    if let Some(other) = other {
58                        if !self.passes[other].paint_dirty {
59                            self.passes[other].paint_dirty = true;
60                            altered = true;
61                        }
62                    }
63                }
64            }
65            if !altered {
66                break
67            }
68        }
69        
70        for pass_id in self.passes.id_iter(){
71            if self.passes[pass_id].paint_dirty {
72                let mut inserted = false;
73                match self.passes[pass_id].parent {
74                    CxPassParent::Window(_) => {
75                    },
76                    CxPassParent::Pass(dep_of_pass_id) => {
77                        if pass_id == dep_of_pass_id {
78                            panic!()
79                        }
80                        for insert_before in 0..passes_todo.len() {
81                            if passes_todo[insert_before] == dep_of_pass_id {
82                                passes_todo.insert(insert_before, pass_id);
83                                inserted = true;
84                                break;
85                            }
86                        }
87                    },
88                    CxPassParent::None => { passes_todo.insert(0, pass_id);
90                        inserted = true;
91                    },
92                }
93                if !inserted {
94                    passes_todo.push(pass_id);
95                }
96            }
97        }
98        
99    }
100    
101    pub (crate) fn need_redrawing(&self) -> bool {
102        self.new_draw_event.will_redraw()
103    }
104    
105    
106    
107    
108    pub (crate) fn inner_call_event_handler(&mut self, event: &Event) {
112        self.event_id += 1;
113        let mut event_handler = self.event_handler.take().unwrap();
114        event_handler(self, event);
115        self.event_handler = Some(event_handler);
116    }
117    
118    fn inner_key_focus_change(&mut self) {
119        if let Some((prev, focus)) = self.keyboard.cycle_key_focus_changed(){
120            self.inner_call_event_handler(&Event::KeyFocus(KeyFocusEvent {
121                prev,
122                focus
123            }));
124        }
125    }
126    
127    pub fn handle_triggers(&mut self) {
128        let mut counter = 0;
130        while self.triggers.len() != 0 {
131            counter += 1;
132            let mut triggers = HashMap::new();
133            std::mem::swap(&mut self.triggers, &mut triggers);
134            self.inner_call_event_handler(&Event::Trigger(TriggerEvent {
135                triggers: triggers,
136            }));
137            self.inner_key_focus_change();
138            if counter > 100 {
139                error!("Trigger feedback loop detected");
140                break
141            }
142        }
143    }
144    
145    pub (crate) fn call_event_handler(&mut self, event: &Event) {
146        self.inner_call_event_handler(event);
147        self.inner_key_focus_change();
148        self.handle_triggers();
149    }
150
151    pub (crate) fn call_draw_event(&mut self) {
162        let mut draw_event = DrawEvent::default();
163        std::mem::swap(&mut draw_event, &mut self.new_draw_event);
164        self.call_event_handler(&Event::Draw(draw_event));
165    }
166
167    pub (crate) fn call_next_frame_event(&mut self, time: f64) {
168        let mut set = HashSet::default();
169        std::mem::swap(&mut set, &mut self.new_next_frames);
170        self.call_event_handler(&Event::NextFrame(NextFrameEvent {set, time: time, frame: self.repaint_id}));
171    }
172}