From 56e2caf76e572feb01fc87cd3af441be8fdd6f00 Mon Sep 17 00:00:00 2001 From: matt1432 Date: Thu, 26 Sep 2024 15:55:32 -0400 Subject: [PATCH] feat(agsV2): implement fullscreen bar toggle --- nixosModules/ags/v2/lib.ts | 4 +- .../ags/v2/widgets/bar/fullscreen.tsx | 132 +++++++++++++++++- nixosModules/ags/v2/widgets/bar/main.tsx | 25 +--- 3 files changed, 136 insertions(+), 25 deletions(-) diff --git a/nixosModules/ags/v2/lib.ts b/nixosModules/ags/v2/lib.ts index 3ddc175f..120765b2 100644 --- a/nixosModules/ags/v2/lib.ts +++ b/nixosModules/ags/v2/lib.ts @@ -9,7 +9,7 @@ export const get_hyprland_monitor = (monitor: Gdk.Monitor): AstalHyprland.Monito const model = monitor.model?.replace(',', ''); const start = `${manufacturer} ${model}`; - return Hyprland.monitors.find((m) => m.description?.startsWith(start)); + return Hyprland.get_monitors().find((m) => m.description?.startsWith(start)); }; export const get_hyprland_monitor_desc = (monitor: Gdk.Monitor): string => { @@ -17,7 +17,7 @@ export const get_hyprland_monitor_desc = (monitor: Gdk.Monitor): string => { const model = monitor.model?.replace(',', ''); const start = `${manufacturer} ${model}`; - return `desc:${Hyprland.monitors.find((m) => m.description?.startsWith(start))?.description}`; + return `desc:${Hyprland.get_monitors().find((m) => m.description?.startsWith(start))?.description}`; }; export const get_gdkmonitor_from_desc = (desc: string): Gdk.Monitor => { diff --git a/nixosModules/ags/v2/widgets/bar/fullscreen.tsx b/nixosModules/ags/v2/widgets/bar/fullscreen.tsx index 753124f0..9f1e3d15 100644 --- a/nixosModules/ags/v2/widgets/bar/fullscreen.tsx +++ b/nixosModules/ags/v2/widgets/bar/fullscreen.tsx @@ -1,9 +1,9 @@ -import { Variable } from 'astal'; +import { Astal, bind, Gdk, Gtk, Variable, Widget } from 'astal'; import AstalHyprland from 'gi://AstalHyprland?version=0.1'; const Hyprland = AstalHyprland.get_default(); -import { get_monitor_desc } from '../../lib'; +import { get_hyprland_monitor_desc, get_monitor_desc } from '../../lib'; const FullscreenState = Variable({ @@ -23,8 +23,7 @@ Hyprland.connect('event', () => { const fsClients = Hyprland.get_clients().filter((c) => { const mon = c.get_monitor(); - return c.fullscreen && - c.workspace.id === mon?.activeWorkspace.id; + return c.fullscreen && c.workspace.id === mon?.activeWorkspace.id; }); const monitors = fsClients.map((c) => @@ -47,4 +46,127 @@ Hyprland.connect('event', () => { } }); -export default FullscreenState; +export default ({ + anchor, + gdkmonitor = Gdk.Display.get_default()?.get_monitor(0) as Gdk.Monitor, + child, + ...rest +}: Widget.WindowProps) => { + const monitor = get_hyprland_monitor_desc(gdkmonitor); + const BarVisible = Variable(true); + + FullscreenState.subscribe((v) => { + BarVisible.set(!v.monitors.includes(monitor)); + }); + + const barCloser = ( + + { + barCloser.visible = false; + BarVisible.set(false); + }} + > + + + + ); + + // Hide bar instantly when out of focus + Hyprland.connect('notify::focused-workspace', () => { + const addr = FullscreenState.get().clientAddrs.get(monitor); + + if (addr) { + const client = Hyprland.get_client(addr); + + if (client?.workspace.id !== Hyprland.get_focused_workspace().get_id()) { + BarVisible.set(true); + barCloser.visible = false; + } + else { + BarVisible.set(false); + barCloser.visible = true; + } + } + }); + + const buffer = ( + !v)} + /> + ); + + const vertical = anchor >= (Astal.WindowAnchor.LEFT | Astal.WindowAnchor.RIGHT); + const isBottomOrLeft = ( + anchor === (Astal.WindowAnchor.LEFT | Astal.WindowAnchor.RIGHT | Astal.WindowAnchor.BOTTOM) + + ) || ( + anchor === (Astal.WindowAnchor.LEFT | Astal.WindowAnchor.TOP | Astal.WindowAnchor.BOTTOM) + ); + + let transition: Gtk.RevealerTransitionType; + + if (vertical) { + transition = isBottomOrLeft ? + Gtk.RevealerTransitionType.SLIDE_UP : + Gtk.RevealerTransitionType.SLIDE_DOWN; + } + else { + transition = isBottomOrLeft ? + Gtk.RevealerTransitionType.SLIDE_RIGHT : + Gtk.RevealerTransitionType.SLIDE_LEFT; + } + + const barWrap = ( + + {child} + + ); + + return ( + + { + if (!BarVisible.get()) { + barCloser.visible = true; + BarVisible.set(true); + } + }} + > + + {isBottomOrLeft ? + [buffer, barWrap] : + [barWrap, buffer]} + + + + ); +}; diff --git a/nixosModules/ags/v2/widgets/bar/main.tsx b/nixosModules/ags/v2/widgets/bar/main.tsx index 8418677b..45c75a51 100644 --- a/nixosModules/ags/v2/widgets/bar/main.tsx +++ b/nixosModules/ags/v2/widgets/bar/main.tsx @@ -1,34 +1,23 @@ -import { Astal, bind, Gtk, idle, Variable } from 'astal'; +import { Astal } from 'astal'; -import FullscreenState from './fullscreen'; +import BarRevealer from './fullscreen'; -FullscreenState.subscribe((v) => { - console.log(v); -}); -const isVisible = Variable(false); - export default () => { return ( - idle(() => { - isVisible.set(true); - })} > - - + + ); };