Compare commits

...

13 Commits

Author SHA1 Message Date
db7d5d17a6 added nvim submodule 2026-03-22 14:05:27 +01:00
70de42923c removed nvim repo 2026-03-22 14:03:13 +01:00
dae66e3608 updated icons of nvim config 2026-03-20 13:52:27 +01:00
2fb95b16e8 updated neovim config 2026-03-20 13:14:03 +01:00
89ce9ab548 updated neovim config 2026-03-20 10:05:56 +01:00
146429f594 fixed some waybar styling 2026-03-14 15:02:08 +01:00
13bc86f713 fixed lid handling with lidstate file 2026-03-14 15:01:31 +01:00
e8ef6712af updated gitignore and waybar 2026-03-13 17:53:30 +01:00
d7c1b0e733 updated waybar 2026-03-13 17:38:40 +01:00
20ea9cc4d1 updated hypr config 2026-03-13 17:28:56 +01:00
bc9e2b7c19 added fluxo 2026-03-13 17:28:37 +01:00
85feb977a1 updated dotfiles 2026-02-24 22:44:05 +01:00
5356157750 updated waybar script to not crash with my usb c hub 2026-02-13 19:39:31 +01:00
30 changed files with 875 additions and 919 deletions

2
.gitignore vendored
View File

@@ -6,6 +6,7 @@
!alacritty/ !alacritty/
!dunst/ !dunst/
!hypr/ !hypr/
!hyprpanel/
!nvim/ !nvim/
!waybar/ !waybar/
!zathura/ !zathura/
@@ -23,3 +24,4 @@
!wireplumber/ !wireplumber/
!systemd/ !systemd/
fish/fish_variables fish/fish_variables
waybar/fluxo-rs

3
.gitmodules vendored
View File

@@ -22,3 +22,6 @@
[submodule "fuzzel/catppuccin-fuzzel"] [submodule "fuzzel/catppuccin-fuzzel"]
path = fuzzel/catppuccin-fuzzel path = fuzzel/catppuccin-fuzzel
url = https://github.com/catppuccin/fuzzel.git url = https://github.com/catppuccin/fuzzel.git
[submodule "nvim"]
path = nvim
url = https://git.narl.io/nvrl/nvim-config.git

View File

@@ -26,8 +26,8 @@ lines = 24
## Blank space added around the window in pixels. ## Blank space added around the window in pixels.
[window.padding] [window.padding]
x = 30 x = 3
y = 30 y = 0
## SCROLLING ------------------------------------------------------ ## SCROLLING ------------------------------------------------------
[scrolling] [scrolling]

View File

@@ -1,18 +1,18 @@
#? Config file for btop v. 1.4.5 #? Config file for btop v.1.4.6
#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes. #* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes.
#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes" #* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes"
color_theme = "/home/narl/.config/btop/themes/catppuccin_mocha.theme" color_theme = "/home/narl/.config/btop/themes/catppuccin_mocha.theme"
#* If the theme set background should be shown, set to False if you want terminal background transparency. #* If the theme set background should be shown, set to False if you want terminal background transparency.
theme_background = False theme_background = false
#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false. #* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false.
truecolor = True truecolor = true
#* Set to true to force tty mode regardless if a real tty has been detected or not. #* Set to true to force tty mode regardless if a real tty has been detected or not.
#* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols. #* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols.
force_tty = False force_tty = false
#* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets. #* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets.
#* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box. #* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box.
@@ -22,10 +22,13 @@ presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:defaul
#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists. #* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists.
#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift. #* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift.
vim_keys = True vim_keys = true
#* Rounded corners on boxes, is ignored if TTY mode is ON. #* Rounded corners on boxes, is ignored if TTY mode is ON.
rounded_corners = True rounded_corners = true
#* Use terminal synchronized output sequences to reduce flickering on supported terminals.
terminal_sync = true
#* Default symbols to use for graph creation, "braille", "block" or "tty". #* Default symbols to use for graph creation, "braille", "block" or "tty".
#* "braille" offers the highest resolution but might not be included in all fonts. #* "braille" offers the highest resolution but might not be included in all fonts.
@@ -53,44 +56,47 @@ graph_symbol_proc = "default"
shown_boxes = "cpu mem net proc" shown_boxes = "cpu mem net proc"
#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs. #* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs.
update_ms = 2000 update_ms = 1000
#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct", #* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct",
#* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly. #* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly.
proc_sorting = "cpu lazy" proc_sorting = "cpu lazy"
#* Reverse sorting order, True or False. #* Reverse sorting order, True or False.
proc_reversed = False proc_reversed = false
#* Show processes as a tree. #* Show processes as a tree.
proc_tree = True proc_tree = true
#* Use the cpu graph colors in the process list. #* Use the cpu graph colors in the process list.
proc_colors = True proc_colors = true
#* Use a darkening gradient in the process list. #* Use a darkening gradient in the process list.
proc_gradient = True proc_gradient = true
#* If process cpu usage should be of the core it's running on or usage of the total available cpu power. #* If process cpu usage should be of the core it's running on or usage of the total available cpu power.
proc_per_core = False proc_per_core = false
#* Show process memory as bytes instead of percent. #* Show process memory as bytes instead of percent.
proc_mem_bytes = True proc_mem_bytes = true
#* Show cpu graph for each process. #* Show cpu graph for each process.
proc_cpu_graphs = True proc_cpu_graphs = true
#* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate) #* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate)
proc_info_smaps = False proc_info_smaps = false
#* Show proc box on left side of screen instead of right. #* Show proc box on left side of screen instead of right.
proc_left = False proc_left = false
#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop). #* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop).
proc_filter_kernel = False proc_filter_kernel = false
#* In tree-view, always accumulate child process resources in the parent process. #* In tree-view, always accumulate child process resources in the parent process.
proc_aggregate = False proc_aggregate = false
#* Should cpu and memory usage display be preserved for dead processes when paused.
keep_dead_proc_usage = false
#* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available. #* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available.
#* Select from a list of detected attributes from the options menu. #* Select from a list of detected attributes from the options menu.
@@ -104,28 +110,28 @@ cpu_graph_lower = "Auto"
show_gpu_info = "Auto" show_gpu_info = "Auto"
#* Toggles if the lower CPU graph should be inverted. #* Toggles if the lower CPU graph should be inverted.
cpu_invert_lower = True cpu_invert_lower = true
#* Set to True to completely disable the lower CPU graph. #* Set to True to completely disable the lower CPU graph.
cpu_single_graph = False cpu_single_graph = false
#* Show cpu box at bottom of screen instead of top. #* Show cpu box at bottom of screen instead of top.
cpu_bottom = False cpu_bottom = false
#* Shows the system uptime in the CPU box. #* Shows the system uptime in the CPU box.
show_uptime = True show_uptime = true
#* Shows the CPU package current power consumption in watts. Requires running `make setcap` or `make setuid` or running with sudo. #* Shows the CPU package current power consumption in watts. Requires running `make setcap` or `make setuid` or running with sudo.
show_cpu_watts = True show_cpu_watts = true
#* Show cpu temperature. #* Show cpu temperature.
check_temp = True check_temp = true
#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors. #* Which sensor to use for cpu temperature, use options menu to select from list of available sensors.
cpu_sensor = "Auto" cpu_sensor = "Auto"
#* Show temperatures for cpu cores also if check_temp is True and sensors has been found. #* Show temperatures for cpu cores also if check_temp is True and sensors has been found.
show_coretemp = True show_coretemp = true
#* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core. #* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core.
#* Use lm-sensors or similar to see which cores are reporting temperatures on your machine. #* Use lm-sensors or similar to see which cores are reporting temperatures on your machine.
@@ -137,17 +143,20 @@ cpu_core_map = ""
temp_scale = "celsius" temp_scale = "celsius"
#* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024. #* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024.
base_10_sizes = False base_10_sizes = false
#* Show CPU frequency. #* Show CPU frequency.
show_cpu_freq = True show_cpu_freq = true
#* How to calculate CPU frequency, available values: "first", "range", "lowest", "highest" and "average".
freq_mode = "first"
#* Draw a clock at top of screen, formatting according to strftime, empty string to disable. #* Draw a clock at top of screen, formatting according to strftime, empty string to disable.
#* Special formatting: /host = hostname | /user = username | /uptime = system uptime #* Special formatting: /host = hostname | /user = username | /uptime = system uptime
clock_format = "%X" clock_format = "%X"
#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort. #* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort.
background_update = True background_update = true
#* Custom cpu model name, empty string to disable. #* Custom cpu model name, empty string to disable.
custom_cpu_name = "" custom_cpu_name = ""
@@ -157,43 +166,43 @@ custom_cpu_name = ""
disks_filter = "" disks_filter = ""
#* Show graphs instead of meters for memory values. #* Show graphs instead of meters for memory values.
mem_graphs = True mem_graphs = true
#* Show mem box below net box instead of above. #* Show mem box below net box instead of above.
mem_below_net = False mem_below_net = false
#* Count ZFS ARC in cached and available memory. #* Count ZFS ARC in cached and available memory.
zfs_arc_cached = True zfs_arc_cached = true
#* If swap memory should be shown in memory box. #* If swap memory should be shown in memory box.
show_swap = True show_swap = true
#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk. #* Show swap as a disk, ignores show_swap value above, inserts itself after first disk.
swap_disk = True swap_disk = true
#* If mem box should be split to also show disks info. #* If mem box should be split to also show disks info.
show_disks = True show_disks = true
#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar. #* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar.
only_physical = True only_physical = true
#* Read disks list from /etc/fstab. This also disables only_physical. #* Read disks list from /etc/fstab. This also disables only_physical.
use_fstab = True use_fstab = true
#* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool) #* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool)
zfs_hide_datasets = False zfs_hide_datasets = false
#* Set to true to show available disk space for privileged users. #* Set to true to show available disk space for privileged users.
disk_free_priv = False disk_free_priv = false
#* Toggles if io activity % (disk busy time) should be shown in regular disk usage view. #* Toggles if io activity % (disk busy time) should be shown in regular disk usage view.
show_io_stat = True show_io_stat = true
#* Toggles io mode for disks, showing big graphs for disk read/write speeds. #* Toggles io mode for disks, showing big graphs for disk read/write speeds.
io_mode = False io_mode = false
#* Set to True to show combined read/write io graphs in io mode. #* Set to True to show combined read/write io graphs in io mode.
io_graph_combined = False io_graph_combined = false
#* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ". #* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ".
#* Example: "/mnt/media:100 /:20 /boot:1". #* Example: "/mnt/media:100 /:20 /boot:1".
@@ -205,10 +214,10 @@ net_download = 100
net_upload = 100 net_upload = 100
#* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest. #* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest.
net_auto = True net_auto = true
#* Sync the auto scaling for download and upload to whichever currently has the highest scale. #* Sync the auto scaling for download and upload to whichever currently has the highest scale.
net_sync = True net_sync = true
#* Starts with the Network Interface specified here. #* Starts with the Network Interface specified here.
net_iface = "" net_iface = ""
@@ -217,26 +226,32 @@ net_iface = ""
base_10_bitrate = "Auto" base_10_bitrate = "Auto"
#* Show battery stats in top right if battery is present. #* Show battery stats in top right if battery is present.
show_battery = True show_battery = true
#* Which battery to use if multiple are present. "Auto" for auto detection. #* Which battery to use if multiple are present. "Auto" for auto detection.
selected_battery = "Auto" selected_battery = "Auto"
#* Show power stats of battery next to charge indicator. #* Show power stats of battery next to charge indicator.
show_battery_watts = True show_battery_watts = true
#* Set loglevel for "~/.config/btop/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG". #* Set loglevel for "~/.local/state/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG".
#* The level set includes all lower levels, i.e. "DEBUG" will show all logging info. #* The level set includes all lower levels, i.e. "DEBUG" will show all logging info.
log_level = "WARNING" log_level = "WARNING"
#* Automatically save current settings to config file on exit.
save_config_on_exit = true
#* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards. #* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards.
nvml_measure_pcie_speeds = True nvml_measure_pcie_speeds = true
#* Measure PCIe throughput on AMD cards, may impact performance on certain cards. #* Measure PCIe throughput on AMD cards, may impact performance on certain cards.
rsmi_measure_pcie_speeds = True rsmi_measure_pcie_speeds = true
#* Horizontally mirror the GPU graph. #* Horizontally mirror the GPU graph.
gpu_mirror_graph = True gpu_mirror_graph = true
#* Set which GPU vendors to show. Available values are "nvidia amd intel"
shown_gpus = "nvidia amd intel"
#* Custom gpu0 model name, empty string to disable. #* Custom gpu0 model name, empty string to disable.
custom_gpu_name0 = "" custom_gpu_name0 = ""

