diff --git a/custom/waybar/config b/custom/waybar/config new file mode 100644 index 0000000..283975d --- /dev/null +++ b/custom/waybar/config @@ -0,0 +1,152 @@ +// -*- mode: jsonc -*- +{ + "layer": "top", + "position": "bottom", + "height": 30, + // "width": 1280, // Waybar width + "spacing": 4, // Gaps between modules (4px) + // Choose the order of the modules + "modules-left": [ + "hyprland/workspaces", + ], + "modules-right": [ + "pulseaudio", + "network", + "cpu", + "memory", + "battery", + "clock", + "tray", + ], + // Modules configuration + "keyboard-state": { + "numlock": true, + "capslock": true, + "format": "{name} {icon}", + "format-icons": { + "locked": "", + "unlocked": "" + } + }, + "hyprland/mode": { + "format": "{}" + }, + "idle_inhibitor": { + "format": "{icon}", + "format-icons": { + "activated": "", + "deactivated": "" + } + }, + "tray": { + // "icon-size": 21, + "spacing": 10, + // "icons": { + // "blueman": "bluetooth", + // "TelegramDesktop": "$HOME/.local/share/icons/hicolor/16x16/apps/telegram.png" + // } + }, + "clock": { + // "timezone": "America/New_York", + "tooltip-format": "{:%Y %B}\n{calendar}", + "format-alt": "{:%Y-%m-%d}" + }, + "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": "BAT: {capacity}%", + "format-full": "FULL: {capacity}%", + "format-charging": "CHR: {capacity}%", + "format-plugged": "PLG: {capacity}%", + "format-alt": "{time} {icon}", + }, + "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} {text}", + "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 + }, + "custom/power": { + "format" : "⏻ ", + "tooltip": false, + "menu": "on-click", + "menu-file": "$HOME/.config/waybar/power_menu.xml", // Menu file in resources folder + "menu-actions": { + "shutdown": "shutdown", + "reboot": "reboot", + "suspend": "systemctl suspend", + "hibernate": "systemctl hibernate" + } + } +} diff --git a/custom/waybar/style.css b/custom/waybar/style.css new file mode 100644 index 0000000..bccab73 --- /dev/null +++ b/custom/waybar/style.css @@ -0,0 +1,324 @@ +@define-color bg-color rgb(68, 71, 90); /* #3C413C */ +@define-color bg-color-tray rgb (40, 42, 54); /* #3C4144 */ +@define-color bg-color-ws rgb (40, 42, 54); /* #3C4144 */ +@define-color bg-color-0 rgb (40, 42, 54); /* #3C4144 */ +@define-color bg-color-1 rgb(40, 42, 54); /* #475f94 */ +@define-color bg-color-2 rgb(40, 42, 54); /* #107AB0 */ +@define-color bg-color-3 rgb(40, 42, 54); /* #017374 */ +@define-color bg-color-4 rgb(40, 42, 54); /* #1F3B4D */ +@define-color bg-color-5 rgb(40, 42, 54); /* #10A674 */ +@define-color bg-color-6 rgb(40, 42, 54); /* #4984B8 */ +@define-color bg-color-7 rgb(40, 42, 54); /* #000133 */ +@define-color bg-color-8 rgb(40, 42, 54); /* #08787F */ +@define-color bg-color-9 rgb(40, 42, 54); /* #214761 */ +@define-color bg-color-10 rgb(40, 42, 54); /* #6C3461 */ +@define-color bg-color-11 rgb(40, 42, 54); /* #005249 */ +@define-color bg-color-12 rgb(40, 42, 54); /* #31668A */ +@define-color bg-color-13 rgb(40, 42, 54); /* #6A6E09 */ +@define-color bg-color-14 rgb(40, 42, 54); /* #5B7C99 */ +@define-color bg-color-15 rgb(40, 42, 54); /* #1D2021 */ +@define-color bg-color-16 rgb(40, 42, 54); /* #29293D */ + +@define-color fg-color rgb (248, 248, 242); /* #f3f4f5 */ +@define-color alert-bg-color rgb (255, 85, 85); /* #bd2c40 */ +@define-color alert-fg-color rgb (248, 248, 242); /* #FFFFFF */ +@define-color inactive-fg-color rgb(144, 153, 162); /* #9099a2 */ +@define-color inactive-bg-color rgb(68, 71, 90); /* #404552 */ + +* { + border: none; + border-radius: 0; + font-family: Dejavu Sans Mono, FontAwesome, Material Icons, sans-serif; + font-size: 16px; + min-height: 0; + opacity: 1.0; + +} + +window#waybar { + background-color: rgba(40, 42, 54, 0.5); + border-bottom: none; + color: @fg-color; + transition-property: background-color; + transition-duration: .5s; +} + +window#waybar.hidden { + opacity: 0.4; +} + +window#waybar.termite { + background-color: @bg-color; +} + +window#waybar.chromium { + background-color: @bg-color; + border: none; +} + +#workspaces button { + padding: 0 5px; + background-color: transparent; + color: @fg-color; + border-bottom: 3px solid transparent; +} + +/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */ +#workspaces button:hover { + background: rgba(0, 0, 0, 0.2); + box-shadow: inherit; + border-bottom: 3px solid @fg-color; +} + +#workspaces button.active { + background-color: @bg-color; + border-bottom: 3px solid @fg-color; +} + +#workspaces button.urgent { + background-color: @alert-bg-color; +} + +#mode { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color; + border-bottom: 3px solid @fg-color; +} + +#tray { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-tray; + color: @fg-color; +} + + +#clock { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-1; + color: @fg-color; +} + +#custom-weather { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-2; + color: @fg-color; +} + +#custom-covid { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-16; + color: @fg-color; +} + +#backlight { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-3; + color: @fg-color; +} + +#battery { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-4; + color: @fg-color; +} +#battery.charging { + color: @fg-color; + background-color: @bg-color; +} +#battery.warning:not(.charging) { + color: @alert-fg-color; + background-color: @alert-bg-color; +} +#battery.critical:not(.charging) { + background-color: @alert-bg-color; + color: @fg-color; + animation-name: blink; + animation-duration: 0.5s; + animation-timing-function: linear; + animation-iteration-count: infinite; + animation-direction: alternate; +} + +#custom-bat0, +#custom-bat0.charging { + padding: 0 10px; + margin: 0 4px; + color: @fg-color; + background-color: @bg-color-10; +} +#custom-bat0.warning:not(.charging):not(.full) { + color: @alert-fg-color; + background-color: @alert-bg-color; +} +#custom-bat0.critical:not(.charging):not(.full) { + background-color: @alert-bg-color; + color: @fg-color; + animation-name: blink; + animation-duration: 0.5s; + animation-timing-function: linear; + animation-iteration-count: infinite; + animation-direction: alternate; +} + +#network { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-6; + color: @fg-color; +} + +#bluetooth { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-6; + color: @fg-color; +} + +#custom-vpn { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-6; + color: @fg-color; +} + +#pulseaudio { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-12; + color: @fg-color; +} + +#temperature { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-7; + color: @fg-color; +} + +#backlight { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-8; + color: @fg-color; +} + +#pulseaudio { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-9; + color: @fg-color; +} + +#custom-media { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-10; + color: @fg-color; +} + +#cpu { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-13; + color: @fg-color; +} + +#memory { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-5; + color: @fg-color; +} + +#idle_inhibitor { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-14; + color: @fg-color; +} + +#mpd { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-15; + color: @fg-color; +} + +#custom-spotify { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-15; + color: @fg-color; +} + +#custom-kbd { + padding: 0 10px; + margin: 0 4px; + background-color: @bg-color-11; + color: @fg-color; +} + +#custom-kbd.none { + background-color: transparent; + color: transparent; +} + +@keyframes blink { + to { + background-color: @fg-color; + color: @bg-color; + } +} + +label:focus { + background-color: @bg-color; +} + +#network.disconnected { + background-color: @alert-bg-color; +} + +#custom-vpn.disconnected { + background-color: @alert-bg-color; +} + +#pulseaudio.muted { + background-color: @inactive-bg-color; + color: @inactive-fg-color; +} + +#custom-media.custom-vlc { + background-color: @bg-color; +} + +#temperature.critical { + background-color: @alert-bg-color; +} + +#idle_inhibitor.activated { + background-color: @fg-color; + color: @bg-color; +} + +#mpd.disconnected { + background-color: transparent; + color: transparent; +} + +#mpd.stopped { + background-color: transparent; + color: transparent; +} + +#mpd.paused { + background-color: @inactive-bg-color; + color: @inactive-fg-color; +} + diff --git a/nix/flake.lock b/nix/flake.lock index c19e1d7..638e9be 100644 --- a/nix/flake.lock +++ b/nix/flake.lock @@ -19,11 +19,11 @@ "flake-compat": { "flake": false, "locked": { - "lastModified": 1733328505, - "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", + "lastModified": 1747046372, + "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", "owner": "edolstra", "repo": "flake-compat", - "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", + "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885", "type": "github" }, "original": { @@ -39,11 +39,11 @@ ] }, "locked": { - "lastModified": 1747834438, - "narHash": "sha256-AHJt79W8wADzur2htCx1U8FtEk4XjvrHb9/3iDfNedI=", + "lastModified": 1750304462, + "narHash": "sha256-Mj5t4yX05/rXnRqJkpoLZTWqgStB88Mr/fegTRqyiWc=", "owner": "nix-community", "repo": "home-manager", - "rev": "6c2eb1e24cd0e76d88bdd633ef4c50d6286586e0", + "rev": "863842639722dd12ae9e37ca83bcb61a63b36f6c", "type": "github" }, "original": { @@ -78,11 +78,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1746453552, - "narHash": "sha256-r66UGha+7KVHkI7ksrcMjnw/mm9Sg4l5bQlylxHwdGU=", + "lastModified": 1749574455, + "narHash": "sha256-fm2/8KPOYvvIAnNVtjDlTt/My00lIbZQ+LMrfQIWVzs=", "owner": "nix-community", "repo": "NixOS-WSL", - "rev": "be618645aa0adf461f778500172b6896d5ab2d01", + "rev": "917af390377c573932d84b5e31dd9f2c1b5c0f09", "type": "github" }, "original": { @@ -94,11 +94,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1742937945, - "narHash": "sha256-lWc+79eZRyvHp/SqMhHTMzZVhpxkRvthsP1Qx6UCq0E=", + "lastModified": 1749173751, + "narHash": "sha256-ENY3y3v6S9ZmLDDLI3LUT8MXmfXg/fSt2eA4GCnMVCE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "d02d88f8de5b882ccdde0465d8fa2db3aa1169f7", + "rev": "ed29f002b6d6e5e7e32590deb065c34a31dc3e91", "type": "github" }, "original": { @@ -110,11 +110,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1747744144, - "narHash": "sha256-W7lqHp0qZiENCDwUZ5EX/lNhxjMdNapFnbErcbnP11Q=", + "lastModified": 1750134718, + "narHash": "sha256-v263g4GbxXv87hMXMCpjkIxd/viIF7p3JpJrwgKdNiI=", "owner": "nixos", "repo": "nixpkgs", - "rev": "2795c506fe8fb7b03c36ccb51f75b6df0ab2553f", + "rev": "9e83b64f727c88a7711a2c463a7b16eedb69a84c", "type": "github" }, "original": { diff --git a/nix/hosts/tux/configuration.nix b/nix/hosts/tux/configuration.nix index 5c51264..fc09da2 100644 --- a/nix/hosts/tux/configuration.nix +++ b/nix/hosts/tux/configuration.nix @@ -39,7 +39,8 @@ wheelNeedsPassword = false; }; - i3.enable = true; + # i3.enable = true; + desktop.enable = true; kanata.enable = true; services.flatpak.enable = true; diff --git a/nix/modules/commonPackages.nix b/nix/modules/commonPackages.nix index 931af8f..c058cf3 100644 --- a/nix/modules/commonPackages.nix +++ b/nix/modules/commonPackages.nix @@ -39,7 +39,7 @@ fzf lune awscli2 - deno + # deno jq nfs-utils bluetui diff --git a/nix/modules/default.nix b/nix/modules/default.nix index 388c945..a5c4575 100644 --- a/nix/modules/default.nix +++ b/nix/modules/default.nix @@ -13,5 +13,6 @@ ./pipewire.nix ./keys.nix ./rofi.nix + ./desktop.nix ]; } diff --git a/nix/modules/desktop.nix b/nix/modules/desktop.nix new file mode 100644 index 0000000..3fdf43c --- /dev/null +++ b/nix/modules/desktop.nix @@ -0,0 +1,164 @@ +{ + pkgs, + lib, + config, + ... +}: + +{ + options.desktop = { + enable = lib.mkEnableOption "enable desktop"; + }; + + config = lib.mkIf config.desktop.enable { + environment.systemPackages = with pkgs; [ + vscode-fhs + pavucontrol + vlc + vinegar + wine64 + vesktop + firefox + brightnessctl + flameshot + jellyfin-media-player + anki-bin + mpv + ahk_x11 + prismlauncher + feh + dconf + rofi + papirus-icon-theme + pa_applet + libnotify + adwaita-icon-theme + ]; + programs.thunar.enable = true; + programs.hyprland.enable = true; + services.tumbler.enable = true; + # services.displayManager.ly.enable = true; + rofi.enable = true; + + home-manager.users.luca = { + programs = { + ghostty = { + enable = true; + settings = { + "shell-integration-features" = "no-cursor"; + "background-opacity" = 0.85; + "cursor-style" = "block"; + "cursor-style-blink" = false; + "font-size" = 15; + }; + }; + waybar = { + enable = true; + systemd.enable = true; + }; + }; + xdg.configFile = { + "waybar".source = ../../custom/waybar; + }; + services.dunst = { + enable = true; + configFile = ../../custom/dunst/dunstrc; + }; + gtk = { + enable = true; + theme.name = "Adwaita-dark"; + gtk4.extraConfig = { + gtk-application-prefer-dark-theme = true; + }; + }; + qt = { + enable = true; + style.name = "adwaita-dark"; + }; + + wayland.windowManager.hyprland = { + enable = true; + xwayland.enable = true; + systemd.enable = true; + plugins = with pkgs; [ + hyprlandPlugins.hy3 + ]; + settings = { + "$mod" = "SUPER"; + "$terminal" = "ghostty"; + "$menu" = "rofi -show drun -theme ~/.config/rofi/launcher.rasi"; + bind = [ + "$mod, Return, exec, $terminal" + "$mod SHIFT, Q, killactive" + "$mod SHIFT, E, exit" + "$mod SHIFT, SPACE, togglefloating" + "$mod, d, exec, $menu" + "$mod, h, movefocus, l" + "$mod, l, movefocus, r" + "$mod, k, movefocus, u" + "$mod, j, movefocus, d" + + "$mod, 1, workspace, 1" + "$mod, 2, workspace, 2" + "$mod, 3, workspace, 3" + "$mod, 4, workspace, 4" + "$mod, 5, workspace, 5" + "$mod, 6, workspace, 6" + "$mod, 7, workspace, 7" + "$mod, 8, workspace, 8" + "$mod, 9, workspace, 9" + "$mod, 0, workspace, 10" + "$mod SHIFT, 1, movetoworkspace, 1" + "$mod SHIFT, 2, movetoworkspace, 2" + "$mod SHIFT, 3, movetoworkspace, 3" + "$mod SHIFT, 4, movetoworkspace, 4" + "$mod SHIFT, 5, movetoworkspace, 5" + "$mod SHIFT, 6, movetoworkspace, 6" + "$mod SHIFT, 7, movetoworkspace, 7" + "$mod SHIFT, 8, movetoworkspace, 8" + "$mod SHIFT, 9, movetoworkspace, 9" + "$mod SHIFT, 0, movetoworkspace, 10" + ]; + bindm = [ + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizewindow" + ]; + bindel = [ + ",XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+" + ",XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" + ",XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" + ",XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle" + ",XF86MonBrightnessUp, exec, bash -c 'brightnessctl s +5% && perc=$(( \$(brightnessctl get) * 100 / \$(brightnessctl max) )) && notify-send \"Brightness\" -h int:value:\$perc'" + ",XF86MonBrightnessDown, exec, bash -c 'brightnessctl s 5%- && perc=$(( \$(brightnessctl get) * 100 / \$(brightnessctl max) )) && notify-send \"Brightness\" -h int:value:\$perc'" + ]; + general = { + gaps_in = 0; + gaps_out = 0; + }; + decoration = { + rounding = 0; + blur = { + enabled = false; + }; + }; + env = [ + "XCURSOR_THEME, Adwaita" + "XCURSOR_SIZE,24" + ]; + monitor = [ + "eDP-1, 1920x1080, 0x0, 1" + ]; + input = { + kb_layout = "us"; + touchpad = { + natural_scroll = true; + }; + }; + animations = { + enabled = false; + }; + }; + }; + }; + }; +}