feat: big refactor

This commit is contained in:
Jacob Bachmann 2024-09-07 15:10:22 +02:00
parent 2c09c21833
commit ebedec9768
No known key found for this signature in database
GPG key ID: 7753026D577922A6
159 changed files with 1927 additions and 2222 deletions

View file

@ -0,0 +1,47 @@
{ pkgs, lib, ... }:
{
colorschemes = rec {
custom = {
black = "#000000";
_black = "000000";
white = "#ffffff";
_white = "ffffff";
# https://yeun.github.io/open-color/
active = "#ffffff"; # white
activeDark = "#4276b9"; # blue
_activeDark = "4276b9"; # blue
inactive = "#495057"; # gray7
inactiveDark = "#212529"; # gray9
alert = "#c92a2a"; # red9
# active = "#ffdeeb"; # pink1
# activeDark = "#f783ac"; # pink4
# _activeDark = "f783ac"; # pink4
# inactive = "#495057"; # gray7
# inactiveDark = "#212529"; # gray9
# alert = "#c92a2a"; # red9
};
default = custom;
};
font = "DejaVuSansM Nerd Font";
font-size = "14";
gtk = "Adwaita";
wallpaper = rec {
neptun = pkgs.fetchurl {
url = "https://live.staticflickr.com/65535/52797919139_2444712a38_o_d.png";
sha256 = "1a9148d8911fa25afa82d3b843ee620173955a7ca705d525f3e9d00e00696308";
meta.licenses = lib.licenses.cc0;
};
everest = pkgs.fetchurl {
url = "https://images7.alphacoders.com/546/546508.jpg";
sha256 = "90774d977a5f9cde2264fc1c46417b34046f491b5caca7805c9cd17e3463777b";
meta.licenses = lib.licenses.cc0;
};
default = everest;
};
}

View file

@ -0,0 +1,10 @@
{ pkgs, ... }:
{
home.pointerCursor = {
name = "macOS-Monterey";
package = pkgs.apple-cursor;
size = 32;
gtk.enable = true;
x11.enable = true;
};
}

View file

@ -0,0 +1,13 @@
{ lib, nixosConfig, ... }:
{
imports =
with lib;
with nixosConfig.bchmnn;
optionals gui.enable [
./cursor.nix
./gtk.nix
./programs
]
++ optionals (gui.enable && elem "sway" gui.flavour) [ ./sway ]
++ optionals (gui.enable && elem "i3" gui.flavour) [ ./i3 ];
}

View file

@ -0,0 +1,12 @@
{ ... }:
{
gtk = {
enable = true;
gtk3.extraConfig = {
gtk-application-prefer-dark-theme = 0;
};
gtk4.extraConfig = {
gtk-application-prefer-dark-theme = 0;
};
};
}

View file

@ -0,0 +1,55 @@
{ ... }:
{
programs.autorandr = {
enable = true;
profiles = {
nomad = {
config = {
"LVDS-1" = {
enable = false;
};
};
};
samsung = {
fingerprint = {
"HDMI-0" = "00ffffffffffff004c2d830e000e0001011c0103806b3c780a23ada4544d99260f474abdef80714f81c0810081809500a9c0b300010104740030f2705a80b0588a00501d7400001e023a801871382d40582c4500501d7400001e000000fd00184b0f511e000a202020202020000000fc0053414d53554e470a202020202001b902034cf0535f101f041305142021225d5e626364071603122909070715075057070183010000e2004fe30503016e030c001000b83c20008001020304e3060d01e50e60616566e5018b849001011d80d0721c1620102c2580501d7400009e662156aa51001e30468f3300501d7400001e000000000000000000000000000000a3";
};
config = {
"HDMI-0" = {
enable = true;
primary = true;
mode = "3840x2160";
rate = "59.94";
position = "0x0";
};
};
};
station = {
config = {
"LVDS-1" = {
enable = false;
};
"DP-1-3" = {
enable = false;
mode = "1920x1080";
position = "0x0";
};
"DP-1-2" = {
enable = false;
mode = "1920x1080";
position = "1920x0";
};
"VGA-1-2" = {
enable = false;
mode = "1920x1080";
position = "3840x0";
};
};
};
};
};
}

View file

