{ pkgs, config, lib, ... }: let nixGLIntelPrefix = "${pkgs.nixgl.nixVulkanIntel}/bin/nixVulkanIntel ${pkgs.nixgl.nixGLIntel}/bin/nixGLIntel "; wmPrefix = "${lib.optionalString config.frogeye.desktop.nixGLIntel nixGLIntelPrefix}"; in { imports = [ ./frobar ./i3.nix ./qutebrowser.nix ]; config = lib.mkIf config.frogeye.desktop.xorg { frogeye.shellAliases = { noise = ''${pkgs.sox}/bin/play -c 2 -n synth $'' + ''{1}noise''; beep = ''${pkgs.sox}/bin/play -n synth sine E5 sine A4 remix 1-2 fade 0.5 1.2 0.5 2> /dev/null''; x = "startx ${config.home.homeDirectory}/${config.xsession.scriptPath}; logout"; }; xsession = { enable = true; # Not using config.xdg.configHome because it needs to be $HOME-relative paths and path manipulation is hard scriptPath = ".config/xsession"; profilePath = ".config/xprofile"; windowManager = { command = lib.mkForce "${wmPrefix} ${config.xsession.windowManager.i3.package}/bin/i3"; i3.enable = true; }; numlock.enable = config.frogeye.desktop.numlock; }; programs = { # Terminal alacritty = { # TODO Emojis. Or maybe they work on NixOS? # Arch (working) shows this with alacritty -vvv: # [TRACE] [crossfont] Got font path="/usr/share/fonts/twemoji/twemoji.ttf", index=0 # [DEBUG] [crossfont] Loaded Face Face { ft_face: Font Face: Regular, load_flags: MONOCHROME | TARGET_MONO | COLOR, render_mode: "Mono", lcd_filter: 1 } # Nix (not working) shows this: # [TRACE] [crossfont] Got font path="/nix/store/872g3w9vcr5nh93r0m83a3yzmpvd2qrj-home-manager-path/share/fonts/truetype/TwitterColorEmoji-SVGinOT.ttf", index=0 # [DEBUG] [crossfont] Loaded Face Face { ft_face: Font Face: Regular, load_flags: TARGET_LIGHT | COLOR, render_mode: "Lcd", lcd_filter: 1 } enable = true; settings = { bell = { animation = "EaseOutExpo"; color = "#000000"; command = { program = "${pkgs.sox}/bin/play"; args = [ "-n" "synth" "sine" "C5" "sine" "E4" "remix" "1-2" "fade" "0.1" "0.2" "0.1" ]; }; duration = 100; }; cursor = { vi_mode_style = "Underline"; }; env = { WINIT_X11_SCALE_FACTOR = "1"; # Prevents Alacritty from resizing from one monitor to another. # Might cause issue on HiDPI screens but we'll get there when we get there }; hints = { enabled = [ { binding = { mods = "Control|Alt"; key = "F"; }; command = "${pkgs.xdg-utils}/bin/xdg-open"; mouse = { enabled = true; mods = "Control"; }; post_processing = true; regex = "(mailto:|gemini:|gopher:|https:|http:|news:|file:|git:|ssh:|ftp:)[^\\u0000-\\u001F\\u007F-\\u009F<>\"\\\\s{-}\\\\^⟨⟩`]+"; } ]; }; key_bindings = [ { mode = "~Search"; mods = "Alt|Control"; key = "Space"; action = "ToggleViMode"; } { mode = "Vi|~Search"; mods = "Control"; key = "K"; action = "ScrollHalfPageUp"; } { mode = "Vi|~Search"; mods = "Control"; key = "J"; action = "ScrollHalfPageDown"; } { mode = "~Vi"; mods = "Control|Alt"; key = "V"; action = "Paste"; } { mods = "Control|Alt"; key = "C"; action = "Copy"; } { mode = "~Search"; mods = "Control|Alt"; key = "F"; action = "SearchForward"; } { mode = "~Search"; mods = "Control|Alt"; key = "B"; action = "SearchBackward"; } { mode = "Vi|~Search"; mods = "Control|Alt"; key = "C"; action = "ClearSelection"; } ]; window = { dynamic_padding = false; dynamic_title = true; }; }; }; # Backup terminal urxvt = { enable = true; package = pkgs.rxvt-unicode-emoji; scroll = { bar.enable = false; }; iso14755 = false; # Disable Ctrl+Shift default bindings keybindings = { "Shift-Control-C" = "eval:selection_to_clipboard"; "Shift-Control-V" = "eval:paste_clipboard"; # TODO Not sure resizing works, Nix doesn't have the package (urxvt-resize-font-git on Arch) "Control-KP_Subtract" = "resize-font:smaller"; "Control-KP_Add" = "resize-font:bigger"; }; extraConfig = { "letterSpace" = 0; "perl-ext-common" = "resize-font,bell-command,readline,selection"; "bell-command" = "${pkgs.sox}/bin/play -n synth sine C5 sine E4 remix 1-2 fade 0.1 0.2 0.1 &> /dev/null"; }; }; rofi = { # TODO This theme template, that was used for Arch, looks much better: # https://gitlab.com/jordiorlando/base16-rofi/-/blob/master/templates/default.mustache enable = true; pass.enable = true; extraConfig = { lazy-grab = false; matching = "regex"; }; }; autorandr = { enable = true; hooks.postswitch = { background = "${pkgs.feh}/bin/feh --no-fehbg --bg-fill ${config.stylix.image}"; }; }; mpv = { enable = true; config = { audio-display = false; save-position-on-quit = true; osc = false; # Required by thumbnail script # Hardware acceleration (from https://nixos.wiki/wiki/Accelerated_Video_Playback#MPV) hwdec = "auto-safe"; vo = "gpu"; profile = "gpu-hq"; }; scripts = with pkgs.mpvScripts; [ thumbnail ]; scriptOpts = { mpv_thumbnail_script = { autogenerate = false; # TODO It creates too many processes at once, crashing the system cache_directory = "/tmp/mpv_thumbs_${config.home.username}"; mpv_hwdec = "auto-safe"; }; }; }; qutebrowser.enable = true; }; xdg = { userDirs = { enable = true; # TODO Which ones do we want? createDirectories = true; # French, because then it there's a different initial for each, making navigation easier desktop = null; download = "${config.home.homeDirectory}/Téléchargements"; music = "${config.home.homeDirectory}/Musiques"; pictures = "${config.home.homeDirectory}/Images"; publicShare = null; templates = null; videos = "${config.home.homeDirectory}/Vidéos"; extraConfig = { XDG_SCREENSHOTS_DIR = "${config.home.homeDirectory}/Screenshots"; }; }; configFile = { "pulse/client.conf" = { text = ''cookie-file = .config/pulse/pulse-cookie''; }; "rofimoji.rc" = { text = '' skin-tone = neutral files = [emojis, math] action = clipboard ''; }; "vimpc/vimpcrc" = { text = '' map FF :browsegg/ map à :set add nexta:set add end map @ :set add nexta:set add end:next map ° D:browseA:shuffle:play:playlist set songformat {%a - %b: %t}|{%f}$E$R $H[$H%l$H]$H set libraryformat %n \| {%t}|{%f}$E$R $H[$H%l$H]$H set ignorecase set sort library ''; }; }; }; services = { blueman-applet.enable = true; unclutter.enable = true; dunst = { enable = true; settings = # TODO Change dmenu for rofi, so we can use context with config.lib.stylix.colors.withHashtag; { global = { separator_color = lib.mkForce base05; idle_threshold = 120; markup = "full"; max_icon_size = 48; # TODO Those shortcuts don't seem to work, maybe try: # > define shortcuts inside your window manager and bind them to dunstctl(1) commands close_all = "ctrl+mod4+n"; close = "mod4+n"; context = "mod1+mod4+n"; history = "shift+mod4+n"; }; urgency_low = { background = lib.mkForce base01; foreground = lib.mkForce base03; frame_color = lib.mkForce base05; }; urgency_normal = { background = lib.mkForce base02; foreground = lib.mkForce base05; frame_color = lib.mkForce base05; }; urgency_critical = { background = lib.mkForce base08; foreground = lib.mkForce base06; frame_color = lib.mkForce base05; }; }; }; mpd = { enable = true; network = { listenAddress = "0.0.0.0"; # So it can be controlled from home # TODO ... and whoever is the Wi-Fi network I'm using, which, not great startWhenNeeded = true; }; extraConfig = '' restore_paused "yes" ''; }; autorandr.enable = true; }; home = { file = { ".face" = { # TODO Only works on pindakaas? See https://wiki.archlinux.org/title/LightDM#Changing_your_avatar source = pkgs.runCommand "face.png" { } "${pkgs.inkscape}/bin/inkscape ${./face.svg} -w 1024 -o $out"; }; }; packages = with pkgs; [ pavucontrol # Because can't use Win+F1X on Pinebook 🙃 # remote tigervnc # music mpc-cli ashuffle vimpc # multimedia common gimp inkscape libreoffice # data management freefilesync # browsers firefox # fonts dejavu_fonts twemoji-color-font gnome.gedit feh zbar zathura meld python3Packages.magic # x11-exclusive numlockx simplescreenrecorder trayer xclip keynav xorg.xinit # TODO Make this clean. Service? # organisation pass thunderbird ]; sessionVariables = { MPD_PORT = "${toString config.services.mpd.network.port}"; ALSA_PLUGIN_DIR = "${pkgs.alsa-plugins}/lib/alsa-lib"; # Fixes an issue with sox (Cannot open shared library libasound_module_pcm_pulse.so) # UPST Patch this upstream like: https://github.com/NixOS/nixpkgs/blob/216b111fb87091632d077898df647d1438fc2edb/pkgs/applications/audio/espeak-ng/default.nix#L84 }; }; }; }