feat(hyprland): add hyprland and wayland config

This commit is contained in:
Lucien Cartier-Tilet 2025-05-04 14:27:15 +02:00
parent 92c59eb915
commit 39d57a4313
Signed by: phundrak
SSH Key Fingerprint: SHA256:CE0HPsbW3L2YiJETx1zYZ2muMptaAqTN2g3498KrMkc
21 changed files with 768 additions and 345 deletions

View File

@ -7,11 +7,12 @@
imports = [
inputs.sops-nix.nixosModules.sops
./system/hardware-configuration.nix
./services.nix
./services
../../modules/system.nix
../../modules/sops.nix
../../modules/opentablet.nix
../../programs/flatpak.nix
../../programs/hyprland.nix
../../programs/steam.nix
];
@ -54,6 +55,8 @@
};
};
modules.hyprland.enable = true;
security.rtkit.enable = true;
nix.settings.trusted-users = ["root" "phundrak"];

View File

@ -1,23 +1,24 @@
{
imports = [
../../modules/ssh.nix
../../modules/sunshine.nix
../../modules/xserver.nix
../../../modules/ssh.nix
../../../modules/sunshine.nix
../../../modules/xserver.nix
];
modules = {
xserver = {
amdgpu.enable = true;
de = "gnome";
};
sunshine = {
enable = true;
autostart = true;
};
xserver = {
amdgpu.enable = true;
de = "gnome";
};
};
services = {
blueman.enable = true;
fwupd.enable = true;
printing.enable = true;
openssh.enable = true;
fwupd.enable = true;
};
}

View File

