This repository has been archived on 2024-08-18. You can view files and clone it, but cannot push or open issues or pull requests.
home/wayland.nix
2024-07-30 22:34:09 +02:00

652 lines
16 KiB
Nix
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ config, lib, pkgs, osConfig, ... }:
let
inherit (osConfig) hardware;
graphical =
if lib.versionAtLeast osConfig.system.stateVersion "24.11"
then hardware.graphic.enable
else hardware.opengl.enable;
cmd = {
brightnessctl = "${pkgs.brightnessctl}/bin/brightnessctl";
fish = "${osConfig.programs.fish.package}/bin/fish";
grim = "${pkgs.grim}/bin/grim";
hyprctl = "${config.wayland.windowManager.hyprland.finalPackage}/bin/hyprctl";
hyprlock = "${config.programs.hyprlock.package}/bin/hyprlock";
jq = "${config.programs.jq.package}/bin/jq";
keepassxc = "${pkgs.keepassxc}/bin/keepassxc";
kitty = ''${config.programs.kitty.package}/bin/kitty --single-instance --instance-group "$XDG_SESSION_ID"'';
loginctl = "${osConfig.systemd.package}/bin/loginctl";
mpv = "${config.programs.mpv.package}/bin/mpv";
pidof = "${pkgs.procps}/bin/pidof";
playerctl = "${pkgs.playerctl}/bin/playerctl";
slurp = "${pkgs.slurp}/bin/slurp";
tofi-run = "${config.programs.tofi.package}/bin/tofi-run";
wl-copy = "${pkgs.wl-clipboard}/bin/wl-copy";
wpctl = "${osConfig.services.pipewire.wireplumber.package}/bin/wpctl";
xdg-open = "${pkgs.xdg-utils}/bin/xdg-open";
};
in lib.mkIf graphical {
home.packages = with pkgs; [
# Image processing
oxipng
# Documentation
linux-manual
man-pages
man-pages-posix
# System operations
restic
# Cryptography
age
# Messaging
element-desktop
#signal-desktop
# Audio control
pwvucontrol
evince
#inkscape
obsidian
kicad
calibre
#enpass
keepassxc
# fonts
fira-code
font-awesome
lato
# Multimedia
jellyfin-mpv-shim
libreoffice
];
fonts.fontconfig.enable = true;
home.keyboard = {
layout = "greedy";
options = "ctrl:nocaps";
};
programs.beets = {
enable = true;
settings = {
directory = "~/msc";
import.reflink = "auto";
plugins = [
"chroma"
"spotify"
"fromfilename"
"fetchart"
"lyrics"
"replaygain"
"duplicates"
"hook"
];
hook.hooks = [
{
event = "import";
command = "systemctl --user start mopidy-scan.service";
}
];
};
};
programs.hyprlock = {
enable = true;
settings = {
general = {
hide_cursor = true;
};
background = {
path = "screenshot";
blur_passes = 3;
contrast = 1.25;
};
};
};
programs.imv.enable = true;
programs.kitty =
let
font-features = "+ss01 +ss06 +zero +onum";
in {
enable = true;
theme = "Catppuccin-Mocha";
settings = {
disable_ligatures = "cursor";
"font_features FiraCodeRoman_400wght" = font-features;
"font_features FiraCodeRoman_500wght" = font-features;
"font_features FiraCodeRoman_600wght" = font-features;
"font_features FiraCodeRoman_700wght" = font-features;
cursor_blink_interval = 0;
scrollback_lines = 65536;
enable_audio_bell = false;
close_on_child_death = true;
clear_all_shortcuts = true;
};
keybindings = {
"ctrl+shift+c" = "copy_to_clipboard";
"ctrl+shift+v" = "paste_from_clipboard";
"ctrl+shift+s" = "paste_from_selection";
"shift+insert" = "paste_from_selection";
"ctrl+up" = "scroll_line_up";
"ctrl+down" = "scroll_line_down";
"ctrl+page_up" = "scroll_page_up";
"ctrl+page_down" = "scroll_page_down";
"shift+page_up" = "scroll_page_up";
"shift+page_down" = "scroll_page_down";
"ctrl+home" = "scroll_home";
"ctrl+end" = "scroll_end";
"ctrl+print_screen" = "show_scrollback";
"ctrl+equal" = "change_font_size all 0";
"ctrl+plus" = "change_font_size all +1";
"ctrl+minus" = "change_font_size all -1";
"ctrl+shift+u" = "kitten unicode_input";
};
};
programs.mpv = {
enable = true;
defaultProfiles = [ "high-quality" ];
config = {
#access-references = false;
# video output
vo = "gpu";
#gpu-api = "vulkan";
hwdec = "vulkan,vaapi,auto-safe";
vd-lavc-dr = true;
scale = "ewa_lanczos4sharpest";
cscale = "spline64";
dscale = "mitchell";
tscale = "oversample";
# A/V sync
video-sync = "display-resample";
interpolation = true;
# audio
volume = 100;
volume-max = 100;
# subtitles
sub-auto = "fuzzy";
# screenshots
screenshot-format = "avif";
# cache
demuxer-max-bytes = "768MiB";
demuxer-max-back-bytes = "256MiB";
};
profiles = {
highres = {
scale = "spline64";
};
};
scripts = with pkgs.mpvScripts; [
mpris
#autocrop
autodeint
];
};
programs.texlive = {
enable = true;
extraPackages = tpkgs: {
inherit (tpkgs)
texlive-scripts
xelatex-dev
fontspec
polyglossia
hyphen-english
hyphen-french
hyphen-german
hyphen-portuguese
hyphen-spanish
koma-script
amsmath
csquotes
hyperref
paralist
realscripts
unicode-math
units
xecjk
xecolor
xltxtra
;
};
};
programs.thunderbird = {
enable = true;
package = pkgs.thunderbird;
profiles = { };
};
programs.waybar = {
enable = true;
systemd = {
enable = true;
target = "hyprland-session.target";
};
settings = {
mainBar = {
layer = "top";
position = "bottom";
spacing = 4;
modules-left = [ "hyprland/workspaces" ];
modules-center = [ "hyprland/window" ];
modules-right = [ "tray" "network" "pulseaudio" "backlight" "battery" "temperature" "cpu" "memory" "clock" ];
"hyprland/workspaces" = {
#format = "{icon}";
#format-icons.urgent = "";
};
"hyprland/window".max-length = 64;
temperature = {
critical-threshold = 80;
format = "{icon} {temperatureC}°C";
format-icons = [ "" "" "" ];
};
cpu.format = " {}%";
memory.format = " {}%";
battery = {
format = "{icon} {capacity}%";
format-icons = [ "" "" "" "" "" ];
};
network.format = " {essid} ({signalStrength}%)";
pulseaudio = {
format = "{icon} {volume}%";
format-muted = "";
format-icons = {
headphone = "";
hands-free = "";
headset = "";
phone = "";
portable = "";
car = "";
default = [ "" "" "" ];
};
};
backlight = {
format = "{icon} {percent}%";
format-icons = [ "" "" ];
};
clock = {
format = " {:%H:%M %Z}";
format-alt = " {:%Y-%m-%d}";
};
};
};
};
programs.yt-dlp.enable = true;
services.gammastep = {
enable = true;
provider = "geoclue2";
settings = {
general.adjustment-method = "wayland";
};
};
services.hypridle = {
enable = true;
settings = {
general = with cmd; {
lock_cmd = "${pidof} hyprlock || ${hyprlock}";
before_sleep_cmd = "${loginctl} lock-session";
after_sleep_cmd = "${hyprctl} dispatch dpms on";
};
listener = with cmd; [
{
timeout = 210;
on-timeout = "${brightnessctl} --save -e set 20%-";
on-resume = "${brightnessctl} --save -e set +20%";
} {
timeout = 240;
on-timeout = "${loginctl} lock-session";
} {
timeout = 270;
on-timeout = "${hyprctl} dispatch dpms off";
on-resume = "${hyprctl} dispatch dpms on";
}
];
};
};
services.hyprpaper =
let
wallpaper = toString ./wallpaper.png;
in {
enable = true;
settings = {
ipc = false;
preload = [ wallpaper ];
wallpaper = [ wallpaper ];
};
};
services.mako = {
enable = true;
defaultTimeout = 5000;
};
services.mopidy = {
enable = true;
extensionPackages = with pkgs; [
mopidy-iris
mopidy-local
mopidy-mpd
mopidy-mpris
];
settings = {
core = {
cache_dir = "$XDG_CACHE_DIR/mopidy";
config_dir = "$XDG_CONFIG_DIR/mopidy";
data_dir = "$XDG_DATA_DIR/mopidy";
};
audio.mixer = "none";
file.media_dirs = [ "$XDG_MUSIC_DIR" ];
local.media_dir = "$XDG_MUSIC_DIR";
mpd.hostname = "localhost";
http = {
hostname = "localhost";
port = 6680;
default_app = "iris";
};
};
};
services.pasystray.enable = true;
services.syncthing = {
enable = true;
tray.enable = true;
};
services.udiskie = {
enable = true;
automount = false;
};
stylix = {
enable = true;
image = ./wallpaper.png;
base16Scheme = "${pkgs.base16-schemes}/share/themes/catppuccin-macchiato.yaml";
fonts = {
sansSerif = {
package = pkgs.lato;
name = "Lato";
};
monospace = {
package = pkgs.fira-code;
name = "Fira Code";
};
sizes.terminal = 11;
};
targets = {
hyprpaper.enable = lib.mkForce false;
};
};
systemd.user.targets.tray = {
Unit = {
BindsTo = "waybar.service";
After = "waybar.service";
};
};
wayland.windowManager.hyprland = {
enable = true;
settings = {
monitor = [
#"desc:LG Display 0x06AA, 1440x900, 0x0, 1, bitdepth, 10"
"desc:LG Display 0x06AA, highres, 0x2160, 1, bitdepth, 10"
"desc:Lenovo Group Limited P40w-20 V9084N0R, highres, 0x0, 1, bitdepth, 10"
];
input = {
kb_layout = "greedy";
kb_options = "ctrl:nocaps";
};
general = {
gaps_in = 4;
gaps_out = 8;
layout = "dwindle";
};
gestures.workspace_swipe = true;
misc = {
disable_hyprland_logo = true;
vrr = 1;
no_direct_scanout = false;
background_color = lib.mkForce "0x181825";
};
decoration = {
rounding = 8;
};
dwindle.preserve_split = true;
workspace = [
"name:0, monitor:desc:LG Display 0x06AA, default:true"
"name:A, monitor:desc:LG Display 0x06AA"
];
"$mod" = "SUPER";
bind = with cmd; [
# exit
"$mod SHIFT, code:28, exit"
# window state
"$mod SHIFT, Space, togglefloating"
"$mod, code:32, fullscreen"
"$mod, code:48, togglesplit"
"$mod SHIFT, code:24, killactive"
# change focus
"$mod, left, movefocus, l"
"$mod, code:43, movefocus, l"
"$mod, right, movefocus, r"
"$mod, code:46, movefocus, r"
"$mod, up, movefocus, u"
"$mod, code:45, movefocus, u"
"$mod, down, movefocus, d"
"$mod, code:44, movefocus, d"
# move window
"$mod SHIFT, left, movewindow, l"
"$mod SHIFT, code:43, movewindow, l"
"$mod SHIFT, right, movewindow, r"
"$mod SHIFT, code:46, movewindow, r"
"$mod SHIFT, up, movewindow, u"
"$mod SHIFT, code:45, movewindow, u"
"$mod SHIFT, down, movewindow, d"
"$mod SHIFT, code:44, movewindow, d"
# resize window
"$mod CTRL, left, resizeactive, -20 0"
"$mod CTRL, code:43, resizeactive, -20 0"
"$mod CTRL, right, resizeactive, 20 0"
"$mod CTRL, code:46, resizeactive, 20 0"
"$mod CTRL, up, resizeactive, 0 -20"
"$mod CTRL, code:45, resizeactive, 0 -20"
"$mod CTRL, down, resizeactive, 0 20"
"$mod CTRL, code:44, resizeactive, 0 20"
# move floating
"$mod ALT, left, moveactive, -20 0"
"$mod ALT, code:43, moveactive, -20 0"
"$mod ALT, right, moveactive, 20 0"
"$mod ALT, code:46, moveactive, 20 0"
"$mod ALT, up, moveactive, 0 -20"
"$mod ALT, code:45, moveactive, 0 -20"
"$mod ALT, down, moveactive, 0 20"
"$mod ALT, code:44, moveactive, 0 20"
# switch workspaces
"$mod, code:49, workspace, name:0"
"$mod, code:10, workspace, name:1"
"$mod, code:11, workspace, name:2"
"$mod, code:12, workspace, name:3"
"$mod, code:13, workspace, name:4"
"$mod, code:14, workspace, name:5"
"$mod, code:15, workspace, name:6"
"$mod, code:16, workspace, name:7"
"$mod, code:17, workspace, name:8"
"$mod, code:18, workspace, name:9"
"$mod, code:19, workspace, name:A"
"$mod, code:20, togglespecialworkspace"
"$mod, mouse_down, workspace, e+1"
"$mod, mouse_up, workspace, e-1"
# send to workspaces
"$mod SHIFT, code:49, movetoworkspacesilent, name:0"
"$mod SHIFT, code:10, movetoworkspacesilent, name:1"
"$mod SHIFT, code:11, movetoworkspacesilent, name:2"
"$mod SHIFT, code:12, movetoworkspacesilent, name:3"
"$mod SHIFT, code:13, movetoworkspacesilent, name:4"
"$mod SHIFT, code:14, movetoworkspacesilent, name:5"
"$mod SHIFT, code:15, movetoworkspacesilent, name:6"
"$mod SHIFT, code:16, movetoworkspacesilent, name:7"
"$mod SHIFT, code:17, movetoworkspacesilent, name:8"
"$mod SHIFT, code:18, movetoworkspacesilent, name:9"
"$mod SHIFT, code:19, movetoworkspacesilent, name:A"
"$mod SHIFT, code:20, movetoworkspacesilent, special"
# function keys
", XF86MonBrightnessUp, exec, ${brightnessctl} -e set +5%"
", XF86MonBrightnessDown, exec, ${brightnessctl} -e set 5%-"
", XF86AudioRaiseVolume, exec, ${wpctl} set-volume @DEFAULT_AUDIO_SINK@ +2dB"
", XF86AudioLowerVolume, exec, ${wpctl} set-volume @DEFAULT_AUDIO_SINK@ -2dB"
", XF86AudioMute, exec, ${wpctl} set-mute @DEFAULT_AUDIO_SINK@ toggle"
", XF86AudioMicMute, exec, ${wpctl} set-mute @DEFAULT_AUDIO_SOURCE@ toggle"
", XF86AudioNext, exec, ${playerctl} next"
", XF86AudioPrev, exec, ${playerctl} previous"
", XF86AudioPlay, exec, ${playerctl} play"
", XF86AudioStop, exec, ${playerctl} pause"
", XF86Explorer, exec, ${xdg-open} https:"
# screenshots
"$mod, Print, exec, ${grim} -l 9 - | ${wl-copy}"
"$mod SHIFT, Print, exec, ${slurp} | ${grim} -g - -l 9 - | ${wl-copy}"
''$mod CTRL, Print, exec, ${grim} -g "$(${hyprctl} -j activewindow ${jq} -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"')" -l 9 - | ${wl-copy}''
"$mod, Return, exec, ${kitty}"
"$mod Shift, Return, exec, ${kitty} ${fish} --private"
"$mod, code:55, exec, $(${tofi-run})"
"$mod, code:56, exec, ${loginctl} lock-session"
];
bindm = [
# move window
"$mod, mouse:272, movewindow"
# resize window
"$mod, mouse:273, resizewindow"
];
"$keepassPopup" = ''class:^org\.keepassxc\.KeePassXC$, title:^(Unlock.*|.*Access Request)$'';
windowrulev2 = [
''workspace name:A silent, class:^org\.keepassxc\.KeePassXC$, title:^Vault\.kdbx''
"float, $keepassPopup"
"center, $keepassPopup"
"dimaround, $keepassPopup"
"stayfocused, $keepassPopup"
];
exec-once = with cmd; [
"${keepassxc}"
];
env = [
"__GL_GSYNC_ALLOWED, 1"
"__GL_SYNC_TO_VBLANK, 1"
"__GL_VRR_ALLOWED, 1"
"CLUTTER_BACKEND, wayland"
"GDK_BACKEND, wayland,x11"
"QT_QPA_PLATFORM, wayland;xcb"
#"SDL_VIDEODRIVER, wayland"
"WLR_NO_HARDWARE_CURSORS, 1"
];
animations = {
bezier = [
"wind, 0.2, 0.9, 0.2, 1.05"
"winMov, 0.2, 0.9, 0.2, 1.08"
"winIn, 0.2, 0.9, 0.2, 1.08"
"winOut, 0.2, 0, 0.9, 0.2"
"liner, 1, 1, 1, 1"
];
animation = [
"windows, 1, 4, wind, slide"
"windowsIn, 1, 4, winIn, slide"
"windowsOut, 1, 4, winOut, slide"
"windowsMove, 1, 4, winMov, slide"
"fade, 1, 4, default"
"fadeOut, 1, 4, default"
"workspaces, 1, 4, wind"
];
};
cursor.no_hardware_cursors = true;
};
};
}