refactor(wm): log errors when allow_set_foreground_window fails

This startup Win32 API call can sporadically fail, so this commit adds
some retry logic and logging of errors every time it fails. If it
crosses the retry threshold, the application will exit (because you
can't really have a tiling window manager running that doesn't let you
set the foreground window).
This commit is contained in:
LGUG2Z
2025-05-02 17:49:27 -07:00
parent 82c2241601
commit 46d5ea4a1d
2 changed files with 23 additions and 2 deletions

View File

@@ -17,6 +17,7 @@ use std::time::Duration;
use clap::Parser;
use clap::ValueEnum;
use color_eyre::eyre::anyhow;
use color_eyre::Result;
use crossbeam_utils::Backoff;
use komorebi::animation::AnimationEngine;
@@ -193,8 +194,28 @@ fn main() -> Result<()> {
let opts: Opts = Opts::parse();
CUSTOM_FFM.store(opts.focus_follows_mouse, Ordering::SeqCst);
let mut set_foreground_window_retries = 5;
let mut set_foreground_window_succeeded = false;
let process_id = WindowsApi::current_process_id();
WindowsApi::allow_set_foreground_window(process_id)?;
while set_foreground_window_retries > 0 && !set_foreground_window_succeeded {
match WindowsApi::allow_set_foreground_window(process_id) {
Ok(_) => {
set_foreground_window_succeeded = true;
}
Err(error) => {
tracing::error!("{error}");
set_foreground_window_retries -= 1;
}
}
if set_foreground_window_retries == 0 {
return Err(anyhow!(
"failed call to AllowSetForegroundWindow after 5 retries"
));
}
}
WindowsApi::set_process_dpi_awareness_context()?;
let session_id = WindowsApi::process_id_to_session_id()?;

View File

@@ -163,7 +163,7 @@ impl WindowManager {
// to be consumed by integrating gui applications like bars to know
// when to show visual components associated with komorebi's virtual
// desktop
tracing::error!("notifying subscribers that we are back on komorebi's associated virtual desktop");
tracing::debug!("notifying subscribers that we are back on komorebi's associated virtual desktop");
notify_subscribers(
Notification {
event: NotificationEvent::VirtualDesktop(