feat(wm): handle OBJECT_NAMECHANGE for all apps

This commit ensures that EVENT_OBJECT_NAMECHANGE is handled for all
windows.

Previously this was mapped to WindowManagerEvent::Show, as this is the
event that apps like Firefox and JetBrains IDEs sent on launch instead
of EVENT_OBJECT_SHOW like normal apps.

Now that we are using EVENT_OBJECT_NAMECHANGE to update titles on
stackbar tabs, when a window which is not in the whitelist of
object_name_change_applications sends this event, it will be handled by
the new WindowManagerEvent::TitleUpdate variant.

This ensures that a stackbar_manager::Notification is sent at the end of
process_event to update stackbar tabs when application titles are
changing.

resolve #842
This commit is contained in:
LGUG2Z
2024-05-22 11:37:47 -07:00
parent c4d62fc4f6
commit 47f0ab1ef3
3 changed files with 22 additions and 12 deletions

View File

@@ -571,10 +571,9 @@ impl WindowManager {
} }
} }
} }
WindowManagerEvent::ForceUpdate(_) => { WindowManagerEvent::MouseCapture(..)
self.update_focused_workspace(false, true)?; | WindowManagerEvent::Cloak(..)
} | WindowManagerEvent::TitleUpdate(..) => {}
WindowManagerEvent::MouseCapture(..) | WindowManagerEvent::Cloak(..) => {}
}; };
// If we unmanaged a window, it shouldn't be immediately hidden behind managed windows // If we unmanaged a window, it shouldn't be immediately hidden behind managed windows

View File

@@ -27,7 +27,7 @@ pub enum WindowManagerEvent {
Manage(Window), Manage(Window),
Unmanage(Window), Unmanage(Window),
Raise(Window), Raise(Window),
ForceUpdate(Window), TitleUpdate(WinEvent, Window),
} }
impl Display for WindowManagerEvent { impl Display for WindowManagerEvent {
@@ -75,8 +75,8 @@ impl Display for WindowManagerEvent {
Self::Raise(window) => { Self::Raise(window) => {
write!(f, "Raise (Window: {window})") write!(f, "Raise (Window: {window})")
} }
Self::ForceUpdate(window) => { Self::TitleUpdate(winevent, window) => {
write!(f, "ForceUpdate (Window: {window})") write!(f, "TitleUpdate (WinEvent: {winevent}, Window: {window})")
} }
} }
} }
@@ -98,7 +98,7 @@ impl WindowManagerEvent {
| Self::Raise(window) | Self::Raise(window)
| Self::Manage(window) | Self::Manage(window)
| Self::Unmanage(window) | Self::Unmanage(window)
| Self::ForceUpdate(window) => window, | Self::TitleUpdate(_, window) => window,
} }
} }
@@ -141,7 +141,7 @@ impl WindowManagerEvent {
let class = &window.class().ok()?; let class = &window.class().ok()?;
let path = &window.path().ok()?; let path = &window.path().ok()?;
let should_trigger = should_act( let should_trigger_show = should_act(
title, title,
exe_name, exe_name,
class, class,
@@ -151,10 +151,10 @@ impl WindowManagerEvent {
) )
.is_some(); .is_some();
if should_trigger { if should_trigger_show {
Option::from(Self::Show(winevent, window)) Option::from(Self::Show(winevent, window))
} else { } else {
None Option::from(Self::TitleUpdate(winevent, window))
} }
} }
_ => None, _ => None,

View File

@@ -80,8 +80,19 @@ pub extern "system" fn win_event_hook(
Ok(event) => event, Ok(event) => event,
Err(_) => return, Err(_) => return,
}; };
let event_type = match WindowManagerEvent::from_win_event(winevent, window) { let event_type = match WindowManagerEvent::from_win_event(winevent, window) {
None => return, None => {
tracing::trace!(
"Unhandled WinEvent: {winevent} (hwnd: {}, exe: {}, title: {}, class: {})",
window.hwnd,
window.exe().unwrap_or_default(),
window.title().unwrap_or_default(),
window.class().unwrap_or_default()
);
return;
}
Some(event) => event, Some(event) => event,
}; };