diff --git a/komorebi/src/border_manager/border.rs b/komorebi/src/border_manager/border.rs index 2d0d1e51..4e13970a 100644 --- a/komorebi/src/border_manager/border.rs +++ b/komorebi/src/border_manager/border.rs @@ -548,7 +548,12 @@ impl Border { LRESULT(0) } WM_DESTROY => { - SetWindowLongPtrW(window, GWLP_USERDATA, 0); + let border_pointer: *mut Border = GetWindowLongPtrW(window, GWLP_USERDATA) as _; + if !border_pointer.is_null() { + (*border_pointer).render_target = None; + (*border_pointer).brushes.clear(); + SetWindowLongPtrW(window, GWLP_USERDATA, 0); + } PostQuitMessage(0); LRESULT(0) } diff --git a/komorebi/src/border_manager/mod.rs b/komorebi/src/border_manager/mod.rs index 0280164d..6326f826 100644 --- a/komorebi/src/border_manager/mod.rs +++ b/komorebi/src/border_manager/mod.rs @@ -767,12 +767,6 @@ fn remove_border( fn destroy_border(border: Box) -> color_eyre::Result<()> { let raw_pointer = Box::into_raw(border); unsafe { - // release d2d resources **BEFORE** destroying window - // this drops render_target and brushes while HWND is still valid - // prevents EndDraw() from accessing freed HWND resources - (*raw_pointer).render_target = None; - (*raw_pointer).brushes.clear(); - // Now safe to destroy window (*raw_pointer).destroy()?; }