@ -0,0 +1,257 @@
{
pkgs,
lib,
config,
...
}:
let
cfg = config.xsession.windowManager.i3.config;
# common = (import ../common.nix) { pkgs = pkgs; lib = lib; };
common = (import ../common.nix) {
inherit pkgs;
inherit lib;
};
start-polybar = pkgs.writeShellScript "start-polybar" ''
${pkgs.polybarFull}/bin/polybar-msg cmd quit
echo "---" | tee -a /tmp/polybar.log
${pkgs.polybarFull}/bin/polybar 2>&1 | tee -a /tmp/polybar.log & disown
'';
in
{
imports = [
./autorandr.nix
./polybar.nix
./rofi.nix
];
home.packages = with pkgs; [
dmenu
xclip # tool to access the x clipboard from a console application
wireplumber
feh # lightweight image viewer (also sets wallpaper)
brightnessctl # control screen brightness
pavucontrol # control audio
playerctl # control player
networkmanagerapplet # control network
udiskie # automount usb
blueman # control bluetooth
nextcloud-client # nextcloud client to connect to any instance
libsForQt5.kdeconnect-kde # sync phone and pc
system-config-printer # printer manager
gnome3.adwaita-icon-theme
maim
];
xsession = {
initExtra = "xset s off";
windowManager.i3 = {
enable = true;
config = {
modifier = "Mod4";
bars = [ ];
terminal = "${config.programs.kitty.package}/bin/kitty";
menu = "${config.programs.rofi.package}/bin/rofi -show drun";
startup = with pkgs; [
{ command = "${start-polybar}"; }
{
command = "${gnome.gnome-keyring}/bin/gnome-keyring-daemon --start --components=ssh,secrets,pkcs11";
}
{ command = "${autorandr}/bin/autorandr -c"; }
{ command = "${feh}/bin/feh --bg-fill ${common.wallpaper.default}"; }
{ command = "${networkmanagerapplet}/bin/nm-applet"; }
{ command = "${blueman}/bin/blueman-applet"; }
{ command = "${udiskie}/bin/udiskie --tray"; }
{ command = "${nextcloud-client}/bin/nextcloud"; }
{ command = "${plasma5Packages.kdeconnect-kde}/bin/kdeconnect-indicator"; }
{ command = "${system-config-printer}/bin/system-config-printer-applet"; }
{
command = "${config.programs.kitty.package}/bin/kitty --class dropdown --title dropdown";
always = true;
}
];
fonts = {
names = [ common.font ];
style = "Bold";
size = 12.0;
};
window = {
titlebar = false;
border = 4;
commands = [
{
command = "floating enable";
criteria = {
instance = "dropdown";
};
}
{
command = "resize set 1400 800";
criteria = {
instance = "dropdown";
};
}
{
command = "move scratchpad";
criteria = {
instance = "dropdown";
};
}
];
};
gaps = {
inner = 5;
};
colors = {
focused = {
border = common.colorschemes.default.active;
background = common.colorschemes.default.active;
text = common.colorschemes.default.black;
indicator = common.colorschemes.default.activeDark;
childBorder = common.colorschemes.default.active;
};
focusedInactive = {
border = common.colorschemes.default.inactive;
background = common.colorschemes.default.inactive;
text = common.colorschemes.default.white;
indicator = common.colorschemes.default.inactive;
childBorder = common.colorschemes.default.inactive;
};
unfocused = {
border = common.colorschemes.default.inactiveDark;
background = common.colorschemes.default.inactiveDark;
text = common.colorschemes.default.white;
indicator = common.colorschemes.default.inactiveDark;
childBorder = common.colorschemes.default.inactiveDark;
};
urgent = {
border = common.colorschemes.default.alert;
background = common.colorschemes.default.alert;
text = common.colorschemes.default.white;
indicator = common.colorschemes.default.black;
childBorder = common.colorschemes.default.alert;
};
placeholder = {
border = common.colorschemes.default.active;
background = common.colorschemes.default.active;
text = common.colorschemes.default.black;
indicator = common.colorschemes.default.activeDark;
childBorder = common.colorschemes.default.active;
};
};
keybindings = {
# Basics
"${cfg.modifier}+Return" = "exec ${cfg.terminal}";
"${cfg.modifier}+q" = "kill";
"${cfg.modifier}+i" = "exec ${cfg.menu}";
"${cfg.modifier}+space" = "exec ${cfg.menu}";
"${cfg.modifier}+Shift+c" = "reload";
"${cfg.modifier}+Shift+q" = "exec i3-nagbar -t warning -m 'Do you want to exit i3?' -b 'Yes' 'i3-msg exit'";
"${cfg.modifier}+Shift+r" = "restart";
# Focus
"${cfg.modifier}+h" = "focus left";
"${cfg.modifier}+j" = "focus down";
"${cfg.modifier}+k" = "focus up";
"${cfg.modifier}+l" = "focus right";
"${cfg.modifier}+p" = "focus output left";
"${cfg.modifier}+n" = "focus output right";
# Moving
"${cfg.modifier}+Shift+h" = "move left";
"${cfg.modifier}+Shift+j" = "move down";
"${cfg.modifier}+Shift+k" = "move up";
"${cfg.modifier}+Shift+l" = "move right";
# Workspaces
"${cfg.modifier}+1" = "workspace number 1";
"${cfg.modifier}+2" = "workspace number 2";
"${cfg.modifier}+3" = "workspace number 3";
"${cfg.modifier}+4" = "workspace number 4";
"${cfg.modifier}+5" = "workspace number 5";
"${cfg.modifier}+6" = "workspace number 6";
"${cfg.modifier}+7" = "workspace number 7";
"${cfg.modifier}+8" = "workspace number 8";
"${cfg.modifier}+9" = "workspace number 9";
"${cfg.modifier}+0" = "workspace number 10";
"${cfg.modifier}+Shift+1" = "move container to workspace number 1";
"${cfg.modifier}+Shift+2" = "move container to workspace number 2";
"${cfg.modifier}+Shift+3" = "move container to workspace number 3";
"${cfg.modifier}+Shift+4" = "move container to workspace number 4";
"${cfg.modifier}+Shift+5" = "move container to workspace number 5";
"${cfg.modifier}+Shift+6" = "move container to workspace number 6";
"${cfg.modifier}+Shift+7" = "move container to workspace number 7";
"${cfg.modifier}+Shift+8" = "move container to workspace number 8";
"${cfg.modifier}+Shift+9" = "move container to workspace number 9";
"${cfg.modifier}+Shift+0" = "move container to workspace number 10";
"${cfg.modifier}+Control+j" = "workspace prev";
"${cfg.modifier}+Control+k" = "workspace next";
"${cfg.modifier}+Control+Shift+j" = "move workspace to output left";
"${cfg.modifier}+Control+Shift+k" = "move workspace to output right";
# Splits
"${cfg.modifier}+b" = "split h";
"${cfg.modifier}+v" = "split v";
# Layouts
"${cfg.modifier}+s" = "layout stacking";
"${cfg.modifier}+w" = "layout tabbed";
"${cfg.modifier}+e" = "layout toggle split";
"${cfg.modifier}+f" = "fullscreen toggle";
"${cfg.modifier}+a" = "focus parent";
"${cfg.modifier}+d" = "floating toggle";
"${cfg.modifier}+Shift+d" = "focus mode_toggle";
# Scratchpad
# "${cfg.modifier}+Shift+minus" = "move scratchpad";
# "${cfg.modifier}+minus" = "scratchpad show";
# Resize mode
"${cfg.modifier}+r" = "mode resize";
# Outer gaps
"${cfg.modifier}+equal" = "gaps horizontal current minus 200; gaps vertical current minus 100";
"${cfg.modifier}+minus" = "gaps horizontal current plus 200; gaps vertical current plus 100";
"${cfg.modifier}+bracketright" = "gaps outer current set 5";
"${cfg.modifier}+bracketleft" = "gaps horizontal current set 800; gaps vertical current set 400";
# Dropdown term
"${cfg.modifier}+grave" = "[instance=\"dropdown\"] scratchpad show; [instance=\"dropdown\"] move position center";
"${cfg.modifier}+Escape" = "[instance=\"dropdown\"] scratchpad show; [instance=\"dropdown\"] move position center";
# Multimedia Keys
"XF86AudioRaiseVolume" = "exec ${pkgs.wireplumber}/bin/wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+";
"XF86AudioLowerVolume" = "exec ${pkgs.wireplumber}/bin/wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%-";
"XF86AudioMute" = "exec ${pkgs.wireplumber}/bin/wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle";
"XF86AudioMicMute" = "exec ${pkgs.wireplumber}/bin/wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle";
"XF86MonBrightnessDown" = "exec ${pkgs.brightnessctl}/bin/brightnessctl -q set 5%-";
"XF86MonBrightnessUp" = "exec ${pkgs.brightnessctl}/bin/brightnessctl -q set 5%+";
"XF86AudioPrev" = "exec ${pkgs.playerctl}/bin/playerctl previous";
"XF86AudioNext" = "exec ${pkgs.playerctl}/bin/playerctl next";
"XF86AudioPlay" = "exec ${pkgs.playerctl}/bin/playerctl play-pause";
"XF86AudioPause" = "exec ${pkgs.playerctl}/bin/playerctl play-pause";
# Screenshot
"Print" = "exec ${pkgs.maim}/bin/maim --select | xclip -selection clipboard -t image/png";
# Programs
"${cfg.modifier}+Shift+v" = "exec ${pkgs.pavucontrol}/bin/pavucontrol";
"${cfg.modifier}+Shift+b" = "exec ${pkgs.blueman}/bin/blueman-manager";
"${cfg.modifier}+Shift+n" = "exec ${pkgs.networkmanagerapplet}/bin/nm-connection-editor";
"${cfg.modifier}+Shift+a" = "exec ${pkgs.swaynotificationcenter}/bin/swaync-client -t -sw";
};
};
extraConfig = ''
exec --no-startup-id ${pkgs.i3}/bin/i3-msg 'workspace 1'
'';
};
};
}

View file

@ -0,0 +1,176 @@
{ pkgs, ... }: {
home.packages = with pkgs; [
polybarFull
];
xdg.configFile."polybar/config.ini" = {
text = ''
[colors]
background = #FFFFFF
background-alt = #D3D3D3
foreground = #000000
primary = #F0C674
secondary = #8ABEB7
blue = #4276b9
alert = #A54242
disabled = #707880
[bar/main]
width = 100%
height = 24pt
radius = 10
background = ''${colors.background}
foreground = ''${colors.foreground}
line-size = 3pt
border-size = 4pt
border-color = #00000000
padding-left = 0
padding-right = 1
module-margin = 1
separator =
separator-foreground = ''${colors.disabled}
font-0 = DejaVuSansM Nerd Font:pixelsize=12;3
modules-left = xworkspaces xwindow
modules-right = systray wlan eth pulseaudio filesystem cpu temperature memory date
cursor-click = pointer
cursor-scroll = ns-resize
enable-ipc = true
[module/systray]
type = internal/tray
format-margin = 8pt
tray-spacing = 4pt
tray-size = 55%
tray-background = ''${colors.blue}
format-background = ''${colors.blue}
format-padding = 10px
format-radius = 5.0
[module/xworkspaces]
type = internal/xworkspaces
label-active = %name%
label-active-background = ''${colors.background-alt}
label-active-padding = 1
label-occupied = %name%
label-occupied-padding = 1
label-urgent = %name%
label-urgent-background = ''${colors.alert}
label-urgent-padding = 1
label-empty = %name%
label-empty-foreground = ''${colors.disabled}
label-empty-padding = 1
[module/xwindow]
type = internal/xwindow
label = %title:0:60:...%
[module/filesystem]
type = internal/fs
interval = 25
mount-0 = /home
label-mounted = %free%
format-mounted = <label-mounted>
[module/pulseaudio]
type = internal/pulseaudio
format-volume = <label-volume> <ramp-volume>
label-volume = %percentage%%
label-muted = 󰖁
ramp-volume-0 = 󰕿
ramp-volume-1 = 󰖀
ramp-volume-2 = 󰕾
click-right = pavucontrol
[module/xkeyboard]
type = internal/xkeyboard
blacklist-0 = num lock
label-layout = %layout%
label-layout-foreground = ''${colors.primary}
label-indicator-padding = 2
label-indicator-margin = 1
label-indicator-foreground = ''${colors.background}
label-indicator-background = ''${colors.secondary}
[module/memory]
type = internal/memory
interval = 2
label = %gb_used:2%
format = <label>
format-margin = 5px
[module/temperature]
type = internal/temperature
internal = 1
warn-temperature = 80
format-warn-padding = 10px
format = <label> <ramp>
format-warn = <label-warn> <ramp>
format-warn-background = #eb4d4b
format-warn-foreground = #ffffff
ramp-0 =
ramp-1 =
ramp-2 =
[module/cpu]
type = internal/cpu
interval = 2
label = %percentage:2%%
format = <label>
[network-base]
type = internal/network
interval = 5
format-connected = <label-connected>
format-disconnected = <label-disconnected>
[module/wlan]
inherit = network-base
interface-type = wireless
label-connected = %signal%
label-disconnected = 󰖪
[module/eth]
inherit = network-base
interface-type = wired
label-connected = eth 󰈁
label-disconnected = 󰈂
[module/date]
type = internal/date
interval = 1
date = %a %b %d %H:%M
label = %date%
[settings]
screenchange-reload = true
pseudo-transparency = true
; vim:ft=dosini
'';
};
}

