From 3df8ef0a66a9e9d4616f8f4e59a2d6c9ab2d2c76 Mon Sep 17 00:00:00 2001 From: matt1432 Date: Tue, 27 Feb 2024 16:55:01 -0500 Subject: [PATCH] fix(ags): make osds popup when they should --- modules/ags/config/global-types.d.ts | 9 ++--- modules/ags/config/ts/osd/ctor.ts | 52 +++++++++++++++++----------- modules/ags/config/ts/osd/main.ts | 24 ++++++++----- modules/ags/config/ts/osd/osds.ts | 26 +++++++------- modules/hyprland/default.nix | 6 ++-- 5 files changed, 69 insertions(+), 48 deletions(-) diff --git a/modules/ags/config/global-types.d.ts b/modules/ags/config/global-types.d.ts index 77866edb..338929cd 100644 --- a/modules/ags/config/global-types.d.ts +++ b/modules/ags/config/global-types.d.ts @@ -86,17 +86,18 @@ export type NotifGesture = AgsEventBox; // For ./ts/osd/ctor.ts export type OSDStack = AgsStack; export type ConnectFunc = (self?: ProgressBarGeneric) => void; export type OSD = { + name: string; stack: OSDStack; - icon: string | IconPropsGeneric; + icon: IconPropsGeneric['icon']; info: { mod: GObject.Object; - signal?: string; + signal?: string | string[]; logic?(self: ProgressBarGeneric): void; - widget?: Widget; + widget?: AgsWidget; } }; diff --git a/modules/ags/config/ts/osd/ctor.ts b/modules/ags/config/ts/osd/ctor.ts index 0210c222..fb086070 100644 --- a/modules/ags/config/ts/osd/ctor.ts +++ b/modules/ags/config/ts/osd/ctor.ts @@ -3,28 +3,32 @@ const { Box, Icon, ProgressBar } = Widget; const Y_POS = 80; // Types -import { ConnectFunc, OSD, ProgressBarGeneric } from 'global-types'; +import { ConnectFunc, OSD } from 'global-types'; -export default ({ stack, icon, info }: OSD) => { +export default ({ name, stack, icon, info }: OSD) => { let connectFunc: ConnectFunc; + const status = info.widget ? + info.widget : + ProgressBar({ vpack: 'center' }); + // Wrapper to get sliding up anim const osd = Box({ + name, css: `margin-bottom: ${Y_POS}px;`, - children: [Box({ - class_name: 'osd', - children: [ - Icon({ - hpack: 'start', - // Can take a string or an object of props - ...(typeof icon === 'string' ? { icon } : icon), - }), - // Can take a static widget instead of a progressbar - info.widget ? - info.widget : - ProgressBar({ vpack: 'center' }), - ], - })], + children: [ + // Actual OSD + Box({ + class_name: 'osd', + children: [ + Icon({ + hpack: 'start', + icon, + }), + status, + ], + }), + ], }); // Handle requests to show the OSD @@ -35,14 +39,22 @@ export default ({ stack, icon, info }: OSD) => { info.logic(self); } r(); - }).then(() => stack.attribute.popup(osd)); + }).then(() => stack.attribute.popup(name)); } else { - connectFunc = () => stack.attribute.popup(osd); + connectFunc = () => stack.attribute.popup(name); } - (osd.children[0].children[1] as ProgressBarGeneric) - .hook(info.mod, connectFunc, info.signal); + if (info.signal) { + if (typeof info.signal === 'string') { + status.hook(info.mod, connectFunc, info.signal); + } + else { + info.signal.forEach((sig) => { + status.hook(info.mod, connectFunc, sig); + }); + } + } return osd; }; diff --git a/modules/ags/config/ts/osd/main.ts b/modules/ags/config/ts/osd/main.ts index 1ec7a787..2401f2a6 100644 --- a/modules/ags/config/ts/osd/main.ts +++ b/modules/ags/config/ts/osd/main.ts @@ -23,16 +23,22 @@ const OSDs = () => { transition: 'over_up_down', transition_duration, - attribute: { popup: (osd: BoxGeneric) => { - if (!osd) { - // - } - } }, + attribute: { + popup: (osd: string) => { + if (!osd) { + // + } + }, + }, }); // Send reference of stack to all children stack.children = Object.fromEntries( - OSDList.map((osd, i) => [`${i}`, osd(stack)]), + OSDList.map((osd) => { + const widget = osd(stack); + + return [widget.name, widget]; + }), ); // Delay popup method so it @@ -40,9 +46,9 @@ const OSDs = () => { timeout(1000, () => { let count = 0; - stack.attribute.popup = (osd: BoxGeneric) => { + stack.attribute.popup = (osd: string) => { ++count; - stack.set_visible_child(osd); + stack.shown = osd; App.openWindow('osd'); timeout(HIDE_DELAY, () => { @@ -53,6 +59,8 @@ const OSDs = () => { } }); }; + + globalThis['popup_osd'] = stack.attribute.popup; }); return stack; diff --git a/modules/ags/config/ts/osd/osds.ts b/modules/ags/config/ts/osd/osds.ts index 3bb76d85..36e13a6d 100644 --- a/modules/ags/config/ts/osd/osds.ts +++ b/modules/ags/config/ts/osd/osds.ts @@ -10,21 +10,17 @@ import { MicIcon } from '../misc/audio-icons.ts'; const AUDIO_MAX = 1.5; -const ShowSpeaker = Variable(true); - -globalThis.showSpeaker = () => { - ShowSpeaker.setValue(!ShowSpeaker.value); -}; - // Types import { OSDStack } from 'global-types'; export const SpeakerOSD = (stack: OSDStack) => OSD({ + name: 'speaker', stack, - icon: { icon: SpeakerIcon.bind() }, + icon: SpeakerIcon.bind(), info: { - mod: ShowSpeaker, + mod: Audio.speaker, + signal: ['notify::volume', 'notify::is-muted'], logic: (self) => { if (!Audio.speaker) { @@ -41,8 +37,9 @@ export const SpeakerOSD = (stack: OSDStack) => OSD({ }); export const ScreenBrightnessOSD = (stack: OSDStack) => OSD({ + name: 'screen', stack, - icon: { icon: Brightness.bind('screenIcon') }, + icon: Brightness.bind('screenIcon'), info: { mod: Brightness, signal: 'screen', @@ -54,6 +51,7 @@ export const ScreenBrightnessOSD = (stack: OSDStack) => OSD({ }); export const KbdBrightnessOSD = (stack: OSDStack) => OSD({ + name: 'kbd', stack, icon: 'keyboard-brightness-symbolic', info: { @@ -73,11 +71,12 @@ export const KbdBrightnessOSD = (stack: OSDStack) => OSD({ }); export const MicOSD = (stack: OSDStack) => OSD({ + name: 'mic', stack, - icon: { icon: MicIcon.bind() }, + icon: MicIcon.bind(), info: { - mod: Audio, - signal: 'microphone-changed', + mod: Audio.microphone, + signal: ['notify::volume', 'notify::is-muted'], logic: (self) => { if (!Audio.microphone) { @@ -91,8 +90,9 @@ export const MicOSD = (stack: OSDStack) => OSD({ }); export const CapsLockOSD = (stack: OSDStack) => OSD({ + name: 'caps', stack, - icon: { icon: Brightness.bind('capsIcon') }, + icon: Brightness.bind('capsIcon'), info: { mod: Brightness, signal: 'caps', diff --git a/modules/hyprland/default.nix b/modules/hyprland/default.nix index a2011f53..1be6cbac 100644 --- a/modules/hyprland/default.nix +++ b/modules/hyprland/default.nix @@ -132,13 +132,13 @@ in { "$mainMod SHIFT, 9, movetoworkspace, 9" "$mainMod SHIFT, 0, movetoworkspace, 10" - ",XF86AudioMute, exec, pactl set-sink-mute @DEFAULT_SINK@ toggle & ags -r 'showSpeaker()' &" + ",XF86AudioMute, exec, pactl set-sink-mute @DEFAULT_SINK@ toggle" ",XF86AudioMicMute, exec, pactl set-source-mute @DEFAULT_SOURCE@ toggle" ]; binde = [ - ",XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+ & ags -r 'showSpeaker()' &" - ",XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- & ags -r 'showSpeaker()' &" + ",XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+ & ags -r 'popup_osd(\"speaker\")' &" + ",XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- & ags -r 'popup_osd(\"speaker\")' &" ]; # Mouse Binds