feat: move back to gnome

This commit is contained in:
Jet 2026-05-07 17:55:36 -07:00
parent 2394f856b0
commit 6530292166
No known key found for this signature in database
5 changed files with 201 additions and 270 deletions

View file

@ -1,180 +1,5 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
let
greetdApodDir = "/var/lib/greetd/apod";
greetdApodCurrent = "${greetdApodDir}/current";
swaySession = pkgs.writeTextDir "share/wayland-sessions/sway.desktop" ''
[Desktop Entry]
Name=Sway
Comment=An i3-compatible Wayland compositor
Exec=${config.programs.sway.package}/bin/sway
Type=Application
DesktopNames=sway
'';
regreetPasswordPrompt = pkgs.regreet.overrideAttrs (oldAttrs: {
postPatch = (oldAttrs.postPatch or "") + ''
substituteInPlace src/gui/model.rs \
--replace-fail $' } else {\n let username = if let Some(username) = self.get_current_username() {' \
$' } else if self.sys_util.get_sessions().len() == 1 {\n let (session, sess_info) = self.sys_util.get_sessions().iter().next().expect("one session");\n info!("No session selected; using only available session: {session}");\n (Some(session.to_string()), Some(sess_info.clone()))\n } else {\n let username = if let Some(username) = self.get_current_username() {'
substituteInPlace src/gui/component.rs \
--replace-fail $' // Set the default behaviour of pressing the Return key to act like the login button.\n root.set_default_widget(Some(&widgets.ui.login_button));\n\n AsyncComponentParts { model, widgets }' \
$' // Set the default behaviour of pressing the Return key to act like the login button.\n root.set_default_widget(Some(&widgets.ui.login_button));\n\n // Immediately start authentication so the password entry appears and receives focus.\n sender.input(Self::Input::Login {\n input: String::new(),\n info: UserSessInfo::extract(\n &widgets.ui.usernames_box,\n &widgets.ui.username_entry,\n &widgets.ui.sessions_box,\n &widgets.ui.session_entry,\n ),\n });\n\n AsyncComponentParts { model, widgets }'
'';
});
regreetState = pkgs.writeText "regreet-state.toml" ''
last_user = "jet"
[user_to_last_sess]
jet = "Sway"
'';
fetchGreetdApod = pkgs.writeShellApplication {
name = "greetd-apod-wallpaper";
runtimeInputs = [
pkgs.coreutils
pkgs.curl
pkgs.jq
];
text = ''
set -euo pipefail
state_dir="${greetdApodDir}"
current_link="${greetdApodCurrent}"
user_current="/home/jet/.local/state/nasa-apod/current"
mkdir -p "$state_dir"
chmod 0755 "$state_dir"
install_current() {
local source="$1"
local target="$2"
if [ -s "$source" ]; then
cp --dereference --force "$source" "$target"
chmod 0644 "$target"
ln -sfn "$target" "$current_link"
fi
}
if [ ! -e "$current_link" ] && [ -e "$user_current" ]; then
install_current "$user_current" "$state_dir/bootstrap"
fi
read_api_key_file() {
local key_file="$1"
if [ -r "$key_file" ]; then
while IFS= read -r line; do
case "$line" in
NASA_API_KEY=*)
api_key="''${line#NASA_API_KEY=}"
;;
esac
done < "$key_file"
fi
}
api_key="''${NASA_API_KEY:-}"
if [ -z "$api_key" ]; then
read_api_key_file "''${NASA_API_KEY_FILE:-/home/jet/.config/nasa-api.env}"
fi
if [ -z "$api_key" ]; then
read_api_key_file /etc/nasa-api.env
fi
if [ -z "$api_key" ]; then
exit 0
fi
today="$(date +%F)"
for cached in "$state_dir/apod-$today".*; do
if [ -s "$cached" ]; then
ln -sfn "$cached" "$current_link"
exit 0
fi
done
api_curl_args=(
--fail
--silent
--show-error
--location
--connect-timeout 5
--max-time 20
)
image_curl_args=(
--fail
--silent
--show-error
--location
--retry 2
--retry-delay 5
--retry-max-time 120
--connect-timeout 10
--max-time 60
)
api_request="$(mktemp)"
trap 'rm -f "$api_request"' EXIT
{
printf '%s\n' 'url = "https://api.nasa.gov/planetary/apod"'
printf '%s\n' 'get'
printf 'data-urlencode = "api_key=%s"\n' "$api_key"
printf '%s\n' 'data-urlencode = "thumbs=True"'
} > "$api_request"
chmod 0600 "$api_request"
json="$(curl "''${api_curl_args[@]}" --config "$api_request" || true)"
if [ -z "$json" ]; then
exit 0
fi
media_type="$(printf '%s' "$json" | jq -r '.media_type // empty')"
case "$media_type" in
image)
image_url="$(printf '%s' "$json" | jq -r '.hdurl // .url // empty')"
;;
video)
image_url="$(printf '%s' "$json" | jq -r '.thumbnail_url // empty')"
;;
*)
exit 0
;;
esac
if [ -z "$image_url" ]; then
exit 0
fi
ext="''${image_url##*.}"
ext="''${ext%%\?*}"
case "$ext" in
jpg|jpeg|png|webp) ;;
*) ext="jpg" ;;
esac
date_stamp="$(printf '%s' "$json" | jq -r '.date // empty')"
if [ -z "$date_stamp" ]; then
date_stamp="$(date +%F)"
fi
target="$state_dir/apod-$date_stamp.$ext"
tmp="$target.tmp"
if [ ! -s "$target" ]; then
if curl "''${image_curl_args[@]}" "$image_url" -o "$tmp" && [ -s "$tmp" ]; then
mv "$tmp" "$target"
chmod 0644 "$target"
else
rm -f "$tmp"
fi
fi
if [ -e "$target" ]; then
ln -sfn "$target" "$current_link"
fi
'';
};
in
{ {
boot.loader.systemd-boot.enable = true; boot.loader.systemd-boot.enable = true;
boot.loader.systemd-boot.configurationLimit = 3; boot.loader.systemd-boot.configurationLimit = 3;
@ -195,8 +20,6 @@ in
}; };
}; };
}; };
services.blueman.enable = true;
networking.networkmanager.enable = true; networking.networkmanager.enable = true;
networking.networkmanager.settings = { networking.networkmanager.settings = {
connection = { connection = {
@ -317,7 +140,6 @@ in
# Codex currently probes the conventional FHS bubblewrap path. # Codex currently probes the conventional FHS bubblewrap path.
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [
"L+ /usr/bin/bwrap - - - - ${pkgs.bubblewrap}/bin/bwrap" "L+ /usr/bin/bwrap - - - - ${pkgs.bubblewrap}/bin/bwrap"
"d ${greetdApodDir} 0755 root root -"
]; ];
# Set Ghostty as default terminal # Set Ghostty as default terminal
@ -332,40 +154,39 @@ in
virtualisation.docker.enable = true; virtualisation.docker.enable = true;
programs.sway = { services.displayManager.gdm.enable = true;
enable = true; services.desktopManager.gnome.enable = true;
wrapperFeatures.gtk = true; services.gnome.sushi.enable = true;
};
services.greetd = { # Keep GNOME's shell and file-manager integration while dropping apps replaced elsewhere.
enable = true; environment.gnome.excludePackages = with pkgs; [
settings.default_session = { baobab
command = "env GTK_USE_PORTAL=0 GDK_DEBUG=no-portals SESSION_DIRS=/run/current-system/sw/share/wayland-sessions XDG_DATA_DIRS=/run/current-system/sw/share ${pkgs.dbus}/bin/dbus-run-session ${pkgs.cage}/bin/cage -s -d -- ${config.programs.regreet.package}/bin/regreet"; decibels
user = "greeter"; epiphany
}; evince
}; geary
gnome-calculator
programs.regreet = { gnome-calendar
enable = true; gnome-characters
package = regreetPasswordPrompt; gnome-clocks
font = { gnome-connections
package = pkgs.atkinson-hyperlegible-next; gnome-console
name = "Atkinson Hyperlegible Next"; gnome-contacts
size = 16; gnome-font-viewer
}; gnome-logs
settings = { gnome-maps
background = { gnome-music
path = greetdApodCurrent; gnome-system-monitor
fit = "Cover"; gnome-text-editor
}; gnome-tour
GTK.application_prefer_dark_theme = true; gnome-weather
appearance.greeting_msg = "Welcome back"; papers
widget.clock = { showtime
format = "%a %b %d %I:%M %p"; simple-scan
resolution = "1s"; snapshot
}; totem
}; yelp
}; ];
services.accounts-daemon.enable = true; services.accounts-daemon.enable = true;
@ -379,11 +200,6 @@ in
}; };
}; };
system.activationScripts.regreetDefaultSession.text = ''
${pkgs.coreutils}/bin/install -D -m 0644 ${regreetState} /var/lib/regreet/state.toml
chown greeter:greeter /var/lib/regreet/state.toml
'';
fonts = { fonts = {
packages = [ packages = [
pkgs.atkinson-hyperlegible-next pkgs.atkinson-hyperlegible-next
@ -439,44 +255,10 @@ in
}; };
}; };
systemd.services.greetd-apod-wallpaper = {
description = "Fetch NASA APOD wallpaper for greetd";
after = [ "network-online.target" ];
wants = [ "network-online.target" ];
restartIfChanged = false;
serviceConfig = {
Type = "oneshot";
ExecStart = "${fetchGreetdApod}/bin/greetd-apod-wallpaper";
EnvironmentFile = "-${config.age.secrets.nasa-api-env.path}";
TimeoutStartSec = "3min";
};
};
systemd.timers.greetd-apod-wallpaper = {
wantedBy = [ "timers.target" ];
timerConfig = {
OnActiveSec = "2m";
OnUnitActiveSec = "1h";
Persistent = false;
Unit = "greetd-apod-wallpaper.service";
};
};
xdg.portal = {
enable = true;
wlr.enable = true;
config.common.default = [
"wlr"
"gtk"
];
extraPortals = with pkgs; [ xdg-desktop-portal-gtk ];
};
programs.dconf.enable = true; programs.dconf.enable = true;
services.gvfs.enable = true; services.gvfs.enable = true;
services.udisks2.enable = true; services.udisks2.enable = true;
security.polkit.enable = true; security.polkit.enable = true;
security.pam.services.swaylock = { };
services.printing.enable = true; services.printing.enable = true;
@ -584,11 +366,9 @@ in
docker docker
docker-compose docker-compose
flatpak flatpak
swaySession
wget wget
nh nh
]; ];
environment.pathsToLink = [ "/share/wayland-sessions" ];
programs.steam.enable = true; programs.steam.enable = true;
programs.nix-index-database.comma.enable = true; programs.nix-index-database.comma.enable = true;