View File

@@ -12,7 +12,7 @@ general {
# BACKGROUND # BACKGROUND
background { background {
monitor = monitor =
path = $HOME/Pictures/exp33/exp33-oled.jpeg path = $HOME/Pictures/mandelbrot.png
blur_passes = 0 blur_passes = 0
color = $base color = $base
} }

1
hypr/lid_state.conf Normal file
View File

@@ -0,0 +1 @@

View File

@@ -3,6 +3,7 @@
# Or execute your favorite apps at launch like this: # Or execute your favorite apps at launch like this:
# exec-once = uwsm app -- waybar # exec-once = uwsm app -- waybar
# exec-once = uwsm app -- hyprpanel
# exec-once = uwsm app -- nextcloud --background # exec-once = uwsm app -- nextcloud --background
exec-once = uwsm app -- nm-applet --indicator exec-once = uwsm app -- nm-applet --indicator
# exec-once = uwsm app -- rclone mount google_drive: ~/gdrive # exec-once = uwsm app -- rclone mount google_drive: ~/gdrive
@@ -13,3 +14,4 @@ exec-once = uwsm app -- hyprpaper
# exec-once = uwsm app -- /usr/lib/xdg-desktop-portal-hyprland # exec-once = uwsm app -- /usr/lib/xdg-desktop-portal-hyprland
exec-once = wl-paste --type text --watch cliphist store # Stores only text data exec-once = wl-paste --type text --watch cliphist store # Stores only text data
exec-once = wl-paste --type image --watch cliphist store # Stores only image data exec-once = wl-paste --type image --watch cliphist store # Stores only image data
exec-once = uwsm app -- ~/.cargo/bin/fluxo-rs daemon

View File

@@ -1,6 +1,8 @@
# See https://wiki.hyprland.org/Configuring/Environment-variables/ # See https://wiki.hyprland.org/Configuring/Environment-variables/
# env = INTEL_DEBUG,noccs
# env = WLR_DRM_NO_ATOMIC,1
env = HYPRCURSOR_THEME,Bibata-Modern-Classic env = HYPRCURSOR_THEME,Bibata-Modern-Classic
env = HYPRCURSOR_SIZE,24 env = HYPRCURSOR_SIZE,24
env = XCURSOR_SIZE,24 env = XCURSOR_SIZE,24
@@ -12,3 +14,4 @@ env = QT_QPA_PLATFORMTHEME,qt6ct
# env = VDPAU_DRIVER,radeonsi # env = VDPAU_DRIVER,radeonsi
env = MOZ_ENABLE_WAYLAND,1 env = MOZ_ENABLE_WAYLAND,1
env = ELECTRON_OZONE_PLATFORM_HINT,wayland env = ELECTRON_OZONE_PLATFORM_HINT,wayland
env = EDITOR,nvim

View File

@@ -1,7 +1,7 @@
# https://wiki.hyprland.org/Configuring/Variables/#input # https://wiki.hyprland.org/Configuring/Variables/#input
input { input {
kb_layout = us kb_layout = us,us
kb_variant = dvorak-intl, intl kb_variant = dvorak-intl, intl
# kb_variant = intl # kb_variant = intl
kb_model = kb_model =

View File

@@ -1,5 +1,9 @@
# monitor = desc:Samsung Electric Company LC27G7xT H4ZRA00734, 2560x1440@90, 0x-1440, 1 # laptop screen
# monitor = desc:Samsung Electric Company LC27G7xT H4ZRA00734, 2560x1440@90, 0x-1440, 1, bitdepth, 10
monitor = desc:Samsung Electric Company LC27G7xT H4ZRA00734, 1920x1080@90, 0x-1080, 1
monitor = eDP-1, 1920x1080@60, 0x0, 1 monitor = eDP-1, 1920x1080@60, 0x0, 1
# samsung home monitor
monitor = desc:Samsung Electric Company LC27G7xT H4ZRA00734, 2560x1440@144, 0x-1440, 1
# lid_state fallback
source = ~/.config/hypr/lid_state.conf

View File

@@ -20,7 +20,7 @@ general {
resize_on_border = false resize_on_border = false
# Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
allow_tearing = true allow_tearing = false
layout = dwindle layout = dwindle
} }
@@ -96,7 +96,7 @@ master {
misc { misc {
force_default_wallpaper = 0 # Set to 0 or 1 to disable the anime mascot wallpapers force_default_wallpaper = 0 # Set to 0 or 1 to disable the anime mascot wallpapers
disable_hyprland_logo = true # If true disables the random hyprland logo / anime girl background. :( disable_hyprland_logo = true # If true disables the random hyprland logo / anime girl background. :(
vrr = 0 vrr = 1
font_family = FiraCode Nerd Font font_family = FiraCode Nerd Font
} }

View File

@@ -1,6 +1,21 @@
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more # See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
# See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules # See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules
# ==========================================
# VARIABLES
# ==========================================
# Dialogs and utility apps that should float in the center
$dialog_titles = ^(Open Form|Open File|Select a File|Choose a file|Open Workspace|Choose Directory|Save As|Save File|branchdialog|pinentry-gtk-2|Confirm to replace files|File Operation Progress|Open Files|Anmelden Google Konten — Zen Browser)$
$dialog_classes = ^(pavucontrol|blueman-manager|nm-connection-editor|org.pulseaudio.pavucontrol)$
# App classes
$steam = ^(steam)$
$gamescope = ^(gamescope)$
# ==========================================
# GENERAL & FIXES
# ==========================================
# Ignore maximize requests from apps. You'll probably like this. # Ignore maximize requests from apps. You'll probably like this.
# windowrule = suppress_event maximize, match:class .* # windowrule = suppress_event maximize, match:class .*
@@ -9,45 +24,54 @@
windowrule = no_blur 1, match:class ^$, match:title ^$ windowrule = no_blur 1, match:class ^$, match:title ^$
# games for tearing add the immediate rule # ==========================================
# FLOATING & CENTERED DIALOGS
# ==========================================
# Make them float
windowrule = float 1, match:title $dialog_titles
windowrule = float 1, match:class $dialog_classes
# Float Windows # Set to 800x600
windowrule = float 1, match:title ^(Open File|Select a File|Select Folder|Choose a file|Open Form|Open Workspace|Choose Directory|Save As|Save File|branchdialog|pinentry-gtk-2|Confirm to replace files|File Operation Progress)$ windowrule = size 800 600, match:title $dialog_titles
windowrule = float 1, match:class ^(pavucontrol|blueman-manager|nm-connection-editor)$ windowrule = size 800 600, match:class $dialog_classes
# Center and Resize Windows # Center them on the screen
windowrule = size 800 600, match:title ^(Open Form|Open File|Select a File|Choose a file|Open Workspace|Choose Directory|Save As|Save File|branchdialog|pinentry-gtk-2|Confirm to replace files|File Operation Progress)$ windowrule = center 1, match:title $dialog_titles
windowrule = size 800 600, match:class ^(pavucontrol|blueman-manager|nm-connection-editor)$ windowrule = center 1, match:class $dialog_classes
windowrule = center 1, match:title ^(Open Form|Open File|Select a File|Choose a file|Open Workspace|Choose Directory|Save As|Save File|branchdialog|pinentry-gtk-2|Confirm to replace files|File Operation Progress)$ # Disable blur
windowrule = center 1, match:class ^(pavucontrol|blueman-manager|nm-connection-editor)$ windowrule = no_blur 1, match:title $dialog_titles
windowrule = no_blur 1, match:class $dialog_classes
windowrule = no_blur 1, match:title ^(Open Form|Open File|Select a File|Choose a file|Open Workspace|Choose Directory|Save As|Save File|branchdialog|pinentry-gtk-2|Confirm to replace files|File Operation Progress)$
windowrule = no_blur 1, match:class ^(pavucontrol|blueman-manager|nm-connection-editor)$
# Workspace Rules # ==========================================
# WORKSPACE ASSIGNMENTS
# ==========================================
# Normal Workspaces
# windowrule = workspace 1, match:class ^(firefox)$ # windowrule = workspace 1, match:class ^(firefox)$
# windowrule = workspace 2, match:class ^(kitty)$ # windowrule = workspace 2, match:class ^(kitty)$
# windowrule = workspace 3, match:class ^(Code)$ # windowrule = workspace 3, match:class ^(Code)$
windowrule = workspace 1, match:class $gamescope
# Special Workspaces
windowrule = workspace special:virtual, match:class ^(Spotify|spotify)$ windowrule = workspace special:virtual, match:class ^(Spotify|spotify)$
windowrule = workspace special:discord, match:class ^(discord|vesktop)$ windowrule = workspace special:discord, match:class ^(discord|vesktop)$
# steam rules
windowrule = workspace 3 silent, match:class ^(steam)$, match:title ^(Steam)$ # ==========================================
windowrule = workspace 4, match:class ^(gamescope)$ # APP-SPECIFIC RULES: STEAM & GAMING
# ==========================================
# windowrule = workspace 3 silent, match:class $steam, match:title ^(Steam)$
# fixed sizes for different windows # Fixed sizes for specific Steam windows
windowrule = size 400 800, match:title ^(Friends List)$, match:class ^(steam)$ windowrule = size 400 800, match:title ^(Friends List)$, match:class $steam
windowrule = size 1000 800, match:title ^(Steam Settings)$, match:class ^(steam)$ windowrule = size 1000 800, match:title ^(Steam Settings)$, match:class $steam
windowrule = size 1000 800, match:title ^(Add Non-Steam Game)$, match:class ^(steam)$ windowrule = size 1000 800, match:title ^(Add Non-Steam Game)$, match:class $steam
# float windows that arent the main steam window # Float and disable blur for Steam windows that aren't the main window
windowrule = float 1, match:class ^(steam)$, match:title negative:^(Steam)$ windowrule = float 1, match:class $steam, match:title negative:^(Steam)$
windowrule = no_blur 1, match:class ^(steam)$, match:title negative:^(Steam)$ windowrule = no_blur 1, match:class $steam, match:title negative:^(Steam)$
# windowrule = center 1, match:class ^(steam)$, match:title negative:^(Steam)$ # windowrule = center 1, match:class $steam, match:title negative:^(Steam)$
# allow tearing for games started with gamescope # Allow tearing for games started with Gamescope
windowrule = immediate 1, match:class ^(gamescope)$ windowrule = immediate 1, match:class $gamescope

View File

@@ -1,18 +1,53 @@
#!/bin/bash #!/bin/bash
# ~/.config/hypr/scripts/lid_handler.sh # ~/.config/hypr/scripts/lid_handler.sh
# The file that tells Hyprland to keep the lid off during reloads
LID_STATE_FILE="$HOME/.config/hypr/lid_state.conf"
restart_ui() {
# Spawn in background and detach
systemctl restart --user waybar hyprpaper
}
if [[ "$1" == "close" ]]; then if [[ "$1" == "close" ]]; then
# Lid closed: disable laptop screen if any DP-* monitor is present # Check if ANY external monitor is connected and active
# Using 'all' to detect monitors even if they are currently disabled if hyprctl monitors all | grep -qE "Monitor (DP|HDMI|Type-C)-"; then
if hyprctl monitors all | grep -q "Monitor DP-"; then
hyprctl keyword monitor "eDP-1, disable" # Disable laptop display
# Enable all detected DP-* monitors # Prevent laptop screen from turning on during manual config reloads
for monitor in $(hyprctl monitors all | grep "Monitor DP-" | awk '{print $2}'); do echo "monitor=eDP-1, disable" > "$LID_STATE_FILE"
hyprctl keyword monitor "$monitor, enable"
# Extract the CURRENT live settings of all external monitors using jq
# This grabs the active resolution, refresh rate, position, and scale.
LIVE_MONITORS=$(hyprctl -j monitors | jq -c '.[] | select(.name != "eDP-1")')
# 3. Disable the laptop screen
hyprctl keyword monitor "eDP-1, disable"
# 4. Re-apply the live settings to external monitors so they don't reset
echo "$LIVE_MONITORS" | while read -r mon_json; do
NAME=$(echo "$mon_json" | jq -r '.name')
WIDTH=$(echo "$mon_json" | jq -r '.width')
HEIGHT=$(echo "$mon_json" | jq -r '.height')
REFRESH=$(echo "$mon_json" | jq -r '.refreshRate')
X=$(echo "$mon_json" | jq -r '.x')
Y=$(echo "$mon_json" | jq -r '.y')
SCALE=$(echo "$mon_json" | jq -r '.scale')
# Formats it exactly as Hyprland expects: DP-1, 1920x1080@240, 0x0, 1
hyprctl keyword monitor "$NAME, ${WIDTH}x${HEIGHT}@${REFRESH}, ${X}x${Y}, $SCALE"
done done
# restart ui
restart_ui
fi fi
elif [[ "$1" == "open" ]]; then elif [[ "$1" == "open" ]]; then
# Lid opened: re-enable laptop screen # Clear the override file so the laptop screen is allowed to turn on again
hyprctl keyword monitor "eDP-1, enable" echo "" > "$LID_STATE_FILE"
fi
# Let Hyprland reload itself.
# This automatically re-enables eDP-1 based on your hardcoded hyprland.conf!
hyprctl reload
restart_ui
fi

166
hyprpanel/config.json Normal file
View File

@@ -0,0 +1,166 @@
{
"log_level": "LOG_LEVEL_INFO",
"log_subprocesses_to_journal": false,
"dbus": {
"enabled": true,
"connect_timeout": "20s",
"connect_interval": "0.200s",
"notifications": {
"enabled": true
},
"systray": {
"enabled": true
},
"shortcuts": {
"enabled": true
},
"brightness": {
"enabled": true,
"adjust_step_percent": 5,
"min_brightness": 1,
"enable_logind": true,
"hud_notifications": true
},
"power": {
"enabled": true,
"low_percent": 10,
"critical_percent": 5,
"hud_notifications": true
}
},
"audio": {
"enabled": true,
"volume_step_percent": 5,
"volume_exceed_maximum": false,
"hud_notifications": true
},
"panels": [
{
"id": "panel0",
"edge": "EDGE_TOP",
"size": 34,
"monitor": "",
"modules": [
{
"pager": {
"icon_size": 14,
"active_monitor_only": false,
"scroll_wrap_workspaces": true,
"scroll_include_inactive": true,
"enable_workspace_names": false,
"pinned": [1, 2, 3, 4, 5, 6],
"preview_width": 256
}
},
{
"spacer": {
"size": 8,
"expand": false
}
},
{
"taskbar": {
"icon_size": 24,
"active_workspace_only": true,
"active_monitor_only": true,
"group_tasks": true,
"expand": false
}
},
{
"spacer": {
"expand": true
}
},
{
"clock": {
"time_format": "15:04",
"date_format": "%a %d %b",
"tooltip_time_format": "15:04",
"tooltip_date_format": "Monday, 02 January 2006"
}
},
{
"spacer": {
"expand": true
}
},
{
"systray": {
"icon_size": 18,
"menu_icon_size": 18,
"pinned": [
"nm-applet"
],
"modules": [
{
"power": {
"icon_size": 18,
"icon_symbolic": true
}
}
]
}
},
{
"spacer": {
"size": 8,
"expand": false
}
},
{
"notifications": {
"icon_size": 18,
"notification_icon_size": 48,
"default_timeout": "7s",
"position": "POSITION_TOP_RIGHT",
"margin": 24
}
},
{
"spacer": {
"size": 8,
"expand": false
}
},
{
"audio": {
"icon_size": 18,
"icon_symbolic": true,
"command_mixer": "pavucontrol",
"enable_source": true
}
},
{
"spacer": {
"size": 8,
"expand": false
}
},
{
"session": {
"icon_size": 18,
"icon_symbolic": true,
"overlay_icon_size": 64,
"overlay_icon_symbolic": true,
"command_logout": "uwsm stop",
"command_reboot": "systemctl reboot",
"command_suspend": "systemctl suspend",
"command_shutdown": "systemctl poweroff"
}
},
{
"spacer": {
"size": 8,
"expand": false
}
}
]
}
],
"launch_wrapper": [
"uwsm",
"app",
"--"
]
}

127
hyprpanel/style.css Normal file
View File

@@ -0,0 +1,127 @@
/* Catppuccin Mocha Palette */
@define-color base #1e1e2e;
@define-color mantle #181825;
@define-color crust #11111b;
@define-color surface0 #313244;
@define-color surface1 #45475a;
@define-color surface2 #585b70;
@define-color text #cdd6f4;
@define-color subtext0 #a6adc8;
@define-color subtext1 #bac2de;
@define-color overlay0 #6c7086;
@define-color overlay1 #7f849c;
@define-color overlay2 #9399b2;
@define-color blue #89b4fa;
@define-color lavender #b4befe;
@define-color sapphire #74c7ec;
@define-color sky #89dceb;
@define-color teal #94e2d5;
@define-color green #a6e3a1;
@define-color yellow #f9e2af;
@define-color peach #fab387;
@define-color maroon #eba0ac;
@define-color red #f38ba8;
@define-color mauve #cba6f7;
@define-color flamingo #f2cdcd;
@define-color rosewater #f5e0dc;
* {
font-family: "JetBrainsMono Nerd Font";
font-size: 13px;
border: none;
box-shadow: none;
}
window#panel0 {
background-color: alpha(@base, 0.7);
color: @text;
}
#pager {
margin: 4px;
}
#pager button {
background-color: @surface0;
color: @subtext0;
border-radius: 12px;
margin: 0 2px;
padding: 0 12px;
transition: all 0.2s ease-in-out;
}
#pager button.active {
background-color: @mauve;
color: @base;
}
#pager button:hover {
background-color: @surface1;
color: @text;
}
#taskbar button {
background-color: transparent;
color: @subtext1;
border-radius: 12px;
margin: 0 2px;
padding: 0 8px;
}
#taskbar button.active {
background-color: @surface0;
border-bottom: 2px solid @mauve;
}
#clock, #systray, #audio, #session, #notifications {
background-color: @surface0;
color: @text;
border-radius: 15px;
margin: 4px 3px;
padding: 0 12px;
}
#notifications {
color: @yellow;
}
#clock {
color: @mauve;
font-weight: bold;
}
#audio {
color: @sapphire;
}
#audio.muted {
color: @subtext0;
}
#session {
color: @red;
padding: 0 8px;
}
/* Notifications and HUD */
#notifications {
background-color: @base;
color: @text;
border: 1px solid @surface1;
border-radius: 12px;
}
#hud {
background-color: alpha(@base, 0.8);
color: @text;
border-radius: 20px;
padding: 10px;
}
#hud .progress-bar {
background-color: @surface1;
}
#hud .progress-bar-fill {
background-color: @mauve;
}

