Skip to content

Commit d763c33

Browse files
thearturcaLGUG2Z
authored andcommitted
refactor(animation): force app rerenders
1 parent f8ea62f commit d763c33

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

komorebi/src/window.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ use std::time::Duration;
6060
use strum::Display;
6161
use strum::EnumString;
6262
use windows::Win32::Foundation::HWND;
63+
use windows::Win32::Graphics::Dwm::DwmFlush;
6364

6465
pub static MINIMUM_WIDTH: AtomicI32 = AtomicI32::new(0);
6566
pub static MINIMUM_HEIGHT: AtomicI32 = AtomicI32::new(0);
@@ -197,6 +198,8 @@ impl RenderDispatcher for MovementRenderDispatcher {
197198
stackbar_manager::STACKBAR_TEMPORARILY_DISABLED.store(true, Ordering::SeqCst);
198199
stackbar_manager::send_notification();
199200

201+
WindowsApi::send_enter_size_move(self.hwnd)?;
202+
200203
Ok(())
201204
}
202205

@@ -205,16 +208,22 @@ impl RenderDispatcher for MovementRenderDispatcher {
205208

206209
// we don't check WINDOW_HANDLING_BEHAVIOUR here because animations
207210
// are always run on a separate thread
208-
WindowsApi::move_window(self.hwnd, &new_rect, false)?;
209-
WindowsApi::invalidate_rect(self.hwnd, None, false);
211+
WindowsApi::move_window(self.hwnd, &new_rect, true)?;
212+
213+
// force window redraw
214+
WindowsApi::invalidate_rect(self.hwnd, None, true);
215+
WindowsApi::update_window(self.hwnd);
210216

217+
// wait for dwm to flush render queue
218+
unsafe { DwmFlush() }?;
211219
Ok(())
212220
}
213221

214222
fn post_render(&self) -> Result<()> {
215223
// we don't add the async_window_pos flag here because animations
216224
// are always run on a separate thread
217225
WindowsApi::position_window(self.hwnd, &self.target_rect, self.top, false)?;
226+
WindowsApi::send_exit_size_move(self.hwnd)?;
218227
if ANIMATION_MANAGER
219228
.lock()
220229
.count_in_progress(MovementRenderDispatcher::PREFIX)

komorebi/src/windows_api.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ use windows::Win32::Graphics::Gdi::MonitorFromPoint;
4141
use windows::Win32::Graphics::Gdi::MonitorFromWindow;
4242
use windows::Win32::Graphics::Gdi::Rectangle;
4343
use windows::Win32::Graphics::Gdi::RoundRect;
44+
use windows::Win32::Graphics::Gdi::UpdateWindow;
4445
use windows::Win32::Graphics::Gdi::HBRUSH;
4546
use windows::Win32::Graphics::Gdi::HDC;
4647
use windows::Win32::Graphics::Gdi::HMONITOR;
@@ -100,6 +101,7 @@ use windows::Win32::UI::WindowsAndMessaging::PostMessageW;
100101
use windows::Win32::UI::WindowsAndMessaging::RealGetWindowClassW;
101102
use windows::Win32::UI::WindowsAndMessaging::RegisterClassW;
102103
use windows::Win32::UI::WindowsAndMessaging::RegisterDeviceNotificationW;
104+
use windows::Win32::UI::WindowsAndMessaging::SendMessageW;
103105
use windows::Win32::UI::WindowsAndMessaging::SetCursorPos;
104106
use windows::Win32::UI::WindowsAndMessaging::SetForegroundWindow;
105107
use windows::Win32::UI::WindowsAndMessaging::SetLayeredWindowAttributes;
@@ -139,6 +141,8 @@ use windows::Win32::UI::WindowsAndMessaging::SYSTEM_PARAMETERS_INFO_ACTION;
139141
use windows::Win32::UI::WindowsAndMessaging::SYSTEM_PARAMETERS_INFO_UPDATE_FLAGS;
140142
use windows::Win32::UI::WindowsAndMessaging::WINDOW_LONG_PTR_INDEX;
141143
use windows::Win32::UI::WindowsAndMessaging::WM_CLOSE;
144+
use windows::Win32::UI::WindowsAndMessaging::WM_ENTERSIZEMOVE;
145+
use windows::Win32::UI::WindowsAndMessaging::WM_EXITSIZEMOVE;
142146
use windows::Win32::UI::WindowsAndMessaging::WNDCLASSW;
143147
use windows::Win32::UI::WindowsAndMessaging::WNDENUMPROC;
144148
use windows::Win32::UI::WindowsAndMessaging::WS_DISABLED;
@@ -1360,6 +1364,24 @@ impl WindowsApi {
13601364
unsafe { InvalidateRect(Option::from(HWND(as_ptr!(hwnd))), rect, erase) }.as_bool()
13611365
}
13621366

1367+
pub fn send_enter_size_move(hwnd: isize) -> Result<()> {
1368+
unsafe {
1369+
SendMessageW(HWND(as_ptr!(hwnd)), WM_ENTERSIZEMOVE, None, None);
1370+
Ok(())
1371+
}
1372+
}
1373+
1374+
pub fn send_exit_size_move(hwnd: isize) -> Result<()> {
1375+
unsafe {
1376+
SendMessageW(HWND(as_ptr!(hwnd)), WM_EXITSIZEMOVE, None, None);
1377+
Ok(())
1378+
}
1379+
}
1380+
1381+
pub fn update_window(hwnd: isize) -> bool {
1382+
unsafe { UpdateWindow(HWND(as_ptr!(hwnd))) }.as_bool()
1383+
}
1384+
13631385
pub fn alt_is_pressed() -> bool {
13641386
let state = unsafe { GetKeyState(i32::from(VK_MENU.0)) };
13651387
#[allow(clippy::cast_sign_loss)]

0 commit comments

Comments
 (0)