Compare commits

...

5 Commits

Author SHA1 Message Date
daniil-berg 0d6b8ca13a feat(desktop): GUI askpass for ssh passphrase/PIN prompts
Add ksshaskpass and point SSH_ASKPASS at it, without forcing: a tty still
prompts inline, but a caller may set SSH_ASKPASS_REQUIRE to route the prompt
to the GUI (e.g. a headless context driving `git push`).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 08:32:19 +02:00
daniil-berg 238528f961 feat(desktop): provide Secret Service via gnome-keyring
Bare Wayland session ships no `org.freedesktop.secrets` provider, so
libsecret/qtkeychain apps can't persist credentials. Run gnome-keyring
and unlock it at the greetd login via PAM.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 08:18:59 +02:00
daniil-berg 213d2d0b5b feat(home): drag to move/resize windows with $mod+mouse
Reach oversized floating dialogs (GTK pickers) whose confirm button
lands off-screen on short displays.
2026-07-06 20:47:05 +02:00
daniil-berg 7437ed9dc0 feat(home): add libreoffice 2026-07-06 20:46:55 +02:00
daniil-berg 60d1d89d04 fix(media): rebind imv open-in-editor from g to e
`g` is reserved by imv's `gg` first-image chord.
2026-07-06 20:46:35 +02:00
3 changed files with 24 additions and 2 deletions
+18
View File
@@ -36,6 +36,10 @@ in
# Mute the harmless "Wayland does not support QWindow::requestActivate()" # Mute the harmless "Wayland does not support QWindow::requestActivate()"
# spam Qt apps (keepassxc) print; scoped to that one log category only. # spam Qt apps (keepassxc) print; scoped to that one log category only.
QT_LOGGING_RULES = "qt.qpa.wayland=false"; QT_LOGGING_RULES = "qt.qpa.wayland=false";
# GUI helper for ssh passphrase/PIN prompts. Not forced: with a tty ssh still
# prompts inline; the helper is only used when a caller sets
# SSH_ASKPASS_REQUIRE (e.g. a headless/agent context).
SSH_ASKPASS = "${pkgs.ksshaskpass}/bin/ksshaskpass";
}; };
# Sets XDG_{CONFIG,DATA,CACHE}_HOME and enables xdg.configFile management. # Sets XDG_{CONFIG,DATA,CACHE}_HOME and enables xdg.configFile management.
xdg.enable = true; xdg.enable = true;
@@ -48,6 +52,8 @@ in
# wrapper binary. # wrapper binary.
nodejs nodejs
highlight # `ccat` alias: syntax-highlighted cat highlight # `ccat` alias: syntax-highlighted cat
libreoffice
ksshaskpass # Qt GUI prompt for ssh passphrase/PIN (see SSH_ASKPASS above)
]; ];
# ---- Per-tool config files, routed into XDG dirs --------------------- # ---- Per-tool config files, routed into XDG dirs ---------------------
@@ -292,6 +298,14 @@ in
"$mod" = "SUPER"; "$mod" = "SUPER";
# Drag to move ($mod+LMB) / resize ($mod+RMB) any window. Needed to reach
# oversized floating dialogs (e.g. GTK save/upload pickers) whose confirm
# button lands off-screen on short displays.
bindm = [
"$mod, mouse:272, movewindow"
"$mod, mouse:273, resizewindow"
];
bind = [ bind = [
"$mod, Return, exec, footclient" "$mod, Return, exec, footclient"
"$mod, q, killactive" "$mod, q, killactive"
@@ -344,6 +358,10 @@ in
# Notification daemon. notify-send clients (e.g. imv's info/delete toasts in # Notification daemon. notify-send clients (e.g. imv's info/delete toasts in
# modules/media.nix, gpg-agent errors) need a running server on the bus. # modules/media.nix, gpg-agent errors) need a running server on the bus.
# Minimal to match the desktop: Nerd Font, no rounding, square border. # Minimal to match the desktop: Nerd Font, no rounding, square border.
# Secret Service provider (freedesktop org.freedesktop.secrets). Bare Wayland
# session has none otherwise; apps using libsecret/qtkeychain need it.
services.gnome-keyring.enable = true;
services.mako = { services.mako = {
enable = true; enable = true;
settings = { settings = {
+2 -2
View File
@@ -36,7 +36,7 @@ in
"r" = ''exec magick "$imv_current_file" -rotate 90 "$imv_current_file"''; "r" = ''exec magick "$imv_current_file" -rotate 90 "$imv_current_file"'';
"<Shift+R>" = ''exec magick "$imv_current_file" -rotate -90 "$imv_current_file"''; "<Shift+R>" = ''exec magick "$imv_current_file" -rotate -90 "$imv_current_file"'';
"f" = ''exec magick "$imv_current_file" -flop "$imv_current_file"''; "f" = ''exec magick "$imv_current_file" -flop "$imv_current_file"'';
"g" = ''exec gimp "$imv_current_file"''; "e" = ''exec gimp "$imv_current_file"''; # edit; `g` reserved by imv's gg chord
"i" = ''exec notify-send "File info" "$(mediainfo "$imv_current_file")"''; "i" = ''exec notify-send "File info" "$(mediainfo "$imv_current_file")"'';
}; };
}; };
@@ -55,6 +55,6 @@ in
imagemagick # `magick`: rotate/flip binds imagemagick # `magick`: rotate/flip binds
mediainfo # `i` info bind mediainfo # `i` info bind
libnotify # notify-send client (daemon = mako, in home.nix) libnotify # notify-send client (daemon = mako, in home.nix)
gimp # `g` open-in-editor bind gimp # `e` open-in-editor bind
]; ];
} }
+4
View File
@@ -92,6 +92,10 @@
}; };
}; };
# Unlock the login keyring with the login password at the greetd prompt,
# so the Secret Service is open without a second passphrase.
security.pam.services.greetd.enableGnomeKeyring = true;
# XDG portals (screen sharing, file pickers, and so on). # XDG portals (screen sharing, file pickers, and so on).
xdg.portal = { xdg.portal = {
enable = true; enable = true;