View file

@ -10,7 +10,6 @@
./terminal.nix ./terminal.nix
./browser.nix ./browser.nix
./desktop.nix ./desktop.nix
./sway.nix
./opencode.nix ./opencode.nix
]; ];
} }

View file

@ -1,4 +1,73 @@
{ homeLib, ... }: {
config,
homeLib,
hostname,
osConfig ? null,
pkgs,
...
}:
let
apodSecretEnvironmentFile =
if
osConfig != null
&& osConfig ? age
&& osConfig.age ? secrets
&& builtins.hasAttr "nasa-api-env" osConfig.age.secrets
then
"-${osConfig.age.secrets."nasa-api-env".path}"
else
"-%h/.config/nasa-api.env";
chatDesktopId = if hostname == "framework-work" then "slack.desktop" else "vesktop.desktop";
favoriteApps = [
"zen-beta.desktop"
"com.mitchellh.ghostty.desktop"
chatDesktopId
"betterbird.desktop"
]
++ (
if hostname == "framework-work" then
[ ]
else
[
"signal.desktop"
"zulip.desktop"
]
);
autoMoveApplications = [
"zen-beta.desktop:1"
"com.mitchellh.ghostty.desktop:2"
"${chatDesktopId}:3"
"betterbird.desktop:4"
]
++ (
if hostname == "framework-work" then
[ ]
else
[
"signal.desktop:5"
"zulip.desktop:6"
]
);
autostartEntries = [
"${homeLib.zenStartup}/share/applications/zen-startup.desktop"
"${homeLib.ghosttyZellijStartup}/share/applications/ghostty-zellij-startup.desktop"
]
++ (
if hostname == "framework-work" then
[
"${pkgs.slack}/share/applications/slack.desktop"
"${homeLib.betterbirdStartup}/share/applications/betterbird-startup.desktop"
]
else
[
"${homeLib.vesktopStartup}/share/applications/vesktop-startup.desktop"
"${homeLib.betterbirdStartup}/share/applications/betterbird-startup.desktop"
"${homeLib.signalStartup}/share/applications/signal-startup.desktop"
"${homeLib.zulipStartup}/share/applications/zulip-startup.desktop"
]
);
in
{ {
dconf.settings = { dconf.settings = {
@ -10,9 +79,61 @@
cursor-theme = "Adwaita"; cursor-theme = "Adwaita";
document-font-name = "Atkinson Hyperlegible Next 11"; document-font-name = "Atkinson Hyperlegible Next 11";
enable-animations = false; enable-animations = false;
enable-hot-corners = false;
font-name = "Atkinson Hyperlegible Next 11"; font-name = "Atkinson Hyperlegible Next 11";
monospace-font-name = "CommitMono Nerd Font 11"; monospace-font-name = "CommitMono Nerd Font 11";
}; };
"org/gnome/system/location" = {
enabled = true;
};
"org/gnome/settings-daemon/plugins/power" = {
sleep-inactive-ac-type = "nothing";
};
"org/gnome/settings-daemon/plugins/media-keys" = {
screensaver = [ "<Super>l" ];
};
"org/gnome/desktop/peripherals/touchpad" = {
disable-while-typing = false;
natural-scroll = true;
tap-to-click = true;
};
"org/gnome/mutter" = {
center-new-windows = true;
dynamic-workspaces = false;
edge-tiling = true;
workspaces-only-on-primary = true;
};
"org/gnome/desktop/wm/preferences" = {
focus-mode = "click";
num-workspaces = 6;
};
"org/gnome/shell" = {
disable-user-extensions = false;
enabled-extensions = [
"hidetopbar@mathieu.bidon.ca"
"wifiqrcode@glerro.pm.me"
"system-monitor-next@paradoxxx.zero.gmail.com"
"clipboard-indicator@tudmotu.com"
"emoji-copy@felipeftn"
"tailscale@joaophi.github.com"
"auto-move-windows@gnome-shell-extensions.gcampax.github.com"
"appindicatorsupport@rgcjonas.gmail.com"
"gnome-shell-extension-maximized-by-default@stiggimy.github.com"
"no-titlebar-when-maximized@alec.ninja"
];
favorite-apps = favoriteApps;
};
"org/gnome/shell/extensions/auto-move-windows" = {
application-list = autoMoveApplications;
};
"org/gnome/shell/keybindings" = {
switch-to-application-1 = [ "<Super>1" ];
switch-to-application-2 = [ "<Super>2" ];
switch-to-application-3 = [ "<Super>3" ];
switch-to-application-4 = [ "<Super>4" ];
switch-to-application-5 = [ "<Super>5" ];
switch-to-application-6 = [ "<Super>6" ];
};
"org/gtk/gtk4/settings/file-chooser" = { "org/gtk/gtk4/settings/file-chooser" = {
show-hidden = true; show-hidden = true;
}; };
@ -66,6 +187,37 @@
}; };
}; };
xdg.autostart = {
enable = true;
entries = autostartEntries;
};
systemd.user.services.nasa-apod-wallpaper = {
Unit = {
Description = "Fetch NASA APOD wallpaper";
After = [ "graphical-session.target" ];
PartOf = [ "graphical-session.target" ];
X-RestartIfChanged = false;
};
Service = {
Type = "oneshot";
ExecStart = "${homeLib.nasaApodWallpaper}/bin/nasa-apod-wallpaper";
EnvironmentFile = apodSecretEnvironmentFile;
TimeoutStartSec = "3min";
};
};
systemd.user.timers.nasa-apod-wallpaper = {
Unit.Description = "Refresh NASA APOD wallpaper regularly";
Timer = {
OnActiveSec = "2m";
OnUnitActiveSec = "1h";
Persistent = false;
Unit = "nasa-apod-wallpaper.service";
};
Install.WantedBy = [ "timers.target" ];
};
xdg.mimeApps = { xdg.mimeApps = {
enable = true; enable = true;
defaultApplications = { defaultApplications = {

View file

@ -145,8 +145,8 @@ let
runtimeInputs = [ runtimeInputs = [
pkgs.coreutils pkgs.coreutils
pkgs.curl pkgs.curl
pkgs.glib
pkgs.jq pkgs.jq
pkgs.sway
]; ];
text = '' text = ''
set -euo pipefail set -euo pipefail
@ -201,8 +201,10 @@ let
set_wallpaper() { set_wallpaper() {
local target="$1" local target="$1"
if [ -n "''${SWAYSOCK:-}" ] && [ -n "''${WAYLAND_DISPLAY:-}" ]; then if [ -n "''${DBUS_SESSION_BUS_ADDRESS:-}" ]; then
swaymsg output "*" bg "$target" fill >/dev/null gsettings set org.gnome.desktop.background picture-uri "file://$target"
gsettings set org.gnome.desktop.background picture-uri-dark "file://$target"
gsettings set org.gnome.desktop.background picture-options 'zoom'
fi fi
} }

View file

@ -61,25 +61,23 @@
linphone linphone
lmstudio lmstudio
homeLib.betterbird homeLib.betterbird
blueman
brightnessctl brightnessctl
cliphist
fuzzel
grim
mako
nautilus nautilus
networkmanagerapplet
nwg-displays
playerctl playerctl
polkit_gnome
slurp
swaybg
swayidle
swaylock
waybar
wl-clipboard wl-clipboard
xdg-utils xdg-utils
gnomeExtensions.appindicator
gnomeExtensions.auto-move-windows
gnomeExtensions.clipboard-indicator
gnomeExtensions.emoji-copy
gnomeExtensions.hide-top-bar
gnomeExtensions.maximized-by-default-actually-reborn
gnomeExtensions.no-titlebar-when-maximized
gnomeExtensions.system-monitor-next
gnomeExtensions.tailscale-qs
gnomeExtensions.wifi-qrcode
nerd-fonts.commit-mono nerd-fonts.commit-mono
]; ];
} }