From 387de1f3cd96188be76420433a6f500b416b0992 Mon Sep 17 00:00:00 2001 From: Vegard Bieker Matthey Date: Tue, 28 Jul 2026 18:00:35 +0200 Subject: [PATCH] use dwl-session in dwl script and add swayidle and waylock --- home/users/vbm.nix | 11 +- hosts/perseus/configuration.nix | 2 +- hosts/talos/config_files/dwl/config.h | 8 ++ hosts/talos/configuration.nix | 10 +- hosts/talos/home.nix | 15 ++- overlays.nix | 1 + patches/dwl/autostart.patch | 141 ++++++++++++++++++++++++++ scripts/dwls.nix | 4 +- 8 files changed, 184 insertions(+), 8 deletions(-) create mode 100644 patches/dwl/autostart.patch diff --git a/home/users/vbm.nix b/home/users/vbm.nix index f37ff6c..47f2f17 100644 --- a/home/users/vbm.nix +++ b/home/users/vbm.nix @@ -48,6 +48,7 @@ xdg = { enable = true; + autostart.enable = true; mime.enable = true; mimeApps.enable = true; mimeApps.defaultApplications = { @@ -67,6 +68,7 @@ }; home.pointerCursor = { + enable = true; name = "Adwaita"; package = pkgs.adwaita-icon-theme; size = 24; @@ -76,7 +78,14 @@ services.ssh-agent.enable = true; - services.gnome-keyring.enable = true; + # programs.keepassxc = { + # autostart = true; + # enable = true; + # settings = { + # # For available settings, see https://github.com/keepassxreboot/keepassxc/blob/develop/src/core/Config.cpp + # FdoSecrets.Enabled = true; # Enable Secret Service Integration + # }; + # }; services.mako = { enable = true; diff --git a/hosts/perseus/configuration.nix b/hosts/perseus/configuration.nix index 26bc2fe..201e923 100644 --- a/hosts/perseus/configuration.nix +++ b/hosts/perseus/configuration.nix @@ -83,8 +83,8 @@ tree dust eza - wl-clipboard keepassxc + wl-clipboard btop cargo rustc diff --git a/hosts/talos/config_files/dwl/config.h b/hosts/talos/config_files/dwl/config.h index b95d5da..de25ef9 100644 --- a/hosts/talos/config_files/dwl/config.h +++ b/hosts/talos/config_files/dwl/config.h @@ -26,6 +26,12 @@ static char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; /* logging */ static int log_level = WLR_ERROR; +/* Autostart */ +static const char *const autostart[] = { + "wbg", "/home/vbm/Pictures/Wallpapers/d3.png", NULL, + NULL /* terminate */ +}; + static const Rule rules[] = { /* app_id title tags mask isfloating monitor */ { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ @@ -125,6 +131,7 @@ static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TA /* commands */ static const char *termcmd[] = { "foot", NULL }; +static const char *lockcmd[] = { "waylock", "-init-color", "0x444444", "-input-color", "0x005577", "-input-alt-color", "0x005577", "-fail-color", "0x770000", NULL }; static const char *menucmd[] = { "wmenu-drun", "-i", "-f", "Hack 9", NULL }; static const char *loudcmd[] = { "wpctl", "set-volume", "@DEFAULT_AUDIO_SINK@", "1%+", NULL }; static const char *quietcmd[] = { "wpctl", "set-volume", "@DEFAULT_AUDIO_SINK@", "1%-", NULL }; @@ -149,6 +156,7 @@ static const Key keys[] = { { 0, XKB_KEY_XF86MonBrightnessUp, spawn, {.v = brightcmd} }, { 0, XKB_KEY_XF86MonBrightnessDown, spawn, {.v = dimcmd} }, { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Delete, spawn, {.v = shutdowncmd} }, + { MODKEY, XKB_KEY_o, spawn, {.v = lockcmd} }, /* custom */ { MODKEY, XKB_KEY_b, togglebar, {0} }, { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, diff --git a/hosts/talos/configuration.nix b/hosts/talos/configuration.nix index ce5b19c..ac22c3c 100644 --- a/hosts/talos/configuration.nix +++ b/hosts/talos/configuration.nix @@ -148,12 +148,11 @@ packages = with pkgs; [ (import ../../scripts/dwls.nix { inherit pkgs lib; }) wmenu - dwl tree dust eza - wl-clipboard keepassxc + wl-clipboard btop fluffychat cargo @@ -179,10 +178,17 @@ gamescope gamemode mangohud + waylock ]; }; + programs.dwl = { + enable = true; + package = pkgs.dwl; + }; + security.rtkit.enable = true; + security.pam.services.waylock.enable = true; hardware.acpilight.enable = true; diff --git a/hosts/talos/home.nix b/hosts/talos/home.nix index 20a38c6..84ea877 100644 --- a/hosts/talos/home.nix +++ b/hosts/talos/home.nix @@ -1,6 +1,4 @@ -{ - ... -}: +{ lib, pkgs, ... }: { imports = [ @@ -32,4 +30,15 @@ "65" ]; }; + + services.swayidle = { + enable = true; + timeouts = [ + { + command = "${lib.getExe pkgs.waylock} -init-color 0x444444 -input-color 0x005577 -input-alt-color 0x005577 -fail-color 0x770000"; + timeout = 300; + } + ]; + }; + } diff --git a/overlays.nix b/overlays.nix index 3be09f4..d515923 100644 --- a/overlays.nix +++ b/overlays.nix @@ -16,6 +16,7 @@ patches = oldAttrs.patches or [ ] ++ [ ./patches/dwl/bar.patch ./patches/dwl/xwayland-handle-minimize.patch + ./patches/dwl/autostart.patch ]; }); }) diff --git a/patches/dwl/autostart.patch b/patches/dwl/autostart.patch new file mode 100644 index 0000000..a1ce9ac --- /dev/null +++ b/patches/dwl/autostart.patch @@ -0,0 +1,141 @@ +From d2e2e61aeb25ad71c2c559994968ba64e0974503 Mon Sep 17 00:00:00 2001 +From: A Frederick Christensen +Date: Fri, 27 Feb 2026 12:23:04 -0600 +Subject: [PATCH] Applied autostart patch + +--- + config.def.h | 6 ++++++ + dwl.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++--- + 2 files changed, 61 insertions(+), 3 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 8a6eda0..6eb0db4 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -20,6 +20,12 @@ static const float fullscreen_bg[] = {0.0f, 0.0f, 0.0f, 1.0f}; /* You ca + /* logging */ + static int log_level = WLR_ERROR; + ++/* Autostart */ ++static const char *const autostart[] = { ++ "wbg", "/path/to/your/image", NULL, ++ NULL /* terminate */ ++}; ++ + static const Rule rules[] = { + /* app_id title tags mask isfloating monitor */ + { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ +diff --git a/dwl.c b/dwl.c +index 44f3ad9..e7b6199 100644 +--- a/dwl.c ++++ b/dwl.c +@@ -246,6 +246,7 @@ static void arrange(Monitor *m); + static void arrangelayer(Monitor *m, struct wl_list *list, + struct wlr_box *usable_area, int exclusive); + static void arrangelayers(Monitor *m); ++static void autostartexec(void); + static void axisnotify(struct wl_listener *listener, void *data); + static void buttonpress(struct wl_listener *listener, void *data); + static void chvt(const Arg *arg); +@@ -449,6 +450,9 @@ static struct wl_listener xwayland_ready = {.notify = xwaylandready}; + static struct wlr_xwayland *xwayland; + #endif + ++static pid_t *autostart_pids; ++static size_t autostart_len; ++ + /* configuration, allows nested code to access above variables */ + #include "config.h" + +@@ -603,6 +607,27 @@ arrangelayers(Monitor *m) + } + } + ++void ++autostartexec(void) { ++ const char *const *p; ++ size_t i = 0; ++ ++ /* count entries */ ++ for (p = autostart; *p; autostart_len++, p++) ++ while (*++p); ++ ++ autostart_pids = calloc(autostart_len, sizeof(pid_t)); ++ for (p = autostart; *p; i++, p++) { ++ if ((autostart_pids[i] = fork()) == 0) { ++ setsid(); ++ execvp(*p, (char *const *)p); ++ die("dwl: execvp %s:", *p); ++ } ++ /* skip arguments */ ++ while (*++p); ++ } ++} ++ + void + axisnotify(struct wl_listener *listener, void *data) + { +@@ -699,12 +724,23 @@ checkidleinhibitor(struct wlr_surface *exclude) + void + cleanup(void) + { ++ size_t i; ++ + cleanuplisteners(); + #ifdef XWAYLAND + wlr_xwayland_destroy(xwayland); + xwayland = NULL; + #endif + wl_display_destroy_clients(dpy); ++ ++ /* kill child processes */ ++ for (i = 0; i < autostart_len; i++) { ++ if (0 < autostart_pids[i]) { ++ kill(autostart_pids[i], SIGTERM); ++ waitpid(autostart_pids[i], NULL, 0); ++ } ++ } ++ + if (child_pid > 0) { + kill(-child_pid, SIGTERM); + waitpid(child_pid, NULL, 0); +@@ -1560,10 +1596,25 @@ gpureset(struct wl_listener *listener, void *data) + void + handlesig(int signo) + { +- if (signo == SIGCHLD) +- while (waitpid(-1, NULL, WNOHANG) > 0); +- else if (signo == SIGINT || signo == SIGTERM) ++ if (signo == SIGCHLD) { ++ pid_t pid, *p, *lim; ++ while ((pid = waitpid(-1, NULL, WNOHANG)) > 0) { ++ if (pid == child_pid) ++ child_pid = -1; ++ if (!(p = autostart_pids)) ++ continue; ++ lim = &p[autostart_len]; ++ ++ for (; p < lim; p++) { ++ if (*p == pid) { ++ *p = -1; ++ break; ++ } ++ } ++ } ++ } else if (signo == SIGINT || signo == SIGTERM) { + quit(NULL); ++ } + } + + void +@@ -2250,6 +2301,7 @@ run(char *startup_cmd) + die("startup: backend_start"); + + /* Now that the socket exists and the backend is started, run the startup command */ ++ autostartexec(); + if (startup_cmd) { + int piperw[2]; + if (pipe(piperw) < 0) +-- +2.52.0 + diff --git a/scripts/dwls.nix b/scripts/dwls.nix index 31f2d9c..63d9ce1 100644 --- a/scripts/dwls.nix +++ b/scripts/dwls.nix @@ -1,4 +1,6 @@ { pkgs, lib }: pkgs.writeShellScriptBin "dwls" '' - ${lib.getExe pkgs.slstatus} -s | ${lib.getExe pkgs.dwl} -s "${lib.getExe pkgs.wbg} ~/Pictures/Wallpapers/d3.png" + export PATH=$PATH:${pkgs.wbg}/bin + ${lib.getExe pkgs.slstatus} -s | /etc/xdg/dwl-session '' +