pełna konfiguracja noctalia i czystka waybar, swaync, wlogout i skryptów

This commit is contained in:
2026-02-02 21:23:05 +01:00
parent 80d7fc08cc
commit e5b5d68808
117 changed files with 1041 additions and 6119 deletions

View File

@@ -22,8 +22,8 @@
pm = "uv run manage.py";
f8 = "uv run flake8 .";
bbr = "bun --bun run";
"ga." = "git add .";
mkgidf = "git add . --intent-to-add . && git diff > git-diff.txt";
zed = "MANGOHUD=0 /home/${username}/.local/bin/zed";
# Development aliases for nix flake
nd = "nix develop";

View File

@@ -1,6 +1,4 @@
{host, ...}: let
inherit (import ../../hosts/${host}/variables.nix) waybarChoice;
in {
_: {
imports = [
./bash
./chromium
@@ -8,13 +6,9 @@ in {
./hyprland
./kitty
./librewolf
./peaclock
./rofi
./noctalia
./scripts
./swaync
./vscodium
waybarChoice
./wlogout
./xdg
./zed
./anki.nix
@@ -29,10 +23,8 @@ in {
./kdeConnect.nix
./lutris.nix
./nextcloud.nix
./noctalia.nix
./obs-studio.nix
./onlyoffice.nix
./overview.nix
./qt.nix
./ssh.nix
./starship.nix

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -1,20 +0,0 @@
_: {
wayland.windowManager.hyprland.settings.animations = {
enabled = true;
bezier = [
"wind, -1.05, 0.9, 0.1, 1.05"
"winIn, -1.1, 1.1, 0.1, 1.1"
"winOut, -1.3, -0.3, 0, 1"
"liner, 0, 1, 1, 1"
];
animation = [
"windows, 0, 6, wind, slide"
"windowsIn, 0, 6, winIn, slide"
"windowsOut, 0, 5, winOut, slide"
"windowsMove, 0, 5, wind, slide"
"border, 0, 1, liner"
"fade, 0, 10, default"
"workspaces, 0, 5, wind"
];
};
}

View File

@@ -1,22 +0,0 @@
_: {
# name "Dynamic"
wayland.windowManager.hyprland.settings.animations = {
enabled = true;
bezier = [
"wind, 0.05, 0.9, 0.1, 1.05"
"winIn, 0.1, 1.1, 0.1, 1.1"
"winOut, 0.3, -0.3, 0, 1"
"liner, 1, 1, 1, 1"
];
animation = [
"windows, 1, 6, wind, slide"
"windowsIn, 1, 6, winIn, slide"
"windowsOut, 1, 5, winOut, slide"
"windowsMove, 1, 5, wind, slide"
"border, 1, 1, liner"
"borderangle, 1, 30, liner, loop"
"fade, 1, 10, default"
"workspaces, 1, 5, wind"
];
};
}

View File

@@ -1,21 +0,0 @@
_: {
# name "moving"
wayland.windowManager.hyprland.settings.animations = {
enabled = true;
bezier = [
"overshot, 0.05, 0.9, 0.1, 1.05"
"smoothOut, 0.5, 0, 0.99, 0.99"
"smoothIn, 0.5, -0.5, 0.68, 1.5"
];
animation = [
"windows, 1, 5, overshot, slide"
"windowsOut, 1, 3, smoothOut"
"windowsIn, 1, 3, smoothOut"
"windowsMove, 1, 4, smoothIn, slide"
"border, 1, 5, default"
"fade, 1, 5, smoothIn"
"fadeDim, 1, 5, smoothIn"
"workspaces, 1, 6, default"
];
};
}

View File

@@ -1,5 +1,4 @@
_: {
# Name: END-4
wayland.windowManager.hyprland.settings.animations = {
enabled = true;
bezier = [

View File

@@ -1,179 +1,160 @@
{
host,
lib,
username,
...
}: let
inherit (import ../../../hosts/${host}/variables.nix) browser terminal;
desktopEntriesPath = "/home/${username}/.local/state/home-manager/gcroots/current-home/home-path/share/applications/";
mainBinds = [
"SUPER, A, exec, anki #\"Flashcard learning application\""
"SUPER, B, exec, bitwarden #\"Password manager\""
"SUPER, C, exec, chromium #\"Ungoogled Chromium\""
"SUPER, D, exec, vesktop #\"Discord client\""
"SUPER, E, exec, noctalia-shell ipc call launcher emoji #\"Emoji picker\""
"SUPER, Escape, exec, noctalia-shell ipc call lockScreen lock #\"Lock the screen\""
"SUPER, G, exec, affinity-v3 #\"Graphics editor\""
"SUPER, I, exec, iotas #\"Note-taking app\""
"SUPER, J, exec, Jan #\"Local AI chat interface\""
"SUPER, K, exec, galculator #\"Scientific calculator\""
"SUPER, L, exec, logseq #\"Knowledge management tool\""
"SUPER, M, exec, plexamp #\"Music player for Plex\""
"SUPER, N, exec, dex ${desktopEntriesPath}/garandcloud.desktop #\"GarandCloud client\""
"SUPER, O, exec, onlyoffice-desktopeditors #\"Office suite\""
"SUPER, P, exec, plex-desktop #\"Plex media player\""
"SUPER, Return, exec, kitty #\"Kitty terminal\""
"SUPER, S, exec, steam #\"Steam Game launcher\""
"SUPER, T, exec, thunar #\"File manager\""
"SUPER, V, exec, codium #\"VS Codium\""
"SUPER, W, exec, librewolf #\"Main Web browser (Librewolf)\""
"SUPER, Z, exec, zeditor #\"Zed IDE\""
];
shiftBinds = [
"SUPER SHIFT, C, exec, dex ${desktopEntriesPath}/claude.desktop #\"Claude AI chat\""
"SUPER SHIFT, G, exec, dex ${desktopEntriesPath}/chatgpt.desktop #\"ChatGPT AI chat\""
"SUPER SHIFT, K, exec, noctalia-shell ipc call plugin:keybind-cheatsheet toggle #\"Toggle keybind cheatsheet\""
"SUPER SHIFT, M, exec, dex ${desktopEntriesPath}/messenger.desktop #\"Facebook Messenger client\""
"SUPER SHIFT, N, exec, nextcloud #\"Nextcloud desktop sync client\""
"SUPER SHIFT, O, exec, obs #\"Open Broadcaster Software\""
"SUPER SHIFT, P, exec, noctalia-shell ipc call volume togglePanel #\"Toggle volume control panel\""
"SUPER SHIFT, R, exec, restart.noctalia #\"Restart Noctalia shell\""
"SUPER SHIFT, Return, exec, noctalia-shell ipc call launcher toggle #\"Toggle application launcher\""
"SUPER SHIFT, S, exec, screenshootin #\"Take screenshot\""
"SUPER SHIFT, T, exec, tutanota-desktop #\"Tutanota encrypted email client\""
"SUPER SHIFT, V, exec, noctalia-shell ipc call launcher clipboard #\"Open clipboard manager\""
];
altBinds = [
"SUPER ALT, C, exec, noctalia-shell ipc call controlCenter toggle #\"Toggle control center\""
"SUPER ALT, G, exec, dex ${desktopEntriesPath}/glance.desktop #\"Glance server panel\""
"SUPER ALT, M, exec, dex ${desktopEntriesPath}/mastodon.desktop #\"Mastodon social network client\""
"SUPER ALT, P, exec, noctalia-shell ipc call settings toggle #\"Open settings panel\""
"SUPER ALT, S, exec, slack #\"Slack team communication tool\""
"SUPER ALT, T, exec, gedit #\"GNOME text editor\""
"SUPER ALT, W, exec, noctalia-shell ipc call wallpaper toggle #\"Toggle wallpaper\""
];
controlBinds = [
"SUPER CONTROL, C, exec, noctalia-shell ipc call powerProfile cycle #\"Cycle through power profiles\""
"SUPER CONTROL, G, exec, gimp #\"GNU Image Manipulation Program\""
"SUPER CONTROL, M, exec, mattermost-desktop #\"Mattermost team chat client\""
"SUPER CONTROL, S, exec, signal-desktop #\"Signal encrypted messaging\""
"SUPER CONTROL, P, exec, hyprpicker -a #\"Pick color from screen\""
];
windowManagementBinds = [
"SUPER, F, fullscreen, #\"Toggle fullscreen mode\""
"SUPER, Q, killactive, #\"Close active window\""
"SUPER SHIFT, I, togglesplit, #\"Toggle split layout\""
"SUPER SHIFT, F, togglefloating, #\"Toggle floating mode\""
];
windowFocusBinds = [
"SUPER, down, movefocus, d #\"Move focus down\""
"SUPER, left, movefocus, l #\"Move focus left\""
"SUPER, right, movefocus, r #\"Move focus right\""
"SUPER, up, movefocus, u #\"Move focus up\""
];
windowMovementBinds = [
"SUPER SHIFT, down, movewindow, d #\"Move window down\""
"SUPER SHIFT, left, movewindow, l #\"Move window left\""
"SUPER SHIFT, right, movewindow, r #\"Move window right\""
"SUPER SHIFT, up, movewindow, u #\"Move window up\""
];
windowSwapBinds = [
"SUPER ALT, down, swapwindow, d #\"Swap active window with window below\""
"SUPER ALT, left, swapwindow, l #\"Swap active window with window on the left\""
"SUPER ALT, right, swapwindow, r #\"Swap active window with window on the right\""
"SUPER ALT, up, swapwindow, u #\"Swap active window with window above\""
];
workspacesSwitchBinds = [
"SUPER, 0, workspace, 10 #\"Switch to workspace 10\""
"SUPER, 1, workspace, 1 #\"Switch to workspace 1\""
"SUPER, 2, workspace, 2 #\"Switch to workspace 2\""
"SUPER, 3, workspace, 3 #\"Switch to workspace 3\""
"SUPER, 4, workspace, 4 #\"Switch to workspace 4\""
"SUPER, 5, workspace, 5 #\"Switch to workspace 5\""
"SUPER, 6, workspace, 6 #\"Switch to workspace 6\""
"SUPER, 7, workspace, 7 #\"Switch to workspace 7\""
"SUPER, 8, workspace, 8 #\"Switch to workspace 8\""
"SUPER, 9, workspace, 9 #\"Switch to workspace 9\""
"SUPER CONTROL, left, workspace, e-1 #\"Switch to previous workspace\""
"SUPER CONTROL, right, workspace, e+1 #\"Switch to next workspace\""
"SUPER, mouse_down, workspace, e+1 #\"Switch to next workspace with mouse\""
"SUPER, mouse_up, workspace, e-1 #\"Switch to previous workspace with mouse\""
];
workspacesSwapBinds = [
"SUPER SHIFT, 0, movetoworkspace, 10 #\"Move active window to workspace 10\""
"SUPER SHIFT, 1, movetoworkspace, 1 #\"Move active window to workspace 1\""
"SUPER SHIFT, 2, movetoworkspace, 2 #\"Move active window to workspace 2\""
"SUPER SHIFT, 3, movetoworkspace, 3 #\"Move active window to workspace 3\""
"SUPER SHIFT, 4, movetoworkspace, 4 #\"Move active window to workspace 4\""
"SUPER SHIFT, 5, movetoworkspace, 5 #\"Move active window to workspace 5\""
"SUPER SHIFT, 6, movetoworkspace, 6 #\"Move active window to workspace 6\""
"SUPER SHIFT, 7, movetoworkspace, 7 #\"Move active window to workspace 7\""
"SUPER SHIFT, 8, movetoworkspace, 8 #\"Move active window to workspace 8\""
"SUPER SHIFT, 9, movetoworkspace, 9 #\"Move active window to workspace 9\""
];
systemMediaAndControllsBinds = [
",XF86AudioLowerVolume, exec, noctalia-shell ipc call volume decrease #\"Lower system volume\""
",XF86AudioMute, exec, noctalia-shell ipc call volume muteOutput #\"Mute audio output\""
",XF86AudioNext, exec, noctalia-shell ipc call media next #\"Next media track\""
",XF86AudioPause, exec, noctalia-shell ipc call media pause #\"Pause media playback\""
",XF86AudioPlay, exec, noctalia-shell ipc call media play #\"Play media\""
",XF86AudioPrev, exec, noctalia-shell ipc call media previous #\"Previous media track\""
",XF86AudioRaiseVolume, exec, noctalia-shell ipc call volume increase #\"Raise system volume\""
",XF86MonBrightnessDown, exec, noctalia-shell ipc call brightness decrease #\"Decrease screen brightness\""
",XF86MonBrightnessUp, exec, noctalia-shell ipc call brightness increase #\"Increase screen brightness\""
];
mkBlock = header: lines:
lib.concatLines (
["# ${header}"]
++ (map (l: "bind = ${l}") lines)
);
fullConfig = lib.concatLines [
""
(mkBlock "1. MAIN APPS" mainBinds)
(mkBlock "2. SHIFT APPS" shiftBinds)
(mkBlock "3. ALT APPS" altBinds)
(mkBlock "4. CONTROL APPS" controlBinds)
(mkBlock "5. WINDOW MANAGEMENT" windowManagementBinds)
(mkBlock "6. WINDOWS FOCUS" windowFocusBinds)
(mkBlock "7. WINDOWS MOVEMENT" windowMovementBinds)
(mkBlock "8. WINDOWS SWAP" windowSwapBinds)
(mkBlock "9. WORKSPACES SWITCH" workspacesSwitchBinds)
(mkBlock "10. WORKSPACES SWAP" workspacesSwapBinds)
(mkBlock "11. SYSTEM MEDIA & CONTROLS" systemMediaAndControllsBinds)
];
in {
wayland.windowManager.hyprland.settings = {
bind = [
# =============================================================================
# APLIKACJE - GŁÓWNE
# =============================================================================
"SUPER, A, exec, anki"
"SUPER, B, exec, bitwarden"
"SUPER, C, exec, chromium"
"SUPER, D, exec, vesktop"
"SUPER, G, exec, affinity-v3"
"SUPER, I, exec, iotas"
"SUPER, J, exec, Jan"
"SUPER, L, exec, logseq"
"SUPER, M, exec, plexamp"
"SUPER, N, exec, dex ${desktopEntriesPath}/garandcloud.desktop"
"SUPER, O, exec, obs"
"SUPER, P, exec, plex-desktop"
"SUPER, Return, exec, ${terminal}"
"SUPER, S, exec, steam"
"SUPER, T, exec, thunar"
"SUPER, V, exec, codium"
"SUPER, W, exec, ${browser}"
"SUPER, Z, exec, zeditor"
# =============================================================================
# APLIKACJE - Z SHIFT
# =============================================================================
"SUPER SHIFT, B, exec, blueman-manager"
"SUPER SHIFT, C, exec, dex ${desktopEntriesPath}/claude.desktop"
"SUPER SHIFT, G, exec, dex ${desktopEntriesPath}/chatgpt.desktop"
"SUPER SHIFT, M, exec, dex ${desktopEntriesPath}/messenger.desktop"
"SUPER SHIFT, N, exec, nextcloud"
"SUPER SHIFT, O, exec, onlyoffice-desktopeditors"
# "SUPER SHIFT, Return, exec, rofi-launcher"
"SUPER SHIFT, T, exec, tutanota-desktop"
# "SUPER SHIFT, W, exec, web-search"
# =============================================================================
# APLIKACJE - Z ALT
# =============================================================================
"SUPER ALT, G, exec, dex ${desktopEntriesPath}/glance.desktop"
"SUPER ALT, M, exec, dex ${desktopEntriesPath}/mastodon.desktop"
"SUPER ALT, S, exec, slack"
"SUPER ALT, T, exec, gedit"
# =============================================================================
# APLIKACJE - Z CONTROL
# =============================================================================
"SUPER CONTROL, G, exec, gimp"
"SUPER CONTROL, M, exec, mattermost-desktop"
"SUPER CONTROL, S, exec, signal-desktop"
# =============================================================================
# NARZĘDZIA SYSTEMOWE
# =============================================================================
"SUPER, E, exec, emopicker9000"
"SUPER, K, exec, galculator"
"SUPER ALT, W, exec, wallsetter"
"SUPER CONTROL, P, exec, hyprpicker -a"
"SUPER SHIFT, K, exec, list-keybinds"
"SUPER SHIFT, P, exec, pavucontrol"
"SUPER SHIFT, S, exec, screenshootin"
# =============================================================================
# ZARZĄDZANIE OKNAMI
# =============================================================================
"SUPER, Escape, exec, hyprlock"
"SUPER, F, fullscreen,"
"SUPER, Q, killactive,"
"SUPER CONTROL, Escape, exec, wlogout"
"SUPER SHIFT, Escape, exit,"
"SUPER SHIFT, I, togglesplit,"
"SUPER SHIFT, F, togglefloating,"
# =============================================================================
# FOKUS OKIEN
# =============================================================================
"SUPER, down, movefocus, d"
"SUPER, left, movefocus, l"
"SUPER, right, movefocus, r"
"SUPER, up, movefocus, u"
# =============================================================================
# PRZEMIESZCZANIE OKIEN
# =============================================================================
"SUPER SHIFT, down, movewindow, d"
"SUPER SHIFT, left, movewindow, l"
"SUPER SHIFT, right, movewindow, r"
"SUPER SHIFT, up, movewindow, u"
# =============================================================================
# ZAMIANA OKIEN
# =============================================================================
"SUPER ALT, down, swapwindow, d"
"SUPER ALT, left, swapwindow, l"
"SUPER ALT, right, swapwindow, r"
"SUPER ALT, up, swapwindow, u"
# =============================================================================
# WORKSPACES - PRZEŁĄCZANIE
# =============================================================================
"SUPER, 0, workspace, 10"
"SUPER, 1, workspace, 1"
"SUPER, 2, workspace, 2"
"SUPER, 3, workspace, 3"
"SUPER, 4, workspace, 4"
"SUPER, 5, workspace, 5"
"SUPER, 6, workspace, 6"
"SUPER, 7, workspace, 7"
"SUPER, 8, workspace, 8"
"SUPER, 9, workspace, 9"
"SUPER CONTROL, left, workspace, e-1"
"SUPER CONTROL, right, workspace, e+1"
"SUPER, mouse_down, workspace, e+1"
"SUPER, mouse_up, workspace, e-1"
# =============================================================================
# WORKSPACES - PRZENOSZENIE OKIEN
# =============================================================================
"SUPER SHIFT, 0, movetoworkspace, 10"
"SUPER SHIFT, 1, movetoworkspace, 1"
"SUPER SHIFT, 2, movetoworkspace, 2"
"SUPER SHIFT, 3, movetoworkspace, 3"
"SUPER SHIFT, 4, movetoworkspace, 4"
"SUPER SHIFT, 5, movetoworkspace, 5"
"SUPER SHIFT, 6, movetoworkspace, 6"
"SUPER SHIFT, 7, movetoworkspace, 7"
"SUPER SHIFT, 8, movetoworkspace, 8"
"SUPER SHIFT, 9, movetoworkspace, 9"
# =============================================================================
# MEDIA I KONTROLKI SYSTEMOWE
# =============================================================================
",XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"
",XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
",XF86AudioNext, exec, playerctl next"
",XF86AudioPause, exec, playerctl play-pause"
",XF86AudioPlay, exec, playerctl play-pause"
",XF86AudioPrev, exec, playerctl previous"
",XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+"
",XF86MonBrightnessDown, exec, brightnessctl set 5%-"
",XF86MonBrightnessUp, exec, brightnessctl set +5%"
# =============================================================================
# NOCTALIA SHELL
# =============================================================================
"SUPER SHIFT, Return, exec, noctalia-shell ipc call launcher toggle"
# "SUPER, M, Noctalia Notifications, exec, noctalia-shell ipc call notifications toggleHistory"
"SUPER SHIFT, V, exec, noctalia-shell ipc call launcher clipboard"
"SUPER ALT, P, exec, noctalia-shell ipc call settings toggle"
"SUPER ALT, L, exec, noctalia-shell ipc call sessionMenu lockAndSuspend"
"SUPER SHIFT, W, exec, noctalia-shell ipc call wallpaper toggle"
"SUPER, X, exec, noctalia-shell ipc call sessionMenu toggle"
"SUPER ALT, C, exec, noctalia-shell ipc call controlCenter toggle"
"SUPER CTRL, R, exec, noctalia-shell ipc call screenRecorder toggle"
"SUPER SHIFT, R, exec, restart.noctalia"
# =============================================================================
# NIEUŻYWANE KEYBINDY
# =============================================================================
# "SUPER SHIFT, N, exec, swaync-client -rs"
# "SUPER, P, pseudo,"
# "SUPER ALT,F, workspaceopt, allfloat"
# "SUPER SHIFT, SPACE, movetoworkspace, special"
# "SUPER, SPACE, togglespecialworkspace"
# "ALT,Tab,cyclenext"
# "ALT,Tab,bringactivetotop"
];
extraConfig = fullConfig;
bindm = [
"SUPER, mouse:272, movewindow"

View File

@@ -1,14 +1,11 @@
{host, ...}: let
inherit (import ../../../hosts/${host}/variables.nix) animChoice;
in {
_: {
imports = [
animChoice
./animations.nix
./binds.nix
./env.nix
./exec-once.nix
./hypridle.nix
./hyprland.nix
./hyprlock.nix
./pyprland.nix
./windowrules.nix
];

View File

@@ -22,10 +22,6 @@ _: {
"GDK_SCALE,1"
"QT_SCALE_FACTOR,1"
"EDITOR,nano"
# Set terminal and xdg_terminal_emulator to kitty
# To provent yazi from starting xterm when run from rofi menu
# You can set to your preferred terminal if you you like
# ToDo: Pull default terminal from config
"TERMINAL,kitty"
"XDG_TERMINAL_EMULATOR,kitty"
];

View File

@@ -1,28 +1,15 @@
{host, ...}: let
inherit
(import ../../../hosts/${host}/variables.nix)
stylixImage
;
in {
_: {
wayland.windowManager.hyprland.settings.exec-once = [
"wl-paste --type text --watch cliphist store" # Saves text
"wl-paste --type image --watch cliphist store" # Saves images
"dbus-update-activation-environment --all --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP"
"systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP"
"systemctl --user start hyprpolkitagent"
"qs -c overview" # Start quickshell-overview daemon
# "killall -q swww;sleep .5 && swww-daemon"
# "killall -q waybar;sleep .5 && waybar"
# "killall -q swaync;sleep .5 && swaync"
# "#wallsetter &"
# "pypr &"
# "nm-applet --indicator"
# "sleep 1.0 && swww img ${stylixImage}"
"killall -q waybar"
"pkill waybar"
"killall -q swaync"
"pkill swaync"
# "killall -q waybar"
# "pkill waybar"
# "killall -q swaync"
# "pkill swaync"
"noctalia-shell &"
];
}

View File

@@ -5,13 +5,8 @@ _: {
general = {
after_sleep_cmd = "hyprctl dispatch dpms on";
ignore_dbus_inhibit = false;
lock_cmd = "hyprlock";
};
listener = [
{
timeout = 900;
on-timeout = "hyprlock";
}
{
timeout = 1200;
on-timeout = "hyprctl dispatch dpms off";

View File

@@ -94,10 +94,12 @@ in {
decoration = {
rounding = 10;
rounding_power = 2;
blur = {
enabled = true;
size = 5;
passes = 3;
vibrancy = 0.1696;
ignore_opacity = false;
new_optimizations = true;
};
@@ -145,9 +147,7 @@ in {
monitor=,preferred,auto,auto
monitor=Virtual-1,1920x1080@60,auto,1
${extraMonitorSettings}
# To enable blur on waybar uncomment the line below
# Thanks to SchotjeChrisman
#layerrule = blur,waybar
layerrule = blur on, blur_popups on, ignore_alpha 0.5, match:namespace noctalia-background-\.*$
";
};
}

View File

@@ -1,47 +0,0 @@
{username, ...}: {
programs.hyprlock = {
enable = true;
settings = {
general = {
disable_loading_bar = true;
grace = 10;
hide_cursor = true;
no_fade_in = false;
};
background = [
{
path = "/home/${username}/Pictures/Wallpapers/four-elements.jpg";
blur_passes = 3;
blur_size = 8;
}
];
image = [
{
path = "/home/${username}/.config/face.jpg";
size = 150;
border_size = 4;
border_color = "rgb(0C96F9)";
rounding = -1; # Negative means circle
position = "0, 200";
halign = "center";
valign = "center";
}
];
input-field = [
{
size = "200, 50";
position = "0, -80";
monitor = "";
dots_center = true;
fade_on_empty = false;
font_color = "rgb(CFE6F4)";
inner_color = "rgb(657DC2)";
outer_color = "rgb(0D0E15)";
outline_thickness = 5;
placeholder_text = "Password...";
shadow_passes = 2;
}
];
};
};
}

View File

@@ -30,11 +30,10 @@ _: {
"tag +settings, match:class gnome-disks|wihotspot(-gui)?"
"tag +settings, match:class [Rr]ofi"
"tag +settings, match:class file-roller|org\.gnome\.FileRoller"
"tag +settings, match:class nm-applet|nm-connection-editor|blueman-manager"
"tag +settings, match:class nm-applet|nm-connection-editor"
"tag +settings, match:class pavucontrol|org\.pulseaudio\.pavucontrol|com\.saivert\.pwvucontrol"
"tag +settings, match:class nwg-look|qt5ct|qt6ct|[Yy]ad"
"tag +settings, match:class xdg-desktop-portal-gtk"
"tag +settings, match:class ?:blueman-manager-wrapped"
"tag +settings, match:class nwg-displays"
# Position and movement rules

View File

@@ -1,28 +0,0 @@
{
pkgs,
inputs,
system,
lib,
...
}: let
noctalia = inputs.noctalia.packages.${system}.default;
configDir = "${noctalia}/share/noctalia-shell";
in {
home = {
packages = with pkgs; [
noctalia
quickshell # Ensure quickshell is available for the service
];
activation.seedNoctaliaShellCode = lib.hm.dag.entryAfter ["writeBoundary"] ''
set -eu
DEST="$HOME/.config/quickshell/noctalia-shell"
SRC="${configDir}"
if [ ! -d "$DEST" ]; then
$DRY_RUN_CMD mkdir -p "$HOME/.config/quickshell"
$DRY_RUN_CMD cp -R "$SRC" "$DEST"
$DRY_RUN_CMD chmod -R u+rwX "$DEST"
fi
'';
};
}

View File

@@ -0,0 +1,33 @@
{
config,
lib,
...
}: let
stylix = config.stylix.base16Scheme;
in {
programs.noctalia-shell.colors = lib.mkForce {
mPrimary = "#${stylix.base04}";
mOnPrimary = "#${stylix.base00}";
mSecondary = "#${stylix.base05}";
mOnSecondary = "#${stylix.base00}";
mTertiary = "#${stylix.base03}";
mOnTertiary = "#${stylix.base00}";
mError = "#${stylix.base02}";
mOnError = "#${stylix.base00}";
mSurface = "#${stylix.base01}";
mOnSurface = "#${stylix.base0E}";
mSurfaceVariant = "#${stylix.base00}";
mOnSurfaceVariant = "#${stylix.base0A}";
mOutline = "#${stylix.base08}";
mShadow = "#${stylix.base00}";
mOnHover = "#${stylix.base0B}";
mHover = "#${stylix.base00}";
};
}

View File

@@ -0,0 +1,21 @@
{
lib,
inputs,
system,
...
}: {
programs.noctalia-shell = {
enable = true;
package = inputs.noctalia.packages.${system}.default.override {
calendarSupport = true;
};
systemd.enable = true;
settings.settingsVersion = lib.mkForce 46;
};
imports = [
./settings
./colors.nix
./plugins.nix
];
}

View File

@@ -0,0 +1,40 @@
{lib, ...}: {
programs.noctalia-shell = lib.mkForce {
plugins = {
sources = [
{
enabled = true;
name = "Noctalia Plugins";
url = "https://github.com/noctalia-dev/noctalia-plugins";
}
];
states = {
mini-docker = {
enabled = true;
sourceUrl = "https://github.com/noctalia-dev/noctalia-plugins";
};
timer = {
enabled = true;
sourceUrl = "https://github.com/noctalia-dev/noctalia-plugins";
};
keybind-cheatsheet = {
enabled = true;
sourceUrl = "https://github.com/noctalia-dev/noctalia-plugins";
};
};
version = 1;
};
pluginSettings = {
mini-docker.refreshInterval = 5000;
timer.compactMode = true;
keybind-cheatsheet = {
niriConfigPath = "~/.config/niri/config.kdl";
hyprlandConfigPath = "~/.config/hypr/hyprland.conf";
modKeyVariable = "SUPER";
windowHeight = 850;
windowWidth = 700;
autoHeight = true;
};
};
};
}

View File

@@ -0,0 +1,25 @@
{lib, ...}: {
programs.noctalia-shell.settings.appLauncher = lib.mkForce {
enableClipboardHistory = true;
autoPasteClipboard = false;
enableClipPreview = true;
clipboardWrapText = true;
clipboardWatchTextCommand = "wl-paste --type text --watch cliphist store";
clipboardWatchImageCommand = "wl-paste --type image --watch cliphist store";
position = "center";
pinnedApps = [];
useApp2Unit = true;
sortByMostUsed = true;
terminalCommand = "kitty -e";
customLaunchPrefixEnabled = false;
customLaunchPrefix = "";
viewMode = "list";
showCategories = true;
iconMode = "native";
showIconBackground = false;
enableSettingsSearch = true;
enableWindowsSearch = true;
ignoreMouseInput = false;
screenshotAnnotationTool = "";
};
}

View File

@@ -0,0 +1,11 @@
{lib, ...}: {
programs.noctalia-shell.settings.audio = lib.mkForce {
"volumeStep" = 5;
"volumeOverdrive" = true;
"cavaFrameRate" = 144;
"visualizerType" = "linear";
"mprisBlacklist" = [];
"preferredPlayer" = "mpv";
"volumeFeedback" = false;
};
}

View File

@@ -0,0 +1,33 @@
{
lib,
username,
...
}: {
programs.noctalia-shell.settings.bar = lib.mkForce {
barType = "simple";
position = "top";
monitors = [];
density = "default";
showOutline = false;
showCapsule = true;
capsuleOpacity = 0;
backgroundOpacity = 0;
useSeparateOpacity = true;
floating = false;
marginVertical = 4;
marginHorizontal = 4;
frameThickness = 8;
frameRadius = 12;
outerCorners = true;
hideOnOverview = false;
displayMode = "always_visible";
autoHideDelay = 500;
autoShowDelay = 150;
screenOverrides = [];
widgets = {
left = (import ./widgets/left.nix {}).left;
center = (import ./widgets/center.nix {}).center;
right = (import ./widgets/right.nix {inherit username;}).right;
};
};
}

View File

@@ -0,0 +1,23 @@
_: {
center = [
{
id = "Workspace";
characterCount = 2;
colorizeIcons = false;
emptyColor = "secondary";
enableScrollWheel = true;
focusedColor = "primary";
followFocusedScreen = false;
groupedBorderOpacity = 0;
hideUnoccupied = false;
iconScale = 1;
labelMode = "index";
occupiedColor = "secondary";
reverseScroll = false;
showApplications = true;
showBadge = true;
showLabelsOnlyWhenOccupied = true;
unfocusedIconsOpacity = 1;
}
];
}

View File

@@ -0,0 +1,57 @@
_: {
left = [
{
id = "Launcher";
icon = "rocket";
usePrimaryColor = true;
}
{
id = "Clock";
customFont = "";
formatHorizontal = "HH:mm:ss";
formatVertical = "HH mm ss - ddd MMM d";
tooltipFormat = "ddd MMM d HH:mm:ss";
useCustomFont = false;
usePrimaryColor = false;
}
{
id = "SystemMonitor";
compactMode = true;
diskPath = "/home";
showCpuFreq = false;
showCpuTemp = false;
showCpuUsage = true;
showDiskAsFree = true;
showDiskUsage = true;
showGpuTemp = false;
showLoadAverage = false;
showMemoryAsPercent = false;
showMemoryUsage = true;
showNetworkStats = true;
showSwapUsage = false;
useMonospaceFont = true;
usePrimaryColor = false;
}
{
id = "plugin:mini-docker";
}
{
id = "MediaMini";
compactMode = true;
compactShowAlbumArt = true;
compactShowVisualizer = true;
hideMode = "hidden";
hideWhenIdle = false;
maxWidth = 145;
panelShowAlbumArt = true;
panelShowVisualizer = true;
scrollingMode = "hover";
showAlbumArt = true;
showArtistFirst = true;
showProgressRing = true;
showVisualizer = true;
useFixedWidth = false;
visualizerType = "linear";
}
];
}

View File

@@ -0,0 +1,61 @@
{username, ...}: {
right = [
{
id = "Tray";
blacklist = [];
colorizeIcons = false;
drawerEnabled = false;
hidePassive = false;
pinned = [];
}
{
id = "plugin:keybind-cheatsheet";
}
{
id = "plugin:timer";
defaultSettings = {
compactMode = true;
defaultDuration = 0;
};
}
{
id = "NotificationHistory";
hideWhenZero = false;
hideWhenZeroUnread = false;
showUnreadBadge = true;
unreadBadgeColor = "primary";
}
{
id = "Bluetooth";
displayMode = "onhover";
}
{
id = "Battery";
deviceNativePath = "__default__";
displayMode = "onhover";
hideIfIdle = false;
hideIfNotDetected = true;
showNoctaliaPerformance = false;
showPowerProfiles = false;
warningThreshold = 30;
}
{
id = "Volume";
displayMode = "alwaysShow";
middleClickCommand = "pwvucontrol || pavucontrol";
}
# {
# "id" = "Brightness";
# "displayMode" = "onhover";
# }
{
id = "ControlCenter";
colorizeDistroLogo = false;
colorizeSystemIcon = "none";
customIconPath = "/home/${username}/garandos/GarandOS.svg";
enableColorization = false;
icon = "noctalia";
useDistroLogo = false;
}
];
}

View File

@@ -0,0 +1,7 @@
{lib, ...}: {
programs.noctalia-shell.settings.brightness = lib.mkForce {
brightnessStep = 5;
enforceMinimum = true;
enableDdcSupport = true;
};
}

View File

@@ -0,0 +1,16 @@
{lib, ...}: {
programs.noctalia-shell.settings.calendar.cards = lib.mkForce [
{
enabled = true;
id = "calendar-header-card";
}
{
enabled = true;
id = "calendar-month-card";
}
{
enabled = true;
id = "weather-card";
}
];
}

View File

@@ -0,0 +1,12 @@
{lib, ...}: {
programs.noctalia-shell.settings.colorSchemes = lib.mkForce {
useWallpaperColors = false;
predefinedScheme = "Noctalia (default)";
darkMode = true;
schedulingMode = "off";
manualSunrise = "06:30";
manualSunset = "18:30";
generationMethod = "tonal-spot";
monitorForColors = "";
};
}

View File

@@ -0,0 +1,62 @@
{lib, ...}: {
programs.noctalia-shell.settings.controlCenter = lib.mkForce {
position = "close_to_bar_button";
diskPath = "/home";
shortcuts = {
left = [
{
id = "Network";
}
{
id = "Bluetooth";
}
{
id = "WallpaperSelector";
}
{
id = "NoctaliaPerformance";
}
];
right = [
{
id = "Notifications";
}
{
id = "PowerProfile";
}
{
id = "KeepAwake";
}
{
id = "NightLight";
}
];
};
cards = [
{
enabled = true;
id = "profile-card";
}
{
enabled = true;
id = "shortcuts-card";
}
{
enabled = true;
id = "audio-card";
}
{
enabled = true;
id = "brightness-card";
}
{
enabled = true;
id = "weather-card";
}
{
enabled = true;
id = "media-sysmon-card";
}
];
};
}

View File

@@ -0,0 +1,25 @@
_: {
imports = [
./bar
./notifications
./app-launcher.nix
./audio.nix
./brightness.nix
./calendar.nix
./color-schemes.nix
./control-center.nix
./desktop-widgets.nix
./dock.nix
./general.nix
./hooks.nix
./location.nix
./network.nix
./night-light.nix
./osd.nix
./session-menu.nix
./system-monitor.nix
./templates.nix
./ui.nix
./wallpapers.nix
];
}

View File

@@ -0,0 +1,7 @@
{lib, ...}: {
programs.noctalia-shell.settings.desktop-widgets = lib.mkForce {
"enabled" = false;
"gridSnap" = false;
"monitorWidgets" = [];
};
}

View File

@@ -0,0 +1,18 @@
{lib, ...}: {
programs.noctalia-shell.settings.dock = lib.mkForce {
enabled = false;
position = "bottom";
displayMode = "auto_hide";
backgroundOpacity = 0;
floatingRatio = 1;
size = 1.5;
onlySameOutput = false;
monitors = [];
pinnedApps = [];
colorizeIcons = false;
pinnedStatic = false;
inactiveIndicators = false;
deadOpacity = 0.5;
animationSpeed = 1;
};
}

View File

@@ -0,0 +1,38 @@
{
lib,
host,
username,
...
}: let
inherit (import ../../../../hosts/${host}/variables.nix) keyboardLayout;
in {
programs.noctalia-shell.settings.general = lib.mkForce {
avatarImage = "/home/${username}/.face.icon";
dimmerOpacity = 0.2;
showScreenCorners = false;
forceBlackScreenCorners = false;
scaleRatio = 1;
radiusRatio = 2;
iRadiusRatio = 2;
boxRadiusRatio = 1;
screenRadiusRatio = 1;
animationSpeed = 1;
animationDisabled = false;
compactLockScreen = false;
lockOnSuspend = true;
showSessionButtonsOnLockScreen = true;
showHibernateOnLockScreen = false;
enableShadows = true;
shadowDirection = "bottom_right";
shadowOffsetX = 2;
shadowOffsetY = 3;
language = "${keyboardLayout}";
allowPanelsOnScreenWithoutBar = true;
showChangelogOnStartup = true;
telemetryEnabled = false;
enableLockScreenCountdown = true;
lockScreenCountdownDuration = 10000;
autoStartAuth = false;
allowPasswordWithFprintd = false;
};
}

View File

@@ -0,0 +1,13 @@
{lib, ...}: {
programs.noctalia-shell.settings.hooks = lib.mkForce {
"enabled" = false;
"wallpaperChange" = "";
"darkModeChange" = "";
"screenLock" = "";
"screenUnlock" = "";
"performanceModeEnabled" = "";
"performanceModeDisabled" = "";
"startup" = "";
"session" = "";
};
}

View File

@@ -0,0 +1,22 @@
{
lib,
host,
...
}: let
inherit (import ../../../../hosts/${host}/variables.nix) location;
in {
programs.noctalia-shell.settings.location = lib.mkForce {
name = "${location}";
weatherEnabled = true;
weatherShowEffects = true;
useFahrenheit = false;
use12hourFormat = false;
showWeekNumberInCalendar = false;
showCalendarEvents = true;
showCalendarWeather = true;
analogClockInCalendar = false;
firstDayOfWeek = -1;
hideWeatherTimezone = false;
hideWeatherCityName = false;
};
}

View File

@@ -0,0 +1,10 @@
{lib, ...}: {
programs.noctalia-shell.settings.network = lib.mkForce {
wifiEnabled = true;
bluetoothRssiPollingEnabled = true;
bluetoothRssiPollIntervalMs = 10000;
wifiDetailsViewMode = "grid";
bluetoothDetailsViewMode = "grid";
bluetoothHideUnnamedDevices = false;
};
}

View File

@@ -0,0 +1,11 @@
{lib, ...}: {
programs.noctalia-shell.settings.nightLight = lib.mkForce {
"enabled" = false;
"forced" = false;
"autoSchedule" = true;
"nightTemp" = "4177";
"dayTemp" = "6500";
"manualSunrise" = "06:30";
"manualSunset" = "18:30";
};
}

View File

@@ -0,0 +1,33 @@
{
lib,
username,
...
}: {
programs.noctalia-shell.settings.notifications = lib.mkForce {
enabled = true;
monitors = [];
location = "top_right";
overlayLayer = true;
backgroundOpacity = 0;
respectExpireTimeout = false;
lowUrgencyDuration = 3;
normalUrgencyDuration = 8;
criticalUrgencyDuration = 15;
enableKeyboardLayoutToast = false;
saveToHistory = {
low = true;
normal = true;
critical = true;
};
sounds = {
enabled = true;
volume = 0.5;
separateSounds = false;
criticalSoundFile = "/home/${username}/garandos/modules/home/noctalia/settings/notifications/payday-2-new-objective-sound-effect.mp3";
normalSoundFile = "/home/${username}/garandos/modules/home/noctalia/settings/notifications/payday-2-new-objective-sound-effect.mp3";
lowSoundFile = "/home/${username}/garandos/modules/home/noctalia/settings/notifications/payday-2-new-objective-sound-effect.mp3";
excludedApps = "discord,firefox,chrome,chromium,edge";
};
enableMediaToast = false;
};
}

View File

@@ -0,0 +1,15 @@
{lib, ...}: {
programs.noctalia-shell.settings.osd = lib.mkForce {
"enabled" = true;
"location" = "right";
"autoHideMs" = 2000;
"overlayLayer" = true;
"backgroundOpacity" = 0;
"enabledTypes" = [
0
1
2
];
"monitors" = [];
};
}

View File

@@ -0,0 +1,49 @@
{lib, ...}: {
programs.noctalia-shell.settings.sessionMenu = lib.mkForce {
enableCountdown = false;
countdownDuration = 10000;
position = "center";
showHeader = true;
largeButtonsStyle = true;
largeButtonsLayout = "grid";
showNumberLabels = true;
powerOptions = [
{
action = "lock";
command = "";
countdownEnabled = true;
enabled = true;
}
{
action = "suspend";
command = "";
countdownEnabled = true;
enabled = true;
}
{
action = "hibernate";
command = "";
countdownEnabled = true;
enabled = true;
}
{
action = "reboot";
command = "";
countdownEnabled = true;
enabled = true;
}
{
action = "logout";
command = "";
countdownEnabled = true;
enabled = true;
}
{
action = "shutdown";
command = "";
countdownEnabled = true;
enabled = true;
}
];
};
}

View File

@@ -0,0 +1,34 @@
{
lib,
config,
...
}: let
stylix = config.stylix.base16Scheme;
in {
programs.noctalia-shell.settings.systemMonitor = lib.mkForce {
cpuWarningThreshold = 80;
cpuCriticalThreshold = 90;
tempWarningThreshold = 80;
tempCriticalThreshold = 90;
gpuWarningThreshold = 80;
gpuCriticalThreshold = 90;
memWarningThreshold = 80;
memCriticalThreshold = 90;
swapWarningThreshold = 80;
swapCriticalThreshold = 90;
diskWarningThreshold = 80;
diskCriticalThreshold = 90;
cpuPollingInterval = 3000;
tempPollingInterval = 3000;
gpuPollingInterval = 3000;
enableDgpuMonitoring = false;
memPollingInterval = 3000;
diskPollingInterval = 30000;
networkPollingInterval = 3000;
loadAvgPollingInterval = 3000;
useCustomColors = true;
warningColor = "#${stylix.base03}";
criticalColor = "#${stylix.base02}";
externalMonitor = "resources || missioncenter || jdsystemmonitor || corestats || system-monitoring-center || gnome-system-monitor || plasma-systemmonitor || mate-system-monitor || ukui-system-monitor || deepin-system-monitor || pantheon-system-monitor";
};
}

View File

@@ -0,0 +1,6 @@
{lib, ...}: {
programs.noctalia-shell.settings.templates = lib.mkForce {
activeTemplates = [];
enableUserTheming = false;
};
}

View File

@@ -0,0 +1,17 @@
{lib, ...}: {
programs.noctalia-shell.settings.ui = lib.mkForce {
fontDefault = "Fira Code";
fontFixed = "Fira Mono for Powerline";
fontDefaultScale = 1;
fontFixedScale = 1;
tooltipsEnabled = true;
panelBackgroundOpacity = 0.76;
panelsAttachedToBar = true;
settingsPanelMode = "attached";
wifiDetailsViewMode = "grid";
bluetoothDetailsViewMode = "grid";
networkPanelView = "wifi";
bluetoothHideUnnamedDevices = false;
boxBorderEnabled = false;
};
}

View File

@@ -0,0 +1,47 @@
{
lib,
host,
username,
...
}: let
inherit (import ../../../../hosts/${host}/variables.nix) stylixImage;
in {
programs.noctalia-shell.settings.wallpaper = lib.mkForce {
enabled = true;
overviewEnabled = false;
directory = "/home/${username}/Pictures/Wallpapers";
monitorDirectories = [];
enableMultiMonitorDirectories = false;
showHiddenFiles = false;
viewMode = "single";
setWallpaperOnAllMonitors = true;
fillMode = "crop";
fillColor = "#000000";
useSolidColor = false;
solidColor = "#1a1a2e";
automationEnabled = false;
wallpaperChangeMode = "random";
randomIntervalSec = 300;
transitionDuration = 1500;
transitionType = "random";
transitionEdgeSmoothness = 0.05;
panelPosition = "follow_bar";
hideWallpaperFilenames = false;
useWallhaven = false;
wallhavenQuery = "";
wallhavenSorting = "relevance";
wallhavenOrder = "desc";
wallhavenCategories = "111";
wallhavenPurity = "100";
wallhavenRatios = "";
wallhavenApiKey = "";
wallhavenResolutionMode = "atleast";
wallhavenResolutionWidth = "";
wallhavenResolutionHeight = "";
sortOrder = "name";
};
home.file.".cache/noctalia/wallpapers.json".text = lib.mkForce (builtins.toJSON {
defaultWallpaper = ../../../../wallpapers/${stylixImage};
});
}

View File

@@ -1,22 +0,0 @@
{lib, ...}: let
overviewSource = ./overview;
in {
# Quickshell-overview is a Qt6 QML app for Hyprland workspace overview
# It shows all workspaces with live window previews, drag-and-drop support
# Toggled via: SUPER + TAB (bound in hyprland/binds.nix)
# Started via exec-once in hyprland/exec-once.nix
# Seed the Quickshell overview code into ~/.config/quickshell/overview
# Copy (not symlink) so QML module resolution works and users can edit files
home.activation.seedOverviewCode = lib.hm.dag.entryAfter ["writeBoundary"] ''
set -eu
DEST="$HOME/.config/quickshell/overview"
SRC="${overviewSource}"
if [ ! -d "$DEST" ]; then
mkdir -p "$HOME/.config/quickshell"
cp -R "$SRC" "$DEST"
chmod -R u+rwX "$DEST"
fi
'';
}

View File

@@ -1,214 +0,0 @@
# Quickshell Overview for Hyprland
<div align="center">
A standalone workspace overview module for Hyprland using Quickshell - shows all workspaces with live window previews, drag-and-drop support, and Super+Tab keybind.
![Quickshell](https://img.shields.io/badge/Quickshell-0.2.0-blue?style=flat-square)
![Hyprland](https://img.shields.io/badge/Hyprland-Compatible-purple?style=flat-square)
![Qt6](https://img.shields.io/badge/Qt-6-green?style=flat-square)
![License](https://img.shields.io/badge/License-GPL-orange?style=flat-square)
</div>
---
## 📸 Preview
![Overview Screenshot](assets/image.png)
https://github.com/user-attachments/assets/79ceb141-6b9e-4956-8e09-aaf72b66550c
> *Workspace overview showing live window previews with drag-and-drop support*
---
## ✨ Features
- 🖼️ Visual workspace overview showing all workspaces and windows
- 🎯 Click windows to focus them
- 🖱️ Middle-click windows to close them
- 🔄 Drag and drop windows between workspaces
- ⌨️ Keyboard navigation (Arrow keys to switch workspaces, Escape/Enter to close)
- 💡 Hover tooltips showing window information
- 🎨 Material Design 3 theming
- ⚡ Smooth animations and transitions
## 📦 Installation
### Prerequisites
- **Hyprland** compositor
- **Quickshell** ([installation guide](https://quickshell.org/docs/v0.1.0/guide/install-setup/))
- **Qt 6** with modules: QtQuick, QtQuick.Controls, Qt5Compat.GraphicalEffects
### Setup
1. **Clone this repository** to your Quickshell config directory:
```bash
git clone https://github.com/Shanu-Kumawat/quickshell-overview ~/.config/quickshell/overview
```
2. **Add keybind** to your Hyprland config (`~/.config/hypr/hyprland.conf`):
```conf
bind = Super, TAB, exec, qs ipc -c overview call overview toggle
```
3. **Auto-start** the overview (add to Hyprland config):
```conf
exec-once = qs -c overview
```
4. **Reload Hyprland**:
```bash
hyprctl reload
```
### Manual Start (if needed)
```bash
qs -c overview &
```
## 🎮 Usage
| Action | Description |
|--------|-------------|
| **Super + Tab** | Toggle the overview |
| **Left/Right Arrow Keys** | Navigate between workspaces horizontally |
| **Up/Down Arrow Keys** | Navigate between workspace rows |
| **Escape / Enter** | Close the overview |
| **Click workspace** | Switch to that workspace |
| **Click window** | Focus that window |
| **Middle-click window** | Close that window |
| **Drag window** | Move window to different workspace |
---
## ⚙️ Configuration
> **⚠️ Want to change the size, position, or number of workspaces?**
> Edit `~/.config/quickshell/overview/common/Config.qml` - it's all there!
### Workspace Grid
Edit `~/.config/quickshell/overview/common/Config.qml`:
```qml
property QtObject overview: QtObject {
property int rows: 2 // Number of workspace rows
property int columns: 5 // Number of workspace columns (10 total workspaces)
property real scale: 0.16 // Overview scale factor (0.1-0.3, smaller = more compact)
property bool enable: true
}
```
**Common adjustments:**
- **Too small?** Increase `scale` (try 0.20 or 0.25)
- **Too big?** Decrease `scale` (try 0.12 or 0.14)
- **More workspaces?** Change `rows` and `columns` (e.g., 3 rows × 4 columns = 12 workspaces)
### Position
Edit `~/.config/quickshell/overview/modules/overview/Overview.qml` (line ~111):
```qml
anchors {
horizontalCenter: parent.horizontalCenter
top: parent.top
topMargin: 100 // Change this value to move up/down
}
```
### Theme & Colors
Edit `~/.config/quickshell/overview/common/Appearance.qml` to customize:
- Colors (m3colors and colors objects)
- Font families and sizes
- Animation curves and durations
- Border radius values
---
## 📋 Requirements
- **Hyprland** compositor (tested on latest versions)
- **Quickshell** (Qt6-based shell framework)
- **Qt 6** with the following modules:
- QtQuick
- QtQuick.Controls
- QtQuick.Layouts
- Qt5Compat.GraphicalEffects
- Quickshell.Wayland
- Quickshell.Hyprland
## 🚫 Removed Features (from original illogical-impulse)
The following features were removed to make it standalone:
- App search functionality
- Emoji picker
- Clipboard history integration
- Search widget
- Integration with the full illogical-impulse shell ecosystem
## 📁 File Structure
```
~/.config/quickshell/overview/
├── shell.qml # Main entry point
├── README.md # This file
├── hyprland-config.conf # Configuration reference
├── common/
│ ├── Appearance.qml # Theme and styling
│ ├── Config.qml # Configuration options
│ ├── functions/
│ │ └── ColorUtils.qml # Color manipulation utilities
│ └── widgets/
│ ├── StyledText.qml # Styled text component
│ ├── StyledRectangularShadow.qml
│ ├── StyledToolTip.qml
│ └── StyledToolTipContent.qml
├── services/
│ ├── GlobalStates.qml # Global state management
│ └── HyprlandData.qml # Hyprland data provider
└── modules/
└── overview/
├── Overview.qml # Main overview component
├── OverviewWidget.qml # Workspace grid widget
└── OverviewWindow.qml # Individual window preview
```
## 🎯 IPC Commands
```bash
# Toggle overview
qs ipc -c overview call overview toggle
# Open overview
qs ipc -c overview call overview open
# Close overview
qs ipc -c overview call overview close
```
## 🐛 Known Issues
- Window icons may fallback to generic icon if app class name doesn't match icon theme
- Potential crashes during rapid window state changes due to Wayland screencopy buffer management
## Credits
Extracted from the overview feature in [illogical-impulse](https://github.com/end-4/dots-hyprland) by [end-4](https://github.com/end-4).
Adapted as a standalone component for Hyprland + Quickshell users who want just the overview functionality.
---
<div align="center">
**Note:** Maintenance will be limited due to time constraints, but **PRs and code improvements are welcome!** Feel free to contribute or fork for your own needs.
Made with ❤️ for the Hyprland community
</div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

View File

@@ -1,148 +0,0 @@
pragma Singleton
pragma ComponentBehavior: Bound
import QtQuick
import Quickshell
import "functions"
Singleton {
id: root
property QtObject m3colors
property QtObject animation
property QtObject animationCurves
property QtObject colors
property QtObject rounding
property QtObject font
property QtObject sizes
m3colors: QtObject {
property bool darkmode: true
property color m3primary: "#E5B6F2"
property color m3onPrimary: "#452152"
property color m3primaryContainer: "#5D386A"
property color m3onPrimaryContainer: "#F9D8FF"
property color m3secondary: "#D5C0D7"
property color m3onSecondary: "#392C3D"
property color m3secondaryContainer: "#534457"
property color m3onSecondaryContainer: "#F2DCF3"
property color m3background: "#161217"
property color m3onBackground: "#EAE0E7"
property color m3surface: "#161217"
property color m3surfaceContainerLow: "#1F1A1F"
property color m3surfaceContainer: "#231E23"
property color m3surfaceContainerHigh: "#2D282E"
property color m3surfaceContainerHighest: "#383339"
property color m3onSurface: "#EAE0E7"
property color m3surfaceVariant: "#4C444D"
property color m3onSurfaceVariant: "#CFC3CD"
property color m3inverseSurface: "#EAE0E7"
property color m3inverseOnSurface: "#342F34"
property color m3outline: "#988E97"
property color m3outlineVariant: "#4C444D"
property color m3shadow: "#000000"
}
colors: QtObject {
property color colSubtext: m3colors.m3outline
property color colLayer0: m3colors.m3background
property color colOnLayer0: m3colors.m3onBackground
property color colLayer0Border: ColorUtils.mix(root.m3colors.m3outlineVariant, colLayer0, 0.4)
property color colLayer1: m3colors.m3surfaceContainerLow
property color colOnLayer1: m3colors.m3onSurfaceVariant
property color colOnLayer1Inactive: ColorUtils.mix(colOnLayer1, colLayer1, 0.45)
property color colLayer1Hover: ColorUtils.mix(colLayer1, colOnLayer1, 0.92)
property color colLayer1Active: ColorUtils.mix(colLayer1, colOnLayer1, 0.85)
property color colLayer2: m3colors.m3surfaceContainer
property color colOnLayer2: m3colors.m3onSurface
property color colLayer2Hover: ColorUtils.mix(colLayer2, colOnLayer2, 0.90)
property color colLayer2Active: ColorUtils.mix(colLayer2, colOnLayer2, 0.80)
property color colPrimary: m3colors.m3primary
property color colOnPrimary: m3colors.m3onPrimary
property color colSecondary: m3colors.m3secondary
property color colSecondaryContainer: m3colors.m3secondaryContainer
property color colOnSecondaryContainer: m3colors.m3onSecondaryContainer
property color colTooltip: m3colors.m3inverseSurface
property color colOnTooltip: m3colors.m3inverseOnSurface
property color colShadow: ColorUtils.transparentize(m3colors.m3shadow, 0.7)
property color colOutline: m3colors.m3outline
}
rounding: QtObject {
property int unsharpen: 2
property int verysmall: 8
property int small: 12
property int normal: 17
property int large: 23
property int full: 9999
property int screenRounding: large
property int windowRounding: 18
}
font: QtObject {
property QtObject family: QtObject {
property string main: "sans-serif"
property string title: "sans-serif"
property string expressive: "sans-serif"
}
property QtObject pixelSize: QtObject {
property int smaller: 12
property int small: 15
property int normal: 16
property int larger: 19
property int huge: 22
}
}
animationCurves: QtObject {
readonly property list<real> expressiveDefaultSpatial: [0.38, 1.21, 0.22, 1.00, 1, 1]
readonly property list<real> expressiveEffects: [0.34, 0.80, 0.34, 1.00, 1, 1]
readonly property list<real> emphasizedDecel: [0.05, 0.7, 0.1, 1, 1, 1]
readonly property real expressiveDefaultSpatialDuration: 500
readonly property real expressiveEffectsDuration: 200
}
animation: QtObject {
property QtObject elementMove: QtObject {
property int duration: animationCurves.expressiveDefaultSpatialDuration
property int type: Easing.BezierSpline
property list<real> bezierCurve: animationCurves.expressiveDefaultSpatial
property Component numberAnimation: Component {
NumberAnimation {
duration: root.animation.elementMove.duration
easing.type: root.animation.elementMove.type
easing.bezierCurve: root.animation.elementMove.bezierCurve
}
}
}
property QtObject elementMoveEnter: QtObject {
property int duration: 400
property int type: Easing.BezierSpline
property list<real> bezierCurve: animationCurves.emphasizedDecel
property Component numberAnimation: Component {
NumberAnimation {
duration: root.animation.elementMoveEnter.duration
easing.type: root.animation.elementMoveEnter.type
easing.bezierCurve: root.animation.elementMoveEnter.bezierCurve
}
}
}
property QtObject elementMoveFast: QtObject {
property int duration: animationCurves.expressiveEffectsDuration
property int type: Easing.BezierSpline
property list<real> bezierCurve: animationCurves.expressiveEffects
property Component numberAnimation: Component {
NumberAnimation {
duration: root.animation.elementMoveFast.duration
easing.type: root.animation.elementMoveFast.type
easing.bezierCurve: root.animation.elementMoveFast.bezierCurve
}
}
}
}
sizes: QtObject {
property real elevationMargin: 10
}
}

View File

@@ -1,22 +0,0 @@
pragma Singleton
pragma ComponentBehavior: Bound
import QtQuick
import Quickshell
Singleton {
id: root
property QtObject options: QtObject {
property QtObject overview: QtObject {
property int rows: 2
property int columns: 5
property real scale: 0.16
property bool enable: true
}
property QtObject hacks: QtObject {
property int arbitraryRaceConditionDelay: 150
}
}
}

View File

@@ -1,68 +0,0 @@
pragma Singleton
import Quickshell
Singleton {
id: root
function colorWithHueOf(color1, color2) {
var c1 = Qt.color(color1);
var c2 = Qt.color(color2);
var hue = c2.hsvHue;
var sat = c1.hsvSaturation;
var val = c1.hsvValue;
var alpha = c1.a;
return Qt.hsva(hue, sat, val, alpha);
}
function colorWithSaturationOf(color1, color2) {
var c1 = Qt.color(color1);
var c2 = Qt.color(color2);
var hue = c1.hsvHue;
var sat = c2.hsvSaturation;
var val = c1.hsvValue;
var alpha = c1.a;
return Qt.hsva(hue, sat, val, alpha);
}
function colorWithLightness(color, lightness) {
var c = Qt.color(color);
return Qt.hsla(c.hslHue, c.hslSaturation, lightness, c.a);
}
function colorWithLightnessOf(color1, color2) {
var c2 = Qt.color(color2);
return colorWithLightness(color1, c2.hslLightness);
}
function adaptToAccent(color1, color2) {
var c1 = Qt.color(color1);
var c2 = Qt.color(color2);
var hue = c2.hslHue;
var sat = c2.hslSaturation;
var light = c1.hslLightness;
var alpha = c1.a;
return Qt.hsla(hue, sat, light, alpha);
}
function mix(color1, color2, percentage = 0.5) {
var c1 = Qt.color(color1);
var c2 = Qt.color(color2);
return Qt.rgba(
percentage * c1.r + (1 - percentage) * c2.r,
percentage * c1.g + (1 - percentage) * c2.g,
percentage * c1.b + (1 - percentage) * c2.b,
percentage * c1.a + (1 - percentage) * c2.a
);
}
function transparentize(color, percentage = 1) {
var c = Qt.color(color);
return Qt.rgba(c.r, c.g, c.b, c.a * (1 - percentage));
}
function applyAlpha(color, alpha) {
var c = Qt.color(color);
var a = Math.max(0, Math.min(1, alpha));
return Qt.rgba(c.r, c.g, c.b, a);
}
}

View File

@@ -1 +0,0 @@
singleton ColorUtils 1.0 ColorUtils.qml

View File

@@ -1,7 +0,0 @@
singleton Appearance 1.0 Appearance.qml
singleton Config 1.0 Config.qml
singleton ColorUtils 1.0 functions/ColorUtils.qml
StyledText 1.0 widgets/StyledText.qml
StyledRectangularShadow 1.0 widgets/StyledRectangularShadow.qml
StyledToolTip 1.0 widgets/StyledToolTip.qml
StyledToolTipContent 1.0 widgets/StyledToolTipContent.qml

View File

@@ -1,14 +0,0 @@
import QtQuick
import QtQuick.Effects
import ".."
RectangularShadow {
required property var target
anchors.fill: target
radius: 20
blur: 0.9 * Appearance.sizes.elevationMargin
offset: Qt.vector2d(0.0, 1.0)
spread: 1
color: Appearance.colors.colShadow
cached: true
}

View File

@@ -1,16 +0,0 @@
import QtQuick
import ".."
Text {
id: root
property bool animateChange: false
renderType: Text.NativeRendering
verticalAlignment: Text.AlignVCenter
font {
hintingPreference: Font.PreferFullHinting
family: Appearance?.font.family.main ?? "sans-serif"
pixelSize: Appearance?.font.pixelSize.small ?? 15
}
color: Appearance?.m3colors.m3onBackground ?? "white"
}

View File

@@ -1,23 +0,0 @@
import QtQuick
import QtQuick.Controls
import "."
ToolTip {
id: root
property bool extraVisibleCondition: true
property bool alternativeVisibleCondition: false
readonly property bool internalVisibleCondition: (extraVisibleCondition && (parent.hovered === undefined || parent?.hovered)) || alternativeVisibleCondition
verticalPadding: 5
horizontalPadding: 10
background: null
visible: internalVisibleCondition
contentItem: StyledToolTipContent {
id: contentItem
text: root.text
shown: root.internalVisibleCondition
horizontalPadding: root.horizontalPadding
verticalPadding: root.verticalPadding
}
}

View File

@@ -1,49 +0,0 @@
import QtQuick
import "."
import "../"
Item {
id: root
required property string text
property bool shown: false
property real horizontalPadding: 10
property real verticalPadding: 5
implicitWidth: tooltipTextObject.implicitWidth + 2 * root.horizontalPadding
implicitHeight: tooltipTextObject.implicitHeight + 2 * root.verticalPadding
property bool isVisible: backgroundRectangle.implicitHeight > 0
Rectangle {
id: backgroundRectangle
anchors {
bottom: root.bottom
horizontalCenter: root.horizontalCenter
}
color: Appearance?.colors.colTooltip ?? "#3C4043"
radius: Appearance?.rounding.verysmall ?? 7
opacity: shown ? 1 : 0
implicitWidth: shown ? (tooltipTextObject.implicitWidth + 2 * root.horizontalPadding) : 0
implicitHeight: shown ? (tooltipTextObject.implicitHeight + 2 * root.verticalPadding) : 0
clip: true
Behavior on implicitWidth {
animation: Appearance?.animation.elementMoveFast.numberAnimation.createObject(this)
}
Behavior on implicitHeight {
animation: Appearance?.animation.elementMoveFast.numberAnimation.createObject(this)
}
Behavior on opacity {
animation: Appearance?.animation.elementMoveFast.numberAnimation.createObject(this)
}
StyledText {
id: tooltipTextObject
anchors.centerIn: parent
text: root.text
font.pixelSize: Appearance?.font.pixelSize.smaller ?? 14
font.hintingPreference: Font.PreferNoHinting
color: Appearance?.colors.colOnTooltip ?? "#FFFFFF"
wrapMode: Text.Wrap
}
}
}

View File

@@ -1,4 +0,0 @@
StyledText 1.0 StyledText.qml
StyledRectangularShadow 1.0 StyledRectangularShadow.qml
StyledToolTip 1.0 StyledToolTip.qml
StyledToolTipContent 1.0 StyledToolTipContent.qml

View File

@@ -1,147 +0,0 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell
import Quickshell.Io
import Quickshell.Wayland
import Quickshell.Hyprland
import "../../common"
import "../../services"
import "."
Scope {
id: overviewScope
Variants {
id: overviewVariants
model: Quickshell.screens
PanelWindow {
id: root
required property var modelData
readonly property HyprlandMonitor monitor: Hyprland.monitorFor(root.screen)
property bool monitorIsFocused: (Hyprland.focusedMonitor?.id == monitor?.id)
screen: modelData
visible: GlobalStates.overviewOpen
WlrLayershell.namespace: "quickshell:overview"
WlrLayershell.layer: WlrLayer.Overlay
WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive
color: "transparent"
mask: Region {
item: GlobalStates.overviewOpen ? keyHandler : null
}
anchors {
top: true
bottom: true
left: !(Config?.options.overview.enable ?? true)
right: !(Config?.options.overview.enable ?? true)
}
HyprlandFocusGrab {
id: grab
windows: [root]
property bool canBeActive: root.monitorIsFocused
active: false
onCleared: () => {
if (!active)
GlobalStates.overviewOpen = false;
}
}
Connections {
target: GlobalStates
function onOverviewOpenChanged() {
if (GlobalStates.overviewOpen) {
delayedGrabTimer.start();
}
}
}
Timer {
id: delayedGrabTimer
interval: Config.options.hacks.arbitraryRaceConditionDelay
repeat: false
onTriggered: {
if (!grab.canBeActive)
return;
grab.active = GlobalStates.overviewOpen;
}
}
implicitWidth: columnLayout.implicitWidth
implicitHeight: columnLayout.implicitHeight
Item {
id: keyHandler
anchors.fill: parent
visible: GlobalStates.overviewOpen
focus: GlobalStates.overviewOpen
Keys.onPressed: event => {
if (event.key === Qt.Key_Escape || event.key === Qt.Key_Return) {
GlobalStates.overviewOpen = false;
event.accepted = true;
} else if (event.key === Qt.Key_Left || event.key === Qt.Key_Right || event.key === Qt.Key_Up || event.key === Qt.Key_Down) {
const workspacesPerGroup = Config.options.overview.rows * Config.options.overview.columns;
const currentId = Hyprland.focusedMonitor?.activeWorkspace?.id ?? 1;
const currentGroup = Math.floor((currentId - 1) / workspacesPerGroup);
const minWorkspaceId = currentGroup * workspacesPerGroup + 1;
const maxWorkspaceId = minWorkspaceId + workspacesPerGroup - 1;
let targetId;
if (event.key === Qt.Key_Left) {
targetId = currentId - 1;
if (targetId < minWorkspaceId) targetId = maxWorkspaceId;
} else if (event.key === Qt.Key_Right) {
targetId = currentId + 1;
if (targetId > maxWorkspaceId) targetId = minWorkspaceId;
} else if (event.key === Qt.Key_Up) {
targetId = currentId - Config.options.overview.columns;
if (targetId < minWorkspaceId) targetId += workspacesPerGroup;
} else {
targetId = currentId + Config.options.overview.columns;
if (targetId > maxWorkspaceId) targetId -= workspacesPerGroup;
}
Hyprland.dispatch("workspace " + targetId);
event.accepted = true;
}
}
}
ColumnLayout {
id: columnLayout
visible: GlobalStates.overviewOpen
anchors {
horizontalCenter: parent.horizontalCenter
top: parent.top
topMargin: 100
}
Loader {
id: overviewLoader
active: GlobalStates.overviewOpen && (Config?.options.overview.enable ?? true)
sourceComponent: OverviewWidget {
panelWindow: root
visible: true
}
}
}
}
}
IpcHandler {
target: "overview"
function toggle() {
GlobalStates.overviewOpen = !GlobalStates.overviewOpen;
}
function close() {
GlobalStates.overviewOpen = false;
}
function open() {
GlobalStates.overviewOpen = true;
}
}
}

View File

@@ -1,303 +0,0 @@
import QtQuick
import QtQuick.Layouts
import Quickshell
import Quickshell.Wayland
import Quickshell.Hyprland
import "../../common"
import "../../common/functions"
import "../../common/widgets"
import "../../services"
import "."
Item {
id: root
required property var panelWindow
readonly property HyprlandMonitor monitor: Hyprland.monitorFor(panelWindow.screen)
readonly property var toplevels: ToplevelManager.toplevels
readonly property int workspacesShown: Config.options.overview.rows * Config.options.overview.columns
readonly property int workspaceGroup: Math.floor((monitor.activeWorkspace?.id - 1) / workspacesShown)
property bool monitorIsFocused: (Hyprland.focusedMonitor?.name == monitor.name)
property var windows: HyprlandData.windowList
property var windowByAddress: HyprlandData.windowByAddress
property var windowAddresses: HyprlandData.addresses
property var monitorData: HyprlandData.monitors.find(m => m.id === root.monitor?.id)
property real scale: Config.options.overview.scale
property color activeBorderColor: Appearance.colors.colSecondary
property real workspaceImplicitWidth: (monitorData?.transform % 2 === 1) ?
((monitor.height / monitor.scale - (monitorData?.reserved?.[0] ?? 0) - (monitorData?.reserved?.[2] ?? 0)) * root.scale) :
((monitor.width / monitor.scale - (monitorData?.reserved?.[0] ?? 0) - (monitorData?.reserved?.[2] ?? 0)) * root.scale)
property real workspaceImplicitHeight: (monitorData?.transform % 2 === 1) ?
((monitor.width / monitor.scale - (monitorData?.reserved?.[1] ?? 0) - (monitorData?.reserved?.[3] ?? 0)) * root.scale) :
((monitor.height / monitor.scale - (monitorData?.reserved?.[1] ?? 0) - (monitorData?.reserved?.[3] ?? 0)) * root.scale)
property real workspaceNumberMargin: 80
property real workspaceNumberSize: 250 * monitor.scale
property int workspaceZ: 0
property int windowZ: 1
property int windowDraggingZ: 99999
property real workspaceSpacing: 5
property int draggingFromWorkspace: -1
property int draggingTargetWorkspace: -1
implicitWidth: overviewBackground.implicitWidth + Appearance.sizes.elevationMargin * 2
implicitHeight: overviewBackground.implicitHeight + Appearance.sizes.elevationMargin * 2
property Component windowComponent: OverviewWindow {}
property list<OverviewWindow> windowWidgets: []
StyledRectangularShadow {
target: overviewBackground
}
Rectangle { // Background
id: overviewBackground
property real padding: 10
anchors.fill: parent
anchors.margins: Appearance.sizes.elevationMargin
implicitWidth: workspaceColumnLayout.implicitWidth + padding * 2
implicitHeight: workspaceColumnLayout.implicitHeight + padding * 2
radius: Appearance.rounding.screenRounding * root.scale + padding
color: Appearance.colors.colLayer0
border.width: 1
border.color: Appearance.colors.colLayer0Border
ColumnLayout { // Workspaces
id: workspaceColumnLayout
z: root.workspaceZ
anchors.centerIn: parent
spacing: workspaceSpacing
Repeater {
model: Config.options.overview.rows
delegate: RowLayout {
id: row
property int rowIndex: index
spacing: workspaceSpacing
Repeater { // Workspace repeater
model: Config.options.overview.columns
Rectangle { // Workspace
id: workspace
property int colIndex: index
property int workspaceValue: root.workspaceGroup * workspacesShown + rowIndex * Config.options.overview.columns + colIndex + 1
property color defaultWorkspaceColor: Appearance.colors.colLayer1
property color hoveredWorkspaceColor: ColorUtils.mix(defaultWorkspaceColor, Appearance.colors.colLayer1Hover, 0.1)
property color hoveredBorderColor: Appearance.colors.colLayer2Hover
property bool hoveredWhileDragging: false
implicitWidth: root.workspaceImplicitWidth
implicitHeight: root.workspaceImplicitHeight
color: hoveredWhileDragging ? hoveredWorkspaceColor : defaultWorkspaceColor
radius: Appearance.rounding.screenRounding * root.scale
border.width: 2
border.color: hoveredWhileDragging ? hoveredBorderColor : "transparent"
StyledText {
anchors.centerIn: parent
text: workspaceValue
font {
pixelSize: root.workspaceNumberSize * root.scale
weight: Font.DemiBold
family: Appearance.font.family.expressive
}
color: ColorUtils.transparentize(Appearance.colors.colOnLayer1, 0.8)
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
MouseArea {
id: workspaceArea
anchors.fill: parent
acceptedButtons: Qt.LeftButton
onClicked: {
if (root.draggingTargetWorkspace === -1) {
GlobalStates.overviewOpen = false
Hyprland.dispatch(`workspace ${workspaceValue}`)
}
}
}
DropArea {
anchors.fill: parent
onEntered: {
root.draggingTargetWorkspace = workspaceValue
if (root.draggingFromWorkspace == root.draggingTargetWorkspace) return;
hoveredWhileDragging = true
}
onExited: {
hoveredWhileDragging = false
if (root.draggingTargetWorkspace == workspaceValue) root.draggingTargetWorkspace = -1
}
}
}
}
}
}
}
Item { // Windows & focused workspace indicator
id: windowSpace
anchors.centerIn: parent
implicitWidth: workspaceColumnLayout.implicitWidth
implicitHeight: workspaceColumnLayout.implicitHeight
Repeater { // Window repeater
model: ScriptModel {
values: {
return ToplevelManager.toplevels.values.filter((toplevel) => {
const address = `0x${toplevel.HyprlandToplevel.address}`
var win = windowByAddress[address]
const inWorkspaceGroup = (root.workspaceGroup * root.workspacesShown < win?.workspace?.id && win?.workspace?.id <= (root.workspaceGroup + 1) * root.workspacesShown)
return inWorkspaceGroup;
}).sort((a, b) => {
// Proper stacking order based on Hyprland's window properties
const addrA = `0x${a.HyprlandToplevel.address}`
const addrB = `0x${b.HyprlandToplevel.address}`
const winA = windowByAddress[addrA]
const winB = windowByAddress[addrB]
// 1. Pinned windows are always on top
if (winA?.pinned !== winB?.pinned) {
return winA?.pinned ? 1 : -1
}
// 2. Floating windows above tiled windows
if (winA?.floating !== winB?.floating) {
return winA?.floating ? 1 : -1
}
// 3. Within same category, sort by focus history
// Lower focusHistoryID = more recently focused = higher in stack
return (winB?.focusHistoryID ?? 0) - (winA?.focusHistoryID ?? 0)
})
}
}
delegate: OverviewWindow {
id: window
required property var modelData
required property int index
property int monitorId: windowData?.monitor
property var monitor: HyprlandData.monitors.find(m => m.id === monitorId)
property var address: `0x${modelData.HyprlandToplevel.address}`
windowData: windowByAddress[address]
toplevel: modelData
monitorData: monitor
// Calculate scale relative to window's source monitor
property real sourceMonitorWidth: (monitor?.transform % 2 === 1) ?
(monitor?.height ?? 1920) / (monitor?.scale ?? 1) - (monitor?.reserved?.[0] ?? 0) - (monitor?.reserved?.[2] ?? 0) :
(monitor?.width ?? 1920) / (monitor?.scale ?? 1) - (monitor?.reserved?.[0] ?? 0) - (monitor?.reserved?.[2] ?? 0)
property real sourceMonitorHeight: (monitor?.transform % 2 === 1) ?
(monitor?.width ?? 1080) / (monitor?.scale ?? 1) - (monitor?.reserved?.[1] ?? 0) - (monitor?.reserved?.[3] ?? 0) :
(monitor?.height ?? 1080) / (monitor?.scale ?? 1) - (monitor?.reserved?.[1] ?? 0) - (monitor?.reserved?.[3] ?? 0)
// Scale windows to fit the workspace size, accounting for different monitor sizes
scale: Math.min(
root.workspaceImplicitWidth / sourceMonitorWidth,
root.workspaceImplicitHeight / sourceMonitorHeight
)
availableWorkspaceWidth: root.workspaceImplicitWidth
availableWorkspaceHeight: root.workspaceImplicitHeight
widgetMonitorId: root.monitor.id
property bool atInitPosition: (initX == x && initY == y)
property int workspaceColIndex: (windowData?.workspace.id - 1) % Config.options.overview.columns
property int workspaceRowIndex: Math.floor((windowData?.workspace.id - 1) % root.workspacesShown / Config.options.overview.columns)
xOffset: (root.workspaceImplicitWidth + workspaceSpacing) * workspaceColIndex
yOffset: (root.workspaceImplicitHeight + workspaceSpacing) * workspaceRowIndex
Timer {
id: updateWindowPosition
interval: Config.options.hacks.arbitraryRaceConditionDelay
repeat: false
running: false
onTriggered: {
window.x = Math.round(Math.max((windowData?.at[0] - (monitor?.x ?? 0) - (monitorData?.reserved?.[0] ?? 0)) * root.scale, 0) + xOffset)
window.y = Math.round(Math.max((windowData?.at[1] - (monitor?.y ?? 0) - (monitorData?.reserved?.[1] ?? 0)) * root.scale, 0) + yOffset)
}
}
z: atInitPosition ? (root.windowZ + index) : root.windowDraggingZ
Drag.hotSpot.x: targetWindowWidth / 2
Drag.hotSpot.y: targetWindowHeight / 2
MouseArea {
id: dragArea
anchors.fill: parent
hoverEnabled: true
onEntered: hovered = true
onExited: hovered = false
acceptedButtons: Qt.LeftButton | Qt.MiddleButton
drag.target: parent
onPressed: (mouse) => {
root.draggingFromWorkspace = windowData?.workspace.id
window.pressed = true
window.Drag.active = true
window.Drag.source = window
window.Drag.hotSpot.x = mouse.x
window.Drag.hotSpot.y = mouse.y
}
onReleased: {
const targetWorkspace = root.draggingTargetWorkspace
window.pressed = false
window.Drag.active = false
root.draggingFromWorkspace = -1
if (targetWorkspace !== -1 && targetWorkspace !== windowData?.workspace.id) {
Hyprland.dispatch(`movetoworkspacesilent ${targetWorkspace}, address:${window.windowData?.address}`)
updateWindowPosition.restart()
}
else {
window.x = window.initX
window.y = window.initY
}
}
onClicked: (event) => {
if (!windowData) return;
if (event.button === Qt.LeftButton) {
GlobalStates.overviewOpen = false
Hyprland.dispatch(`focuswindow address:${windowData.address}`)
event.accepted = true
} else if (event.button === Qt.MiddleButton) {
Hyprland.dispatch(`closewindow address:${windowData.address}`)
event.accepted = true
}
}
StyledToolTip {
extraVisibleCondition: false
alternativeVisibleCondition: dragArea.containsMouse && !window.Drag.active
text: `${windowData?.title ?? "Unknown"}\n[${windowData?.class ?? "unknown"}] ${windowData?.xwayland ? "[XWayland] " : ""}`
}
}
}
}
Rectangle { // Focused workspace indicator
id: focusedWorkspaceIndicator
property int activeWorkspaceInGroup: monitor.activeWorkspace?.id - (root.workspaceGroup * root.workspacesShown)
property int activeWorkspaceRowIndex: Math.floor((activeWorkspaceInGroup - 1) / Config.options.overview.columns)
property int activeWorkspaceColIndex: (activeWorkspaceInGroup - 1) % Config.options.overview.columns
x: (root.workspaceImplicitWidth + workspaceSpacing) * activeWorkspaceColIndex
y: (root.workspaceImplicitHeight + workspaceSpacing) * activeWorkspaceRowIndex
z: root.windowZ
width: root.workspaceImplicitWidth
height: root.workspaceImplicitHeight
color: "transparent"
radius: Appearance.rounding.screenRounding * root.scale
border.width: 2
border.color: root.activeBorderColor
Behavior on x {
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
}
Behavior on y {
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
}
}
}
}
}

View File

@@ -1,109 +0,0 @@
import Qt5Compat.GraphicalEffects
import QtQuick
import QtQuick.Layouts
import Quickshell
import Quickshell.Wayland
import "../../common"
import "../../common/functions"
import "../../services"
Item { // Window
id: root
property var toplevel
property var windowData
property var monitorData
property var scale
property var availableWorkspaceWidth
property var availableWorkspaceHeight
property bool restrictToWorkspace: true
property real initX: Math.max(((windowData?.at[0] ?? 0) - (monitorData?.x ?? 0) - (monitorData?.reserved?.[0] ?? 0)) * root.scale, 0) + xOffset
property real initY: Math.max(((windowData?.at[1] ?? 0) - (monitorData?.y ?? 0) - (monitorData?.reserved?.[1] ?? 0)) * root.scale, 0) + yOffset
property real xOffset: 0
property real yOffset: 0
property int widgetMonitorId: 0
property var targetWindowWidth: (windowData?.size[0] ?? 100) * scale
property var targetWindowHeight: (windowData?.size[1] ?? 100) * scale
property bool hovered: false
property bool pressed: false
property var iconToWindowRatio: 0.25
property var xwaylandIndicatorToIconRatio: 0.35
property var iconToWindowRatioCompact: 0.45
property var entry: DesktopEntries.heuristicLookup(windowData?.class)
property var iconPath: Quickshell.iconPath(entry?.icon ?? windowData?.class ?? "application-x-executable", "image-missing")
property bool compactMode: Appearance.font.pixelSize.smaller * 4 > targetWindowHeight || Appearance.font.pixelSize.smaller * 4 > targetWindowWidth
property bool indicateXWayland: windowData?.xwayland ?? false
x: initX
y: initY
width: Math.min((windowData?.size[0] ?? 100) * root.scale, availableWorkspaceWidth)
height: Math.min((windowData?.size[1] ?? 100) * root.scale, availableWorkspaceHeight)
opacity: (windowData?.monitor ?? -1) == widgetMonitorId ? 1 : 0.4
layer.enabled: true
layer.effect: OpacityMask {
maskSource: Rectangle {
width: root.width
height: root.height
radius: Appearance.rounding.windowRounding * root.scale
}
}
Behavior on x {
animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this)
}
Behavior on y {
animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this)
}
Behavior on width {
animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this)
}
Behavior on height {
animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this)
}
ScreencopyView {
id: windowPreview
anchors.fill: parent
captureSource: GlobalStates.overviewOpen ? root.toplevel : null
live: true
Rectangle {
anchors.fill: parent
radius: Appearance.rounding.windowRounding * root.scale
color: pressed ? ColorUtils.transparentize(Appearance.colors.colLayer2Active, 0.5) :
hovered ? ColorUtils.transparentize(Appearance.colors.colLayer2Hover, 0.7) :
ColorUtils.transparentize(Appearance.colors.colLayer2)
border.color : ColorUtils.transparentize(Appearance.m3colors.m3outline, 0.7)
border.width : 1
}
ColumnLayout {
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.right: parent.right
spacing: Appearance.font.pixelSize.smaller * 0.5
Image {
id: windowIcon
property var iconSize: {
return Math.min(targetWindowWidth, targetWindowHeight) * (root.compactMode ? root.iconToWindowRatioCompact : root.iconToWindowRatio) / (root.monitorData?.scale ?? 1);
}
Layout.alignment: Qt.AlignHCenter
source: root.iconPath
width: iconSize
height: iconSize
sourceSize: Qt.size(iconSize, iconSize)
Behavior on width {
animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this)
}
Behavior on height {
animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this)
}
}
}
}
}

View File

@@ -1,3 +0,0 @@
Overview 1.0 Overview.qml
OverviewWidget 1.0 OverviewWidget.qml
OverviewWindow 1.0 OverviewWindow.qml

View File

@@ -1,11 +0,0 @@
pragma Singleton
pragma ComponentBehavior: Bound
import QtQuick
import Quickshell
Singleton {
id: root
property bool overviewOpen: false
property bool superReleaseMightTrigger: true
}

View File

@@ -1,137 +0,0 @@
pragma Singleton
pragma ComponentBehavior: Bound
import QtQuick
import Quickshell
import Quickshell.Io
import Quickshell.Hyprland
/**
* Provides access to some Hyprland data not available in Quickshell.Hyprland.
*/
Singleton {
id: root
property var windowList: []
property var addresses: []
property var windowByAddress: ({})
property var workspaces: []
property var workspaceIds: []
property var workspaceById: ({})
property var activeWorkspace: null
property var monitors: []
property var layers: ({})
function updateWindowList() {
getClients.running = true;
}
function updateLayers() {
getLayers.running = true;
}
function updateMonitors() {
getMonitors.running = true;
}
function updateWorkspaces() {
getWorkspaces.running = true;
getActiveWorkspace.running = true;
}
function updateAll() {
updateWindowList();
updateMonitors();
updateLayers();
updateWorkspaces();
}
function biggestWindowForWorkspace(workspaceId) {
const windowsInThisWorkspace = HyprlandData.windowList.filter(w => w.workspace.id == workspaceId);
return windowsInThisWorkspace.reduce((maxWin, win) => {
const maxArea = (maxWin?.size?.[0] ?? 0) * (maxWin?.size?.[1] ?? 0);
const winArea = (win?.size?.[0] ?? 0) * (win?.size?.[1] ?? 0);
return winArea > maxArea ? win : maxWin;
}, null);
}
Component.onCompleted: {
updateAll();
}
Connections {
target: Hyprland
function onRawEvent(event) {
updateAll()
}
}
Process {
id: getClients
command: ["hyprctl", "clients", "-j"]
stdout: StdioCollector {
id: clientsCollector
onStreamFinished: {
root.windowList = JSON.parse(clientsCollector.text)
let tempWinByAddress = {};
for (var i = 0; i < root.windowList.length; ++i) {
var win = root.windowList[i];
tempWinByAddress[win.address] = win;
}
root.windowByAddress = tempWinByAddress;
root.addresses = root.windowList.map(win => win.address);
}
}
}
Process {
id: getMonitors
command: ["hyprctl", "monitors", "-j"]
stdout: StdioCollector {
id: monitorsCollector
onStreamFinished: {
root.monitors = JSON.parse(monitorsCollector.text);
}
}
}
Process {
id: getLayers
command: ["hyprctl", "layers", "-j"]
stdout: StdioCollector {
id: layersCollector
onStreamFinished: {
root.layers = JSON.parse(layersCollector.text);
}
}
}
Process {
id: getWorkspaces
command: ["hyprctl", "workspaces", "-j"]
stdout: StdioCollector {
id: workspacesCollector
onStreamFinished: {
root.workspaces = JSON.parse(workspacesCollector.text);
let tempWorkspaceById = {};
for (var i = 0; i < root.workspaces.length; ++i) {
var ws = root.workspaces[i];
tempWorkspaceById[ws.id] = ws;
}
root.workspaceById = tempWorkspaceById;
root.workspaceIds = root.workspaces.map(ws => ws.id);
}
}
}
Process {
id: getActiveWorkspace
command: ["hyprctl", "activeworkspace", "-j"]
stdout: StdioCollector {
id: activeWorkspaceCollector
onStreamFinished: {
root.activeWorkspace = JSON.parse(activeWorkspaceCollector.text);
}
}
}
}

View File

@@ -1,2 +0,0 @@
singleton HyprlandData 1.0 HyprlandData.qml
singleton GlobalStates 1.0 GlobalStates.qml

View File

@@ -1,16 +0,0 @@
//@ pragma UseQApplication
//@ pragma Env QT_QUICK_CONTROLS_STYLE=Basic
import "./modules/overview/"
import "./services/"
import "./common/"
import "./common/functions/"
import "./common/widgets/"
import QtQuick
import Quickshell
import Quickshell.Hyprland
ShellRoot {
Overview {}
}

View File

@@ -1,25 +0,0 @@
{
pkgs,
lib,
config,
inputs,
username,
...
}: let
in {
options.peaclock.enable = lib.mkEnableOption "Peaclock";
config.home.packages = lib.mkIf config.peaclock.enable [
(inputs.wrappers.lib.wrapPackage
{
inherit pkgs;
package = pkgs.peaclock;
flags = {
"--config-dir" = "/home/${username}/.peaclock";
"--config" = "/home/${username}/.peaclock/config/digital";
};
})
];
imports = [./digital.nix];
}

View File

@@ -1,61 +0,0 @@
{config, ...}: {
home.file.".peaclock/config/digital" = {
# recursive = true;
text = let
colors = config.stylix.base16Scheme;
in ''
# peaclock
# digital config
#
# For more information, refer to the 'Configuration' and 'Commands'
# sections of the programs help output with '--help' or '-h'.
# -----------------------------------------------------------------------------
# general
# -----------------------------------------------------------------------------
block 2 1
padding 2 1
margin 2 1
ratio 2 1
date-padding 1
locale 'pl_PL.utf8'
timezone 'Europe/Warsaw'
date '%a %b %d %p'
mode stopwatch
view digital
toggle padding
stopwatch start
timer 10m:0s
timer-exec 'notify-send -a peaclock "timer complete"'
rate-input 50
rate-refresh 250
rate-status 5000
# -----------------------------------------------------------------------------
# toggles
# -----------------------------------------------------------------------------
set hour-24 on
set seconds on
set date on
set auto-size on
set auto-ratio on
# -----------------------------------------------------------------------------
# styles
# -----------------------------------------------------------------------------
style active-fg #${colors.base05}
style inactive-fg #${colors.base03}
style colon-fg #${colors.base07}
style active-bg #${colors.base0E}
style inactive-bg #${colors.base00}
style colon-bg #${colors.base00}
style date #${colors.base04}
style background #${colors.base00}
style text #${colors.base05}
style prompt #${colors.base09}
style success #${colors.base0A}
style error #${colors.base02}
'';
};
}

View File

@@ -1,55 +0,0 @@
_: {
home.file.".config/rofi/config-long.rasi".text = ''
@import "~/.config/rofi/config.rasi"
* {
font: "JetBrainsMono Nerd Font Mono 12";
}
window {
width: 750px;
border-radius: 10px;
}
mainbox {
orientation: vertical;
children: [ "inputbar", "listbox" ];
}
listview {
lines: 13;
}
inputbar {
padding: 55px 30px;
background-color: transparent;
background-image: url("~/Pictures/Wallpapers/attack-on-titan-mikasa-ackerman.jpg", width);
text-color: @foreground;
children: [ "textbox-prompt-colon", "entry" ];
}
textbox-prompt-colon {
padding: 12px 20px;
border-radius: 100%;
background-color: @bg-alt;
text-color: @foreground;
}
entry {
expand: true;
padding: 12px 16px;
border-radius: 100%;
background-color: @bg-alt;
text-color: @foreground;
}
button {
padding: 2px;
border-radius: 100%;
}
element {
spacing: 2px;
padding: 2px;
border-radius: 100%;
}
textbox {
padding: 12px;
border-radius: 100%;
}
error-message {
border-radius: 0px;
}
'';
}

View File

@@ -1,6 +0,0 @@
_: {
imports = [
./config-long.nix
./rofi.nix
];
}

View File

@@ -1,207 +0,0 @@
{
pkgs,
config,
...
}: {
programs = {
rofi = {
enable = true;
package = pkgs.rofi;
extraConfig = {
modi = "drun,filebrowser,run";
show-icons = true;
icon-theme = "Papirus";
font = "JetBrainsMono Nerd Font Mono 12";
drun-display-format = "{icon} {name}";
display-drun = " Apps";
display-run = " Run";
display-filebrowser = " File";
};
theme = let
inherit (config.lib.formats.rasi) mkLiteral;
in {
"*" = {
bg = mkLiteral "#${config.stylix.base16Scheme.base00}";
bg-alt = mkLiteral "#${config.stylix.base16Scheme.base09}";
foreground = mkLiteral "#${config.stylix.base16Scheme.base01}";
selected = mkLiteral "#${config.stylix.base16Scheme.base08}";
active = mkLiteral "#${config.stylix.base16Scheme.base0B}";
text-selected = mkLiteral "#${config.stylix.base16Scheme.base00}";
text-color = mkLiteral "#${config.stylix.base16Scheme.base05}";
border-color = mkLiteral "#${config.stylix.base16Scheme.base0F}";
urgent = mkLiteral "#${config.stylix.base16Scheme.base0E}";
};
"window" = {
transparency = "real";
width = mkLiteral "1000px";
location = mkLiteral "center";
anchor = mkLiteral "center";
fullscreen = false;
x-offset = mkLiteral "0px";
y-offset = mkLiteral "0px";
cursor = "default";
enabled = true;
border-radius = mkLiteral "15px";
background-color = mkLiteral "@bg";
};
"mainbox" = {
enabled = true;
spacing = mkLiteral "0px";
orientation = mkLiteral "horizontal";
children = map mkLiteral [
"imagebox"
"listbox"
];
background-color = mkLiteral "transparent";
};
"imagebox" = {
padding = mkLiteral "20px";
background-color = mkLiteral "transparent";
background-image = mkLiteral ''url("~/Pictures/Wallpapers/fire-nation.jpg", height)'';
orientation = mkLiteral "vertical";
children = map mkLiteral [
"inputbar"
"dummy"
"mode-switcher"
];
};
"listbox" = {
spacing = mkLiteral "20px";
padding = mkLiteral "20px";
background-color = mkLiteral "transparent";
orientation = mkLiteral "vertical";
children = map mkLiteral [
"message"
"listview"
];
};
"dummy" = {
background-color = mkLiteral "transparent";
};
"inputbar" = {
enabled = true;
spacing = mkLiteral "10px";
padding = mkLiteral "10px";
border-radius = mkLiteral "10px";
background-color = mkLiteral "@bg-alt";
text-color = mkLiteral "@foreground";
children = map mkLiteral [
"textbox-prompt-colon"
"entry"
];
};
"textbox-prompt-colon" = {
enabled = true;
expand = false;
str = "";
background-color = mkLiteral "inherit";
text-color = mkLiteral "inherit";
};
"entry" = {
enabled = true;
background-color = mkLiteral "inherit";
text-color = mkLiteral "inherit";
cursor = mkLiteral "text";
placeholder = "Search";
placeholder-color = mkLiteral "inherit";
};
"mode-switcher" = {
enabled = true;
spacing = mkLiteral "20px";
background-color = mkLiteral "transparent";
text-color = mkLiteral "@foreground";
};
"button" = {
padding = mkLiteral "15px";
border-radius = mkLiteral "10px";
background-color = mkLiteral "@bg-alt";
text-color = mkLiteral "inherit";
cursor = mkLiteral "pointer";
};
"button selected" = {
background-color = mkLiteral "@selected";
text-color = mkLiteral "@foreground";
};
"listview" = {
enabled = true;
columns = 1;
lines = 8;
cycle = true;
dynamic = true;
scrollbar = false;
layout = mkLiteral "vertical";
reverse = false;
fixed-height = true;
fixed-columns = true;
spacing = mkLiteral "10px";
background-color = mkLiteral "transparent";
text-color = mkLiteral "@foreground";
cursor = "default";
};
"element" = {
enabled = true;
spacing = mkLiteral "15px";
padding = mkLiteral "8px";
border-radius = mkLiteral "10px";
background-color = mkLiteral "transparent";
text-color = mkLiteral "@text-color";
cursor = mkLiteral "pointer";
};
"element normal.normal" = {
background-color = mkLiteral "inherit";
text-color = mkLiteral "@text-color";
};
"element normal.urgent" = {
background-color = mkLiteral "@urgent";
text-color = mkLiteral "@text-color";
};
"element normal.active" = {
background-color = mkLiteral "inherit";
text-color = mkLiteral "@text-color";
};
"element selected.normal" = {
background-color = mkLiteral "@selected";
text-color = mkLiteral "@foreground";
};
"element selected.urgent" = {
background-color = mkLiteral "@urgent";
text-color = mkLiteral "@text-selected";
};
"element selected.active" = {
background-color = mkLiteral "@urgent";
text-color = mkLiteral "@text-selected";
};
"element-icon" = {
background-color = mkLiteral "transparent";
text-color = mkLiteral "inherit";
size = mkLiteral "36px";
cursor = mkLiteral "inherit";
};
"element-text" = {
background-color = mkLiteral "transparent";
text-color = mkLiteral "inherit";
cursor = mkLiteral "inherit";
vertical-align = mkLiteral "0.5";
horizontal-align = mkLiteral "0.0";
};
"message" = {
background-color = mkLiteral "transparent";
};
"textbox" = {
padding = mkLiteral "15px";
border-radius = mkLiteral "10px";
background-color = mkLiteral "@bg-alt";
text-color = mkLiteral "@foreground";
vertical-align = mkLiteral "0.5";
horizontal-align = mkLiteral "0.0";
};
"error-message" = {
padding = mkLiteral "15px";
border-radius = mkLiteral "20px";
background-color = mkLiteral "@bg";
text-color = mkLiteral "@foreground";
};
};
};
};
}

View File

@@ -1,35 +1,7 @@
{
pkgs,
username,
...
}: {
home.packages = with pkgs; [
# hyprland
swww
grim
slurp
wl-clipboard
swappy
ydotool
hyprpolkitagent
hyprland-qtutils # needed for banners and ANR messages
# pyprland
pyprland
(import ./emopicker9000.nix {inherit pkgs;})
(import ./hm-find.nix {inherit pkgs;})
(import ./keybinds.nix {inherit pkgs username;})
(import ./note.nix {inherit pkgs;})
(import ./note-from-clipboard.nix {inherit pkgs;})
{pkgs, ...}: {
home.packages = [
(import ./nvidia-offload.nix {inherit pkgs;})
(import ./rofi-launcher.nix {inherit pkgs;})
(import ./screenshootin.nix {inherit pkgs;})
(import ./task-waybar.nix {inherit pkgs;})
(import ./wallsetter.nix {
inherit pkgs;
inherit username;
})
(import ./web-search.nix {inherit pkgs;})
(import ./restart.noctalia.nix {inherit pkgs;})
(import ./screenshootin.nix {inherit pkgs;})
];
}

View File

@@ -1,22 +0,0 @@
{pkgs}:
pkgs.writeShellScriptBin "emopicker9000" ''
# check if rofi is already running
if pidof rofi > /dev/null; then
pkill rofi
fi
# Get user selection via wofi from emoji file.
chosen=$(cat $HOME/.config/.emoji | ${pkgs.rofi}/bin/rofi -i -dmenu -config ~/.config/rofi/config-long.rasi | awk '{print $1}')
# Exit if none chosen.
[ -z "$chosen" ] && exit
# If you run this command with an argument, it will automatically insert the
# character. Otherwise, show a message that the emoji has been copied.
if [ -n "$1" ]; then
${pkgs.ydotool}/bin/ydotool type "$chosen"
else
printf "$chosen" | ${pkgs.wl-clipboard}/bin/wl-copy
${pkgs.libnotify}/bin/notify-send "'$chosen' copied to clipboard." &
fi
''

View File

@@ -1,60 +0,0 @@
{pkgs}:
pkgs.writeShellScriptBin "hm-find" ''
#!/usr/bin/env bash
# Script Metadata
#===============================================
# This script searches recent journalctl entries for Home Manager errors
# It identifies backup files that prevent rebuilds and allows removal.
# Author: Don Williams
# Creation Date: May 6th, 2025
# Revision History:
#-----------------------------------------------
# 0.1 - 5/6/25 - Initial version
# 0.2 - 5/7/25 - Improved messaging, added log directory check
# Display WARNING message
echo "==============================================="
echo " WARNING "
echo "==============================================="
echo "*** This script is experimental! ***"
echo "It will attempt to find old backup files that are preventing Home Manager from rebuilding."
echo "If conflicting files are found, you will be prompted to remove them."
echo "A log of any deletions will be stored in \$HOME/hm-logs."
echo "==============================================="
# Define the time range (default: last 30 minutes)
TIME_RANGE="30m"
LOG_DIR="$HOME/hm-logs"
LOG_FILE="$LOG_DIR/hm-cleanup-$(date +'%Y-%m-%d_%H-%M-%S').log"
# Ensure the log directory exists
if [ ! -d "$LOG_DIR" ]; then
echo "Creating log directory: $LOG_DIR"
mkdir -p "$LOG_DIR"
fi
# Search journal logs for backup conflicts and extract file paths
FILES=$(journalctl --since "-$TIME_RANGE" -xe | grep hm-activate | awk -F "'|'" '/would be clobbered by backing up/ {print $2}')
# Check if any files were found
if [ -z "$FILES" ]; then
echo "No conflicting backup files found in the last $TIME_RANGE."
exit 0
fi
# Display found backup files
echo "🚨 The following backup files are preventing Home Manager from rebuilding:"
echo "$FILES" | tr ' ' '\n'
# Ask for user confirmation before deletion
read -p " Do you want to remove these files? (y/N): " confirm
if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then
echo "🗑 Deleting files..." | tee -a "$LOG_FILE"
echo "$FILES" | xargs rm -v | tee -a "$LOG_FILE"
echo " Cleanup completed at $(date)" | tee -a "$LOG_FILE"
else
echo " No files were removed." | tee -a "$LOG_FILE"
fi
''

View File

@@ -1,32 +0,0 @@
{
pkgs,
username,
...
}: let
desktopEntriesPath = "/home/${username}/.local/state/home-manager/gcroots/current-home/home-path/share/applications/";
in
pkgs.writeShellScriptBin "list-keybinds" ''
# check if rofi is already running
if pidof rofi > /dev/null; then
pkill rofi
fi
msg=' = Windows/Super/CAPS LOCK (Enter nie wykonuje skrótu)'
keybinds=$(cat ~/.config/hypr/hyprland.conf | grep -E '^bind')
# replace SUPER with SUPER and clean up paths
display_keybinds=$(echo "$keybinds" | sed 's/\SUPER//g' | sed 's|${desktopEntriesPath}/||g')
# remove "bind=" and "bindm=" prefixes
display_keybinds=$(echo "$display_keybinds" | sed 's/^bind=//' | sed 's/^bindm=/🖱/')
# add + before CONTROL, SHIFT, ALT when they appear after removed SUPER
display_keybinds=$(echo "$display_keybinds" | sed 's/ CONTROL/ + CONTROL/g' | sed 's/ SHIFT/ + SHIFT/g' | sed 's/ ALT/ + ALT/g')
# replace commas: first comma -> " +", second comma -> " =", remaining commas -> " ->"
display_keybinds=$(echo "$display_keybinds" | sed 's/,/ +/1' | sed 's/,/ =/1' | sed 's/,/ ->/g')
# use rofi to display the keybinds with the modified content
echo "$display_keybinds" | rofi -dmenu -i -config ~/.config/rofi/config-long.rasi -mesg "$msg"
''

View File

@@ -1,20 +0,0 @@
{pkgs, ...}:
pkgs.writeShellScriptBin "note-from-clipboard" ''
#!/usr/bin/env bash
# Check clipboard content type
clipboard_type=$(${pkgs.wl-clipboard}/bin/wl-paste --list-types | head -n 1)
if [[ "$clipboard_type" == "text/plain"* ]]; then
# It's text, let's create a note
${pkgs.wl-clipboard}/bin/wl-paste | note
if [ $? -eq 0 ]; then
${pkgs.libnotify}/bin/notify-send -t 3000 "📝 Note Created" "Clipboard content added as a new note."
else
${pkgs.libnotify}/bin/notify-send -t 5000 -u critical " Note Creation Failed" "There was an error creating the note."
fi
else
# It's not text, so we do nothing and notify the user
${pkgs.libnotify}/bin/notify-send -t 4000 -u low "📋 Note Skipped" "Clipboard does not contain text."
fi
''

View File

@@ -1,244 +0,0 @@
{pkgs, ...}:
pkgs.writeShellScriptBin "note" ''
# Colors for nice output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[1;37m'
GRAY='\033[0;37m'
BOLD='\033[1m'
NC='\033[0m' # No Color
# XDG-compliant notes directory and file
NOTES_DIR="$HOME/.local/share/notes"
NOTES_FILE="$NOTES_DIR/notes.txt"
# Create notes directory if it doesn't exist
mkdir -p "$NOTES_DIR"
# Function to display usage
show_usage() {
echo -e "''${BOLD}''${BLUE}📝 Note Manager''${NC}"
echo -e "''${GRAY}Usage:''${NC}"
echo -e " ''${CYAN}note''${NC} ''${YELLOW}<text>''${NC} - Add a new note"
echo -e " ''${CYAN}note''${NC} - Display all notes"
echo -e " ''${CYAN}note del''${NC} ''${YELLOW}<number>''${NC} - Delete note by number"
echo -e " ''${CYAN}note clear''${NC} - Clear all notes"
echo -e " ''${CYAN}echo 'text' | note''${NC} - Add note from stdin"
echo -e " ''${CYAN}cat file | note''${NC} - Add file contents as note"
echo ""
echo -e "''${GRAY}Examples:''${NC}"
echo -e " ''${GREEN}note call plumber tomorrow''${NC}"
echo -e " ''${GREEN}cat todo.txt | note''${NC}"
echo -e " ''${GREEN}note del 3''${NC}"
}
# Function to add a note
add_note() {
local note_text="$1"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
local date_only=$(date '+%Y-%m-%d')
# Create notes file if it doesn't exist
touch "$NOTES_FILE"
# Get next note number
local note_num=1
if [ -f "$NOTES_FILE" ] && [ -s "$NOTES_FILE" ]; then
note_num=$(grep -E "^#[0-9]+" "$NOTES_FILE" | sed 's/^#\([0-9]*\).*/\1/' | sort -n | tail -1)
note_num=$((note_num + 1))
fi
# Add the note with proper formatting
{
echo "#$note_num [$timestamp]"
echo "$note_text"
echo ""
} >> "$NOTES_FILE"
echo -e "''${GREEN}''${NC} Note #$note_num added ''${GRAY}($date_only)''${NC}"
}
# Function to display all notes
display_notes() {
if [ ! -f "$NOTES_FILE" ] || [ ! -s "$NOTES_FILE" ]; then
echo -e "''${YELLOW}📝 No notes found''${NC}"
echo -e "''${GRAY}Use ''${CYAN}note <text>''${GRAY} to add your first note''${NC}"
return
fi
echo -e "''${BOLD}''${BLUE}📝 Your Notes''${NC}"
echo -e "''${GRAY}📁 $NOTES_FILE''${NC}"
echo -e "''${GRAY}$(printf '%.0s' {1..50})''${NC}"
local in_note=false
local note_content=""
while IFS= read -r line; do
# Check if line starts with # followed by numbers and space and [
if echo "$line" | grep -q "^#[0-9][0-9]* \["; then
# Print previous note content if exists
if [ "$in_note" = true ] && [ -n "$note_content" ]; then
echo -e "$note_content"
echo ""
fi
# Extract note number and timestamp
local num=$(echo "$line" | sed 's/^#\([0-9]*\) \[.*/\1/')
local timestamp=$(echo "$line" | sed 's/^#[0-9]* \[\(.*\)\]/\1/')
local date_part=$(echo "$timestamp" | cut -d' ' -f1)
local time_part=$(echo "$timestamp" | cut -d' ' -f2)
echo -e "''${BOLD}''${CYAN}#$num''${NC} ''${GRAY}[$date_part ''${YELLOW}$time_part''${GRAY}]''${NC}"
in_note=true
note_content=""
elif [ -n "$line" ] && [ "$in_note" = true ]; then
# Accumulate note content
if [ -z "$note_content" ]; then
note_content="''${WHITE}$line''${NC}"
else
note_content="$note_content\n''${WHITE}$line''${NC}"
fi
elif [ -z "$line" ] && [ "$in_note" = true ]; then
# End of current note
if [ -n "$note_content" ]; then
echo -e "$note_content"
echo ""
fi
in_note=false
note_content=""
fi
done < "$NOTES_FILE"
# Print last note if file doesn't end with empty line
if [ "$in_note" = true ] && [ -n "$note_content" ]; then
echo -e "$note_content"
echo ""
fi
local total_notes=$(grep -c "^#[0-9]" "$NOTES_FILE")
echo -e "''${GRAY}$(printf '%.0s' {1..50})''${NC}"
echo -e "''${GRAY}Total: ''${BOLD}$total_notes''${NC} ''${GRAY}notes''${NC}"
}
# Function to delete a note
delete_note() {
local note_num="$1"
if [ ! -f "$NOTES_FILE" ] || [ ! -s "$NOTES_FILE" ]; then
echo -e "''${RED}''${NC} No notes found"
return 1
fi
if ! echo "$note_num" | grep -q "^[0-9][0-9]*$"; then
echo -e "''${RED}''${NC} Invalid note number: $note_num"
return 1
fi
# Check if note exists
if ! grep -q "^#$note_num " "$NOTES_FILE"; then
echo -e "''${RED}''${NC} Note #$note_num not found"
return 1
fi
# Create temporary file without the specified note
local temp_file=$(mktemp)
local skip_lines=false
while IFS= read -r line; do
if echo "$line" | grep -q "^#[0-9][0-9]* "; then
local current_num=$(echo "$line" | sed 's/^#\([0-9]*\) .*/\1/')
if [ "$current_num" = "$note_num" ]; then
skip_lines=true
continue
else
skip_lines=false
fi
fi
if [ "$skip_lines" = false ]; then
echo "$line" >> "$temp_file"
elif [ -z "$line" ]; then
# Stop skipping when we hit an empty line (end of note)
skip_lines=false
fi
done < "$NOTES_FILE"
mv "$temp_file" "$NOTES_FILE"
echo -e "''${GREEN}''${NC} Note #$note_num deleted"
}
# Function to clear all notes
clear_notes() {
if [ ! -f "$NOTES_FILE" ] || [ ! -s "$NOTES_FILE" ]; then
echo -e "''${YELLOW}📝 No notes to clear''${NC}"
return
fi
local total_notes=$(grep -c "^#[0-9]" "$NOTES_FILE")
echo -e "''${YELLOW}''${NC} This will delete all $total_notes notes. Are you sure? ''${GRAY}[y/N]''${NC}"
read -r confirmation
if echo "$confirmation" | grep -qi "^y"; then
> "$NOTES_FILE"
echo -e "''${GREEN}''${NC} All notes cleared"
else
echo -e "''${BLUE}''${NC} Operation cancelled"
fi
}
# Main script logic
main() {
# Check if input is being piped
if [ ! -t 0 ]; then
# Read from stdin (pipe)
local piped_content=""
while IFS= read -r line; do
if [ -z "$piped_content" ]; then
piped_content="$line"
else
piped_content="$piped_content"$'\n'"$line"
fi
done
if [ -n "$piped_content" ]; then
add_note "$piped_content"
else
echo -e "''${RED}''${NC} No input received from pipe"
exit 1
fi
return
fi
# Handle command line arguments
case "$1" in
"")
display_notes
;;
"del")
if [ -z "$2" ]; then
echo -e "''${RED}''${NC} Please specify note number to delete"
echo -e "''${GRAY}Usage: ''${CYAN}note del <number>''${NC}"
exit 1
fi
delete_note "$2"
;;
"clear")
clear_notes
;;
"help"|"--help"|"-h")
show_usage
;;
*)
# Everything else is treated as note content
add_note "$*"
;;
esac
}
main "$@"
''

View File

@@ -1,8 +0,0 @@
{pkgs}:
pkgs.writeShellScriptBin "rofi-launcher" ''
# check if rofi is already running
if pidof rofi > /dev/null; then
pkill rofi
fi
rofi -show drun
''

View File

@@ -1,5 +0,0 @@
{pkgs}:
pkgs.writeShellScriptBin "task-waybar" ''
sleep 0.1
${pkgs.swaynotificationcenter}/bin/swaync-client -t &
''

View File

@@ -1,23 +0,0 @@
{pkgs, ...}:
pkgs.writeShellScriptBin "wallsetter" ''
TIMEOUT=720
for pid in $(pidof -o %PPID -x wallsetter); do
kill $pid
done
if ! [ -d ~/Pictures/Wallpapers ]; then notify-send -t 5000 "~/Pictures/Wallpapers does not exist" && exit 1; fi
if [ $(ls -1 ~/Pictures/Wallpapers | wc -l) -lt 1 ]; then notify-send -t 9000 "The wallpaper folder is expected to have more than 1 image. Exiting Wallsetter." && exit 1; fi
while true; do
while [ "$WALLPAPER" == "$PREVIOUS" ]; do
WALLPAPER=$(find ~/Pictures/Wallpapers -name '*' | awk '!/.git/' | tail -n +2 | shuf -n 1)
done
PREVIOUS=$WALLPAPER
${pkgs.swww}/bin/swww img "$WALLPAPER" --transition-type random --transition-step 1 --transition-fps 60
sleep $TIMEOUT
done
''

View File

@@ -1,59 +0,0 @@
{pkgs}:
pkgs.writeShellScriptBin "web-search" ''
# check if rofi is already running
if pidof rofi > /dev/null; then
pkill rofi
fi
declare -A URLS
URLS=(
[" Search"]="https://search.garandplg.com/search?q="
[" Nix Unstable Packages"]="https://search.nixos.org/packages?channel=unstable&query="
[" Nix Options"]="https://search.nixos.org/options?query="
[" Nix Wiki"]="https://wiki.nixos.org/w/index.php?search="
[" Home Manager Options"]="https://home-manager-options.extranix.com/release=master?query="
[" Kalkulator walutowy EUR"]="https://www.money.pl/pieniadze/kalkulator/?currencyFrom=EUR&currencyTo=PLN&amount="
["\$ Kalkulator walutowy USD"]="https://www.money.pl/pieniadze/kalkulator/?currencyFrom=USD&currencyTo=PLN&amount="
[" YouTube"]="https://www.youtube.com/results?search_query="
[" Wikipedia PL"]="https://pl.wikipedia.org/w/index.php?search="
[" StackOverflow"]="https://stackoverflow.com/search?q="
[" Eneba"]="https://www.eneba.com/pl/store/all?text="
[" Kinguin"]="https://www.kinguin.net/listing?active=1&hideUnavailable=0&type=kinguin?phrase="
[" Instant Gaming"]="https://www.instant-gaming.com/pl/search/?q="
[" Morele"]="https://www.morele.net/wyszukiwarka/?q="
[" X-kom"]="https://www.x-kom.pl/szukaj?q="
[" Komputrnik"]="https://www.komputronik.pl/search/category/1?q="
[" Allegro"]="https://allegro.pl/listing?string="
)
# List for rofi
gen_list() {
for i in "''${!URLS[@]}"
do
echo "$i"
done
}
main() {
# Pass the list to rofi
platform=$( (gen_list) | ${pkgs.rofi}/bin/rofi -dmenu -config ~/.config/rofi/config-long.rasi )
if [[ -n "$platform" ]]; then
query=$( (echo ) | ${pkgs.rofi}/bin/rofi -dmenu -config ~/.config/rofi/config-long.rasi )
if [[ -n "$query" ]]; then
url=''${URLS[$platform]}$query
xdg-open "$url"
else
exit
fi
else
exit
fi
}
main
exit 0
''

View File

@@ -1,10 +1,7 @@
{host, ...}: {
stylix.targets = {
librewolf.profileNames = ["${host}"];
waybar.enable = false;
rofi.enable = false;
hyprland.enable = false;
hyprlock.enable = false;
vscode.enable = false;
zed.enable = false;
vesktop.enable = false;

View File

@@ -1,11 +0,0 @@
{pkgs, ...}: {
services.swaync = {
enable = true;
package = pkgs.swaynotificationcenter;
};
imports = [
./settings.nix
./style.nix
];
}

View File

@@ -1,59 +0,0 @@
_: {
services.swaync.settings = {
positionX = "right";
positionY = "top";
layer = "overlay";
control-center-margin-top = 10;
control-center-margin-bottom = 10;
control-center-margin-right = 10;
control-center-margin-left = 10;
notification-icon-size = 64;
notification-body-image-height = 100;
notification-body-image-width = 200;
timeout = 10;
timeout-low = 5;
timeout-critical = 0;
fit-to-screen = false;
control-center-width = 500;
control-center-height = 1025;
notification-window-width = 500;
keyboard-shortcuts = true;
image-visibility = "when-available";
transition-time = 200;
hide-on-clear = false;
hide-on-action = true;
script-fail-notify = true;
widget-config = {
title = {
text = "Notification Center";
clear-all-button = true;
button-text = "󰆴 Clear All";
};
dnd = {
text = "Do Not Disturb";
};
label = {
max-lines = 1;
text = "Notification Center";
};
mpris = {
image-size = 96;
image-radius = 7;
};
volume = {
label = "󰕾";
};
backlight = {
label = "󰃟";
};
};
widgets = [
"title"
"mpris"
"volume"
"backlight"
"dnd"
"notifications"
];
};
}

View File

@@ -1,251 +0,0 @@
{config, ...}: {
services.swaync.style = ''
* {
font-family: JetBrainsMono Nerd Font Mono;
font-weight: bold;
}
.control-center .notification-row:focus,
.control-center .notification-row:hover {
opacity: 0.9;
background: #${config.lib.stylix.colors.base00}
}
.notification-row {
outline: none;
margin: 10px;
padding: 0;
}
.notification {
background: transparent;
padding: 0;
margin: 0px;
}
.notification-content {
background: #${config.lib.stylix.colors.base00};
padding: 10px;
border-radius: 5px;
border: 2px solid #${config.lib.stylix.colors.base0D};
margin: 0;
}
.notification-default-action {
margin: 0;
padding: 0;
border-radius: 5px;
}
.close-button {
background: #${config.lib.stylix.colors.base08};
color: #${config.lib.stylix.colors.base00};
text-shadow: none;
padding: 0;
border-radius: 5px;
margin-top: 5px;
margin-right: 5px;
}
.close-button:hover {
box-shadow: none;
background: #${config.lib.stylix.colors.base0D};
transition: all .15s ease-in-out;
border: none
}
.notification-action {
border: 2px solid #${config.lib.stylix.colors.base0D};
border-top: none;
border-radius: 5px;
}
.notification-default-action:hover,
.notification-action:hover {
color: #${config.lib.stylix.colors.base0B};
background: #${config.lib.stylix.colors.base0B}
}
.notification-default-action {
border-radius: 5px;
margin: 0px;
}
.notification-default-action:not(:only-child) {
border-bottom-left-radius: 7px;
border-bottom-right-radius: 7px
}
.notification-action:first-child {
border-bottom-left-radius: 10px;
background: #${config.lib.stylix.colors.base00}
}
.notification-action:last-child {
border-bottom-right-radius: 10px;
background: #${config.lib.stylix.colors.base00}
}
.inline-reply {
margin-top: 8px
}
.inline-reply-entry {
background: #${config.lib.stylix.colors.base00};
color: #${config.lib.stylix.colors.base05};
caret-color: #${config.lib.stylix.colors.base05};
border: 1px solid #${config.lib.stylix.colors.base09};
border-radius: 5px
}
.inline-reply-button {
margin-left: 4px;
background: #${config.lib.stylix.colors.base00};
border: 1px solid #${config.lib.stylix.colors.base09};
border-radius: 5px;
color: #${config.lib.stylix.colors.base05}
}
.inline-reply-button:disabled {
background: initial;
color: #${config.lib.stylix.colors.base03};
border: 1px solid transparent
}
.inline-reply-button:hover {
background: #${config.lib.stylix.colors.base00}
}
.body-image {
margin-top: 6px;
background-color: #${config.lib.stylix.colors.base05};
border-radius: 5px
}
.summary {
font-size: 16px;
font-weight: 700;
background: transparent;
color: rgba(158, 206, 106, 1);
text-shadow: none
}
.time {
font-size: 16px;
font-weight: 700;
background: transparent;
color: #${config.lib.stylix.colors.base05};
text-shadow: none;
margin-right: 18px
}
.body {
font-size: 15px;
font-weight: 400;
background: transparent;
color: #${config.lib.stylix.colors.base05};
text-shadow: none
}
.control-center {
background: #${config.lib.stylix.colors.base00};
border: 2px solid #${config.lib.stylix.colors.base0C};
border-radius: 5px;
}
.control-center-list {
background: transparent
}
.control-center-list-placeholder {
opacity: .5
}
.floating-notifications {
background: transparent
}
.blank-window {
background: alpha(black, 0)
}
.widget-title {
color: #${config.lib.stylix.colors.base0B};
background: #${config.lib.stylix.colors.base00};
padding: 5px 10px;
margin: 10px 10px 5px 10px;
font-size: 1.5rem;
border-radius: 5px;
}
.widget-title>button {
font-size: 1rem;
color: #${config.lib.stylix.colors.base05};
text-shadow: none;
background: #${config.lib.stylix.colors.base00};
box-shadow: none;
border-radius: 5px;
}
.widget-title>button:hover {
background: #${config.lib.stylix.colors.base08};
color: #${config.lib.stylix.colors.base00};
}
.widget-dnd {
background: #${config.lib.stylix.colors.base00};
padding: 5px 10px;
margin: 10px 10px 5px 10px;
border-radius: 5px;
font-size: large;
color: #${config.lib.stylix.colors.base0B};
}
.widget-dnd>switch {
border-radius: 5px;
/* border: 1px solid #${config.lib.stylix.colors.base0B}; */
background: #${config.lib.stylix.colors.base0B};
}
.widget-dnd>switch:checked {
background: #${config.lib.stylix.colors.base08};
border: 1px solid #${config.lib.stylix.colors.base08};
}
.widget-dnd>switch slider {
background: #${config.lib.stylix.colors.base00};
border-radius: 5px
}
.widget-dnd>switch:checked slider {
background: #${config.lib.stylix.colors.base00};
border-radius: 5px
}
.widget-label {
margin: 10px 10px 5px 10px;
}
.widget-label>label {
font-size: 1rem;
color: #${config.lib.stylix.colors.base05};
}
.widget-mpris {
color: #${config.lib.stylix.colors.base05};
padding: 5px 10px;
margin: 10px 10px 5px 10px;
border-radius: 5px;
}
.widget-mpris > box > button {
border-radius: 5px;
}
.widget-mpris-player {
padding: 5px 10px;
margin: 10px
}
.widget-mpris-title {
font-weight: 700;
font-size: 1.25rem
}
.widget-mpris-subtitle {
font-size: 1.1rem
}
.widget-menubar>box>.menu-button-bar>button {
border: none;
background: transparent
}
.topbar-buttons>button {
border: none;
background: transparent
}
.widget-volume {
background: #${config.lib.stylix.colors.base01};
padding: 5px;
margin: 10px 10px 5px 10px;
border-radius: 5px;
font-size: x-large;
color: #${config.lib.stylix.colors.base05};
}
.widget-volume>box>button {
background: #${config.lib.stylix.colors.base0B};
border: none
}
.per-app-volume {
background-color: #${config.lib.stylix.colors.base00};
padding: 4px 8px 8px;
margin: 0 8px 8px;
border-radius: 5px;
}
.widget-backlight {
background: #${config.lib.stylix.colors.base01};
padding: 5px;
margin: 10px 10px 5px 10px;
border-radius: 5px;
font-size: x-large;
color: #${config.lib.stylix.colors.base05}
}
'';
}

View File

@@ -1,277 +0,0 @@
{
pkgs,
lib,
host,
config,
...
}: let
betterTransition = "all 0.3s cubic-bezier(.55,-0.68,.48,1.682)";
inherit (import ../../../hosts/${host}/variables.nix) clock24h;
in
with lib; {
# Configure & Theme Waybar
programs.waybar = {
enable = true;
package = pkgs.waybar;
settings = [
{
layer = "top";
position = "top";
modules-center = ["hyprland/workspaces"];
modules-left = [
"custom/startmenu"
"hyprland/window"
"pulseaudio"
"cpu"
"memory"
"idle_inhibitor"
];
modules-right = [
"custom/hyprbindings"
"custom/notification"
"custom/exit"
"battery"
"tray"
"clock"
];
"hyprland/workspaces" = {
format = "{name}";
format-icons = {
default = " ";
active = " ";
urgent = " ";
};
on-scroll-up = "hyprctl dispatch workspace e+1";
on-scroll-down = "hyprctl dispatch workspace e-1";
};
"clock" = {
format =
if clock24h == true
then '' {:L%H:%M}''
else '' {:L%I:%M %p}'';
tooltip = true;
tooltip-format = "<big>{:%A, %d.%B %Y }</big>\n<tt><small>{calendar}</small></tt>";
};
"hyprland/window" = {
max-length = 22;
separate-outputs = false;
rewrite = {
"" = " 🙈 No Windows? ";
};
};
"memory" = {
interval = 5;
format = " {}%";
tooltip = true;
};
"cpu" = {
interval = 5;
format = " {usage:2}%";
tooltip = true;
};
"disk" = {
format = " {free}";
tooltip = true;
};
"network" = {
format-icons = [
"󰤯"
"󰤟"
"󰤢"
"󰤥"
"󰤨"
];
format-ethernet = " {bandwidthDownOctets}";
format-wifi = "{icon} {signalStrength}%";
format-disconnected = "󰤮";
tooltip = false;
};
"tray" = {
spacing = 12;
};
"pulseaudio" = {
format = "{icon} {volume}% {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 = "sleep 0.1 && pavucontrol";
};
"custom/exit" = {
tooltip = false;
format = "";
on-click = "sleep 0.1 && wlogout";
};
"custom/startmenu" = {
tooltip = false;
format = "";
# exec = "rofi -show drun";
on-click = "sleep 0.1 && rofi-launcher";
};
"custom/hyprbindings" = {
tooltip = false;
format = "󱕴";
on-click = "sleep 0.1 && list-keybinds";
};
"idle_inhibitor" = {
format = "{icon}";
format-icons = {
activated = "";
deactivated = "";
};
tooltip = "true";
};
"custom/notification" = {
tooltip = false;
format = "{icon} {}";
format-icons = {
notification = "<span foreground='red'><sup></sup></span>";
none = "";
dnd-notification = "<span foreground='red'><sup></sup></span>";
dnd-none = "";
inhibited-notification = "<span foreground='red'><sup></sup></span>";
inhibited-none = "";
dnd-inhibited-notification = "<span foreground='red'><sup></sup></span>";
dnd-inhibited-none = "";
};
return-type = "json";
exec-if = "which swaync-client";
exec = "swaync-client -swb";
on-click = "sleep 0.1 && task-waybar";
escape = true;
};
"battery" = {
states = {
warning = 30;
critical = 15;
};
format = "{icon} {capacity}%";
format-charging = "󰂄 {capacity}%";
format-plugged = "󱘖 {capacity}%";
format-icons = [
"󰁺"
"󰁻"
"󰁼"
"󰁽"
"󰁾"
"󰁿"
"󰂀"
"󰂁"
"󰂂"
"󰁹"
];
on-click = "";
tooltip = false;
};
}
];
style = concatStrings [
''
* {
font-family: JetBrainsMono Nerd Font Mono;
font-size: 16px;
border-radius: 0px;
border: none;
min-height: 0px;
}
window#waybar {
background: rgba(0,0,0,0);
}
#workspaces {
color: #${config.lib.stylix.colors.base00};
background: #${config.lib.stylix.colors.base01};
margin: 4px 4px;
padding: 5px 5px;
border-radius: 16px;
}
#workspaces button {
font-weight: bold;
padding: 0px 5px;
margin: 0px 3px;
border-radius: 16px;
color: #${config.lib.stylix.colors.base00};
background: linear-gradient(45deg, #${config.lib.stylix.colors.base08}, #${config.lib.stylix.colors.base0D});
opacity: 0.5;
transition: ${betterTransition};
}
#workspaces button.active {
font-weight: bold;
padding: 0px 5px;
margin: 0px 3px;
border-radius: 16px;
color: #${config.lib.stylix.colors.base00};
background: linear-gradient(45deg, #${config.lib.stylix.colors.base08}, #${config.lib.stylix.colors.base0D});
transition: ${betterTransition};
opacity: 1.0;
min-width: 40px;
}
#workspaces button:hover {
font-weight: bold;
border-radius: 16px;
color: #${config.lib.stylix.colors.base00};
background: linear-gradient(45deg, #${config.lib.stylix.colors.base08}, #${config.lib.stylix.colors.base0D});
opacity: 0.8;
transition: ${betterTransition};
}
tooltip {
background: #${config.lib.stylix.colors.base00};
border: 1px solid #${config.lib.stylix.colors.base08};
border-radius: 12px;
}
tooltip label {
color: #${config.lib.stylix.colors.base08};
}
#window, #pulseaudio, #cpu, #memory, #idle_inhibitor {
font-weight: bold;
margin: 4px 0px;
margin-left: 7px;
padding: 0px 18px;
background: #${config.lib.stylix.colors.base04};
color: #${config.lib.stylix.colors.base00};
border-radius: 24px 10px 24px 10px;
}
#custom-startmenu {
color: #${config.lib.stylix.colors.base0B};
background: #${config.lib.stylix.colors.base02};
font-size: 28px;
margin: 0px;
padding: 0px 30px 0px 15px;
border-radius: 0px 0px 40px 0px;
}
#custom-hyprbindings, #network, #battery,
#custom-notification, #tray, #custom-exit {
font-weight: bold;
background: #${config.lib.stylix.colors.base0F};
color: #${config.lib.stylix.colors.base00};
margin: 4px 0px;
margin-right: 7px;
border-radius: 10px 24px 10px 24px;
padding: 0px 18px;
}
#clock {
font-weight: bold;
color: #0D0E15;
background: linear-gradient(90deg, #${config.lib.stylix.colors.base0E}, #${config.lib.stylix.colors.base0C});
margin: 0px;
padding: 0px 15px 0px 30px;
border-radius: 0px 0px 0px 40px;
}
''
];
};
}

View File

@@ -1,385 +0,0 @@
{
pkgs,
lib,
...
}: let
terminal = "kitty";
base00 = "0F1419";
base01 = "131721";
base03 = "3E4B59";
base05 = "E6E1CF";
base06 = "E6E1CF";
base07 = "F3F4F5";
base08 = "F07178";
base09 = "FF8F40";
base0A = "FFB454";
base0B = "B8CC52";
base0C = "95E6CB";
base0D = "59C2FF";
base0E = "D2A6FF";
base0F = "E6B673";
in
with lib; {
# Configure & Theme Waybar
programs.waybar = {
enable = true;
package = pkgs.waybar;
settings = [
{
layer = "top";
position = "top";
modules-left = [
"custom/startmenu"
"tray"
"hyprland/window"
];
modules-center = ["hyprland/workspaces"];
modules-right = [
"idle_inhibitor"
"custom/notification"
"pulseaudio"
"battery"
"clock"
"custom/exit"
];
"hyprland/workspaces" = {
format = "{name}";
format-icons = {
default = " ";
active = " ";
urgent = " ";
};
on-scroll-up = "hyprctl dispatch workspace e+1";
on-scroll-down = "hyprctl dispatch workspace e-1";
};
"clock" = {
format = '' {:%H:%M}'';
# ''{: %I:%M %p}'';
tooltip = true;
tooltip-format = "<big>{:%A, %d.%B %Y }</big><tt><small>{calendar}</small></tt>";
};
"hyprland/window" = {
max-length = 60;
separate-outputs = false;
};
"memory" = {
interval = 5;
format = " {}%";
tooltip = true;
on-click = "${terminal} -e btop";
};
"cpu" = {
interval = 5;
format = " {usage:2}%";
tooltip = true;
on-click = "${terminal} -e btop";
};
"disk" = {
format = " {free}";
tooltip = true;
# Not working with garandos window open then closes
#on-click = "${terminal} -e sh -c df -h ; read";
};
"network" = {
format-icons = [
"󰤯"
"󰤟"
"󰤢"
"󰤥"
"󰤨"
];
format-ethernet = " {bandwidthDownBits}";
format-wifi = " {bandwidthDownBits}";
format-disconnected = "󰤮";
tooltip = false;
on-click = "${terminal} -e btop";
};
"tray" = {
spacing = 12;
};
"pulseaudio" = {
format = "{icon} {volume}% {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/exit" = {
tooltip = false;
format = "";
on-click = "sleep 0.1 && wlogout";
};
"custom/startmenu" = {
tooltip = false;
format = " ";
# exec = "rofi -show drun";
on-click = "rofi -show drun";
};
"idle_inhibitor" = {
format = "{icon}";
format-icons = {
activated = " ";
deactivated = " ";
};
tooltip = "true";
};
"custom/notification" = {
tooltip = false;
format = "{icon} {}";
format-icons = {
notification = "<span foreground='red'><sup></sup></span>";
none = "";
dnd-notification = "<span foreground='red'><sup></sup></span>";
dnd-none = "";
inhibited-notification = "<span foreground='red'><sup></sup></span>";
inhibited-none = "";
dnd-inhibited-notification = "<span foreground='red'><sup></sup></span>";
dnd-inhibited-none = "";
};
return-type = "json";
exec-if = "which swaync-client";
exec = "swaync-client -swb";
on-click = "swaync-client -t";
escape = true;
};
"battery" = {
states = {
warning = 30;
critical = 15;
};
format = "{icon} {capacity}%";
format-charging = "󰂄 {capacity}%";
format-plugged = "󱘖 {capacity}%";
format-icons = [
"󰁺"
"󰁻"
"󰁼"
"󰁽"
"󰁾"
"󰁿"
"󰂀"
"󰂁"
"󰂂"
"󰁹"
];
on-click = "";
tooltip = false;
};
}
];
style = concatStrings [
''
* {
font-size: 16px;
font-family: JetBrainsMono Nerd Font, Font Awesome, sans-serif;
font-weight: bold;
}
window#waybar {
/*
background-color: rgba(26,27,38,0);
border-bottom: 1px solid rgba(26,27,38,0);
border-radius: 0px;
color: #${base0F};
*/
background-color: rgba(26,27,38,0);
border-bottom: 1px solid rgba(26,27,38,0);
border-radius: 0px;
color: #${base0F};
}
#workspaces {
/*
Eternal
background: linear-gradient(180deg, #${base00}, #${base01});
margin: 5px 5px 5px 0px;
padding: 0px 10px;
border-radius: 0px 15px 15px 0px;
border: 0px;
font-style: normal;
color: #${base00};
*/
background: linear-gradient(45deg, #${base01}, #${base01});
margin: 5px;
padding: 0px 1px;
border-radius: 15px;
border: 0px;
font-style: normal;
color: #${base00};
}
#workspaces button {
padding: 0px 5px;
margin: 4px 3px;
border-radius: 15px;
border: 0px;
color: #${base00};
background: linear-gradient(45deg, #${base0D}, #${base0E});
opacity: 0.5;
transition: all 0.3s ease-in-out;
}
#workspaces button.active {
padding: 0px 5px;
margin: 4px 3px;
border-radius: 15px;
border: 0px;
color: #${base00};
background: linear-gradient(45deg, #${base0D}, #${base0E});
opacity: 1.0;
min-width: 40px;
transition: all 0.3s ease-in-out;
}
#workspaces button:hover {
border-radius: 15px;
color: #${base00};
background: linear-gradient(45deg, #${base0D}, #${base0E});
opacity: 0.8;
}
tooltip {
background: #${base00};
border: 1px solid #${base0E};
border-radius: 10px;
}
tooltip label {
color: #${base07};
}
#window {
/*
Eternal
color: #${base05};
background: #${base00};
border-radius: 15px;
margin: 5px;
padding: 2px 20px;
*/
margin: 5px;
padding: 2px 20px;
color: #${base05};
background: #${base01};
border-radius: 15px 15px 15px 15px;
}
#memory {
color: #${base0F};
/*
Eternal
background: #${base00};
border-radius: 15px 15px 15px 15px;
margin: 5px;
padding: 2px 20px;
*/
background: #${base01};
margin: 5px;
padding: 2px 20px;
border-radius: 15px 15px 15px 15px;
}
#clock {
color: #${base0B};
background: #${base00};
border-radius: 15px 15px 15px 15px;
margin: 5px;
padding: 2px 20px;
}
#idle_inhibitor {
color: #${base0A};
background: #${base00};
border-radius: 15px 15px 15px 15px;
margin: 3px;
padding: 2px 20px;
}
#cpu {
color: #${base07};
background: #${base00};
border-radius: 15px 15px 15px 15px;
margin: 5px;
padding: 2px 20px;
}
#disk {
color: #${base0F};
background: #${base00};
border-radius: 15px 15px 15px 15px;
margin: 5px;
padding: 2px 20px;
}
#battery {
color: #${base08};
background: #${base00};
border-radius: 15px 15px 15px 15px;
margin: 5px;
padding: 2px 20px;
}
#network {
color: #${base09};
background: #${base00};
border-radius: 15px 15px 15px 15px;
margin: 5px;
padding: 2px 20px;
}
#tray {
color: #${base05};
background: #${base00};
border-radius: 15px 15px 15px 15px;
margin: 5px;
padding: 2px 15px;
}
#pulseaudio {
color: #${base0D};
/*
Eternal
background: #${base00};
border-radius: 15px 15px 15px 15px;
margin: 5px;
padding: 2px 20px;
*/
background: #${base01};
margin: 4px;
padding: 2px 20px;
border-radius: 15px 15px 15px 15px;
}
#custom-notification {
color: #${base0C};
background: #${base00};
border-radius: 15px 15px 15px 15px;
margin: 5px;
padding: 2px 20px;
}
#custom-startmenu {
color: #${base0E};
background: #${base00};
border-radius: 0px 15px 15px 0px;
margin: 5px 5px 5px 0px;
padding: 2px 20px;
}
#idle_inhibitor {
color: #${base09};
background: #${base00};
border-radius: 15px 15px 15px 15px;
margin: 5px;
padding: 2px 20px;
}
#custom-exit {
color: #${base0E};
background: #${base00};
border-radius: 15px 0px 0px 15px;
margin: 5px 0px 5px 5px;
padding: 2px 20px;
}
''
];
};
}

View File

@@ -1,283 +0,0 @@
{
pkgs,
lib,
host,
config,
...
}: let
betterTransition = "all 0.3s cubic-bezier(.55,-0.68,.48,1.682)";
inherit (import ../../../hosts/${host}/variables.nix) clock24h;
in
with lib; {
# Configure & Theme Waybar
programs.waybar = {
enable = true;
package = pkgs.waybar;
settings = [
{
layer = "top";
position = "top";
modules-center = ["hyprland/workspaces"];
modules-left = [
"custom/startmenu"
"hyprland/window"
"pulseaudio"
"cpu"
"memory"
"idle_inhibitor"
];
modules-right = [
"custom/hyprbindings"
"custom/notification"
"custom/exit"
"battery"
"tray"
"clock"
];
"hyprland/workspaces" = {
format = "{name}";
format-icons = {
default = " ";
active = " ";
urgent = " ";
};
on-scroll-up = "hyprctl dispatch workspace e+1";
on-scroll-down = "hyprctl dispatch workspace e-1";
};
"clock" = {
format =
if clock24h == true
then '' {:L%H:%M}''
else '' {:L%I:%M %p}'';
tooltip = true;
tooltip-format = "<big>{:%A, %d.%B %Y }</big>\n<tt><small>{calendar}</small></tt>";
};
"hyprland/window" = {
max-length = 22;
separate-outputs = false;
rewrite = {
"" = " 🙈 No Windows? ";
};
};
"memory" = {
interval = 5;
format = " {}%";
tooltip = true;
};
"cpu" = {
interval = 5;
format = " {usage:2}%";
tooltip = true;
};
"disk" = {
format = " {free}";
tooltip = true;
};
"network" = {
format-icons = [
"󰤯"
"󰤟"
"󰤢"
"󰤥"
"󰤨"
];
format-ethernet = " {bandwidthDownOctets}";
format-wifi = "{icon} {signalStrength}%";
format-disconnected = "󰤮";
tooltip = false;
};
"tray" = {
spacing = 12;
};
"pulseaudio" = {
format = "{icon} {volume}% {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 = "sleep 0.1 && pavucontrol";
};
"custom/exit" = {
tooltip = false;
format = "";
on-click = "sleep 0.1 && wlogout";
};
"custom/startmenu" = {
tooltip = false;
format = "";
# exec = "rofi -show drun";
#on-click = "sleep 0.1 && rofi-launcher";
on-click = "sleep 0.1 && nwg-drawer -mb 200 -mt 200 -mr 200 -ml 200";
};
"custom/hyprbindings" = {
tooltip = false;
format = "󱕴";
on-click = "sleep 0.1 && list-keybinds";
};
"idle_inhibitor" = {
format = "{icon}";
format-icons = {
activated = "";
deactivated = "";
};
tooltip = "true";
};
"custom/notification" = {
tooltip = false;
format = "{icon} {}";
format-icons = {
notification = "<span foreground='red'><sup></sup></span>";
none = "";
dnd-notification = "<span foreground='red'><sup></sup></span>";
dnd-none = "";
inhibited-notification = "<span foreground='red'><sup></sup></span>";
inhibited-none = "";
dnd-inhibited-notification = "<span foreground='red'><sup></sup></span>";
dnd-inhibited-none = "";
};
return-type = "json";
exec-if = "which swaync-client";
exec = "swaync-client -swb";
on-click = "sleep 0.1 && task-waybar";
escape = true;
};
"battery" = {
states = {
warning = 30;
critical = 15;
};
format = "{icon} {capacity}%";
format-charging = "󰂄 {capacity}%";
format-plugged = "󱘖 {capacity}%";
format-icons = [
"󰁺"
"󰁻"
"󰁼"
"󰁽"
"󰁾"
"󰁿"
"󰂀"
"󰂁"
"󰂂"
"󰁹"
];
on-click = "";
tooltip = false;
};
}
];
style = concatStrings [
''
* {
font-family: JetBrainsMono Nerd Font Mono;
font-size: 18px;
border-radius: 0px;
border: none;
min-height: 0px;
}
window#waybar {
background: rgba(0,0,0,0);
}
#workspaces {
color: #${config.lib.stylix.colors.base00};
background: #${config.lib.stylix.colors.base01};
margin: 4px 4px;
padding: 5px 5px;
border-radius: 16px;
}
#workspaces button {
font-weight: bold;
padding: 0px 5px;
margin: 0px 3px;
border-radius: 16px;
color: #${config.lib.stylix.colors.base00};
background: linear-gradient(45deg, #${config.lib.stylix.colors.base08}, #${config.lib.stylix.colors.base0D});
opacity: 0.5;
transition: ${betterTransition};
}
#workspaces button.active {
font-weight: bold;
padding: 0px 5px;
margin: 0px 3px;
border-radius: 16px;
color: #${config.lib.stylix.colors.base00};
background: linear-gradient(45deg, #${config.lib.stylix.colors.base08}, #${config.lib.stylix.colors.base0D});
transition: ${betterTransition};
opacity: 1.0;
min-width: 40px;
}
#workspaces button:hover {
font-weight: bold;
border-radius: 16px;
color: #${config.lib.stylix.colors.base00};
background: linear-gradient(45deg, #${config.lib.stylix.colors.base08}, #${config.lib.stylix.colors.base0D});
opacity: 0.8;
transition: ${betterTransition};
}
tooltip {
background: #${config.lib.stylix.colors.base00};
border: 1px solid #${config.lib.stylix.colors.base08};
border-radius: 12px;
}
tooltip label {
color: #${config.lib.stylix.colors.base08};
}
#window, #pulseaudio, #cpu, #memory, #idle_inhibitor {
font-weight: bold;
margin: 4px 0px;
margin-left: 7px;
padding: 0px 18px;
background: #${config.lib.stylix.colors.base00};
color: #${config.lib.stylix.colors.base08};
border-radius: 8px 8px 8px 8px;
}
#idle_inhibitor {
font-size: 28px;
}
#custom-startmenu {
color: #${config.lib.stylix.colors.base0B};
background: #${config.lib.stylix.colors.base02};
font-size: 22px;
margin: 0px;
padding: 0px 5px 0px 5px;
border-radius: 16px 16px 16px 16px;
}
#custom-hyprbindings, #network, #battery,
#custom-notification, #tray, #custom-exit {
/* font-weight: bold; */
font-size: 20px;
background: #${config.lib.stylix.colors.base00};
color: #${config.lib.stylix.colors.base08};
margin: 4px 0px;
margin-right: 7px;
border-radius: 8px 8px 8px 8px;
padding: 0px 18px;
}
#clock {
font-weight: bold;
font-size: 16px;
color: #0D0E15;
background: linear-gradient(90deg, #${config.lib.stylix.colors.base0B}, #${config.lib.stylix.colors.base02});
margin: 0px;
padding: 0px 5px 0px 5px;
border-radius: 16px 16px 16px 16px;
}
''
];
};
}

