diff --git a/home/programs/ags/config.js b/home/programs/ags/config.js deleted file mode 100644 index 9469424..0000000 --- a/home/programs/ags/config.js +++ /dev/null @@ -1,156 +0,0 @@ -const mpris = await Service.import("mpris"); -const audio = await Service.import("audio"); -const battery = await Service.import("battery"); -const systemtray = await Service.import("systemtray"); -import { NotificationPopups } from "./notificationPopups.js"; -const date = Variable("", { - poll: [1000, 'date "+%H:%M %b %e."'], -}); - -// widgets can be only assigned as a child in one container -// so to make a reuseable widget, make it a function -// then you can simply instantiate one by calling it - -function Clock() { - return Widget.Label({ - class_name: "clock", - label: date.bind(), - }); -} - -function Media() { - const label = Utils.watch("", mpris, "player-changed", () => { - if (mpris.players[0]) { - const { track_artists, track_title } = mpris.players[0]; - return `${track_artists.join(", ")} - ${track_title}`; - } else { - return "Nothing is playing"; - } - }); - - return Widget.Button({ - class_name: "media", - on_primary_click: () => mpris.getPlayer("")?.playPause(), - on_scroll_up: () => mpris.getPlayer("")?.next(), - on_scroll_down: () => mpris.getPlayer("")?.previous(), - child: Widget.Label({ label }), - }); -} - -function Volume() { - const icons = { - 101: "overamplified", - 67: "high", - 34: "medium", - 1: "low", - 0: "muted", - }; - - function getIcon() { - const icon = audio.speaker.is_muted - ? 0 - : [101, 67, 34, 1, 0].find( - (threshold) => threshold <= audio.speaker.volume * 100, - ); - - return `audio-volume-${icons[icon]}-symbolic`; - } - - const icon = Widget.Icon({ - icon: Utils.watch(getIcon(), audio.speaker, getIcon), - }); - - const slider = Widget.Slider({ - hexpand: true, - draw_value: false, - on_change: ({ value }) => (audio.speaker.volume = value), - setup: (self) => - self.hook(audio.speaker, () => { - self.value = audio.speaker.volume || 0; - }), - }); - - return Widget.Box({ - class_name: "volume", - css: "min-width: 180px", - children: [icon, slider], - }); -} - -function BatteryLabel() { - const value = battery.bind("percent").as((p) => (p > 0 ? p / 100 : 0)); - const icon = battery - .bind("percent") - .as((p) => `battery-level-${Math.floor(p / 10) * 10}-symbolic`); - - return Widget.Box({ - class_name: "battery", - visible: battery.bind("available"), - children: [ - Widget.Icon({ icon }), - Widget.LevelBar({ - widthRequest: 140, - vpack: "center", - value, - }), - ], - }); -} - -function SysTray() { - const items = systemtray.bind("items").as((items) => - items.map((item) => - Widget.Button({ - child: Widget.Icon({ icon: item.bind("icon") }), - on_primary_click: (_, event) => item.activate(event), - on_secondary_click: (_, event) => item.openMenu(event), - tooltip_markup: item.bind("tooltip_markup"), - }), - ), - ); - - return Widget.Box({ - children: items, - }); -} - -// layout of the bar -function Left() { - return Widget.Box({}); -} - -function Center() { - return Widget.Box({ - spacing: 8, - children: [Media()], - }); -} - -function Right() { - return Widget.Box({ - hpack: "end", - spacing: 8, - children: [Volume(), BatteryLabel(), Clock(), SysTray()], - }); -} - -function Bar() { - return Widget.Window({ - name: "bar", // name has to be unique - class_name: "bar", - anchor: ["top", "left", "right"], - exclusivity: "exclusive", - child: Widget.CenterBox({ - start_widget: Left(), - center_widget: Center(), - end_widget: Right(), - }), - }); -} - -App.config({ - style: "./style.css", - windows: [Bar(), NotificationPopups()], -}); - -export {}; diff --git a/home/programs/ags/default.nix b/home/programs/ags/default.nix deleted file mode 100644 index 3d65b1b..0000000 --- a/home/programs/ags/default.nix +++ /dev/null @@ -1,42 +0,0 @@ -{ - inputs, - pkgs, - config, - ... -}: let - cfg = config.programs.ags; -in { - imports = [inputs.ags.homeManagerModules.default]; - - home.packages = with pkgs; [ - libdbusmenu-gtk3 - dart-sass - ]; - - programs.ags = { - enable = true; - - # null or path, leave as null if you don't want hm to manage the config - configDir = ./.; - - # additional packages to add to gjs's runtime - extraPackages = with pkgs; [ - gtksourceview - webkitgtk - accountsservice - ]; - }; - systemd.user.services.ags = { - Unit = { - Description = "Aylur's Gtk Shell"; - PartOf = [ - "graphical-session.target" - ]; - }; - Service = { - ExecStart = "${cfg.package}/bin/ags"; - Restart = "on-failure"; - }; - Install.WantedBy = ["graphical-session.target"]; - }; -} diff --git a/home/programs/ags/notificationPopups.js b/home/programs/ags/notificationPopups.js deleted file mode 100644 index 70c92b4..0000000 --- a/home/programs/ags/notificationPopups.js +++ /dev/null @@ -1,124 +0,0 @@ -const notifications = await Service.import("notifications"); - -/** @param {import('resource:///com/github/Aylur/ags/service/notifications.js').Notification} n */ -function NotificationIcon({ app_entry, app_icon, image }) { - if (image) { - return Widget.Box({ - css: - `background-image: url("${image}");` + - "background-size: contain;" + - "background-repeat: no-repeat;" + - "background-position: center;", - }); - } - - let icon = "dialog-information-symbolic"; - if (Utils.lookUpIcon(app_icon)) icon = app_icon; - - if (app_entry && Utils.lookUpIcon(app_entry)) icon = app_entry; - - return Widget.Box({ - child: Widget.Icon(icon), - }); -} - -/** @param {import('resource:///com/github/Aylur/ags/service/notifications.js').Notification} n */ -function Notification(n) { - const icon = Widget.Box({ - vpack: "start", - class_name: "icon", - child: NotificationIcon(n), - }); - - const title = Widget.Label({ - class_name: "title", - xalign: 0, - justification: "left", - hexpand: true, - max_width_chars: 24, - truncate: "end", - wrap: true, - label: n.summary, - use_markup: true, - }); - - const body = Widget.Label({ - class_name: "body", - hexpand: true, - use_markup: true, - xalign: 0, - justification: "left", - label: n.body, - wrap: true, - }); - - const actions = Widget.Box({ - class_name: "actions", - children: n.actions.map(({ id, label }) => - Widget.Button({ - class_name: "action-button", - on_clicked: () => { - n.invoke(id); - n.dismiss(); - }, - hexpand: true, - child: Widget.Label(label), - }), - ), - }); - - return Widget.EventBox( - { - attribute: { id: n.id }, - on_primary_click: n.dismiss, - }, - Widget.Box( - { - class_name: `notification ${n.urgency}`, - vertical: true, - }, - Widget.Box([icon, Widget.Box({ vertical: true }, title, body)]), - actions, - ), - ); -} - -export function NotificationPopups(monitor = 0) { - const list = Widget.Box({ - vertical: true, - children: notifications.popups.map(Notification), - }); - - function onNotified(_, /** @type {number} */ id) { - const n = notifications.getNotification(id); - if (n) list.children = [Notification(n), ...list.children]; - } - - function onDismissed(_, /** @type {number} */ id) { - list.children.find((n) => n.attribute.id === id)?.destroy(); - } - - list - .hook(notifications, onNotified, "notified") - .hook(notifications, onDismissed, "dismissed"); - - return Widget.Window({ - monitor, - name: `notifications${monitor}`, - class_name: "notification-popups", - anchor: ["top", "right"], - child: Widget.Box({ - css: "min-width: 2px; min-height: 2px;", - class_name: "notifications", - vertical: true, - child: list, - - /** this is a simple one liner that could be used instead of - hooking into the 'notified' and 'dismissed' signals. - but its not very optimized becuase it will recreate - the whole list everytime a notification is added or dismissed */ - // children: notifications.bind('popups') - // .as(popups => popups.map(Notification)) - }), - }); -} diff --git a/home/programs/ags/src/README.md b/home/programs/ags/src/README.md deleted file mode 100644 index be94d6b..0000000 --- a/home/programs/ags/src/README.md +++ /dev/null @@ -1,15 +0,0 @@ - -# Starter Config - -if suggestions don't work, first make sure -you have TypeScript LSP working in your editor - -if you do not want typechecking only suggestions - -```json -// tsconfig.json -"checkJs": false -``` - -types are symlinked to: -/home/nezia/.local/share/com.github.Aylur.ags/types diff --git a/home/programs/ags/style.css b/home/programs/ags/style.css deleted file mode 100644 index aeded67..0000000 --- a/home/programs/ags/style.css +++ /dev/null @@ -1,57 +0,0 @@ -window.notification-popups box.notifications { - padding: 0.5em; -} - -.icon { - min-width: 68px; - min-height: 68px; - margin-right: 1em; -} - -.icon image { - font-size: 58px; - /* to center the icon */ - margin: 5px; - color: @theme_fg_color; -} - -.icon box { - min-width: 68px; - min-height: 68px; - border-radius: 7px; -} - -.notification { - min-width: 350px; - border-radius: 11px; - padding: 1em; - margin: 0.5em; - border: 1px solid @wm_borders_edge; - background-color: @theme_bg_color; -} - -.notification.critical { - border: 1px solid lightcoral; -} - -.title { - color: @theme_fg_color; - font-size: 1.4em; -} - -.body { - color: @theme_unfocused_fg_color; -} - -.actions .action-button { - margin: 0 0.4em; - margin-top: 0.8em; -} - -.actions .action-button:first-child { - margin-left: 0; -} - -.actions .action-button:last-child { - margin-right: 0; -} diff --git a/home/programs/ags/tsconfig.json b/home/programs/ags/tsconfig.json deleted file mode 100644 index f03f2d1..0000000 --- a/home/programs/ags/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "ES2022", - "lib": [ - "ES2022" - ], - "allowJs": true, - "checkJs": true, - "strict": true, - "noImplicitAny": false, - "baseUrl": ".", - "typeRoots": [ - "./types" - ], - "skipLibCheck": true - } -} \ No newline at end of file