View File

@@ -15,6 +15,8 @@ application/x-extension-xht=zen.desktop
x-scheme-handler/about=google-chrome.desktop x-scheme-handler/about=google-chrome.desktop
x-scheme-handler/unknown=google-chrome.desktop x-scheme-handler/unknown=google-chrome.desktop
application/vnd.openxmlformats-officedocument.wordprocessingml.document=libreoffice-writer.desktop application/vnd.openxmlformats-officedocument.wordprocessingml.document=libreoffice-writer.desktop
x-scheme-handler/ror2mm=r2modman.desktop
image/webp=feh.desktop
[Added Associations] [Added Associations]
application/pdf=org.pwmt.zathura-pdf-poppler.desktop; application/pdf=org.pwmt.zathura-pdf-poppler.desktop;
@@ -25,3 +27,4 @@ x-scheme-handler/https=zen.desktop;
text/html=zen.desktop; text/html=zen.desktop;
x-scheme-handler/chrome=zen.desktop; x-scheme-handler/chrome=zen.desktop;
application/vnd.openxmlformats-officedocument.wordprocessingml.document=libreoffice-writer.desktop; application/vnd.openxmlformats-officedocument.wordprocessingml.document=libreoffice-writer.desktop;
image/webp=feh.desktop;

1
nvim Submodule

Submodule nvim added at 8d657d0f8d

View File

@@ -1,403 +0,0 @@
vim.o.number = true
vim.o.wrap = false
vim.o.tabstop = 4
vim.o.shiftwidth = 4
vim.o.smartcase = true
vim.o.ignorecase = true
vim.o.hlsearch = false
vim.o.signcolumn = 'yes'
vim.o.clipboard = 'unnamedplus'
vim.o.undofile = true
vim.o.undodir = '/home/narl/.cache/nvim-undodir'
vim.g.mapleader = ','
-- Set up 'mini.deps' (customize to your liking)
require('mini.deps').setup()
local add = MiniDeps.add
add({
source = 'chomosuke/typst-preview.nvim'
})
add({
source = 'williamboman/mason.nvim'
})
add({
source = 'stevearc/conform.nvim'
})
add({
source = 'williamboman/mason-lspconfig.nvim'
})
add({
source = 'mfussenegger/nvim-lint'
})
add({
source = 'akinsho/toggleterm.nvim'
})
-- Add to current session (install if absent)
add({
source = 'neovim/nvim-lspconfig',
-- Supply dependencies near target plugin
depends = { 'williamboman/mason.nvim' },
})
add({
source = 'seblyng/roslyn.nvim',
})
add({
source = 'tris203/rzls.nvim',
})
add({
source = 'nvim-treesitter/nvim-treesitter',
-- Use 'master' while monitoring updates in 'main'
checkout = 'master',
monitor = 'main',
-- Perform action after every checkout
hooks = { post_checkout = function() vim.cmd('TSUpdate') end },
})
add({
-- Completion framework:
source = 'hrsh7th/nvim-cmp',
-- LSP completion source:
depends = {'hrsh7th/cmp-nvim-lsp',
'hrsh7th/cmp-nvim-lua',
'hrsh7th/cmp-nvim-lsp-signature-help',
'hrsh7th/cmp-vsnip',
'hrsh7th/cmp-path',
'hrsh7th/cmp-buffer',
'hrsh7th/vim-vsnip',
},
})
add({ source = "catppuccin/nvim", name = "catppuccin" })
require('mini.files').setup({
mappings = {
show_help = 'gh',
},
})
require('mini.icons').setup({style = 'ascii'})
require('mini.pick').setup({})
require('mini.snippets').setup({})
require('mini.notify').setup({})
require('mini.statusline').setup({})
require('mini.tabline').setup({})
require('mini.git').setup({})
local imap_expr = function(lhs, rhs)
vim.keymap.set('i', lhs, rhs, { expr = true })
end
imap_expr('<Tab>', [[pumvisible() ? "\<C-n>" : "\<Tab>"]])
imap_expr('<S-Tab>', [[pumvisible() ? "\<C-p>" : "\<S-Tab>"]])
_G.cr_action = function()
-- If there is selected item in popup, accept it with <C-y>
if vim.fn.complete_info()['selected'] ~= -1 then return '\25' end
-- Fall back to plain `<CR>`. You might want to customize this
-- according to other plugins. For example if 'mini.pairs' is set up, replace
-- next line with `return MiniPairs.cr()`
return '\r'
end
vim.keymap.set('i', '<CR>', 'v:lua.cr_action()', { expr = true })
require("toggleterm").setup{
size = function(term)
if term.direction == "horizontal" then
return 30
elseif term.direction == "vertical" then
return 69
end
end,
open_mapping = [[<c-\>]],
hide_numbers = true,
shade_terminals = true,
persist_size = true,
direction = 'float',
close_on_exit = true,
shell = vim.o.shell,
}
require('nvim-treesitter.configs').setup {
ensure_installed = { "lua", "rust", "toml", "c_sharp" },
auto_install = true,
highlight = {
enable = true,
additional_vim_regex_highlighting=false,
},
ident = { enable = true },
rainbow = {
enable = true,
extended_mode = true,
max_file_lines = nil,
}
}
require("mason").setup({
registries = {
"github:mason-org/mason-registry",
"github:Crashdummyy/mason-registry",
},
ui = {
icons = {
package_installed = "",
package_pending = "",
package_uninstalled = ""
}
}
})
require("mason-lspconfig").setup()
vim.lsp.config('rust_analyzer', {
-- Server-specific settings. See `:help lsp-quickstart`
settings = {
['rust-analyzer'] = {},
},
})
require('roslyn').setup({
config = {
-- the rest of your Roslyn configuration
handlers = require("rzls.roslyn_handlers"),
},
})
require("catppuccin").setup({
flavour = "auto", -- latte, frappe, macchiato, mocha
background = { -- :h background
light = "latte",
dark = "mocha",
},
transparent_background = false, -- disables setting the background color.
show_end_of_buffer = false, -- shows the '~' characters after the end of buffers
term_colors = false, -- sets terminal colors (e.g. `g:terminal_color_0`)
dim_inactive = {
enabled = false, -- dims the background color of inactive window
shade = "dark",
percentage = 0.15, -- percentage of the shade to apply to the inactive window
},
no_italic = false, -- Force no italic
no_bold = false, -- Force no bold
no_underline = false, -- Force no underline
styles = { -- Handles the styles of general hi groups (see `:h highlight-args`):
comments = { "italic" }, -- Change the style of comments
conditionals = { "italic" },
loops = {},
functions = {},
keywords = {},
strings = {},
variables = {},
numbers = {},
booleans = {},
properties = {},
types = {},
operators = {},
-- miscs = {}, -- Uncomment to turn off hard-coded styles
},
color_overrides = {},
custom_highlights = {},
default_integrations = true,
integrations = {
cmp = true,
gitsigns = true,
nvimtree = true,
treesitter = true,
notify = false,
mini = {
enabled = true,
indentscope_color = "",
},
-- For more plugins integrations please scroll down (https://github.com/catppuccin/nvim#integrations)
},
})
local sign = function(opts)
vim.fn.sign_define(opts.name, {
texthl = opts.name,
text = opts.text,
numhl = ''
})
end
sign({name = 'DiagnosticSignError', text = ''})
sign({name = 'DiagnosticSignWarn', text = ''})
sign({name = 'DiagnosticSignHint', text = ''})
sign({name = 'DiagnosticSignInfo', text = ''})
--Set completeopt to have a better completion experience
-- :help completeopt
-- menuone: popup even when there's only one match
-- noinsert: Do not insert text until a selection is made
-- noselect: Do not select, force to select one from the menu
-- shortness: avoid showing extra messages when using completion
-- updatetime: set updatetime for CursorHold
vim.opt.completeopt = {'menuone', 'noselect', 'noinsert'}
vim.opt.shortmess = vim.opt.shortmess + { c = true}
vim.api.nvim_set_option('updatetime', 300)
-- Fixed column for diagnostics to appear
-- Show autodiagnostic popup on cursor hover_range
-- Goto previous / next diagnostic warning / error
-- Show inlay_hints more frequently
vim.cmd([[
set signcolumn=yes
autocmd CursorHold * lua vim.diagnostic.open_float(nil, { focusable = false })
]])
vim.diagnostic.config({
virtual_text = false,
signs = true,
update_in_insert = true,
underline = true,
severity_sort = false,
float = {
border = 'rounded',
source = 'always',
header = '',
prefix = '',
},
})
-- setup must be called before loading
vim.cmd.colorscheme "catppuccin"
vim.keymap.set('n', '<leader>w', '<cmd>write<cr>', {desc = 'Save file'})
vim.keymap.set('n', '<leader>q', '<cmd>quitall<cr>', {desc = 'Exit vim'})
-- Simplified clipboard mappings
-- vim.keymap.set({'n', 'x', 'o'}, '<leader>y', '"+y', {desc = 'Copy to clipboard'})
-- vim.keymap.set({'n', 'x'}, '<leader>p', '"+p', {desc = 'Paste from clipboard'})
vim.keymap.set('n', '<leader>e', '<cmd>lua MiniFiles.open()<cr>', {desc = 'File explorer'})
vim.keymap.set('n', '<leader><space>', '<cmd>Pick buffers<cr>', {desc = 'Search open files'})
vim.keymap.set('n', '<leader>ff', '<cmd>Pick files<cr>', {desc = 'Search all files'})
vim.keymap.set('n', '<leader>fh', '<cmd>Pick help<cr>', {desc = 'Search help tags'})
vim.keymap.set('n', '<leader>h', '<cmd>wincmd h<cr>')
vim.keymap.set('n', '<leader>l', '<cmd>wincmd l<cr>')
vim.keymap.set('n', '<leader>j', '<cmd>wincmd j<cr>')
vim.keymap.set('n', '<leader>k', '<cmd>wincmd k<cr>')
require 'typst-preview'.setup {
-- Setting this true will enable logging debug information to
-- `vim.fn.stdpath 'data' .. '/typst-preview/log.txt'`
debug = false,
-- Custom format string to open the output link provided with %s
-- Example: open_cmd = 'firefox %s -P typst-preview --class typst-preview'
open_cmd = nil,
-- Custom port to open the preview server. Default is random.
-- Example: port = 8000
port = 0,
-- Custom host to bind the preview server to.
-- Note that '0.0.0.0' is not supported and [won't be](https://github.com/Myriad-Dreamin/tinymist/issues/2105)
-- Example: host = '192.168.0.10'
host = '127.0.0.1',
-- Setting this to 'always' will invert black and white in the preview
-- Setting this to 'auto' will invert depending if the browser has enable
-- dark mode
-- Setting this to '{"rest": "<option>","image": "<option>"}' will apply
-- your choice of color inversion to images and everything else
-- separately.
invert_colors = 'never',
-- Whether the preview will follow the cursor in the source file
follow_cursor = true,
-- Provide the path to binaries for dependencies.
-- Setting this will skip the download of the binary by the plugin.
-- Warning: Be aware that your version might be older than the one
-- required.
dependencies_bin = {
['tinymist'] = '/home/narl/.local/share/nvim/mason/bin/tinymist',
['websocat'] = '/usr/bin/websocat'
},
-- A list of extra arguments (or nil) to be passed to previewer.
-- For example, extra_args = { "--input=ver=draft", "--ignore-system-fonts" }
extra_args = nil,
-- This function will be called to determine the root of the typst project
get_root = function(path_of_main_file)
local root = os.getenv 'TYPST_ROOT'
if root then
return root
end
-- Look for a project marker so imports from parent dirs stay inside root
local main_dir = vim.fs.dirname(vim.fn.fnamemodify(path_of_main_file, ':p'))
local found = vim.fs.find({ 'typst.toml', '.git' }, { path = main_dir, upward = true })
if #found > 0 then
return vim.fs.dirname(found[1])
end
return main_dir
end,
-- This function will be called to determine the main file of the typst
-- project.
get_main_file = function(path_of_buffer)
return path_of_buffer
end,
}
-- Rust
local cmp = require'cmp'
cmp.setup({
-- Enable LSP snippets
snippet = {
expand = function(args)
vim.fn["vsnip#anonymous"](args.body)
end,
},
mapping = {
['<C-p>'] = cmp.mapping.select_prev_item(),
['<C-n>'] = cmp.mapping.select_next_item(),
-- Add tab support
['<S-Tab>'] = cmp.mapping.select_prev_item(),
['<Tab>'] = cmp.mapping.select_next_item(),
['<C-S-f>'] = cmp.mapping.scroll_docs(-4),
['<C-f>'] = cmp.mapping.scroll_docs(4),
['<C-Space>'] = cmp.mapping.complete(),
['<C-e>'] = cmp.mapping.close(),
['<CR>'] = cmp.mapping.confirm({
behavior = cmp.ConfirmBehavior.Insert,
select = true,
})
},
-- Installed sources:
sources = {
{ name = 'path' }, -- file paths
{ name = 'nvim_lsp', keyword_length = 3 }, -- from language server
{ name = 'nvim_lsp_signature_help'}, -- display function signatures with current parameter emphasized
{ name = 'nvim_lua', keyword_length = 2}, -- complete neovim's Lua runtime API such vim.lsp.*
{ name = 'buffer', keyword_length = 2 }, -- source current buffer
{ name = 'vsnip', keyword_length = 2 }, -- nvim-cmp source for vim-vsnip
{ name = 'calc'}, -- source for math calculation
},
window = {
completion = cmp.config.window.bordered(),
documentation = cmp.config.window.bordered(),
},
formatting = {
fields = {'menu', 'abbr', 'kind'},
format = function(entry, item)
local menu_icon ={
nvim_lsp = 'λ',
vsnip = '',
buffer = 'Ω',
path = '🖫',
}
item.menu = menu_icon[entry.source.name]
return item
end,
},
})

View File

@@ -9,7 +9,7 @@ After=network-online.target
# The command to start the mount. # The command to start the mount.
# Replace "my-remote:" and "/path/to/local/mount" accordingly. # Replace "my-remote:" and "/path/to/local/mount" accordingly.
# The flags below are highly recommended for a good experience. # The flags below are highly recommended for a good experience.
ExecStart=rclone mount google_drive: %h/gdrive \ ExecStart=rclone mount google_drive: %h/remote/gdrive \
--vfs-cache-mode writes \ --vfs-cache-mode writes \
--log-file /tmp/rclone.log \ --log-file /tmp/rclone.log \
--log-level INFO --log-level INFO

View File

@@ -9,7 +9,7 @@ After=network-online.target
# The command to start the mount. # The command to start the mount.
# Replace "my-remote:" and "/path/to/local/mount" accordingly. # Replace "my-remote:" and "/path/to/local/mount" accordingly.
# The flags below are highly recommended for a good experience. # The flags below are highly recommended for a good experience.
ExecStart=sshfs -f -p 420 narl@narl.io:/home/narl %h/narl_io ExecStart=sshfs -f -p 420 narl@narl.io:/opt %h/remote/narl.io
# The command to unmount gracefully. # The command to unmount gracefully.
ExecStop=fusermount -u %h/narl_io ExecStop=fusermount -u %h/narl_io

View File

@@ -10,7 +10,7 @@ After=network-online.target
# The command to start the mount. # The command to start the mount.
# Replace "my-remote:" and "/path/to/local/mount" accordingly. # Replace "my-remote:" and "/path/to/local/mount" accordingly.
# The flags below are highly recommended for a good experience. # The flags below are highly recommended for a good experience.
ExecStart=sshfs -f narl@vh3.narl.io:/opt/minecraft_vaulthunters %h/vaulthunters_server/ ExecStart=sshfs -f -p 420 narl@vh3.narl.io:/opt/minecraft_vaulthunters %h/remote/vh3.narl.io
# The command to unmount gracefully. # The command to unmount gracefully.
ExecStop=fusermount -u %h/vaulthunters_server ExecStop=fusermount -u %h/vaulthunters_server

View File

@@ -0,0 +1 @@
/usr/lib/systemd/user/sunshine.service

View File

@@ -1,208 +1,188 @@
// ~/.config/waybar/config.jsonc // ~/.config/waybar/config.jsonc
{ [
"layer": "top", {
"position": "top", "name": "top",
// "output": "eDP-1", "layer": "top",
"height": 30, "position": "top",
"modules-left": ["hyprland/workspaces"], "height": 34,
"modules-center": [], "spacing": 4,
"modules-right": [ "margin-top": 6,
// "custom/pixelbuds_pro", "margin-left": 10,
"custom/network", "margin-right": 10,
"custom/mem",
"custom/cpu",
"custom/tlp",
"wireplumber#sink",
"wireplumber#source",
"tray",
"clock"
],
"hyprland/workspaces": { "modules-left": [
"format": "{icon}", "hyprland/workspaces",
"on-click": "activate" "hyprland/window"
}, ],
"hyprland/window": { "modules-center": [
"format": "{}", "clock"
"max-length": 35 ],
}, "modules-right": [
"clock": { "tray",
"format": "{:%a %d %b %H:%M}", "custom/gamemode",
"format-alt": false, "custom/power_status"
"on-click-right": "xdg-open https://calendar.proton.me/u/0/month &> /dev/null & disown", ],
"tooltip": false,
},
"cpu": {
"format": "CPU: {usage}%",
"tooltip": true,
"interval": 1
},
"memory": {
"format": "MEM: {used}/{total}GB",
"interval": 3
},
"network": {
"format-wifi": "{essid} ({signalStrength}%): {ipaddr}",
"format-ethernet": "{ifname}: {ipaddr}",
"format-disconnected": "Disconnected",
"tooltip-format": "{ifname} via {gwaddr}"
},
"wireplumber#sink": {
"format": "{node_name} {volume}% {icon}",
"format-muted": "{node_name} ",
"format-icons": {
"headphone": "",
"hands-free": "",
"default": ["", "", ""]
},
"on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle",
"on-click-right": "~/.config/waybar/scripts/audio.sh cycle",
"on-click-middle": "pavucontrol",
"scroll-step": 5
},
"wireplumber#source": {
"node-type": "Audio/Source",
"format": "{node_name} {volume}% ",
"format-muted": "",
"on-click": "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle",
"on-click-right": "~/.config/waybar/scripts/cycle_input.sh cycle",
"on-click-middle": "pavucontrol",
"scroll-step": 5
},
"custom/bluetooth-audio": {
"format": "{}",
"return-type": "json",
"exec": "~/.config/waybar/scripts/bluetooth_audio.sh",
"interval": 3,
"on-click": "~/.config/waybar/scripts/bluetooth_audio.sh disconnect & disown"
},
"pulseaudio": { // --- Standard Modules ---
"format": "{icon} {volume}%", "hyprland/workspaces": {
"format-muted": " Muted", "format": "{icon}",
"format-icons": { "on-click": "activate"
"headphone": "",
"hands-free": "",
"headset": "",
"phone": "",
"portable": "",
"car": "",
"default": ["", ""]
}, },
"on-click": "pavucontrol & disown" "hyprland/window": {
"format": "{}",
"max-length": 50
},
"clock": {
"format": "{:%a %d %b %H:%M}",
"on-click-right": "xdg-open https://calendar.proton.me/u/0/month &> /dev/null & disown",
"tooltip": false
},
"tray": {
"icon-size": 18,
"spacing": 10
},
"custom/gamemode": {
"format": "{}",
"return-type": "json",
"exec": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs game",
"on-click": "~/.config/hypr/scripts/gamemode.sh & disown",
"interval": 1
},
// --- Fluxo-rs Power ---
"custom/power_status": {
"format": "{} ",
"return-type": "json",
"exec": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs power",
"on-click": "~/.config/hypr/scripts/powermenu.sh & disown",
"interval": 5
}
}, },
"tray": { {
"icon-size": 18, "name": "bottom",
"spacing": 6 "layer": "top",
}, "position": "bottom",
"custom/power": { "height": 34,
"format": "", "spacing": 4,
"tooltip": false, "margin-bottom": 6,
"on-click": "~/.config/hypr/scripts/powermenu.sh & disown" "margin-left": 10,
}, "margin-right": 10,
"custom/tlp": {
"format": "{}", "modules-left": [
"exec": "~/.config/waybar/scripts/tlp-profile.sh", "custom/sys",
"return-type": "json", "custom/cpu",
"interval": 5 "custom/mem",
}, "custom/network",
"battery": { "custom/disk-root"
"states": { ],
"warning": 30, "modules-center": [
"critical": 15 ],
}, "modules-right": [
"format": "{capacity}%", "custom/bluetooth-audio",
"format-charging": "{capacity}%", "custom/volume",
"format-plugged": "{capacity}%", "custom/mic"
"format-alt": "{time} {icon}", ],
"format-full": "{capacity}%",
"format-icons": ["", "", "", "", ""] // --- Fluxo-rs System & Hardware ---
}, "custom/sys": {
"custom/pixelbuds_pro": { "format": "{}",
"format": "{}", "return-type": "json",
"return-type": "json", "exec": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs sys",
"exec": "~/.config/waybar/scripts/pixelbuds_pro_control.sh", "interval": 5
"interval": 5, },
"on-click": "~/.config/waybar/scripts/pixelbuds_pro_control.sh connect & disown", "custom/cpu": {
"on-click-right": "~/.config/waybar/scripts/pixelbuds_pro_control.sh cycle_anc & disown" "format": "{}",
}, "return-type": "json",
"custom/audio-output": { "exec": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs cpu",
"format": "{}", "on-click": "zenmonitor & disown",
"return-type": "json", "interval": 3
"exec": "/home/narl/.config/waybar/scripts/audio.sh show", },
"on-click": "/home/narl/.config/waybar/scripts/audio.sh cycle & disown", "custom/mem": {
"interval": 1 "format": "{}",
}, "return-type": "json",
"custom/gamemode": { "exec": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs mem",
"format": "{}", "interval": 3
"return-type": "json", },
"exec": "~/.config/waybar/scripts/gamemode_status.sh", "custom/network": {
"on-click": "~/.config/hypr/scripts/gamemode.sh & disown", "format": "{}",
"interval": 1 "return-type": "json",
}, "exec": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs net",
"custom/gpu-screen-recorder": { "interval": 2
"format": "{}", },
"return-type": "json",
"exec": "~/.config/waybar/scripts/gpu-screen-recorder-status.sh", // --- Fluxo-rs Utilities ---
"on-click-right": "~/.config/hypr/scripts/replay-ctrl.sh save & disown", "custom/disk-root": {
"on-click-middle": "nautilus ~/Videos/replay & disown", "format": "{}",
"on-click": "~/.config/waybar/scripts/toggle-replay.sh & disown", "return-type": "json",
"interval": 1 "exec": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs disk /",
}, "interval": 30
"custom/gpu": { },
"format": "{}",
"return-type": "json", // --- Fluxo-rs Audio & BT ---
"exec": "~/.config/waybar/scripts/gpu_info.sh", "custom/volume": {
"on-click": "lact gui & disown", "format": "{}",
"interval": 3 "return-type": "json",
}, "exec": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs vol",
"custom/cpu": { "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle",
"format": "{}", "on-scroll-up": "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+",
"return-type": "json", "on-scroll-down": "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-",
"exec": "~/.config/waybar/scripts/cpu_info.sh", "on-click-right": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs vol --cycle",
"on-click": "zenmonitor & disown", "on-click-middle": "pavucontrol",
"interval": 3 "interval": 1
}, },
"custom/mem": { "custom/mic": {
"format": "{}", "format": "{}",
"return-type": "json", "return-type": "json",
"exec": "~/.config/waybar/scripts/memory.sh", "exec": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs mic",
"interval": 3 "on-click": "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle",
}, "on-scroll-up": "wpctl set-volume @DEFAULT_AUDIO_SOURCE@ 5%+",
"custom/btrfs": { "on-scroll-down": "wpctl set-volume @DEFAULT_AUDIO_SOURCE@ 5%-",
"format": "{}", "on-click-right": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs mic --cycle",
"exec": "~/.config/waybar/scripts/btrfs.sh", "on-click-middle": "pavucontrol",
"return-type": "json", "interval": 1
"interval": 30 },
}, "custom/bluetooth-audio": {
"custom/disk-root": { "format": "{}",
"format": "{}", "return-type": "json",
"return-type": "json", "exec": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs bt",
"exec": "~/.config/waybar/scripts/disk_info.sh /", "on-click": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs bt menu",
"interval": 30 "on-click-right": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs bt disconnect",
}, "interval": 3
"custom/disk-gdrive": { }
"format": "{}",
"return-type": "json", // --- Commented Out Modules ---
"exec": "~/.config/waybar/scripts/disk_info.sh ~/gdrive", /*
"interval": 30 "custom/gpu": {
}, "format": "{}",
"custom/disk-data": { "return-type": "json",
"format": "{}", "exec": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs gpu",
"return-type": "json", "on-click": "lact gui & disown",
"exec": "~/.config/waybar/scripts/disk_info.sh ~/data", "interval": 3
"interval": 30 },
}, "custom/btrfs": {
"custom/disk-games": { "format": "{}",
"format": "{}", "return-type": "json",
"return-type": "json", "exec": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs pool",
"exec": "~/.config/waybar/scripts/disk_info.sh ~/games", "interval": 30
"interval": 30 },
}, "custom/pixelbuds_pro": {
"custom/network": { "format": "{}",
"exec": "~/.config/waybar/scripts/network.sh", "return-type": "json",
"interval": 2, // in seconds "exec": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs buds",
"format": "{}", "on-click": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs buds connect & disown",
"return-type": "json" "on-click-right": "~/.config/waybar/fluxo-rs/target/release/fluxo-rs buds cycle_anc & disown",
"interval": 5
},
"custom/gpu-screen-recorder": {
"format": "{}",
"return-type": "json",
"exec": "~/.config/waybar/scripts/gpu-screen-recorder-status.sh",
"on-click-right": "~/.config/hypr/scripts/replay-ctrl.sh save & disown",
"on-click-middle": "nautilus ~/Videos/replay & disown",
"on-click": "~/.config/waybar/scripts/toggle-replay.sh & disown",
"interval": 1
}
*/
} }
} ]

View File

@@ -5,7 +5,8 @@ DESCRIPTION=$(pactl list sources | grep -A2 "Name: $DEFAULT_SOURCE" | grep "Desc
case $1 in case $1 in
cycle) cycle)
SOURCES=($(pactl list short sources | awk '{print $2}')) # Filter out monitor sources
SOURCES=($(pactl list short sources | awk '{print $2}' | grep -v ".monitor"))
NUM_SOURCES=${#SOURCES[@]} NUM_SOURCES=${#SOURCES[@]}
CURRENT_SOURCE=$(pactl info | grep 'Default Source' | cut -d ' ' -f3) CURRENT_SOURCE=$(pactl info | grep 'Default Source' | cut -d ' ' -f3)
@@ -16,6 +17,10 @@ case $1 in
exit 0 exit 0
fi fi
done done
# If current source was a monitor or not in list, just pick the first one
if [ $NUM_SOURCES -gt 0 ]; then
pactl set-default-source "${SOURCES[0]}"
fi
;; ;;
show) show)
TEXT=$(echo "$DESCRIPTION" | cut -c -20) TEXT=$(echo "$DESCRIPTION" | cut -c -20)
@@ -35,6 +40,6 @@ case $1 in
printf '{"text": "%s", "tooltip": "%s", "class": "%s"}' "$TEXT" "$DESCRIPTION" "$CLASS" printf '{"text": "%s", "tooltip": "%s", "class": "%s"}' "$TEXT" "$DESCRIPTION" "$CLASS"
;; ;;
*) *)
echo "usage audio.sh {cycle|show}" echo "usage cycle_input.sh {cycle|show}"
;; ;;
esac esac