View File

@@ -1,494 +0,0 @@
{
config,
pkgs,
...
}: {
programs.waybar = {
enable = true;
package = pkgs.waybar;
settings = {
mainBar = {
layer = "top";
"modules-left" = [
"hyprland/workspaces"
"temperature"
"hyprland/window"
];
"modules-center" = ["custom/spacer"];
"modules-right" = [
"tray"
"cpu"
"memory"
"idle_inhibitor"
"clock"
"pulseaudio"
"bluetooth"
];
"hyprland/window" = {
format = "{title}";
"max-length" = 333;
"seperate-outputs" = true;
};
clock = {
format = "<span foreground='#282828'> </span><span>{:%I:%M %a %d}</span>";
"tooltip-format" = "{calendar}";
calendar = {
mode = "month";
"mode-mon-col" = 3;
"on-scroll" = 1;
"on-click-right" = "mode";
format = {
months = "<span color='#ffead3'><b>{}</b></span>";
days = "<span color='#ecc6d9'><b>{}</b></span>";
weeks = "<span color='#99ffdd'><b>{%W}</b></span>";
weekdays = "<span color='#ffcc66'><b>{}</b></span>";
today = "<span color='#ff6699'><b>{}</b></span>";
};
};
actions = {
"on-click-middle" = "mode";
"on-click-right" = "shift_up";
"on-click" = "shift_down";
};
};
cpu = {
format = "<span foreground='#b8bb26'>󰯳</span> {usage}%";
};
memory = {
format = "<span foreground='#d65d9e'>󰍛</span> {}%";
interval = 1;
};
"custom/gpu-util" = {
exec = "./scripts/gpu-util";
format = "<span foreground='#67b0e8'>󰯿</span> {}";
interval = 1;
};
"custom/gpu-temp" = {
exec = "./scripts/gpu-temp";
format = "<span foreground='#e57474'></span> {}";
interval = 1;
};
temperature = {
"hwmon-path" = "/sys/class/hwmon/hwmon1/temp1_input";
"critical-threshold" = 80;
format = "<span foreground='#83a598'></span> {temperatureC}°C";
interval = 1;
};
"hyprland/workspaces" = {
format = "{icon}";
"active-only" = false;
"sort-by-number" = false;
"on-click" = "activate";
"all-outputs" = false;
"format-icons" = {
"1" = "1";
"2" = "2";
"3" = "3";
"4" = "4";
"5" = "5";
"6" = "6";
"7" = "7";
"8" = "8";
"9" = "9";
"10" = "10";
};
};
network = {
format = "󰤭 Off";
"format-wifi" = "{essid} ({signalStrength}%)";
"format-ethernet" = "<span foreground='#b48ead'>󰈀</span>";
"format-disconnected" = "󰤭 Disconnected";
"tooltip-format" = "{ifname} via {gwaddr} ";
"tooltip-format-wifi" = "{essid}({signalStrength}%) ";
"tooltip-format-ethernet" = "󰈀 {ifname}";
"tooltip-format-disconnected" = "Disconnected";
};
pulseaudio = {
format = "<span foreground='#cc241d'>{icon}</span> {volume}% {format_source}";
"format-bluetooth" = "<span foreground='#b16286'>{icon}</span> {volume}% {format_source}";
"format-bluetooth-muted" = "<span foreground='#D699B6'>󰖁</span> {format_source}";
"format-muted" = "<span foreground='#7A8478'>󰖁</span> {format_source}";
"format-source" = "<span foreground='#E67E80'></span> {volume}%";
"format-source-muted" = "<span foreground='#F38BA8'></span>";
"format-icons" = {
headphone = "";
phone = "";
portable = "";
default = [
""
""
""
];
};
"on-click-left" = "pavucontrol";
input = true;
};
"custom/playerctl" = {
format = "{icon} <span>{}</span>";
"return-type" = "json";
"max-length" = 333;
exec = "playerctl -a metadata --format '{\"text\": \"{{artist}} ~ {{markup_escape(title)}}\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F";
"on-click-middle" = "playerctl play-pause";
"on-click" = "playerctl previous";
"on-click-right" = "playerctl next";
"format-icons" = {
Playing = "<span foreground='#98BB6C'></span>";
Paused = "<span foreground='#E46876'></span>";
};
};
tray = {
format = "<span foreground='#D3C6AA'>{icon}</span>";
"icon-size" = 14;
spacing = 5;
};
idle_inhibitor = {
format = "{icon}";
"format-icons" = {
activated = "󱠛";
deactivated = "󱤱";
};
};
"custom/subs" = {
format = "<span foreground='#fbf1c7'>󰗃 </span> {}";
exec = "/usr/local/bin/subsfile.sh";
"on-click" = "vivaldi-stable https://youtube.com/thelinuxcast";
"restart-interval" = 1;
};
"custom/spacer" = {
format = " ";
};
"wlr/taskbar" = {
format = "{name}";
"icon-size" = 14;
"icon-theme" = "Numix-Circle";
"tooltip-format" = "{title}";
"on-click" = "activate";
"on-click-middle" = "close";
"ignore-list" = ["Alacritty"];
"app_ids-mapping" = {
firefoxdeveloperedition = "firefox-developer-edition";
};
rewrite = {
"Firefox Web Browser" = "Firefox";
"Foot Server" = "Terminal";
};
};
bluetooth = {
"on-click" = "./scripts/bluetooth-control";
"on-click-right" = "./scripts/rofi-bluetooth";
"on-click-middle" = "./scripts/rofi-bluetooth";
format = "{icon}";
interval = 15;
"format-icons" = {
on = "<span foreground='#43242B'></span>";
off = "<span foreground='#76946A'>󰂲</span>";
disabled = "󰂲";
connected = "";
};
"tooltip-format" = "{device_alias} {status}";
};
};
};
style = ''
@define-color background #${config.stylix.base16Scheme.base00};
@define-color foreground #${config.stylix.base16Scheme.base05};
@define-color border #${config.stylix.base16Scheme.base02};
@define-color color1 #${config.stylix.base16Scheme.base01};
@define-color color2 #${config.stylix.base16Scheme.base02};
@define-color color3 #${config.stylix.base16Scheme.base03};
@define-color color4 #${config.stylix.base16Scheme.base04};
@define-color color5 #${config.stylix.base16Scheme.base05};
@define-color color6 #${config.stylix.base16Scheme.base06};
@define-color color7 #${config.stylix.base16Scheme.base07};
@define-color color8 #${config.stylix.base16Scheme.base08};
@define-color color9 #${config.stylix.base16Scheme.base09};
@define-color color10 #${config.stylix.base16Scheme.base0A};
@define-color color11 #${config.stylix.base16Scheme.base0B};
@define-color color12 #${config.stylix.base16Scheme.base0C};
@define-color color13 #${config.stylix.base16Scheme.base0D};
@define-color color14 #${config.stylix.base16Scheme.base0E};
@define-color color15 #${config.stylix.base16Scheme.base0F};
* {
min-height: 0;
margin: 0;
padding: 0;
font-family: "JetBrains Mono Nerd Font";
font-size: 14pt;
font-weight: 700;
padding-bottom: 0px;
}
tooltip {
background: @background;
border: 2px solid @border;
}
#window {
margin: 0px 5px 0px 5px;
padding-left: 10px;
padding-right: 7px;
background-color: @color14;
color: #282828;
}
window#waybar.empty #window {
background-color: transparent;
border-bottom: none;
border-right: none;
}
window#waybar {
background-color:@color14;
color: @color2;
}
/* Workspaces */
#workspaces {
margin: 0px 0px 0px 0px;
padding: 0px;
background-color: @background;
color: @color7;
}
#workspaces button {
margin: 0px 0px 0px 0px;
padding-left: 3px;
padding-right: 9px;
background-color: @background;
color: @color7;
}
#workspaces button.active {
padding: 0 2px 0 1px;
color: @color3;
}
#workspaces button.urgent {
color: @color9;
}
#custom-gpu-util {
margin: 0px 5px 0px 5px;
padding-left: 10px;
padding-right: 10px;
background-color: @background;
color: @foreground;
}
#tray {
margin: 0px 0px 0px 0px;
padding-left: 10px;
padding-right: 10px;
background-color: @background;
color: @foreground;
}
#idle_inhibitor {
margin: 0px 0px 0px 0px;
padding-left: 10px;
padding-right: 12px;
background-color: @background;
color: @foreground;
}
#idle_inhibitor.activated {
color: @color9;
}
#network {
margin: 0px 0px 0px 0px;
padding-left: 10px;
padding-right: 12px;
background-color: @background;
color: @color11;
}
#network.linked {
color: @color6;
}
#network.disconnected,
#network.disabled {
color: @color4;
}
#custom-subs {
color: @foreground;
margin: 0px 5px 0px 5px;
padding-left: 10px;
padding-right: 12px;
border-bottom: 2px solid @background;
border-right: 2px solid @background;
border-color: @color8;
background-color: @color13;
}
#custom-cliphist {
color: @color14;
margin: 0px 5px 0px 5px;
padding-left: 10px;
padding-right: 12px;
background-color: @background;
}
#custom-gpu-temp,
#custom-clipboard {
margin: 0px 5px 0px 5px;
padding-left: 10px;
padding-right: 10px;
color: @foreground;
background-color: @background;
}
#cpu {
margin: 0px 0px 0px 0px;
padding-left: 6px;
padding-right: 6px;
color: @foreground;
background-color: @background;
}
#custom-cpuicon {
margin: 0px 0px 0px 0px;
padding: 0px 10px 0px 10px;
color: @color14;
background-color: @background;
}
#custom-diskicon {
margin: 0px 0px 0px 0;
padding: 0 10px 0 10px;
color: @color2;
background-color: @background;
}
#disk {
margin: 0px 0px 0px 0;
padding-left: 0px;
padding-right: 0px;
color: @foreground;
background-color: @background;
}
#custom-notification {
background-color: @background;
color: @color15;
padding: 0 12px;
margin-right: 0px;
font-size: 14px;
font-family: "JetBrainsMono Nerd Font";
}
#custom-memoryicon {
margin: 0px 0px 0px 0px;
color: @color4;
padding: 0 11px 0 7px;
background-color: @background;
}
#memory {
margin: 0px 0px 0px 0px;
padding-left: 5px;
padding-right: 10px;
color: @color4;
background-color: @background;
}
#custom-tempicon {
margin: 0px 0px 0px 0px;
color: @color10;
padding: 0 11px 0 8px;
background-color: @background;
}
#temperature {
margin: 0px 0px 0px 0px;
padding-left: 5px;
padding-right: 10px;
color: @color10;
background-color: @background;
}
#custom-playerctl {
margin: 0px 5px 0px 5px;
padding-left: 10px;
padding-right: 10px;
color: @foreground;
background-color: @background;
}
#battery,
#backlight,
#bluetooth,
#pulseaudio {
margin-top: 0px;
margin-bottom: 0px;
color: @foreground;
background-color: @background;
}
#pulseaudio {
margin-top: 0px;
margin-bottom: 0px;
color: @color15;
background-color: @background;
}
#battery,
#bluetooth {
margin-left: 0px;
margin-right: 0px;
padding-left: 0px;
padding-right: 2px;
}
#backlight,
#pulseaudio {
margin-right: 0px;
margin-left: 0px;
padding-left: 10px;
padding-right: 7.5px;
}
#clock {
margin: 0px 0px 0px 0px;
padding-left: 10px;
padding-right: 10px;
color: @color6;
background-color: @background;
}
#custom-clockicon {
margin: 0px 0 0px 0px;
color: @color6;
padding: 0 5px 0 10px;
background-color: @background;
}
#taskbar {
padding: 0 3px;
margin: 0 0px;
color: #ffffff;
background-color: rgba(120,118,117,0.3);
}
#taskbar button {
padding: 0 0 0 3px;
margin: 0px 0px;
color: #ffffff;
background-color: rgba(120,118,117,0.1);
}
#taskbar button.active {
background-color: rgba(120,118,117,0.8);
}
#mode {
margin: 0px 5px 0px 5px;
padding-left: 10px;
padding-right: 10px;
background-color: @background;
color: @color9;
}
'';
};
}

