Compare commits
7 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
d5d95c2dfa | |
|
|
fdc5db376f | |
|
|
4fae4a44bf | |
|
|
c050291fef | |
|
|
d25b8958af | |
|
|
cf85fc5283 | |
|
|
b6e789c102 |
36
flake.lock
36
flake.lock
|
|
@ -30,11 +30,11 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1769774308,
|
"lastModified": 1773507676,
|
||||||
"narHash": "sha256-8Ve6VdUpcYbl8bS5oyDwVnnNobyPxdPmUHGgSDyOazQ=",
|
"narHash": "sha256-UabDWdQTsGopWsC+RW0GDBRvAXF5KbkHwEcW4UQpd/A=",
|
||||||
"owner": "aylur",
|
"owner": "aylur",
|
||||||
"repo": "astal",
|
"repo": "astal",
|
||||||
"rev": "eb235f8813bdea2a4a38ac228f2efc4e2a8a90af",
|
"rev": "d3fa2117d581b50e63eb3aefbf92d4883fa23f1b",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
@ -132,11 +132,11 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1773093840,
|
"lastModified": 1773810247,
|
||||||
"narHash": "sha256-u/96NoAyN8BSRuM3ZimGf7vyYgXa3pLx4MYWjokuoH4=",
|
"narHash": "sha256-6Vz1Thy/1s7z+Rq5OfkWOBAdV4eD+OrvDs10yH6xJzQ=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "home-manager",
|
"repo": "home-manager",
|
||||||
"rev": "bb014746edb2a98d975abde4dd40fa240de4cf86",
|
"rev": "d47357a4c806d18a3e853ad2699eaec3c01622e7",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
@ -184,11 +184,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs_2": {
|
"nixpkgs_2": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1772963539,
|
"lastModified": 1773734432,
|
||||||
"narHash": "sha256-9jVDGZnvCckTGdYT53d/EfznygLskyLQXYwJLKMPsZs=",
|
"narHash": "sha256-IF5ppUWh6gHGHYDbtVUyhwy/i7D261P7fWD1bPefOsw=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "9dcb002ca1690658be4a04645215baea8b95f31d",
|
"rev": "cda48547b432e8d3b18b4180ba07473762ec8558",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
@ -200,11 +200,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs_3": {
|
"nixpkgs_3": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1772963539,
|
"lastModified": 1773734432,
|
||||||
"narHash": "sha256-9jVDGZnvCckTGdYT53d/EfznygLskyLQXYwJLKMPsZs=",
|
"narHash": "sha256-IF5ppUWh6gHGHYDbtVUyhwy/i7D261P7fWD1bPefOsw=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "9dcb002ca1690658be4a04645215baea8b95f31d",
|
"rev": "cda48547b432e8d3b18b4180ba07473762ec8558",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
@ -252,11 +252,11 @@
|
||||||
"nixpkgs": "nixpkgs_3"
|
"nixpkgs": "nixpkgs_3"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1773125003,
|
"lastModified": 1773823796,
|
||||||
"narHash": "sha256-EF89LT3zxm8dM2pgoAohUcdQoTVVv1v02Jq+z6j8u+0=",
|
"narHash": "sha256-AYFcL50MSz2kdfEl1NgL5r5ukJ06MUos7l3ak2Rtn/M=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "NUR",
|
"repo": "NUR",
|
||||||
"rev": "eb59c1e77102b9f836cdea9f12568f191a9aff57",
|
"rev": "098c5b211d0e445773f57d8ecefb497af07e8767",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
@ -299,11 +299,11 @@
|
||||||
"systems": "systems"
|
"systems": "systems"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1773099334,
|
"lastModified": 1773692852,
|
||||||
"narHash": "sha256-ciiNQFZ2m2JOEDDg9ZZxOuxykl4Aw/2C1EQsOcq+F+E=",
|
"narHash": "sha256-rVzZeR2gsPCgft+SHbxlxldejpOBI6bwj6gC24XpEIk=",
|
||||||
"owner": "vicinaehq",
|
"owner": "vicinaehq",
|
||||||
"repo": "vicinae",
|
"repo": "vicinae",
|
||||||
"rev": "2a427670116461a4ce0207db2c089aee9f40428e",
|
"rev": "f3dc9cb4696dda1218f00f2756cf25882fa5df9b",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
|
||||||
|
|
@ -38,8 +38,6 @@
|
||||||
} @ inputs: let
|
} @ inputs: let
|
||||||
supportedSystems = ["x86_64-linux" "aarch64-linux"];
|
supportedSystems = ["x86_64-linux" "aarch64-linux"];
|
||||||
forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
|
forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
|
||||||
system = builtins.currentSystem;
|
|
||||||
pkgs = nixpkgs.legacyPackages.${system};
|
|
||||||
commonModules = host: user: [
|
commonModules = host: user: [
|
||||||
./hosts/${host}/hardware-configuration.nix
|
./hosts/${host}/hardware-configuration.nix
|
||||||
{
|
{
|
||||||
|
|
@ -48,7 +46,7 @@
|
||||||
(self: super: {utillinux = super.util-linux;})
|
(self: super: {utillinux = super.util-linux;})
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
{
|
({pkgs, ...}: {
|
||||||
networking.hostName = host;
|
networking.hostName = host;
|
||||||
time.timeZone = "Asia/Bangkok";
|
time.timeZone = "Asia/Bangkok";
|
||||||
nix.settings = {
|
nix.settings = {
|
||||||
|
|
@ -70,7 +68,7 @@
|
||||||
};
|
};
|
||||||
users.users.${user} = {
|
users.users.${user} = {
|
||||||
isNormalUser = true;
|
isNormalUser = true;
|
||||||
extraGroups = ["wheel" "video"]; # Enable ‘sudo’ for the user.
|
extraGroups = ["wheel" "video"]; # Enable 'sudo' for the user.
|
||||||
openssh.authorizedKeys.keys = [
|
openssh.authorizedKeys.keys = [
|
||||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKAa3tMzSCRuprEACrBsKI0F/o73o6J9L1qR3TaZn/N8 user@Kell"
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKAa3tMzSCRuprEACrBsKI0F/o73o6J9L1qR3TaZn/N8 user@Kell"
|
||||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIByLwLAdJbmoDV5sx4hg5NbzKbOh1GmWEhDOUJ1GQBhK user@Riva"
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIByLwLAdJbmoDV5sx4hg5NbzKbOh1GmWEhDOUJ1GQBhK user@Riva"
|
||||||
|
|
@ -85,7 +83,7 @@
|
||||||
shell = pkgs.zsh;
|
shell = pkgs.zsh;
|
||||||
};
|
};
|
||||||
system.stateVersion = "23.11";
|
system.stateVersion = "23.11";
|
||||||
}
|
})
|
||||||
home-manager.nixosModules.home-manager
|
home-manager.nixosModules.home-manager
|
||||||
{
|
{
|
||||||
home-manager = {
|
home-manager = {
|
||||||
|
|
|
||||||
|
|
@ -35,9 +35,9 @@ in {
|
||||||
vscode
|
vscode
|
||||||
texliveFull
|
texliveFull
|
||||||
gnome-power-manager
|
gnome-power-manager
|
||||||
discord
|
|
||||||
smile
|
smile
|
||||||
podman-compose
|
podman-compose
|
||||||
|
vesktop
|
||||||
];
|
];
|
||||||
|
|
||||||
wayland.windowManager.hyprland.settings = {
|
wayland.windowManager.hyprland.settings = {
|
||||||
|
|
@ -47,11 +47,6 @@ in {
|
||||||
"DP-3,1920x1080,3840x-540,1"
|
"DP-3,1920x1080,3840x-540,1"
|
||||||
"DP-1,1920x1080,3840x-540,1"
|
"DP-1,1920x1080,3840x-540,1"
|
||||||
];
|
];
|
||||||
bind = [
|
|
||||||
", XF86PowerOff, exec, ${pkgs.rofi}/bin/rofi -show power-menu -modi power-menu:${
|
|
||||||
./hyprland/files/rofi-power-menu.sh
|
|
||||||
}"
|
|
||||||
];
|
|
||||||
general.gaps_out = 1;
|
general.gaps_out = 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,19 +29,9 @@ in {
|
||||||
texliveFull
|
texliveFull
|
||||||
gnome-power-manager
|
gnome-power-manager
|
||||||
# jetbrains.pycharm-professional
|
# jetbrains.pycharm-professional
|
||||||
discord
|
|
||||||
smile
|
smile
|
||||||
];
|
];
|
||||||
|
|
||||||
services.hyprpaper = {
|
|
||||||
settings = {
|
|
||||||
wallpaper = [
|
|
||||||
"HDMI-A-1,${./hyprland/files/wallpaper.png}"
|
|
||||||
"eDP-1,${./hyprland/files/wallpaper.png}"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
wayland.windowManager.hyprland.settings = {
|
wayland.windowManager.hyprland.settings = {
|
||||||
monitor = [
|
monitor = [
|
||||||
"eDP-1,2560x1440@60.01,0x0,1"
|
"eDP-1,2560x1440@60.01,0x0,1"
|
||||||
|
|
|
||||||
|
|
@ -36,18 +36,8 @@ in {
|
||||||
moonlight-qt
|
moonlight-qt
|
||||||
vscode
|
vscode
|
||||||
jetbrains.rider
|
jetbrains.rider
|
||||||
discord
|
|
||||||
];
|
];
|
||||||
|
|
||||||
services.hyprpaper = {
|
|
||||||
settings = {
|
|
||||||
wallpaper = [
|
|
||||||
"DP-1,${./hyprland/files/wallpaper.png}"
|
|
||||||
"DP-2,${./hyprland/files/wallpaper.png}"
|
|
||||||
"HDMI-A-1,${./hyprland/files/wallpaper.png}"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
wayland.windowManager.hyprland.settings = {
|
wayland.windowManager.hyprland.settings = {
|
||||||
monitor = [
|
monitor = [
|
||||||
"DP-2,preferred,0x550,1"
|
"DP-2,preferred,0x550,1"
|
||||||
|
|
|
||||||
|
|
@ -30,13 +30,6 @@ in {
|
||||||
jq
|
jq
|
||||||
rclone
|
rclone
|
||||||
];
|
];
|
||||||
services.hyprpaper = {
|
|
||||||
settings = {
|
|
||||||
wallpaper = [
|
|
||||||
"Virtual-1,${./hyprland/files/wallpaper.png}"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
wayland.windowManager.hyprland.settings = {
|
wayland.windowManager.hyprland.settings = {
|
||||||
monitor = [
|
monitor = [
|
||||||
"Virtual-1,2560x1440,0x0,1"
|
"Virtual-1,2560x1440,0x0,1"
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,8 @@ import { Astal, Gdk, Gtk } from "ags/gtk4";
|
||||||
import app from "ags/gtk4/app";
|
import app from "ags/gtk4/app";
|
||||||
import { createBinding, createState, For, With, Accessor } from "ags";
|
import { createBinding, createState, For, With, Accessor } from "ags";
|
||||||
import { createPoll } from "ags/time";
|
import { createPoll } from "ags/time";
|
||||||
|
import { subprocess, execAsync } from "ags/process";
|
||||||
import Tray from "gi://AstalTray";
|
import Tray from "gi://AstalTray";
|
||||||
import { execAsync } from "ags/process";
|
|
||||||
import Hyprland from "gi://AstalHyprland";
|
|
||||||
import { getIconName } from "./utils";
|
import { getIconName } from "./utils";
|
||||||
import Wp from "gi://AstalWp";
|
import Wp from "gi://AstalWp";
|
||||||
import Battery from "gi://AstalBattery";
|
import Battery from "gi://AstalBattery";
|
||||||
|
|
@ -16,6 +15,36 @@ const sensorsAvailable = await execAsync(["sensors"])
|
||||||
.catch(() => false);
|
.catch(() => false);
|
||||||
const wirePlumber = Wp.get_default();
|
const wirePlumber = Wp.get_default();
|
||||||
|
|
||||||
|
// --- NIRI IPC INTEGRATION ---
|
||||||
|
const [workspaces, setWorkspaces] = createState<any[]>([]);
|
||||||
|
const [windows, setWindows] = createState<any[]>([]);
|
||||||
|
|
||||||
|
async function updateNiriState() {
|
||||||
|
try {
|
||||||
|
const wsOut = await execAsync(["niri", "msg", "-j", "workspaces"]);
|
||||||
|
setWorkspaces(JSON.parse(wsOut) || []);
|
||||||
|
|
||||||
|
const winOut = await execAsync(["niri", "msg", "-j", "windows"]);
|
||||||
|
setWindows(JSON.parse(winOut) || []);
|
||||||
|
} catch (e) {
|
||||||
|
console.error("Failed to fetch Niri state:", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize state immediately
|
||||||
|
updateNiriState();
|
||||||
|
|
||||||
|
// Subscribe to Niri's native event stream
|
||||||
|
subprocess(
|
||||||
|
["niri", "msg", "-j", "event-stream"],
|
||||||
|
(line) => {
|
||||||
|
// A state change happened in Niri. Re-fetching guarantees perfect sync
|
||||||
|
updateNiriState();
|
||||||
|
},
|
||||||
|
(err) => console.error("Niri event stream error:", err)
|
||||||
|
);
|
||||||
|
// ----------------------------
|
||||||
|
|
||||||
function SysTray(): JSX.Element {
|
function SysTray(): JSX.Element {
|
||||||
const tray = Tray.get_default();
|
const tray = Tray.get_default();
|
||||||
let items = createBinding(tray, "items");
|
let items = createBinding(tray, "items");
|
||||||
|
|
@ -52,18 +81,18 @@ function SysTray(): JSX.Element {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function Left(): JSX.Element {
|
function Left({ connector }: { connector: string }): JSX.Element {
|
||||||
return (
|
return (
|
||||||
<box hexpand halign={Gtk.Align.START}>
|
<box hexpand halign={Gtk.Align.START}>
|
||||||
<Clients />
|
<Clients connector={connector} />
|
||||||
</box>
|
</box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function Center(): JSX.Element {
|
function Center({ connector }: { connector: string }): JSX.Element {
|
||||||
return (
|
return (
|
||||||
<box>
|
<box>
|
||||||
<Workspaces />
|
<Workspaces connector={connector} />
|
||||||
</box>
|
</box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -244,47 +273,24 @@ function Volume(): JSX.Element {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function Workspaces(): JSX.Element {
|
function Workspaces({ connector }: { connector: string }): JSX.Element {
|
||||||
const hyprland = Hyprland.get_default();
|
|
||||||
let workspaces = createBinding(hyprland, "workspaces");
|
|
||||||
return (
|
return (
|
||||||
<box class="workspaces">
|
<box class="workspaces">
|
||||||
<With value={workspaces}>
|
{/* Generate a derived binding by passing a transformation function into the `workspaces` state */}
|
||||||
{(wss: Array<Hyprland.Workspace>) => (
|
<For each={workspaces((wss: any[]) =>
|
||||||
<box>
|
wss.filter((ws) => ws.output === connector)
|
||||||
<With value={createBinding(hyprland, "focusedMonitor")}>
|
.filter((ws) => ws.is_active || windows().some((w: any) => w.workspace_id === ws.id))
|
||||||
{(fm: Hyprland.Monitor) => {
|
.sort((a, b) => a.idx - b.idx)
|
||||||
let filtered_wss = new Accessor(() =>
|
)}>
|
||||||
wss
|
{(ws: any) => (
|
||||||
.sort((a, b) => a.id - b.id)
|
<button
|
||||||
.filter(
|
class={ws.is_active ? "focused" : ""}
|
||||||
(ws) =>
|
onClicked={() => execAsync(["niri", "msg", "action", "focus-workspace", ws.idx.toString()])}
|
||||||
ws &&
|
>
|
||||||
ws.get_monitor() &&
|
{ws.name || ws.idx.toString()}
|
||||||
ws.get_monitor().get_id() === fm.get_id(),
|
</button>
|
||||||
),
|
|
||||||
);
|
|
||||||
return (
|
|
||||||
<box>
|
|
||||||
<For each={filtered_wss}>
|
|
||||||
{(ws: Hyprland.Workspace, _index) => (
|
|
||||||
<button
|
|
||||||
class={createBinding(hyprland, "focusedWorkspace").as(
|
|
||||||
(fw) => (ws === fw ? "focused" : ""),
|
|
||||||
)}
|
|
||||||
onClicked={() => ws.focus()}
|
|
||||||
>
|
|
||||||
{`${ws.id}`.slice(-1)}
|
|
||||||
</button>
|
|
||||||
)}
|
|
||||||
</For>
|
|
||||||
</box>
|
|
||||||
);
|
|
||||||
}}
|
|
||||||
</With>
|
|
||||||
</box>
|
|
||||||
)}
|
)}
|
||||||
</With>
|
</For>
|
||||||
</box>
|
</box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -293,59 +299,45 @@ function shorten(title: string) {
|
||||||
return title.length > 40 ? title.slice(0, 20) + "..." : title;
|
return title.length > 40 ? title.slice(0, 20) + "..." : title;
|
||||||
}
|
}
|
||||||
|
|
||||||
function Clients(): JSX.Element {
|
function Clients({ connector }: { connector: string }): JSX.Element {
|
||||||
const hyprland = Hyprland.get_default();
|
|
||||||
let clients = createBinding(hyprland, "clients");
|
|
||||||
return (
|
return (
|
||||||
<box>
|
<box class="clients">
|
||||||
<With value={createBinding(hyprland, "focusedWorkspace")}>
|
{/* Use With to react to workspace changes, so we know which WS is active */}
|
||||||
{(fw: Hyprland.Workspace) => (
|
<With value={workspaces}>
|
||||||
<box class="clients">
|
{(wss: any[]) => {
|
||||||
<With value={clients}>
|
let active_ws_for_monitor = wss.find((ws: any) => ws.is_active && ws.output === connector)?.id;
|
||||||
{(cls: Array<Hyprland.Client>) => {
|
|
||||||
let filtered_clients = new Accessor(() =>
|
|
||||||
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(),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<box>
|
<box>
|
||||||
<For each={filtered_clients}>
|
{/* Generate a derived binding for windows, depending on the active workspace */}
|
||||||
{(cl: Hyprland.Client, _index) => (
|
<For each={windows((wins: any[]) =>
|
||||||
<box
|
wins.filter((w: any) => !w.title?.includes("rofi"))
|
||||||
class={createBinding(hyprland, "focusedClient").as(
|
.filter((w: any) => w.workspace_id === active_ws_for_monitor)
|
||||||
(a) =>
|
.sort((a: any, b: any) => {
|
||||||
a && a.address === cl.address
|
const posA = a.layout?.pos_in_scrolling_layout?.[0] ?? 0;
|
||||||
? "focused"
|
const posB = b.layout?.pos_in_scrolling_layout?.[0] ?? 0;
|
||||||
: "unfocused",
|
return posA - posB;
|
||||||
)}
|
})
|
||||||
>
|
)}>
|
||||||
<image iconName={getIconName(cl)} class="app-icon" />
|
{(win: any) => (
|
||||||
<label
|
<box class={win.is_focused ? "focused" : "unfocused"}>
|
||||||
label={createBinding(cl, "title").as((title) =>
|
<image iconName={getIconName(win.app_id, win.title)} class="app-icon" />
|
||||||
shorten(title),
|
<label label={shorten(win.title || "")} />
|
||||||
)}
|
|
||||||
/>
|
|
||||||
</box>
|
|
||||||
)}
|
|
||||||
</For>
|
|
||||||
</box>
|
</box>
|
||||||
);
|
)}
|
||||||
}}
|
</For>
|
||||||
</With>
|
</box>
|
||||||
</box>
|
);
|
||||||
)}
|
}}
|
||||||
</With>
|
</With>
|
||||||
</box>
|
</box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function Bar(gdkmonitor: Gdk.Monitor, scaleFactor: number = 1) {
|
export default function Bar(gdkmonitor: Gdk.Monitor, scaleFactor: number = 1) {
|
||||||
console.log("Creating Bar on monitor:", gdkmonitor);
|
console.log("Creating Bar on monitor:", gdkmonitor.get_connector());
|
||||||
|
const connector = gdkmonitor.get_connector() || "";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<window
|
<window
|
||||||
visible
|
visible
|
||||||
|
|
@ -359,11 +351,11 @@ export default function Bar(gdkmonitor: Gdk.Monitor, scaleFactor: number = 1) {
|
||||||
}
|
}
|
||||||
application={app}
|
application={app}
|
||||||
class="Bar"
|
class="Bar"
|
||||||
name="top-bar"
|
name={`top-bar-${connector}`}
|
||||||
>
|
>
|
||||||
<centerbox class="window-box">
|
<centerbox class="window-box">
|
||||||
<Left $type="start" />
|
<Left $type="start" connector={connector} />
|
||||||
<Center $type="center" />
|
<Center $type="center" connector={connector} />
|
||||||
<Right $type="end" />
|
<Right $type="end" />
|
||||||
</centerbox>
|
</centerbox>
|
||||||
</window>
|
</window>
|
||||||
|
|
|
||||||
|
|
@ -1,60 +1,19 @@
|
||||||
import app from "ags/gtk4/app";
|
import app from "ags/gtk4/app";
|
||||||
|
import { Gdk } from "ags/gtk4";
|
||||||
import style from "./style.scss";
|
import style from "./style.scss";
|
||||||
import Bar from "./Bar";
|
import Bar from "./Bar";
|
||||||
import Hyprland from "gi://AstalHyprland";
|
|
||||||
import NotificationPopups from "./notifications/NotificationPopups";
|
import NotificationPopups from "./notifications/NotificationPopups";
|
||||||
|
|
||||||
const hyprland = Hyprland.get_default();
|
function register_windows(monitor: Gdk.Monitor) {
|
||||||
|
let scale = (monitor.get_geometry().width >= 3000) ? 1.2 : 1;
|
||||||
function find_main_monitor(): Hyprland.Monitor {
|
Bar(monitor, scale);
|
||||||
let monitors = hyprland.get_monitors();
|
|
||||||
for (let j = 0; j < monitors.length; j++) {
|
|
||||||
for (const monitor of ["eDP", "DP", "HDMI-A"]) {
|
|
||||||
for (let i = 0; i < monitors.length; i++) {
|
|
||||||
console.log(
|
|
||||||
"Checking monitor:",
|
|
||||||
monitors[i].get_name(),
|
|
||||||
"against",
|
|
||||||
monitor + "-" + j,
|
|
||||||
);
|
|
||||||
if (monitors[i].get_name() == monitor + "-" + j) {
|
|
||||||
return monitors[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return monitors[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
function register_windows(monitor: Hyprland.Monitor) {
|
|
||||||
let gtkMonitor = app.get_monitors()[0];
|
|
||||||
let scale = monitor.get_width() >= 3000 ? 1.2 : 1;
|
|
||||||
Bar(gtkMonitor, scale);
|
|
||||||
NotificationPopups();
|
NotificationPopups();
|
||||||
}
|
}
|
||||||
|
|
||||||
function switch_to_best_monitor() {
|
|
||||||
let mainMonitor = find_main_monitor();
|
|
||||||
for (var wd of app.get_windows()) {
|
|
||||||
wd.destroy();
|
|
||||||
}
|
|
||||||
register_windows(mainMonitor);
|
|
||||||
}
|
|
||||||
|
|
||||||
hyprland.connect("monitor-added", (_, _monitor: Hyprland.Monitor) => {
|
|
||||||
switch_to_best_monitor();
|
|
||||||
});
|
|
||||||
|
|
||||||
hyprland.connect("monitor-removed", () => {
|
|
||||||
switch_to_best_monitor();
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log("Trying to find the best monitor");
|
|
||||||
|
|
||||||
app.start({
|
app.start({
|
||||||
css: style,
|
css: style,
|
||||||
iconTheme: "Papirus",
|
iconTheme: "Papirus",
|
||||||
main() {
|
main() {
|
||||||
switch_to_best_monitor();
|
register_windows(app.get_monitors()[0]);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
import Apps from "gi://AstalApps";
|
import Apps from "gi://AstalApps";
|
||||||
import AstalHyprland from "gi://AstalHyprland";
|
|
||||||
|
|
||||||
const app_icons = new Apps.Apps().list.reduce(
|
const app_icons = new Apps.Apps().list.reduce(
|
||||||
(acc, app) => {
|
(acc, app) => {
|
||||||
|
|
@ -16,57 +15,39 @@ const app_icons = new Apps.Apps().list.reduce(
|
||||||
{ classOrNames: {} as Record<string, string>, executables: {} as Record<string, string> },
|
{ classOrNames: {} as Record<string, string>, executables: {} as Record<string, string> },
|
||||||
);
|
);
|
||||||
|
|
||||||
export function getIconName(client: AstalHyprland.Client | null | undefined) {
|
export function getIconName(app_id: string | null | undefined, title: string | null | undefined) {
|
||||||
if (!client) return "";
|
if (!app_id && !title) return "";
|
||||||
|
|
||||||
// try a bunch of fields (snake_case and camelCase variants)
|
// try fields matching Niri outputs
|
||||||
const possibleKeys = [
|
const possibleKeys = [
|
||||||
// common client properties (snake_case)
|
app_id,
|
||||||
(client as any).wm_class,
|
title
|
||||||
(client as any).initial_class,
|
|
||||||
(client as any).executable,
|
|
||||||
// camelCase variants (some bindings expose these)
|
|
||||||
(client as any).class,
|
|
||||||
(client as any).initialClass,
|
|
||||||
(client as any).initialTitle,
|
|
||||||
(client as any).title,
|
|
||||||
(client as any).name,
|
|
||||||
].filter(Boolean) as string[];
|
].filter(Boolean) as string[];
|
||||||
|
|
||||||
// 1) direct exact match
|
// 1) direct exact match
|
||||||
for (const k of possibleKeys) {
|
for (const k of possibleKeys) {
|
||||||
const icon = app_icons.classOrNames[k] ?? app_icons.executables[k];
|
const icon = app_icons.classOrNames[k] ?? app_icons.executables[k];
|
||||||
if (icon) {
|
if (icon) {
|
||||||
// cache the mapping for this client's canonical class (prefer wm_class or class)
|
// cache the mapping
|
||||||
const cacheKey = (client as any).wm_class ?? (client as any).class ?? (client as any).name ?? k;
|
const cacheKey = app_id ?? title ?? k;
|
||||||
app_icons.classOrNames[cacheKey] = icon;
|
app_icons.classOrNames[cacheKey] = icon;
|
||||||
return icon;
|
return icon;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2) fuzzy match: see if any stored key includes any of the client strings (title, name, etc.)
|
// 2) fuzzy match: see if any stored key includes any of the client strings (title, name, etc.)
|
||||||
const searchStrings = [
|
for (const s of possibleKeys) {
|
||||||
(client as any).title,
|
|
||||||
(client as any).initialTitle,
|
|
||||||
(client as any).initial_class,
|
|
||||||
(client as any).initialClass,
|
|
||||||
(client as any).wm_class,
|
|
||||||
(client as any).class,
|
|
||||||
(client as any).name,
|
|
||||||
].filter(Boolean) as string[];
|
|
||||||
|
|
||||||
for (const s of searchStrings) {
|
|
||||||
const matchKey = Object.keys(app_icons.classOrNames).find((key) => key.includes(s));
|
const matchKey = Object.keys(app_icons.classOrNames).find((key) => key.includes(s));
|
||||||
if (matchKey) {
|
if (matchKey) {
|
||||||
const icon = app_icons.classOrNames[matchKey];
|
const icon = app_icons.classOrNames[matchKey];
|
||||||
const cacheKey = (client as any).wm_class ?? (client as any).class ?? (client as any).name ?? s;
|
const cacheKey = app_id ?? title ?? s;
|
||||||
app_icons.classOrNames[cacheKey] = icon;
|
app_icons.classOrNames[cacheKey] = icon;
|
||||||
return icon;
|
return icon;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// nothing found — cache empty string so we don't repeat work
|
// nothing found — cache empty string so we don't repeat work
|
||||||
const cacheKey = (client as any).wm_class ?? (client as any).class ?? (client as any).name ?? "";
|
const cacheKey = app_id ?? title ?? "";
|
||||||
if (cacheKey) app_icons.classOrNames[cacheKey] = "";
|
if (cacheKey) app_icons.classOrNames[cacheKey] = "";
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@
|
||||||
pkgs.accountsservice
|
pkgs.accountsservice
|
||||||
|
|
||||||
battery
|
battery
|
||||||
hyprland
|
# hyprland
|
||||||
tray
|
tray
|
||||||
powerprofiles
|
powerprofiles
|
||||||
wireplumber
|
wireplumber
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -26,6 +26,8 @@
|
||||||
};
|
};
|
||||||
ignores = [
|
ignores = [
|
||||||
"*.direnv/"
|
"*.direnv/"
|
||||||
|
"*.nix/"
|
||||||
|
"uv.lock"
|
||||||
".dmypy.json"
|
".dmypy.json"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -147,7 +147,6 @@ in {
|
||||||
"rounding 0, match:float 0, match:workspace f[1]"
|
"rounding 0, match:float 0, match:workspace f[1]"
|
||||||
];
|
];
|
||||||
|
|
||||||
# UPDATED: New Layer Rule Syntax (0.53.0)
|
|
||||||
# Syntax: effect value, match:namespace regex
|
# Syntax: effect value, match:namespace regex
|
||||||
layerrule = [
|
layerrule = [
|
||||||
"no_anim on, match:namespace ags_bar_0"
|
"no_anim on, match:namespace ags_bar_0"
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,232 @@
|
||||||
|
{pkgs, ...}: let
|
||||||
|
terminal = "${pkgs.foot}/bin/footclient";
|
||||||
|
nautilus = "${pkgs.nautilus}/bin/nautilus";
|
||||||
|
playerctl = "${pkgs.playerctl}/bin/playerctl";
|
||||||
|
wpctl = "${pkgs.wireplumber}/bin/wpctl";
|
||||||
|
brightnessctl = "${pkgs.brightnessctl}/bin/brightnessctl";
|
||||||
|
terminal-name = "foot";
|
||||||
|
launch_terminal = pkgs.writeShellScriptBin "launch_terminal" ''
|
||||||
|
function find_leaf_pid(){
|
||||||
|
local PID
|
||||||
|
local RET
|
||||||
|
local NAME
|
||||||
|
PID=$1
|
||||||
|
for CHILD_PID in $(pgrep -P "$PID"); do
|
||||||
|
RET=$(find_leaf_pid "$CHILD_PID")
|
||||||
|
if [ "$RET" != "" ]; then
|
||||||
|
PID="$RET"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
NAME=$(ps -p "$PID" -o comm=)
|
||||||
|
if [ "$NAME" == "zsh" ]; then
|
||||||
|
echo "$PID"
|
||||||
|
elif [ "$NAME" == "ssh" ]; then
|
||||||
|
echo "$PID"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
LEAF_PID=$(find_leaf_pid "$1")
|
||||||
|
if [ "$(ps -p "$LEAF_PID" -o comm=)" == "ssh" ]; then
|
||||||
|
SSH_COMMAND=$(ps -p "$LEAF_PID" -o args --no-headers)
|
||||||
|
if [[ "$SSH_COMMAND" == *"waypipe"* ]]; then
|
||||||
|
CLIENT=$(echo "$SSH_COMMAND" | awk '{ print $5 }')
|
||||||
|
PREVIOUS_SESSION_ID=$(grep -z "SSH_SESSION_ID" "/proc/$LEAF_PID/environ" | xargs -0 -n 1 | grep -oP "[0-9]*")
|
||||||
|
SSH_SESSION_ID=$RANDOM
|
||||||
|
${terminal} -e zsh -c "SSH_SESSION_ID=$SSH_SESSION_ID waypipe ssh -t \"$CLIENT\" env SSH_SESSION_ID=\"$SSH_SESSION_ID\" PREVIOUS_SESSION_ID=\"$PREVIOUS_SESSION_ID\" \"zsh --login\""
|
||||||
|
else
|
||||||
|
${terminal} -e zsh -c "ssh -t \"$(echo "$SSH_COMMAND" | awk '{ print $2 }')\""
|
||||||
|
fi
|
||||||
|
|
||||||
|
else # Not an ssh session
|
||||||
|
if [ "$(ps -p "$1" -o comm=)" == "${terminal-name}" ]; then
|
||||||
|
CWD=$(readlink -e /proc/"$LEAF_PID"/cwd)
|
||||||
|
if [ "$CWD" != "" ]; then
|
||||||
|
${terminal} --working-directory "$CWD"
|
||||||
|
else
|
||||||
|
${terminal}
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
${terminal}
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
in {
|
||||||
|
# Since native Home Manager doesn't have a programs.niri module yet,
|
||||||
|
# we generate the KDL configuration file directly.
|
||||||
|
services.hyprpaper = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
ipc = "off";
|
||||||
|
splash = false;
|
||||||
|
wallpaper = {
|
||||||
|
path = "${../hyprland/files/wallpaper.png}";
|
||||||
|
monitor = "";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.hyprlock = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
input-field = [
|
||||||
|
{
|
||||||
|
size = "200, 50";
|
||||||
|
position = "0, -80";
|
||||||
|
monitor = "";
|
||||||
|
dots_center = true;
|
||||||
|
fade_on_empty = true;
|
||||||
|
font_color = "rgb(202, 211, 245)";
|
||||||
|
inner_color = "rgb(91, 96, 120)";
|
||||||
|
outer_color = "rgb(24, 25, 38)";
|
||||||
|
outline_thickness = 3;
|
||||||
|
placeholder_text = "<span foreground=\"##cad3f5\">Password...</span>";
|
||||||
|
shadow_passes = 2;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
general = {
|
||||||
|
no_fade_in = false;
|
||||||
|
};
|
||||||
|
background = [
|
||||||
|
{
|
||||||
|
path = "screenshot";
|
||||||
|
blur_passes = 3;
|
||||||
|
blur_size = 8;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
xdg.configFile."niri/config.kdl".text = ''
|
||||||
|
spawn-at-startup "${pkgs.hyprpaper}/bin/hyprpaper"
|
||||||
|
spawn-at-startup "foot" "--server"
|
||||||
|
spawn-at-startup "ags" "run"
|
||||||
|
spawn-at-startup "${pkgs.mate-polkit}/bin/polkit-mate"
|
||||||
|
prefer-no-csd
|
||||||
|
|
||||||
|
hotkey-overlay {
|
||||||
|
skip-at-startup
|
||||||
|
}
|
||||||
|
|
||||||
|
gestures {
|
||||||
|
hot-corners {
|
||||||
|
off
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
layout {
|
||||||
|
gaps 5
|
||||||
|
border {
|
||||||
|
off
|
||||||
|
}
|
||||||
|
focus-ring {
|
||||||
|
width 4
|
||||||
|
active-color "rgba(0, 47, 95, 238)"
|
||||||
|
inactive-color "rgba(255, 255, 255, 0)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
touchpad {
|
||||||
|
tap
|
||||||
|
}
|
||||||
|
keyboard {
|
||||||
|
xkb {
|
||||||
|
options "compose:rctrl"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
focus-follows-mouse max-scroll-amount="10%"
|
||||||
|
warp-mouse-to-focus
|
||||||
|
}
|
||||||
|
output "eDP-1" {
|
||||||
|
scale 1.2
|
||||||
|
}
|
||||||
|
window-rule {
|
||||||
|
match app-id="vicinae"
|
||||||
|
open-floating true
|
||||||
|
}
|
||||||
|
|
||||||
|
binds {
|
||||||
|
// General Binds
|
||||||
|
Mod+Return { spawn "sh" "-c" "${launch_terminal}/bin/launch_terminal $(niri msg --json focused-window | ${pkgs.jq}/bin/jq .pid)"; }
|
||||||
|
Mod+Shift+Return { spawn "${terminal}"; }
|
||||||
|
Mod+Q { close-window; }
|
||||||
|
Mod+A { spawn "${nautilus}"; }
|
||||||
|
Mod+B { spawn "Helium"; }
|
||||||
|
Mod+M { maximize-column; }
|
||||||
|
Mod+F {maximize-window-to-edges;}
|
||||||
|
Mod+Tab { toggle-overview; }
|
||||||
|
|
||||||
|
// Vicinae Binds
|
||||||
|
Mod+C { spawn "vicinae" "vicinae://extensions/vicinae/clipboard/history"; }
|
||||||
|
Mod+N { spawn "vicinae" "vicinae://extensions/vicinae/wm/switch-windows"; }
|
||||||
|
Mod+Escape { spawn "vicinae" "open" "-q" "Power Management "; }
|
||||||
|
Mod+Space { spawn "vicinae" "toggle"; }
|
||||||
|
|
||||||
|
Mod+Comma { consume-or-expel-window-left; }
|
||||||
|
Mod+Period { consume-or-expel-window-right; }
|
||||||
|
|
||||||
|
Mod+Alt+H { set-column-width "-5%"; }
|
||||||
|
Mod+Alt+L { set-column-width "+5%"; }
|
||||||
|
Mod+Alt+K { set-window-height "-5%"; }
|
||||||
|
Mod+Alt+J { set-window-height "+5%"; }
|
||||||
|
|
||||||
|
// Movement
|
||||||
|
Mod+H { focus-column-left; }
|
||||||
|
Mod+J { focus-window-down; }
|
||||||
|
Mod+K { focus-window-up; }
|
||||||
|
Mod+L { focus-column-right; }
|
||||||
|
|
||||||
|
Mod+Shift+H { move-column-left; }
|
||||||
|
Mod+Shift+L { move-column-right; }
|
||||||
|
Mod+Shift+J { move-window-down; }
|
||||||
|
Mod+Shift+K { move-window-up; }
|
||||||
|
|
||||||
|
// Workspaces
|
||||||
|
Mod+Shift+U { move-column-to-workspace-down; }
|
||||||
|
Mod+Shift+I { move-column-to-workspace-up; }
|
||||||
|
|
||||||
|
Mod+I { focus-workspace-up; }
|
||||||
|
Mod+U { focus-workspace-down; }
|
||||||
|
Mod+1 { focus-workspace 1; }
|
||||||
|
Mod+2 { focus-workspace 2; }
|
||||||
|
Mod+3 { focus-workspace 3; }
|
||||||
|
Mod+4 { focus-workspace 4; }
|
||||||
|
Mod+5 { focus-workspace 5; }
|
||||||
|
Mod+6 { focus-workspace 6; }
|
||||||
|
Mod+7 { focus-workspace 7; }
|
||||||
|
Mod+8 { focus-workspace 8; }
|
||||||
|
Mod+9 { focus-workspace 9; }
|
||||||
|
|
||||||
|
// Move to workspace
|
||||||
|
Mod+Shift+1 { move-column-to-workspace 1; }
|
||||||
|
Mod+Shift+2 { move-column-to-workspace 2; }
|
||||||
|
Mod+Shift+3 { move-column-to-workspace 3; }
|
||||||
|
Mod+Shift+4 { move-column-to-workspace 4; }
|
||||||
|
Mod+Shift+5 { move-column-to-workspace 5; }
|
||||||
|
Mod+Shift+6 { move-column-to-workspace 6; }
|
||||||
|
Mod+Shift+7 { move-column-to-workspace 7; }
|
||||||
|
Mod+Shift+8 { move-column-to-workspace 8; }
|
||||||
|
Mod+Shift+9 { move-column-to-workspace 9; }
|
||||||
|
|
||||||
|
Print { screenshot; }
|
||||||
|
Ctrl+Alt+L {spawn "${pkgs.hyprlock}/bin/hyprlock"; }
|
||||||
|
|
||||||
|
XF86MonBrightnessUp { spawn "${brightnessctl}" "set" "+10%"; }
|
||||||
|
XF86MonBrightnessDown { spawn "${brightnessctl}" "set" "10%-"; }
|
||||||
|
|
||||||
|
// Volume
|
||||||
|
XF86AudioRaiseVolume { spawn "${wpctl}" "set-volume" "@DEFAULT_AUDIO_SINK@" "10%+" "--limit" "1.0"; }
|
||||||
|
XF86AudioLowerVolume { spawn "${wpctl}" "set-volume" "@DEFAULT_AUDIO_SINK@" "10%-"; }
|
||||||
|
XF86AudioMute { spawn "${wpctl}" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; }
|
||||||
|
XF86AudioMicMute { spawn "${wpctl}" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; }
|
||||||
|
|
||||||
|
// Media
|
||||||
|
XF86AudioNext { spawn "${playerctl}" "next"; }
|
||||||
|
XF86AudioPrev { spawn "${playerctl}" "previous"; }
|
||||||
|
Mod+XF86AudioMute { spawn "${playerctl}" "play-pause"; }
|
||||||
|
Mod+XF86AudioRaiseVolume { spawn "${playerctl}" "next"; }
|
||||||
|
Mod+XF86AudioLowerVolume { spawn "${playerctl}" "previous"; }
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
|
@ -23,6 +23,7 @@
|
||||||
htop
|
htop
|
||||||
ghostscript
|
ghostscript
|
||||||
waypipe
|
waypipe
|
||||||
|
tree
|
||||||
inputs.worktimer.packages.${pkgs.stdenv.hostPlatform.system}.default
|
inputs.worktimer.packages.${pkgs.stdenv.hostPlatform.system}.default
|
||||||
usbutils
|
usbutils
|
||||||
gocryptfs
|
gocryptfs
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,8 @@
|
||||||
imports = [
|
imports = [
|
||||||
(import ./common.nix {inherit inputs config pkgs;})
|
(import ./common.nix {inherit inputs config pkgs;})
|
||||||
(import ./python.nix {inherit inputs config pkgs;})
|
(import ./python.nix {inherit inputs config pkgs;})
|
||||||
(import ../hyprland {inherit inputs pkgs;})
|
# (import ../hyprland {inherit inputs pkgs;})
|
||||||
|
(import ../niri {inherit inputs config pkgs;})
|
||||||
(import ../ags {inherit inputs pkgs;})
|
(import ../ags {inherit inputs pkgs;})
|
||||||
../rofi
|
../rofi
|
||||||
../vicinae
|
../vicinae
|
||||||
|
|
|
||||||
|
|
@ -15,15 +15,17 @@
|
||||||
vulkan-extension-layer
|
vulkan-extension-layer
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
programs.hyprland = {
|
# programs.hyprland = {
|
||||||
enable = true;
|
# enable = true;
|
||||||
withUWSM = true;
|
# withUWSM = true;
|
||||||
};
|
# };
|
||||||
|
programs.niri.enable = true;
|
||||||
services.greetd = {
|
services.greetd = {
|
||||||
enable = pkgs.lib.mkDefault true;
|
enable = pkgs.lib.mkDefault true;
|
||||||
settings = rec {
|
settings = rec {
|
||||||
initial_session = {
|
initial_session = {
|
||||||
command = "uwsm start hyprland-uwsm.desktop";
|
# command = "uwsm start hyprland-uwsm.desktop";
|
||||||
|
command = "niri-session";
|
||||||
user = "user";
|
user = "user";
|
||||||
};
|
};
|
||||||
default_session = initial_session;
|
default_session = initial_session;
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,6 @@ in {
|
||||||
# (import ../Common/nvidia.nix { inherit inputs pkgs config; })
|
# (import ../Common/nvidia.nix { inherit inputs pkgs config; })
|
||||||
(import ../Common/desktop.nix {inherit inputs pkgs config;})
|
(import ../Common/desktop.nix {inherit inputs pkgs config;})
|
||||||
(import ../Common/nfs.nix {inherit pkgs serverIP;})
|
(import ../Common/nfs.nix {inherit pkgs serverIP;})
|
||||||
(import ../Common/android.nix {inherit pkgs;})
|
|
||||||
];
|
];
|
||||||
|
|
||||||
# Kernel
|
# Kernel
|
||||||
|
|
@ -40,7 +39,6 @@ in {
|
||||||
nixpkgs.config.rocmSupport = true;
|
nixpkgs.config.rocmSupport = true;
|
||||||
services.ollama = {
|
services.ollama = {
|
||||||
enable = true;
|
enable = true;
|
||||||
acceleration = "rocm";
|
|
||||||
};
|
};
|
||||||
# nixpkgs.config.cudaSupport = true;
|
# nixpkgs.config.cudaSupport = true;
|
||||||
services.logind.settings.Login = {
|
services.logind.settings.Login = {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue