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.
This commit is contained in:
larstvei 2022-09-18 17:49:37 +02:00
commit 746ea0f434
11 changed files with 1022 additions and 0 deletions

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "emacs"]
path = emacs
url = git@github.com:larstvei/dot-emacs.git

38
README.org Normal file
View File

@ -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

1
emacs Submodule

@ -0,0 +1 @@
Subproject commit 4bc7e9ac94e62062aaed57275099bfdfb699e66f

119
flake.lock Normal file
View File

@ -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
}

82
flake.nix Normal file
View File

@ -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
];
});
})
];
};
})
];
};
};
}

69
modules/home.nix Normal file
View File

@ -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;
}

70
modules/mac.nix Normal file
View File

@ -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"
];
};
}

View File

@ -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

View File

@ -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.

View File

@ -0,0 +1,287 @@
From 922bd3b630b6e232c1ccab17e70bd14ce84f172d Mon Sep 17 00:00:00 2001
From: midchildan <git@midchildan.org>
Date: Wed, 2 Jun 2021 02:30:44 +0900
Subject: [PATCH 1/2] nyxt: fix darwin build
Co-authored-by: Michael Lingelbach <m.j.lbach@gmail.com>
---
.../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 <git@midchildan.org>
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

View File

@ -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" <nicolas.gquerol@gmail.com>
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