View File

@@ -1,442 +0,0 @@
{
config,
pkgs,
...
}: {
programs.waybar = {
enable = true;
package = pkgs.waybar;
settings = {
mainBar = {
layer = "top";
"modules-left" = [
"hyprland/workspaces"
"hyprland/window"
];
"modules-center" = ["clock"];
"modules-right" = [
"tray"
"cpu"
"memory"
"idle_inhibitor"
"pulseaudio"
"bluetooth"
];
"hyprland/window" = {
format = "{title}";
"max-length" = 333;
"seperate-outputs" = true;
};
clock = {
format = "<span foreground='#282828'> </span><span>{:%I:%M %a %d}</span>";
"tooltip-format" = "{calendar}";
calendar = {
mode = "month";
"mode-mon-col" = 3;
"on-scroll" = 1;
"on-click-right" = "mode";
format = {
months = "<span color='#ffead3'><b>{}</b></span>";
days = "<span color='#ecc6d9'><b>{}</b></span>";
weeks = "<span color='#99ffdd'><b>{%W}</b></span>";
weekdays = "<span color='#ffcc66'><b>{}</b></span>";
today = "<span color='#ff6699'><b>{}</b></span>";
};
};
actions = {
"on-click-middle" = "mode";
"on-click-right" = "shift_up";
"on-click" = "shift_down";
};
};
cpu = {
format = "<span foreground='#b8bb26'>󰯳</span> {usage}%";
};
memory = {
format = "<span foreground='#d65d9e'>󰍛</span> {}%";
interval = 1;
};
"custom/gpu-util" = {
exec = "./scripts/gpu-util";
format = "<span foreground='#67b0e8'>󰯿</span> {}";
interval = 1;
};
"custom/gpu-temp" = {
exec = "./scripts/gpu-temp";
format = "<span foreground='#e57474'></span> {}";
interval = 1;
};
temperature = {
"hwmon-path" = "/sys/class/hwmon/hwmon1/temp1_input";
"critical-threshold" = 80;
format = "<span foreground='#83a598'></span> {temperatureC}°C";
interval = 1;
};
"hyprland/workspaces" = {
format = "{icon}";
"active-only" = false;
"sort-by-number" = true;
"on-click" = "activate";
"all-outputs" = false;
"format-icons" = {
"1" = "1";
"2" = "2";
"3" = "3";
"4" = "4";
"5" = "5";
"6" = "6";
"7" = "7";
"8" = "8";
"9" = "9";
"10" = "10";
};
};
network = {
format = "󰤭 Off";
"format-wifi" = "{essid} ({signalStrength}%)";
"format-ethernet" = "<span foreground='#b48ead'>󰈀</span>";
"format-disconnected" = "󰤭 Disconnected";
"tooltip-format" = "{ifname} via {gwaddr} ";
"tooltip-format-wifi" = "{essid}({signalStrength}%) ";
"tooltip-format-ethernet" = "󰈀 {ifname}";
"tooltip-format-disconnected" = "Disconnected";
};
pulseaudio = {
format = "<span foreground='#cc241d'>{icon}</span> {volume}% {format_source}";
"format-bluetooth" = "<span foreground='#b16286'>{icon}</span> {volume}% {format_source}";
"format-bluetooth-muted" = "<span foreground='#D699B6'>󰖁</span> {format_source}";
"format-muted" = "<span foreground='#7A8478'>󰖁</span> {format_source}";
"format-source" = "<span foreground='#E67E80'></span> {volume}%";
"format-source-muted" = "<span foreground='#F38BA8'></span>";
"format-icons" = {
headphone = "";
phone = "";
portable = "";
default = [
""
""
""
];
};
"on-click-left" = "pavucontrol";
input = true;
};
"custom/playerctl" = {
format = "{icon} <span>{}</span>";
"return-type" = "json";
"max-length" = 333;
exec = "playerctl -a metadata --format '{\"text\": \"{{artist}} ~ {{markup_escape(title)}}\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F";
"on-click-middle" = "playerctl play-pause";
"on-click" = "playerctl previous";
"on-click-right" = "playerctl next";
"format-icons" = {
Playing = "<span foreground='#98BB6C'></span>";
Paused = "<span foreground='#E46876'></span>";
};
};
tray = {
format = "<span foreground='#D3C6AA'>{icon}</span>";
"icon-size" = 14;
spacing = 5;
};
idle_inhibitor = {
format = "{icon}";
"format-icons" = {
activated = "󱠛";
deactivated = "󱤱";
};
};
"custom/subs" = {
format = "<span foreground='#fbf1c7'>󰗃 </span> {}";
exec = "/usr/local/bin/subsfile.sh";
"on-click" = "vivaldi-stable https://youtube.com/thelinuxcast";
"restart-interval" = 1;
};
"custom/spacer" = {
format = " ";
};
"wlr/taskbar" = {
format = "{name}";
"icon-size" = 14;
"icon-theme" = "Numix-Circle";
"tooltip-format" = "{title}";
"on-click" = "activate";
"on-click-middle" = "close";
"ignore-list" = ["Alacritty"];
"app_ids-mapping" = {
firefoxdeveloperedition = "firefox-developer-edition";
};
rewrite = {
"Firefox Web Browser" = "Firefox";
"Foot Server" = "Terminal";
};
};
bluetooth = {
"on-click" = "./scripts/bluetooth-control";
"on-click-right" = "./scripts/rofi-bluetooth";
"on-click-middle" = "./scripts/rofi-bluetooth";
format = "{icon}";
interval = 15;
"format-icons" = {
on = "<span foreground='#43242B'></span>";
off = "<span foreground='#76946A'>󰂲</span>";
disabled = "󰂲";
connected = "";
};
"tooltip-format" = "{device_alias} {status}";
};
};
};
style = ''
@define-color bg #${config.stylix.base16Scheme.base00};
@define-color fg #${config.stylix.base16Scheme.base05};
@define-color lbg #${config.stylix.base16Scheme.base01};
@define-color yellow #${config.stylix.base16Scheme.base0A};
@define-color lavender #${config.stylix.base16Scheme.base0E};
@define-color peach #${config.stylix.base16Scheme.base0A};
@define-color red #${config.stylix.base16Scheme.base08};
@define-color green #${config.stylix.base16Scheme.base0B};
@define-color blue #${config.stylix.base16Scheme.base0D};
@define-color border #${config.stylix.base16Scheme.base02};
* {
min-height: 0;
margin: 0px 0px 0px 0px;
padding: 0;
border-radius: 7px;
font-family: "JetBrains Mono Nerd Font";
font-size: 10pt;
font-weight: 700;
padding-bottom: 0px;
}
tooltip {
background: @bg;
border-radius: 7px;
border: 2px solid @border;
}
#window {
margin: 0px 0px 0px 0px;
padding-left: 10px;
padding-right: 7px;
border-radius: 3px;
border-color: @lbg;
background-color: @yellow;
color: @bg;
}
window#waybar.empty #window {
background-color: @bg;
border-bottom: none;
border-right: none;
}
window#waybar {
background-color: @bg;
color: @lavender;
}
/* Workspaces */
@keyframes button_activate {
from { opacity: .3 }
to { opacity: 1.; }
}
#workspaces {
margin: 0px 0px 0px 0px;
border-radius: 3px;
padding: 1px;
background-color: @bg;
color: @bg;
}
#workspaces button {
margin: 0px 0px 0px 0px;
border-radius: 3px;
padding-left: 3px;
padding-right: 9px;
background-color: @bg;
color: @fg;
}
#workspaces button.active {
background-color:@blue;
color: @bg;
}
#workspaces button.urgent {
color: #F38BA8;
}
#workspaces button:hover {
border: solid transparent;
}
#custom-gpu-util {
margin: 0px 0px 0px 0px;
padding-left: 10px;
padding-right: 10px;
border-radius: 7px;
background-color: @bg;
color: @fg;
}
#tray {
margin: 0px 0px 0px 0px;
border-radius: 3px;
padding-left: 10px;
padding-right: 10px;
background-color: @bg;
color: @fg;
}
#idle_inhibitor {
margin: 0px 0px 0px 0px;
padding-left: 10px;
padding-right: 12px;
border-radius: 3px;
background-color: @bg;
color: @fg;
}
#network {
margin: 5px 5px 2px 5px;
padding-left: 10px;
padding-right: 12px;
border-radius: 7px;
background-color: @bg;
color: @lavender;
}
#network.linked {
color: @peach;
}
#network.disconnected,
#network.disabled {
color: @red;
}
#custom-subs {
color: @fg;
margin: 5px 5px 2px 5px;
padding-left: 10px;
padding-right: 12px;
border-radius: 3px;
border-bottom: 2px solid @bg;
border-right: 2px solid @bg;
border-color: @lbg;
background-color: @red;
}
#custom-spacer {
background-color: @yellow;
}
#custom-cliphist {
color: @peach;
margin: 5px 5px 2px 5px;
padding-left: 10px;
padding-right: 12px;
border-radius: 3px;
background-color: @bg;
}
#custom-gpu-temp,
#cpu,
#memory,
#custom-clipboard,
#temperature {
margin: 0px 0px 0px 0px;
padding-left: 10px;
padding-right: 10px;
border-radius: 3px;
color: @fg;
background-color: @bg;
}
#custom-playerctl {
margin: 5px 5px 2px 5px;
padding-left: 10px;
padding-right: 10px;
border-radius: 3px;
color: @fg;
background-color: @bg;
}
#battery,
#backlight,
#bluetooth,
#pulseaudio {
margin-top: 5px;
margin-bottom: 2px;
color: @fg;
background-color: @bg;
border-top-right-radius: 0px;
border-bottom-right-radius: 0px;
border-top-left-radius: 3px;
border-bottom-left-radius: 3px;
}
#battery,
#bluetooth {
margin-left: 0px;
margin-right: 5px;
padding-left: 7.5px;
padding-right: 10px;
border-top-left-radius: 0px;
border-bottom-left-radius: 0px;
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
}
#backlight,
#pulseaudio {
margin-right: 0px;
margin-left: 5px;
padding-left: 10px;
padding-right: 7.5px;
border-top-right-radius: 0px;
border-bottom-right-radius: 0px;
border-top-left-radius: 3px;
border-bottom-left-radius: 3px;
}
#clock {
margin: 0px 0px 0px 0px;
padding-left: 10px;
padding-right: 10px;
border-radius: 3px;
color: @bg;
background-color: @green;
}
#taskbar {
border-radius: 0px 0px 0px 0;
padding: 0 3px;
margin: 0 0px;
color: #ffffff;
background-color: rgba(120,118,117,0.3);
}
#taskbar button {
border-radius: 0px 0px 0px 0px;
padding: 0 0 0 3px;
margin: 3px 1;
color: #ffffff;
background-color: rgba(120,118,117,0.1);
}
#taskbar button.active {
background-color: rgba(120,118,117,0.8);
}
#mode {
margin: 0px 0px 0px 0px;
padding-left: 10px;
padding-right: 10px;
border-radius: 3px;
background-color: @bg;
color: @peach;
}
'';
};
}

