summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/window.rs28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/window.rs b/src/window.rs
index c33f5aa..72ae143 100644
--- a/src/window.rs
+++ b/src/window.rs
@@ -13,7 +13,7 @@ pub struct Window {
surface: softbuffer::Surface,
surface_dimensions: Dimensions,
#[allow(dead_code)] context: softbuffer::Context,
- current_render_hint: RenderHint,
+ render_request: RenderRequest,
previous_cursor_position: Option<Point>,
}
@@ -53,7 +53,7 @@ impl Window {
surface,
surface_dimensions: Dimensions::ZERO,
context,
- current_render_hint: RenderHint::Redraw,
+ render_request: RenderRequest::REDRAW,
previous_cursor_position: None,
}
}
@@ -89,7 +89,7 @@ impl Window {
self.window.set_min_inner_size(Some(size));
self.window.set_max_inner_size(Some(size));
self.window.set_inner_size(size);
- self.current_render_hint = RenderHint::Redraw;
+ self.render_request = RenderRequest::REDRAW;
self.resize_buffer_and_surface(dimensions * pixel_scale);
} else {
self.window.set_resizable(true);
@@ -100,7 +100,7 @@ impl Window {
if pixel_scale != self.pixel_scale {
let increment = PhysicalSize { width: pixel_scale, height: pixel_scale };
self.window.set_resize_increments(Some(increment));
- self.current_render_hint = RenderHint::Redraw;
+ self.render_request = RenderRequest::REDRAW;
self.resize_buffer_and_surface(self.surface_dimensions);
}
}
@@ -121,7 +121,7 @@ impl Window {
if logical_dimensions != self.buffer.dimensions() {
self.buffer.resize(logical_dimensions);
self.controller.on_resize(logical_dimensions);
- self.current_render_hint = RenderHint::Redraw;
+ self.render_request = RenderRequest::REDRAW;
}
}
@@ -139,9 +139,9 @@ impl Window {
pub fn handle_render_request(&mut self) {
if let RenderRequest::Render(hint) = self.controller.render_request() {
- self.current_render_hint &= hint;
+ self.render_request &= RenderRequest::Render(hint);
self.window.request_redraw();
- } else if self.current_render_hint.is_redraw() {
+ } else if let RenderRequest::Render(_) = self.render_request {
self.window.request_redraw();
}
}
@@ -157,7 +157,15 @@ impl Window {
let scale = self.pixel_scale as usize;
let physical_dim = self.surface_dimensions;
let logical_dim = self.buffer.dimensions();
- self.controller.on_render(&mut self.buffer, self.current_render_hint);
+
+ // Return early if this render wasn't requested by us. Unrequested
+ // renders have been observed under Windows 10.
+ if let RenderRequest::Render(hint) = self.render_request {
+ self.controller.on_render(&mut self.buffer, hint);
+ } else {
+ return;
+ }
+
let buffer = self.buffer.as_u32_slice();
let mut surface = self.surface.buffer_mut().unwrap();
@@ -199,8 +207,8 @@ impl Window {
}
surface.present().unwrap();
- // Reset current_render_hint back to the lowest variant for the next frame.
- self.current_render_hint = RenderHint::Update;
+ // Reset render_request back to the lowest variant for the next frame.
+ self.render_request = RenderRequest::None;
}
}