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}