View File

@@ -28,11 +28,16 @@ TX_MBPS="0.00"
# Read previous values if the stats file exists # Read previous values if the stats file exists
if [ -f "$STATS_FILE" ]; then if [ -f "$STATS_FILE" ]; then
source "$STATS_FILE" # This loads PREV_TIME, PREV_RX_BYTES, PREV_TX_BYTES # shellcheck source=/dev/null
# Use a lock to ensure we don't source while another instance is writing
{
flock -s 200 || exit 1
source "$STATS_FILE" 2>/dev/null
} 200>"$STATS_FILE.lock"
fi fi
# Calculate speed if we have previous data and time has passed # Calculate speed if we have previous data and time has passed
if [ -n "$PREV_TIME" ] && [ "$TIME_NOW" -gt "$PREV_TIME" ]; then if [ -n "$PREV_TIME" ] && [ -n "$PREV_RX_BYTES" ] && [ -n "$PREV_TX_BYTES" ] && [ "$TIME_NOW" -gt "$PREV_TIME" ]; then
TIME_DIFF=$((TIME_NOW - PREV_TIME)) TIME_DIFF=$((TIME_NOW - PREV_TIME))
RX_BPS=$(( (RX_BYTES_NOW - PREV_RX_BYTES) / TIME_DIFF )) RX_BPS=$(( (RX_BYTES_NOW - PREV_RX_BYTES) / TIME_DIFF ))
@@ -43,10 +48,14 @@ if [ -n "$PREV_TIME" ] && [ "$TIME_NOW" -gt "$PREV_TIME" ]; then
TX_MBPS=$(printf "%.2f" "$(echo "$TX_BPS / 1024 / 1024" | bc -l)") TX_MBPS=$(printf "%.2f" "$(echo "$TX_BPS / 1024 / 1024" | bc -l)")
fi fi
# Save current values for the next run # Save current values for the next run safely using a lock
echo "PREV_TIME=$TIME_NOW" > "$STATS_FILE" # We use a subshell with flock to ensure atomic updates and prevent race conditions
echo "PREV_RX_BYTES=$RX_BYTES_NOW" >> "$STATS_FILE" (
echo "PREV_TX_BYTES=$TX_BYTES_NOW" >> "$STATS_FILE" flock -x 200 || exit 1
echo "PREV_TIME=$TIME_NOW" > "$STATS_FILE"
echo "PREV_RX_BYTES=$RX_BYTES_NOW" >> "$STATS_FILE"
echo "PREV_TX_BYTES=$TX_BYTES_NOW" >> "$STATS_FILE"
) 200>"$STATS_FILE.lock"
# Format the main output string # Format the main output string
OUTPUT_TEXT="$INTERFACE ($IP_ADDR):  ${RX_MBPS} MB/s  ${TX_MBPS} MB/s" OUTPUT_TEXT="$INTERFACE ($IP_ADDR):  ${RX_MBPS} MB/s  ${TX_MBPS} MB/s"

37
waybar/scripts/volume.sh Executable file
View File

@@ -0,0 +1,37 @@
#!/bin/bash
TYPE=$1 # "mic" for source, empty for sink
if [ "$TYPE" == "mic" ]; then
TARGET="@DEFAULT_AUDIO_SOURCE@"
else
TARGET="@DEFAULT_AUDIO_SINK@"
fi
# Get volume and mute status from wpctl
OUTPUT=$(wpctl get-volume $TARGET)
VOLUME_RAW=$(echo "$OUTPUT" | awk '{print $2}')
VOLUME=$(echo "$VOLUME_RAW * 100 / 1" | bc)
MUTE=$(echo "$OUTPUT" | grep -c "MUTED")
if [ "$MUTE" -eq 1 ]; then
if [ "$TYPE" == "mic" ]; then
ICON=""
else
ICON=""
fi
printf '{"text": "%s", "class": "muted", "percentage": %d}' "$ICON" "$VOLUME"
else
if [ "$TYPE" == "mic" ]; then
ICON=""
else
if [ "$VOLUME" -le 30 ]; then
ICON=""
elif [ "$VOLUME" -le 60 ]; then
ICON=""
else
ICON=""
fi
fi
printf '{"text": "%d%% %s", "class": "unmuted", "percentage": %d}' "$VOLUME" "$ICON" "$VOLUME"
fi