View file

@ -0,0 +1,50 @@
{ config, pkgs, lib, ... }:
let
common = (import ../common.nix) { pkgs = pkgs; lib = lib; };
inherit (config.lib.formats.rasi) mkLiteral;
in
{
programs.rofi = {
enable = true;
font = common.font + " " + common.font-size;
location = "center";
extraConfig = {
show-icons = mkLiteral "true";
};
theme = {
"prompt" = {
"text-color" = mkLiteral common.colorschemes.default.inactive;
};
"textbox-prompt-colon" = {
expand = false;
str = ":";
margin = mkLiteral "0px 0.3em 0em 0em";
"text-color" = mkLiteral common.colorschemes.default.inactive;
};
"inputbar" = {
"padding" = mkLiteral "10px 20px 10px 20px";
"border" = mkLiteral "0px 0px 1px dash 0px";
"border-color" = mkLiteral common.colorschemes.default.activeDark;
"children" = map mkLiteral [ "prompt" "textbox-prompt-colon" "entry" ];
};
"listview" = {
"padding" = mkLiteral "10px";
};
"element" = {
"padding" = mkLiteral "10px";
};
"element-text" = {
"margin" = mkLiteral "0px 0px 0px 20px";
};
} // lib.foldl'
(acc: elem: acc // {
${elem} = { "background-color" = mkLiteral common.colorschemes.default.activeDark; };
})
{ }
(lib.mapCartesianProduct ({ a, b, c }: lib.concatStringsSep "." [ a b c ]) {
a = [ "element" "element-text" "element-icon" ];
b = [ "selected" ];
c = [ "normal" "urgent" "active" ];
});
};
}

View file

@ -0,0 +1,57 @@
{ pkgs, lib, ... }:
let
common = (import ../common.nix) {
pkgs = pkgs;
lib = lib;
};
alabaster-theme-patch = builtins.toFile "alabaster.patch" ''
diff --git a/alabaster.toml b/alabaster.toml
index df312d3..f5e5499 100644
--- a/alabaster.toml
+++ b/alabaster.toml
@@ -2,11 +2,11 @@
# author tonsky
[colors.primary]
-background = '#F7F7F7'
+background = '#FFFFFF'
foreground = '#434343'
[colors.cursor]
-text = '#F7F7F7'
+text = '#FFFFFF'
cursor = '#434343'
[colors.normal]
'';
alacritty-theme-patched = pkgs.alacritty-theme.overrideAttrs (
final: previous: { patches = [ alabaster-theme-patch ]; }
);
in
{
programs.alacritty = {
enable = true;
settings = {
import = [
# Available themes:
# https://github.com/alacritty/alacritty-theme
"${alacritty-theme-patched}/alabaster.toml"
];
env.TERM = "xterm-256color";
font = {
size = 12;
normal = {
family = common.font;
};
};
scrolling.multiplier = 5;
selection.save_to_clipboard = true;
window = {
padding = {
x = 5;
y = 5;
};
};
};
};
}

View file

@ -0,0 +1,64 @@
{ config, pkgs, ... }:
let
icons = {
chromium = ./icons/chromium.png;
spotify = ./icons/spotify.png;
teams = ./icons/teams.png;
outlook = ./icons/outlook.png;
whatsapp = ./icons/whatsapp.png;
};
in
{
programs.chromium = {
enable = true;
package = (pkgs.chromium.override { enableWideVine = true; });
extensions = [
{ id = "cjpalhdlnbpafiamejdnhcphjbkeiagm"; } # ublock origin
{ id = "dbepggeogbaibhgnhhndojpepiihcmeb"; } # vimium
];
};
xdg.dataFile = {
"applications/chromium-development.desktop".text = ''
[Desktop Entry]
Type=Application
Name=Chromium (Development Modus)
Exec=${pkgs.chromium}/bin/chromium --allow-file-access-from-files --disable-site-isolation-trials --allow-running-insecure-content --no-referrers --unlimited-storage --user-data-dir=${config.xdg.dataHome}/chromium-development/data --disable-web-security
Terminal=false
Icon=${icons.chromium}
'';
"applications/spotify.desktop".text = ''
[Desktop Entry]
Type=Application
Name=Spotify
Exec=${pkgs.chromium}/bin/chromium --app=https://spotify.com
Terminal=false
Icon=${icons.spotify}
'';
"applications/teams.desktop".text = ''
[Desktop Entry]
Type=Application
Name=Microsoft Teams
Exec=${pkgs.chromium}/bin/chromium --app=https://teams.microsoft.com
Terminal=false
Icon=${icons.teams}
'';
"applications/outlook.desktop".text = ''
[Desktop Entry]
Type=Application
Name=Microsoft Outlook
Exec=${pkgs.chromium}/bin/chromium --app=https://outlook.office365.com/mail
Terminal=false
Icon=${icons.outlook}
'';
"applications/whatsapp.desktop".text = ''
[Desktop Entry]
Type=Application
Name=WhatsApp
Exec=${pkgs.chromium}/bin/chromium --app=https://web.whatsapp.com
Terminal=false
Icon=${icons.whatsapp}
'';
};
}

View file

