From 8af96427a7c459eadf7e960ea77368c8b7df054e Mon Sep 17 00:00:00 2001 From: Frantisek Bohacek Date: Fri, 3 May 2024 18:50:49 +0200 Subject: [PATCH] feat: add dwl to HM config --- home/modules/profiles/desktop/dwl/config.h | 269 ++++++++++++++ home/modules/profiles/desktop/dwl/default.nix | 153 ++++++++ .../profiles/desktop/dwl/waybar/config.jsonc | 237 ++++++++++++ .../profiles/desktop/dwl/waybar/style.css | 345 ++++++++++++++++++ .../profiles/desktop/qtile/launcher.nix | 1 + nixos/hosts/laptop-phobos/default.nix | 6 + nixos/hosts/laptop-phobos/home.nix | 1 + 7 files changed, 1012 insertions(+) create mode 100644 home/modules/profiles/desktop/dwl/config.h create mode 100644 home/modules/profiles/desktop/dwl/default.nix create mode 100644 home/modules/profiles/desktop/dwl/waybar/config.jsonc create mode 100644 home/modules/profiles/desktop/dwl/waybar/style.css diff --git a/home/modules/profiles/desktop/dwl/config.h b/home/modules/profiles/desktop/dwl/config.h new file mode 100644 index 0000000..084d86f --- /dev/null +++ b/home/modules/profiles/desktop/dwl/config.h @@ -0,0 +1,269 @@ +/* Taken from https://github.com/djpohly/dwl/issues/466 */ +#define COLOR(hex) { ((hex >> 24) & 0xFF) / 255.0f, \ + ((hex >> 16) & 0xFF) / 255.0f, \ + ((hex >> 8) & 0xFF) / 255.0f, \ + (hex & 0xFF) / 255.0f } +/* appearance */ +static const int sloppyfocus = 0; /* focus follows mouse */ +static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ +static const unsigned int borderpx = 1; /* border pixel of windows */ +static const float rootcolor[] = COLOR(0x222222ff); +static const float bordercolor[] = COLOR(0x444444ff); +static const float focuscolor[] = COLOR(0x005577ff); +static const float urgentcolor[] = COLOR(0xff0000ff); +/* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ +static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ + +enum { + PROGRAM_LAUNCHER, + SCRATCHPADS +}; +const char *modes_labels[] = { + "launcher", + "scratchpads" +}; + +/* tagging - TAGCOUNT must be no greater than 31 */ +#define TAGCOUNT (9) + +/* logging */ +static int log_level = WLR_ERROR; + +static const Rule rules[] = { + /* app_id title tags mask isfloating isterm noswallow monitor scratchkey */ + { "Alacritty", NULL, 0, 0, 1, 1, -1, 0 }, + { "Alacritty", "scratchpad",0, 1, 0, 0, -1, 'a' }, + { "kitty", NULL, 0, 0, 1, 1, -1, 0 }, + { "foot", NULL, 0, 0, 1, 1, -1, 0 }, + { "Spotify", NULL, 0, 1, 0, 0, -1, 's' }, +}; + +/* layout(s) */ +static const Layout layouts[] = { + /* symbol arrange function */ + { "[]=", tile }, + { "><>", NULL }, /* no layout function means floating behavior */ + { "[M]", monocle }, + { "TTT", bstack }, + { "|M|", centeredmaster } +}; + +/* monitors */ +/* NOTE: ALWAYS add a fallback rule, even if you are completely sure it won't be used */ +static const MonitorRule monrules[] = { + /* name scale rotate/reflect x y */ + /* defaults */ + { NULL, 1, WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, +}; + +static const TagRule tagrules[] = { + /* tag mfact nmaster layout */ + { 9, 0.55, 1, &layouts[2] }, + /* defaults */ + { 0, 0.55, 1, &layouts[0] } +}; + +/* keyboard */ +/* static const struct xkb_rule_names xkb_rules = { */ +/* /\* can specify fields: rules, model, layout, variant, options *\/ */ +/* /\* example: */ +/* .options = "ctrl:nocaps", */ +/* *\/ */ + +/* { */ +/* .layout = "us", */ +/* .options = "compose:ralt ctrl:nocaps grp:alt_shift_toggle" */ +/* }, */ +/* { */ +/* .layout = "cz", */ +/* .variant = "qwerty", */ +/* .options = "compose:ralt ctrl:nocaps grp:alt_shift_toggle" */ +/* }, */ +/* }; */ + +static const struct xkb_rule_names xkb_rules = { + .layout = "us,cz", + .variant = ",qwerty", + .options = "compose:ralt,ctrl:nocaps,grp:alt_shift_toggle", +}; + +static const int repeat_rate = 25; +static const int repeat_delay = 600; + +/* Trackpad */ +static const int tap_to_click = 1; +static const int tap_and_drag = 1; +static const int drag_lock = 1; +static const int natural_scrolling = 1; +static const int disable_while_typing = 1; +static const int left_handed = 0; +static const int middle_button_emulation = 0; +/* You can choose between: +LIBINPUT_CONFIG_SCROLL_NO_SCROLL +LIBINPUT_CONFIG_SCROLL_2FG +LIBINPUT_CONFIG_SCROLL_EDGE +LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN +*/ +static const enum libinput_config_scroll_method scroll_method = LIBINPUT_CONFIG_SCROLL_2FG; + +/* You can choose between: +LIBINPUT_CONFIG_CLICK_METHOD_NONE +LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS +LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER +*/ +static const enum libinput_config_click_method click_method = LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS; + +/* You can choose between: +LIBINPUT_CONFIG_SEND_EVENTS_ENABLED +LIBINPUT_CONFIG_SEND_EVENTS_DISABLED +LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE +*/ +static const uint32_t send_events_mode = LIBINPUT_CONFIG_SEND_EVENTS_ENABLED; + +/* You can choose between: +LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT +LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE +*/ +static const enum libinput_config_accel_profile accel_profile = LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE; +static const double accel_speed = 0.0; + +/* You can choose between: +LIBINPUT_CONFIG_TAP_MAP_LRM -- 1/2/3 finger tap maps to left/right/middle +LIBINPUT_CONFIG_TAP_MAP_LMR -- 1/2/3 finger tap maps to left/middle/right +*/ +static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TAP_MAP_LRM; + +/* If you want to use the windows key for MODKEY, use WLR_MODIFIER_LOGO */ +#define MODKEY WLR_MODIFIER_LOGO + +#define TAGKEYS(KEY,TAG) \ + { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ + { MODKEY|WLR_MODIFIER_CTRL, KEY, toggleview, {.ui = 1 << TAG} }, \ + { MODKEY|WLR_MODIFIER_SHIFT, KEY, tag, {.ui = 1 << TAG} }, \ + { MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,KEY,toggletag, {.ui = 1 << TAG} } + +/* helper for spawning shell commands in the pre dwm-5.0 fashion */ +#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } + +/* commands */ +static const char *termcmd[] = { "alacritty", NULL }; +static const char *menucmd[] = { "rofi", "-show", "drun", NULL }; + +/* named scratchpads - First arg only serves to match against key in rules*/ +static const char *scratchpadcmd_spotify[] = { + "s", "spotify", NULL, +}; + +static const char *scratchpadcmd_alacritty[] = { + "a", "alacritty", "-t", "scratchpad", NULL, +}; + +/* static const char *scratchpadcmd_notes[] = { */ +/* "a", "alacritty", "-t", "scratchpad", NULL, */ +/* }; */ + +// BEWARE! Change the hardcoded nix store path! +#define SEQUENCE_DETECTOR "sequence_detector -c $HOME/.config/dwl/sequence-detector.config.json " + +static const int monitor_order[] = { 3, 2, 1, 0 }; +#include "keys.h" +static const Key keys[] = { + /* modifier key function argument */ + { MODKEY, Key_semicolon, spawn, {.v = menucmd} }, + { MODKEY|WLR_MODIFIER_SHIFT, Key_Return, spawn, {.v = termcmd} }, + + { MODKEY, Key_j, focusstack, {.i = +1} }, + { MODKEY|WLR_MODIFIER_SHIFT, Key_j, movestack, {.i = +1} }, + { MODKEY, Key_k, focusstack, {.i = -1} }, + { MODKEY|WLR_MODIFIER_SHIFT, Key_k, movestack, {.i = -1} }, + { MODKEY, Key_comma, focusnthclient, {0} }, + { MODKEY, Key_h, setmfact, {.f = -0.05f} }, + { MODKEY, Key_l, setmfact, {.f = +0.05f} }, + { MODKEY|WLR_MODIFIER_SHIFT, Key_comma, incnmaster, {.i = +1} }, + { MODKEY|WLR_MODIFIER_SHIFT, Key_period, incnmaster, {.i = -1} }, + + { MODKEY, Key_Return, zoom, {0} }, + { MODKEY, Key_Tab, view, {0} }, + { MODKEY|WLR_MODIFIER_SHIFT, Key_c, killclient, {0} }, + + { MODKEY, Key_t, setlayout, {.v = &layouts[0]} }, + { MODKEY|WLR_MODIFIER_SHIFT, Key_t, setlayout, {.v = &layouts[3]} }, + { MODKEY, Key_f, setlayout, {.v = &layouts[1]} }, + { MODKEY, Key_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, Key_i, setlayout, {.v = &layouts[4]} }, + { MODKEY|WLR_MODIFIER_SHIFT, Key_m, togglefullscreen, {0} }, + + { MODKEY, Key_space, setlayout, {0} }, + { MODKEY|WLR_MODIFIER_SHIFT, Key_space, togglefloating, {0} }, + + { MODKEY, Key_0, view, {.ui = ~0} }, + { MODKEY|WLR_MODIFIER_SHIFT, Key_0, tag, {.ui = ~0} }, + + { MODKEY, Key_q, focusnthmon, {.i = monitor_order[0]} }, + { MODKEY, Key_w, focusnthmon, {.i = monitor_order[1]} }, + { MODKEY, Key_e, focusnthmon, {.i = monitor_order[2]} }, + { MODKEY, Key_r, focusnthmon, {.i = monitor_order[3]} }, + { MODKEY|WLR_MODIFIER_SHIFT, Key_q, tagnthmon, {.i = monitor_order[0]} }, + { MODKEY|WLR_MODIFIER_SHIFT, Key_w, tagnthmon, {.i = monitor_order[1]} }, + { MODKEY|WLR_MODIFIER_SHIFT, Key_e, tagnthmon, {.i = monitor_order[2]} }, + { MODKEY|WLR_MODIFIER_SHIFT, Key_r, tagnthmon, {.i = monitor_order[3]} }, + + + TAGKEYS( Key_1, 0), + TAGKEYS( Key_2, 1), + TAGKEYS( Key_3, 2), + TAGKEYS( Key_4, 3), + TAGKEYS( Key_5, 4), + TAGKEYS( Key_6, 5), + TAGKEYS( Key_7, 6), + TAGKEYS( Key_8, 7), + TAGKEYS( Key_9, 8), + + { 0, Key_XF86AudioStop, spawn, SHCMD(SEQUENCE_DETECTOR "-g mpris stop") }, + { 0, Key_XF86AudioPause, spawn, SHCMD(SEQUENCE_DETECTOR "-g mpris pause") }, + { 0, Key_XF86AudioPlay, spawn, SHCMD(SEQUENCE_DETECTOR "-g mpris play") }, + { 0, Key_XF86AudioNext, spawn, SHCMD(SEQUENCE_DETECTOR "-g mpris next") }, + { 0, Key_XF86AudioPrev, spawn, SHCMD(SEQUENCE_DETECTOR "-g mpris prev") }, + { 0, Key_XF86MonBrightnessUp, spawn, SHCMD("$HOME/.config/dwl/scripts/brightness.sh up") }, + { 0, Key_XF86MonBrightnessDown, spawn, SHCMD("$HOME/.config/dwl/scripts/brightness.sh down") }, + { 0, Key_Print, spawn, SHCMD("$HOME/.config/dwl/scripts/print.sh -s") }, + + { MODKEY, Key_c, togglesticky, {0} }, + { MODKEY, Key_s, entermode, {.i = SCRATCHPADS} }, + { MODKEY, Key_a, entermode, {.i = PROGRAM_LAUNCHER} }, + + /* Ctrl-Alt-Backspace and Ctrl-Alt-Fx used to be handled by X server */ + { MODKEY|WLR_MODIFIER_ALT, Key_q, quit, {0} }, + /* Ctrl-Alt-Fx is used to switch to another VT, if you don't know what a VT is + * do not remove them. + */ +#define CHVT(KEY,n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT, KEY, chvt, {.ui = (n)} } + CHVT(Key_F1, 1), CHVT(Key_F2, 2), CHVT(Key_F3, 3), CHVT(Key_F4, 4), + CHVT(Key_F5, 5), CHVT(Key_F6, 6), CHVT(Key_F7, 7), CHVT(Key_F8, 8), + CHVT(Key_F9, 9), CHVT(Key_F10, 10), CHVT(Key_F11, 11), CHVT(Key_F12, 12), +}; + +#define EMACS(cmd) SHCMD("emacsclient -nc " cmd) +static const Modekey modekeys[] = { + /* mode modifier key function argument */ + { SCRATCHPADS, { 0, Key_s, focusortogglematchingscratch, {.v = scratchpadcmd_spotify} } }, + { SCRATCHPADS, { 0, Key_s, entermode, {.i = NORMAL} } }, + { SCRATCHPADS, { 0, Key_t, focusortogglematchingscratch, {.v = scratchpadcmd_alacritty} } }, + { SCRATCHPADS, { 0, Key_t, entermode, {.i = NORMAL} } }, + { SCRATCHPADS, { 0, Key_Escape, entermode, {.i = NORMAL} } }, + + { PROGRAM_LAUNCHER, { 0, Key_e, spawn, EMACS("")} }, + { PROGRAM_LAUNCHER, { 0, Key_e, entermode, {.i = NORMAL} } }, + { PROGRAM_LAUNCHER, { 0, Key_d, spawn, EMACS("--eval \"'(dired nil)\"")} }, + { PROGRAM_LAUNCHER, { 0, Key_d, entermode, {.i = NORMAL} } }, + { PROGRAM_LAUNCHER, { 0, Key_t, spawn, EMACS("--eval \"'(vterm)\"")} }, + { PROGRAM_LAUNCHER, { 0, Key_t, entermode, {.i = NORMAL} } }, + + { PROGRAM_LAUNCHER, { 0, Key_Escape, entermode, {.i = NORMAL} } }, +}; + +static const Button buttons[] = { + { MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} }, + { MODKEY, BTN_MIDDLE, togglefloating, {0} }, + { MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize} }, +}; diff --git a/home/modules/profiles/desktop/dwl/default.nix b/home/modules/profiles/desktop/dwl/default.nix new file mode 100644 index 0000000..3ac96ce --- /dev/null +++ b/home/modules/profiles/desktop/dwl/default.nix @@ -0,0 +1,153 @@ +{ lib, inputs, config, pkgs, ... }: + +let +in { + imports = [ + ]; + + options = { + profiles.desktop.dwl = { + enable = lib.mkEnableOption "dwl"; + }; + }; + + config = lib.mkIf config.profiles.desktop.dwl.enable { + profiles.desktop.enable = true; + systemd.user.targets.wlr-session = { + Unit = { + Description = "A target that is enabled when starting Dwl"; + Requires = [ "graphical-session.target" "wm-services.target" ]; + PartOf = [ "graphical-session.target" ]; + }; + }; + + home.file.".sessions/start-dwl".source = pkgs.writeShellScript "start-dwl" '' + export XDG_CURRENT_DESKTOP="wlroots" + export GDK_BACKEND=wayland QT_QPA_PLATFORM=wayland + dwl -s "${pkgs.writeShellScript "dwl-internal" '' + dbus-update-activation-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP DISPLAY + systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP DISPLAY + systemctl start --user wlr-session.target + ''}" & + pid=$! + # Put something here + wait $pid + systemctl stop --user graphical-session.target + ''; + + home.file.".config/dwl/scripts/brightness.sh".source = ../qtile/config/brightness.sh; + home.file.".config/dwl/scripts/print.sh".source = pkgs.writeShellScript "print.sh" '' + #!/bin/sh -e + + out="$HOME/screens/$(date +%Y/%Y%m%d_%H%M%S).png" + + while getopts o:s arg; do case $arg in + o) out="$OPTARG" ;; + s) sel="$(slurp -o)" ;; + ?|*) echo "usage: shot [-s] [-o out]" >&2; exit 1 ;; + esac; done + + grim ''${sel:+ -g "$sel"} "$out" + echo "$out" + wl-copy -t image/png < "$out" + ''; + home.file.".config/dwl/sequence-detector.config.json".source = ../qtile/config/sequence-detector.config.json; + + home.packages = [ + pkgs.cliphist + pkgs.wl-clipboard + pkgs.grim + pkgs.slurp + # pkgs.wldash + pkgs.imv + inputs.self.packages.${pkgs.system}.dwlb + inputs.self.packages.${pkgs.system}.dwlmsg + pkgs.waylock + pkgs.wlr-randr + pkgs.wlrctl + + ((pkgs.dwl.override { + conf = ./config.h; + }).overrideAttrs (oldAttrs: { + buildInputs = oldAttrs.buildInputs ++ [ + pkgs.libdrm + pkgs.fcft + ]; + src = pkgs.fetchFromGitHub { + owner = "Rutherther"; + repo = "dwl"; + rev = "3c1dea9f64747d325cd64a9ec53a831e38870763"; + hash = "sha256-yi1zvcA61xy9tXdGr7Y3vk8IIt54In9hTn9a9RcGH0U="; + }; + })) + ]; + + xdg.portal = { + enable = true; + configPackages = [ pkgs.xdg-desktop-portal-wlr ]; + extraPortals = [ pkgs.xdg-desktop-portal-wlr ]; + }; + + services.kanshi = { + enable = true; + systemdTarget = "wlr-session.target"; + profiles = { + ntb = { + outputs = [ + { criteria = "eDP-1"; mode = "1920x1200"; } + ]; + }; + # docked-lid-open = { + # outputs = [ + # { criteria = "DP-7"; position = "1920,0"; } + # { criteria = "DP-8"; position = "3840,0"; } + # { criteria = "DP-9"; position = "0,0"; } + # { criteria = "eDP-1"; mode = "1920x1200"; position = "1920,1080"; } + # ]; + # }; + docked-lid-closed = { + outputs = [ + { criteria = "DP-7"; position = "1920,0"; } + { criteria = "DP-8"; position = "3840,0"; } + { criteria = "DP-9"; position = "0,0"; } + { criteria = "eDP-1"; status = "disable"; } + ]; + }; + }; + }; + + services.gammastep = { + enable = true; + temperature.night = 3000; + latitude = 50.2332933; + longitude = 14.3225926; + }; + + systemd.user.services.gammastep = { + Unit.After = lib.mkForce [ "wlr-session.target" ]; + Unit.PartOf = lib.mkForce [ "wlr-session.target" ]; + Install.WantedBy = lib.mkForce [ "wlr-session.target" ]; + }; + + programs.waybar = { + enable = true; + package = pkgs.waybar.overrideAttrs (oldAttrs: { + patches = (oldAttrs.patches or []) ++ [ + (pkgs.fetchpatch { + url = "https://github.com/Rutherther/Waybar/commit/98b08880409cfd1277dc491b2f89de39a5107e50.patch"; + hash = "sha256-qnMnjL8ejGEO9SeIEclez1OISY7poKimr4Hu+ngKnxA="; + }) + ]; + }); + systemd = { + enable = true; + target = "wlr-session.target"; + }; + style = ./waybar/style.css; + }; + + xdg.configFile."waybar/config.jsonc".source = ./waybar/config.jsonc; + # xdg.configFile."waybar/style.css".source = ./waybar/style.css; + + }; +} diff --git a/home/modules/profiles/desktop/dwl/waybar/config.jsonc b/home/modules/profiles/desktop/dwl/waybar/config.jsonc new file mode 100644 index 0000000..e913be1 --- /dev/null +++ b/home/modules/profiles/desktop/dwl/waybar/config.jsonc @@ -0,0 +1,237 @@ +// -*- mode: jsonc -*- +[ +{ + "ipc": true, + // "layer": "top", // Waybar at top layer + // "position": "bottom", // Waybar position (top|bottom|left|right) + "height": 20, // Waybar height (to be removed for auto height) + // "width": 1280, // Waybar width + "spacing": 4, // Gaps between modules (4px) + // Choose the order of the modules + "modules-left": [ + "dwl/tags" + ], + "modules-center": [ + "dwl/window" + ], + "modules-right": [ + "mpd", + "idle_inhibitor", + //"pulseaudio", + "network", + "power-profiles-daemon", + "cpu", + "memory", + "temperature", + "backlight", + "keyboard-state", + "sway/language", + "battery", + "clock", + "tray" + ], + "dwl/tags": { + "num-tags": 9 + }, + "dwl/window": { + "format": "{title}", + "max-length": 50, + "rewrite": { + "(.*) - Mozilla Firefox": "🌎 $1", + "(.*) — Mozilla Firefox": "🌎 $1" + } + }, + // Modules configuration + // "sway/workspaces": { + // "disable-scroll": true, + // "all-outputs": true, + // "warp-on-scroll": false, + // "format": "{name}: {icon}", + // "format-icons": { + // "1": "", + // "2": "", + // "3": "", + // "4": "", + // "5": "", + // "urgent": "", + // "focused": "", + // "default": "" + // } + // }, + "keyboard-state": { + "numlock": true, + "capslock": true, + "format": "{name} {icon}", + "format-icons": { + "locked": "", + "unlocked": "" + } + }, + "sway/mode": { + "format": "{}" + }, + "sway/scratchpad": { + "format": "{icon} {count}", + "show-empty": false, + "format-icons": ["", ""], + "tooltip": true, + "tooltip-format": "{app}: {title}" + }, + "mpd": { + "format": "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ⸨{songPosition}|{queueLength}⸩ {volume}% ", + "format-disconnected": "Disconnected ", + "format-stopped": "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped ", + "unknown-tag": "N/A", + "interval": 5, + "consume-icons": { + "on": " " + }, + "random-icons": { + "off": " ", + "on": " " + }, + "repeat-icons": { + "on": " " + }, + "single-icons": { + "on": "1 " + }, + "state-icons": { + "paused": "", + "playing": "" + }, + "tooltip-format": "MPD (connected)", + "tooltip-format-disconnected": "MPD (disconnected)" + }, + "idle_inhibitor": { + "format": "{icon}", + "format-icons": { + "activated": "", + "deactivated": "" + } + }, + "tray": { + // "icon-size": 21, + "spacing": 10 + }, + "clock": { + // "timezone": "America/New_York", + "interval": 1, + "tooltip-format": "{:%Y %B}\n{calendar}", + "format-alt": "{:%Y-%m-%d}", + "format": "{:%Y-%m-%d %H:%M:%S}" + }, + "cpu": { + "format": "{usage}% ", + "tooltip": false + }, + "memory": { + "format": "{}% " + }, + "temperature": { + // "thermal-zone": 2, + // "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input", + "critical-threshold": 80, + // "format-critical": "{temperatureC}°C {icon}", + "format": "{temperatureC}°C {icon}", + "format-icons": ["", "", ""] + }, + "backlight": { + // "device": "acpi_video1", + "format": "{percent}% {icon}", + "format-icons": ["", "", "", "", "", "", "", "", ""] + }, + "battery": { + "states": { + // "good": 95, + "warning": 30, + "critical": 15 + }, + "format": "{capacity}% {icon}", + "format-full": "{capacity}% {icon}", + "format-charging": "{capacity}% ", + "format-plugged": "{capacity}% ", + "format-alt": "{time} {icon}", + // "format-good": "", // An empty format will hide the module + // "format-full": "", + "format-icons": ["", "", "", "", ""] + }, + "battery#bat2": { + "bat": "BAT2" + }, + "power-profiles-daemon": { + "format": "{icon}", + "tooltip-format": "Power profile: {profile}\nDriver: {driver}", + "tooltip": true, + "format-icons": { + "default": "", + "performance": "", + "balanced": "", + "power-saver": "" + } + }, + "network": { + // "interface": "wlp2*", // (Optional) To force the use of this interface + "format-wifi": "{essid} ({signalStrength}%) ", + "format-ethernet": "{ipaddr}/{cidr} ", + "tooltip-format": "{ifname} via {gwaddr} ", + "format-linked": "{ifname} (No IP) ", + "format-disconnected": "Disconnected ⚠", + "format-alt": "{ifname}: {ipaddr}/{cidr}" + }, + "pulseaudio": { + // "scroll-step": 1, // %, can be a float + "format": "{volume}% {icon} {format_source}", + "format-bluetooth": "{volume}% {icon} {format_source}", + "format-bluetooth-muted": " {icon} {format_source}", + "format-muted": " {format_source}", + "format-source": "{volume}% ", + "format-source-muted": "", + "format-icons": { + "headphone": "", + "hands-free": "", + "headset": "", + "phone": "", + "portable": "", + "car": "", + "default": ["", "", ""] + }, + "on-click": "pavucontrol" + }, + "custom/media": { + "format": "{icon} {}", + "return-type": "json", + "max-length": 40, + "format-icons": { + "spotify": "", + "default": "🎜" + }, + "escape": true, + "exec": "$HOME/.config/waybar/mediaplayer.py 2> /dev/null" // Script in resources folder + // "exec": "$HOME/.config/waybar/mediaplayer.py --player spotify 2> /dev/null" // Filter player based on name + } +}//, +//{ +// "position": "bottom", +// "modules-left": [ +// "wlr/taskbar" +// ], +// "wlr/taskbar": { +// "format": "{icon}", +// "icon-size": 14, +// "icon-theme": "Numix-Circle", +// "tooltip-format": "{title}", +// "on-click": "activate", +// "on-click-middle": "close", +// "ignore-list": [ +// ], +// "app_ids-mapping": { +// "firefoxdeveloperedition": "firefox-developer-edition" +// }, +// "rewrite": { +// "Firefox Web Browser": "Firefox", +// "Foot Server": "Terminal" +// } +// } +// } +] diff --git a/home/modules/profiles/desktop/dwl/waybar/style.css b/home/modules/profiles/desktop/dwl/waybar/style.css new file mode 100644 index 0000000..71cb450 --- /dev/null +++ b/home/modules/profiles/desktop/dwl/waybar/style.css @@ -0,0 +1,345 @@ +* { + /* `otf-font-awesome` is required to be installed for icons */ + font-family: FontAwesome, Roboto, Helvetica, Arial, sans-serif; + font-size: 13px; +} + +window#waybar { + background-color: rgba(43, 48, 59, 0.5); + color: #ffffff; + transition-property: background-color; + transition-duration: .5s; +} + +window#waybar.hidden { + opacity: 0.2; +} + +/* +window#waybar.empty { + background-color: transparent; +} +window#waybar.solo { + background-color: #FFFFFF; +} +*/ + +window#waybar.termite { + background-color: #3F3F3F; +} + +window#waybar.chromium { + background-color: #000000; + border: none; +} + +button { + /* Use box-shadow instead of border so the text isn't offset */ + box-shadow: inset 0 -3px transparent; + /* Avoid rounded borders under each button name */ + border: none; + border-radius: 0; +} + +/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */ +button:hover { + background: inherit; + box-shadow: inset 0 -3px #ffffff; +} + +#workspaces button { + padding: 0 5px; + background-color: transparent; + color: #ffffff; +} + +#workspaces button:hover { + background: rgba(0, 0, 0, 0.2); +} + +#workspaces button.focused { + background-color: #64727D; + box-shadow: inset 0 -3px #ffffff; +} + +#workspaces button.urgent { + background-color: #eb4d4b; +} + +#mode { + background-color: #64727D; + box-shadow: inset 0 -3px #ffffff; +} + +#clock, +#battery, +#cpu, +#memory, +#disk, +#temperature, +#backlight, +#network, +#pulseaudio, +#wireplumber, +#custom-media, +#tray, +#mode, +#idle_inhibitor, +#scratchpad, +#power-profiles-daemon, +#mpd { + padding: 0 10px; + color: #ffffff; +} + +#window, +#workspaces { + margin: 0 4px; +} + +/* If workspaces is the leftmost module, omit left margin */ +.modules-left > widget:first-child > #workspaces { + margin-left: 0; +} + +/* If workspaces is the rightmost module, omit right margin */ +.modules-right > widget:last-child > #workspaces { + margin-right: 0; +} + +#clock { + background-color: #64727D; +} + +#battery { + background-color: #ffffff; + color: #000000; +} + +#battery.charging, #battery.plugged { + color: #ffffff; + background-color: #26A65B; +} + +@keyframes blink { + to { + background-color: #ffffff; + color: #000000; + } +} + +/* Using steps() instead of linear as a timing function to limit cpu usage */ +#battery.critical:not(.charging) { + background-color: #f53c3c; + color: #ffffff; + animation-name: blink; + animation-duration: 0.5s; + animation-timing-function: steps(12); + animation-iteration-count: infinite; + animation-direction: alternate; +} + +#power-profiles-daemon { + padding-right: 15px; +} + +#power-profiles-daemon.performance { + background-color: #f53c3c; + color: #ffffff; +} + +#power-profiles-daemon.balanced { + background-color: #2980b9; + color: #ffffff; +} + +#power-profiles-daemon.power-saver { + background-color: #2ecc71; + color: #000000; +} + +label:focus { + background-color: #000000; +} + +#cpu { + background-color: #2ecc71; + color: #000000; +} + +#memory { + background-color: #9b59b6; +} + +#disk { + background-color: #964B00; +} + +#backlight { + background-color: #90b1b1; +} + +#network { + background-color: #2980b9; +} + +#network.disconnected { + background-color: #f53c3c; +} + +#pulseaudio { + background-color: #f1c40f; + color: #000000; +} + +#pulseaudio.muted { + background-color: #90b1b1; + color: #2a5c45; +} + +#wireplumber { + background-color: #fff0f5; + color: #000000; +} + +#wireplumber.muted { + background-color: #f53c3c; +} + +#custom-media { + background-color: #66cc99; + color: #2a5c45; + min-width: 100px; +} + +#custom-media.custom-spotify { + background-color: #66cc99; +} + +#custom-media.custom-vlc { + background-color: #ffa000; +} + +#temperature { + background-color: #f0932b; +} + +#temperature.critical { + background-color: #eb4d4b; +} + +#tray { + background-color: #2980b9; +} + +#tray > .passive { + -gtk-icon-effect: dim; +} + +#tray > .needs-attention { + -gtk-icon-effect: highlight; + background-color: #eb4d4b; +} + +#idle_inhibitor { + background-color: #2d3436; +} + +#idle_inhibitor.activated { + background-color: #ecf0f1; + color: #2d3436; +} + +#mpd { + background-color: #66cc99; + color: #2a5c45; +} + +#mpd.disconnected { + background-color: #f53c3c; +} + +#mpd.stopped { + background-color: #90b1b1; +} + +#mpd.paused { + background-color: #51a37a; +} + +#language { + background: #00b093; + color: #740864; + padding: 0 5px; + margin: 0 5px; + min-width: 16px; +} + +#keyboard-state { + background: #97e1ad; + color: #000000; + padding: 0 0px; + margin: 0 5px; + min-width: 16px; +} + +#keyboard-state > label { + padding: 0 5px; +} + +#keyboard-state > label.locked { + background: rgba(0, 0, 0, 0.2); +} + +#scratchpad { + background: rgba(0, 0, 0, 0.2); +} + +#scratchpad.empty { + background-color: transparent; +} + +#privacy { + padding: 0; +} + +#privacy-item { + padding: 0 5px; + color: white; +} + +#privacy-item.screenshare { + background-color: #cf5700; +} + +#privacy-item.audio-in { + background-color: #1ca000; +} + +#privacy-item.audio-out { + background-color: #0069d4; +} + +#tags { + min-width: 0; +} + +#tags button { + min-width: 20px; + padding: 3px; + margin: 0; + color: #e4e4e4; +} + +#tags button.occupied { + background-color: #64727D; +} + +#tags button.focused-other { + background-color: #57a277; +} + +#tags button.focused { + background-color: #2980b9; + box-shadow: inset 0 -3px #1bd6e0; +} diff --git a/home/modules/profiles/desktop/qtile/launcher.nix b/home/modules/profiles/desktop/qtile/launcher.nix index 9ffca82..ad05f35 100644 --- a/home/modules/profiles/desktop/qtile/launcher.nix +++ b/home/modules/profiles/desktop/qtile/launcher.nix @@ -22,6 +22,7 @@ in programs = { rofi = { enable = true; + package = pkgs.rofi-wayland; terminal = "${config.home-config.defaultTerminalExe}"; location = "center"; font = "${config.home-config.defaultFont} 11"; diff --git a/nixos/hosts/laptop-phobos/default.nix b/nixos/hosts/laptop-phobos/default.nix index fdaeda4..ea526eb 100644 --- a/nixos/hosts/laptop-phobos/default.nix +++ b/nixos/hosts/laptop-phobos/default.nix @@ -116,6 +116,12 @@ }; }; + security.pam.services.waylock = { + text = '' + auth include login + ''; + }; + # Wireguard profiles.vpn.lanIp = "192.168.32.25"; } diff --git a/nixos/hosts/laptop-phobos/home.nix b/nixos/hosts/laptop-phobos/home.nix index dfae15a..8005207 100644 --- a/nixos/hosts/laptop-phobos/home.nix +++ b/nixos/hosts/laptop-phobos/home.nix @@ -2,5 +2,6 @@ profiles.development.enable = true; profiles.desktop.qtile.enable = true; profiles.desktop.gnome.enable = true; + profiles.desktop.dwl.enable = true; profiles.matrix.enable = true; } -- 2.48.1