diff --git a/nixosModules/ags/v2/widgets/bar/items/current-client.tsx b/nixosModules/ags/v2/widgets/bar/items/current-client.tsx index b25b6f45..6b39ee28 100644 --- a/nixosModules/ags/v2/widgets/bar/items/current-client.tsx +++ b/nixosModules/ags/v2/widgets/bar/items/current-client.tsx @@ -1,4 +1,4 @@ -import { bind } from 'astal'; +import { bind, Variable } from 'astal'; import AstalApps from 'gi://AstalApps?version=0.1'; const Applications = AstalApps.Apps.new(); @@ -10,35 +10,53 @@ import Separator from '../../misc/separator'; export default () => { - const focused = bind(Hyprland, 'focusedClient'); + const focusedIcon = Variable(''); + const focusedTitle = Variable(''); + + let lastFocused: string | undefined; + + const updateVars = ( + client: AstalHyprland.Client | null | undefined = Hyprland.get_focused_client(), + ) => { + lastFocused = client?.get_address(); + const app = Applications.query( + client?.get_class() ?? '', + false, + )[0]; + + focusedIcon.set(app.iconName ?? ''); + focusedTitle.set(client?.get_title() ?? ''); + const id = client?.connect('notify::title', (c) => { + if (c.get_address() !== lastFocused) { + c.disconnect(id); + } + focusedTitle.set(c.get_title()); + }); + }; + + updateVars(); + Hyprland.connect('notify::focused-client', () => updateVars()); + Hyprland.connect('client-removed', () => updateVars()); + Hyprland.connect('client-added', () => { + updateVars(Hyprland.get_client(JSON.parse(Hyprland.message('j/activewindow')).address)); + }); return ( title !== '')} > { - self.hook(Hyprland, 'notify::focused-client', () => { - const app = Applications.query( - Hyprland.get_focused_client()?.get_class() ?? '', - false, - )[0]; - - self.set_icon(app.iconName ?? ''); - }); - }} + icon={bind(focusedIcon)} /> - {focused.as((client) => (client && ( - ); };