View File

@@ -1,391 +0,0 @@
{
pkgs,
lib,
...
}: let
terminal = "kitty";
base00 = "0F1419";
base01 = "131721";
base03 = "3E4B59";
base05 = "E6E1CF";
base06 = "E6E1CF";
base07 = "F3F4F5";
base08 = "F07178";
base09 = "FF8F40";
base0A = "FFB454";
base0B = "B8CC52";
base0C = "95E6CB";
base0D = "59C2FF";
base0E = "D2A6FF";
base0F = "E6B673";
in
with lib; {
# Configure & Theme Waybar
programs.waybar = {
enable = true;
package = pkgs.waybar;
settings = [
{
layer = "top";
position = "top";
modules-center = [
"network"
"pulseaudio"
"cpu"
"hyprland/workspaces"
"memory"
"disk"
"clock"
]; # Eterna: [ "hyprland/window" ]
modules-left = [
"custom/startmenu"
"hyprland/window"
]; # Eternal: [ "hyprland/workspaces" "cpu" "memory" "network" ]
modules-right = [
"tray"
"idle_inhibitor"
"custom/notification"
"battery"
"custom/exit"
]; # Eternal: [ "idle_inhibitor" "pulseaudio" "clock" "custom/notification" "tray" ]
"hyprland/workspaces" = {
format = "{name}";
format-icons = {
default = " ";
active = " ";
urgent = " ";
};
on-scroll-up = "hyprctl dispatch workspace e+1";
on-scroll-down = "hyprctl dispatch workspace e-1";
};
"clock" = {
format = '' {:%H:%M}'';
# ''{: %I:%M %p}'';
tooltip = true;
tooltip-format = "<big>{:%A, %d.%B %Y }</big><tt><small>{calendar}</small></tt>";
};
"hyprland/window" = {
max-length = 60;
separate-outputs = false;
};
"memory" = {
interval = 5;
format = " {}%";
tooltip = true;
on-click = "${terminal} -e btop";
};
"cpu" = {
interval = 5;
format = " {usage:2}%";
tooltip = true;
on-click = "${terminal} -e btop";
};
"disk" = {
format = " {free}";
tooltip = true;
# Not working with garandos window open then closes
#on-click = "${terminal} -e sh -c df -h ; read";
};
"network" = {
format-icons = [
"󰤯"
"󰤟"
"󰤢"
"󰤥"
"󰤨"
];
format-ethernet = " {bandwidthDownBits}";
format-wifi = " {bandwidthDownBits}";
format-disconnected = "󰤮";
tooltip = false;
on-click = "${terminal} -e btop";
};
"tray" = {
spacing = 12;
};
"pulseaudio" = {
format = "{icon} {volume}% {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/exit" = {
tooltip = false;
format = "";
on-click = "sleep 0.1 && wlogout";
};
"custom/startmenu" = {
tooltip = false;
format = " ";
# exec = "rofi -show drun";
on-click = "rofi -show drun";
};
"idle_inhibitor" = {
format = "{icon}";
format-icons = {
activated = " ";
deactivated = " ";
};
tooltip = "true";
};
"custom/notification" = {
tooltip = false;
format = "{icon} {}";
format-icons = {
notification = "<span foreground='red'><sup></sup></span>";
none = "";
dnd-notification = "<span foreground='red'><sup></sup></span>";
dnd-none = "";
inhibited-notification = "<span foreground='red'><sup></sup></span>";
inhibited-none = "";
dnd-inhibited-notification = "<span foreground='red'><sup></sup></span>";
dnd-inhibited-none = "";
};
return-type = "json";
exec-if = "which swaync-client";
exec = "swaync-client -swb";
on-click = "swaync-client -t";
escape = true;
};
"battery" = {
states = {
warning = 30;
critical = 15;
};
format = "{icon} {capacity}%";
format-charging = "󰂄 {capacity}%";
format-plugged = "󱘖 {capacity}%";
format-icons = [
"󰁺"
"󰁻"
"󰁼"
"󰁽"
"󰁾"
"󰁿"
"󰂀"
"󰂁"
"󰂂"
"󰁹"
];
on-click = "";
tooltip = false;
};
}
];
style = concatStrings [
''
* {
font-size: 16px;
font-family: JetBrainsMono Nerd Font, Font Awesome, sans-serif;
font-weight: bold;
}
window#waybar {
/*
background-color: rgba(26,27,38,0);
border-bottom: 1px solid rgba(26,27,38,0);
border-radius: 0px;
color: #${base0F};
*/
background-color: rgba(26,27,38,0);
border-bottom: 1px solid rgba(26,27,38,0);
border-radius: 0px;
color: #${base0F};
}
#workspaces {
/*
Eternal
background: linear-gradient(180deg, #${base00}, #${base01});
margin: 5px 5px 5px 0px;
padding: 0px 10px;
border-radius: 0px 15px 50px 0px;
border: 0px;
font-style: normal;
color: #${base00};
*/
background: linear-gradient(45deg, #${base01}, #${base01});
margin: 5px;
padding: 0px 1px;
border-radius: 15px;
border: 0px;
font-style: normal;
color: #${base00};
}
#workspaces button {
padding: 0px 5px;
margin: 4px 3px;
border-radius: 15px;
border: 0px;
color: #${base00};
background: linear-gradient(45deg, #${base0D}, #${base0E});
opacity: 0.5;
transition: all 0.3s ease-in-out;
}
#workspaces button.active {
padding: 0px 5px;
margin: 4px 3px;
border-radius: 15px;
border: 0px;
color: #${base00};
background: linear-gradient(45deg, #${base0D}, #${base0E});
opacity: 1.0;
min-width: 40px;
transition: all 0.3s ease-in-out;
}
#workspaces button:hover {
border-radius: 15px;
color: #${base00};
background: linear-gradient(45deg, #${base0D}, #${base0E});
opacity: 0.8;
}
tooltip {
background: #${base00};
border: 1px solid #${base0E};
border-radius: 10px;
}
tooltip label {
color: #${base07};
}
#window {
/*
Eternal
color: #${base05};
background: #${base00};
border-radius: 15px;
margin: 5px;
padding: 2px 20px;
*/
margin: 5px;
padding: 2px 20px;
color: #${base05};
background: #${base01};
border-radius: 50px 15px 50px 15px;
}
#memory {
color: #${base0F};
/*
Eternal
background: #${base00};
border-radius: 50px 15px 50px 15px;
margin: 5px;
padding: 2px 20px;
*/
background: #${base01};
margin: 5px;
padding: 2px 20px;
border-radius: 15px 50px 15px 50px;
}
#clock {
color: #${base0B};
background: #${base00};
border-radius: 15px 50px 15px 50px;
margin: 5px;
padding: 2px 20px;
}
#idle_inhibitor {
color: #${base0A};
background: #${base00};
border-radius: 50px 15px 50px 15px;
margin: 5px;
padding: 2px 20px;
}
#cpu {
color: #${base07};
background: #${base00};
border-radius: 50px 15px 50px 15px;
margin: 5px;
padding: 2px 20px;
}
#disk {
color: #${base0F};
background: #${base00};
border-radius: 15px 50px 15px 50px;
margin: 5px;
padding: 2px 20px;
}
#battery {
color: #${base08};
background: #${base00};
border-radius: 15px 50px 15px 50px;
margin: 5px;
padding: 2px 20px;
}
#network {
color: #${base09};
background: #${base00};
border-radius: 50px 15px 50px 15px;
margin: 5px;
padding: 2px 20px;
}
#tray {
color: #${base05};
background: #${base00};
border-radius: 15px 50px 15px 50px;
margin: 5px;
padding: 2px 20px;
}
#pulseaudio {
color: #${base0D};
/*
Eternal
background: #${base00};
border-radius: 15px 50px 15px 50px;
margin: 5px;
padding: 2px 20px;
*/
background: #${base01};
margin: 4px;
padding: 2px 20px;
border-radius: 50px 15px 50px 15px;
}
#custom-notification {
color: #${base0C};
background: #${base00};
border-radius: 15px 50px 15px 50px;
margin: 5px;
padding: 2px 20px;
}
#custom-startmenu {
color: #${base0E};
background: #${base00};
border-radius: 0px 15px 50px 0px;
margin: 5px 5px 5px 0px;
padding: 2px 20px;
}
#idle_inhibitor {
color: #${base09};
background: #${base00};
border-radius: 15px 50px 15px 50px;
margin: 5px;
padding: 2px 20px;
}
#custom-exit {
color: #${base0E};
background: #${base00};
border-radius: 15px 0px 0px 50px;
margin: 5px 0px 5px 5px;
padding: 2px 20px;
}
''
];
};
}

