feat(ags): only show icon of current client on binto
All checks were successful
Discord / discord commits (push) Has been skipped

This commit is contained in:
matt1432 2024-11-15 22:07:59 -05:00
parent 92d89e1cd3
commit 2b1c64b21a
2 changed files with 69 additions and 8 deletions

View file

@ -2,11 +2,10 @@ import { Astal, Gtk } from 'astal/gtk3';
import Audio from './items/audio'; import Audio from './items/audio';
import Clock from './items/clock'; import Clock from './items/clock';
import CurrentClient from './items/current-client'; import CurrentIcon from './items/current-icon';
import Network from './items/network'; import Network from './items/network';
import NotifButton from './items/notif-button'; import NotifButton from './items/notif-button';
import SysTray from './items/tray'; import SysTray from './items/tray';
import Workspaces from './items/workspaces';
import BarRevealer from './fullscreen'; import BarRevealer from './fullscreen';
import Separator from '../misc/separator'; import Separator from '../misc/separator';
@ -25,11 +24,11 @@ export default () => (
> >
<centerbox className="bar widget"> <centerbox className="bar widget">
<box hexpand halign={Gtk.Align.START}> <box hexpand halign={Gtk.Align.START}>
<Workspaces /> <CurrentIcon />
<Separator size={8} /> <Separator size={8} />
<CurrentClient /> <SysTray />
<Separator size={8} /> <Separator size={8} />
</box> </box>
@ -39,10 +38,6 @@ export default () => (
</box> </box>
<box hexpand halign={Gtk.Align.END}> <box hexpand halign={Gtk.Align.END}>
<SysTray />
<Separator size={8} />
<Network /> <Network />
<Separator size={8} /> <Separator size={8} />

View file

@ -0,0 +1,66 @@
import { bind, Variable } from 'astal';
import AstalApps from 'gi://AstalApps';
const Applications = AstalApps.Apps.new();
import AstalHyprland from 'gi://AstalHyprland';
const Hyprland = AstalHyprland.get_default();
import { hyprMessage } from '../../../lib';
export default () => {
const visibleIcon = Variable<boolean>(false);
const focusedIcon = Variable<string>('');
let lastFocused: string | undefined;
const updateVars = (
client: AstalHyprland.Client | null = Hyprland.get_focused_client(),
) => {
lastFocused = client?.get_address();
const app = Applications.fuzzy_query(
client?.get_class() ?? '',
)[0];
const icon = app?.iconName;
if (icon) {
visibleIcon.set(true);
focusedIcon.set(icon);
}
else {
visibleIcon.set(false);
}
const id = client?.connect('notify::title', (c) => {
if (c.get_address() !== lastFocused) {
c.disconnect(id);
}
});
};
updateVars();
Hyprland.connect('notify::focused-client', () => updateVars());
Hyprland.connect('client-removed', () => updateVars());
Hyprland.connect('client-added', async() => {
try {
updateVars(Hyprland.get_client(JSON.parse(await hyprMessage('j/activewindow')).address));
}
catch (e) {
console.log(e);
}
});
return (
<box
className="bar-item current-window"
visible={bind(visibleIcon)}
>
<icon
css="font-size: 32px;"
icon={bind(focusedIcon)}
/>
</box>
);
};