Files
Zephrynis b2ae32a078 feat: make AGS colorshell configuration fully declarative
- Add complete colorshell v2.0.3 configuration to home/ags-config/
- Disable runner plugin and NightLight tile (incompatible with NixOS)
- Customize SCSS with full opacity (no transparency)
- Add dark pale blue color scheme in home/pywal-colors/
- Configure Papirus-Dark icon theme via home-manager
- Make ~/.config/ags/ immutable and managed by Nix store
- Auto-deploy pywal colors to ~/.cache/wal/colors.json

All AGS configuration is now reproducible and version controlled.
2025-11-04 21:36:38 +00:00

100 lines
4.0 KiB
TypeScript

import { createBinding, createComputed } from "ags";
import { Runner } from "../Runner";
import { secureBaseBinding } from "../../modules/utils";
import { tr } from "../../i18n/intl";
import Media from "../../modules/media";
import AstalMpris from "gi://AstalMpris";
export const PluginMedia = {
prefix: ":",
handle: () => !Media.getDefault().player.available ? {
icon: "folder-music-symbolic",
title: "Couldn't find any players",
closeOnClick: false,
description: "No media / player found with mpris"
} : [
{
icon: secureBaseBinding<AstalMpris.Player>(
createBinding(Media.getDefault(), "player"),
"playbackStatus",
AstalMpris.PlaybackStatus.PAUSED
).as((status) => status === AstalMpris.PlaybackStatus.PLAYING ?
"media-playback-pause-symbolic"
: "media-playback-start-symbolic"),
closeOnClick: false,
title: createComputed([
secureBaseBinding<AstalMpris.Player>(
createBinding(Media.getDefault(), "player"),
"title",
null
).as(t => t ?? tr("media.no_title")),
secureBaseBinding<AstalMpris.Player>(
createBinding(Media.getDefault(), "player"),
"artist",
null
).as(t => t ?? tr("media.no_artist")),
secureBaseBinding<AstalMpris.Player>(
createBinding(Media.getDefault(), "player"),
"playbackStatus",
AstalMpris.PlaybackStatus.PAUSED
)
], (title, artist, status) => `${status === AstalMpris.PlaybackStatus.PLAYING ?
"Pause" : "Play"
} ${title} | ${artist}`),
actionClick: () => Media.getDefault().player.play_pause()
},
{
icon: "media-skip-backward-symbolic",
closeOnClick: false,
title: createComputed([
secureBaseBinding<AstalMpris.Player>(
createBinding(Media.getDefault(), "player"),
"title",
null
).as(t => t ?? tr("media.no_title")),
secureBaseBinding<AstalMpris.Player>(
createBinding(Media.getDefault(), "player"),
"artist",
null
).as(t => t ?? tr("media.no_artist")),
secureBaseBinding<AstalMpris.Player>(
createBinding(Media.getDefault(), "player"),
"identity",
"Music Player"
)
], (title, artist, identity) =>
`Go Previous ${title ? title : identity}${artist ? ` | ${artist}` : ""}`
),
actionClick: () => Media.getDefault().player.canGoPrevious &&
Media.getDefault().player.previous()
},
{
icon: "media-skip-forward-symbolic",
closeOnClick: false,
title: createComputed([
secureBaseBinding<AstalMpris.Player>(
createBinding(Media.getDefault(), "player"),
"title",
null
).as(t => t ?? tr("media.no_title")),
secureBaseBinding<AstalMpris.Player>(
createBinding(Media.getDefault(), "player"),
"artist",
null
).as(t => t ?? tr("media.no_artist")),
secureBaseBinding<AstalMpris.Player>(
createBinding(Media.getDefault(), "player"),
"identity",
"Music Player"
)
], (title, artist, identity) =>
`Go Next ${title ? title : identity}${artist ? ` | ${artist}` : ""}`
),
actionClick: () => Media.getDefault().player.canGoNext &&
Media.getDefault().player.next()
}
]
} as Runner.Plugin;