View File

@@ -1,306 +0,0 @@
{
pkgs,
lib,
host,
config,
...
}: let
betterTransition = "all 0.3s cubic-bezier(.55,-0.68,.48,1.682)";
inherit (import ../../../hosts/${host}/variables.nix) clock24h;
in
with lib; {
# Configure & Theme Waybar
programs.waybar = {
enable = true;
package = pkgs.waybar;
settings = [
{
layer = "top";
position = "top";
margin-top = 6;
margin-left = 6;
margin-right = 6;
modules-center = ["hyprland/workspaces"];
modules-left = [
"custom/startmenu"
"cpu"
"memory"
"temperature"
"disk"
"hyprland/window"
"idle_inhibitor"
];
modules-right = [
"pulseaudio"
"battery"
"custom/hyprbindings"
"custom/notification"
"clock"
"tray"
];
"hyprland/workspaces" = {
format = "{name}";
format-icons = {
default = " ";
active = " ";
urgent = " ";
};
on-scroll-up = "hyprctl dispatch workspace e+1";
on-scroll-down = "hyprctl dispatch workspace e-1";
};
"pulseaudio/slider" = {
min = 0;
max = 100;
orientation = "horizontal";
};
"temperature" = {
format = " {temperatureC}°C ";
};
"clock" = {
format =
if clock24h == true
then '' {:L%H:%M}''
else '' {:L%I:%M %p}'';
tooltip = true;
tooltip-format = "<big>{:%A, %d.%B %Y }</big>\n<tt><small>{calendar}</small></tt>";
};
"hyprland/window" = {
max-length = 22;
separate-outputs = false;
rewrite = {
"" = " 🙈 No Windows? ";
};
};
"memory" = {
interval = 5;
icon-size = 20;
format = " {}%";
tooltip = true;
};
"cpu" = {
interval = 5;
format = " {usage:2}%";
tooltip = true;
};
"disk" = {
format = "󱛟 {free}";
tooltip = true;
};
"network" = {
format-icons = [
"󰤯"
"󰤟"
"󰤢"
"󰤥"
"󰤨"
];
format-ethernet = " {bandwidthDownOctets}";
format-wifi = "{icon} {signalStrength}%";
format-disconnected = "󰤮";
tooltip = false;
};
"tray" = {
spacing = 12;
};
"pulseaudio" = {
format = "{icon} {volume}% {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 = "sleep 0.1 && pavucontrol";
scroll-step = 2;
};
"custom/exit" = {
tooltip = false;
format = "";
on-click = "sleep 0.1 && wlogout";
};
"custom/startmenu" = {
tooltip = false;
format = "";
# exec = "rofi -show drun";
#on-click = "sleep 0.1 && rofi-launcher";
on-click = "sleep 0.1 && nwg-drawer -mb 200 -mt 200 -mr 200 -ml 200";
};
"custom/hyprbindings" = {
tooltip = false;
format = "󱕴";
on-click = "sleep 0.1 && list-keybinds";
};
"idle_inhibitor" = {
format = "{icon}";
format-icons = {
activated = "";
deactivated = "";
};
tooltip = "true";
};
"custom/notification" = {
tooltip = false;
format = "{icon} {}";
format-icons = {
notification = "<span foreground='red'><sup></sup></span>";
none = "";
dnd-notification = "<span foreground='red'><sup></sup></span>";
dnd-none = "";
inhibited-notification = "<span foreground='red'><sup></sup></span>";
inhibited-none = "";
dnd-inhibited-notification = "<span foreground='red'><sup></sup></span>";
dnd-inhibited-none = "";
};
return-type = "json";
exec-if = "which swaync-client";
exec = "swaync-client -swb";
on-click = "sleep 0.1 && task-waybar";
escape = true;
};
"battery" = {
states = {
warning = 30;
critical = 15;
};
format = "{icon} {capacity}%";
format-charging = "󰂄 {capacity}%";
format-plugged = "󱘖 {capacity}%";
format-icons = [
"󰁺"
"󰁻"
"󰁼"
"󰁽"
"󰁾"
"󰁿"
"󰂀"
"󰂁"
"󰂂"
"󰁹"
];
on-click = "";
tooltip = false;
};
}
];
style = concatStrings [
''
* {
font-family: JetBrainsMono Nerd Font Mono;
font-size: 18px;
border-radius: 0px;
border: none;
min-height: 0px;
margin: 0px;
}
window#waybar {
background: #${config.lib.stylix.colors.base00};
padding: 2px;
border-radius: 4px;
}
#workspaces {
color: #${config.lib.stylix.colors.base00};
background: #${config.lib.stylix.colors.base00};
border: 2px solid #${config.lib.stylix.colors.base0B};
margin: 2px 4px;
padding: 5px 5px;
border-radius: 4px;
}
#workspaces button {
font-weight: bold;
padding: 0px 5px;
margin: 0px 3px;
border-radius: 16px;
color: #${config.lib.stylix.colors.base0B};
background: #${config.lib.stylix.colors.base00};
}
#workspaces button.active {
font-weight: bold;
padding: 0px 5px;
margin: 0px 3px;
border-radius: 4px;
color: #${config.lib.stylix.colors.base00};
background: #${config.lib.stylix.colors.base0B};
transition: ${betterTransition};
opacity: 1.0;
min-width: 40px;
}
#workspaces button:hover {
font-weight: bold;
border-radius: 4px;
color: #${config.lib.stylix.colors.base00};
background: #${config.lib.stylix.colors.base0B};
opacity: 0.8;
}
tooltip {
background: #${config.lib.stylix.colors.base00};
border: 1px solid #${config.lib.stylix.colors.base08};
border-radius: 12px;
}
tooltip label {
color: #${config.lib.stylix.colors.base08};
}
#window, #pulseaudio, #temperature, #cpu, #memory, #idle_inhibitor, #disk {
font-weight: bold;
margin: 2px 0px;
margin-right: 7px;
padding: 0px 18px;
background: #${config.lib.stylix.colors.base00};
color: #${config.lib.stylix.colors.base0B};
border: 2px solid #${config.lib.stylix.colors.base0B};
border-radius: 4px;
}
#idle_inhibitor {
font-size: 28px;
}
#custom-startmenu {
color: #${config.lib.stylix.colors.base00};
background: #${config.lib.stylix.colors.base0B};
font-size: 22px;
padding: 0px 5px 0px 5px;
border-radius: 4px;
padding: 0px 8px;
margin: 0px;
margin-right:7px;
}
#custom-hyprbindings, #network, #battery,
#custom-notification, #clock, #custom-exit {
/* font-weight: bold; */
font-size: 20px;
background: #${config.lib.stylix.colors.base00};
color: #${config.lib.stylix.colors.base0B};
margin: 2px 0px;
margin-right: 7px;
border: 2px solid #${config.lib.stylix.colors.base0B};
border-radius: 4px;
padding: 0px 12px;
}
#tray{
font-weight: bold;
font-size: 16px;
margin: 0px;
background: #${config.lib.stylix.colors.base0B};
color: #${config.lib.stylix.colors.base00};
border: 2px solid #${config.lib.stylix.colors.base0B};
padding: 0px 18px;
margin: 0px 0px;
border-radius: 4px;
}
''
];
};
}

