1

Compare commits

...

16 Commits

Author SHA1 Message Date
0efbd52631 Home: Disable AGS, Waybar, Dunst + Enable Hyprpanel 2025-06-17 01:49:57 +02:00
2210fa7654 Flake: Update lock 2025-06-17 01:49:40 +02:00
688ce92172 System: Enable bluetooth + gvfs 2025-06-17 01:49:31 +02:00
875dc2dc40 Modules/Hyprland: Add option to toggle dunst 2025-06-17 01:49:12 +02:00
d3742d78f3 Modules/AGS: Add WIP config 2025-06-17 01:48:59 +02:00
b042f46f57 Modules/Hyprpanel: Add hyprpanel module 2025-06-17 01:24:32 +02:00
4b03fba3f1 System: Open lan-mouse firewall ports 2025-06-16 23:22:00 +02:00
59f21166a5 Home: Add discord flatpak homedir override 2025-06-16 23:20:59 +02:00
2940eec8a3 Home: Add anytype (flatpak) 2025-06-13 20:14:35 +02:00
16852be668 Modules/Hyprland: Add generic windowrules option 2025-06-12 23:55:23 +02:00
07a3fff57e Home/Nixinator: Update Unity+Rider configuration 2025-06-12 23:19:42 +02:00
83c0993019 Modules/Hyprland: Run systemctl --user import-environment PATH to fix Flatpak not finding default apps 2025-06-12 21:18:10 +02:00
ce74e783ee System: Add xdg-desktop-portal-gtk 2025-06-12 21:17:24 +02:00
ffe7b54a5b Modules/AGS: Import colorscheme from ~/.config/_colors.scss into AGS stylesheet 2025-06-11 13:29:48 +02:00
03c2bc8225 Modules/AGS: Export colorschemes to ~/.config/_colors.scss 2025-06-11 13:29:17 +02:00
75f88b9503 Modules/Hyprland: Blur gtk4-layer-shell + dim around rofi layers 2025-06-11 13:28:39 +02:00
17 changed files with 459 additions and 78 deletions

88
flake.lock generated
View File