@ -0,0 +1,21 @@
### `chromium.png`
- Source: [https://commons.wikimedia.org/wiki/File:Chromium_Logo.svg](https://commons.wikimedia.org/wiki/File:Chromium_Logo.svg)
- Licensing
> The Chromium project is published under Creative Commons attribution 2.5 and BSD. The logo is in the public domain, as it does not meet the threshold of originality.
### `outlook.png`
- Source: [https://developer.microsoft.com/en-us/fluentui#/styles/web/m365-product-icons](https://developer.microsoft.com/en-us/fluentui#/styles/web/m365-product-icons)
- Microsoft Fabric Assets License Agreement: [https://aka.ms/fluentui-assets-license](https://aka.ms/fluentui-assets-license)
### `spotify.png`
- Source: [https://commons.wikimedia.org/wiki/File:Spotify_icon.svg](https://commons.wikimedia.org/wiki/File:Spotify_icon.svg)
- Attribution: [https://developer.spotify.com/documentation/design#attribution](https://developer.spotify.com/documentation/design#attribution)
### `teams.png`
- Source: [https://developer.microsoft.com/en-us/fluentui#/styles/web/m365-product-icons](https://developer.microsoft.com/en-us/fluentui#/styles/web/m365-product-icons)
- Attribution: [https://developer.spotify.com/documentation/design#attribution](https://developer.spotify.com/documentation/design#attribution)
### `whatsapp.png`
- Source: [https://commons.wikimedia.org/wiki/File:WhatsApp_logo.svg](https://commons.wikimedia.org/wiki/File:WhatsApp_logo.svg)
- WhatsApp brand assets and guidelines: [https://about.meta.com/brand/resources/whatsapp/whatsapp-brand/](https://about.meta.com/brand/resources/whatsapp/whatsapp-brand/)

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View file

@ -0,0 +1,62 @@
{
pkgs,
lib,
nixosConfig,
...
}:
{
imports = [
./alacritty.nix
./chromium
./discord.nix
./games.nix
./keyring.nix
./kitty.nix
./obs.nix
./vscode.nix
./zathura.nix
];
home.packages =
with pkgs;
[
firefox # a web browser built from firefox source tree
thunderbird # a full-featured e-mail client
speechd # common interface to speech synthesis - https://support.mozilla.org/en-us/kb/speechd-setup
tor-browser # privacy-focused browser routing traffic through the tor network
qbittorrent # featureful free software bittorrent client
element-desktop # a feature-rich client for matrix.org
telegram-desktop # telegram desktop messaging app
signal-desktop # private, simple, and secure messenger
zoom-us # zoom.us video conferencing application
gnome.simple-scan # simple scanning utility
gnome.gnome-font-viewer # program that can preview fonts and create thumbnails for fonts
pppdf
feh # a light-weight image viewer
mpv
vlc # cross-platform media player and streaming server
zathura # a highly customizable and functional pdf viewer
neovide # a simple graphical user interface for neovim
gimp # the gnu image manipulation program
(calibre.override { unrarSupport = true; })
libreoffice # comprehensive, professional-quality productivity suite, a variant of openoffice.org
xournalpp # a handwriting notetaking software with pdf annotation support
libsForQt5.okular # kde document viewer
carla # audio plugin host
picard # musicbrainz picard audio file tagger
anki # spaced repetition flashcard program
]
++ lib.optionals nixosConfig.bchmnn.printing.enable [
system-config-printer # graphical user interface for cups administration
]
++ lib.optionals nixosConfig.services.ratbagd.enable [
piper # gtk frontend for ratbagd mouse config daemon
];
}

View file

@ -0,0 +1,6 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [
vesktop # alternate client for discord with vencord built-in
];
}

View file

@ -0,0 +1,15 @@
{
nixosConfig,
lib,
pkgs,
...
}:
lib.mkIf nixosConfig.bchmnn.collections.games.enable {
home.packages = with pkgs; [
openjdk17 # the open-source java development kit
prismlauncher # a free, open source launcher for minecraft
# retroarchFull # multi-platform emulator frontend for libretro cores
celestia # real-time 3d simulation of space
extremetuxracer # high speed arctic racing game based on tux racer
];
}

View file

@ -0,0 +1,13 @@
{ pkgs, ... }:
{
services.gnome-keyring = {
enable = true;
components = [
"pkcs11"
"secrets"
"ssh"
];
};
home.packages = with pkgs; [ gnome.seahorse ];
}

View file

@ -0,0 +1,65 @@
{ pkgs, lib, ... }:
let
common = (import ../common.nix) {
pkgs = pkgs;
lib = lib;
};
kitty-alabaster-theme-patch = builtins.toFile "kitty-theme-alabaster.patch" ''
diff --git a/themes/Alabaster.conf b/themes/Alabaster.conf
index 7989049..b0c180e 100644
--- a/themes/Alabaster.conf
+++ b/themes/Alabaster.conf
@@ -6,17 +6,17 @@
#: The basic colors
-foreground #000000
-background #f7f7f7
+foreground #434343
+background #ffffff
-selection_foreground #000000
+selection_foreground #434343
selection_background #bfdbfe
#: Cursor colors
-cursor #007acc
-cursor_text_color #bfdbfe
+cursor #434343
+cursor_text_color #ffffff
#: URL underline color when hovering with mouse
@@ -55,8 +55,8 @@ color6 #0083b2
color14 #00aacb
#: white
-color7 #f7f7f7
-color15 #f7f7f7
+color7 #bbbbbb
+color15 #ffffff
#: kitty window border colors and terminal bell colors
'';
kitty-theme-patched = pkgs.kitty-themes.overrideAttrs (
final: previous: { patches = [ kitty-alabaster-theme-patch ]; }
);
in
{
programs.kitty = {
enable = true;
font.name = common.font;
font.size = 12;
shellIntegration = {
enableBashIntegration = true;
enableZshIntegration = true;
};
extraConfig = ''
include ${kitty-theme-patched}/share/kitty-themes/themes/Alabaster.conf
text_composition_strategy legacy
'';
};
}

View file

@ -0,0 +1,7 @@
{ pkgs, ... }:
{
programs.obs-studio = {
enable = true;
plugins = [ pkgs.obs-studio-plugins.wlrobs ];
};
}

View file

@ -0,0 +1,174 @@
{ pkgs, lib, ... }:
let
common = (import ../common.nix) {
pkgs = pkgs;
lib = lib;
};
in
{
programs.vscode = {
enable = true;
enableExtensionUpdateCheck = true;
enableUpdateCheck = false;
extensions = with pkgs.vscode-extensions; [
vscodevim.vim
editorconfig.editorconfig
dbaeumer.vscode-eslint
waderyan.gitblame
bierner.markdown-mermaid
pkief.material-icon-theme
christian-kohler.path-intellisense
johnpapa.vscode-peacock
esbenp.prettier-vscode
bradlc.vscode-tailwindcss
jnoortheen.nix-ide
ms-vscode.cpptools
ms-vscode.cmake-tools
james-yu.latex-workshop
];
userSettings = {
"window.titleBarStyle" = "custom";
"window.menuBarVisibility" = "toggle";
"workbench.colorTheme" = "Default Light Modern";
"workbench.iconTheme" = "material-icon-theme";
"extensions.ignoreRecommendations" = true;
"explorer.confirmDragAndDrop" = false;
"explorer.confirmDelete" = false;
"editor.renderControlCharacters" = true;
"editor.renderWhitespace" = "all";
"editor.renderFinalNewline" = "on";
"editor.tabSize" = 4;
"editor.cursorStyle" = "line";
"editor.insertSpaces" = false;
"editor.lineNumbers" = "on";
"editor.wordSeparators" = "/\\()\"':,.;<>~!@#$%^&*|+=[]{}`?-";
"editor.wordWrap" = "on";
"editor.suggestSelection" = "first";
"editor.fontFamily" = common.font;
"editor.fontSize" = 16;
"editor.bracketPairColorization.enabled" = true;
"editor.guides.bracketPairs" = "active";
"editor.quickSuggestions" = {
strings = "on";
};
"editor.codeActionsOnSave" = {
".source.organizeImports" = "explicit";
};
"terminal.integrated.fontFamily" = common.font;
"files.exclude" = {
"**/.classpath" = true;
"**/.project" = true;
"**/.settings" = true;
"**/.factorypath" = true;
"**/__pycache__" = true;
};
"vim.normalModeKeyBindingsNonRecursive" = [
{
"before" = [ "<C-p>" ];
"commands" = [ "workbench.action.quickOpen" ];
}
{
"before" = [ "<C-b>" ];
"commands" = [
"workbench.view.explorer"
"workbench.action.toggleSidebarVisibility"
];
}
];
"[html]" = {
"editor.tabSize" = 2;
"editor.insertSpaces" = true;
"editor.defaultFormatter" = "esbenp.prettier-vscode";
};
"[javascript]" = {
"editor.tabSize" = 2;
"editor.insertSpaces" = true;
"editor.defaultFormatter" = "esbenp.prettier-vscode";
};
"[typescript]" = {
"editor.tabSize" = 2;
"editor.insertSpaces" = true;
"editor.defaultFormatter" = "esbenp.prettier-vscode";
};
"[typescriptreact]" = {
"editor.tabSize" = 2;
"editor.insertSpaces" = true;
"editor.defaultFormatter" = "esbenp.prettier-vscode";
};
"[python]" = {
"editor.tabSize" = 4;
"editor.insertSpaces" = true;
"editor.formatOnType" = true;
};
"[yaml]" = {
"editor.insertSpaces" = true;
"editor.tabSize" = 2;
"editor.autoIndent" = "advanced";
};
"[json]" = {
"editor.defaultFormatter" = "vscode.json-language-features";
};
"[jsonc]" = {
"editor.defaultFormatter" = "esbenp.prettier-vscode";
};
"[java]" = {
"editor.defaultFormatter" = "redhat.java";
};
"[markdown]" = {
"editor.defaultFormatter" = "esbenp.prettier-vscode";
};
"[css]" = {
"editor.defaultFormatter" = "esbenp.prettier-vscode";
};
"[nix]" = {
"editor.defaultFormatter" = "jnoortheen.nix-ide";
};
"git.autofetch" = true;
"json.schemaDownload.enable" = true;
"javascript.updateImportsOnFileMove.enabled" = "always";
"typescript.updateImportsOnFileMove.enabled" = "always";
"nix.enableLanguageServer" = true;
"nix.serverPath" = "${pkgs.nil}/bin/nil";
"nix.formatterPath" = "${pkgs.nixpkgs-fmt}/bin/nixpkgs-fmt";
};
keybindings = [
{
key = "ctrl+tab";
command = "workbench.action.nextEditor";
}
{
key = "ctrl+shift+tab";
command = "workbench.action.previousEditor";
}
{
key = "alt+left";
command = "workbench.action.navigateBack";
}
{
key = "alt+right";
command = "workbench.action.navigateForward";
}
{
key = "ctrl+escape";
command = "workbench.action.terminal.toggleTerminal";
when = "terminal.active";
}
{
key = "ctrl+f";
command = "editor.action.formatDocument";
when = "editorHasDocumentFormattingProvider && editorTextFocus && !editorReadonly && !inCompositeEditor";
}
];
};
}

View file

@ -0,0 +1,10 @@
{ ... }:
{
# a highly customizable and functional pdf viewer
programs.zathura = {
enable = true;
options = {
selection-clipboard = "clipboard";
};
};
}

View file

@ -0,0 +1,355 @@
{
pkgs,
lib,
config,
nixosConfig,
...
}:
let
cfg = config.wayland.windowManager.sway.config;
common = (import ../common.nix) {
pkgs = pkgs;
lib = lib;
};
in
{
imports = [
./kanshi.nix
./swaync
./wofi.nix
../waybar.nix
];
home.packages = with pkgs; [
brightnessctl # this program allows you read and control device brightness
pavucontrol # pulseaudio volume control
playerctl # command-line utility and library for controlling media players that implement mpris
networkmanagerapplet # networkmanager control applet for gnome
udiskie # removable disk automounter for udisks
dracula-theme # dracula variant of the ant theme
gnome3.adwaita-icon-theme
wl-clipboard # command-line copy/paste utilities for wayland
sway-contrib.grimshot # a helper for screenshots within sway
wdisplays # a graphical application for configuring displays in wayland compositors
wlr-randr # an xrandr clone for wlroots compositors
kanshi # dynamic display configuration tool
nextcloud-client # nextcloud themed desktop client
libsForQt5.kdeconnect-kde # kde connect provides several features to integrate your phone and your computer
system-config-printer # graphical user interface for cups administration
emote # modern emoji picker for linux
];
programs.swaylock = {
enable = true;
package = pkgs.swaylock-effects;
};
wayland.windowManager.sway = {
enable = true;
wrapperFeatures = {
base = true;
gtk = true;
};
xwayland = true;
extraSessionCommands =
with lib;
with nixosConfig.bchmnn;
''
export CLUTTER_BACKEND=wayland;
export GDK_BACKEND=wayland;
export GDK_DPI_SCALE=1;
export NIXOS_OZONE_WL=1;
export MOZ_ENABLE_WAYLAND=1;
export MOZ_USE_XINPUT2=1;
export XDG_SESSION_TYPE=wayland;
export XDG_CURRENT_DESKTOP=sway;
# sdl
export SDL_VIDEODRIVER=wayland
# qt
export QT_QPA_PLATFORM=wayland-egl
export QT_WAYLAND_DISABLE_WINDOWDECORATION=1
# java
export _JAVA_AWT_WM_NONREPARENTING=1
export _JAVA_OPTIONS="-Dawt.useSystemAAFontSettings=on";
''
+ optionalString nvidia.enable ''
# nvidia
export WLR_RENDERER=vulkan;
# export LIBVA_DRIVER_NAME,nvidia;
# export GBM_BACKEND=nvidia-drm;
export __GL_GSYNC_ALLOWED=0;
export __GL_VRR_ALLOWED=0;
export __GLX_VENDOR_LIBRARY_NAME=nvidia;
export WLR_NO_HARDWARE_CURSORS=1;
# xwayland compat
export XWAYLAND_NO_GLAMOR=1;
'';
config = {
modifier = "Mod4";
terminal = "${config.programs.kitty.package}/bin/kitty";
menu = "${pkgs.wofi}/bin/wofi";
# TODO for some reason bar only works when used with exec
bars = [ ];
startup = with pkgs; [
# TODO activate with systemd prbly requires a graphical.target?
# { command = "${nixosConfig.systemd.package}/bin/systemctl --user import-environment XDG_SESSION_TYPE XDG_CURRENT_DESKTOP"; }
# { command = "${dbus}/bin/dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=sway"; }
# { command = "${nixosConfig.systemd.package}/bin/systemctl --user stop xdg-desktop-portal xdg-desktop-portal-wlr"; }
# { command = "${nixosConfig.systemd.package}/bin/systemctl --user start xdg-desktop-portal xdg-desktop-portal-wlr"; }
# { command = "${dbus}/bin/dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY SWAYSOCK"; }
{
command = "${config.programs.waybar.package}/bin/waybar -c ${config.xdg.configHome}/waybar/swaybar.json -s ${config.xdg.configHome}/waybar/swaybar.css";
}
{ command = "${dbus}/bin/dbus-update-activation-environment --all"; }
{ command = "${kanshi}/bin/kanshi"; }
{ command = "${networkmanagerapplet}/bin/nm-applet"; }
{ command = "${blueman}/bin/blueman-applet"; }
{ command = "${udiskie}/bin/udiskie --tray"; }
{ command = "${swaynotificationcenter}/bin/swaync"; }
{ command = "${nextcloud-client}/bin/nextcloud"; }
{ command = "${plasma5Packages.kdeconnect-kde}/bin/kdeconnect-indicator"; }
{ command = "${system-config-printer}/bin/system-config-printer-applet"; }
{ command = "${emote}/bin/emote"; }
{ command = "${polkit_gnome}/libexec/polkit-gnome-authentication-agent-1"; }
];
input = {
"2:7:SynPS/2_Synaptics_TouchPad" = {
accel_profile = "flat";
dwt = "enabled";
dwtp = "enabled";
tap = "enabled";
natural_scroll = "enabled";
middle_emulation = "enabled";
scroll_factor = "0.3";
};
"2:10:TPPS/2_IBM_TrackPoint" = {
accel_profile = "flat";
scroll_factor = "0.5";
};
};
output = {
"*".bg = "${common.wallpaper.default} fill";
};
left = "h";
down = "j";
up = "k";
right = "l";
keybindings = {
"${cfg.modifier}+Ctrl+Shift+l" = "exec ${pkgs.swaylock-effects}/bin/swaylock --screenshots --clock --indicator --indicator-radius 100 --indicator-thickness 7 --effect-blur 7x5 --effect-vignette 0.5:0.5 --ring-color ffffff --key-hl-color ${common.colorschemes.default._black} --line-color 00000000 --inside-color 00000088 --inside-ver-color ${common.colorschemes.default._white} --separator-color 00000000 --text-color ${common.colorschemes.default._white} --fade-in 0.1";
# Basics
"${cfg.modifier}+Return" = "exec ${cfg.terminal}";
"${cfg.modifier}+q" = "kill";
"${cfg.modifier}+Space" = "exec ${cfg.menu}";
"${cfg.modifier}+Shift+c" = "reload";
"${cfg.modifier}+Shift+q" = "exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit'";
# Focus
"${cfg.modifier}+${cfg.left}" = "focus left";
"${cfg.modifier}+${cfg.down}" = "focus down";
"${cfg.modifier}+${cfg.up}" = "focus up";
"${cfg.modifier}+${cfg.right}" = "focus right";
"${cfg.modifier}+p" = "focus output left";
"${cfg.modifier}+n" = "focus output right";
# Moving
"${cfg.modifier}+Shift+${cfg.left}" = "move left";
"${cfg.modifier}+Shift+${cfg.down}" = "move down";
"${cfg.modifier}+Shift+${cfg.up}" = "move up";
"${cfg.modifier}+Shift+${cfg.right}" = "move right";
# Workspaces
"${cfg.modifier}+1" = "workspace number 1";
"${cfg.modifier}+2" = "workspace number 2";
"${cfg.modifier}+3" = "workspace number 3";
"${cfg.modifier}+4" = "workspace number 4";
"${cfg.modifier}+5" = "workspace number 5";
"${cfg.modifier}+6" = "workspace number 6";
"${cfg.modifier}+7" = "workspace number 7";
"${cfg.modifier}+8" = "workspace number 8";
"${cfg.modifier}+9" = "workspace number 9";
"${cfg.modifier}+0" = "workspace number 10";
"${cfg.modifier}+Shift+1" = "move container to workspace number 1";
"${cfg.modifier}+Shift+2" = "move container to workspace number 2";
"${cfg.modifier}+Shift+3" = "move container to workspace number 3";
"${cfg.modifier}+Shift+4" = "move container to workspace number 4";
"${cfg.modifier}+Shift+5" = "move container to workspace number 5";
"${cfg.modifier}+Shift+6" = "move container to workspace number 6";
"${cfg.modifier}+Shift+7" = "move container to workspace number 7";
"${cfg.modifier}+Shift+8" = "move container to workspace number 8";
"${cfg.modifier}+Shift+9" = "move container to workspace number 9";
"${cfg.modifier}+Shift+0" = "move container to workspace number 10";
"${cfg.modifier}+Control+${cfg.down}" = "workspace prev";
"${cfg.modifier}+Control+${cfg.up}" = "workspace next";
"${cfg.modifier}+Control+Shift+${cfg.down}" = "move workspace to output left";
"${cfg.modifier}+Control+Shift+${cfg.up}" = "move workspace to output right";
# Splits
"${cfg.modifier}+b" = "splith";
"${cfg.modifier}+v" = "splitv";
# Layouts
"${cfg.modifier}+s" = "layout stacking";
"${cfg.modifier}+w" = "layout tabbed";
"${cfg.modifier}+e" = "layout toggle split";
"${cfg.modifier}+f" = "fullscreen toggle";
"${cfg.modifier}+a" = "focus parent";
"${cfg.modifier}+d" = "floating toggle";
"${cfg.modifier}+Shift+d" = "focus mode_toggle";
# Scratchpad
"${cfg.modifier}+Shift+minus" = "move scratchpad";
"${cfg.modifier}+minus" = "scratchpad show";
# Resize mode
"${cfg.modifier}+r" = "mode resize";
# Multimedia Keys
"XF86AudioRaiseVolume" = "exec ${pkgs.wireplumber}/bin/wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+";
"XF86AudioLowerVolume" = "exec ${pkgs.wireplumber}/bin/wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%-";
"XF86AudioMute" = "exec ${pkgs.wireplumber}/bin/wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle";
"XF86AudioMicMute" = "exec ${pkgs.wireplumber}/bin/wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle";
"XF86MonBrightnessDown" = "exec ${pkgs.brightnessctl}/bin/brightnessctl -q set 5%-";
"XF86MonBrightnessUp" = "exec ${pkgs.brightnessctl}/bin/brightnessctl -q set 5%+";
"XF86AudioPrev" = "exec ${pkgs.playerctl}/bin/playerctl previous";
"XF86AudioNext" = "exec ${pkgs.playerctl}/bin/playerctl next";
"XF86AudioPlay" = "exec ${pkgs.playerctl}/bin/playerctl play-pause";
"XF86AudioPause" = "exec ${pkgs.playerctl}/bin/playerctl play-pause";
# Screenshot
"Print" = "exec ${pkgs.sway-contrib.grimshot}/bin/grimshot copy area";
# Programs
"${cfg.modifier}+Shift+v" = "exec ${pkgs.pavucontrol}/bin/pavucontrol";
"${cfg.modifier}+Shift+b" = "exec ${pkgs.blueman}/bin/blueman-manager";
"${cfg.modifier}+Shift+n" = "exec ${pkgs.networkmanagerapplet}/bin/nm-connection-editor";
"${cfg.modifier}+Shift+a" = "exec ${pkgs.swaynotificationcenter}/bin/swaync-client -t -sw";
"${cfg.modifier}+period" = "exec ${pkgs.emote}/bin/emote";
};
fonts = {
names = [ common.font ];
style = "Bold";
size = 12.0;
};
seat = {
"*" = {
xcursor_theme = "macOS-Monterey 32";
};
};
window = {
titlebar = false;
border = 4;
};
colors = {
focused = {
border = common.colorschemes.default.active;
background = common.colorschemes.default.active;
text = common.colorschemes.default.black;
indicator = common.colorschemes.default.activeDark;
childBorder = common.colorschemes.default.active;
};
focusedInactive = {
border = common.colorschemes.default.inactive;
background = common.colorschemes.default.inactive;
text = common.colorschemes.default.white;
indicator = common.colorschemes.default.inactive;
childBorder = common.colorschemes.default.inactive;
};
unfocused = {
border = common.colorschemes.default.inactiveDark;
background = common.colorschemes.default.inactiveDark;
text = common.colorschemes.default.white;
indicator = common.colorschemes.default.inactiveDark;
childBorder = common.colorschemes.default.inactiveDark;
};
urgent = {
border = common.colorschemes.default.alert;
background = common.colorschemes.default.alert;
text = common.colorschemes.default.white;
indicator = common.colorschemes.default.black;
childBorder = common.colorschemes.default.alert;
};
placeholder = {
border = common.colorschemes.default.active;
background = common.colorschemes.default.active;
text = common.colorschemes.default.black;
indicator = common.colorschemes.default.activeDark;
childBorder = common.colorschemes.default.active;
};
};
};
extraConfig = ''
for_window [title="Firefox Sharing Indicator"] {
floating enable
}
for_window [title="Bluetooth Devices"] {
floating enable
resize set 700px 450px
move position 100ppt 0
move left 700px
}
for_window [title="Volume Control"] {
floating enable
resize set 700px 450px
move position 100ppt 0
move left 700px
}
for_window [app_id="nm-connection-editor" title="Network Connections"] {
floating enable
resize set 700px 450px
move position 100ppt 0
move left 700px
}
for_window [app_id="thunderbird" title="Reminder"] {
floating enable
resize set 700px 450px
move position 100ppt 0
move left 700px
}
for_window [app_id="com.nextcloud.desktopclient.nextcloud" title="Nextcloud"] {
floating enable
resize set 700px 450px
move position 100ppt 0
move left 700px
}
for_window [title="Extension: \(Gopass Bridge\) - gopass bridge Mozilla Firefox"] {
floating enable
resize set 700px 450px
move position 100ppt 0
move left 700px
}
set $ddterm-id dropdown-terminal
set $ddterm ${cfg.terminal} --class $ddterm-id
set $ddterm-resize resize set 100ppt 40ppt, move position 0 0
# resize/move new dropdown terminal windows
for_window [app_id="$ddterm-id"] {
floating enable
$ddterm-resize
move to scratchpad
scratchpad show
}
# show existing or start new dropdown terminal
bindsym ${cfg.modifier}+grave exec swaymsg '[app_id="$ddterm-id"] scratchpad show' || $ddterm && sleep .1 && swaymsg '[app_id="$ddterm-id"] $ddterm-resize'
bindsym ${cfg.modifier}+Escape exec swaymsg '[app_id="$ddterm-id"] scratchpad show' || $ddterm && sleep .1 && swaymsg '[app_id="$ddterm-id"] $ddterm-resize'
# ^-- resize again, case moving to different output
workspace 1
'';
};
}

View file

@ -0,0 +1,72 @@
{ ... }:
{
services.kanshi = {
enable = true;
# TODO: profiles is deprecated
profiles = {
nomad = {
outputs = [
{
criteria = "LVDS-1";
status = "enable";
}
];
};
iroh = {
outputs = [
{
criteria = "DP-3";
status = "enable";
mode = "2560x1440";
position = "0,0";
}
{
criteria = "DP-2";
status = "enable";
mode = "2560x1440";
position = "2560,0";
}
{
criteria = "DP-1";
status = "enable";
mode = "2560x1440";
position = "5120,0";
}
];
};
station = {
outputs = [
{
criteria = "LVDS-1";
status = "disable";
}
{
criteria = "DP-3";
# criteria = "Dell Inc. DELL U2515H 9X2VY5490XUL";
status = "enable";
mode = "1920x1080";
position = "0,0";
}
{
criteria = "DP-2";
# criteria = "Dell Inc. DELL U2515H 9X2VY5C7138L";
status = "enable";
mode = "1920x1080";
position = "1920,0";
}
{
criteria = "VGA-1";
# criteria = "HJW VGA TO HDMI 0x00000100";
status = "enable";
mode = "1920x1080";
position = "3840,0";
}
];
};
};
};
}

View file

@ -0,0 +1,94 @@
{
"positionX": "right",
"positionY": "top",
"notification-icon-size": 64,
"notification-body-image-height": 100,
"notification-body-image-width": 200,
"timeout": 10,
"timeout-low": 5,
"timeout-critical": 0,
"fit-to-screen": true,
"keyboard-shortcuts": true,
"image-visibility": "when-available",
"transition-time": 200,
"hide-on-clear": false,
"hide-on-action": true,
"script-fail-notify": true,
"widgets": [
"mpris",
"volume",
"backlight",
"title",
"dnd",
"notifications"
],
"widget-config": {
"title": {
"text": "Notifications",
"clear-all-button": true,
"button-text": "Clear All"
},
"dnd": {
"text": "Do Not Disturb"
},
"label": {
"max-lines": 1,
"text": "Notification Center"
},
"mpris": {
"image-size": 96,
"image-radius": 12
},
"volume": {
"label": "󰕾 "
},
"backlight": {
"label": "󰃟 "
},
"buttons-grid": {
"actions": [
{
"label": "󰐥",
"command": "systemctl poweroff"
},
{
"label": "󰜉",
"command": "systemctl reboot"
},
{
"label": "󰌾",
"command": "swaylock"
},
{
"label": "󰍃",
"command": "swaymsg exit"
},
{
"label": "󰏥",
"command": "systemctl suspend"
},
{
"label": "󰕾",
"command": "pactl set-sink-mute @DEFAULT_SINK@ toggle"
},
{
"label": "󰍬",
"command": "pactl set-source-mute @DEFAULT_SOURCE@ toggle"
},
{
"label": "󰖩",
"command": "iwgtk"
},
{
"label": "󰂯",
"command": "blueman-manager"
},
{
"label": "",
"command": "kooha"
}
]
}
}
}

View file

@ -0,0 +1,5 @@
{
imports = [
./swaync.nix
];
}

View file

@ -0,0 +1,340 @@
@define-color cc-bg rgba(0, 0, 0, 1);
@define-color noti-border-color rgba(255, 255, 255, 0.15);
@define-color noti-bg rgb(17, 17, 27);
@define-color noti-bg-darker rgb(43, 43, 57);
@define-color noti-bg-hover rgb(27, 27, 43);
@define-color noti-bg-focus rgba(27, 27, 27, 0.6);
@define-color noti-close-bg rgba(255, 255, 255, 0.1);
@define-color noti-close-bg-hover rgba(255, 255, 255, 0.15);
@define-color text-color rgba(169, 177, 214, 1);
@define-color text-color-disabled rgb(150, 150, 150);
@define-color bg-selected rgb(0, 128, 255);
* {
font-family: DejaVuSansM Nerd Font;
font-weight: bolder;
}
.control-center .notification-row:focus,
.control-center .notification-row:hover {
opacity: 1;
background: @noti-bg-darker
}
.notification-row {
outline: none;
}
.notification {
border-radius: 12px;
margin: 10px;
padding: 0;
border: 2px solid #7aa2f7
}
.notification-content {
background: transparent;
padding: 10px;
border-radius: 12px
}
.close-button {
background: @noti-close-bg;
color: @text-color;
text-shadow: none;
padding: 0;
border-radius: 100%;
margin-top: 10px;
margin-right: 16px;
box-shadow: none;
border: none;
min-width: 24px;
min-height: 24px
}
.close-button:hover {
box-shadow: none;
background: @noti-close-bg-hover;
transition: all .15s ease-in-out;
border: none
}
.notification-default-action,
.notification-action {
padding: 4px;
margin: 0;
box-shadow: none;
background: @noti-bg;
border: none;
color: @text-color;
transition: all .15s ease-in-out
}
.notification-default-action:hover,
.notification-action:hover {
-gtk-icon-effect: none;
background: @noti-bg-hover
}
.notification-default-action {
border-radius: 12px
}
.notification-default-action:not(:only-child) {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0
}
.notification-action {
border-radius: 0;
border-top: none;
border-right: none
}
.notification-action:first-child {
border-bottom-left-radius: 10px;
background: #1b1b2b
}
.notification-action:last-child {
border-bottom-right-radius: 10px;
background: #1b1b2b
}
.inline-reply {
margin-top: 8px
}
.inline-reply-entry {
background: @noti-bg-darker;
color: @text-color;
caret-color: @text-color;
border: 1px solid @noti-border-color;
border-radius: 12px
}
.inline-reply-button {
margin-left: 4px;
background: @noti-bg;
border: 1px solid @noti-border-color;
border-radius: 12px;
color: @text-color
}
.inline-reply-button:disabled {
background: initial;
color: @text-color-disabled;
border: 1px solid transparent
}
.inline-reply-button:hover {
background: @noti-bg-hover
}
.body-image {
margin-top: 6px;
background-color: #fff;
border-radius: 12px
}
.summary {
font-size: 16px;
font-weight: 700;
background: transparent;
color: rgba(158, 206, 106, 1);
text-shadow: none
}
.time {
font-size: 16px;
font-weight: 700;
background: transparent;
color: @text-color;
text-shadow: none;
margin-right: 18px
}
.body {
font-size: 15px;
font-weight: 400;
background: transparent;
color: @text-color;
text-shadow: none
}
.control-center {
background: @cc-bg;
border: 1px solid #7aa2f7;
border-radius: 10px;
}
.control-center-list {
background: transparent
}
.control-center-list-placeholder {
opacity: .5
}
.floating-notifications {
background: transparent
}
.blank-window {
background: alpha(black, 0.25)
}
.widget-title {
color: @text-color;
margin: 10px;
font-size: 1.5rem
}
.widget-title>button {
font-size: initial;
color: @text-color;
text-shadow: none;
background: @noti-bg;
border: 1px solid @noti-border-color;
box-shadow: none;
border-radius: 12px
}
.widget-title>button:hover {
background: @noti-bg-hover
}
.widget-dnd {
color: @text-color;
margin: 10px;
font-size: 1.1rem
}
.widget-dnd>switch {
font-size: initial;
border-radius: 12px;
background: @noti-bg;
border: 1px solid @noti-border-color;
box-shadow: none
}
.widget-dnd>switch:checked {
background: @bg-selected
}
.widget-dnd>switch slider {
background: @noti-bg-hover;
border-radius: 12px
}
.widget-label {
margin: 10px;
}
.widget-label>label {
font-size: 1.5rem;
color: @text-color;
}
.widget-mpris {
color: @text-color;
background: @noti-bg-darker;
padding: 10px;
margin: 10px;
border-radius: 10px;
}
.widget-mpris-player {
padding: 8px;
margin: 8px
}
.widget-mpris-title {
font-weight: 700;
font-size: 1.25rem
}
.widget-mpris-subtitle {
font-size: 1.1rem
}
.widget-buttons-grid {
font-size: x-large;
padding: 8px;
margin: 20px 10px 10px;
border-radius: 12px;
background: @noti-bg-darker;
}
.widget-buttons-grid>flowbox>flowboxchild>button {
margin: 3px;
background: #343b58;
border-radius: 12px;
color: @text-color
}
.widget-buttons-grid>flowbox>flowboxchild>button:hover {
/* background: @noti-bg-hover; */
color: rgba(158, 206, 106, 1)
}
.widget-menubar>box>.menu-button-bar>button {
border: none;
background: transparent
}
.topbar-buttons>button {
border: none;
background: transparent
}
.widget-volume {
background: @noti-bg-darker;
padding: 8px;
margin: 10px;
border-radius: 12px;
font-size: x-large;
color: @text-color
}
.widget-volume>box>button {
background: transparent;
border: none
}
.per-app-volume {
background-color: @noti-bg;
padding: 4px 8px 8px;
margin: 0 8px 8px;
border-radius: 12px
}
.widget-backlight {
background: @noti-bg-darker;
padding: 8px;
margin: 10px;
border-radius: 12px;
font-size: x-large;
color: @text-color
}
.widget-inhibitors {
margin: 8px;
font-size: 1.5rem
}
.widget-inhibitors>button {
font-size: initial;
color: @text-color;
text-shadow: none;
background: @noti-bg;
border: 1px solid @noti-border-color;
box-shadow: none;
border-radius: 12px
}
.widget-inhibitors>button:hover {
background: @noti-bg-hover
}

View file

@ -0,0 +1,13 @@
{ pkgs, ... }: {
home.packages = with pkgs; [
swaynotificationcenter
libnotify
];
xdg.configFile = {
"swaync/config.json".source = ./config.json;
"swaync/style.css".source = ./style.css;
};
}

View file

@ -0,0 +1,69 @@
{ pkgs, lib, ... }:
let
common = (import ../common.nix) {
pkgs = pkgs;
lib = lib;
};
in
{
programs.wofi = {
enable = true;
settings = {
show = "drun";
allow_images = true;
image_size = 24;
no_actions = true;
};
style = ''
* {
font-family: '${common.font}', monospace;
font-size: ${common.font-size}px;
color: ${common.colorschemes.default.black};
}
window {
background-color: transparent;
}
#input {
background-color: ${common.colorschemes.default.active};
border: 5px;
border-color: ${common.colorschemes.default.activeDark};
border-radius: 0px;
padding-top: 10px;
padding-bottom: 10px;
padding-left: 20px;
padding-right: 20px;
margin-bottom: 10px;
}
#scroll {
background-color: ${common.colorschemes.default.active};
border: 5px;
border-color: ${common.colorschemes.default.activeDark};
border-radius: 0px;
padding: 10px;
}
#entry {
padding: 10px;
}
#entry #text {
margin-left: 20px;
}
#entry:selected {
background-color: ${common.colorschemes.default.activeDark};
}
#entry:selected #img {
background-color: ${common.colorschemes.default.activeDark};
}
#entry:selected #text {
background-color: ${common.colorschemes.default.activeDark};
}
'';
};
}

View file

@ -0,0 +1,396 @@
{ pkgs, nixosConfig, ... }:
let
check-battery = pkgs.writeShellScript "check-battery" ''
bat=/sys/class/power_supply/BAT0
CRIT=''${1:-15}
FILE=~/.config/waybar/.notified.target
stat=$(cat $bat/status)
perc=$(cat $bat/capacity)
if [[ $perc -le $CRIT ]] && [[ $stat == "Discharging" ]]; then
if [[ ! -f "$FILE" ]]; then
notify-send --urgency=critical --icon=dialog-warning "Battery Low" "Current charge: $perc%"
touch $FILE
fi
elif [[ -f "$FILE" ]]; then
rm $FILE
fi
'';
tailscale-status = pkgs.writeShellScript "tailscale-status" ''
if ${nixosConfig.services.tailscale.package}/bin/tailscale status > /dev/null 2>&1; then
echo " "
else
echo " "
fi
'';
tailscale-toggle = pkgs.writeShellScript "tailscale-toggle" ''
if ${nixosConfig.services.tailscale.package}/bin/tailscale status > /dev/null 2>&1; then
pkexec ${nixosConfig.services.tailscale.package}/bin/tailscale down
else
pkexec ${nixosConfig.services.tailscale.package}/bin/tailscale up --accept-routes --exit-node=j4m35-bl0nd
fi
'';
in
{
xdg.configFile = {
"waybar/swaybar.json".text = ''
[
{
"backlight": {
"device": "intel_backlight",
"format": "{percent}% {icon} ",
"format-icons": [
"󰌶",
"󱩎",
"󱩏",
"󱩐",
"󱩑",
"󱩒",
"󱩓",
"󱩔",
"󱩕",
"󱩖",
"󰛨"
]
},
"battery": {
"format": "{capacity}% {icon} ",
"format-alt": "{time} {icon} ",
"format-charging": "{capacity}% 󰂄 ",
"format-icons": [
"󰂃",
"󰁺",
"󰁻",
"󰁼",
"󰁽",
"󰁾",
"󰁿",
"󰂀",
"󰂁",
"󰂂",
"󰁹"
],
"format-plugged": "{capacity}% ",
"on-update": "${check-battery}",
"states": {
"critical": 15,
"warning": 30
}
},
"clock": {
"format": "{:%a %b %d %H:%M}",
"timezones": [
"Europe/Berlin"
],
"tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>"
},
"custom/mem": {
"exec": "free -h | awk '/Mem:/{printf $3}'",
"format": "{} 󰍛 ",
"interval": 3,
"tooltip": false
},
"custom/separator": {
"format": "|",
"interval": "once",
"tooltip": false
},
"disk": {
"format": "{specific_free:0.0f}GB ",
"unit": "GB"
},
"sway/mode": {
"format": "<span style=\"italic\">{}</span>"
},
"sway/window": {
"format": "{title}",
},
"sway/workspaces": {
"disable-scroll": true,
"persistent-workspaces": {
"1": [],
"2": [],
"3": [],
"4": [],
"5": [],
"6": [],
"7": [],
"8": [],
"9": [],
"10": [],
}
},
"layer": "top",
"modules-center": [
],
"modules-left": [
"sway/workspaces",
"sway/window",
"sway/mode"
],
"modules-right": [
"tray",
"network",
"custom/tailscale",
"custom/separator",
"pulseaudio",
"custom/separator",
"disk",
"custom/separator",
"custom/mem",
"custom/separator",
"temperature",
"custom/separator",
"backlight",
"custom/separator",
"battery",
"custom/separator",
"clock"
],
"name": "swaybar",
"network": {
"format": "{ifname}",
"format-disconnected": "󰈂 ",
"format-ethernet": "eth 󰈁 ",
"format-wifi": "{signalStrength}% ",
"interval": 1,
"tooltip-format": "{ifname} via {gwaddr} 󰈁 ",
"tooltip-format-disconnected": "Disconnected",
"tooltip-format-ethernet": "{ifname} ",
"tooltip-format-wifi": "{essid} ({signalStrength}%) "
},
"custom/tailscale": {
"exec": "${tailscale-status}",
"interval": 1,
"on-click": "${tailscale-toggle}",
},
"pulseaudio": {
"format": "{volume}% {icon} {format_source}",
"format-bluetooth": "{volume}% {icon} {format_source}",
"format-bluetooth-muted": "󰖁 {icon} {format_source}",
"format-icons": {
"car": "",
"default": [
"󰕿",
"󰖀",
"󰕾"
],
"hands-free": "󰋎",
"headphone": "",
"headset": "󰋎",
"phone": "",
"portable": ""
},
"format-muted": "󰖁 {format_source}",
"format-source": "{volume}% ",
"format-source-muted": " ",
"on-click": "${pkgs.pavucontrol}/bin/pavucontrol",
"reverse-scrolling": 1
},
"temperature": {
"critical-threshold": 80,
"format": "{temperatureC}°C {icon} ",
"format-icons": [
"",
"",
"",
"",
""
],
"tooltip": false
},
"tray": {
"icon-size": 16,
"show-passive-items": true,
"spacing": 4
}
}
]
'';
"waybar/swaybar.css".text = ''
window.swaybar,
window.swaybar * {
border: none;
font-family: DejaVuSansM Nerd Font;
font-size: 13px;
}
window.swaybar #custom-separator {
padding-right: 6px;
color: #d3d3d3;
}
window.swaybar#waybar {
background: linear-gradient(to bottom, #ffffff, #f9f9f9);
}
window.swaybar#waybar.hidden {
opacity: 0.2;
}
window.swaybar #workspaces {
padding-left: 8px;
padding-right: 8px;
margin-right: 8px;
transition: none;
}
window.swaybar #workspaces button {
transition: none;
color: black;
background: transparent;
padding: 2px;
/* font-size: 18px; */
border-radius: 0px;
}
window.swaybar #workspaces button.empty {
color: #7c818c;
}
window.swaybar #workspaces button.persistent {
/* font-size: 12px; */
}
window.swaybar #workspaces button.visible {
color: black;
/* font-size: 18px; */
}
window.swaybar #workspaces button.focused {
background: lightgray;
}
window.swaybar #workspaces button:hover {
color: white;
background: black;
}
window.swaybar #window {
padding-left: 8px;
padding-right: 8px;
transition: none;
color: black;
background: transparent;
}
window.swaybar #mode {
padding-left: 16px;
padding-right: 16px;
transition: none;
color: black;
background: transparent;
}
window.swaybar #tray {
margin-right: 10px;
padding-left: 10px;
padding-right: 10px;
border-radius: 10px;
transition: none;
color: white;
background: rgb(66, 118, 185);
}
window.swaybar #network {
padding-left: 6px;
transition: none;
color: black;
background: transparent;
}
window.swaybar #custom-tailscale {
padding-right: 6px;
transition: none;
color: black;
background: transparent;
}
window.swaybar #pulseaudio {
transition: none;
color: black;
background: transparent;
}
window.swaybar #pulseaudio.muted {
color: gray;
}
window.swaybar #disk {
transition: none;
color: black;
background: transparent;
}
window.swaybar #custom-mem {
transition: none;
color: black;
background: transparent;
}
window.swaybar #temperature {
transition: none;
color: black;
background: transparent;
}
window.swaybar #temperature.critical {
color: #eb4d4b;
}
window.swaybar #backlight {
transition: none;
color: black;
background: transparent;
}
window.swaybar #battery {
transition: none;
color: black;
background: transparent;
}
window.swaybar #battery.charging {
color: #ffffff;
background-color: #26A65B;
}
window.swaybar #battery.warning:not(.charging) {
background-color: #ffbe61;
color: black;
}
window.swaybar #battery.critical:not(.charging) {
background-color: #f53c3c;
color: #ffffff;
animation-name: blink;
animation-duration: 0.5s;
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-direction: alternate;
}
window.swaybar #clock {
padding-right: 6px;
margin-right: 8px;
transition: none;
color: black;
background: transparent;
}
@keyframes blink {
to {
background-color: #ffffff;
color: #000000;
}
}
'';
};
programs.waybar = {
enable = true;
};
}