View File

@@ -1,305 +0,0 @@
{
pkgs,
lib,
host,
config,
...
}: let
inherit (import ../../../hosts/${host}/variables.nix) clock24h;
in
with lib; {
# Configure & Theme Waybar
programs.waybar = {
enable = true;
package = pkgs.waybar;
settings = [
{
layer = "top";
position = "top";
modules-center = ["hyprland/workspaces"];
modules-left = [
"custom/startmenu"
"custom/arrow6"
"pulseaudio"
"cpu"
"memory"
"idle_inhibitor"
"custom/arrow7"
"hyprland/window"
];
modules-right = [
"custom/arrow4"
"custom/hyprbindings"
"custom/arrow3"
"custom/notification"
"custom/arrow3"
"custom/exit"
"battery"
"custom/arrow2"
"tray"
"custom/arrow1"
"clock"
];
"hyprland/workspaces" = {
format = "{name}";
format-icons = {
default = " ";
active = " ";
urgent = " ";
};
on-scroll-up = "hyprctl dispatch workspace e+1";
on-scroll-down = "hyprctl dispatch workspace e-1";
};
"clock" = {
format =
if clock24h == true
then '' {:L%H:%M}''
else '' {:L%I:%M %p}'';
tooltip = true;
tooltip-format = "<big>{:%A, %d.%B %Y }</big>\n<tt><small>{calendar}</small></tt>";
};
"hyprland/window" = {
max-length = 22;
separate-outputs = false;
rewrite = {
"" = " 🙈 No Windows? ";
};
};
"memory" = {
interval = 5;
format = " {}%";
tooltip = true;
};
"cpu" = {
interval = 5;
format = " {usage:2}%";
tooltip = true;
};
"disk" = {
format = " {free}";
tooltip = true;
};
"network" = {
format-icons = [
"󰤯"
"󰤟"
"󰤢"
"󰤥"
"󰤨"
];
format-ethernet = " {bandwidthDownOctets}";
format-wifi = "{icon} {signalStrength}%";
format-disconnected = "󰤮";
tooltip = false;
};
"tray" = {
spacing = 12;
};
"pulseaudio" = {
format = "{icon} {volume}% {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 = "sleep 0.1 && pavucontrol";
};
"custom/exit" = {
tooltip = false;
format = "";
on-click = "sleep 0.1 && wlogout";
};
"custom/startmenu" = {
tooltip = false;
format = "";
on-click = "sleep 0.1 && rofi-launcher";
};
"custom/hyprbindings" = {
tooltip = false;
format = "󱕴";
on-click = "sleep 0.1 && list-keybinds";
};
"idle_inhibitor" = {
format = "{icon}";
format-icons = {
activated = "";
deactivated = "";
};
tooltip = "true";
};
"custom/notification" = {
tooltip = false;
format = "{icon} {}";
format-icons = {
notification = "<span foreground='red'><sup></sup></span>";
none = "";
dnd-notification = "<span foreground='red'><sup></sup></span>";
dnd-none = "";
inhibited-notification = "<span foreground='red'><sup></sup></span>";
inhibited-none = "";
dnd-inhibited-notification = "<span foreground='red'><sup></sup></span>";
dnd-inhibited-none = "";
};
return-type = "json";
exec-if = "which swaync-client";
exec = "swaync-client -swb";
on-click = "sleep 0.1 && task-waybar";
escape = true;
};
"battery" = {
states = {
warning = 30;
critical = 15;
};
format = "{icon} {capacity}%";
format-charging = "󰂄 {capacity}%";
format-plugged = "󱘖 {capacity}%";
format-icons = [
"󰁺"
"󰁻"
"󰁼"
"󰁽"
"󰁾"
"󰁿"
"󰂀"
"󰂁"
"󰂂"
"󰁹"
];
on-click = "";
tooltip = false;
};
"custom/arrow1" = {
format = "";
};
"custom/arrow2" = {
format = "";
};
"custom/arrow3" = {
format = "";
};
"custom/arrow4" = {
format = "";
};
"custom/arrow5" = {
format = "";
};
"custom/arrow6" = {
format = "";
};
"custom/arrow7" = {
format = "";
};
}
];
style = concatStrings [
''
* {
font-family: JetBrainsMono Nerd Font Mono;
font-size: 14px;
border-radius: 0px;
border: none;
min-height: 0px;
}
window#waybar {
background: #${config.lib.stylix.colors.base00};
color: #${config.lib.stylix.colors.base05};
}
#workspaces button {
padding: 0px 5px;
background: transparent;
color: #${config.lib.stylix.colors.base04};
}
#workspaces button.active {
color: #${config.lib.stylix.colors.base08};
}
#workspaces button:hover {
color: #${config.lib.stylix.colors.base08};
}
tooltip {
background: #${config.lib.stylix.colors.base00};
border: 1px solid #${config.lib.stylix.colors.base05};
border-radius: 12px;
}
tooltip label {
color: #${config.lib.stylix.colors.base05};
}
#window {
padding: 0px 10px;
}
#pulseaudio, #cpu, #memory, #idle_inhibitor {
padding: 0px 10px;
background: #${config.lib.stylix.colors.base04};
color: #${config.lib.stylix.colors.base00};
}
#custom-startmenu {
color: #${config.lib.stylix.colors.base02};
padding: 0px 14px;
font-size: 20px;
background: #${config.lib.stylix.colors.base0B};
}
#custom-hyprbindings, #network, #battery,
#custom-notification, #custom-exit {
background: #${config.lib.stylix.colors.base0F};
color: #${config.lib.stylix.colors.base00};
padding: 0px 10px;
}
#tray {
background: #${config.lib.stylix.colors.base02};
color: #${config.lib.stylix.colors.base00};
padding: 0px 10px;
}
#clock {
font-weight: bold;
padding: 0px 10px;
color: #${config.lib.stylix.colors.base00};
background: #${config.lib.stylix.colors.base0E};
}
#custom-arrow1 {
font-size: 24px;
color: #${config.lib.stylix.colors.base0E};
background: #${config.lib.stylix.colors.base02};
}
#custom-arrow2 {
font-size: 24px;
color: #${config.lib.stylix.colors.base02};
background: #${config.lib.stylix.colors.base0F};
}
#custom-arrow3 {
font-size: 24px;
color: #${config.lib.stylix.colors.base00};
background: #${config.lib.stylix.colors.base0F};
}
#custom-arrow4 {
font-size: 24px;
color: #${config.lib.stylix.colors.base0F};
background: transparent;
}
#custom-arrow6 {
font-size: 24px;
color: #${config.lib.stylix.colors.base0B};
background: #${config.lib.stylix.colors.base04};
}
#custom-arrow7 {
font-size: 24px;
color: #${config.lib.stylix.colors.base04};
background: transparent;
}
''
];
};
}