@ -6,44 +6,9 @@
with lib; let
cfg = config.modules.hyprland;
in {
options.modules.hyprland = {
enable = mkEnableOption "Enables Hyprland";
config = mkOption {
type = types.lines;
default = "";
};
waybar = {
config = mkOption {
type = types.lines;
default = "";
};
style = mkOption {
type = types.nullOr types.path;
default = null;
};
};
};
config = {
wayland.windowManager.hyprland = mkIf cfg.enable {
enable = true;
xwayland.enable = true;
systemd.enable = true;
extraConfig = cfg.config;
};
services.wpaperd = {
enable = true;
settings = ''
[default]
path = "/home/phundrak/Pictures/Wallpapers/nord"
duration = "5m"
sorting = "ascending"
'';
};
programs.waybar = {
enable = true;
inherit (cfg.waybar) config style;
systemd.enableInspect = true;
};
options.modules.hyprland.enable = mkEnableOption "Enables Hyprland";
config.programs.hyprland = mkIf cfg.enable {
inherit (cfg) enable;
withUWSM = true;
};
}

View File

@ -1,15 +0,0 @@
{
config,
lib,
...
}:
with lib; let
cfg = config.modules.kdeconnect;
in {
options.modules.kdeconnect.enable = mkEnableOption "Enable KDEConnect";
config.services.kdeconnect = mkIf cfg.enable {
enable = true;
indicator = true;
};
}

View File

View File

@ -0,0 +1,12 @@
(defwindow example
:monitor 0
:geometry (geometry :x "0%"
:y "20%"
:width "90%"
:height "30px"
:anchor "top center")
:stacking "fg"
:reserve (struts :distance "40px" :side "top")
:windowtype "dock"
:wm-ignore false
"example content")

View File

6
users/modules/eww.nix Normal file
View File

@ -0,0 +1,6 @@
{
programs.eww = {
enable = true;
configDir = ./eww-config;
};
}

View File

@ -1,8 +1,300 @@
{
imports = [../../programs/hyprland.nix];
modules.hyprland = {
enable = true;
config = builtins.readFile ./config/hypr/hyprland.conf;
waybar.style = ./config/waybar/style.css;
config,
lib,
pkgs,
...
}:
with lib; let
cfg = config.modules.hyprland;
rofi-emoji = import ../scripts/rofi-emoji.nix {inherit pkgs;};
in {
imports = [
./swaync.nix
./waybar.nix
./wlsunset.nix
];
options.modules.hyprland = {
enable = mkEnableOption "Enables Hyprland";
swaync = mkEnableOption "Enables swaync";
emacsPkg = mkOption {
type = types.package;
default = pkgs.emacs;
};
host = mkOption {
type = types.enum ["tilo" "gampo"];
default = "tilo";
description = ''
Which host is Hyprland running on.
This helps determine the monitors layout.
'';
};
waybar = {
enable = mkEnableOption "Enables waybar.";
battery = mkEnableOption "Enables battery support.";
style = mkOption {
type = types.path;
example = ./style.css;
};
};
};
config = mkIf cfg.enable {
wayland.windowManager.hyprland = {
enable = true;
xwayland.enable = true;
systemd.enable = false;
importantPrefixes = ["$left" "$right" "$up" "$down" "$menu"];
settings = {
input = {
kb_layout = "fr";
kb_variant = "bepo_afnor";
kb_options = "caps:ctrl_modifier";
numlock_by_default = true;
follow_mouse = 1;
touchpad.natural_scroll = false;
sensitivity = "0";
};
monitor =
{
"tilo" = [
"DP-1, 3440x1440@144, 0x725, 1"
"DP-3, 2560x1080@60, 3440x0, 1, transform, 3"
];
"gampo" = [];
}."${cfg.host}";
general = {
gaps_in = 5;
gaps_out = 20;
border_size = 2;
"col.active_border" = "rgb(81a1c1) rgb(a3be8c) 45deg";
"col.inactive_border" = "rgb(4c566a)";
layout = "dwindle";
};
decoration = {
rounding = 5;
# blur = {
# enable = true;
# size = 9;
# passes = 1;
# };
# shadow = {
# enable = true;
# color = "rgba(2e3440aa)";
# range = 4;
# render_power = 3;
# };
};
animations = {
enabled = true;
animation = [
# "windows, 1, 7, myBezier"
"windowsOut, 1, 7, default, popin 80%"
"border, 1, 10, default"
"borderangle, 1, 8, default"
"fade, 1, 7, default"
"workspaces, 1, 6, default"
];
};
dwindle = {
pseudotile = true;
preserve_split = true;
};
exec-once = [
"pactl load-module module-switch-on-connect"
"${pkgs.mpc}/bin/mpc stop"
"${pkgs.networkmanagerapplet}/bin/nm-applet"
];
};
extraConfig = ''
$left = c
$right = r
$up = s
$down = t
$menu = ${pkgs.wofi}/bin/wofi --show drun
bind = SUPER, Return, exec, kitty
bind = SUPER, Space, submap, leader
bind = , Print, submap, screenshot
submap = leader
bind = , l, exec, plock
bind = , l, submap, reset
bind = , a, submap, apps
bind = , b, submap, buffers
bind = , w, submap, windows
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = apps
bind = , b, exec, zen
bind = , b, submap, reset
bind = SHIFT, b, exec, qutebrowser
bind = SHIFT, b, submap, reset
bind = , d, exec, vesktop
bind = , d, submap, reset
bind = , e, exec, ${cfg.emacsPkg}/bin/emacsclient -c -n
bind = , e, submap, reset
bind = , g, exec, ${pkgs.gimp}/bin/gimp
bind = , g, submap, reset
bind = , n, exec, ${pkgs.nemo}/bin/nemo
bind = , n, submap, reset
bind = , r, submap, rofi
bind = , u, exec, $menu
bind = , u, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = buffers
bind = , d, killactive,
bind = , d, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = resize
binde = , $left, resizeactive, -10 0
binde = , $right, resizeactive, 10 0
binde = , $up, resizeactive, 0 -10
binde = , $down, resizeactive, 0 10
bind = , q, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = rofi
bind = , e, exec, ${rofi-emoji}/bin/rofi-emoji
bind = , e, submap, reset
bind = , r, exec, $menu
bind = , r, submap, reset
bind = , y, exec, ytplay
bind = , y, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = screenshot
bind = , Print, exec, screenshot
bind = , Print, submap, reset
bind = , d, exec, screenshot -d 3
bind = , d, submap, reset
bind = Shift, d, exec, screenshot -sced 3
bind = Shift, d, submap, reset
bind = , e, exec, screenshot -sec
bind = , e, submap, reset
bind = , s, exec, screenshot -s
bind = , s, submap, reset
bind = Shift, s, exec, screenshot -sc
bind = Shift, s, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = windows
bind = , period, submap, resize
bind = , $left, movefocus, l
bind = , $left, submap, reset
bind = , $right, movefocus, r
bind = , $right, submap, reset
bind = , $up, movefocus, u
bind = , $up, submap, reset
bind = , $down, movefocus, d
bind = , $down, submap, reset
bind = SHIFT, $left, movewindow, l
bind = SHIFT, $left, submap, reset
bind = SHIFT, $right, movewindow, r
bind = SHIFT, $right, submap, reset
bind = SHIFT, $up, movewindow, u
bind = SHIFT, $up, submap, reset
bind = SHIFT, $down, movewindow, d
bind = SHIFT, $down, submap, reset
bind = CTRL_SHIFT, $left, moveworkspacetomonitor, e+0 +1
bind = CTRL_SHIFT, $left, submap, reset
bind = CTRL_SHIFT, $right, moveworkspacetomonitor, e+0 -1
bind = CTRL_SHIFT, $right, submap, reset
bind = , d, killactive,
bind = , d, submap, reset
bind = , f, fullscreen,
bind = , f, submap, reset
bind = SHIFT, f, togglefloating,
bind = SHIFT, f, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = reset
bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPause, exec, playerctl pause
bindl = , XF86AudioStop, exec, playerctl stop
bindl = , XF86AudioPrev, exec, playerctl previous
bindl = , XF86AudioNext, exec, playerctl next
bindl = , XF86AudioForward, exec, playerctl position +1
bindl = , XF86AudioRewind, exec, playerctl position -1
bindl = , XF86AudioRaiseVolume, exec, pamixer -i 2
bindl = , XF86AudioLowerVolume, exec, pamixer -d 2
bindl = , XF86MonBrightnessUp, exec, xbacklight -perceived -inc 2
bindl = , XF86MonBrightnessDown, exec, xbacklight -perceived -dec 2
bindl = , XF86KbdBrightnessUp, exec, xbacklight -perceived -inc 2
bindl = , XF86KbdBrightnessDown, exec, xbacklight -perceived -dec 2
bind = SUPER, $left, movefocus, l
bind = SUPER, $right, movefocus, r
bind = SUPER, $up, movefocus, u
bind = SUPER, $down, movefocus, d
bind = SUPER_SHIFT, $left, movewindow, l
bind = SUPER_SHIFT, $left, submap, reset
bind = SUPER_SHIFT, $right, movewindow, r
bind = SUPER_SHIFT, $right, submap, reset
bind = SUPER_SHIFT, $up, movewindow, u
bind = SUPER_SHIFT, $up, submap, reset
bind = SUPER_SHIFT, $down, movewindow, d
bind = SUPER_SHIFT, $down, submap, reset
bind = SUPER_CTRL_SHIFT, $left, moveworkspacetomonitor, e+0 +1
bind = SUPER_CTRL_SHIFT, $left, submap, reset
bind = SUPER_CTRL_SHIFT, $right, moveworkspacetomonitor, e+0 -1
bind = SUPER_CTRL_SHIFT, $right, submap, reset
bind = SUPER, Tab, cyclenext,
bind = SUPER_SHIFT, Tab, cyclenext, prev
bindm = SUPER, mouse:272, movewindow
bindm = SUPER, mouse:273, resizewindow
bind = SUPER, quotedbl, workspace, 1
bind = SUPER, guillemotleft, workspace, 2
bind = SUPER, guillemotright, workspace, 3
bind = SUPER, parenleft, workspace, 4
bind = SUPER, parenright, workspace, 5
bind = SUPER, at, workspace, 6
bind = SUPER, plus, workspace, 7
bind = SUPER, minus, workspace, 8
bind = SUPER, slash, workspace, 9
bind = SUPER, asterisk, workspace, 10
bind = SUPER, mouse_down, workspace, e+1
bind = SUPER, mouse_up, workspace, e-1
bind = SUPER_SHIFT, quotedbl, movetoworkspace, 1
bind = SUPER_SHIFT, guillemotleft, movetoworkspace, 2
bind = SUPER_SHIFT, guillemotright, movetoworkspace, 3
bind = SUPER_SHIFT, parenleft, movetoworkspace, 4
bind = SUPER_SHIFT, parenright, movetoworkspace, 5
bind = SUPER_SHIFT, at, movetoworkspace, 6
bind = SUPER_SHIFT, plus, movetoworkspace, 7
bind = SUPER_SHIFT, minus, movetoworkspace, 8
bind = SUPER_SHIFT, slash, movetoworkspace, 9
bind = SUPER_SHIFT, asterisk, movetoworkspace, 10
'';
};
services = {
blueman-applet.enable = true;
wpaperd = {
enable = true;
settings = {
default = {
path = "/home/phundrak/Pictures/Wallpapers/nord";
duration = "5m";
sorting = "random";
mode = "center";
recursive = true;
};
DP-3 = {
mode = "fit-border-color";
};
};
};
};
modules = {
swaync.enable = cfg.swaync;
waybar = mkIf cfg.waybar.enable {
inherit (cfg.waybar) enable battery style;
};
wlsunset.enable = true;
};
};
}

18
users/modules/swaync.nix Normal file
View File

@ -0,0 +1,18 @@
{
config,
lib,
pkgs,
...
}:
with lib; let
cfg = config.modules.swaync;
in {
options.modules.swaync = {
enable = mkEnableOption "Enables swaync";
};
config = mkIf cfg.enable {
services.swaync.enable = true;
home.packages = [pkgs.swaynotificationcenter];
};
}

154
users/modules/waybar.nix Normal file
View File

@ -0,0 +1,154 @@
{
config,
lib,
...
}:
with lib; let
cfg = config.modules.waybar;
in {
options.modules.waybar = {
enable = mkEnableOption "Enables waybar.";
battery = mkEnableOption "Enables battery support.";
style = mkOption {
type = types.path;
example = ./style.css;
};
};
config.programs.waybar = mkIf cfg.enable {
inherit (cfg) enable;
systemd.enable = true;
settings = {
topBar = {
height = 24;
spacing = 2;
modules-left = ["hyprland/workspaces" "hyprland/submap" "hyprland/window"];
modules-center = [];
modules-right = [
"idle_inhibitor"
"group/audio"
"group/hardware"
"network"
"privacy"
"clock"
"tray"
];
idle_inhibitor = {
format = "{icon}";
format-icons = {
activated = "";
deactivated = "";
};
};
mpris = {
dynamic-order = ["title" "artist" "album"];
dynamic-importance-order = ["title" "artist" "album"];
format = "DEFAULT: {player_icon} {dynamic}";
format-paused = "DEFAULT: {status_icon} <i>{dynamic}</i>";
player-icons = {
default = "";
mpv = "🎵";
};
status-icons.paused = "";
ignored-players = [];
};
pulseaudio = {
format = "{volume}% {icon} {format_source}";
format-bluetooth = "{volume}% {icon} {format_source}";
format-bluetooth-muted = " {icon} {format_source}";
format-muted = " {format_source}";
format-source = "{volume}% ";
format-source-muted = "";
format-icons = {
headphone = "";
hands-free = "";
headset = "";
phone = "";
portable = "";
car = "";
default = ["" "" ""];
};
on-click = "pavucontrol";
};
network = {
format-wifi = "{essid} ({signalStrength}%) ";
format-ethernet = "{ipaddr}/{cidr} ";
tooltip-format = "{ifname} via {gwaddr} ";
format-linked = "{ifname} (No IP) ";
format-disconnected = "Disconnected ";
format-alt = "{ifname}: {ipaddr}/{cidr}";
};
"group/audio" = {
modules = ["mpris" "pulseaudio" "pulseaudio/slider"];
orientation = "inherit";
drawer.transition-duration = 300;
};
"group/hardware" = {
modules = lists.optional cfg.battery "battery" ++ ["cpu" "memory" "disk"];
orientation = "inherit";
drawer.transition-duration = 300;
};
cpu = {
format = "{usage}% ";
tooltip = false;
};
memory.format = "{}% ";
disk = {
format = "{path}: {used}/{total} ({percentage_used}%)";
unit = "GB";
};
battery = {
states = {
good = 90;
warning = 30;
critical = 15;
};
format = "{capacity}% {icon}";
format-charging = "{capacity}% ";
format-plugged = "{capacity}% ";
format-alt = "{time} {icon}";
# An empty format will hide the module
format-good = "";
format-full = "";
format-icons = ["" "" "" "" ""];
};
clock = {
timezones = ["Europe/Paris" "Asia/Tokyo" "America/New_York" "America/Los_Angeles" "Asia/Kathmandu"];
tooltip-format = "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>";
format-alt = "{:%Y-%m-%d}";
actions = {
on-click-right = "mode";
on-scroll-up = "tz_up";
on-scroll-down = "tz_down";
};
calendar = {
mode = "year";
mode-mon-col = 3;
weeks-pos = "right";
on-scroll = 1;
format = {
months = "<span color='#eceff4'><b>{}</b></span>";
days = "<span color='#5e81ac'><b>{}</b></span>";
weeks = "<span color='#8fbcbb'><b>W{:%W}</b></span>";
weekdays = "<span color='#d8dee9'><b>{}</b></span>";
today = "<span color='#a3be8c'><b><u>{}</u></b></span>";
};
};
};
tray.spacing = 10;
};
};
style = builtins.readFile cfg.style;
};
}

View File

@ -0,0 +1,24 @@
{
config,
lib,
...
}:
with lib; let
cfg = config.modules.wlsunset;
in {
options.modules.wlsunset = {
enable = mkEnableOption "Enables wlsunset";
latitude = mkOption {
type = with types; nullOr (oneOf [str ints.unsigned float]);
default = 48.5;
};
longitude = mkOption {
type = with types; nullOr (oneOf [str ints.unsigned float]);
default = 2.2;
};
};
config.services.wlsunset = mkIf cfg.enable {
inherit (cfg) enable latitude longitude;
};
}

116
users/phundrak/#home.nix# Normal file
View File

@ -0,0 +1,116 @@
{
pkgs,
config,
inputs,
...
}: {
imports = [
./light-home.nix
./packages.nix
../modules/emacs.nix
../modules/kdeconnect.nix
../modules/kitty.nix
../modules/hyprland.nix
../modules/mbsync.nix
../modules/mpd.nix
../modules/mpv.nix
../modules/wofi.nix
../modules/yt-dlp.nix
../modules/emoji.nix
../modules/qt.nix
];
config = let
emacsPkg = with pkgs; ((emacsPackagesFor emacsNativeComp).emacsWithPackages (
epkgs: [
epkgs.vterm
epkgs.mu4e
epkgs.pdf-tools
]
));
askpass = import ../scripts/askpass.nix {inherit pkgs;};
launchWithEmacsclient = import ../scripts/launch-with-emacsclient.nix {
inherit pkgs;
emacsPackage = emacsPkg;
};
in {
sops.secrets = {
emailPassword = {};
"mopidy/bandcamp" = {};
"mopidy/spotify" = {};
};
home.sessionVariables = {
EDITOR = "${emacsPkg}/bin/emacsclient -c -a ${emacsPkg}/bin/emacs";
LAUNCH_EDITOR = "${launchWithEmacsclient}/bin/launch-with-emacsclient";
SUDO_ASKPASS = "${askpass}/bin/askpass";
LSP_USE_PLISTS = "true";
};
modules = {
shell.starship.jjIntegration = true;
bat.extras = true;
packages.emacsPackage = emacsPkg;
mopidy.enable = true;
emacs = {
enable = true;
service = true;
package = emacsPkg;
};
hyprland = {
inherit emacsPkg;
enable = true;
swaync = true;
waybar = {
enable = true;
battery = false;
style = ./config/waybar/style.css;
};
};
mbsync = {
enable = true;
passwordFile = config.sops.secrets.emailPassword.path;
};
ssh = {
enable = true;
hosts = config.sops.secrets."ssh/hosts".path;
};
vcs.git = {
browser = "${inputs.zen-browser.packages.${pkgs.system}.default}/bin/zen";
emacs = {
integration = true;
pkg = emacsPkg;
};
sendmail = {
enable = true;
passwordFile = config.sops.secrets.emailPassword.path;
};
};
};
programs = {
zsh.enableVteIntegration = true;
mu.enable = true;
obs-studio = {
enable = true;
plugins = with pkgs; [
obs-studio-plugins.input-overlay
obs-studio-plugins.obs-backgroundremoval
obs-studio-plugins.obs-mute-filter
obs-studio-plugins.obs-pipewire-audio-capture
obs-studio-plugins.obs-source-clone
obs-studio-plugins.obs-source-record
obs-studio-plugins.obs-tuna
];
};
};
services = {
mpris-proxy.enable = true;
playerctld.enable = true;
};
manual.html.enable = true;
};
}

View File

@ -1,249 +0,0 @@
env = XCURSOR_SIZE,24
env = SDL_VIDEODRIVER,wayland
input {
kb_layout = fr
kb_variant = bepo_afnor
kb_model =
kb_options = caps:ctrl_modifier
kb_rules =
numlock_by_default = true
follow_mouse = 1
touchpad {
natural_scroll = false
}
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
}
monitor = HDMI-A-1, 2560x1080, 0x0, 1
monitor = eDP-1, 1920x1080@120, 2560x0, 1
general {
gaps_in = 5
gaps_out = 20
border_size = 2
col.active_border = rgb(81a1c1) rgb(a3be8c) 45deg
col.inactive_border = rgb(4c566a)
layout = dwindle
}
decoration {
rounding = 5
blur {
enabled = true
size = 9
passes = 1
}
shadow {
enabled = true
color = rgba(2e3440aa)
range = 4
render_power = 3
}
}
animations {
enabled = true
bezier = myBezier, 0.05, 0.9, 0.1, 1.05
animation = windows, 1, 7, myBezier
animation = windowsOut, 1, 7, default, popin 80%
animation = border, 1, 10, default
animation = borderangle, 1, 8, default
animation = fade, 1, 7, default
animation = workspaces, 1, 6, default
}
dwindle {
pseudotile = true
preserve_split = true
}
exec-once = wpaperd
exec-once = waybar
exec-once = pactl load-module module-switch-on-connect
exec-once = mpc stop
exec-once = xfce-polkit
exec-once = swaync
exec-once = wlsunset -l 48.5 -L 2.2 -d 1500
exec-once = nm-applet
exec-once = blueman-applet
$left = c
$right = r
$up = s
$down = t
$menu = rofi -combi-modi drun -show combi
bind = SUPER, Return, exec, kitty
bind = SUPER, Space, submap, leader
bind = , Print, submap, screenshot
submap = leader
bind = , l, exec, plock
bind = , l, submap, reset
bind = , a, submap, apps
bind = , b, submap, buffers
bind = , w, submap, windows
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = apps
bind = , b, exec, zen-browser
bind = , b, submap, reset
bind = SHIFT, b, exec, qutebrowser
bind = SHIFT, b, submap, reset
bind = , d, exec, vesktop
bind = , d, submap, reset
bind = , e, exec, emacsclient -c -n
bind = , e, submap, reset
bind = , g, exec, gimp
bind = , g, submap, reset
bind = , n, exec, nemo
bind = , n, submap, reset
bind = , r, submap, rofi
bind = , u, exec, $menu
bind = , u, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = buffers
bind = , d, killactive,
bind = , d, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = resize
binde = , $left, resizeactive, -10 0
binde = , $right, resizeactive, 10 0
binde = , $up, resizeactive, 0 -10
binde = , $down, resizeactive, 0 10
bind = , q, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = rofi
bind = , a, exec, awiki
bind = , a, submap, reset
bind = , b, exec, bluetooth-connect
bind = , b, submap, reset
bind = , e, exec, rofi-emoji
bind = , e, submap, reset
bind = , r, exec, $menu
bind = , r, submap, reset
bind = , s, exec, rofi -show ssh
bind = , s, submap, reset
bind = , y, exec, ytplay
bind = , y, submap, reset
bind = SHIFT, y, exec, rofi-ytdl
bind = SHIFT, y, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = screenshot
bind = , Print, exec, screenshot
bind = , Print, submap, reset
bind = , d, exec, screenshot -d 3
bind = , d, submap, reset
bind = Shift, d, exec, screenshot -sced 3
bind = Shift, d, submap, reset
bind = , e, exec, screenshot -sec
bind = , e, submap, reset
bind = , s, exec, screenshot -s
bind = , s, submap, reset
bind = Shift, s, exec, screenshot -sc
bind = Shift, s, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = windows
bind = , period, submap, resize
bind = , $left, movefocus, l
bind = , $left, submap, reset
bind = , $right, movefocus, r
bind = , $right, submap, reset
bind = , $up, movefocus, u
bind = , $up, submap, reset
bind = , $down, movefocus, d
bind = , $down, submap, reset
bind = SHIFT, $left, movewindow, l
bind = SHIFT, $left, submap, reset
bind = SHIFT, $right, movewindow, r
bind = SHIFT, $right, submap, reset
bind = SHIFT, $up, movewindow, u
bind = SHIFT, $up, submap, reset
bind = SHIFT, $down, movewindow, d
bind = SHIFT, $down, submap, reset
bind = CTRL_SHIFT, $left, moveworkspacetomonitor, e+0 +1
bind = CTRL_SHIFT, $left, submap, reset
bind = CTRL_SHIFT, $right, moveworkspacetomonitor, e+0 -1
bind = CTRL_SHIFT, $right, submap, reset
bind = , d, killactive,
bind = , d, submap, reset
bind = , f, fullscreen,
bind = , f, submap, reset
bind = SHIFT, f, togglefloating,
bind = SHIFT, f, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = reset
bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPause, exec, playerctl pause
bindl = , XF86AudioStop, exec, playerctl stop
bindl = , XF86AudioPrev, exec, playerctl previous
bindl = , XF86AudioNext, exec, playerctl next
bindl = , XF86AudioForward, exec, playerctl position +1
bindl = , XF86AudioRewind, exec, playerctl position -1
bindl = , XF86AudioRaiseVolume, exec, pamixer -i 2
bindl = , XF86AudioLowerVolume, exec, pamixer -d 2
bindl = , XF86MonBrightnessUp, exec, xbacklight -perceived -inc 2
bindl = , XF86MonBrightnessDown, exec, xbacklight -perceived -dec 2
bindl = , XF86KbdBrightnessUp, exec, xbacklight -perceived -inc 2
bindl = , XF86KbdBrightnessDown, exec, xbacklight -perceived -dec 2
bind = SUPER, $left, movefocus, l
bind = SUPER, $right, movefocus, r
bind = SUPER, $up, movefocus, u
bind = SUPER, $down, movefocus, d
bind = SUPER_SHIFT, $left, movewindow, l
bind = SUPER_SHIFT, $left, submap, reset
bind = SUPER_SHIFT, $right, movewindow, r
bind = SUPER_SHIFT, $right, submap, reset
bind = SUPER_SHIFT, $up, movewindow, u
bind = SUPER_SHIFT, $up, submap, reset
bind = SUPER_SHIFT, $down, movewindow, d
bind = SUPER_SHIFT, $down, submap, reset
bind = SUPER_CTRL_SHIFT, $left, moveworkspacetomonitor, e+0 +1
bind = SUPER_CTRL_SHIFT, $left, submap, reset
bind = SUPER_CTRL_SHIFT, $right, moveworkspacetomonitor, e+0 -1
bind = SUPER_CTRL_SHIFT, $right, submap, reset
bind = SUPER, Tab, cyclenext,
bind = SUPER_SHIFT, Tab, cyclenext, prev
bindm = SUPER, mouse:272, movewindow
bindm = SUPER, mouse:273, resizewindow
bind = SUPER, quotedbl, workspace, 1
bind = SUPER, guillemotleft, workspace, 2
bind = SUPER, guillemotright, workspace, 3
bind = SUPER, parenleft, workspace, 4
bind = SUPER, parenright, workspace, 5
bind = SUPER, at, workspace, 6
bind = SUPER, plus, workspace, 7
bind = SUPER, minus, workspace, 8
bind = SUPER, slash, workspace, 9
bind = SUPER, asterisk, workspace, 10
bind = SUPER, mouse_down, workspace, e+1
bind = SUPER, mouse_up, workspace, e-1
bind = SUPER_SHIFT, quotedbl, movetoworkspace, 1
bind = SUPER_SHIFT, guillemotleft, movetoworkspace, 2
bind = SUPER_SHIFT, guillemotright, movetoworkspace, 3
bind = SUPER_SHIFT, parenleft, movetoworkspace, 4
bind = SUPER_SHIFT, parenright, movetoworkspace, 5
bind = SUPER_SHIFT, at, movetoworkspace, 6
bind = SUPER_SHIFT, plus, movetoworkspace, 7
bind = SUPER_SHIFT, minus, movetoworkspace, 8
bind = SUPER_SHIFT, slash, movetoworkspace, 9
bind = SUPER_SHIFT, asterisk, movetoworkspace, 10
windowrulev2 = float,class:^(xfce-polkit)$

View File

@ -10,6 +10,7 @@
../modules/emacs.nix
../modules/kdeconnect.nix
../modules/kitty.nix
../modules/hyprland.nix
../modules/mbsync.nix
../modules/mpd.nix
../modules/mpv.nix
@ -47,16 +48,26 @@
};
modules = {
emacs = {
enable = true;
service = true;
package = emacsPkg;
};
shell.starship.jjIntegration = true;
bat.extras = true;
packages.emacsPackage = emacsPkg;
mopidy.enable = true;
emacs = {
enable = true;
service = true;
package = emacsPkg;
};
hyprland = {
inherit emacsPkg;
enable = true;
swaync = true;
waybar = {
enable = true;
battery = false;
style = ./config/waybar/style.css;
};
};
mbsync = {
enable = true;
passwordFile = config.sops.secrets.emailPassword.path;

View File

@ -7,12 +7,13 @@
in [
askpass
(import ./backup.nix {inherit pkgs;})
(import ./hyprland-autostart.nix {inherit pkgs;})
(import ./keygen.nix {inherit pkgs;})
(import ./launch-with-emacsclient.nix {
inherit pkgs;
emacsPackage = config.emacsPkg;
})
(import ./mp42webm.nix {inherit pkgs;})
(import ./plock.nix {inherit pkgs;})
(import ./screenshot.nix {inherit pkgs;})
(import ./sshbind.nix {inherit pkgs;})
]

View File

@ -1,4 +0,0 @@
{pkgs, ...}:
pkgs.writeShellScriptBin "hyprland-autostart" ''
${pkgs.waybar}/bin/waybar &
${pkgs.wlsunset}/bin/wlsunset -l 48.5 -L 2.2 -d 1500''

16
users/scripts/plock.nix Normal file
View File

@ -0,0 +1,16 @@
{pkgs, ...}:
pkgs.writeShellScriptBin "plock" ''
TMPBG="/tmp/screen.png"
if [ "$XDG_SESSION_TYPE" = "wayland" ]; then
SCREENER=${pkgs.grim}/bin/grim
LOCKER="${pkgs.swaylock}/bin/swaylock -feF"
else
SCREENER=${pkgs.scrot}/bin/scrot
LOCKER="${pkgs.i3lock}/bin/i3lock -ef"
fi
$SCREENER "$TMPBG"
${pkgs.corrupter}/bin/corrupter -add 0 "$TMPBG" "$TMPBG"
$LOCKER -ti "$TMPBG"
rm "$TMPBG"
''

View File

@ -0,0 +1,18 @@
{pkgs, ...}:
pkgs.writeShellScriptBin "rofi-emoji" ''
SELECTED_EMOJI=$(grep -v "#" ~/.config/emoji | ${pkgs.wofi}/bin/wofi --dmenu -p "Select emoji" -i | awk '{print $1}' | tr -d '\n')
if [ "$XDG_SESSION_TYPE" = "wayland" ]; then
printf "%s" "$SELECTED_EMOJI" | ${pkgs.wl-clipboard-rs}/bin/wl-copy
else
printf "%s" "$SELECTED_EMOJI" | ${pkgs.xclip}/bin/xclip -sel clip
fi
if [ "$XDG_SESSION_TYPE" = "wayland" ]
then EMOJI=$(${pkgs.wl-clipboard-rs}/bin/wl-paste)
else EMOJI=$(${pkgs.xclip}/bin/xclip -o)
fi
test -z "$EMOJI" && notify-send "No emoji copied" -u low && exit
EMOJI="$EMOJI copied to clipboard"
${pkgs.libnotify}/bin/notify-send -u low "$EMOJI"
''

View File

@ -0,0 +1,56 @@
{pkgs, ...}:
pkgs.writeShellScriptBin "screenshot" ''
OUTFILE_BASE="$HOME/Pictures/Screenshots/Screenshot_$(date +%Y-%m-%d_%H.%M.%S)"
OUTFILE="$OUTFILE_BASE.png"
SUFFIX=0
while getopts ':cd:egs' OPTION; do
case "$OPTION" in
c )
COPY="yes"
;;
d )
DELAY="$OPTARG"
;;
e )
EDIT="yes"
;;
g )
GIMP="yes"
;;
s )
SELECT="yes"
;;
? )
echo "Usage: $(basename "$0") [-c] [-d DELAY] [-e] [-g] [-s]"
exit 1
;;
esac
done
if [ "$SELECT" = "yes" ]; then
AREA="$(${pkgs.slurp}/bin/slurp)"
fi
if [ -n "$DELAY" ]; then
sleep "$DELAY"
fi
if [ "$SELECT" = "yes" ]; then
${pkgs.grim}/bin/grim -g "$AREA" "$OUTFILE"
else
${pkgs.grim}/bin/grim "$OUTFILE"
fi
if [ "$EDIT" = "yes" ];then
${pkgs.swappy}/bin/swappy -f "$OUTFILE" -o "$OUTFILE"
fi
if [ "$GIMP" = "yes" ]; then
${pkgs.gimp}/bin/gimp "$OUTFILE"
fi
if [ "$COPY" = "yes" ]; then
${pkgs.wl-clipboard-rs}/bin/wl-copy < "$OUTFILE"
fi
''

