diff --git a/flake.nix b/flake.nix index 10be858b8..2de75f371 100644 --- a/flake.nix +++ b/flake.nix @@ -72,7 +72,13 @@ # Define .overlay to expose the package as pkgs.hyprpanel based on the system overlay = final: prev: { - hyprpanel = self.packages.${prev.stdenv.system}.default; + hyprpanel = prev.writeShellScriptBin "hyprpanel" '' + if [ "$#" -eq 0 ]; then + exec ${self.packages.${final.stdenv.system}.default}/bin/hyprpanel + else + exec ${astal.packages.${final.stdenv.system}.io}/bin/astal -i hyprpanel "$@" + fi + ''; }; }; } diff --git a/scripts/checkUpdates.sh b/scripts/checkUpdates.sh index 39bf6ecb4..ab36d3c5a 100755 --- a/scripts/checkUpdates.sh +++ b/scripts/checkUpdates.sh @@ -3,14 +3,19 @@ check_arch_updates() { official_updates=0 aur_updates=0 + if command -v paru &> /dev/null; then + aur_helper="paru" + else + aur_helper="yay" + fi if [ "$1" = "-y" ]; then - aur_updates=$(yay -Qum 2>/dev/null | wc -l) + aur_updates=$($aur_helper -Qum 2>/dev/null | wc -l) elif [ "$1" = "-p" ]; then official_updates=$(checkupdates 2>/dev/null | wc -l) else official_updates=$(checkupdates 2>/dev/null | wc -l) - aur_updates=$(yay -Qum 2>/dev/null | wc -l) + aur_updates=$($aur_helper -Qum 2>/dev/null | wc -l) fi total_updates=$((official_updates + aur_updates)) diff --git a/src/components/bar/modules/netstat/index.tsx b/src/components/bar/modules/netstat/index.tsx index 8a515e613..ae0f7f5be 100644 --- a/src/components/bar/modules/netstat/index.tsx +++ b/src/components/bar/modules/netstat/index.tsx @@ -19,6 +19,8 @@ const { rateUnit, dynamicIcon, icon, + networkInLabel, + networkOutLabel, round, leftClick, rightClick, @@ -47,11 +49,11 @@ export const Netstat = (): BarBoxChild => { const renderNetworkLabel = (lblType: NetstatLabelType, networkService: NetworkResourceData): string => { switch (lblType) { case 'in': - return `↓ ${networkService.in}`; + return `${networkInLabel.get()} ${networkService.in}`; case 'out': - return `↑ ${networkService.out}`; + return `${networkOutLabel.get()} ${networkService.out}`; default: - return `↓ ${networkService.in} ↑ ${networkService.out}`; + return `${networkInLabel.get()} ${networkService.in} ${networkOutLabel.get()} ${networkService.out}`; } }; diff --git a/src/components/bar/modules/updates/index.tsx b/src/components/bar/modules/updates/index.tsx index 6887c1789..c2460bfa6 100644 --- a/src/components/bar/modules/updates/index.tsx +++ b/src/components/bar/modules/updates/index.tsx @@ -10,6 +10,7 @@ const { updateCommand, label, padZero, + autoHide, pollingInterval, icon, leftClick, @@ -21,6 +22,7 @@ const { const pendingUpdates: Variable = Variable('0'); const postInputUpdater = Variable(true); +const isVis = Variable(!autoHide.get()); const processUpdateCount = (updateCount: string): string => { if (!padZero.get()) return updateCount; @@ -37,9 +39,14 @@ const updatesPoller = new BashPoller( updatesPoller.initialize('updates'); +Variable.derive([bind(autoHide)], (autoHideModule) => { + isVis.set(!autoHideModule || (autoHideModule && parseFloat(pendingUpdates.get()) > 0)); +}); + const updatesIcon = Variable.derive( [bind(icon.pending), bind(icon.updated), bind(pendingUpdates)], (pendingIcon, updatedIcon, pUpdates) => { + isVis.set(!autoHide.get() || (autoHide.get() && parseFloat(pUpdates) > 0)); return parseFloat(pUpdates) === 0 ? updatedIcon : pendingIcon; }, ); @@ -49,6 +56,7 @@ export const Updates = (): BarBoxChild => { textIcon: updatesIcon(), tooltipText: bind(pendingUpdates).as((v) => `${v} updates available`), boxClass: 'updates', + isVis: isVis, label: bind(pendingUpdates), showLabelBinding: bind(label), props: { diff --git a/src/components/bar/modules/window_title/helpers/title.ts b/src/components/bar/modules/window_title/helpers/title.ts index 333b18ab4..4fdb6aea5 100644 --- a/src/components/bar/modules/window_title/helpers/title.ts +++ b/src/components/bar/modules/window_title/helpers/title.ts @@ -8,11 +8,11 @@ import AstalHyprland from 'gi://AstalHyprland?version=0.1'; * This function searches for a matching window title in the predefined `windowTitleMap` based on the class of the provided window. * If a match is found, it returns an object containing the icon and label for the window. If no match is found, it returns a default icon and label. * - * @param windowtitle The window object containing the class information. + * @param client The window object containing the class information. * * @returns An object containing the icon and label for the window. */ -export const getWindowMatch = (windowtitle: AstalHyprland.Client): Record => { +export const getWindowMatch = (client: AstalHyprland.Client): Record => { const windowTitleMap = [ // user provided values ...options.bar.windowtitle.title_map.get(), @@ -119,17 +119,17 @@ export const getWindowMatch = (windowtitle: AstalHyprland.Client): Record RegExp(wt[0]).test(windowtitle?.class.toLowerCase())); + const foundMatch = windowTitleMap.find((wt) => RegExp(wt[0]).test(client?.class.toLowerCase())); if (!foundMatch || foundMatch.length !== 3) { return { @@ -157,13 +157,12 @@ export const getWindowMatch = (windowtitle: AstalHyprland.Client): Record { - if (client === null) return getWindowMatch(client).label; - - if (useCustomTitle) return getWindowMatch(client).label; - if (useClassName) return client.class; + if (client === null || useCustomTitle) return getWindowMatch(client).label; const title = client.title; - // If the title is empty or only filled with spaces, fallback to the class name + + if (!title || useClassName) return client.class; + if (title.length === 0 || title.match(/^ *$/)) { return client.class; } diff --git a/src/components/bar/modules/workspaces/helpers/index.ts b/src/components/bar/modules/workspaces/helpers/index.ts index 84031172d..fd20d2cb9 100644 --- a/src/components/bar/modules/workspaces/helpers/index.ts +++ b/src/components/bar/modules/workspaces/helpers/index.ts @@ -162,7 +162,7 @@ const navigateWorkspace = ( while (attempts < workspacesList.length) { const targetWS = workspacesList[newIndex]; if (!isWorkspaceIgnored(ignoredWorkspaces, targetWS)) { - hyprlandService.message_async(`dispatch workspace ${targetWS}`); + hyprlandService.dispatch('workspace', targetWS.toString()); return; } newIndex = (newIndex + step + workspacesList.length) % workspacesList.length; diff --git a/src/components/bar/modules/workspaces/index.tsx b/src/components/bar/modules/workspaces/index.tsx index 6940d8a86..eeb7196df 100644 --- a/src/components/bar/modules/workspaces/index.tsx +++ b/src/components/bar/modules/workspaces/index.tsx @@ -1,10 +1,11 @@ import options from 'src/options'; import { createThrottledScrollHandlers, getCurrentMonitorWorkspaces } from './helpers'; -import { BarBoxChild, SelfButton } from 'src/lib/types/bar'; +import { BarBoxChild } from 'src/lib/types/bar'; import { WorkspaceModule } from './workspaces'; import { bind, Variable } from 'astal'; import { GtkWidget } from 'src/lib/types/widget'; -import { Gdk } from 'astal/gtk3'; +import { Astal, Gdk } from 'astal/gtk3'; +import { isScrollDown, isScrollUp } from 'src/lib/utils'; const { workspaces, scroll_speed } = options.bar.workspaces; @@ -27,23 +28,27 @@ const Workspaces = (monitor = -1): BarBoxChild => { boxClass: 'workspaces', isBox: true, props: { - setup: (self: SelfButton): void => { + setup: (self: Astal.EventBox): void => { + let scrollHandlers: number; Variable.derive([bind(scroll_speed)], (scroll_speed) => { + if (scrollHandlers) { + self.disconnect(scrollHandlers); + } + const { throttledScrollUp, throttledScrollDown } = createThrottledScrollHandlers( scroll_speed, currentMonitorWorkspaces, ); - const scrollHandlers = self.connect('scroll-event', (_: GtkWidget, event: Gdk.Event) => { - const eventDirection = event.get_scroll_direction()[1]; - if (eventDirection === Gdk.ScrollDirection.UP) { - throttledScrollUp(); - } else if (eventDirection === Gdk.ScrollDirection.DOWN) { + scrollHandlers = self.connect('scroll-event', (_: GtkWidget, event: Gdk.Event) => { + if (isScrollUp(event)) { throttledScrollDown(); } - }); - self.disconnect(scrollHandlers); + if (isScrollDown(event)) { + throttledScrollUp(); + } + }); }); }, }, diff --git a/src/components/bar/modules/workspaces/workspaces.tsx b/src/components/bar/modules/workspaces/workspaces.tsx index 65122d4ef..fa3f924cc 100644 --- a/src/components/bar/modules/workspaces/workspaces.tsx +++ b/src/components/bar/modules/workspaces/workspaces.tsx @@ -152,7 +152,7 @@ export const WorkspaceModule = ({ monitor }: WorkspaceModuleProps): JSX.Element self.toggleClassName('active', activeWorkspace === wsId); self.toggleClassName( 'occupied', - (hyprlandService.get_workspace(wsId)?.get_clients().length || 0) > 0, + (hyprlandService.get_workspace(wsId)?.get_clients()?.length || 0) > 0, ); }} /> diff --git a/src/components/bar/settings/config.tsx b/src/components/bar/settings/config.tsx index c3a940a2e..931e46b06 100644 --- a/src/components/bar/settings/config.tsx +++ b/src/components/bar/settings/config.tsx @@ -140,7 +140,10 @@ export const CustomModuleSettings = (): JSX.Element => {