浏览代码

wallet: editbox fix race condition

darkfi 2 年之前
父节点
当前提交
8e54b470bd
共有 2 个文件被更改,包括 10 次插入9 次删除
  1. 2 2
      bin/darkwallet/src/app.rs
  2. 8 7
      bin/darkwallet/src/ui/editbox.rs

+ 2 - 2
bin/darkwallet/src/app.rs

@@ -402,10 +402,10 @@ impl App {
         let prop = node.get_property("rect").unwrap();
         let prop = node.get_property("rect").unwrap();
         prop.set_f32(0, 0.).unwrap();
         prop.set_f32(0, 0.).unwrap();
         prop.set_f32(1, 0.).unwrap();
         prop.set_f32(1, 0.).unwrap();
-        let code = vec![Op::LoadVar("lw".to_string())];
+        let code = vec![Op::LoadVar("w".to_string())];
         prop.set_expr(2, code).unwrap();
         prop.set_expr(2, code).unwrap();
         let code = vec![Op::Sub((
         let code = vec![Op::Sub((
-            Box::new(Op::LoadVar("lh".to_string())),
+            Box::new(Op::LoadVar("h".to_string())),
             Box::new(Op::ConstFloat32(50.)),
             Box::new(Op::ConstFloat32(50.)),
         ))];
         ))];
         prop.set_expr(3, code).unwrap();
         prop.set_expr(3, code).unwrap();

+ 8 - 7
bin/darkwallet/src/ui/editbox.rs

@@ -279,14 +279,17 @@ impl EditBox {
             }
             }
             on_modify.when_change(rect.clone(), redraw);
             on_modify.when_change(rect.clone(), redraw);
             on_modify.when_change(baseline.prop(), redraw);
             on_modify.when_change(baseline.prop(), redraw);
-            on_modify.when_change(scroll.prop(), redraw);
-            on_modify.when_change(cursor_pos.prop(), redraw);
+            // The commented properties are modified on input events
+            // So then redraw() will get repeatedly triggered when these properties
+            // are changed. We should find a solution. For now the hooks are disabled.
+            //on_modify.when_change(scroll.prop(), redraw);
+            //on_modify.when_change(cursor_pos.prop(), redraw);
             on_modify.when_change(font_size.prop(), redraw);
             on_modify.when_change(font_size.prop(), redraw);
             on_modify.when_change(text.prop(), redraw);
             on_modify.when_change(text.prop(), redraw);
             on_modify.when_change(text_color.prop(), redraw);
             on_modify.when_change(text_color.prop(), redraw);
             on_modify.when_change(cursor_color.prop(), redraw);
             on_modify.when_change(cursor_color.prop(), redraw);
             on_modify.when_change(hi_bg_color.prop(), redraw);
             on_modify.when_change(hi_bg_color.prop(), redraw);
-            on_modify.when_change(selected.clone(), redraw);
+            //on_modify.when_change(selected.clone(), redraw);
             on_modify.when_change(z_index.prop(), redraw);
             on_modify.when_change(z_index.prop(), redraw);
             on_modify.when_change(debug.prop(), redraw);
             on_modify.when_change(debug.prop(), redraw);
 
 
@@ -1119,14 +1122,12 @@ impl EditBox {
     }
     }
 
 
     async fn redraw(&self) {
     async fn redraw(&self) {
-        let old = self.render_info.lock().unwrap().clone();
+        // draw will recalc this when it's None
+        let old = std::mem::replace(&mut *self.render_info.lock().unwrap(), None);
 
 
         let glyphs = self.text_shaper.shape(self.text.get(), self.font_size.get()).await;
         let glyphs = self.text_shaper.shape(self.text.get(), self.font_size.get()).await;
         *self.glyphs.lock().unwrap() = glyphs;
         *self.glyphs.lock().unwrap() = glyphs;
 
 
-        // draw will recalc this when it's None
-        *self.render_info.lock().unwrap() = None;
-
         let sg = self.sg.lock().await;
         let sg = self.sg.lock().await;
         let node = sg.get_node(self.node_id).unwrap();
         let node = sg.get_node(self.node_id).unwrap();