diff --git a/flake.lock b/flake.lock index 4720fdf5..6e6bda9e 100644 --- a/flake.lock +++ b/flake.lock @@ -3,14 +3,15 @@ "ags": { "inputs": { "astal": "astal", + "gnim": "gnim", "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1744557573, - "narHash": "sha256-XAyj0iDuI51BytJ1PwN53uLpzTDdznPDQFG4RwihlTQ=", + "lastModified": 1751930350, + "narHash": "sha256-hBIrzyrwG3XjeNyzVNWKDX+yYVlpwAqf9ovgF7qecug=", "owner": "aylur", "repo": "ags", - "rev": "3ed9737bdbc8fc7a7c7ceef2165c9109f336bff6", + "rev": "22f37ccb0db58d9d8a11ad0054ab20ecfad005ad", "type": "github" }, "original": { @@ -27,11 +28,11 @@ ] }, "locked": { - "lastModified": 1742571008, - "narHash": "sha256-5WgfJAeBpxiKbTR/gJvxrGYfqQRge5aUDcGKmU1YZ1Q=", + "lastModified": 1751126708, + "narHash": "sha256-AodIKw7TmI7rHVcOfEsO82stupMYIMVQeLAUQfVxnkU=", "owner": "aylur", "repo": "astal", - "rev": "dc0e5d37abe9424c53dcbd2506a4886ffee6296e", + "rev": "ac90f09385a2295da9fdc108aaba4a317aaeacc7", "type": "github" }, "original": { @@ -122,6 +123,22 @@ "url": "https://git.thomasave.be/thomasave/fzgo.git" } }, + "gnim": { + "flake": false, + "locked": { + "lastModified": 1751928958, + "narHash": "sha256-vQY2L+Hnp6F1MHFa3UbMft1goGw3iODI5M+96Z7P+9Q=", + "owner": "aylur", + "repo": "gnim", + "rev": "9bffa83f52f711b13e3c139454623a9aea4f5552", + "type": "github" + }, + "original": { + "owner": "aylur", + "repo": "gnim", + "type": "github" + } + }, "home-manager": { "inputs": { "nixpkgs": [ @@ -129,11 +146,11 @@ ] }, "locked": { - "lastModified": 1748925027, - "narHash": "sha256-BJ0qRIdvt5aeqm3zg/5if7b5rruG05zrSX3UpLqjDRk=", + "lastModified": 1751990210, + "narHash": "sha256-krWErNDl9ggMLSfK00Q2BcoSk3+IRTSON/DiDgUzzMw=", "owner": "nix-community", "repo": "home-manager", - "rev": "cb809ec1ff15cf3237c6592af9bbc7e4d983e98c", + "rev": "218da00bfa73f2a61682417efe74549416c16ba6", "type": "github" }, "original": { @@ -165,11 +182,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1743583204, - "narHash": "sha256-F7n4+KOIfWrwoQjXrL2wD9RhFYLs2/GGe/MQY1sSdlE=", + "lastModified": 1751792365, + "narHash": "sha256-J1kI6oAj25IG4EdVlg2hQz8NZTBNYvIS0l4wpr9KcUo=", "owner": "nixos", "repo": "nixpkgs", - "rev": "2c8d3f48d33929642c1c12cd243df4cc7d2ce434", + "rev": "1fd8bada0b6117e6c7eb54aad5813023eed37ccb", "type": "github" }, "original": { @@ -197,11 +214,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1748693115, - "narHash": "sha256-StSrWhklmDuXT93yc3GrTlb0cKSS0agTAxMGjLKAsY8=", + "lastModified": 1751792365, + "narHash": "sha256-J1kI6oAj25IG4EdVlg2hQz8NZTBNYvIS0l4wpr9KcUo=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "910796cabe436259a29a72e8d3f5e180fc6dfacc", + "rev": "1fd8bada0b6117e6c7eb54aad5813023eed37ccb", "type": "github" }, "original": { @@ -213,11 +230,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1748693115, - "narHash": "sha256-StSrWhklmDuXT93yc3GrTlb0cKSS0agTAxMGjLKAsY8=", + "lastModified": 1751792365, + "narHash": "sha256-J1kI6oAj25IG4EdVlg2hQz8NZTBNYvIS0l4wpr9KcUo=", "owner": "nixos", "repo": "nixpkgs", - "rev": "910796cabe436259a29a72e8d3f5e180fc6dfacc", + "rev": "1fd8bada0b6117e6c7eb54aad5813023eed37ccb", "type": "github" }, "original": { @@ -246,15 +263,14 @@ "nur": { "inputs": { "flake-parts": "flake-parts_2", - "nixpkgs": "nixpkgs_4", - "treefmt-nix": "treefmt-nix" + "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1748943257, - "narHash": "sha256-44lxtii7wjgu/rEsE5PD3uVbjn52ASUT4vAB0RiL1Jg=", + "lastModified": 1752056583, + "narHash": "sha256-dtBwaZET1p20izsqoIDnx7BzU25t7AwaoVmnCgv9kqw=", "owner": "nix-community", "repo": "NUR", - "rev": "33a35d4d8e1f6c01c4bd10aae0f3ac3e085e1737", + "rev": "9db2aa1b8673461fef354c788abe40e0973b0427", "type": "github" }, "original": { @@ -274,27 +290,6 @@ "worktimer": "worktimer" } }, - "treefmt-nix": { - "inputs": { - "nixpkgs": [ - "nur", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1733222881, - "narHash": "sha256-JIPcz1PrpXUCbaccEnrcUS8jjEb/1vJbZz5KkobyFdM=", - "owner": "numtide", - "repo": "treefmt-nix", - "rev": "49717b5af6f80172275d47a418c9719a31a78b53", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "treefmt-nix", - "type": "github" - } - }, "worktimer": { "inputs": { "flake-parts": "flake-parts_3", diff --git a/home/Aloria.nix b/home/Aloria.nix index 327bc9cc..be1ad01d 100644 --- a/home/Aloria.nix +++ b/home/Aloria.nix @@ -45,9 +45,9 @@ in wayland.windowManager.hyprland.settings = { monitor = [ - "eDP-1,2880x1800@120.00Hz,0x0,1.2" - "DP-1,3840x2160@60.00Hz,0x-2160,1" - "HDMI-A-1,3840x2160@60.00Hz,0x-2160,1" + "eDP-1,2880x1800@120.00Hz,0x284,1.2,vrr,1" + "DP-1,1920x1080,6240x500,1" + "HDMI-A-1,3840x2160@60.00Hz,2400x0,1" ]; bind = [ ", XF86PowerOff, exec, ${pkgs.rofi}/bin/rofi -show power-menu -modi power-menu:${ diff --git a/home/ags/default.nix b/home/ags/default.nix index 472f2600..ee04d108 100644 --- a/home/ags/default.nix +++ b/home/ags/default.nix @@ -2,7 +2,6 @@ { # add the home manager module imports = [ inputs.ags.homeManagerModules.default ]; - programs.ags = { enable = true; @@ -10,8 +9,8 @@ extraPackages = with inputs.ags.packages.${pkgs.system}; [ pkgs.gtksourceview - pkgs.webkitgtk pkgs.accountsservice + pkgs.libadwaita battery hyprland diff --git a/home/ags/files/Bar.tsx b/home/ags/files/Bar.tsx index bbdd9b0d..e02afdb8 100644 --- a/home/ags/files/Bar.tsx +++ b/home/ags/files/Bar.tsx @@ -1,11 +1,15 @@ -import { App, Astal, Gdk, Gtk, Widget } from "astal/gtk3"; -import { GLib, Variable, bind } from "astal"; +import { Astal, Gdk } from "ags/gtk4"; +import app from "ags/gtk4/app" +import Gtk from "gi://Gtk?version=4.0" +import { createBinding, createState, For, With, Accessor } from "ags" +import { createPoll } from "ags/time" import Tray from "gi://AstalTray"; -import { execAsync } from "astal/process" +import { execAsync } from "ags/process" import Hyprland from "gi://AstalHyprland"; import { getIconName } from "./utils"; import Wp from "gi://AstalWp" import Battery from "gi://AstalBattery" +import GLib from "gi://GLib"; const battery = Battery.get_default() const sensorsAvailable = await execAsync(['sensors']).then(() => true).catch(() => false); @@ -13,28 +17,35 @@ const wirePlumber = Wp.get_default(); function SysTray(): JSX.Element { const tray = Tray.get_default(); + let items = createBinding(tray, "items"); + const init = (btn: Gtk.MenuButton, item: Tray.TrayItem) => { + btn.menuModel = item.menuModel + btn.insert_action_group("dbusmenu", item.actionGroup) + item.connect("notify::action-group", () => { + btn.insert_action_group("dbusmenu", item.actionGroup) + }) + } return ( - {bind(tray, "items").as((items) => - items.map((item) => { - if (item.iconThemePath) App.add_icons(item.iconThemePath); + + {(item: Tray.TrayItem) => { + if (item.iconThemePath) app.add_icons(item.iconThemePath); return ( ["dbusmenu", ag])} - menuModel={bind(item, "menuModel")}> - + $={(self) => init(self, item)} + class="systray" + tooltipMarkup={createBinding(item, "tooltipMarkup")} + menuModel={createBinding(item, "menuModel")}> + ); - }), - )} + }} + ); } -function Left() : JSX.Element { +function Left(): JSX.Element { return ( @@ -42,7 +53,7 @@ function Left() : JSX.Element { ); } -function Center() : JSX.Element { +function Center(): JSX.Element { return ( @@ -51,85 +62,77 @@ function Center() : JSX.Element { } function Date({ format = "%Y-%m-%d" }): JSX.Element { - const time = Variable("").poll(60000, () => - GLib.DateTime.new_now_local().format(format)!) + const time = createPoll("", 60000, () => GLib.DateTime.new_now_local().format(format)!) return } function Icons() { return ( - + @@ -173,60 +177,74 @@ function Volume(): JSX.Element { if (!wirePlumber) return ; const audio = wirePlumber.audio; - const icon = bind(audio.default_speaker, "volume").as((volume) => { - const vol = volume * 100 - const icon = [ - [101, 'overamplified'], - [67, 'high'], - [34, 'medium'], - [1, 'low'], - [0, 'muted'], - ].find(([threshold]) => Number(threshold) <= vol)?.[1] - return `audio-volume-${icon}-symbolic` + const icon = createBinding(audio.default_speaker, "volume").as((volume) => { + const vol = volume * 100 + const icon = [ + [101, 'overamplified'], + [67, 'high'], + [34, 'medium'], + [1, 'low'], + [0, 'muted'], + ].find(([threshold]) => Number(threshold) <= vol)?.[1] + return `audio-volume-${icon}-symbolic` }); - const css = bind(audio.default_speaker, "mute").as((mute) => { - return mute ? "margin-left:0;": "margin-left: 0.7em;" + const css = createBinding(audio.default_speaker, "mute").as((mute) => { + return mute ? "margin-left:0;" : "margin-left: 0.7em;" }); + let volume = createBinding(audio.default_speaker, "volume"); + let mute = createBinding(audio.default_speaker, "mute"); return ( - ); } -function Workspaces() : JSX.Element { +function Workspaces(): JSX.Element { const hyprland = Hyprland.get_default(); + let workspaces = createBinding(hyprland, "workspaces"); return ( - - {bind(hyprland, "workspaces").as((wss) => - - {bind(hyprland, "focusedMonitor").as((fm) => - wss.sort((a, b) => a.id - b.id) - .filter(ws => ws && ws.get_monitor() && ws.get_monitor().get_id() === fm.get_id()) - .map((ws) => ( - - )))} - - )} + + + {(wss: Array) => ( + + + {(fm: Hyprland.Monitor) => { + let filtered_wss = new Accessor(() => wss.sort((a, b) => a.id - b.id) + .filter(ws => ws && ws.get_monitor() && ws.get_monitor().get_id() === fm.get_id())) + return ( + + + {(ws: Hyprland.Workspace, _index) => ( + + )} + + + ) + }} + + + )} + ); } @@ -235,59 +253,66 @@ function shorten(title: string) { return title.length > 40 ? title.slice(0, 20) + "..." : title } -function Clients() : JSX.Element { +function Clients(): JSX.Element { const hyprland = Hyprland.get_default(); + let clients = createBinding(hyprland, "clients") return ( - { - bind(hyprland, "focusedWorkspace").as(fw => ( - - { - bind(hyprland, "clients").as(cls => - cls - .sort((a, b) => a.pid - b.pid) - .filter(cl => !cl.title.includes("rofi")) - .filter(cl => fw && cl.get_workspace().get_id() === fw.get_id()) - .map(cl => ( - a && a.address === cl.address ? "focused" : "unfocused")} - > - - + } + + ); } -export default function Bar(gdkmonitor: Gdk.Monitor, scaleFactor: number = 1): Widget.Window { - return new Widget.Window({ - gdkmonitor, - css: "font-size: " + scaleFactor + "em;", - exclusivity: Astal.Exclusivity.EXCLUSIVE, - anchor: Astal.WindowAnchor.TOP | Astal.WindowAnchor.LEFT | Astal.WindowAnchor.RIGHT, - application: App, - className: "Bar", - name: "top-bar", - setup: self => self.connect("destroy", () => { - print("Detroying bar"); - App.remove_window(self); - }), - child: - -
- +export default function Bar(gdkmonitor: Gdk.Monitor, scaleFactor: number = 1) { + console.log("Creating Bar on monitor:", gdkmonitor); + return ( + + + +
+ - }) + + ) } diff --git a/home/ags/files/app.ts b/home/ags/files/app.ts index 1d896d2a..2e88a286 100644 --- a/home/ags/files/app.ts +++ b/home/ags/files/app.ts @@ -1,8 +1,10 @@ -import { App, Gdk, Widget } from "astal/gtk3" +import app from "ags/gtk4/app" import style from "./style.scss" import Bar from "./Bar" import Hyprland from "gi://AstalHyprland"; import NotificationPopups from "./notifications/NotificationPopups" +import Gtk from "gi://Gtk?version=4.0"; +import { Gdk } from "ags/gtk4"; const hyprland = Hyprland.get_default(); @@ -22,21 +24,26 @@ function find_main_monitor(): Hyprland.Monitor { } function register_windows(monitor: Hyprland.Monitor) { - let gtkMonitor = App.get_monitors()[0].get_display().get_monitor_at_point(monitor.get_x(), monitor.get_y()) - let scale = (monitor.get_width() >= 3000)? 1.2: 1 + let gtkMonitors = app.get_monitors()[0].get_display().get_monitors() + let gtkMonitor = gtkMonitors.get_item(0) + if (!gtkMonitor) { + console.error("No GTK monitor found for the Hyprland monitor:", monitor.get_name()); + return; + } + let scale = (monitor.get_width() >= 3000) ? 1.2 : 1 Bar(gtkMonitor, scale) - NotificationPopups(gtkMonitor) + NotificationPopups() } function switch_to_best_monitor() { let mainMonitor = find_main_monitor() - for (var wd of App.get_windows()) { + for (var wd of app.get_windows()) { wd.destroy(); } register_windows(mainMonitor); } -hyprland.connect("monitor-added", (_, monitor) => { +hyprland.connect("monitor-added", (_, _monitor: Hyprland.Monitor) => { switch_to_best_monitor() }) @@ -44,7 +51,7 @@ hyprland.connect("monitor-removed", () => { switch_to_best_monitor() }) -App.start({ +app.start({ css: style, iconTheme: "Papirus", main() { diff --git a/home/ags/files/env.d.ts b/home/ags/files/env.d.ts index 467c0a41..792ebfda 100644 --- a/home/ags/files/env.d.ts +++ b/home/ags/files/env.d.ts @@ -1,21 +1,21 @@ declare const SRC: string declare module "inline:*" { - const content: string - export default content + const content: string + export default content } declare module "*.scss" { - const content: string - export default content + const content: string + export default content } declare module "*.blp" { - const content: string - export default content + const content: string + export default content } declare module "*.css" { - const content: string - export default content + const content: string + export default content } diff --git a/home/ags/files/notifications/Notification.scss b/home/ags/files/notifications/Notification.scss index 0b59a912..b4041c94 100644 --- a/home/ags/files/notifications/Notification.scss +++ b/home/ags/files/notifications/Notification.scss @@ -1,125 +1,110 @@ @use "sass:string"; @function gtkalpha($c, $a) { - @return string.unquote("alpha(#{$c},#{$a})"); + @return string.unquote("alpha(#{$c},#{$a})"); } // https://gitlab.gnome.org/GNOME/gtk/-/blob/gtk-3-24/gtk/theme/Adwaita/_colors-public.scss -$fg-color: #{"@theme_fg_color"}; +$fg-color: #{"@theme_bg_color"}; $bg-color: #1f2430; $error: red; window.NotificationPopups { - all: unset; + all: unset; } -eventbox.Notification { +.Notification { + border-radius: 13px; + background-color: $bg-color; + margin: 0.5rem 1rem 0.5rem 1rem; + box-shadow: 2px 3px 8px 0 gtkalpha(black, 0.4); + border: 1pt solid gtkalpha($fg-color, 0.03); - &:first-child>box { - margin-top: 1rem; - } - - &:last-child>box { - margin-bottom: 1rem; - } - - // eventboxes can not take margins so we style its inner box instead - >box { - min-width: 400px; - border-radius: 13px; - background-color: #1f2430; - margin: .5rem 1rem .5rem 1rem; - box-shadow: 2px 3px 8px 0 gtkalpha(black, .4); - border: 1pt solid gtkalpha($fg-color, .03); - } - - &.critical>box { - border: 1pt solid gtkalpha($error, .4); - - .header { - - .app-name { - color: gtkalpha($error, .8); - - } - - .app-icon { - color: gtkalpha($error, .6); - } - } - } + &.critical { + border: 1pt solid gtkalpha($error, 0.4); .header { - padding: .5rem; - color: gtkalpha($fg-color, 0.5); + .app-name { + color: gtkalpha($error, 0.8); + } - .app-icon { - margin: 0 .4rem; - } + .app-icon { + color: gtkalpha($error, 0.6); + } + } + } - .app-name { - margin-right: .3rem; - font-weight: bold; + .header { + padding: 0.5rem; + color: gtkalpha($fg-color, 0.5); - &:first-child { - margin-left: .4rem; - } - } - - .time { - margin: 0 .4rem; - } - - button { - padding: .2rem; - min-width: 0; - min-height: 0; - } + .app-icon { + margin: 0 0.4rem; } - separator { - margin: 0 .4rem; - background-color: gtkalpha($fg-color, .1); + .app-name { + margin-right: 0.3rem; + font-weight: bold; + + &:first-child { + margin-left: 0.4rem; + } } - .content { - margin: 1rem; - margin-top: .5rem; - - .summary { - font-size: 1.2em; - color: $fg-color; - } - - .body { - color: gtkalpha($fg-color, 0.8); - } - - .image { - border: 1px solid gtkalpha($fg-color, .02); - margin-right: .5rem; - border-radius: 9px; - min-width: 100px; - min-height: 100px; - background-size: cover; - background-position: center; - } + .time { + margin: 0 0.4rem; } - .actions { - margin: 1rem; - margin-top: 0; - - button { - margin: 0 .3rem; - - &:first-child { - margin-left: 0; - } - - &:last-child { - margin-right: 0; - } - } + button { + padding: 0.2rem; + min-width: 0; + min-height: 0; } + } + + separator { + margin: 0 0.4rem; + background-color: gtkalpha($fg-color, 0.1); + } + + .content { + margin: 1rem; + margin-top: 0.5rem; + + .summary { + font-size: 1.2em; + color: $fg-color; + } + + .body { + color: gtkalpha($fg-color, 0.8); + } + + .image { + border: 1px solid gtkalpha($fg-color, 0.02); + margin-right: 0.5rem; + border-radius: 9px; + min-width: 100px; + min-height: 100px; + background-size: cover; + background-position: center; + } + } + + .actions { + margin: 1rem; + margin-top: 0; + + button { + margin: 0 0.3rem; + + &:first-child { + margin-left: 0; + } + + &:last-child { + margin-right: 0; + } + } + } } diff --git a/home/ags/files/notifications/Notification.tsx b/home/ags/files/notifications/Notification.tsx index 5149d5b7..d1cc08c6 100644 --- a/home/ags/files/notifications/Notification.tsx +++ b/home/ags/files/notifications/Notification.tsx @@ -1,107 +1,124 @@ -import { GLib } from "astal" -import { Gtk, Astal } from "astal/gtk3" -import { type EventBox } from "astal/gtk3/widget" -import Notifd from "gi://AstalNotifd" +import Gtk from "gi://Gtk?version=4.0" +import Gdk from "gi://Gdk?version=4.0" +import Adw from "gi://Adw" +import GLib from "gi://GLib" +import AstalNotifd from "gi://AstalNotifd" +import Pango from "gi://Pango" +import { timeout } from "ags/time" -const isIcon = (icon: string) => - !!Astal.Icon.lookup_icon(icon) +function isIcon(icon?: string | null) { + const iconTheme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default()!) + return icon && iconTheme.has_icon(icon) +} -const fileExists = (path: string) => - GLib.file_test(path, GLib.FileTest.EXISTS) +function fileExists(path: string) { + return GLib.file_test(path, GLib.FileTest.EXISTS) +} -const time = (time: number, format = "%H:%M") => GLib.DateTime - .new_from_unix_local(time) - .format(format)! +function time(time: number, format = "%H:%M") { + return GLib.DateTime.new_from_unix_local(time).format(format)! +} -const urgency = (n: Notifd.Notification) => { - const { LOW, NORMAL, CRITICAL } = Notifd.Urgency - // match operator when? +function urgency(n: AstalNotifd.Notification) { + const { LOW, NORMAL, CRITICAL } = AstalNotifd.Urgency switch (n.urgency) { - case LOW: return "low" - case CRITICAL: return "critical" + case LOW: + return "low" + case CRITICAL: + return "critical" case NORMAL: - default: return "normal" + default: + return "normal" } } -type Props = { - setup(self: EventBox): void - onHoverLost(self: EventBox): void - notification: Notifd.Notification -} - -export default function Notification(props: Props) { - const { notification: n, onHoverLost, setup } = props - const { START, CENTER, END } = Gtk.Align - - return - - - {(n.appIcon || n.desktopEntry) && } - - - - {n.image && fileExists(n.image) && } - {n.image && isIcon(n.image) && - - } - +export default function Notification({ + notification: n, + onHoverLost, +}: { + notification: AstalNotifd.Notification + onHoverLost: () => void +}) { + const timer = timeout(3000, () => { + onHoverLost() + }) + return ( + + + timer.cancel()} onLeave={onHoverLost} /> + + {(n.appIcon || isIcon(n.desktopEntry)) && ( + + )} - - {n.get_actions().length > 0 && - {n.get_actions().map(({ label, id }) => ( - - ))} - } - - + + + + {n.image && fileExists(n.image) && ( + + )} + {n.image && isIcon(n.image) && ( + + + + )} + + + + {n.actions.length > 0 && ( + + {n.actions.map(({ label, id }) => ( + + ))} + + )} + + + ) } diff --git a/home/ags/files/notifications/NotificationPopups.tsx b/home/ags/files/notifications/NotificationPopups.tsx index 616b1ea4..2a8aab99 100644 --- a/home/ags/files/notifications/NotificationPopups.tsx +++ b/home/ags/files/notifications/NotificationPopups.tsx @@ -1,105 +1,65 @@ -import { Astal, Gtk, Gdk } from "astal/gtk3" -import Notifd from "gi://AstalNotifd" +import app from "ags/gtk4/app" +import { Astal, Gtk } from "ags/gtk4" +import AstalNotifd from "gi://AstalNotifd" import Notification from "./Notification" -import { type Subscribable } from "astal/binding" -import { GLib, Variable, bind, timeout } from "astal" +import { createBinding, For, createState, onCleanup } from "ags" -// see comment below in constructor -const TIMEOUT_DELAY = 5000 +export default function NotificationPopups() { + const monitors = createBinding(app, "monitors") -// The purpose if this class is to replace Variable> -// with a Map type in order to track notification widgets -// by their id, while making it conviniently bindable as an array -class NotifiationMap implements Subscribable { - // the underlying map to keep track of id widget pairs - private map: Map = new Map() + const notifd = AstalNotifd.get_default() - // it makes sense to use a Variable under the hood and use its - // reactivity implementation instead of keeping track of subscribers ourselves - private var: Variable> = Variable([]) + const [notifications, setNotifications] = createState( + new Array(), + ) - // notify subscribers to rerender when state changes - private notifiy() { - this.var.set([...this.map.values()].reverse()) - } + const notifiedHandler = notifd.connect("notified", (_, id, replaced) => { + const notification = notifd.get_notification(id) - private constructor() { - const notifd = Notifd.get_default() + if (replaced && notifications.get().some(n => n.id === id)) { + setNotifications((ns) => ns.map((n) => (n.id === id ? notification : n))) + } else { + setNotifications((ns) => [notification, ...ns]) + } + }) - /** - * uncomment this if you want to - * ignore timeout by senders and enforce our own timeout - * note that if the notification has any actions - * they might not work, since the sender already treats them as resolved - */ - // notifd.ignoreTimeout = true + const resolvedHandler = notifd.connect("resolved", (_, id) => { + setNotifications((ns) => ns.filter((n) => n.id !== id)) + }) - notifd.connect("notified", (_, id) => { - this.set(id, Notification({ - notification: notifd.get_notification(id)!, + // technically, we don't need to cleanup because in this example this is a root component + // and this cleanup function is only called when the program exits, but exiting will cleanup either way + // but it's here to remind you that you should not forget to cleanup signal connections + onCleanup(() => { + notifd.disconnect(notifiedHandler) + notifd.disconnect(resolvedHandler) + }) - // once hovering over the notification is done - // destroy the widget without calling notification.dismiss() - // so that it acts as a "popup" and we can still display it - // in a notification center like widget - // but clicking on the close button will close it - onHoverLost: () => this.delete(id), - - // notifd by default does not close notifications - // until user input or the timeout specified by sender - // which we set to ignore above - setup: () => timeout(TIMEOUT_DELAY, () => { - /** - * uncomment this if you want to "hide" the notifications - * after TIMEOUT_DELAY - */ - this.delete(id) - }) - })) - }) - - // notifications can be closed by the outside before - // any user input, which have to be handled too - notifd.connect("resolved", (_, id) => { - this.delete(id) - }) - } - - private set(key: number, value: Gtk.Widget) { - // in case of replacecment destroy previous widget - this.map.get(key)?.destroy() - this.map.set(key, value) - this.notifiy() - } - - private delete(key: number) { - this.map.get(key)?.destroy() - this.map.delete(key) - this.notifiy() - } - - // needed by the Subscribable interface - get() { - return this.var.get() - } - - // needed by the Subscribable interface - subscribe(callback: (list: Array) => void) { - return this.var.subscribe(callback) - } -} - -export default function NotificationPopups(gdkmonitor: Gdk.Monitor) { - const { TOP, RIGHT } = Astal.WindowAnchor - const notifs = new NotifiationMap() - - return - - {bind(notifs)} - - + return ( + (win as Gtk.Window).destroy()}> + {(monitor) => ( + ns.length > 0)} + anchor={Astal.WindowAnchor.TOP | Astal.WindowAnchor.RIGHT} + > + + + {(notification) => ( + + setNotifications((ns) => + ns.filter((n) => n.id !== notification.id), + ) + } + /> + )} + + + + )} + + ) } diff --git a/home/ags/files/package.json b/home/ags/files/package.json new file mode 100644 index 00000000..9805e006 --- /dev/null +++ b/home/ags/files/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "ags": "*" + } +} diff --git a/home/ags/files/style.scss b/home/ags/files/style.scss index 28e132da..e3ef1137 100644 --- a/home/ags/files/style.scss +++ b/home/ags/files/style.scss @@ -17,7 +17,7 @@ window.Bar { margin-top: 0.2em; } - .clients box { + .clients box box { margin-right: 0.3em; } @@ -27,11 +27,13 @@ window.Bar { border-radius: 0.3em; background: #1f2430; } + .battery-item:hover { background: #023269; } - .item, .clients box { + .item, + .clients box box { background: #1f2430; padding-left: 0.7em; padding-right: 0.7em; @@ -49,12 +51,14 @@ window.Bar { button { background: #1f2430; - border:none; + border: none; padding: 0.2em; border-radius: 0.3em; + font-weight: normal; } - .focused, .clients box.focused { + .focused, + .clients box.focused { background: #023269; } diff --git a/home/ags/files/tsconfig.json b/home/ags/files/tsconfig.json index fc324635..b81c2ffa 100644 --- a/home/ags/files/tsconfig.json +++ b/home/ags/files/tsconfig.json @@ -1,22 +1,16 @@ { "$schema": "https://json.schemastore.org/tsconfig", "compilerOptions": { - "experimentalDecorators": true, "strict": true, - "target": "ES2022", "module": "ES2022", + "target": "ES2020", + "lib": [ + "ES2023" + ], "moduleResolution": "Bundler", // "checkJs": true, // "allowJs": true, "jsx": "react-jsx", - "jsxImportSource": "/nix/store/1pd4fdq90f4vla3zghmfci9axsbvkd3w-astal-gjs/share/astal/gjs/gtk3", - "paths": { - "astal": [ - "/nix/store/1pd4fdq90f4vla3zghmfci9axsbvkd3w-astal-gjs/share/astal/gjs" - ], - "astal/*": [ - "/nix/store/1pd4fdq90f4vla3zghmfci9axsbvkd3w-astal-gjs/share/astal/gjs/*" - ] - }, + "jsxImportSource": "ags/gtk4" } } diff --git a/home/ags/flake.nix b/home/ags/flake.nix index 6c6bccf2..94bb91cd 100644 --- a/home/ags/flake.nix +++ b/home/ags/flake.nix @@ -18,7 +18,6 @@ pkgs = nixpkgs.legacyPackages.${system}; extraPackages = with ags.packages.${pkgs.system}; [ pkgs.gtksourceview - pkgs.webkitgtk pkgs.accountsservice battery diff --git a/home/firefox/default.nix b/home/firefox/default.nix index f447045a..2a64db8e 100644 --- a/home/firefox/default.nix +++ b/home/firefox/default.nix @@ -49,8 +49,6 @@ in Value = "strict"; Status = "locked"; }; - "browser.uiCustomization.state" = '' -{"placements":{"widget-overflow-fixed-list":["fxa-toolbar-menu-button","developer-button"],"unified-extensions-area":["sponsorblocker_ajay_app-browser-action","_testpilot-containers-browser-action","_531906d3-e22f-4a6c-a102-8057b88a1a63_-browser-action","beyond20_kakaroto_homelinux_net-browser-action","_d7742d87-e61d-4b78-b8a1-b469842139fa_-browser-action","_contain-facebook-browser-action","jid1-kkzogwgsw3ao4q_jetpack-browser-action","jid1-mnnxcxisbpnsxq_jetpack-browser-action","_74145f27-f039-47ce-a470-a662b129930a_-browser-action","chrome-gnome-shell_gnome_org-browser-action","_ea4204c0-3209-4116-afd2-2a208e21a779_-browser-action","_f209234a-76f0-4735-9920-eb62507a54cd_-browser-action","_762f9885-5a13-4abd-9c77-433dcd38b8fd_-browser-action","display-anchors_robwu_nl-browser-action","firefoxcolor_mozilla_com-browser-action","search_kagi_com-browser-action","_7a7a4a92-a2a0-41d1-9fd7-1e92480d612d_-browser-action"],"nav-bar":["back-button","forward-button","stop-reload-button","urlbar-container","downloads-button","_446900e4-71c2-419f-a6a7-df9c091e268b_-browser-action","_12cf650b-1822-40aa-bff0-996df6948878_-browser-action","_3e4d2037-d300-4e95-859d-3cba866f46d3_-browser-action","save-as-pdf-ff_pdfcrowd_com-browser-action","user-agent-switcher_ninetailed_ninja-browser-action","_d66c8515-1e0d-408f-82ee-2682f2362726_-browser-action","ublock0_raymondhill_net-browser-action","reset-pbm-toolbar-button","adguardadblocker_adguard_com-browser-action","unified-extensions-button"],"toolbar-menubar":["menubar-items"],"TabsToolbar":["tabbrowser-tabs","new-tab-button","alltabs-button"],"PersonalToolbar":["import-button","personal-bookmarks"]},"seen":["developer-button","profiler-button","chrome-gnome-shell_gnome_org-browser-action","_446900e4-71c2-419f-a6a7-df9c091e268b_-browser-action","_74145f27-f039-47ce-a470-a662b129930a_-browser-action","_contain-facebook-browser-action","_testpilot-containers-browser-action","jid1-kkzogwgsw3ao4q_jetpack-browser-action","jid1-mnnxcxisbpnsxq_jetpack-browser-action","ublock0_raymondhill_net-browser-action","_531906d3-e22f-4a6c-a102-8057b88a1a63_-browser-action","beyond20_kakaroto_homelinux_net-browser-action","_12cf650b-1822-40aa-bff0-996df6948878_-browser-action","_3e4d2037-d300-4e95-859d-3cba866f46d3_-browser-action","save-as-pdf-ff_pdfcrowd_com-browser-action","_d7742d87-e61d-4b78-b8a1-b469842139fa_-browser-action","user-agent-switcher_ninetailed_ninja-browser-action","_d66c8515-1e0d-408f-82ee-2682f2362726_-browser-action","_ea4204c0-3209-4116-afd2-2a208e21a779_-browser-action","adguardadblocker_adguard_com-browser-action","_f209234a-76f0-4735-9920-eb62507a54cd_-browser-action","_762f9885-5a13-4abd-9c77-433dcd38b8fd_-browser-action","sponsorblocker_ajay_app-browser-action","display-anchors_robwu_nl-browser-action","firefoxcolor_mozilla_com-browser-action","search_kagi_com-browser-action","_7a7a4a92-a2a0-41d1-9fd7-1e92480d612d_-browser-action"],"dirtyAreaCache":["nav-bar","PersonalToolbar","toolbar-menubar","TabsToolbar","widget-overflow-fixed-list","unified-extensions-area"],"currentVersion":20,"newElementCount":11}''; "privacy.trackingprotection.enabled" = true; }; }; diff --git a/home/mpv/files/mpv.conf b/home/mpv/files/mpv.conf index 21cab81e..aa0be687 100644 --- a/home/mpv/files/mpv.conf +++ b/home/mpv/files/mpv.conf @@ -8,7 +8,7 @@ video-sync=display-resample interpolation tscale=oversample vo=gpu-next -gpu-api=opengl +hwdec=auto force-window=yes keep-open=yes diff --git a/home/utils/common.nix b/home/utils/common.nix index 72e9a830..e475de13 100644 --- a/home/utils/common.nix +++ b/home/utils/common.nix @@ -10,6 +10,7 @@ ../lf ../tmux ../yazi + ../zellij ]; home.stateVersion = "24.11"; @@ -20,6 +21,7 @@ waypipe inputs.worktimer.packages.${pkgs.system}.default usbutils + gocryptfs ]; programs.nh = { enable = true; diff --git a/home/utils/desktop.nix b/home/utils/desktop.nix index 25ac3677..c0171a13 100644 --- a/home/utils/desktop.nix +++ b/home/utils/desktop.nix @@ -16,6 +16,7 @@ ]; home.packages = with pkgs; [ + spotify slack eid-mw onlyoffice-bin @@ -80,6 +81,8 @@ services.cliphist = { enable = true; }; + services.mpris-proxy.enable = true; # Bluetooth media control + xdg.mimeApps = { enable = true; defaultApplications = { diff --git a/home/yazi/default.nix b/home/yazi/default.nix index 9847b036..6692d0ff 100644 --- a/home/yazi/default.nix +++ b/home/yazi/default.nix @@ -5,7 +5,7 @@ enable = true; enableZshIntegration = true; settings = { - manager = { + mgr = { sort_by = "natural"; }; }; diff --git a/home/zellij/default.nix b/home/zellij/default.nix new file mode 100644 index 00000000..2072221c --- /dev/null +++ b/home/zellij/default.nix @@ -0,0 +1,10 @@ +{ config, ... }: +{ + programs.zellij = { + enable = true; + }; + home.file."${config.xdg.configHome}/zellij" = { + source = ./files; + recursive = true; + }; +} diff --git a/home/zellij/files/config.kdl b/home/zellij/files/config.kdl new file mode 100644 index 00000000..fd7379d9 --- /dev/null +++ b/home/zellij/files/config.kdl @@ -0,0 +1,451 @@ +ui { + pane_frames { + hide_session_name true + } +} + +keybinds clear-defaults=true { + locked { + bind "Ctrl a" { SwitchToMode "normal"; } + bind "Ctrl H" { MoveFocus "left"; } + bind "Ctrl J" { MoveFocus "down"; } + bind "Ctrl K" { MoveFocus "up"; } + bind "Ctrl L" { MoveFocus "right"; } + } + normal { + bind "-" { NewPane "down"; SwitchToMode "locked"; } + bind "|" { NewPane "right"; SwitchToMode "locked"; } + bind "c" { NewTab; SwitchToMode "locked"; } + bind "d" { Detach; } + bind "n" { GoToNextTab; SwitchToMode "locked"; } + } + pane { + bind "left" { MoveFocus "left"; } + bind "down" { MoveFocus "down"; } + bind "up" { MoveFocus "up"; } + bind "right" { MoveFocus "right"; } + bind "c" { SwitchToMode "renamepane"; PaneNameInput 0; } + bind "d" { NewPane "down"; SwitchToMode "locked"; } + bind "e" { TogglePaneEmbedOrFloating; SwitchToMode "locked"; } + bind "f" { ToggleFocusFullscreen; SwitchToMode "locked"; } + bind "h" { MoveFocus "left"; } + bind "i" { TogglePanePinned; SwitchToMode "locked"; } + bind "j" { MoveFocus "down"; } + bind "k" { MoveFocus "up"; } + bind "l" { MoveFocus "right"; } + bind "n" { NewPane; SwitchToMode "locked"; } + bind "p" { SwitchToMode "normal"; } + bind "r" { NewPane "right"; SwitchToMode "locked"; } + bind "w" { ToggleFloatingPanes; SwitchToMode "locked"; } + bind "x" { CloseFocus; SwitchToMode "locked"; } + bind "z" { TogglePaneFrames; SwitchToMode "locked"; } + bind "tab" { SwitchFocus; } + } + tab { + bind "left" { GoToPreviousTab; } + bind "down" { GoToNextTab; } + bind "up" { GoToPreviousTab; } + bind "right" { GoToNextTab; } + bind "1" { GoToTab 1; SwitchToMode "locked"; } + bind "2" { GoToTab 2; SwitchToMode "locked"; } + bind "3" { GoToTab 3; SwitchToMode "locked"; } + bind "4" { GoToTab 4; SwitchToMode "locked"; } + bind "5" { GoToTab 5; SwitchToMode "locked"; } + bind "6" { GoToTab 6; SwitchToMode "locked"; } + bind "7" { GoToTab 7; SwitchToMode "locked"; } + bind "8" { GoToTab 8; SwitchToMode "locked"; } + bind "9" { GoToTab 9; SwitchToMode "locked"; } + bind "[" { BreakPaneLeft; SwitchToMode "locked"; } + bind "]" { BreakPaneRight; SwitchToMode "locked"; } + bind "b" { BreakPane; SwitchToMode "locked"; } + bind "h" { GoToPreviousTab; } + bind "j" { GoToNextTab; } + bind "k" { GoToPreviousTab; } + bind "l" { GoToNextTab; } + bind "n" { NewTab; SwitchToMode "locked"; } + bind "r" { SwitchToMode "renametab"; TabNameInput 0; } + bind "s" { ToggleActiveSyncTab; SwitchToMode "locked"; } + bind "t" { SwitchToMode "normal"; } + bind "x" { CloseTab; SwitchToMode "locked"; } + bind "tab" { ToggleTab; } + } + resize { + bind "left" { Resize "Increase left"; } + bind "down" { Resize "Increase down"; } + bind "up" { Resize "Increase up"; } + bind "right" { Resize "Increase right"; } + bind "+" { Resize "Increase"; } + bind "-" { Resize "Decrease"; } + bind "=" { Resize "Increase"; } + bind "H" { Resize "Decrease left"; } + bind "J" { Resize "Decrease down"; } + bind "K" { Resize "Decrease up"; } + bind "L" { Resize "Decrease right"; } + bind "h" { Resize "Increase left"; } + bind "j" { Resize "Increase down"; } + bind "k" { Resize "Increase up"; } + bind "l" { Resize "Increase right"; } + bind "r" { SwitchToMode "normal"; } + } + move { + bind "left" { MovePane "left"; } + bind "down" { MovePane "down"; } + bind "up" { MovePane "up"; } + bind "right" { MovePane "right"; } + bind "h" { MovePane "left"; } + bind "j" { MovePane "down"; } + bind "k" { MovePane "up"; } + bind "l" { MovePane "right"; } + bind "m" { SwitchToMode "normal"; } + bind "n" { MovePane; } + bind "p" { MovePaneBackwards; } + bind "tab" { MovePane; } + } + scroll { + bind "Alt left" { MoveFocusOrTab "left"; SwitchToMode "locked"; } + bind "Alt down" { MoveFocus "down"; SwitchToMode "locked"; } + bind "Alt up" { MoveFocus "up"; SwitchToMode "locked"; } + bind "Alt right" { MoveFocusOrTab "right"; SwitchToMode "locked"; } + bind "e" { EditScrollback; SwitchToMode "locked"; } + bind "f" { SwitchToMode "entersearch"; SearchInput 0; } + bind "Alt h" { MoveFocusOrTab "left"; SwitchToMode "locked"; } + bind "Alt j" { MoveFocus "down"; SwitchToMode "locked"; } + bind "Alt k" { MoveFocus "up"; SwitchToMode "locked"; } + bind "Alt l" { MoveFocusOrTab "right"; SwitchToMode "locked"; } + bind "s" { SwitchToMode "normal"; } + } + search { + bind "c" { SearchToggleOption "CaseSensitivity"; } + bind "n" { Search "down"; } + bind "o" { SearchToggleOption "WholeWord"; } + bind "p" { Search "up"; } + bind "w" { SearchToggleOption "Wrap"; } + } + session { + bind "a" { + LaunchOrFocusPlugin "zellij:about" { + floating true + move_to_focused_tab true + } + SwitchToMode "locked" + } + bind "c" { + LaunchOrFocusPlugin "configuration" { + floating true + move_to_focused_tab true + } + SwitchToMode "locked" + } + bind "d" { Detach; } + bind "o" { SwitchToMode "normal"; } + bind "p" { + LaunchOrFocusPlugin "plugin-manager" { + floating true + move_to_focused_tab true + } + SwitchToMode "locked" + } + bind "w" { + LaunchOrFocusPlugin "session-manager" { + floating true + move_to_focused_tab true + } + SwitchToMode "locked" + } + } + shared_among "normal" "locked" { + bind "Alt left" { MoveFocusOrTab "left"; } + bind "Alt down" { MoveFocus "down"; } + bind "Alt up" { MoveFocus "up"; } + bind "Alt right" { MoveFocusOrTab "right"; } + bind "Alt +" { Resize "Increase"; } + bind "Alt -" { Resize "Decrease"; } + bind "Alt =" { Resize "Increase"; } + bind "Alt [" { PreviousSwapLayout; } + bind "Alt ]" { NextSwapLayout; } + bind "Alt f" { ToggleFloatingPanes; } + bind "Alt h" { MoveFocusOrTab "left"; } + bind "Alt i" { MoveTab "left"; } + bind "Alt j" { MoveFocus "down"; } + bind "Alt k" { MoveFocus "up"; } + bind "Alt l" { MoveFocusOrTab "right"; } + bind "Alt n" { NewPane; } + bind "Alt o" { MoveTab "right"; } + } + shared_except "locked" "renametab" "renamepane" { + bind "Ctrl g" { SwitchToMode "locked"; } + bind "Ctrl q" { Quit; } + } + shared_except "locked" "entersearch" { + bind "enter" { SwitchToMode "locked"; } + } + shared_except "locked" "entersearch" "renametab" "renamepane" { + bind "esc" { SwitchToMode "locked"; } + } + shared_except "locked" "entersearch" "renametab" "renamepane" "move" { + bind "m" { SwitchToMode "move"; } + } + shared_except "locked" "entersearch" "search" "renametab" "renamepane" "session" { + bind "o" { SwitchToMode "session"; } + } + shared_except "locked" "tab" "entersearch" "renametab" "renamepane" { + bind "t" { SwitchToMode "tab"; } + } + shared_except "locked" "tab" "scroll" "entersearch" "renametab" "renamepane" { + bind "s" { SwitchToMode "scroll"; } + } + shared_among "normal" "resize" "tab" "scroll" "prompt" "tmux" { + bind "p" { SwitchToMode "pane"; } + } + shared_except "locked" "resize" "pane" "tab" "entersearch" "renametab" "renamepane" { + bind "r" { SwitchToMode "resize"; } + } + shared_among "scroll" "search" { + bind "PageDown" { PageScrollDown; } + bind "PageUp" { PageScrollUp; } + bind "left" { PageScrollUp; } + bind "down" { ScrollDown; } + bind "up" { ScrollUp; } + bind "right" { PageScrollDown; } + bind "Ctrl b" { PageScrollUp; } + bind "Ctrl c" { ScrollToBottom; SwitchToMode "locked"; } + bind "d" { HalfPageScrollDown; } + bind "Ctrl f" { PageScrollDown; } + bind "h" { PageScrollUp; } + bind "j" { ScrollDown; } + bind "k" { ScrollUp; } + bind "l" { PageScrollDown; } + bind "u" { HalfPageScrollUp; } + } + entersearch { + bind "Ctrl c" { SwitchToMode "scroll"; } + bind "esc" { SwitchToMode "scroll"; } + bind "enter" { SwitchToMode "search"; } + } + renametab { + bind "esc" { UndoRenameTab; SwitchToMode "tab"; } + } + shared_among "renametab" "renamepane" { + bind "Ctrl c" { SwitchToMode "locked"; } + } + renamepane { + bind "esc" { UndoRenamePane; SwitchToMode "pane"; } + } +} + +// Plugin aliases - can be used to change the implementation of Zellij +// changing these requires a restart to take effect +plugins { + about location="zellij:about" + compact-bar location="zellij:compact-bar" + configuration location="zellij:configuration" + filepicker location="zellij:strider" { + cwd "/" + } + plugin-manager location="zellij:plugin-manager" + session-manager location="zellij:session-manager" + status-bar location="zellij:status-bar" + strider location="zellij:strider" + tab-bar location="zellij:tab-bar" + welcome-screen location="zellij:session-manager" { + welcome_screen true + } +} + +// Plugins to load in the background when a new session starts +// eg. "file:/path/to/my-plugin.wasm" +// eg. "https://example.com/my-plugin.wasm" +load_plugins { +} + +// Use a simplified UI without special fonts (arrow glyphs) +// Options: +// - true +// - false (Default) +// +// simplified_ui true + +// Choose the theme that is specified in the themes section. +// Default: default +// +theme "tokyo-night-dark" + +// Choose the base input mode of zellij. +// Default: normal +// +default_mode "locked" + +// Choose the path to the default shell that zellij will use for opening new panes +// Default: $SHELL +// +// default_shell "fish" + +// Choose the path to override cwd that zellij will use for opening new panes +// +// default_cwd "/tmp" + +// The name of the default layout to load on startup +// Default: "default" +// +default_layout "compact" + +// The folder in which Zellij will look for layouts +// (Requires restart) +// +// layout_dir "/tmp" + +// The folder in which Zellij will look for themes +// (Requires restart) +// +// theme_dir "/tmp" + +// Toggle enabling the mouse mode. +// On certain configurations, or terminals this could +// potentially interfere with copying text. +// Options: +// - true (default) +// - false +// +mouse_mode true + +// Toggle having pane frames around the panes +// Options: +// - true (default, enabled) +// - false +// +pane_frames false + +// When attaching to an existing session with other users, +// should the session be mirrored (true) +// or should each user have their own cursor (false) +// (Requires restart) +// Default: false +// +// mirror_session true + +// Choose what to do when zellij receives SIGTERM, SIGINT, SIGQUIT or SIGHUP +// eg. when terminal window with an active zellij session is closed +// (Requires restart) +// Options: +// - detach (Default) +// - quit +// +// on_force_close "quit" + +// Configure the scroll back buffer size +// This is the number of lines zellij stores for each pane in the scroll back +// buffer. Excess number of lines are discarded in a FIFO fashion. +// (Requires restart) +// Valid values: positive integers +// Default value: 10000 +// +// scroll_buffer_size 10000 + +// Provide a command to execute when copying text. The text will be piped to +// the stdin of the program to perform the copy. This can be used with +// terminal emulators which do not support the OSC 52 ANSI control sequence +// that will be used by default if this option is not set. +// Examples: +// +// copy_command "xclip -selection clipboard" // x11 +copy_command "wl-copy" // wayland +// copy_command "pbcopy" // osx +// +// copy_command "pbcopy" + +// Choose the destination for copied text +// Allows using the primary selection buffer (on x11/wayland) instead of the system clipboard. +// Does not apply when using copy_command. +// Options: +// - system (default) +// - primary +// +// copy_clipboard "primary" + +// Enable automatic copying (and clearing) of selection when releasing mouse +// Default: true +// +// copy_on_select true + +// Path to the default editor to use to edit pane scrollbuffer +// Default: $EDITOR or $VISUAL +// scrollback_editor "/usr/bin/vim" + +// A fixed name to always give the Zellij session. +// Consider also setting `attach_to_session true,` +// otherwise this will error if such a session exists. +// Default: +// +// session_name "My singleton session" + +// When `session_name` is provided, attaches to that session +// if it is already running or creates it otherwise. +// Default: false +// +// attach_to_session true + +// Toggle between having Zellij lay out panes according to a predefined set of layouts whenever possible +// Options: +// - true (default) +// - false +// +// auto_layout false + +// Whether sessions should be serialized to the cache folder (including their tabs/panes, cwds and running commands) so that they can later be resurrected +// Options: +// - true (default) +// - false +// +// session_serialization false + +// Whether pane viewports are serialized along with the session, default is false +// Options: +// - true +// - false (default) +// +// serialize_pane_viewport false + +// Scrollback lines to serialize along with the pane viewport when serializing sessions, 0 +// defaults to the scrollback size. If this number is higher than the scrollback size, it will +// also default to the scrollback size. This does nothing if `serialize_pane_viewport` is not true. +// +// scrollback_lines_to_serialize 10000 + +// Enable or disable the rendering of styled and colored underlines (undercurl). +// May need to be disabled for certain unsupported terminals +// (Requires restart) +// Default: true +// +// styled_underlines false + +// How often in seconds sessions are serialized +// +// serialization_interval 10000 + +// Enable or disable writing of session metadata to disk (if disabled, other sessions might not know +// metadata info on this session) +// (Requires restart) +// Default: false +// +// disable_session_metadata false + +// Enable or disable support for the enhanced Kitty Keyboard Protocol (the host terminal must also support it) +// (Requires restart) +// Default: true (if the host terminal supports it) +// +support_kitty_keyboard_protocol true + +// Whether to stack panes when resizing beyond a certain size +// Default: true +// +// stacked_resize false + +// Whether to show tips on startup +// Default: true +// +show_startup_tips false + +// Whether to show release notes on first version run +// Default: true +// +// show_release_notes false diff --git a/hosts/Aloria/default.nix b/hosts/Aloria/default.nix index d52b58aa..dbe9d9dd 100644 --- a/hosts/Aloria/default.nix +++ b/hosts/Aloria/default.nix @@ -7,7 +7,7 @@ in { (import ../Common/desktop.nix { inherit inputs pkgs config; }) (import ../Common/nfs.nix { inherit pkgs serverIP; }) (import ../Common/zfs.nix {inherit inputs pkgs config; }) - (import ../Common/android.nix { inherit pkgs serverIP; }) + (import ../Common/android.nix { inherit pkgs; }) ]; hardware.graphics.extraPackages = [ diff --git a/hosts/Common/default.nix b/hosts/Common/default.nix index 51f608b8..bd9c6063 100644 --- a/hosts/Common/default.nix +++ b/hosts/Common/default.nix @@ -75,8 +75,8 @@ }; services.resolved = { - enable = true; + enable = pkgs.lib.mkDefault true; fallbackDns = [ "1.1.1.1" "1.0.0.1" ]; }; - networking.nameservers = ["1.1.1.1" "1.0.0.1"]; + networking.nameservers = pkgs.lib.mkDefault ["1.1.1.1" "1.0.0.1"]; } diff --git a/hosts/Common/desktop.nix b/hosts/Common/desktop.nix index 7ff80a03..724b43be 100644 --- a/hosts/Common/desktop.nix +++ b/hosts/Common/desktop.nix @@ -49,18 +49,14 @@ jack.enable = true; }; - hardware.bluetooth.enable = true; - hardware.bluetooth.powerOnBoot = true; - services.blueman.enable = true; - systemd.user.services.mpris-proxy = { - description = "Mpris proxy"; - after = [ "network.target" "sound.target" ]; - wantedBy = [ "default.target" ]; - serviceConfig.ExecStart = "${pkgs.bluez}/bin/mpris-proxy"; - }; - hardware.bluetooth.settings = { - General = { - Experimental = true; + hardware.bluetooth = { + enable = true; + powerOnBoot = true; + settings = { + General = { + Experimental = true; + }; }; }; + services.blueman.enable = true; } diff --git a/hosts/Common/nfs.nix b/hosts/Common/nfs.nix index 8fe59445..e0e24271 100644 --- a/hosts/Common/nfs.nix +++ b/hosts/Common/nfs.nix @@ -9,7 +9,7 @@ let "soft" "bg" "intr" - "x-systemd.automount" + # "x-systemd.automount" "x-systemd.idle-timeout=600" "x-systemd.device-timeout=2s" "x-systemd.mount-timeout=2s" diff --git a/hosts/Riva/default.nix b/hosts/Riva/default.nix index 65ff01eb..100c31b2 100644 --- a/hosts/Riva/default.nix +++ b/hosts/Riva/default.nix @@ -3,6 +3,7 @@ imports = [ (import ../Common/default.nix { inherit inputs config pkgs; }) (import ../Common/desktop.nix { inherit inputs pkgs config; }) + (import ../Common/nvidia.nix { inherit pkgs config; }) ]; boot.kernelPackages = pkgs.linuxPackages_latest; @@ -44,4 +45,12 @@ device = "/home/server/Workspace"; options = ["bind"]; }; + services.resolved = { + enable = false; + }; + networking.nameservers = ["192.168.1.2"]; + programs.steam = { + enable = true; + gamescopeSession.enable = true; + }; }