@ -19,6 +19,28 @@
"type": "github"
}
},
"ags_2": {
"inputs": {
"astal": "astal_2",
"nixpkgs": [
"hyprpanel",
"nixpkgs"
]
},
"locked": {
"lastModified": 1744557573,
"narHash": "sha256-XAyj0iDuI51BytJ1PwN53uLpzTDdznPDQFG4RwihlTQ=",
"owner": "aylur",
"repo": "ags",
"rev": "3ed9737bdbc8fc7a7c7ceef2165c9109f336bff6",
"type": "github"
},
"original": {
"owner": "aylur",
"repo": "ags",
"type": "github"
}
},
"astal": {
"inputs": {
"nixpkgs": [
@ -40,6 +62,49 @@
"type": "github"
}
},
"astal_2": {
"inputs": {
"nixpkgs": [
"hyprpanel",
"ags",
"nixpkgs"
]
},
"locked": {
"lastModified": 1742571008,
"narHash": "sha256-5WgfJAeBpxiKbTR/gJvxrGYfqQRge5aUDcGKmU1YZ1Q=",
"owner": "aylur",
"repo": "astal",
"rev": "dc0e5d37abe9424c53dcbd2506a4886ffee6296e",
"type": "github"
},
"original": {
"owner": "aylur",
"repo": "astal",
"type": "github"
}
},
"astal_3": {
"inputs": {
"nixpkgs": [
"hyprpanel",
"nixpkgs"
]
},
"locked": {
"lastModified": 1748416910,
"narHash": "sha256-FEQcs58HL8Fe4i7XlqVEUwthjxwvRvgX15gTTfW17sU=",
"owner": "aylur",
"repo": "astal",
"rev": "c1bd89a47c81c66ab5fc6872db5a916c0433fb89",
"type": "github"
},
"original": {
"owner": "aylur",
"repo": "astal",
"type": "github"
}
},
"devshell": {
"inputs": {
"nixpkgs": "nixpkgs_2"
@ -187,6 +252,28 @@
"type": "github"
}
},
"hyprpanel": {
"inputs": {
"ags": "ags_2",
"astal": "astal_3",
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1750028451,
"narHash": "sha256-IQjlQcuoY89E1A1VkZo0lkpNy2ysXS9hXvtEGfhUoqQ=",
"owner": "jas-singhfsu",
"repo": "hyprpanel",
"rev": "e03666ab5d239e99b65a0df9cf33c6f47e145e4e",
"type": "github"
},
"original": {
"owner": "jas-singhfsu",
"repo": "hyprpanel",
"type": "github"
}
},
"ixx": {
"inputs": {
"flake-utils": [
@ -457,6 +544,7 @@
"emacs-overlay": "emacs-overlay",
"hardware": "hardware",
"home-manager": "home-manager",
"hyprpanel": "hyprpanel",
"nix-alien": "nix-alien",
"nix-flatpak": "nix-flatpak",
"nixpkgs": "nixpkgs_5",

View File

@ -23,6 +23,8 @@
# Ags for widgets (this was a terrible idea)
ags.url = "github:Aylur/ags";
hyprpanel.url = "github:jas-singhfsu/hyprpanel";
hyprpanel.inputs.nixpkgs.follows = "nixpkgs";
# Other
nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=latest";

View File

@ -39,7 +39,7 @@ rec {
};
modules = {
ags.enable = true; # TODO: Configure
ags.enable = false; # TODO: Configure
chromium = {
enable = true;
@ -66,8 +66,8 @@ rec {
hyprland = {
enable = true;
# theme = "Three-Bears";
theme = "Foggy-Lake";
dunst.enable = false; # Disable for hyprpanel
theme = "Foggy-Lake"; # Three-Bears
keybindings = {
main-mod = "SUPER";
@ -99,6 +99,12 @@ rec {
];
};
windowrules = [
# TODO: Doesn't work, use focus_on_activate for now
# "suppressevent activate, class:^(Unity)$"
# "suppressevent activatefocus, class:^(Unity)$"
];
workspacerules = {
"2" = [
"neovide"
@ -174,6 +180,7 @@ rec {
];
};
hyprpanel.enable = true;
kitty.enable = true;
latex.enable = true;
@ -191,7 +198,7 @@ rec {
theme = "Foggy-Lake";
};
waybar.enable = true;
waybar.enable = false;
zathura.enable = true;
};
@ -346,6 +353,7 @@ rec {
AusweisApp2
thunderbird # TODO: Email module
obsidian
# anytype # Use flatpak
helvum
# Office
@ -616,6 +624,7 @@ rec {
# "com.google.Chrome"
# "md.obsidian.Obsidian" # NOTE: Installed via package
"io.anytype.anytype"
];
uninstallUnmanaged = true;
@ -641,6 +650,18 @@ rec {
GTK_THEME = "Adwaita:light";
};
};
"io.anytype.anytype".Context = {
filesystems = [
"${config.home.homeDirectory}"
];
};
"com.discordapp.Discord".Context = {
filesystems = [
"${config.home.homeDirectory}"
];
};
};
};
};

View File

@ -3,6 +3,7 @@
pkgs,
nixosConfig,
config,
lib,
...
}: {
imports = [
@ -56,39 +57,95 @@
waybar.monitor = "HDMI-A-1";
};
home.packages = with pkgs; [
# quartus-prime-lite # Intel FPGA design software
# Don't want heavy IDE's on the laptop
jetbrains.clion
jetbrains.rust-rover
jetbrains.pycharm-professional
jetbrains.idea-ultimate
jetbrains.webstorm
unityhub
jetbrains.rider
(with dotnetCorePackages;
home = let
# Extra config to make Rider Unity integration work
dotnetCore = with pkgs.dotnetCorePackages;
combinePackages [
# sdk_6_0_1xx # Is EOL
# sdk_7_0_3xx # Is EOL
sdk_8_0_3xx
sdk_9_0_3xx
]) # For Rider/Unity
mono # For Rider/Unity
];
blender
# godot_4
obs-studio
kdePackages.kdenlive
krita
makemkv
extra-path = with pkgs; [
dotnetCore
dotnetPackages.Nuget
mono
# msbuild
steam-devices-udev-rules
];
# Add any extra binaries you want accessible to Rider here
];
# home.file.".var/app/com.valvesoftware.Steam/config/MangoHud/MangoHud.conf".source = config.lib.file.mkOutOfStoreSymlink "${config.paths.dotfiles}/mangohud/MangoHud.conf";
home.file.".var/app/com.valvesoftware.Steam/config/MangoHud/MangoHud.conf".source = ../../../config/mangohud/MangoHud.conf;
extra-lib = with pkgs; [
# Add any extra libraries you want accessible to Rider here
];
rider = pkgs.jetbrains.rider.overrideAttrs (attrs: {
postInstall =
''
# Wrap rider with extra tools and libraries
mv $out/bin/rider $out/bin/.rider-toolless
makeWrapper $out/bin/.rider-toolless $out/bin/rider \
--argv0 rider \
--prefix PATH : "${lib.makeBinPath extra-path}" \
--prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath extra-lib}"
# Making Unity Rider plugin work!
# The plugin expects the binary to be at /rider/bin/rider,
# with bundled files at /rider/
# It does this by going up two directories from the binary path
# Our rider binary is at $out/bin/rider, so we need to link $out/rider/ to $out/
shopt -s extglob
ln -s $out/rider/!(bin) $out/
shopt -u extglob
''
+ attrs.postInstall or "";
});
in {
packages = with pkgs; [
# quartus-prime-lite # Intel FPGA design software
# Don't want heavy IDE's on the laptop
jetbrains.clion
jetbrains.rust-rover
jetbrains.pycharm-professional
jetbrains.idea-ultimate
jetbrains.webstorm
# Unity Stuff
unityhub
rider
dotnetCore
mono
blender
godot_4
obs-studio
kdePackages.kdenlive
krita
makemkv
steam-devices-udev-rules
];
file = {
".local/share/applications/jetbrains-rider.desktop".source = let
desktopFile = pkgs.makeDesktopItem {
name = "jetbrains-rider";
desktopName = "Rider";
exec = "\"${rider}/bin/rider\"";
icon = "rider";
type = "Application";
# Don't show desktop icon in search or run launcher
extraConfig.NoDisplay = "true";
};
in "${desktopFile}/share/applications/jetbrains-rider.desktop";
".var/app/com.valvesoftware.Steam/config/MangoHud/MangoHud.conf".source = ../../../config/mangohud/MangoHud.conf;
# ".var/app/com.valvesoftware.Steam/config/MangoHud/MangoHud.conf".source = config.lib.file.mkOutOfStoreSymlink "${config.paths.dotfiles}/mangohud/MangoHud.conf";
};
};
services = {
flatpak = {

View File

@ -1,20 +1,46 @@
// Import the colors exported by the nixos config
// TODO: Depend on username somehow...
@use "/home/christoph/.config/colors" as *;
// https://gitlab.gnome.org/GNOME/gtk/-/blob/gtk-3-24/gtk/theme/Adwaita/_colors-public.scss
$fg-color: #{"@theme_fg_color"};
$bg-color: #{"@theme_bg_color"};
window.Bar {
// Order is Top-Right-Bottom-Left for combined properties
* {
// Remove the default theme's background-image, otherwise background-color doesn't work
background-image: none;
// Clear implicit paddings and margins, otherwise size management is terrible
padding: 0;
margin: 0;
}
.Window {
background: transparent;
color: $fg-color;
font-weight: bold;
font-size: x-large;
>centerbox {
background: $bg-color;
border-radius: 10px;
margin: 8px;
}
.Bar {
background-color: rgba($light-base, 0.3);
border-radius: 6px;
border-width: 2px;
border-color: $dark-lavender;
border-style: solid;
margin: 10px 10px 0 10px;
button {
border-radius: 8px;
margin: 2px;
.LauncherButton {
background-color: $dark-lavender;
border-radius: 6px;
border-width: 0;
margin: -1px 10px -1px -1px; // Negative margins to remove gaps from border radii
min-width: 36px;
min-height: 36px;
>label {
margin-left: -4px; // Tux not centered otherwise
}
}
}
}

View File

@ -1,36 +1,76 @@
import { App, Astal, Gtk, Gdk } from "astal/gtk4"
import { Variable } from "astal"
import { GLib, Variable } from "astal"
import { SysTray } from "./SysTray";
const time = Variable("").poll(1000, "date")
const user = Variable("")
.poll(60000, ["bash", "-c", "whoami"]);
const time = Variable("")
.poll(1000, ["bash", "-c", "date +'%H:%M:%S'"]);
const date = Variable("")
.poll(60000, ["bash", "-c", "date +'%y-%m-%d'"])
const uptime = Variable("")
.poll(60000, ["bash", "-c", "uptime | awk -F'( |,)+' '{print $4}'"]);
export default function Bar(gdkmonitor: Gdk.Monitor) {
const { TOP, LEFT, RIGHT } = Astal.WindowAnchor
return <window
visible
cssClasses={["Bar"]}
cssClasses={["Window"]}
application={App}
gdkmonitor={gdkmonitor}
exclusivity={Astal.Exclusivity.EXCLUSIVE}
anchor={TOP | LEFT | RIGHT}
application={App}>
<centerbox cssName="centerbox">
<button
onClicked="echo hello"
hexpand
halign={Gtk.Align.CENTER}
>
Welcome to AGS!
</button>
<box />
<menubutton
hexpand
halign={Gtk.Align.CENTER}
>
<label label={time()} />
<popover>
<Gtk.Calendar />
</popover>
</menubutton>
</centerbox>
</window>
visible
child={
<centerbox
cssClasses={["Bar"]}
startWidget={
<box
halign={Gtk.Align.START}
children={[
<button
cssClasses={["LauncherButton"]}
onClicked="rofi -drun-show-actions -show drun"
cursor={Gdk.Cursor.new_from_name("pointer", null)}
label={""}
/>,
<label
cssClasses={["UserLabel"]}
label={user((value) => `${value.toUpperCase()}`)}
/>,
<label
cssClasses={["UptimeLabel"]}
label={uptime((value) => `${value}`)}
/>,
<label
cssClasses={["WindowNameLabel"]}
label={"WINDOW"}
/>
]}
/>
}
centerWidget={
<box />
}
endWidget={
<box
halign={Gtk.Align.START}
children={[
<SysTray />
]}
/>
}
/>
}
/>
}

View File

@ -0,0 +1,40 @@
import { Variable, bind } from "astal";
import { Gtk } from "astal/gtk4"
import AstalTray from "gi://AstalTray";
export function SysTray() {
const tray = AstalTray.get_default()
const trayIcons = Variable.derive(
[bind(tray, "items")],
(items) => {
return items.map((item) => {
return (
<menubutton
item={item}
child={
<image gicon={bind(item, "gicon")} />
}
/>
);
});
},
);
return <box
cssClasses={["SysTray"]}
children={
bind(tray, "items").as(items => items.map(item => (
<menubutton
tooltipMarkup={bind(item, "tooltipMarkup")}
usePopover={false}
actionGroup={bind(item, "actionGroup").as(ag => ["dbusmenu", ag])}
menuModel={bind(item, "menuModel")}
child={
<image gicon={bind(item, "gicon")} />
}
/>
)))
}
/>
}

View File

@ -33,8 +33,8 @@ in {
inputs.ags.packages.${pkgs.system}.wireplumber
];
# This should symlink
configDir = ./config;
# This should symlink but doesn't, it copies the files :/
# configDir = ./config;
};
# The ags module doesn't expose the "astal" cli tool or extraPackages
@ -64,11 +64,67 @@ in {
};
home.file = {
# NOTE: Keep this symlinked as long as I'm configuring
# Keep this symlinked as long as I'm configuring (not required anymore since I can start AGS locally)
# ".config/ags".source = config.lib.file.mkOutOfStoreSymlink "${config.paths.nixflake}/home/modules/ags/config";
# LSP typechecking support (use ags --init)
# ".config/ags/types".source = config.lib.file.mkOutOfStoreSymlink "${pkgs.ags}/share/com.github.Aylur.ags/types";
# NOTE: Don't symlink to ~/.config/ags/colors.scss, since that is already used by configDir
".config/_colors.scss".text = with config.modules.color.hex; ''
$dark-rosewater: #${dark.rosewater};
$dark-flamingo: #${dark.flamingo};
$dark-pink: #${dark.pink};
$dark-mauve: #${dark.mauve};
$dark-red: #${dark.red};
$dark-maroon: #${dark.maroon};
$dark-peach: #${dark.peach};
$dark-yellow: #${dark.yellow};
$dark-green: #${dark.green};
$dark-teal: #${dark.teal};
$dark-sky: #${dark.sky};
$dark-sapphire: #${dark.sapphire};
$dark-blue: #${dark.blue};
$dark-lavender: #${dark.lavender};
$dark-text: #${dark.text};
$dark-subtext1: #${dark.subtext1};
$dark-subtext0: #${dark.subtext0};
$dark-overlay2: #${dark.overlay2};
$dark-overlay1: #${dark.overlay1};
$dark-overlay0: #${dark.overlay0};
$dark-surface2: #${dark.surface2};
$dark-surface1: #${dark.surface1};
$dark-surface0: #${dark.surface0};
$dark-base: #${dark.base};
$dark-mantle: #${dark.mantle};
$dark-crust: #${dark.crust};
$light-rosewater: #${light.rosewater};
$light-flamingo: #${light.flamingo};
$light-pink: #${light.pink};
$light-mauve: #${light.mauve};
$light-red: #${light.red};
$light-maroon: #${light.maroon};
$light-peach: #${light.peach};
$light-yellow: #${light.yellow};
$light-green: #${light.green};
$light-teal: #${light.teal};
$light-sky: #${light.sky};
$light-sapphire: #${light.sapphire};
$light-blue: #${light.blue};
$light-lavender: #${light.lavender};
$light-text: #${light.text};
$light-subtext1: #${light.subtext1};
$light-subtext0: #${light.subtext0};
$light-overlay2: #${light.overlay2};
$light-overlay1: #${light.overlay1};
$light-overlay0: #${light.overlay0};
$light-surface2: #${light.surface2};
$light-surface1: #${light.surface1};
$light-surface0: #${light.surface0};
$light-base: #${light.base};
$light-mantle: #${light.mantle};
$light-crust: #${light.crust};
'';
};
};
}

View File

@ -22,5 +22,6 @@
inputs.nix-flatpak.homeManagerModules.nix-flatpak
inputs.nixvim.homeManagerModules.nixvim
inputs.ags.homeManagerModules.default
inputs.hyprpanel.homeManagerModules.hyprpanel
];
}

View File

@ -118,9 +118,12 @@
"wl-paste -p -t text --watch clipman store -P --histpath=\"~/.local/share/clipman-primary.json\""
"hyprctl setcursor Bibata-Modern-Classic 16"
# NOTE: Hack because Hyprland doesn't set the xwayland/x11 keymap correctly
# HACK: Hyprland doesn't set the xwayland/x11 keymap correctly
"setxkbmap -layout ${hyprland.kb-layout} -variant ${hyprland.kb-variant} -model pc104"
# HACK: Flatpak doesn't find applications in the system PATH
"systemctl --user import-environment PATH && systemctl --user restart xdg-desktop-portal.service"
# Provide a polkit authentication UI.
# This is used for example when running systemd commands without root.
"${pkgs.kdePackages.polkit-kde-agent-1}/libexec/polkit-kde-authentication-agent-1"
@ -316,7 +319,7 @@ in {
# Notification service
dunst = {
enable = true;
enable = hyprland.dunst.enable;
iconTheme.package = pkgs.papirus-icon-theme;
iconTheme.name = "Papirus";
@ -435,7 +438,8 @@ in {
]
++ lib.pipe hyprland.transparent [
(builtins.map mkTranslucentRule)
];
]
++ hyprland.windowrules;
dwindle = {
pseudotile = true;
@ -464,9 +468,10 @@ in {
layerrule = [
"blur,rofi"
"ignorealpha 0.001,rofi"
# "dimaround,rofi"
"dimaround,rofi"
"blur,waybar"
"blur,gtk4-layer-shell"
];
decoration = {

View File

@ -25,6 +25,8 @@ with mylib.modules; {
description = "Wallpaper and colorscheme to use";
};
dunst.enable = mkEnableOption "Enable dunst notification daemon";
monitors = mkOption {
type = types.attrs;
description = "Hyprland Monitor Configurations";
@ -90,6 +92,16 @@ with mylib.modules; {
'';
};
windowrules = mkOption {
type = types.listOf types.str;
description = "Specify specific window rules.";
example = ''
[
"suppressevent activate, class: Unity"
]
'';
};
transparent-opacity = mkOption {
type = types.str;
description = "The opacity transparent windows should have.";

View File

@ -0,0 +1,20 @@
{
config,
nixosConfig,
lib,
mylib,
pkgs,
...
}: let
inherit (config.modules) hyprpanel;
in {
options.modules.hyprpanel = import ./options.nix {inherit lib mylib;};
config = lib.mkIf hyprpanel.enable {
programs.hyprpanel = {
enable = true;
overwrite.enable = true;
};
};
}

View File

@ -0,0 +1,9 @@
{
lib,
mylib,
...
}:
with lib;
with mylib.modules; {
enable = mkEnableOption "hyprpanel";
}

View File

@ -150,12 +150,12 @@ with mylib.networking; {
# XDG
xdg.portal = {
enable = true;
wlr.enable = false; # I think hyprland has its own portal automatically enabled...
xdgOpenUsePortal = true;
wlr.enable = false; # Hyprland has its own portal automatically enabled...
extraPortals = with pkgs; [
# TODO: Needed?
# xdg-desktop-portal-kde
# xdg-desktop-portal-gtk
xdg-desktop-portal-gtk
# xdg-desktop-portal-kde
# xdg-desktop-portal-hyprland # Already enabled by hyprland system module
# xdg-desktop-portal-termfilechooser # Filepicker using nnn
];
@ -386,7 +386,7 @@ with mylib.networking; {
fwupd.enable = true; # Device firmware (I don't think I have any supported devices)
# locate.enable = true; # Periodically update index
ntp.enable = true; # Clock sync
gvfs.enable = false; # Network shares TODO: Only gnome? Needed?
gvfs.enable = true; # Network shares, spotify cover art caching, ...
udev = {
packages = with pkgs; [
usb-blaster-udev-rules # For Intel Quartus

View File

@ -58,6 +58,7 @@
# 31431 # Parsec
5173 # SvelteKit
8090 # PocketBase
4242 # Lan-Mouse
];
allowedUDPPorts = [
@ -66,6 +67,7 @@
# 31431 # Parsec
5173 # SvelteKit
8090 # PocketBase
4242 # Lan-Mouse
];
wireguard-tunnels = {

View File

@ -100,6 +100,7 @@
enableRedistributableFirmware = true;
# cpu.intel.updateMicrocode = true;
cpu.amd.updateMicrocode = true;
bluetooth.enable = true;
nvidia = {
package = config.boot.kernelPackages.nvidiaPackages.stable;

View File

@ -53,6 +53,7 @@
hardware = {
enableRedistributableFirmware = true;
cpu.intel.updateMicrocode = true;
bluetooth.enable = true;
graphics = {
enable = true;