$ Window drags cause a full redraw in the affected area
awm2/src/desktop.rs
fn handle_mouse_moved(&mut self, _new_pos: Point, rel_shift: Point) {
if let MouseInteractionState::PerformingWindowDrag(dragged_window) =
&self.mouse_interaction_state
{
// We're in the middle of dragging a window
let prev_frame = dragged_window.frame();
// Bind the window to the area that windows can be placed within
let new_frame = self.bind_rect_to_windows_region(
dragged_window
.frame()
.replace_origin(dragged_window.frame().origin + rel_shift),
);
dragged_window.set_frame(new_frame);
+ self.queue_compositor_updates_for_old_and_new_element_frame(prev_frame, new_frame);
...
}
}
+fn queue_compositor_updates_for_old_and_new_element_frame(
+ &mut self,
+ old_elem_frame: Rect,
+ new_elem_frame: Rect,
+) {
+ let update_rect = old_elem_frame.union(new_elem_frame);
+ if new_elem_frame.intersects_with(old_elem_frame) {
+ // PT: area_excluding_rect() can only give sane results when the input rects overlap
+ for diff_rect in old_elem_frame.area_excluding_rect(new_elem_frame) {
+ self.compositor_state.queue_full_redraw(diff_rect);
+ }
+ } else {
+ self.compositor_state.queue_full_redraw(update_rect);
+ }
+}