diff --git a/common/overlays/default.nix b/common/overlays/default.nix index ba7de58..42f44d2 100644 --- a/common/overlays/default.nix +++ b/common/overlays/default.nix @@ -5,7 +5,6 @@ ]; nixpkgs.overlays = [ - (import ./swayosd.nix) (import ./blueberry.nix) (final: prev: { diff --git a/common/overlays/swayosd.nix b/common/overlays/swayosd.nix deleted file mode 100644 index b978106..0000000 --- a/common/overlays/swayosd.nix +++ /dev/null @@ -1,27 +0,0 @@ -final: prev: { - swayosd = prev.swayosd.overrideAttrs (oldAttrs: rec { - - src = prev.fetchFromGitHub { - owner = "ErikReider"; - repo = "SwayOSD"; - rev = "8159c9e9962ce19f6fb78201d4d34e5817f53b45"; - hash = "sha256-kGd4/eQkhvxEL3/LToBDjE/JIR8m6w9vdFUrRTyylCE="; - }; - - cargoDeps = oldAttrs.cargoDeps.overrideAttrs (prev.lib.const { - name = "swayosd-vendor.tar.gz"; - inherit src; - outputHash = "sha256-gRhhPDUFPcDS1xo7JzCpZtd1Al1kEkx2dXf92cc2bUo="; - #outputHash = prev.lib.fakeHash; - }); - - buildInputs = (oldAttrs.buildInputs or [ ]) ++ [ - prev.systemd - ]; - - patches = [ - ./patches/swayosd.patch - ]; - }); -} - diff --git a/devices/wim/config/ags/.eslintrc.json b/devices/wim/config/ags/.eslintrc.json index de8763c..9e0fac6 100644 --- a/devices/wim/config/ags/.eslintrc.json +++ b/devices/wim/config/ags/.eslintrc.json @@ -34,6 +34,7 @@ "globals": { "Tablet": "readonly", "Pointers": "readonly", + "Brightness": "readonly", "ARGV": "readonly", "imports": "readonly", "print": "readonly", diff --git a/devices/wim/config/ags/config.js b/devices/wim/config/ags/config.js index 83a30f9..31f8371 100644 --- a/devices/wim/config/ags/config.js +++ b/devices/wim/config/ags/config.js @@ -2,6 +2,7 @@ import App from 'resource:///com/github/Aylur/ags/app.js'; import { exec } from 'resource:///com/github/Aylur/ags/utils.js'; import Setup from './js/setup.js'; +import OSD from './js/osd/main.js'; import Powermenu from './js/powermenu.js'; import * as Bar from './js/bar/main.js'; import NotifCenter from './js/notifications/center.js'; @@ -26,6 +27,7 @@ export default { 'applauncher': 500, 'calendar': 500, 'notification-center': 500, + 'osd': 500, 'overview': 500, 'powermenu': 500, 'quick-settings': 500, @@ -42,6 +44,7 @@ export default { Bar.BgGradient(), Corners.Bottomleft(), Corners.Bottomright(), + OSD(), NotifPopups(), ], }; diff --git a/devices/wim/config/ags/js/bar/brightness.js b/devices/wim/config/ags/js/bar/brightness.js index 47a96ee..1653ebe 100644 --- a/devices/wim/config/ags/js/bar/brightness.js +++ b/devices/wim/config/ags/js/bar/brightness.js @@ -1,5 +1,4 @@ import { ProgressBar, Overlay, Box } from 'resource:///com/github/Aylur/ags/widget.js'; -import { execAsync } from 'resource:///com/github/Aylur/ags/utils.js'; import Separator from '../misc/separator.js'; import Heart from './heart.js'; @@ -9,17 +8,9 @@ export default () => Overlay({ tooltipText: 'Brightness', child: ProgressBar({ className: 'toggle-off brightness', - connections: [ - [200, self => { - execAsync('brightnessctl get').then(out => { - const br = out / 255; - if (br > 0.33) - self.value = br; - else - self.value = 0.33; - }).catch(print); - }], - ], + connections: [[Brightness, self => { + self.value = Brightness.screen > 0.33 ? Brightness.screen : 0.33; + }, 'screen']], }), overlays: [ Box({ diff --git a/devices/wim/config/ags/js/osd/audio.js b/devices/wim/config/ags/js/osd/audio.js new file mode 100644 index 0000000..e108c40 --- /dev/null +++ b/devices/wim/config/ags/js/osd/audio.js @@ -0,0 +1,48 @@ +import Audio from 'resource:///com/github/Aylur/ags/service/audio.js'; +import { Box, Icon, ProgressBar } from 'resource:///com/github/Aylur/ags/widget.js'; + +const items = { + 101: 'audio-volume-overamplified-symbolic', + 67: 'audio-volume-high-symbolic', + 34: 'audio-volume-medium-symbolic', + 1: 'audio-volume-low-symbolic', + 0: 'audio-volume-muted-symbolic', +}; + + +export default () => Box({ + className: 'osd', + children: [ + Icon({ + hpack: 'start', + connections: [[Audio, self => { + if (!Audio.speaker) + return; + + if (Audio.speaker.stream.isMuted) { + self.icon = items[0]; + } + else { + const vol = Audio.speaker.volume * 100; + + for (const threshold of [-1, 0, 33, 66, 100]) { + if (vol > threshold + 1) + self.icon = items[threshold + 1]; + } + } + + const stack = self.get_parent().get_parent(); + stack.shown = 'audio'; + stack.resetTimer(); + }, 'speaker-changed']], + }), + + ProgressBar({ + vpack: 'center', + connections: [[Audio, self => { + self.value = Audio.speaker ? Audio.speaker.volume / 1.5 : 0; + self.sensitive = !Audio.speaker?.stream.isMuted; + }]], + }), + ], +}); diff --git a/devices/wim/config/ags/js/osd/brightness.js b/devices/wim/config/ags/js/osd/brightness.js new file mode 100644 index 0000000..e8d059a --- /dev/null +++ b/devices/wim/config/ags/js/osd/brightness.js @@ -0,0 +1,23 @@ +import { Box, Icon, ProgressBar } from 'resource:///com/github/Aylur/ags/widget.js'; + + +export default () => Box({ + className: 'osd', + children: [ + Icon({ + hpack: 'start', + icon: 'display-brightness-symbolic', + }), + + ProgressBar({ + vpack: 'center', + connections: [[Brightness, self => { + self.value = Brightness.screen; + + const stack = self.get_parent().get_parent(); + stack.shown = 'brightness'; + stack.resetTimer(); + }, 'screen']], + }), + ], +}); diff --git a/devices/wim/config/ags/js/osd/caps.js b/devices/wim/config/ags/js/osd/caps.js new file mode 100644 index 0000000..b2b09a2 --- /dev/null +++ b/devices/wim/config/ags/js/osd/caps.js @@ -0,0 +1,24 @@ +import { Box, Icon, Label } from 'resource:///com/github/Aylur/ags/widget.js'; + + +export default () => Box({ + className: 'osd', + children: [ + Icon({ + hpack: 'start', + icon: 'caps-lock-symbolic', + connections: [[Brightness, (self, state) => { + self.icon = state ? 'caps-lock-symbolic' : 'capslock-disabled-symbolic'; + + const stack = self.get_parent().get_parent(); + stack.shown = 'caps'; + stack.resetTimer(); + }, 'caps']], + }), + + Label({ + vpack: 'center', + label: 'Caps Lock', + }), + ], +}); diff --git a/devices/wim/config/ags/js/osd/main.js b/devices/wim/config/ags/js/osd/main.js new file mode 100644 index 0000000..fe2ff3b --- /dev/null +++ b/devices/wim/config/ags/js/osd/main.js @@ -0,0 +1,55 @@ +import App from 'resource:///com/github/Aylur/ags/app.js'; +import { timeout } from 'resource:///com/github/Aylur/ags/utils.js'; +import { Stack } from 'resource:///com/github/Aylur/ags/widget.js'; + +import GLib from 'gi://GLib'; +import PopupWindow from '../misc/popup.js'; + +import Audio from './audio.js'; +import Brightness from './brightness.js'; +import Caps from './caps.js'; +import Microphone from './mic.js'; + + +export default () => { + let setup = 0; + + const stack = Stack({ + css: 'margin-bottom: 80px;', + items: [ + ['audio', Audio()], + ['brightness', Brightness()], + ['caps', Caps()], + ['mic', Microphone()], + ], + }); + + const window = PopupWindow({ + name: 'osd', + anchor: ['bottom'], + closeOnUnfocus: 'stay', + transition: 'slide_up', + transitionDuration: 200, + child: stack, + }); + + let timer; + stack.resetTimer = () => { + // Each osd calls resetTimer once at startup + if (setup <= stack.items.length + 1) { + ++setup; + return; + } + + App.openWindow('osd'); + if (timer) + GLib.source_remove(timer); + + timer = timeout(2000, () => { + App.closeWindow('osd'); + timer = undefined; + }); + }; + + return window; +}; diff --git a/devices/wim/config/ags/js/osd/mic.js b/devices/wim/config/ags/js/osd/mic.js new file mode 100644 index 0000000..fdb11fa --- /dev/null +++ b/devices/wim/config/ags/js/osd/mic.js @@ -0,0 +1,47 @@ +import Audio from 'resource:///com/github/Aylur/ags/service/audio.js'; +import { Box, Icon, ProgressBar } from 'resource:///com/github/Aylur/ags/widget.js'; + +const items = { + 67: 'audio-input-microphone-high-symbolic', + 34: 'audio-input-microphone-medium-symbolic', + 1: 'audio-input-microphone-low-symbolic', + 0: 'audio-input-microphone-muted-symbolic', +}; + + +export default () => Box({ + className: 'osd', + children: [ + Icon({ + hpack: 'start', + connections: [[Audio, self => { + if (!Audio.microphone) + return; + + if (Audio.microphone.stream.isMuted) { + self.icon = items[0]; + } + else { + const vol = Audio.microphone.volume * 100; + + for (const threshold of [-1, 0, 33, 66]) { + if (vol > threshold + 1) + self.icon = items[threshold + 1]; + } + } + + const stack = self.get_parent().get_parent(); + stack.shown = 'mic'; + stack.resetTimer(); + }, 'microphone-changed']], + }), + + ProgressBar({ + vpack: 'center', + connections: [[Audio, self => { + self.value = Audio.microphone ? Audio.microphone.volume : 0; + self.sensitive = !Audio.microphone?.stream.isMuted; + }, 'microphone-changed']], + }), + ], +}); diff --git a/devices/wim/config/ags/js/quick-settings/button-grid.js b/devices/wim/config/ags/js/quick-settings/button-grid.js index b4170b5..bfaa75f 100644 --- a/devices/wim/config/ags/js/quick-settings/button-grid.js +++ b/devices/wim/config/ags/js/quick-settings/button-grid.js @@ -247,7 +247,7 @@ const SecondRow = () => Row({ GridButton({ command: () => { - execAsync(['swayosd-client', '--output-volume', 'mute-toggle']) + execAsync(['pactl', 'set-source-mute', '@DEFAULT_SOURCE@', 'toggle']) .catch(print); }, @@ -274,7 +274,7 @@ const SecondRow = () => Row({ GridButton({ command: () => { - execAsync(['swayosd-client', '--input-volume', 'mute-toggle']) + execAsync(['pactl', 'set-source-mute', '@DEFAULT_SOURCE@', 'toggle']) .catch(print); }, diff --git a/devices/wim/config/ags/js/quick-settings/slider-box.js b/devices/wim/config/ags/js/quick-settings/slider-box.js index 12c7fb5..6ef3317 100644 --- a/devices/wim/config/ags/js/quick-settings/slider-box.js +++ b/devices/wim/config/ags/js/quick-settings/slider-box.js @@ -1,6 +1,5 @@ import Audio from 'resource:///com/github/Aylur/ags/service/audio.js'; import { Box, Slider, Icon, EventBox } from 'resource:///com/github/Aylur/ags/widget.js'; -import { execAsync } from 'resource:///com/github/Aylur/ags/utils.js'; const items = { 101: 'audio-volume-overamplified-symbolic', @@ -71,18 +70,12 @@ export default () => Box({ ['canChange', true], ], onChange: ({ value }) => { - execAsync(`brightnessctl set ${value}`) - .catch(print); + Brightness.screen = value; }, - connections: [[1000, slider => { - if (slider._canChange) { - execAsync('brightnessctl get') - .then(out => slider.value = out) - .catch(print); - } - }]], - min: 0, - max: 255, + connections: [[Brightness, slider => { + if (slider._canChange) + slider.value = Brightness.screen; + }, 'screen']], draw_value: false, }), }), diff --git a/devices/wim/config/ags/js/setup.js b/devices/wim/config/ags/js/setup.js index 6016a87..02fef87 100644 --- a/devices/wim/config/ags/js/setup.js +++ b/devices/wim/config/ags/js/setup.js @@ -1,15 +1,17 @@ import App from 'resource:///com/github/Aylur/ags/app.js'; import { execAsync } from 'resource:///com/github/Aylur/ags/utils.js'; -import Tablet from '../services/tablet.js'; +import Brightness from '../services/brightness.js'; import Pointers from '../services/pointers.js'; +import Tablet from '../services/tablet.js'; import TouchGestures from '../services/touch-gestures.js'; import closeAll from './misc/closer.js'; export default () => { - globalThis.Tablet = Tablet; + globalThis.Brightness = Brightness; globalThis.Pointers = Pointers; + globalThis.Tablet = Tablet; globalThis.closeAll = closeAll; execAsync(['bash', '-c', '$AGS_PATH/startup.sh']).catch(print); diff --git a/devices/wim/config/ags/scss/common.scss b/devices/wim/config/ags/scss/common.scss index ad49ecb..580d5d3 100644 --- a/devices/wim/config/ags/scss/common.scss +++ b/devices/wim/config/ags/scss/common.scss @@ -2,6 +2,7 @@ $darkbg: #0b0d16; $bg: rgba(40, 42, 54, 0.8); // rgba(69, 71, 90, 0.3); #0d0f18; $bgfull: rgb(40, 42, 54); $contrast-bg: rgba(189, 147, 249, 0.8); +$contrast-bg-full: rgba(189, 147, 249, 1); $bg-secondary: rgba(#382c4a, 0.8); $bg-secondary-alt: #a5b6cf; $fg: #a5b6cf; diff --git a/devices/wim/config/ags/scss/main.scss b/devices/wim/config/ags/scss/main.scss index b6ecc25..afd1955 100644 --- a/devices/wim/config/ags/scss/main.scss +++ b/devices/wim/config/ags/scss/main.scss @@ -21,3 +21,4 @@ undershoot { @import "./widgets/overview"; @import "./widgets/applauncher"; @import "./widgets/corners"; +@import "./widgets/osd"; diff --git a/devices/wim/config/ags/scss/widgets/osd.scss b/devices/wim/config/ags/scss/widgets/osd.scss new file mode 100644 index 0000000..335da1b --- /dev/null +++ b/devices/wim/config/ags/scss/widgets/osd.scss @@ -0,0 +1,43 @@ +.osd { + padding: 12px 20px; + border-radius: 999px; + background: rgba(40, 42, 54, 0.8); + border: 2px solid $contrast-bg; + + label { + min-width: 170px; + } + + progressbar:disabled { + opacity: 0.5; + } + + progressbar { + min-height: 6px; + min-width: 170px; + border-radius: 999px; + background: transparent; + border: none; + + trough { + background: #363847; + min-height: inherit; + border-radius: inherit; + border: none; + } + + progress { + background: #79659f; + min-height: inherit; + border-radius: inherit; + border: none; + } + } + + image { + font-size: 2rem; + color: white; + margin-left: -0.4rem; + margin-right: 0.8rem; + } +} diff --git a/devices/wim/config/ags/services/brightness.js b/devices/wim/config/ags/services/brightness.js new file mode 100644 index 0000000..2378461 --- /dev/null +++ b/devices/wim/config/ags/services/brightness.js @@ -0,0 +1,65 @@ +import Service from 'resource:///com/github/Aylur/ags/service.js'; +import { exec, execAsync, readFileAsync } from 'resource:///com/github/Aylur/ags/utils.js'; + +const KBD = 'tpacpi::kbd_backlight'; +const CAPS = '/sys/class/leds/input0::capslock/brightness'; + +class Brightness extends Service { + static { + Service.register(this, { + 'screen': ['float'], + 'kbd': ['int'], + 'caps': ['int'], + }); + } + + _kbd = 0; + _screen = 0; + _caps = 0; + + get kbd() { return this._kbd; } + get screen() { return this._screen; } + get caps() { return this._caps; } + + set kbd(value) { + // TODO + } + + set screen(percent) { + if (percent < 0) + percent = 0; + + if (percent > 1) + percent = 1; + + execAsync(`brightnessctl s ${percent * 100}% -q`) + .then(() => { + this._screen = percent; + this.emit('screen', this._screen); + }) + .catch(console.error); + } + + constructor() { + super(); + try { + this._kbd = Number(exec(`brightnessctl -d ${KBD} g`)); + this._kbdMax = Number(exec(`brightnessctl -d ${KBD} m`)); + this._screen = Number(exec('brightnessctl g')) / Number(exec('brightnessctl m')); + } catch (error) { + console.error('missing dependancy: brightnessctl'); + } + } + + fetchCapsState() { + readFileAsync(CAPS) + .then(out => { + this._caps = out; + this.emit('caps', this._caps); + }) + .catch(logError); + } +} + +const brightnessService = new Brightness(); +export default brightnessService; diff --git a/devices/wim/config/hypr/main.conf b/devices/wim/config/hypr/main.conf index 81545c6..7314d15 100644 --- a/devices/wim/config/hypr/main.conf +++ b/devices/wim/config/hypr/main.conf @@ -34,9 +34,6 @@ layerrule = blur, overview exec-once = wl-paste --watch cliphist store -# OSD window -exec-once = swayosd-server - # Change HandleLidSwitch to lock in logind.conf exec-once = swayidle -w lock $LOCK_PATH/lock.sh @@ -244,13 +241,14 @@ bind =, Print, exec, bash -c 'grim -g "$(slurp)" - | swappy -f -' bind = $mainMod SHIFT, C, exec, wl-color-picker # Volume control -binde =, XF86AudioRaiseVolume, exec, swayosd-client --output-volume raise -binde =, XF86AudioLowerVolume, exec, swayosd-client --output-volume lower -bind =, XF86AudioMute, exec, swayosd-client --output-volume mute-toggle -bind =, XF86AudioMicMute, exec, swayosd-client --input-volume mute-toggle +binde =, XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+ +binde =, XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- -bindr = CAPS, Caps_Lock, exec, swayosd-client --caps-lock +bind =, XF86AudioMute, exec, pactl set-sink-mute @DEFAULT_SINK@ toggle +bind =, XF86AudioMicMute, exec, pactl set-source-mute @DEFAULT_SOURCE@ toggle + +bindr = CAPS, Caps_Lock, exec, ags -r 'Brightness.fetchCapsState()' # Brightness control -binde =, XF86MonBrightnessUp, exec, swayosd-client --brightness 5 -binde =, XF86MonBrightnessDown, exec, swayosd-client --brightness -5 +binde =, XF86MonBrightnessUp, exec, ags -r 'Brightness.screen += 0.05' +binde =, XF86MonBrightnessDown, exec, ags -r 'Brightness.screen -= 0.05' diff --git a/devices/wim/config/swayosd/style.css b/devices/wim/config/swayosd/style.css deleted file mode 100644 index f8f00c4..0000000 --- a/devices/wim/config/swayosd/style.css +++ /dev/null @@ -1,51 +0,0 @@ -window { - background: rgba(40, 42, 54, 0.8); - border: 2px solid rgba(189, 147, 249, 0.8); -} - -trough { - background: #363847; -} - -progress { - background: #79659f; -} - -/* DEFAULT STYLE -window { - padding: 12px 20px; - border-radius: 999px; - border: none; -} - -#container { - margin: 16px; -} - -image, label { - color: @theme_fg_color; -} - -progressbar:disabled, -image:disabled { - opacity: 0.5; -} - -progressbar { - min-height: 6px; - border-radius: 999px; - background: transparent; - border: none; -} -trough { - min-height: inherit; - border-radius: inherit; - border: none; - background: alpha(@theme_fg_color, 0.5); -} -progress { - min-height: inherit; - border-radius: inherit; - border: none; - background: @theme_fg_color; -}*/ diff --git a/devices/wim/hardware-configuration.nix b/devices/wim/hardware-configuration.nix index b208ca5..aad4573 100644 --- a/devices/wim/hardware-configuration.nix +++ b/devices/wim/hardware-configuration.nix @@ -78,7 +78,7 @@ waydroid.enable = true; }; - # enable brightness control for swayosd + # enable brightness control programs.light.enable = true; services.udev.extraRules = '' diff --git a/devices/wim/home/dotfiles.nix b/devices/wim/home/dotfiles.nix index 52682f9..8a30118 100644 --- a/devices/wim/home/dotfiles.nix +++ b/devices/wim/home/dotfiles.nix @@ -4,8 +4,6 @@ in { xdg.configFile = { - "swayosd/style.css".source = symlink "${configDir}/swayosd/style.css"; - "gtklock/config.ini".source = pkgs.writeText "config.ini" '' [main] modules=${builtins.concatStringsSep ";" [ diff --git a/devices/wim/home/hyprland.nix b/devices/wim/home/hyprland.nix index 2e84e90..5284732 100644 --- a/devices/wim/home/hyprland.nix +++ b/devices/wim/home/hyprland.nix @@ -72,7 +72,6 @@ in { swww swayidle lisgd - swayosd squeekboard xclip wl-clipboard diff --git a/updateSha.sh b/updateSha.sh index 20b93d6..6750117 100755 --- a/updateSha.sh +++ b/updateSha.sh @@ -22,8 +22,6 @@ updateVencord() { # https://gitlab.com/mishakmak/pam-fprint-grosshack # https://github.com/tio/input-emulator -# https://github.com/ErikReider/SwayOSD - # https://extension.7tv.gg/manifest.moz.json updateFirefoxAddons() { echo "Updating firefox addons using mozilla-addons-to-nix"