View File

@@ -0,0 +1,64 @@
import subprocess
import json
import sys
def get_wpctl_status(target):
try:
output = subprocess.check_output(["wpctl", "get-volume", target], text=True)
parts = output.strip().split()
if len(parts) < 2:
return 0, False
vol = int(float(parts[1]) * 100)
muted = "[MUTED]" in output
return vol, muted
except:
return 0, False
def get_pactl_description(target_type):
try:
cmd_info = ["pactl", "info"]
info = subprocess.check_output(cmd_info, text=True)
search_key = "Default Sink" if target_type == "sink" else "Default Source"
default_dev = next(line.split(": ")[1] for line in info.splitlines() if search_key in line)
cmd_list = ["pactl", "list", "sinks" if target_type == "sink" else "sources"]
output = subprocess.check_output(cmd_list, text=True)
blocks = output.split("\n\n")
for block in blocks:
if f"Name: {default_dev}" in block:
for line in block.splitlines():
if "Description:" in line:
desc = line.split(": ")[1].strip()
# Add a small hint if it is a monitor, though cycle_input should prevent it
if ".monitor" in default_dev:
return "Monitor: " + desc[:11]
return desc[:20]
except:
pass
return "Unknown"
try:
target_type = sys.argv[1] if len(sys.argv) > 1 else "sink"
target = "@DEFAULT_AUDIO_SINK@" if target_type == "sink" else "@DEFAULT_AUDIO_SOURCE@"
vol, muted = get_wpctl_status(target)
name = get_pactl_description(target_type)
if muted:
icon = "" if target_type == "sink" else ""
text = f"{name} {icon}"
cls = "muted"
else:
if target_type == "sink":
if vol <= 30: icon = ""
elif vol <= 60: icon = ""
else: icon = ""
else:
icon = ""
text = f"{name} {vol}% {icon}"
cls = "unmuted"
print(json.dumps({"text": text, "class": cls, "percentage": vol}))
except Exception as e:
print(json.dumps({"text": "Error", "class": "error"}))

