import { bind, execAsync, Variable } from 'astal'; import { App, Gtk, Widget } from 'astal/gtk3'; import AstalApps from 'gi://AstalApps'; const Applications = AstalApps.Apps.new(); import AstalHyprland from 'gi://AstalHyprland'; const Hyprland = AstalHyprland.get_default(); import PopupWindow from '../misc/popup-window'; import Separator from '../misc/separator'; import { hyprMessage } from '../../lib'; const ICON_SEP = 6; const takeScreenshot = (selector: string, delay = 1000): void => { App.get_window('win-screenshot')?.set_visible(false); setTimeout(() => { execAsync([ 'bash', '-c', `grim ${selector} - | satty -f - || true`, ]).catch(console.error); }, delay); }; export default () => { const windowList = as Widget.Box; const updateWindows = async() => { if (!App.get_window('win-screenshot')?.visible) { return; } windowList.children = (JSON.parse(await hyprMessage('j/clients')) as AstalHyprland.Client[]) .filter((client) => client.workspace.id === Hyprland.get_focused_workspace().get_id()) .map((client) => ( )); }; Hyprland.connect('notify::clients', updateWindows); Hyprland.connect('notify::focused-workspace', updateWindows); const Shown = Variable('monitors'); const stack = ( {bind(Hyprland, 'monitors').as((monitors) => monitors.map((monitor) => ( )))} {windowList} ) as Widget.Stack; const StackButton = ({ label = '', iconName = '' }) => ( ) as Widget.Button; const regionButton = ( ) as Widget.Button; return ( { updateWindows(); }} > {regionButton} {stack} ); };