commit 746ea0f43463345fb12d3b0dd4f73c5e359b7096 Author: larstvei Date: Sun Sep 18 17:49:37 2022 +0200 Initial commit Trying out nix on a new machine. I would think the install instructions are under-specified. We'll see if this will turn out usable. diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..82881ea --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "emacs"] + path = emacs + url = git@github.com:larstvei/dot-emacs.git diff --git a/README.org b/README.org new file mode 100644 index 0000000..a17a260 --- /dev/null +++ b/README.org @@ -0,0 +1,38 @@ +* My macOS config + + This repo contains a declarative specification of the setup of my mac, using + [[https://nixos.org/][Nix]], with [[https://github.com/LnL7/nix-darwin][nix-darwin]] and [[https://nixos.wiki/wiki/Flakes][Nix Flakes]]. The initial setup is mimicked after + [[https://github.com/shaunsingh/nix-darwin-dotfiles][shaunsingh's setup]]. [[https://brew.sh/][Homebrew]] is installed for its cask support (i.e. mac apps + lacking a Nix derivation). + +* Steps to install + + 1. [[https://nixos.org/download.html#nix-install-macos][Install Nix for macOS]] + #+begin_src sh + sh <(curl -L https://nixos.org/nix/install) + #+end_src + 2. [[https://brew.sh/][Install Homebrew]] + #+begin_src sh + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + #+end_src + 3. Clone this repo (assuming there is no =~/.config= on the system already) + #+begin_src sh + git clone --recurse-submodules https://github.com/larstvei/dotfiles.git ~/.config + #+end_src + Note that the =--recurse-submodules= pulls down my [[https://github.com/larstvei/dot-emacs/][Emacs configuration]], + which is not necessary for the setup to work. + 4. Build the setup from =flake.nix= + #+begin_src sh + cd ~/.config/ + nix build .#darwinConfigurations.larstvei-macbookpro.system --extra-experimental-features nix-command --extra-experimental-features flakes + ./result/sw/bin/darwin-rebuild switch --flake .#larstvei-macbookpro + #+end_src + +* Maintaining + + After making changes, I run the following command (from the =~/.config= + directory): + + #+begin_src sh + darwin-rebuild switch --flake .#larstvei-macbookpro + #+end_src diff --git a/emacs b/emacs new file mode 160000 index 0000000..4bc7e9a --- /dev/null +++ b/emacs @@ -0,0 +1 @@ +Subproject commit 4bc7e9ac94e62062aaed57275099bfdfb699e66f diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..60ba01a --- /dev/null +++ b/flake.lock @@ -0,0 +1,119 @@ +{ + "nodes": { + "darwin": { + "inputs": { + "nixpkgs": [ + "nixpkgs-unstable" + ] + }, + "locked": { + "lastModified": 1662478528, + "narHash": "sha256-Myjd0HPL5lXri3NXOcJ6gP7IKod2eMweQBKM4uxgEGw=", + "owner": "LnL7", + "repo": "nix-darwin", + "rev": "3b69bf3cc26ae19de847bfe54d6ab22d7381a90a", + "type": "github" + }, + "original": { + "owner": "LnL7", + "repo": "nix-darwin", + "type": "github" + } + }, + "emacs-src": { + "flake": false, + "locked": { + "lastModified": 1663433932, + "narHash": "sha256-JgoayvAG/dPrRVNlj3QGsmqHtKkaa+4UoLjlZP2Ndm0=", + "owner": "emacs-mirror", + "repo": "emacs", + "rev": "7fe22182d3abcb3124c50f717cc74925800b7720", + "type": "github" + }, + "original": { + "owner": "emacs-mirror", + "repo": "emacs", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs-unstable" + ], + "utils": "utils" + }, + "locked": { + "lastModified": 1663328500, + "narHash": "sha256-7n+J/exp8ky4dmk02y5a9R7CGmJvHpzrHMzfEkMtSWA=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "5427f3d1f0ea4357cd4af0bffee7248d640c6ffc", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1663314999, + "narHash": "sha256-G/vrVz+sw8xXICQdhsJcb26uxp5EarEfkSokvnPQX7A=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "0dfa3b283abc1cc2297653210f33585b390a6a50", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-22.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-unstable": { + "locked": { + "lastModified": 1663372752, + "narHash": "sha256-HxP/vZFDD/5Q9VEyX3VmsnCnm7vsH4IX6j/xE/+IVkc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d9a1414346059619d9e13ab93e749bbb82e5252a", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "darwin": "darwin", + "emacs-src": "emacs-src", + "home-manager": "home-manager", + "nixpkgs": "nixpkgs", + "nixpkgs-unstable": "nixpkgs-unstable" + } + }, + "utils": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..1552b67 --- /dev/null +++ b/flake.nix @@ -0,0 +1,82 @@ +{ + description = "Lars' MacBook Pro"; + + inputs = { + + nixpkgs = { + url = "github:nixos/nixpkgs/nixpkgs-22.05-darwin"; + }; + + nixpkgs-unstable.url = github:NixOS/nixpkgs/nixpkgs-unstable; + + # Nix-Darwin + darwin = { + url = "github:LnL7/nix-darwin"; + inputs.nixpkgs.follows = "nixpkgs-unstable"; + }; + + # HM-manager for dotfile/user management + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs-unstable"; + }; + + emacs-src = { + url = "github:emacs-mirror/emacs"; + flake = false; + }; + }; + + outputs = { self, nixpkgs, darwin, home-manager, ... }@inputs: { + darwinConfigurations."larstvei-macbookpro" = darwin.lib.darwinSystem { + system = "aarch64-darwin"; + + modules = [ + ./modules/mac.nix + home-manager.darwinModule + { + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + users.larstvei = { + imports = [ + ./modules/home.nix + ]; + }; + }; + } + ({ config, pkgs, lib, ... }: { + services.nix-daemon.enable = true; + + nixpkgs = { + config.allpwUnfree = true; + overlays = + let + versionOf = input: input.rev; + in + with inputs; [ + (final: prev: { + emacs-mac = (prev.emacs.override { + srcRepo = true; + nativeComp = true; + withSQLite3 = true; + withNS = true; + }).overrideAttrs (o: rec { + version = "29.0.50"; + src = inputs.emacs-src; + + patches = [ + ./patches/fix-window-role.patch + ./patches/my-no-titlebar.patch + ./patches/system-appearance.patch + ]; + + }); + }) + ]; + }; + }) + ]; + }; + }; +} diff --git a/modules/home.nix b/modules/home.nix new file mode 100644 index 0000000..848269e --- /dev/null +++ b/modules/home.nix @@ -0,0 +1,69 @@ +{ pkgs, lib, config, home-manager, nix-darwin, inputs, ... }: { + + # Can probably be removed when this is resolved: + # https://github.com/nix-community/home-manager/issues/1341 + home.activation = { + copyApplications = let + apps = pkgs.buildEnv { + name = "home-manager-applications"; + paths = config.home.packages; + pathsToLink = "/Applications"; + }; + in lib.hm.dag.entryAfter [ "writeBoundary" ] '' + baseDir="$HOME/Applications/Home Manager Apps" + if [ -d "$baseDir" ]; then + rm -rf "$baseDir" + fi + mkdir -p "$baseDir" + for appFile in ${apps}/Applications/*; do + target="$baseDir/$(basename "$appFile")" + $DRY_RUN_CMD cp ''${VERBOSE_ARG:+-v} -fHRL "$appFile" "$baseDir" + $DRY_RUN_CMD chmod ''${VERBOSE_ARG:+-v} -R +w "$target" + done + ''; + }; + + home.packages = with pkgs; [ + ((emacsPackagesFor emacs-mac).emacsWithPackages + (epkgs: [ + epkgs.vterm + epkgs.pdf-tools + ])) + sqlite + htop + (aspellWithDicts (ds: with ds; [ en en-computers en-science ])) + fd + fzf + ripgrep + nixpkgs-fmt + tree + wget + ]; + + home.file.".aspell.conf".text = "data-dir ${pkgs.aspell}/lib/aspell"; + + programs.fzf = { + enable = true; + enableFishIntegration = true; + }; + + programs.git = { + enable = true; + userName = "larstvei"; + userEmail = "larstvei@ifi.uio.no"; + ignores = [ ".dir-locals.el" ".envrc" ".DS_Store" ]; + }; + + # This value determines the Home Manager release that your + # configuration is compatible with. This helps avoid breakage + # when a new Home Manager release introduces backwards + # incompatible changes. + # + # You can update Home Manager without changing this value. See + # the Home Manager release notes for a list of state version + # changes in each release. + home.stateVersion = "22.05"; + + # Let Home Manager install and manage itself. + programs.home-manager.enable = true; +} diff --git a/modules/mac.nix b/modules/mac.nix new file mode 100644 index 0000000..3785fa4 --- /dev/null +++ b/modules/mac.nix @@ -0,0 +1,70 @@ +{ config, pkgs, lib, ... }: { + + nix = { + package = pkgs.nix; + extraOptions = '' + system = aarch64-darwin # M1 gang + extra-platforms = aarch64-darwin x86_64-darwin # But we use rosetta too + experimental-features = nix-command flakes + build-users-group = nixbld + ''; + }; + + fonts = { + fontDir.enable = true; + fonts = with pkgs; [ + fira + fira-code + roboto + roboto-mono + ]; + }; + + programs.fish.enable = true; + system.activationScripts.postActivation.text = '' + # Set the default shell as fish for the user. MacOS doesn't do this like nixOS does + sudo chsh -s ${lib.getBin pkgs.fish}/bin/fish larstvei + ''; + + networking.hostName = "macbookpro"; + system.stateVersion = 4; + + system.keyboard = { + enableKeyMapping = true; + remapCapsLockToControl = true; + }; + system.defaults = { + screencapture = { location = "/tmp"; }; + dock = { + autohide = true; + showhidden = true; + mru-spaces = false; + }; + finder = { + AppleShowAllExtensions = true; + QuitMenuItem = true; + FXEnableExtensionChangeWarning = true; + }; + + NSGlobalDomain = { + AppleKeyboardUIMode = 3; + ApplePressAndHoldEnabled = false; + AppleFontSmoothing = 1; + _HIHideMenuBar = true; + InitialKeyRepeat = 15; + KeyRepeat = 1; + "com.apple.mouse.tapBehavior" = 1; + "com.apple.swipescrolldirection" = true; + }; + }; + + homebrew = { + enable = true; + onActivation.upgrade = true; + casks = [ + "amethyst" + "raycast" + "iina" + ]; + }; +} diff --git a/patches/fix-window-role.patch b/patches/fix-window-role.patch new file mode 100644 index 0000000..13816fe --- /dev/null +++ b/patches/fix-window-role.patch @@ -0,0 +1,15 @@ +diff --git a/src/nsterm.m b/src/nsterm.m +index 6f9b208953..aa6c1d286f 100644 +--- a/src/nsterm.m ++++ b/src/nsterm.m +@@ -8768,7 +8768,7 @@ - (id)accessibilityAttributeValue:(NSString *)attribute + NSTRACE ("[EmacsWindow accessibilityAttributeValue:]"); + + if ([attribute isEqualToString:NSAccessibilityRoleAttribute]) +- return NSAccessibilityTextFieldRole; ++ return NSAccessibilityWindowRole; + + if ([attribute isEqualToString:NSAccessibilitySelectedTextAttribute] + && curbuf && ! NILP (BVAR (curbuf, mark_active))) +-- +2.26.2 diff --git a/patches/my-no-titlebar.patch b/patches/my-no-titlebar.patch new file mode 100644 index 0000000..a02305a --- /dev/null +++ b/patches/my-no-titlebar.patch @@ -0,0 +1,22 @@ +diff --git a/src/nsterm.m b/src/nsterm.m +index 44979c7c04e..eee75641f61 100644 +--- a/src/nsterm.m ++++ b/src/nsterm.m +@@ -9021,7 +9021,7 @@ - (instancetype) initWithEmacsFrame: (struct frame *) f + else if (f->tooltip) + styleMask = 0; + else +- styleMask = (NSWindowStyleMaskTitled ++ styleMask = (NSWindowStyleMaskBorderless + | NSWindowStyleMaskResizable + | NSWindowStyleMaskMiniaturizable + | NSWindowStyleMaskClosable); +@@ -9098,7 +9098,7 @@ - (instancetype) initWithEmacsFrame: (struct frame *) f + [self setOpaque:NO]; + + /* toolbar support */ +- [self createToolbar:f]; ++ // [self createToolbar:f]; + + /* macOS Sierra automatically enables tabbed windows. We can't + allow this to be enabled until it's available on a Free system. diff --git a/patches/nyxt-darwin-build.patch b/patches/nyxt-darwin-build.patch new file mode 100644 index 0000000..4af1cbb --- /dev/null +++ b/patches/nyxt-darwin-build.patch @@ -0,0 +1,287 @@ +From 922bd3b630b6e232c1ccab17e70bd14ce84f172d Mon Sep 17 00:00:00 2001 +From: midchildan +Date: Wed, 2 Jun 2021 02:30:44 +0900 +Subject: [PATCH 1/2] nyxt: fix darwin build + +Co-authored-by: Michael Lingelbach +--- + .../networking/browsers/nyxt/default.nix | 104 +++++++++++++----- + .../lisp-modules/lisp-packages.nix | 44 ++++++-- + 2 files changed, 107 insertions(+), 41 deletions(-) + +diff --git a/pkgs/applications/networking/browsers/nyxt/default.nix b/pkgs/applications/networking/browsers/nyxt/default.nix +index 59bb2adbf5182..5af706a73d56c 100644 +--- a/pkgs/applications/networking/browsers/nyxt/default.nix ++++ b/pkgs/applications/networking/browsers/nyxt/default.nix +@@ -1,9 +1,19 @@ +-{ stdenv, lib, lispPackages +-, makeWrapper, wrapGAppsHook, gst_all_1 +-, glib, gdk-pixbuf, cairo +-, mime-types, pango, gtk3 +-, glib-networking, gsettings-desktop-schemas +-, xclip, notify-osd, enchant ++{ lib ++, stdenv ++, cairo ++, enchant ++, gdk-pixbuf ++, glib ++, glib-networking ++, gobject-introspection ++, gsettings-desktop-schemas ++, gtk3 ++, gst_all_1 ++, lispPackages ++, mime-types ++, pango ++, wrapGAppsHook ++, xclip + }: + + stdenv.mkDerivation rec { +@@ -12,39 +22,75 @@ stdenv.mkDerivation rec { + + src = lispPackages.nyxt; + +- nativeBuildInputs = [ makeWrapper wrapGAppsHook ]; +- gstBuildInputs = with gst_all_1; [ +- gstreamer gst-libav ++ nativeBuildInputs = [ wrapGAppsHook ]; ++ buildInputs = [ ++ cairo ++ enchant ++ gdk-pixbuf ++ glib ++ glib-networking ++ gobject-introspection ++ gsettings-desktop-schemas ++ gtk3 ++ mime-types ++ pango ++ ] ++ (with gst_all_1; [ ++ gstreamer ++ gst-libav + gst-plugins-base + gst-plugins-good + gst-plugins-bad + gst-plugins-ugly +- ]; +- buildInputs = [ +- glib gdk-pixbuf cairo +- mime-types pango gtk3 +- glib-networking gsettings-desktop-schemas +- xclip notify-osd enchant +- ] ++ gstBuildInputs; ++ ]); + +- GST_PLUGIN_SYSTEM_PATH_1_0 = lib.concatMapStringsSep ":" (p: "${p}/lib/gstreamer-1.0") gstBuildInputs; ++ binPath = lib.optionals (!stdenv.isDarwin) [ xclip ]; + ++ doInstallCheck = !stdenv.isDarwin; ++ dontBuild = true; + dontWrapGApps = true; ++ ++ # stripping breaks the Linux build, possibly because the resulting binary is ++ # already stripped once in lispPackages.nyxt ++ dontStrip = true; ++ + installPhase = '' +- mkdir -p $out/share/applications/ +- sed "s/VERSION/$version/" $src/lib/common-lisp/nyxt/assets/nyxt.desktop > $out/share/applications/nyxt.desktop +- for i in 16 32 128 256 512; do +- mkdir -p "$out/share/icons/hicolor/''${i}x''${i}/apps/" +- cp -f $src/lib/common-lisp/nyxt/assets/nyxt_''${i}x''${i}.png "$out/share/icons/hicolor/''${i}x''${i}/apps/nyxt.png" +- done +- +- mkdir -p $out/bin && makeWrapper $src/bin/nyxt $out/bin/nyxt \ +- --prefix GST_PLUGIN_SYSTEM_PATH_1_0 : "${GST_PLUGIN_SYSTEM_PATH_1_0}" \ +- --argv0 nyxt "''${gappsWrapperArgs[@]}" +- ''; ++ runHook preInstall ++ '' + (if stdenv.isDarwin then '' ++ mkdir -p $out/bin $out/Applications/Nyxt.app/Contents ++ pushd $out/Applications/Nyxt.app/Contents ++ install -Dm644 $src/lib/common-lisp/nyxt/assets/Info.plist Info.plist ++ install -Dm644 $src/lib/common-lisp/nyxt/assets/nyxt.icns Resources/nyxt.icns ++ install -Dm755 $src/bin/nyxt MacOS/nyxt ++ popd ++ ++ gappsWrapperArgsHook # FIXME: currently runs at preFixup ++ wrapGApp $out/Applications/Nyxt.app/Contents/MacOS/nyxt \ ++ --prefix PATH : "${lib.makeBinPath binPath}" \ ++ --argv0 nyxt ++ ++ ln -s $out/Applications/Nyxt.app/Contents/MacOS/nyxt $out/bin/nyxt ++ '' else '' ++ mkdir -p $out/share/applications/ ++ sed "s/VERSION/$version/" $src/lib/common-lisp/nyxt/assets/nyxt.desktop > $out/share/applications/nyxt.desktop ++ for i in 16 32 128 256 512; do ++ mkdir -p "$out/share/icons/hicolor/''${i}x''${i}/apps/" ++ cp -f $src/lib/common-lisp/nyxt/assets/nyxt_''${i}x''${i}.png "$out/share/icons/hicolor/''${i}x''${i}/apps/nyxt.png" ++ done ++ ++ install -Dm755 $src/bin/nyxt $out/bin/nyxt ++ ++ gappsWrapperArgsHook # FIXME: currently runs at preFixup ++ wrapGApp $out/bin/nyxt \ ++ --prefix PATH : "${lib.makeBinPath binPath}" \ ++ --argv0 nyxt ++ '') + '' ++ runHook postInstall ++ ''; + +- checkPhase = '' ++ installCheckPhase = '' ++ runHook preCheck + $out/bin/nyxt -h ++ runHook postCheck + ''; + + meta = with lib; { +diff --git a/pkgs/development/lisp-modules/lisp-packages.nix b/pkgs/development/lisp-modules/lisp-packages.nix +index e4f623686a9af..74ae5a05b575d 100644 +--- a/pkgs/development/lisp-modules/lisp-packages.nix ++++ b/pkgs/development/lisp-modules/lisp-packages.nix +@@ -129,22 +129,42 @@ let lispPackages = rec { + description = "Browser"; + + overrides = x: { ++ patches = [ ++ # Fixes a startup crash on Darwin ++ # https://github.com/atlas-engineer/nyxt/pull/1476 ++ (pkgs.fetchpatch { ++ url = "https://github.com/midchildan/nyxt/commit/6184884b48b7cacdc51d104cb2299c26437a73d8.diff"; ++ sha256 = "sha256-A8Hwfjn/B5fv8OTKM5i9YrNFAMbPAg9xRH7gwoMMlQs="; ++ }) ++ ++ # Fix list-buffers ++ (pkgs.fetchpatch { ++ url = "https://github.com/atlas-engineer/nyxt/commit/4e2efb5a456d8d647f3eeaeb52cb21f96c92471c.diff"; ++ sha256 = "sha256-xt+jXZlTktznAoEWsaO5uQywo+bR9PecgTKOjY7UNvY="; ++ }) ++ ++ # Fix non-functional "Update" button in the buffer list ++ # https://github.com/atlas-engineer/nyxt/pull/1484 ++ (pkgs.fetchpatch { ++ url = "https://github.com/midchildan/nyxt/commit/7589181d6e367442bad8011f0ef5b42fc1cfd3c5.diff"; ++ sha256 = "sha256-4uXm7yxkhcArk39JBealGr1N4r/8AM5v/1VYHw1y4hw="; ++ }) ++ ]; ++ + postInstall = '' + echo "Building nyxt binary" +- ( +- source "$out/lib/common-lisp-settings"/*-shell-config.sh +- cd "$out/lib/common-lisp"/*/ +- makeFlags="''${makeFlags:-}" +- make LISP=common-lisp.sh NYXT_INTERNAL_QUICKLISP=false PREFIX="$out" $makeFlags all +- make LISP=common-lisp.sh NYXT_INTERNAL_QUICKLISP=false PREFIX="$out" $makeFlags install +- cp nyxt "$out/bin/nyxt" +- ) ++ ++ # clear unnecessary environment variables to avoid hitting the limit ++ env -i \ ++ NIX_LISP="$NIX_LISP" \ + NIX_LISP_PRELAUNCH_HOOK=' +- nix_lisp_build_system nyxt/gtk-application \ +- "(asdf/system:component-entry-point (asdf:find-system :nyxt/gtk-application))" \ +- "" "(format *error-output* \"Alien objects:~%~s~%\" sb-alien::*shared-objects*)" ++ nix_lisp_build_system nyxt/gi-gtk-application \ ++ "(asdf/system:component-entry-point (asdf:find-system :nyxt/gi-gtk-application))" \ ++ "" \ ++ "(format *error-output* \"Alien objects:~%~s~%\" sb-alien::*shared-objects*)" + ' "$out/bin/nyxt-lisp-launcher.sh" +- cp "$out/lib/common-lisp/nyxt/nyxt" "$out/bin/" ++ ++ mv "$out/lib/common-lisp/nyxt/nyxt" "$out/bin/" + ''; + }; + + +From c6598c61e74135b3b3848da46af62f0ee59ce9aa Mon Sep 17 00:00:00 2001 +From: midchildan +Date: Tue, 8 Jun 2021 03:30:00 +0900 +Subject: [PATCH 2/2] lispPackages.nyxt-unwrapped: rename from + lispPackages.nyxt + +--- + .../networking/browsers/nyxt/default.nix | 12 ++++++------ + pkgs/development/lisp-modules/lisp-packages.nix | 11 +++++++---- + 2 files changed, 13 insertions(+), 10 deletions(-) + +diff --git a/pkgs/applications/networking/browsers/nyxt/default.nix b/pkgs/applications/networking/browsers/nyxt/default.nix +index 5af706a73d56c..6b00e54794728 100644 +--- a/pkgs/applications/networking/browsers/nyxt/default.nix ++++ b/pkgs/applications/networking/browsers/nyxt/default.nix +@@ -18,9 +18,9 @@ + + stdenv.mkDerivation rec { + pname = "nyxt"; +- inherit (lispPackages.nyxt.meta) version; ++ inherit (lispPackages.nyxt-unwrapped.meta) version; + +- src = lispPackages.nyxt; ++ src = lispPackages.nyxt-unwrapped; + + nativeBuildInputs = [ wrapGAppsHook ]; + buildInputs = [ +@@ -58,8 +58,8 @@ stdenv.mkDerivation rec { + '' + (if stdenv.isDarwin then '' + mkdir -p $out/bin $out/Applications/Nyxt.app/Contents + pushd $out/Applications/Nyxt.app/Contents +- install -Dm644 $src/lib/common-lisp/nyxt/assets/Info.plist Info.plist +- install -Dm644 $src/lib/common-lisp/nyxt/assets/nyxt.icns Resources/nyxt.icns ++ install -Dm644 $src/lib/common-lisp/nyxt-unwrapped/assets/Info.plist Info.plist ++ install -Dm644 $src/lib/common-lisp/nyxt-unwrapped/assets/nyxt.icns Resources/nyxt.icns + install -Dm755 $src/bin/nyxt MacOS/nyxt + popd + +@@ -71,10 +71,10 @@ stdenv.mkDerivation rec { + ln -s $out/Applications/Nyxt.app/Contents/MacOS/nyxt $out/bin/nyxt + '' else '' + mkdir -p $out/share/applications/ +- sed "s/VERSION/$version/" $src/lib/common-lisp/nyxt/assets/nyxt.desktop > $out/share/applications/nyxt.desktop ++ sed "s/VERSION/$version/" $src/lib/common-lisp/nyxt-unwrapped/assets/nyxt.desktop > $out/share/applications/nyxt.desktop + for i in 16 32 128 256 512; do + mkdir -p "$out/share/icons/hicolor/''${i}x''${i}/apps/" +- cp -f $src/lib/common-lisp/nyxt/assets/nyxt_''${i}x''${i}.png "$out/share/icons/hicolor/''${i}x''${i}/apps/nyxt.png" ++ cp -f $src/lib/common-lisp/nyxt-unwrapped/assets/nyxt_''${i}x''${i}.png "$out/share/icons/hicolor/''${i}x''${i}/apps/nyxt.png" + done + + install -Dm755 $src/bin/nyxt $out/bin/nyxt +diff --git a/pkgs/development/lisp-modules/lisp-packages.nix b/pkgs/development/lisp-modules/lisp-packages.nix +index 74ae5a05b575d..10eb880fe663a 100644 +--- a/pkgs/development/lisp-modules/lisp-packages.nix ++++ b/pkgs/development/lisp-modules/lisp-packages.nix +@@ -122,8 +122,8 @@ let lispPackages = rec { + + asdFilesToKeep = [ "cluffer.asd" "cluffer-base.asd" "cluffer-simple-buffer.asd" "cluffer-simple-line.asd" "cluffer-standard-buffer.asd" "cluffer-standard-line.asd" ]; + }; +- nyxt = pkgs.lispPackages.buildLispPackage rec { +- baseName = "nyxt"; ++ nyxt-unwrapped = pkgs.lispPackages.buildLispPackage rec { ++ baseName = "nyxt-unwrapped"; + version = "2.0.0"; + + description = "Browser"; +@@ -162,9 +162,9 @@ let lispPackages = rec { + "(asdf/system:component-entry-point (asdf:find-system :nyxt/gi-gtk-application))" \ + "" \ + "(format *error-output* \"Alien objects:~%~s~%\" sb-alien::*shared-objects*)" +- ' "$out/bin/nyxt-lisp-launcher.sh" ++ ' "$out/bin/${baseName}-lisp-launcher.sh" + +- mv "$out/lib/common-lisp/nyxt/nyxt" "$out/bin/" ++ mv "$out/lib/common-lisp/${baseName}/nyxt" "$out/bin/" + ''; + }; + +@@ -225,5 +225,8 @@ let lispPackages = rec { + pkgs.sbcl + ]; + }; ++ ++ # added 2021-06-14 ++ nyxt = throw "lispPackages.nyxt was renamed to lispPackages.nyxt-unwrapped"; + }; + in lispPackages \ No newline at end of file diff --git a/patches/system-appearance.patch b/patches/system-appearance.patch new file mode 100644 index 0000000..14faa4b --- /dev/null +++ b/patches/system-appearance.patch @@ -0,0 +1,316 @@ + +Patch to make emacs 28 aware of the macOS 10.14+ system appearance changes. + +From 6e73cd55ebfd3b0967357b3c3ead16d2f8539526 Mon Sep 17 00:00:00 2001 +From: "Nicolas G. Querol" +Date: Wed, 11 Nov 2020 12:35:47 +0100 +Subject: [PATCH] Add `ns-system-appearance-change-functions' hook + +This implements a new hook, effective only on macOS >= 10.14 (Mojave), +that is called when the system changes its appearance (e.g. from light +to dark). Users can then implement functions that take this change +into account, for instance to load a particular theme. + +Minor changes are also made to select the right "dark" appearance +(NSAppearanceNameDarkAqua) on macOS versions >= 10.14, the previous one +(NSAppearanceNameVibrantDark) being deprecated. + +* src/frame.h (enum ns_appearance_type): Add new +"ns_appearance_dark_aqua" case. + +* src/nsfns.m (defun x-create-frame): Use "dark aqua" appearance on +macOS >= 10.14. + +* src/nsterm.m: + - (ns_set_appearance): Use "dark aqua" appearance on + macOS >= 10.14, reset appearance to the system one + if `ns-appearance' frame parameter is not set to + either `dark' or `light'. + - (initFrameFromEmacs): Use "dark aqua" appearance on + macOS >= 10.14. + - (EmacsApp) Add the `systemDidChangeAppearance' private method, + as well as the appropriate Key-Value Observing calls to update + the frame's appearance when the system (and thus the app's) + appearance changes. + - Add `ns-system-appearance-change-functions' hook variable and + symbol, to allow users to add functions that react to the + change of the system's appearance. + - Add `ns-system-appearance' variable, to allow users to consult + the current system appearance. + +Here is an example on how to use this new feature: + + (defun my/load-theme (appearance) + "Load theme, taking current system APPEARANCE into consideration." + (mapc #'disable-theme custom-enabled-themes) + (pcase appearance + ('light (load-theme 'tango t)) + ('dark (load-theme 'tango-dark t)))) + + (add-hook 'ns-system-appearance-change-functions #'my/load-theme) + +The hook being run on each system appearance change as well as at +startup time, Emacs should then always load the appropriate theme. +--- + src/frame.h | 3 +- + src/nsfns.m | 13 ++++- + src/nsterm.m | 153 ++++++++++++++++++++++++++++++++++++++++++++++----- + 3 files changed, 153 insertions(+), 16 deletions(-) + +diff --git a/src/frame.h b/src/frame.h +index a8ad011889..e7f7fdafe1 100644 +--- a/src/frame.h ++++ b/src/frame.h +@@ -71,7 +71,8 @@ #define EMACS_FRAME_H + { + ns_appearance_system_default, + ns_appearance_aqua, +- ns_appearance_vibrant_dark ++ ns_appearance_vibrant_dark, ++ ns_appearance_dark_aqua + }; + #endif + #endif /* HAVE_WINDOW_SYSTEM */ +diff --git a/src/nsfns.m b/src/nsfns.m +index 07bcab1816..4766eb91ae 100644 +--- a/src/nsfns.m ++++ b/src/nsfns.m +@@ -1256,14 +1256,25 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side. + store_frame_param (f, Qundecorated, FRAME_UNDECORATED (f) ? Qt : Qnil); + + #ifdef NS_IMPL_COCOA ++#ifndef NSAppKitVersionNumber10_14 ++#define NSAppKitVersionNumber10_14 1671 ++#endif + tem = gui_display_get_arg (dpyinfo, parms, Qns_appearance, NULL, NULL, + RES_TYPE_SYMBOL); + if (EQ (tem, Qdark)) +- FRAME_NS_APPEARANCE (f) = ns_appearance_vibrant_dark; ++ if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_14) ++ { ++ FRAME_NS_APPEARANCE (f) = ns_appearance_dark_aqua; ++ } ++ else ++ { ++ FRAME_NS_APPEARANCE (f) = ns_appearance_vibrant_dark; ++ } + else if (EQ (tem, Qlight)) + FRAME_NS_APPEARANCE (f) = ns_appearance_aqua; + else + FRAME_NS_APPEARANCE (f) = ns_appearance_system_default; ++ + store_frame_param (f, Qns_appearance, + (!NILP (tem) && !EQ (tem, Qunbound)) ? tem : Qnil); + +diff --git a/src/nsterm.m b/src/nsterm.m +index 4bdc67c10b..0d2f3e0b2b 100644 +--- a/src/nsterm.m ++++ b/src/nsterm.m +@@ -1889,11 +1889,25 @@ Hide the window (X11 semantics) + return; + + if (EQ (new_value, Qdark)) +- FRAME_NS_APPEARANCE (f) = ns_appearance_vibrant_dark; +- else if (EQ (new_value, Qlight)) +- FRAME_NS_APPEARANCE (f) = ns_appearance_aqua; ++ { ++#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 ++#ifndef NSAppKitVersionNumber10_14 ++#define NSAppKitVersionNumber10_14 1671 ++#endif ++ if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_14) ++ FRAME_NS_APPEARANCE(f) = ns_appearance_dark_aqua; ++ else ++#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 */ ++ FRAME_NS_APPEARANCE(f) = ns_appearance_vibrant_dark; ++ } ++ else if (EQ(new_value, Qlight)) ++ { ++ FRAME_NS_APPEARANCE (f) = ns_appearance_aqua; ++ } + else +- FRAME_NS_APPEARANCE (f) = ns_appearance_system_default; ++ { ++ FRAME_NS_APPEARANCE (f) = ns_appearance_system_default; ++ } + + [window setAppearance]; + #endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= 101000 */ +@@ -5381,6 +5395,7 @@ Needs to be here because ns_initialize_display_info () uses AppKit classes. + + ========================================================================== */ + ++static const void *kEmacsAppKVOContext = &kEmacsAppKVOContext; + + @implementation EmacsApp + +@@ -5626,6 +5641,18 @@ - (void)applicationDidFinishLaunching: (NSNotification *)notification + object:nil]; + #endif + ++#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 ++ [self addObserver:self ++ forKeyPath:NSStringFromSelector(@selector(effectiveAppearance)) ++ options:NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew ++ context:&kEmacsAppKVOContext]; ++ ++ pending_funcalls = Fcons(list3(Qrun_hook_with_args, ++ Qns_system_appearance_change_functions, ++ Vns_system_appearance), ++ pending_funcalls); ++#endif ++ + #ifdef NS_IMPL_COCOA + /* Some functions/methods in CoreFoundation/Foundation increase the + maximum number of open files for the process in their first call. +@@ -5664,6 +5691,68 @@ - (void)antialiasThresholdDidChange:(NSNotification *)notification + #endif + } + ++- (void)observeValueForKeyPath:(NSString *)keyPath ++ ofObject:(id)object ++ change:(NSDictionary *)change ++ context:(void *)context ++{ ++#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 ++ if (context == kEmacsAppKVOContext ++ && object == self ++ && [keyPath isEqualToString: ++ NSStringFromSelector (@selector(effectiveAppearance))]) ++ [self systemAppearanceDidChange: ++ [change objectForKey:NSKeyValueChangeNewKey]]; ++ else ++#endif /* (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 */ ++ [super observeValueForKeyPath:keyPath ++ ofObject:object ++ change:change ++ context:context]; ++} ++ ++#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 ++#ifndef NSAppKitVersionNumber10_14 ++#define NSAppKitVersionNumber10_14 1671 ++#endif ++- (void)systemAppearanceDidChange:(NSAppearance *)newAppearance ++{ ++ ++ if (NSAppKitVersionNumber < NSAppKitVersionNumber10_14) ++ return; ++ ++ NSAppearanceName appearance_name = ++ [newAppearance bestMatchFromAppearancesWithNames:@[ ++ NSAppearanceNameAqua, NSAppearanceNameDarkAqua ++ ]]; ++ ++ BOOL is_dark_appearance = ++ [appearance_name isEqualToString:NSAppearanceNameDarkAqua]; ++ Vns_system_appearance = is_dark_appearance ? Qdark : Qlight; ++ ++ run_system_appearance_change_hook (); ++} ++ ++static inline void run_system_appearance_change_hook (void) ++{ ++ if (NILP (Vns_system_appearance_change_functions)) ++ return; ++ ++ block_input (); ++ ++ bool owfi = waiting_for_input; ++ waiting_for_input = false; ++ ++ safe_call2 (Qrun_hook_with_args, ++ Qns_system_appearance_change_functions, ++ Vns_system_appearance); ++ Fredisplay(Qt); ++ ++ waiting_for_input = owfi; ++ ++ unblock_input (); ++} ++#endif /* (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 */ + + /* Termination sequences: + C-x C-c: +@@ -5828,6 +5917,14 @@ - (void)applicationDidResignActive: (NSNotification *)notification + ns_send_appdefined (-1); + } + ++- (void)applicationWillTerminate:(NSNotification *)notification ++{ ++ NSTRACE ("[EmacsApp applicationWillTerminate:]"); ++ ++ [self removeObserver:self ++ forKeyPath:NSStringFromSelector(@selector(effectiveAppearance)) ++ context:&kEmacsAppKVOContext]; ++} + + + /* ========================================================================== +@@ -8805,17 +8902,26 @@ - (void)setAppearance + #define NSAppKitVersionNumber10_10 1343 + #endif + +- if (NSAppKitVersionNumber < NSAppKitVersionNumber10_10) +- return; +- +- if (FRAME_NS_APPEARANCE (f) == ns_appearance_vibrant_dark) +- appearance = +- [NSAppearance appearanceNamed:NSAppearanceNameVibrantDark]; +- else if (FRAME_NS_APPEARANCE (f) == ns_appearance_aqua) +- appearance = +- [NSAppearance appearanceNamed:NSAppearanceNameAqua]; ++ if (NSAppKitVersionNumber < NSAppKitVersionNumber10_10) ++ return; + +- [self setAppearance:appearance]; ++#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 ++#ifndef NSAppKitVersionNumber10_14 ++#define NSAppKitVersionNumber10_14 1671 ++#endif ++ if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_14 ++ && FRAME_NS_APPEARANCE(f) == ns_appearance_dark_aqua) ++ appearance = [NSAppearance appearanceNamed:NSAppearanceNameDarkAqua]; ++ else ++#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 */ ++ if (FRAME_NS_APPEARANCE(f) == ns_appearance_vibrant_dark) ++ appearance = ++ [NSAppearance appearanceNamed:NSAppearanceNameVibrantDark]; ++ else if (FRAME_NS_APPEARANCE (f) == ns_appearance_aqua) ++ appearance = ++ [NSAppearance appearanceNamed:NSAppearanceNameAqua]; ++ ++ [self setAppearance:appearance]; + #endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= 101000 */ + } + +@@ -9952,6 +10058,25 @@ Nil means use fullscreen the old (< 10.7) way. The old way works better with + This variable is ignored on macOS < 10.7 and GNUstep. Default is t. */); + ns_use_mwheel_momentum = YES; + ++ DEFVAR_LISP ("ns-system-appearance", Vns_system_appearance, ++ doc: /* Current system appearance, i.e. `dark' or `light'. ++ ++This variable is ignored on macOS < 10.14 and GNUstep. Default is nil. */); ++ Vns_system_appearance = Qnil; ++ DEFSYM(Qns_system_appearance, "ns-system-appearance"); ++ ++ DEFVAR_LISP ("ns-system-appearance-change-functions", ++ Vns_system_appearance_change_functions, ++ doc: /* List of functions to call when the system appearance changes. ++Each function is called with a single argument, which corresponds to the new ++system appearance (`dark' or `light'). ++ ++This hook is also run once at startup. ++ ++This variable is ignored on macOS < 10.14 and GNUstep. Default is nil. */); ++ Vns_system_appearance_change_functions = Qnil; ++ DEFSYM(Qns_system_appearance_change_functions, "ns-system-appearance-change-functions"); ++ + /* TODO: Move to common code. */ + DEFVAR_LISP ("x-toolkit-scroll-bars", Vx_toolkit_scroll_bars, + doc: /* SKIP: real doc in xterm.c. */); + +base-commit: e5c481b61c26bcf83779db9fb3ac6b96bc50ab2e +-- +2.33.0