View File

@@ -1,254 +1,133 @@
/* ~/.config/waybar/style.css */ /* ~/.config/waybar/style.css */
@import "./catppuccin-waybar/themes/mocha.css"; @import "./catppuccin-waybar/themes/mocha.css";
/* --- Global Reset --- */
* { * {
border: none; border: none;
border-radius: 0; border-radius: 0;
min-height: 0; min-height: 0;
font-family: JetBrainsMono Nerd Font; font-family: JetBrainsMono Nerd Font, monospace;
font-size: 13px; font-size: 13px;
transition: all 0.2s ease;
} }
/* --- Bar Background (Floating Island Style) --- */
window#waybar { window#waybar {
background-color: alpha(@base, 0.4); background-color: transparent;
padding: 4px;
transition-property: background-color;
transition-duration: 0.5s;
color: @text; color: @text;
} }
window#waybar.hidden { /* --- Shared Island Styling --- */
opacity: 0.5; #workspaces,
#window,
#clock,
#tray,
#custom-sys,
#custom-cpu,
#custom-gpu,
#custom-mem,
#custom-network,
#custom-btrfs,
#custom-disk-root,
#custom-pixelbuds_pro,
#custom-bluetooth-audio,
#custom-volume,
#custom-mic,
#custom-gamemode,
#custom-gpu-screen-recorder,
#custom-power_status {
background-color: alpha(@surface0, 0.95);
margin: 4px 2px;
padding: 0 12px;
border-radius: 5px;
border: 1px solid alpha(@surface1, 0.5);
} }
/* --- Top Bar Special Handling --- */
window#waybar.top {
margin-top: 6px;
}
/* --- Bottom Bar Special Handling --- */
window#waybar.bottom {
margin-bottom: 6px;
}
/* --- Workspaces --- */
#workspaces button { #workspaces button {
all: initial; padding: 0 8px;
/* Remove GTK theme values (waybar #1351) */ margin: 4px 2px;
min-width: 0; border-radius: 5px;
/* Fix weird spacing in materia (waybar #450) */
box-shadow: inset 0 -3px transparent;
/* Use box-shadow instead of border so the text isn't offset */
padding: 0px 12px;
margin: 0px 3px;
border-radius: 10px;
background-color: @base;
color: @subtext0; color: @subtext0;
background-color: transparent;
} }
#workspaces button.active { #workspaces button.active {
color: @text; color: @blue;
border-bottom: 3px solid @blue; background-color: @surface1;
}
#workspaces button:hover {
box-shadow: inherit;
text-shadow: inherit;
background-color: @surface0;
color: @text;
} }
#workspaces button.urgent { #workspaces button.urgent {
border-bottom: 3px solid @maroon; color: @red;
} }
#memory, #workspaces button:hover {
#cpu, background-color: @surface2;
#custom-gpu,
#custom-cpu,
#custom-mem,
#custom-power,
#custom-gamemode,
#custom-tlp,
#battery,
#backlight,
#wireplumber,
#custom-network,
#network,
#clock,
#tray,
#custom-disk-root,
#custom-disk-gdrive,
#custom-disk-games,
#custom-disk-data,
#custom-pixelbuds_pro,
#custom-bluetooth-audio,
#custom-audio-output,
#custom-btrfs,
#custom-gpu-screen-recorder {
border-radius: 10px;
margin: 0px 2px;
padding: 0px 10px;
background-color: @base;
color: @text; color: @text;
} }
#wireplumber.muted, #custom-pixelbuds_pro, #custom-audio-output.muted { /* --- Clock (Centered Pill) --- */
background-color: @base; #clock {
color: @subtext1; color: @mauve;
border-bottom: 3px solid @subtext1; font-weight: bold;
} }
#custom-pixelbuds_pro.disconnected { /* --- Power Status --- */
padding-right: 10px; #custom-power_status {
padding-left: 8px; font-weight: bold;
} }
#custom-power_status.charging { color: @green; border-color: @green; }
#custom-gpu-screen-recorder, #custom-power_status.bat { color: @yellow; }
#custom-gpu-screen-recorder.recording { #custom-power_status.warning { color: @peach; }
padding-right: 12px; #custom-power_status.critical {
padding-left: 4px; color: @red;
} border-color: @red;
animation: blink 1s infinite alternate;
#custom-gamemode {
padding-right: 9px;
padding-left: 5px;
}
#custom-pixelbuds_pro.anc-active {
color: @sapphire;
border-bottom: 3px solid @sapphire;
}
#custom-bluetooth-audio {
color: @sapphire;
border-bottom: 3px solid @sapphire;
}
#custom-pixelbuds_pro.anc-aware {
color: @sapphire;
border-bottom: 3px solid @sapphire;
}
#custom-pixelbuds_pro.anc-off {
color: @text;
border-bottom: 3px solid @text;
}
#custom-gpu-screen-recorder,
#custom-gamemode {
background-color: @base;
color: @subtext1;
border-bottom: 3px solid @subtext1;
}
#custom-power {
color: @maroon;
}
#custom-gpu-screen-recorder.recording,
#custom-gamemode.active {
color: @maroon;
border-bottom: 3px solid @maroon;
}
#custom-tlp {
padding: 0 10px;
min-width: 10px;
}
#custom-tlp.charging {
color: @mauve;
border-bottom: 3px solid @mauve;
}
#custom-tlp.bat {
color: @sapphire;
border-bottom: 3px solid @sapphire;
}
#custom-tlp.warning {
color: @yellow;
border-bottom: 3px solid @yellow;
}
#custom-tlp.critical {
color: @red;
border-bottom: 3px solid @red;
animation-name: blink;
animation-duration: 0.8s;
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-direction: alternate;
} }
@keyframes blink { @keyframes blink {
to { to { background-color: alpha(@red, 0.4); }
color: @yellow;
border-bottom: 3px solid @yellow;
opacity: 0.6;
}
} }
#custom-gpu.max, /* --- Hardware Metrics (Left Bottom) --- */
#custom-cpu.max, #custom-sys { color: @teal; }
#custom-mem.max, #custom-cpu { color: @blue; }
#custom-btrfs.max, #custom-mem { color: @lavender; }
#custom-disk-root.max, #custom-network { color: @sapphire; }
#custom-disk-gdrive.max,
#custom-disk-games.max,
#custom-disk-data.max {
color: @maroon;
/* border-bottom: 3px solid @maroon; */
}
#custom-gpu.high, #custom-cpu.high, #custom-mem.high { color: @yellow; }
#custom-gpu.high, #custom-cpu.max, #custom-mem.max { color: @red; }
#custom-cpu.high,
#custom-mem.high,
#custom-btrfs.high,
#custom-disk-root.high,
#custom-disk-gdrive.high,
#custom-disk-games.high,
#custom-disk-data.high {
color: @yellow;
/* border-bottom: 3px solid @yellow; */
}
#memory, /* --- Center Bottom Utilities --- */
#cpu, #custom-gamemode { color: @yellow; }
#disk, #custom-gamemode.active { color: @red; border-color: @red; }
#network,
#custom-network,
#custom-gpu.normal,
#custom-cpu.normal,
#custom-mem.normal,
#custom-btrfs.normal,
#custom-disk-root.normal,
#custom-disk-gdrive.normal,
#custom-disk-games.normal,
#custom-disk-data.normal {
color: @blue;
/* border-bottom: 3px solid @mauve; */
}
/* --- Right Bottom Controls --- */
#custom-disk-root { color: @sky; }
#custom-volume { color: @mauve; }
#custom-mic { color: @flamingo; }
#custom-volume.muted, #custom-mic.muted { color: @overlay0; }
#backlight { #custom-bluetooth-audio { color: @blue; }
color: @mauve;
}
#wireplumber.muted {
padding-right: 15px;
}
#custom-audio-output.unmuted, #wireplumber {
color: @mauve;
border-bottom: 3px solid @mauve;
}
#clock {
color: @mauve;
}
#network {
}
/* --- Tooltip --- */
tooltip { tooltip {
border-radius: 10px; background-color: alpha(@base, 0.95);
padding: 9px; border: 1px solid @surface1;
background-color: @base; border-radius: 5px;
} }
tooltip label { tooltip label {
padding: 5px; color: @text;
background-color: @base; padding: 8px;
} }