View File

@ -1,18 +1,16 @@
{pkgs, ...}: let
rofi = pkgs.rofi-wayland;
in
pkgs.writeShellScriptBin "ytplay" ''
URL=$(${rofi}/bin/rofi -dmenu -i -p "Video URL")
if [ -z "$URL" ]; then
echo "You need to provide a URL"
exit 1
fi
RESOLUTION_CHOICE=$(${pkgs.yt-dlp}/bin/yt-dlp --list-formats "$URL" | \
grep -E "webm.*[0-9]+x[0-9]" | \
awk '{print $3 " " $1}' | \
sort -gu | \
${rofi}/bin/rofi -dmenu -i -p "Resolution")
mapfile -t RESOLUTION <<< "$RESOLUTION_CHOICE"
RESOLUTION_CODE=''${RESOLUTION[0]}
${pkgs.mpv}/bin/mpv --ytdl-format="''${RESOLUTION_CODE}+bestaudio/best" "$URL"
''
{pkgs, ...}:
pkgs.writeShellScriptBin "ytplay" ''
URL=$(${pkgs.wofi}/bin/wofi --dmenu -i -p "Video URL")
if [ -z "$URL" ]; then
echo "You need to provide a URL"
exit 1
fi
RESOLUTION_CHOICE=$(${pkgs.yt-dlp}/bin/yt-dlp --list-formats "$URL" | \
grep -E "webm.*[0-9]+x[0-9]" | \
awk '{print $3 " " $1}' | \
sort -gu | \
${pkgs.wofi}/bin/wofi --dmenu -i -p "Resolution")
mapfile -t RESOLUTION <<< "$RESOLUTION_CHOICE"
RESOLUTION_CODE=''${RESOLUTION[0]}
${pkgs.mpv}/bin/mpv --ytdl-format="''${RESOLUTION_CODE}+bestaudio/best" "$URL"
''