View File

@@ -1,105 +0,0 @@
{config, ...}: {
programs.wlogout = {
enable = true;
layout = [
{
label = "shutdown";
action = "sleep 1; systemctl poweroff";
text = "Shutdown";
keybind = "s";
}
{
"label" = "reboot";
"action" = "sleep 1; systemctl reboot";
"text" = "Reboot";
"keybind" = "r";
}
{
"label" = "logout";
"action" = "sleep 1; hyprctl dispatch exit";
"text" = "Exit";
"keybind" = "e";
}
{
"label" = "suspend";
"action" = "sleep 1; systemctl suspend";
"text" = "Suspend";
"keybind" = "u";
}
{
"label" = "lock";
"action" = "sleep 1; hyprlock";
"text" = "Lock";
"keybind" = "l";
}
{
"label" = "hibernate";
"action" = "sleep 1; systemctl hibernate";
"text" = "Hibernate";
"keybind" = "h";
}
];
style = ''
* {
font-family: "JetBrainsMono NF", FontAwesome, sans-serif;
background-image: none;
transition: 20ms;
}
window {
background-color: rgba(12, 12, 12, 0.1);
}
button {
color: #${config.lib.stylix.colors.base05};
font-size:20px;
background-repeat: no-repeat;
background-position: center;
background-size: 25%;
border-style: solid;
background-color: rgba(12, 12, 12, 0.3);
border: 3px solid #${config.lib.stylix.colors.base05};
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
}
button:focus,
button:active,
button:hover {
color: #${config.lib.stylix.colors.base0B};
background-color: rgba(12, 12, 12, 0.5);
border: 3px solid #${config.lib.stylix.colors.base0B};
}
#logout {
margin: 10px;
border-radius: 20px;
background-image: image(url("icons/logout.png"));
}
#suspend {
margin: 10px;
border-radius: 20px;
background-image: image(url("icons/suspend.png"));
}
#shutdown {
margin: 10px;
border-radius: 20px;
background-image: image(url("icons/shutdown.png"));
}
#reboot {
margin: 10px;
border-radius: 20px;
background-image: image(url("icons/reboot.png"));
}
#lock {
margin: 10px;
border-radius: 20px;
background-image: image(url("icons/lock.png"));
}
#hibernate {
margin: 10px;
border-radius: 20px;
background-image: image(url("icons/hibernate.png"));
}
'';
};
home.file.".config/wlogout/icons" = {
source = ./icons;
recursive = true;
};
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB