From 461a8f9433dc36e65af69a97b7866595a63e49f8 Mon Sep 17 00:00:00 2001 From: Alfie King Date: Tue, 4 Feb 2025 15:21:33 +0000 Subject: [PATCH] files :3 --- fastfetch/ascii-art.txt | 24 ++ fastfetch/config.jsonc | 116 ++++++ fish/config.fish | 13 + fish/fish_variables | 31 ++ fish/functions/cat.fish | 4 + fish/functions/fishrc.fish | 4 + fish/functions/hyprc.fish | 4 + hyfetch.json | 16 + hypr/hypridle.conf | 8 + hypr/hyprland.conf | 289 +++++++++++++++ hypr/hyprland.conf.save | 284 +++++++++++++++ hypr/hyprlock.conf | 69 ++++ hypr/hyprpaper.conf | 3 + waybar/animation.css | 216 +++++++++++ waybar/config.jsonc | 522 +++++++++++++++++++++++++++ waybar/scripts/bluetooth-menu.sh | 105 ++++++ waybar/scripts/brightness-control.sh | 92 +++++ waybar/scripts/cpu-temp.sh | 64 ++++ waybar/scripts/cpu-usage.sh | 33 ++ waybar/scripts/media-player.py | 203 +++++++++++ waybar/scripts/power-menu.sh | 30 ++ waybar/scripts/system-update.sh | 86 +++++ waybar/scripts/volume-control.sh | 111 ++++++ waybar/scripts/wifi-menu.sh | 126 +++++++ waybar/scripts/wifi-status.sh | 176 +++++++++ waybar/style.css | 383 ++++++++++++++++++++ waybar/theme.css | 45 +++ 27 files changed, 3057 insertions(+) create mode 100644 fastfetch/ascii-art.txt create mode 100644 fastfetch/config.jsonc create mode 100644 fish/config.fish create mode 100644 fish/fish_variables create mode 100644 fish/functions/cat.fish create mode 100644 fish/functions/fishrc.fish create mode 100644 fish/functions/hyprc.fish create mode 100644 hyfetch.json create mode 100644 hypr/hypridle.conf create mode 100644 hypr/hyprland.conf create mode 100644 hypr/hyprland.conf.save create mode 100644 hypr/hyprlock.conf create mode 100644 hypr/hyprpaper.conf create mode 100644 waybar/animation.css create mode 100644 waybar/config.jsonc create mode 100755 waybar/scripts/bluetooth-menu.sh create mode 100755 waybar/scripts/brightness-control.sh create mode 100755 waybar/scripts/cpu-temp.sh create mode 100755 waybar/scripts/cpu-usage.sh create mode 100755 waybar/scripts/media-player.py create mode 100755 waybar/scripts/power-menu.sh create mode 100755 waybar/scripts/system-update.sh create mode 100755 waybar/scripts/volume-control.sh create mode 100755 waybar/scripts/wifi-menu.sh create mode 100755 waybar/scripts/wifi-status.sh create mode 100644 waybar/style.css create mode 100644 waybar/theme.css diff --git a/fastfetch/ascii-art.txt b/fastfetch/ascii-art.txt new file mode 100644 index 0000000..c8b6ba0 --- /dev/null +++ b/fastfetch/ascii-art.txt @@ -0,0 +1,24 @@ + + + + @## + &#### + %####### + ########## + #%# ############ + #////### ############ ####//## + ////(/#### ##############////# + ##/#######################/// + ####...#############...#### + #####...#\####/##...#### + ####...##&&\/\/,&###...### + ####%#%%%&&&& &&&&&%%%%%### + ######&&&&&& &&&&&&&#####////////// + ///######&&&&&& ///&&&&&&###### // + //& #######%&&&&////// @&&&&&&### ### ///// + // ####///////&&&& &//////////# + //////#######&&& ///// @&&&######### + #######% /// ######## + ### // #### + %# + diff --git a/fastfetch/config.jsonc b/fastfetch/config.jsonc new file mode 100644 index 0000000..ecc21cc --- /dev/null +++ b/fastfetch/config.jsonc @@ -0,0 +1,116 @@ +// _____ _____ _____ _____ _____ _____ _____ _____ _____ +// | __| _ | __|_ _| __| __|_ _| | | | +// | __| |__ | | | | __| __| | | | --| | +// |__| |__|__|_____| |_| |__| |_____| |_| |_____|__|__| GROUPS + // +// by Bina + + +{ + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json", + "logo": { + "source": "~/.config/fastfetch/ascii-art.txt", + "height": 20, + }, + "display": { + "separator": " ➜ " + }, + "modules": [ + "break", + "break", + "break", + { + "type": "os", + "key": "OS ", + "keyColor": "31", // = color1 + }, + { + "type": "kernel", + "key": " ├  ", + "keyColor": "31", + }, + { + "type": "packages", + "format": "{} (pacman)", + "key": " ├ 󰏖 ", + "keyColor": "31", + }, + { + "type": "shell", + "key": " └  ", + "keyColor": "31", + }, + "break", + { + "type": "wm", + "key": "WM ", + "keyColor": "32", + }, + { + "type": "wmtheme", + "key": " ├ 󰉼 ", + "keyColor": "32", + }, + { + "type": "icons", + "key": " ├ 󰀻 ", + "keyColor": "32", + }, + { + "type": "cursor", + "key": " ├  ", + "keyColor": "32", + }, + { + "type": "terminal", + "key": " ├  ", + "keyColor": "32", + }, + { + "type": "terminalfont", + "key": " └  ", + "keyColor": "32", + }, + "break", + { + "type": "host", + "format": "{5} {2}", + "key": "PC ", + "keyColor": "33", + }, + { + "type": "cpu", + "format": "{1} ({3}) @ {7} GHz", + "key": " ├  ", + "keyColor": "33", + }, + { + "type": "gpu", + "format": "{1} {2} @ {12} GHz", + "key": " ├ 󰢮 ", + "keyColor": "33", + }, + { + "type": "memory", + "key": " ├  ", + "keyColor": "33", + }, + { + "type": "swap", + "key": " ├ 󰓡 ", + "keyColor": "33", + }, + { + "type": "disk", + "key": " ├ 󰋊 ", + "keyColor": "33", + }, + { + "type": "monitor", + "format": "{1} {2}x{3}@{7}Hz", + "key": " └  ", + "keyColor": "33", + } + ] +} + diff --git a/fish/config.fish b/fish/config.fish new file mode 100644 index 0000000..9945ae7 --- /dev/null +++ b/fish/config.fish @@ -0,0 +1,13 @@ +if status is-interactive + # Commands to run in interactive sessions can go here +end + +function fish_greeting + owoii (random choice "hello there" "owo" ">w<" "I use Arch BTW") +end + +function owoii + owo --nre $argv | figlet +end + +alias owofetch="hyfetch --ascii-file $HOME/.config/fastfetch/ascii-art.txt" diff --git a/fish/fish_variables b/fish/fish_variables new file mode 100644 index 0000000..52cd691 --- /dev/null +++ b/fish/fish_variables @@ -0,0 +1,31 @@ +# This file contains fish universal variable definitions. +# VERSION: 3.0 +SETUVAR __fish_initialized:3400 +SETUVAR fish_color_autosuggestion:brblack +SETUVAR fish_color_cancel:\x2dr +SETUVAR fish_color_command:blue +SETUVAR fish_color_comment:red +SETUVAR fish_color_cwd:green +SETUVAR fish_color_cwd_root:red +SETUVAR fish_color_end:green +SETUVAR fish_color_error:brred +SETUVAR fish_color_escape:brcyan +SETUVAR fish_color_history_current:\x2d\x2dbold +SETUVAR fish_color_host:normal +SETUVAR fish_color_host_remote:yellow +SETUVAR fish_color_normal:normal +SETUVAR fish_color_operator:brcyan +SETUVAR fish_color_param:cyan +SETUVAR fish_color_quote:yellow +SETUVAR fish_color_redirection:cyan\x1e\x2d\x2dbold +SETUVAR fish_color_search_match:bryellow\x1e\x2d\x2dbackground\x3dbrblack +SETUVAR fish_color_selection:white\x1e\x2d\x2dbold\x1e\x2d\x2dbackground\x3dbrblack +SETUVAR fish_color_status:red +SETUVAR fish_color_user:brgreen +SETUVAR fish_color_valid_path:\x2d\x2dunderline +SETUVAR fish_key_bindings:fish_default_key_bindings +SETUVAR fish_pager_color_completion:normal +SETUVAR fish_pager_color_description:yellow\x1e\x2di +SETUVAR fish_pager_color_prefix:normal\x1e\x2d\x2dbold\x1e\x2d\x2dunderline +SETUVAR fish_pager_color_progress:brwhite\x1e\x2d\x2dbackground\x3dcyan +SETUVAR fish_pager_color_selected_background:\x2dr diff --git a/fish/functions/cat.fish b/fish/functions/cat.fish new file mode 100644 index 0000000..774b959 --- /dev/null +++ b/fish/functions/cat.fish @@ -0,0 +1,4 @@ +function cat --wraps=bat --description 'alias cat=bat' + bat $argv + +end diff --git a/fish/functions/fishrc.fish b/fish/functions/fishrc.fish new file mode 100644 index 0000000..334606f --- /dev/null +++ b/fish/functions/fishrc.fish @@ -0,0 +1,4 @@ +function fishrc --wraps='nano ~/.config/fish/fish.config' --wraps='nano ~/.config/fish/config.fish' --description 'alias fishrc=nano ~/.config/fish/config.fish' + nano ~/.config/fish/config.fish $argv + +end diff --git a/fish/functions/hyprc.fish b/fish/functions/hyprc.fish new file mode 100644 index 0000000..dcb9363 --- /dev/null +++ b/fish/functions/hyprc.fish @@ -0,0 +1,4 @@ +function hyprc --wraps='nano ~/.config/hypr/hyperland.conf' --wraps='nano ~/.config/hypr/hyprland.conf' --description 'alias hyprc=nano ~/.config/hypr/hyprland.conf' + nano ~/.config/hypr/hyprland.conf $argv + +end diff --git a/hyfetch.json b/hyfetch.json new file mode 100644 index 0000000..ff17345 --- /dev/null +++ b/hyfetch.json @@ -0,0 +1,16 @@ +{ + "preset": "bisexual", + "mode": "rgb", + "light_dark": "dark", + "lightness": 0.61, + "color_align": { + "mode": "horizontal", + "custom_colors": [], + "fore_back": null + }, + "backend": "fastfetch", + "args": null, + "distro": null, + "pride_month_shown": [], + "pride_month_disable": false +} \ No newline at end of file diff --git a/hypr/hypridle.conf b/hypr/hypridle.conf new file mode 100644 index 0000000..1604969 --- /dev/null +++ b/hypr/hypridle.conf @@ -0,0 +1,8 @@ +general { + #lock_cmd = notify-send "lock!" # dbus/sysd lock command (loginctl lock-session) + #unlock_cmd = notify-send "unlock!" # same as above, but unlock + before_sleep_cmd = hyprlock # command ran before sleep + #after_sleep_cmd = notify-send "Awake!" # command ran after sleep + #ignore_dbus_inhibit = false # whether to ignore dbus-sent idle-inhibit requests (used by e.g. firefox or steam) + #ignore_systemd_inhibit = false # whether to ignore systemd-inhibit --what=idle inhibitors +} diff --git a/hypr/hyprland.conf b/hypr/hyprland.conf new file mode 100644 index 0000000..62b80da --- /dev/null +++ b/hypr/hyprland.conf @@ -0,0 +1,289 @@ + +# This is an example Hyprland config file. +# Refer to the wiki for more information. +# https://wiki.hyprland.org/Configuring/ + +# Please note not all available settings / options are set here. +# For a full list, see the wiki + +# You can split this configuration into multiple files +# Create your files separately and then link them to this file like this: +# source = ~/.config/hypr/myColors.conf + + +################ +### MONITORS ### +################ + +# See https://wiki.hyprland.org/Configuring/Monitors/ +monitor= eDP-1, 2256x1504@60, 0x0, 1 + + +################### +### MY PROGRAMS ### +################### + +# See https://wiki.hyprland.org/Configuring/Keywords/ + +# Set programs that you use +$terminal = cool-retro-term +$fileManager = dolphin +$menu = rofi -show drun + + +################# +### AUTOSTART ### +################# + +# Autostart necessary processes (like notifications daemons, status bars, etc.) +# Or execute your favorite apps at launch like this: + +# exec-once = $terminal +# exec-once = nm-applet & +exec-once = waybar & hyprpaper & nm-applet +exec-once = dbus-update-activation-environment --systemd --all +exec-once = kdeconnect-indicator +exec-once = hypridle +exec-once = wl-paste --watch cliphist store +exec-once = XDG_MENU_PREFIX=arch- kbuildsycoca6 + +############################# +### ENVIRONMENT VARIABLES ### +############################# + +# See https://wiki.hyprland.org/Configuring/Environment-variables/ + +env = XCURSOR_SIZE,24 +env = HYPRCURSOR_SIZE,24 +env = XDG_SESSION_TYPE,wayland +env = QT_QPA_PLATFORMTHEME,qt6ct +env = QT_QPA_PLATFORM,wayland +env = GTK_THEME, Adwaita:dark + +##################### +### LOOK AND FEEL ### +##################### + +# Refer to https://wiki.hyprland.org/Configuring/Variables/ + +# https://wiki.hyprland.org/Configuring/Variables/#general +general { + gaps_in = 5 + gaps_out = 20 + + border_size = 2 + + # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors + col.active_border = rgba(463155ff) + col.inactive_border = rgba(251b31aa) + + # Set to true enable resizing windows by clicking and dragging on borders and gaps + resize_on_border = false + + # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on + allow_tearing = false + + layout = dwindle +} + +# https://wiki.hyprland.org/Configuring/Variables/#decoration +decoration { + rounding = 10 + rounding_power = 2 + + # Change transparency of focused and unfocused windows + active_opacity = 1.0 + inactive_opacity = 1.0 + + shadow { + enabled = true + range = 4 + render_power = 3 + color = rgba(1a1a1aee) + } + + # https://wiki.hyprland.org/Configuring/Variables/#blur + blur { + enabled = true + size = 3 + passes = 1 + + vibrancy = 0.1696 + } +} + +# https://wiki.hyprland.org/Configuring/Variables/#animations +animations { + enabled = yes, please :) + + # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more + + bezier = easeOutQuint,0.23,1,0.32,1 + bezier = easeInOutCubic,0.65,0.05,0.36,1 + bezier = linear,0,0,1,1 + bezier = almostLinear,0.5,0.5,0.75,1.0 + bezier = quick,0.15,0,0.1,1 + + animation = global, 1, 10, default + animation = border, 1, 5.39, easeOutQuint + animation = windows, 1, 4.79, easeOutQuint + animation = windowsIn, 1, 4.1, easeOutQuint, popin 87% + animation = windowsOut, 1, 1.49, linear, popin 87% + animation = fadeIn, 1, 1.73, almostLinear + animation = fadeOut, 1, 1.46, almostLinear + animation = fade, 1, 3.03, quick + animation = layers, 1, 3.81, easeOutQuint + animation = layersIn, 1, 4, easeOutQuint, fade + animation = layersOut, 1, 1.5, linear, fade + animation = fadeLayersIn, 1, 1.79, almostLinear + animation = fadeLayersOut, 1, 1.39, almostLinear + animation = workspaces, 1, 1.94, almostLinear, fade + animation = workspacesIn, 1, 1.21, almostLinear, fade + animation = workspacesOut, 1, 1.94, almostLinear, fade +} + +# Ref https://wiki.hyprland.org/Configuring/Workspace-Rules/ +# "Smart gaps" / "No gaps when only" +# uncomment all if you wish to use that. +# workspace = w[tv1], gapsout:0, gapsin:0 +# workspace = f[1], gapsout:0, gapsin:0 +# windowrulev2 = bordersize 0, floating:0, onworkspace:w[tv1] +# windowrulev2 = rounding 0, floating:0, onworkspace:w[tv1] +# windowrulev2 = bordersize 0, floating:0, onworkspace:f[1] +# windowrulev2 = rounding 0, floating:0, onworkspace:f[1] + +# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more +dwindle { + pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below + preserve_split = true # You probably want this +} + +# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more +master { + new_status = master +} + +# https://wiki.hyprland.org/Configuring/Variables/#misc +misc { + force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers + disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :( +} + + +############# +### INPUT ### +############# + +# https://wiki.hyprland.org/Configuring/Variables/#input +input { + kb_layout = gb + kb_variant = + kb_model = + kb_options = + kb_rules = + + follow_mouse = 1 + + sensitivity = 0 # -1.0 - 1.0, 0 means no modification. + + touchpad { + natural_scroll = true + } +} + +# https://wiki.hyprland.org/Configuring/Variables/#gestures +gestures { + workspace_swipe = true +} + +# Example per-device config +# See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more +device { + name = epic-mouse-v1 + sensitivity = -0.5 +} + + +################### +### KEYBINDINGS ### +################### + +# See https://wiki.hyprland.org/Configuring/Keywords/ +$mainMod = SUPER # Sets "Windows" key as main modifier + +# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more +bind = $mainMod, Q, exec, $terminal +bind = Control_L&Shift_L, Q, killactive +bind = $mainMod, L, exec, hyprlock +bind = alt&$mainMod, L, exit +bind = $mainMod, F, exec, $fileManager +bind = $mainMod&Shift_L, V, togglefloating, +bind = $mainMod, R, exec, $menu +bind = alt, space, exec, $menu +bind = $mainMod, P, pseudo, # dwindle +bind = $mainMod, J, togglesplit, # dwindle +bind = Control_L&Shift_L, F, fullscreen + +# Move focus with mainMod + arrow keys +bind = $mainMod, left, movefocus, l +bind = $mainMod, right, movefocus, r +bind = $mainMod, up, movefocus, u +bind = $mainMod, down, movefocus, d + +# Workspaces +bind = $mainMod&Control_L, right, workspace, +1 +bind = $mainMod&Control_L, left, workspace, -1 + +# Move active window to a workspace +bind = $mainMod&Control_L&Shift_L, right, movetoworkspace, +1 +bind = $mainMod&Control_L&Shift_L, left, movetoworkspace, -1 + +# Example special workspace (scratchpad) +bind = $mainMod, S, togglespecialworkspace, magic +bind = $mainMod SHIFT, S, movetoworkspace, special:magic + +# Scroll through existing workspaces with mainMod + scroll +bind = $mainMod, mouse_down, workspace, e+1 +bind = $mainMod, mouse_up, workspace, e-1 + +# Move/resize windows with mainMod + LMB/RMB and dragging +bindm = $mainMod, mouse:272, movewindow +bindm = $mainMod, mouse:273, resizewindow + +# Laptop multimedia keys for volume and LCD brightness +bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ +bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- +bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle +bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle +bindel = ,XF86MonBrightnessUp, exec, brightnessctl s 10%+ +bindel = ,XF86MonBrightnessDown, exec, brightnessctl s 10%- + +# Requires playerctl +bindl = , XF86AudioNext, exec, playerctl next +bindl = , XF86AudioPause, exec, playerctl play-pause +bindl = , XF86AudioPlay, exec, playerctl play-pause +bindl = , XF86AudioPrev, exec, playerctl previous + +bindl=,switch:Lid Switch, exec, hyprlock +bind = SUPER, V, exec, cliphist list | rofi -dmenu | cliphist decode | wl-copy +bind = , PRINT, exec, hyprshot -m region --clipboard-only +bind = $shiftMod, PRINT, exec, hyprshot -m region + +############################## +### WINDOWS AND WORKSPACES ### +############################## + +# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more +# See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules + +# Example windowrule v1 +# windowrule = float, ^(kitty)$ + +# Example windowrule v2 +# windowrulev2 = float,class:^(kitty)$,title:^(kitty)$ + +# Ignore maximize requests from apps. You'll probably like this. +windowrulev2 = suppressevent maximize, class:.* + +# Fix some dragging issues with XWayland +windowrulev2 = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0 diff --git a/hypr/hyprland.conf.save b/hypr/hyprland.conf.save new file mode 100644 index 0000000..e34cf62 --- /dev/null +++ b/hypr/hyprland.conf.save @@ -0,0 +1,284 @@ + +# This is an example Hyprland config file. +# Refer to the wiki for more information. +# https://wiki.hyprland.org/Configuring/ + +# Please note not all available settings / options are set here. +# For a full list, see the wiki + +# You can split this configuration into multiple files +# Create your files separately and then link them to this file like this: +# source = ~/.config/hypr/myColors.conf + + +################ +### MONITORS ### +################ + +# See https://wiki.hyprland.org/Configuring/Monitors/ +monitor= eDP-1, 2256x1504@60, 0x0, 1 + + +################### +### MY PROGRAMS ### +################### + +# See https://wiki.hyprland.org/Configuring/Keywords/ + +# Set programs that you use +$terminal = cool-retro-term +$fileManager = dolphin +$menu = rofi -show drun + + +################# +### AUTOSTART ### +################# + +# Autostart necessary processes (like notifications daemons, status bars, etc.) +# Or execute your favorite apps at launch like this: + +# exec-once = $terminal +# exec-once = nm-applet & +exec-once = waybar & hyprpaper & nm-applet +exec-once = dbus-update-activation-environment --systemd --all +exec-once = kdeconnect-indicator +exec-once = hypridle + +############################# +### ENVIRONMENT VARIABLES ### +############################# + +# See https://wiki.hyprland.org/Configuring/Environment-variables/ + +env = XCURSOR_SIZE,24 +env = HYPRCURSOR_SIZE,24 +env = XDG_SESSION_TYPE,wayland +env = QT_QPA_PLATFORMTHEME,qt6ct +env = QT_QPA_PLATFORM,wayland +env = GTK_THEME, Adwaita:dark + +##################### +### LOOK AND FEEL ### +##################### + +# Refer to https://wiki.hyprland.org/Configuring/Variables/ + +# https://wiki.hyprland.org/Configuring/Variables/#general +general { + gaps_in = 5 + gaps_out = 20 + + border_size = 2 + + # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors + col.active_border = rgba(463155ff) + col.inactive_border = rgba(251b31aa) + + # Set to true enable resizing windows by clicking and dragging on borders and gaps + resize_on_border = false + + # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on + allow_tearing = false + + layout = dwindle +} + +# https://wiki.hyprland.org/Configuring/Variables/#decoration +decoration { + rounding = 10 + rounding_power = 2 + + # Change transparency of focused and unfocused windows + active_opacity = 1.0 + inactive_opacity = 1.0 + + shadow { + enabled = true + range = 4 + render_power = 3 + color = rgba(1a1a1aee) + } + + # https://wiki.hyprland.org/Configuring/Variables/#blur + blur { + enabled = true + size = 3 + passes = 1 + + vibrancy = 0.1696 + } +} + +# https://wiki.hyprland.org/Configuring/Variables/#animations +animations { + enabled = yes, please :) + + # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more + + bezier = easeOutQuint,0.23,1,0.32,1 + bezier = easeInOutCubic,0.65,0.05,0.36,1 + bezier = linear,0,0,1,1 + bezier = almostLinear,0.5,0.5,0.75,1.0 + bezier = quick,0.15,0,0.1,1 + + animation = global, 1, 10, default + animation = border, 1, 5.39, easeOutQuint + animation = windows, 1, 4.79, easeOutQuint + animation = windowsIn, 1, 4.1, easeOutQuint, popin 87% + animation = windowsOut, 1, 1.49, linear, popin 87% + animation = fadeIn, 1, 1.73, almostLinear + animation = fadeOut, 1, 1.46, almostLinear + animation = fade, 1, 3.03, quick + animation = layers, 1, 3.81, easeOutQuint + animation = layersIn, 1, 4, easeOutQuint, fade + animation = layersOut, 1, 1.5, linear, fade + animation = fadeLayersIn, 1, 1.79, almostLinear + animation = fadeLayersOut, 1, 1.39, almostLinear + animation = workspaces, 1, 1.94, almostLinear, fade + animation = workspacesIn, 1, 1.21, almostLinear, fade + animation = workspacesOut, 1, 1.94, almostLinear, fade +} + +# Ref https://wiki.hyprland.org/Configuring/Workspace-Rules/ +# "Smart gaps" / "No gaps when only" +# uncomment all if you wish to use that. +# workspace = w[tv1], gapsout:0, gapsin:0 +# workspace = f[1], gapsout:0, gapsin:0 +# windowrulev2 = bordersize 0, floating:0, onworkspace:w[tv1] +# windowrulev2 = rounding 0, floating:0, onworkspace:w[tv1] +# windowrulev2 = bordersize 0, floating:0, onworkspace:f[1] +# windowrulev2 = rounding 0, floating:0, onworkspace:f[1] + +# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more +dwindle { + pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below + preserve_split = true # You probably want this +} + +# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more +master { + new_status = master +} + +# https://wiki.hyprland.org/Configuring/Variables/#misc +misc { + force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers + disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :( +} + + +############# +### INPUT ### +############# + +# https://wiki.hyprland.org/Configuring/Variables/#input +input { + kb_layout = gb + kb_variant = + kb_model = + kb_options = + kb_rules = + + follow_mouse = 1 + + sensitivity = 0 # -1.0 - 1.0, 0 means no modification. + + touchpad { + natural_scroll = true + } +} + +# https://wiki.hyprland.org/Configuring/Variables/#gestures +gestures { + workspace_swipe = true +} + +# Example per-device config +# See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more +device { + name = epic-mouse-v1 + sensitivity = -0.5 +} + + +################### +### KEYBINDINGS ### +################### + +# See https://wiki.hyprland.org/Configuring/Keywords/ +$mainMod = SUPER # Sets "Windows" key as main modifier + +# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more +bind = $mainMod, Q, exec, $terminal +bind = Control_L&Shift_L, Q, killactive +bind = $mainMod, L, exec, hyprlock +bind = alt&$mainMod, L, exit +bind = $mainMod, F, exec, $fileManager +bind = $mainMod, V, togglefloating, +bind = $mainMod, R, exec, $menu +bind = alt, space, exec, $menu +bind = $mainMod, P, pseudo, # dwindle +bind = $mainMod, J, togglesplit, # dwindle +bind = Control_L&Shift_L, F, fullscreen + +# Move focus with mainMod + arrow keys +bind = $mainMod, left, movefocus, l +bind = $mainMod, right, movefocus, r +bind = $mainMod, up, movefocus, u +bind = $mainMod, down, movefocus, d + +# Workspaces +bind = $mainMod&Control_L, right, workspace, +1 +bind = $mainMod&Control_L, left, workspace, -1 + +# Move active window to a workspace +bind = $mainMod&Control_L&Shift_L, right, movetoworkspace, +1 +bind = $mainMod&Control_L&Shift_L, left, movetoworkspace, -1 + +# Example special workspace (scratchpad) +bind = $mainMod, S, togglespecialworkspace, magic +bind = $mainMod SHIFT, S, movetoworkspace, special:magic + +# Scroll through existing workspaces with mainMod + scroll +bind = $mainMod, mouse_down, workspace, e+1 +bind = $mainMod, mouse_up, workspace, e-1 + +# Move/resize windows with mainMod + LMB/RMB and dragging +bindm = $mainMod, mouse:272, movewindow +bindm = $mainMod, mouse:273, resizewindow + +# Laptop multimedia keys for volume and LCD brightness +bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ +bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- +bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle +bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle +bindel = ,XF86MonBrightnessUp, exec, brightnessctl s 10%+ +bindel = ,XF86MonBrightnessDown, exec, brightnessctl s 10%- + +# Requires playerctl +bindl = , XF86AudioNext, exec, playerctl next +bindl = , XF86AudioPause, exec, playerctl play-pause +bindl = , XF86AudioPlay, exec, playerctl play-pause +bindl = , XF86AudioPrev, exec, playerctl previous + +bindl=,switch:Lid Switch, exec, hyprlock + +############################## +### WINDOWS AND WORKSPACES ### +############################## + +# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more +# See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules + +# Example windowrule v1 +# windowrule = float, ^(kitty)$ + +# Example windowrule v2 +# windowrulev2 = float,class:^(kitty)$,title:^(kitty)$ + +# Ignore maximize requests from apps. You'll probably like this. +windowrulev2 = suppressevent maximize, class:.* + +# Fix some dragging issues with XWayland +windowrulev2 = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0 diff --git a/hypr/hyprlock.conf b/hypr/hyprlock.conf new file mode 100644 index 0000000..4aa238e --- /dev/null +++ b/hypr/hyprlock.conf @@ -0,0 +1,69 @@ +# BACKGROUND +background { + monitor = + path = /home/alfie/Pictures/other/wallpaper/puro_de.png + #color = $background + blur_passes = 2 + contrast = 1 + brightness = 0.5 + vibrancy = 0.2 + vibrancy_darkness = 0.2 +} + +# GENERAL +general { + no_fade_in = true + no_fade_out = true + hide_cursor = false + grace = 0 + disable_loading_bar = true +} + +# INPUT FIELD +input-field { + monitor = + size = 250, 60 + outline_thickness = 2 + dots_size = 0.2 # Scale of input-field height, 0.2 - 0.8 + dots_spacing = 0.35 # Scale of dots' absolute size, 0.0 - 1.0 + dots_center = true + outer_color = rgba(0, 0, 0, 0) + inner_color = rgba(0, 0, 0, 0.2) + font_color = rgba(142, 243, 244, 0.75) + fade_on_empty = false + rounding = -1 + check_color = rgb(204, 136, 34) + placeholder_text = Input Password... + hide_input = false + position = 0, -200 + halign = center + valign = center +} + +# DATE +label { + monitor = + text = cmd[update:1000] echo "$(date +"%A, %B %d")" + color = rgba(242, 243, 244, 0.75) + font_size = 22 + font_family = JetBrains Mono + position = 0, 300 + halign = center + valign = center +} + +# TIME +label { + monitor = + text = cmd[update:1000] echo "$(date +"%-I:%M")" + color = rgba(242, 243, 244, 0.75) + font_size = 95 + font_family = JetBrains Mono Extrabold + position = 0, 200 + halign = center + valign = center +} + +auth { + fingerprint:enabled = true +} diff --git a/hypr/hyprpaper.conf b/hypr/hyprpaper.conf new file mode 100644 index 0000000..39b465a --- /dev/null +++ b/hypr/hyprpaper.conf @@ -0,0 +1,3 @@ +preload = /home/alfie/Pictures/other/wallpaper/puro_de.png +wallpaper = , /home/alfie/Pictures/other/wallpaper/puro_de.png + diff --git a/waybar/animation.css b/waybar/animation.css new file mode 100644 index 0000000..0384233 --- /dev/null +++ b/waybar/animation.css @@ -0,0 +1,216 @@ +/* <<--< PHASE 1 >-->> */ + +#custom-ws { + color: transparent; + text-shadow: none; + animation: module_in 0.25s ease-in 0.5s forwards; +} + +#custom-distro { + color: transparent; + font-size: 0; + text-shadow: none; + animation: distro_expand 0.25s ease-in 0.25s forwards, + distro_in 0.25s ease-in 0.5s forwards; +} + +#custom-power { + font-size: 0; + text-shadow: none; + animation: power_expand 0.25s ease-in 0.25s forwards, + power_in 0.25s ease-in 0.5s forwards; +} + +/* <<--< PHASE 2 >-->> */ + +#workspaces label { + opacity: 0; + animation: hoverable_in 0.25s ease-in 1s forwards; +} + +#cpu, +#clock.time, +#idle_inhibitor, +#battery, +#battery.warning, +#battery.critical, +#battery.charging { + font-size: 0; + text-shadow: none; + animation: module_expand 0.25s ease-in 0.75s forwards, + module_in 0.25s ease-in 1s forwards; +} + +#cpu { + animation: module_expand 0.25s ease-in 0.75s forwards, + module_in 0.25s ease-in 1s forwards; +} + +#clock.time { + animation: module_expand 0.25s ease-in 0.75s forwards, + module_in 0.25s ease-in 1s forwards; +} + +#idle_inhibitor { + animation: module_expand 0.25s ease-in 0.75s forwards, + hoverable_in 0.25s ease-in 1s forwards; +} + +#battery { + animation: module_expand 0.25s ease-in 0.75s forwards, + battery_in 0.25s ease-in 1s forwards; +} + +#battery.warning { + animation: module_expand 0.25s ease-in 0.75s forwards, + state_warning_in 0.25s ease-in 1s forwards; +} + +#battery.critical { + animation: module_expand 0.25s ease-in 0.75s forwards, + state_critical_in 0.25s ease-in 1s forwards; +} + +#battery.charging { + animation: module_expand 0.25s ease-in 0.75s forwards, + state_charging_in 0.25s ease-in 1s forwards; +} + +/* <<--< PHASE 3 >-->> */ + +#memory, +#backlight { + color: transparent; + font-size: 0; + text-shadow: none; + animation: module_expand 0.25s ease-in 1.15s forwards, + module_in 0.25s ease-in 1.4s forwards; +} + +#memory.warning { + color: transparent; + font-size: 0; + text-shadow: none; + animation: module_expand 0.25s ease-in 1.15s forwards, + state_warning_in 0.25s ease-in 1.4s forwards; +} + +#memory.critical { + color: transparent; + font-size: 0; + text-shadow: none; + animation: module_expand 0.25s ease-in 1.15s forwards, + state_critical_in 0.25s ease-in 1.4s forwards; +} + +#clock.date { + font-size: 0; + animation: module_expand 0.25s ease-in 1.15s forwards, + hoverable_in 0.25s ease-in 1.4s forwards; +} + +/* <<--< PHASE 4 >-->> */ + +#window, +#custom-media { + opacity: 0; + animation: hoverable_in 0.25s ease-in 1.75s forwards; +} + +#custom-cpuinfo, +#custom-wifi, +#bluetooth, +#custom-update, +#pulseaudio { + font-size: 0; + animation: module_expand 0.25s ease-in 1.5s forwards, + hoverable_in 0.25s ease-in 1.75s forwards; +} + +/* <<--< KEYFRAMES >-->> */ + +/* <<--< distro icon >-->> */ + +@keyframes distro_expand { + to { + font-size: 14.6px; + } +} + +@keyframes distro_in { + to { + color: @distro-fg; + text-shadow: 0 0 1.5px rgba(0, 0, 0, 1); + } +} + +/* <<--< power button >-->> */ + +@keyframes power_expand { + to { + font-size: 10px; + } +} + +@keyframes power_in { + to { + text-shadow: 0 0 2px rgba(0, 0, 0, 0.6); + } +} + +/* <<--< modules >-->> */ + +@keyframes module_expand { + to { + font-size: 10px; + } +} + +@keyframes module_in { + to { + color: @module-fg; + text-shadow: 0 0 2px rgba(0, 0, 0, 0.6); + } +} + +/* <<--< FIXES >-->> */ + +/* <<--< hoverables >-->> */ + +@keyframes hoverable_in { + to { + opacity: 1; + } +} + +/* <<--< battery >-->> */ + +@keyframes battery_in { + to { + color: @module-fg; + text-shadow: 0 0 2px rgba(0, 0, 0, 0.6); + } +} + +/* <<--< states >-->> */ + +@keyframes state_warning_in { + to { + color: @warning; + text-shadow: 0 0 2px rgba(0, 0, 0, 0.6); + } +} + +@keyframes state_critical_in { + to { + color: @critical; + text-shadow: 0 0 2px rgba(0, 0, 0, 0.6); + } +} + +@keyframes state_charging_in { + to { + color: @charging; + text-shadow: 0 0 2px rgba(0, 0, 0, 0.6); + } +} diff --git a/waybar/config.jsonc b/waybar/config.jsonc new file mode 100644 index 0000000..641f02b --- /dev/null +++ b/waybar/config.jsonc @@ -0,0 +1,522 @@ +{ + "layer": "top", + "position": "top", + "mode": "dock", + "reload_style_on_change": true, + "gtk-layer-shell": true, + + // === Positions === + + "modules-left": [ + "custom/ws", // window icon + "custom/left1", + + "hyprland/workspaces", // workspaces + "custom/right1", + + "custom/paddw", + "hyprland/window" // window title + ], + + "modules-center": [ + "custom/paddc", + "custom/left2", + "custom/cpuinfo", // temperature + + "custom/left3", + "memory", // memory + + "custom/left4", + // "custom/cpu", // cpu + "cpu", // cpu + "custom/leftin1", + + "custom/left5", + "custom/distro", // distro icon + "custom/right2", + + "custom/rightin1", + "idle_inhibitor", // idle inhibitor + "clock#time", // time + "custom/right3", + + "clock#date", // date + "custom/right4", + + "custom/wifi", // wi-fi + "bluetooth", // bluetooth + "custom/update", // system update + "custom/right5" + ], + + "modules-right": [ + "custom/media", // media info + + "tray", + + "custom/left6", + "pulseaudio", // output device + + "custom/left7", + // "custom/backlight", // brightness + "backlight", // brightness + + "custom/left8", + "battery", // battery + + "custom/leftin2", + "custom/power" // power button + ], + + // === Modules === + + "tray": { + "icon-size": 12, + "spacing": 10, + }, + + "custom/ws": { + "format": "  ", + "tooltip": false, + "min-length": 3, + "max-length": 3 + }, + + "hyprland/workspaces": { + "on-scroll-up": "hyprctl dispatch workspace -1", + "on-scroll-down": "hyprctl dispatch workspace +1", + "persistent-workspaces": { + "1": [], + "2": [], + "3": [], + "4": [], + "5": [] + } + }, + + "hyprland/window": { + "format": "{}", + "min-length": 5, + + // === Window Titles === + + "rewrite": { + // == Desktop == + + "": + " Hyprland", + + // == Terminal == + + "~": " Terminal", + "zsh": " Terminal", + "kitty": " Terminal", + "sejjy@archlinux:(.*)": " Terminal", + "(.*)sejjy@archlinux:~": " Terminal", + + // == Browser == + + "(.*)Mozilla Firefox": + "󰈹 Firefox", + "(.*) — Mozilla Firefox": + "󰈹 $1", + + "(.*)Zen Browser": + "󰈹 Zen Browser", + "(.*) — Zen Browser": + "󰈹 $1", + + // == Development == + + "(.*) - Visual Studio Code": + "󰨞 $1", + "(.*)Visual Studio Code": + "󰨞 Visual Studio Code", + + "nvim": + " Neovim", + "nvim (.*)": + " $1", + + "vim": + " Vim", + "vim (.*)": + " $1", + + "Godot": + " Godot Engine", + "Godot Engine - (.*)": + " $1", + "(.*) - Godot Engine": + " $1", + + // == Media == + + "(.*)Spotify": + " Spotify", + "(.*)Spotify Premium": + " Spotify Premium", + + "OBS(.*)": + "󰐌 OBS Studio", + + "VLC media player": + "󰕼 VLC Media Player", + "(.*) - VLC media player": + "󰕼 $1", + + "(.*) - mpv": + " $1", + + "GNU Image Manipulation Program": + " GNU Image Manipulation Program", + + "qView": " qView", + + "(.*).jpg": " $1.jpg", + "(.*).png": " $1.png", + "(.*).svg": " $1.svg", + + // == Social == + + "vesktop": + " Discord", + + "• Discord(.*)": "Discord$1", + "(.*)Discord(.*)": + " $1Discord$2", + + // == Documents == + + "ONLYOFFICE Desktop Editors": + " OnlyOffice Desktop", + + "(.*).docx": + " $1.docx", + "(.*).xlsx": + " $1.xlsx", + "(.*).pptx": + " $1.pptx", + "(.*).pdf": + " $1.pdf", + + "/": " File Manager", + + // == System == + + "Timeshift-gtk": + " Timeshift", + + "Authenticate": " Authenticate" + } + }, + + "custom/cpuinfo": { + "exec": "~/.config/waybar/scripts/cpu-temp.sh", + "return-type": "json", + "format": "{}", + "tooltip": true, + "interval": 5, + "min-length": 8, + "max-length": 8 + }, + + "memory": { + "states": { + "warning": 75, + "critical": 90 + }, + + "format": "󰘚 {percentage}%", + "format-critical": "󰀦 {percentage}%", + "tooltip": true, + "tooltip-format": "Memory Used: {used:0.1f} GB / {total:0.1f} GB", + "interval": 5, + "min-length": 7, + "max-length": 7 + }, + + // "custom/cpu": { + // "exec": "~/.config/waybar/scripts/cpu-usage.sh", + // "return-type": "json", + // "tooltip": true, + // "interval": 5, + // "min-length": 6, + // "max-length": 6 + // }, + + "cpu": { + "format": "󰻠 {usage}%", + "tooltip": false, + "interval": 5, + "min-length": 6, + "max-length": 6 + }, + + "custom/distro": { + "format": " ", + "tooltip": false + }, + + "idle_inhibitor": { + "format": "{icon}", + + "format-icons": { + "activated": "󱑎 ", + "deactivated": "󱑂 " + }, + + "tooltip": true, + "tooltip-format-activated": "Presentation Mode", + "tooltip-format-deactivated": "Idle Mode", + "start-activated": false + }, + + "clock#time": { + "format": "{:%H:%M}", + "tooltip": true, + "tooltip-format": "Standard Time: {:%I:%M %p}", + "min-length": 6, + "max-length": 6 + }, + + "clock#date": { + "format": "󰨳 {:%m-%d}", + "tooltip-format": "{calendar}", + + "calendar": { + "mode": "month", + "mode-mon-col": 6, + "on-click-right": "mode", + + "format": { + "months": + "{}", + "weekdays": + "{}", + "today": + "{}" + } + }, + + "actions": { + "on-click": "mode", + "on-click-right": "mode" + }, + + "min-length": 8, + "max-length": 8 + }, + + "custom/wifi": { + "exec": "~/.config/waybar/scripts/wifi-status.sh", + "return-type": "json", + "format": "{}", + "tooltip": true, + "on-click": "~/.config/waybar/scripts/wifi-menu.sh", + "on-click-right": "kitty --title '󰤨 Network Manager TUI' bash -c nmtui", + "interval": 1, + "min-length": 1, + "max-length": 1 + }, + + "bluetooth": { + "format": "󰂰", + "format-disabled": "󰂲", + "format-connected": "󰂱", + "format-connected-battery": "󰂱", + + "tooltip-format": + "{num_connections} connected", + "tooltip-format-disabled": + "Bluetooth Disabled", + "tooltip-format-connected": + "{num_connections} connected\n{device_enumerate}", + "tooltip-format-enumerate-connected": + "{device_alias}", + "tooltip-format-enumerate-connected-battery": + "{device_alias}: {device_battery_percentage}%", + + "on-click": "~/.config/waybar/scripts/bluetooth-menu.sh", + "on-click-right": "kitty --title '󰂯 Bluetooth TUI' bash -c bluetui", + "interval": 1, + "min-length": 1, + "max-length": 1 + }, + + "custom/update": { + "exec": "~/.config/waybar/scripts/system-update.sh", + "return-type": "json", + "format": "{}", + "on-click": "hyprctl dispatch exec '~/.config/waybar/scripts/system-update.sh up'", + "interval": 30, + "tooltip": true, + "min-length": 1, + "max-length": 1 + }, + + "custom/media": { + "exec": "~/.config/waybar/scripts/media-player.py", + "return-type": "json", + "format": "{}", + "tooltip": "{tooltip}", + "on-click": "playerctl play-pause", + "min-length": 5, + "max-length": 35 + }, + + "pulseaudio": { + "format": "{icon} {volume}%", + "format-muted": "󰝟 {volume}%", + + "format-icons": { + "default": ["󰕿", "󰖀", "󰕾"], + "headphone": "󰋋", + "headset": "󰋋" + }, + + "tooltip": true, + "tooltip-format": "Device: {desc}", + "on-click": "~/.config/waybar/scripts/volume-control.sh -o m", + "on-scroll-up": "~/.config/waybar/scripts/volume-control.sh -o i", + "on-scroll-down": "~/.config/waybar/scripts/volume-control.sh -o d", + "min-length": 6, + "max-length": 6 + }, + + // "custom/backlight": { + // "exec": "~/.config/waybar/scripts/brightness-control.sh", + // "return-type": "json", + // "format": "{}", + // "tooltip": true, + // "on-scroll-up": "~/.config/waybar/scripts/brightness-control.sh -o i", + // "on-scroll-down": "~/.config/waybar/scripts/brightness-control.sh -o d", + // "interval": 1, + // "min-length": 6, + // "max-length": 6 + // }, + + "backlight": { + "format": "{icon} {percent}%", + "format-icons": ["", "", "", "", "", "", "", "", ""], + "tooltip": false, + "on-scroll-up": "brightnessctl set 2%+", + "on-scroll-down": "brightnessctl set 2%-", + "min-length": 6, + "max-length": 6 + }, + + "battery": { + "states": { + "warning": 30, + "critical": 15 + }, + + "format": "{icon} {capacity}%", + "format-icons": ["󰁼", "󰁽", "󰁾", "󰁿", "󰂀", "󰂁", "󰂂"], + "format-warning": "󰁻 {capacity}%", + "format-critical": "󱃍 {capacity}%", + "format-charging": "󱘖 {capacity}%", + + "tooltip-format": "Discharging: {time}", + "tooltip-format-charging": "Charging: {time}", + "interval": 1, + "min-length": 6, + "max-length": 6 + }, + + "custom/power": { + "format": " ", + "tooltip": true, + "tooltip-format": "Power Menu", + "on-click": "~/.config/waybar/scripts/power-menu.sh" + }, + + // === Padding === + + "custom/paddw": { + "format": " ", + "tooltip": false + }, + + "custom/paddc": { + "format": " ", + "tooltip": false + }, + + // == Left Arrows == + + "custom/left1": { + "format": "", + "tooltip": false + }, + "custom/left2": { + "format": "", + "tooltip": false + }, + "custom/left3": { + "format": "", + "tooltip": false + }, + "custom/left4": { + "format": "", + "tooltip": false + }, + "custom/left5": { + "format": "", + "tooltip": false + }, + "custom/left6": { + "format": "", + "tooltip": false + }, + "custom/left7": { + "format": "", + "tooltip": false + }, + "custom/left8": { + "format": "", + "tooltip": false + }, + + // == Right Arrows == + + "custom/right1": { + "format": "", + "tooltip": false + }, + "custom/right2": { + "format": "", + "tooltip": false + }, + "custom/right3": { + "format": "", + "tooltip": false + }, + "custom/right4": { + "format": "", + "tooltip": false + }, + "custom/right5": { + "format": "", + "tooltip": false + }, + + // == Left Inverse == + + "custom/leftin1": { + "format": "", + "tooltip": false + }, + "custom/leftin2": { + "format": "", + "tooltip": false + }, + + // == Right Inverse == + + "custom/rightin1": { + "format": "", + "tooltip": false + } +} diff --git a/waybar/scripts/bluetooth-menu.sh b/waybar/scripts/bluetooth-menu.sh new file mode 100755 index 0000000..957f896 --- /dev/null +++ b/waybar/scripts/bluetooth-menu.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash + +# Author: Jesse Mirabel (@sejjy) +# GitHub: https://github.com/sejjy/mechabar + +# Rofi config +config="$HOME/.config/rofi/bluetooth-menu.rasi" + +# Rofi window override +override_disabled="mainbox { children: [ listview ]; } listview { lines: 1; padding: 6px; }" + +get_device_icon() { + local device_mac=$1 + device_info=$(bluetoothctl info "$device_mac") + device_icon=$(echo "$device_info" | grep "Icon:" | awk '{print $2}') + + case "$device_icon" in + "audio-headphones" | "audio-headset") echo "󰋋 " ;; # Headphones + "video-display" | "computer") echo "󰍹 " ;; # Monitor + "audio-input-microphone") echo "󰍬 " ;; # Microphone + "input-keyboard") echo "󰌌 " ;; # Keyboard + "audio-speakers") echo "󰓃 " ;; # Speakers + "input-mouse") echo "󰍽 " ;; # Mouse + "phone") echo "󰏲 " ;; # Phone + *) + echo "󰂱 " # Default + ;; + esac +} + +while true; do + # Get list of paired devices + bluetooth_devices=$(bluetoothctl devices | while read -r line; do + device_mac=$(echo "$line" | awk '{print $2}') + device_name=$(echo "$line" | awk '{$1=$2=""; print substr($0, 3)}') + icon=$(get_device_icon "$device_mac") + echo "$icon $device_name" + done) + + options=$( + echo "Scan for devices  " + echo "Disable Bluetooth" + echo "$bluetooth_devices" + ) + option="Enable Bluetooth" + + # Get Bluetooth status + bluetooth_status=$(bluetoothctl show | grep "Powered:" | awk '{print $2}') + + if [[ "$bluetooth_status" == "yes" ]]; then + selected_option=$(echo -e "$options" | rofi -dmenu -i -selected-row 1 -config "${config}" -p " " || pkill -x rofi) + else + selected_option=$(echo -e "$option" | rofi -dmenu -i -selected-row 1 -config "${config}" -theme-str "${override_disabled}" -p " " || pkill -x rofi) + fi + + # Exit if no option is selected + if [ -z "$selected_option" ]; then + exit + fi + + # Actions based on selected option + case "$selected_option" in + "Enable Bluetooth") + notify-send "Bluetooth Enabled" + rfkill unblock bluetooth + bluetoothctl power on + sleep 1 + ;; + "Disable Bluetooth") + notify-send "Bluetooth Disabled" + rfkill block bluetooth + bluetoothctl power off + exit + ;; + "Scan for devices"*) + notify-send "Press '?' to show help." + kitty --title '󰂱 Bluetooth TUI' bash -c "bluetui" # Launch bluetui + ;; + *) + # Extract device name + device_name="${selected_option#* }" + device_name="${device_name## }" + + if [[ -n "$device_name" ]]; then + # Get MAC address + device_mac=$(bluetoothctl devices | grep "$device_name" | awk '{print $2}') + + # Trust and pair device + bluetoothctl trust "$device_mac" >/dev/null 2>&1 + bluetoothctl pair "$device_mac" >/dev/null 2>&1 + + # Connect to device + bluetoothctl connect "$device_mac" & + sleep 3 + connection_status=$(bluetoothctl info "$device_mac" | grep "Connected:" | awk '{print $2}') + + if [[ "$connection_status" == "yes" ]]; then + notify-send "Connected to \"$device_name\"." + else + notify-send "Failed to connect to \"$device_name\"." + fi + fi + ;; + esac +done diff --git a/waybar/scripts/brightness-control.sh b/waybar/scripts/brightness-control.sh new file mode 100755 index 0000000..1a8b6fe --- /dev/null +++ b/waybar/scripts/brightness-control.sh @@ -0,0 +1,92 @@ +#!/usr/bin/env bash + +# Print error message for invalid arguments +print_error() { + cat <<"EOF" +Usage: ./brightnesscontrol.sh +Valid actions are: + i -- ncrease brightness [+2%] + d -- ecrease brightness [-2%] +EOF +} + +# Send a notification with brightness info +send_notification() { + brightness=$(brightnessctl info | grep -oP "(?<=\()\d+(?=%)") + notify-send -r 91190 "Brightness: ${brightness}%" +} + +# Get the current brightness percentage and device name +get_brightness() { + brightness=$(brightnessctl -m | grep -o '[0-9]\+%' | head -c-2) + device=$(brightnessctl -m | head -n 1 | awk -F',' '{print $1}' | sed 's/_/ /g; s/\<./\U&/g') # Get device name + current_brightness=$(brightnessctl -m | head -n 1 | awk -F',' '{print $3}') # Get current brightness + max_brightness=$(brightnessctl -m | head -n 1 | awk -F',' '{print $5}') # Get max brightness +} +get_brightness + +# Handle options +while getopts o: opt; do + case "${opt}" in + o) + case $OPTARG in + i) # Increase brightness + if [[ $brightness -lt 10 ]]; then + brightnessctl set +1% + else + brightnessctl set +2% + fi + send_notification + ;; + d) # Decrease brightness + if [[ $brightness -le 1 ]]; then + brightnessctl set 1% + elif [[ $brightness -le 10 ]]; then + brightnessctl set 1%- + else + brightnessctl set 2%- + fi + send_notification + ;; + *) + print_error + ;; + esac + ;; + *) + print_error + ;; + esac +done + +# Determine the icon based on brightness level +get_icon() { + if ((brightness <= 5)); then + icon="" + elif ((brightness <= 15)); then + icon="" + elif ((brightness <= 30)); then + icon="" + elif ((brightness <= 45)); then + icon="" + elif ((brightness <= 55)); then + icon="" + elif ((brightness <= 65)); then + icon="" + elif ((brightness <= 80)); then + icon="" + elif ((brightness <= 95)); then + icon="" + else + icon="" + fi +} + +# Backlight module and tooltip +get_icon +module="${icon} ${brightness}%" + +tooltip="Device Name: ${device}" +tooltip+="\nBrightness: ${current_brightness} / ${max_brightness}" + +echo "{\"text\": \"${module}\", \"tooltip\": \"${tooltip}\"}" diff --git a/waybar/scripts/cpu-temp.sh b/waybar/scripts/cpu-temp.sh new file mode 100755 index 0000000..17afd40 --- /dev/null +++ b/waybar/scripts/cpu-temp.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash + +model=$(awk -F ': ' '/model name/{print $2}' /proc/cpuinfo | head -n 1 | sed 's/@.*//; s/ *\((R)\|(TM)\)//g; s/^[ \t]*//; s/[ \t]*$//') + +# Get CPU clock speeds +get_cpu_frequency() { + freqlist=$(awk '/cpu MHz/ {print $4}' /proc/cpuinfo) + maxfreq=$(sed 's/...$//' /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq) + average_freq=$(echo "$freqlist" | tr ' ' '\n' | awk "{sum+=\$1} END {printf \"%.0f/%s MHz\", sum/NR, $maxfreq}") + echo "$average_freq" +} + +# Get CPU temperature +get_cpu_temperature() { + temp=$(sensors | awk '/Package id 0/ {print $4}' | awk -F '[+.]' '{print $2}') + if [[ -z "$temp" ]]; then + temp=$(sensors | awk '/Tctl/ {print $2}' | tr -d '+°C') + fi + if [[ -z "$temp" ]]; then + temp="N/A" + else + temp_f=$(awk "BEGIN {printf \"%.1f\", ($temp * 9 / 5) + 32}") + fi + echo "${temp:-N/A} ${temp_f:-N/A}" +} + +# Get the corresponding icon based on temperature +get_temperature_icon() { + temp_value=$1 + if [ "$temp_value" -ge 80 ]; then + icon="󰸁" # High temperature + elif [ "$temp_value" -ge 70 ]; then + icon="󱃂" # Medium temperature + elif [ "$temp_value" -ge 60 ]; then + icon="󰔏" # Normal temperature + else + icon="󱃃" # Low temperature + fi + echo "$icon" +} + +# Main script execution +cpu_frequency=$(get_cpu_frequency) +read -r temp_info < <(get_cpu_temperature) +temp=$(echo "$temp_info" | awk '{print $1}') # Celsius +temp_f=$(echo "$temp_info" | awk '{print $2}') # Fahrenheit + +# Determine the temperature icon +thermo_icon=$(get_temperature_icon "$temp") + +# Set color based on temperature +if [ "$temp" -ge 80 ]; then + # If temperature is >= 80%, set color to #f38ba8 + text_output="${thermo_icon} ${temp}°C" +else + # Default color + text_output="${thermo_icon} ${temp}°C" +fi + +tooltip="${model}\n" +tooltip+="Clock Speed: ${cpu_frequency}\nTemperature: ${temp_f}°F" + +# Module and tooltip +echo "{\"text\": \"$text_output\", \"tooltip\": \"$tooltip\"}" diff --git a/waybar/scripts/cpu-usage.sh b/waybar/scripts/cpu-usage.sh new file mode 100755 index 0000000..b21e0d3 --- /dev/null +++ b/waybar/scripts/cpu-usage.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +# Get CPU model (removed "(R)", "(TM)", and clock speed) +model=$(awk -F ': ' '/model name/{print $2}' /proc/cpuinfo | head -n 1 | sed 's/@.*//; s/ *\((R)\|(TM)\)//g; s/^[ \t]*//; s/[ \t]*$//') + +# Get CPU usage percentage +load=$(vmstat 1 2 | tail -1 | awk '{print 100 - $15}') + +# Determine CPU state based on usage +if [ "$load" -ge 80 ]; then + state="Critical" +elif [ "$load" -ge 60 ]; then + state="High" +elif [ "$load" -ge 25 ]; then + state="Moderate" +else + state="Low" +fi + +# Set color based on CPU load +if [ "$load" -ge 80 ]; then + # If CPU usage is >= 80%, set color to #f38ba8 + text_output="󰀩 ${load}%" +else + # Default color + text_output="󰻠 ${load}%" +fi + +tooltip="${model}" +tooltip+="\nCPU Usage: ${state}" + +# Module and tooltip +echo "{\"text\": \"$text_output\", \"tooltip\": \"$tooltip\"}" diff --git a/waybar/scripts/media-player.py b/waybar/scripts/media-player.py new file mode 100755 index 0000000..73faf44 --- /dev/null +++ b/waybar/scripts/media-player.py @@ -0,0 +1,203 @@ +#!/usr/bin/env python3 + +import gi +gi.require_version("Playerctl", "2.0") +from gi.repository import Playerctl, GLib +from gi.repository.Playerctl import Player # type: ignore +import argparse +import logging +import sys +import signal +import json +import os +from typing import List + +logger = logging.getLogger(__name__) + +def signal_handler(sig, frame): + # Handle termination signals gracefully. + logger.info("Received signal to stop, exiting") + sys.stdout.write("\n") + sys.stdout.flush() + sys.exit(0) + +class PlayerManager: + def __init__(self, selected_player=None, excluded_players=[]): + self.manager = Playerctl.PlayerManager() + self.loop = GLib.MainLoop() + self.manager.connect("name-appeared", self.on_player_appeared) + self.manager.connect("player-vanished", self.on_player_vanished) + + # Register signal handlers for termination + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + signal.signal(signal.SIGPIPE, signal.SIG_DFL) + + self.selected_player = selected_player + self.excluded_players = excluded_players.split(',') if excluded_players else [] + + self.init_players() + + def init_players(self): + # Initialize players based on selection and exclusion criteria. + for player in self.manager.props.player_names: + if player.name not in self.excluded_players: + if self.selected_player is None or self.selected_player == player.name: + self.init_player(player) + + def run(self): + # Start the GLib main loop. + logger.info("Starting main loop") + self.loop.run() + + def init_player(self, player): + # Initialize a new media player. + logger.info(f"Initialize new player: {player.name}") + player_instance = Playerctl.Player.new_from_name(player) + player_instance.connect("playback-status", self.on_playback_status_changed) + player_instance.connect("metadata", self.on_metadata_changed) + self.manager.manage_player(player_instance) + self.on_metadata_changed(player_instance, player_instance.props.metadata) + + def get_players(self) -> List[Player]: + # Retrieve the list of managed players. + return self.manager.props.players + + def write_output(self, text, player): + # Format and send output for the player status. + logger.debug(f"Writing output: {text}") + + # Determine the tooltip based on playback status + tooltip_status = f"Paused: " if player.props.status != "Playing" else "" + + # Construct tooltip with track info + tooltip = f"{tooltip_status}{text}" + output = { + "text": text, + "class": "custom-" + player.props.player_name, + "alt": player.props.player_name, + "tooltip": tooltip + } + + sys.stdout.write(json.dumps(output) + "\n") + sys.stdout.flush() + + def clear_output(self): + # Clear the output. + sys.stdout.write("\n") + sys.stdout.flush() + + def on_playback_status_changed(self, player, status, _=None): + # Handle changes in playback status. + logger.debug(f"Playback status changed for player {player.props.player_name}: {status}") + self.on_metadata_changed(player, player.props.metadata) + + def get_first_playing_player(self): + # Return the first player that is currently playing. + players = self.get_players() + logger.debug(f"Getting first playing player from {len(players)} players") + + for player in players[::-1]: + if player.props.status == "Playing": + return player + + return players[0] if players else None + + def show_most_important_player(self): + # Display the most relevant player information. + logger.debug("Showing most important player") + current_player = self.get_first_playing_player() + + if current_player is not None: + self.on_metadata_changed(current_player, current_player.props.metadata) + else: + self.clear_output() + + def on_metadata_changed(self, player, metadata, _=None): + logger.debug(f"Metadata changed for player {player.props.player_name}") + player_name = player.props.player_name + artist = player.get_artist() + title = player.get_title() + + # Escape special characters in the title + title = title.replace("&", "&") if title else "Unknown Title" + + track_info = None + if metadata: + try: + # Access track ID safely + track_id_variant = metadata.lookup_value("mpris:trackid", GLib.VariantType("s")) + track_id = track_id_variant.unpack() if track_id_variant else "" + if player_name == "spotify" and ":ad:" in track_id: + track_info = "Advertisement" + except Exception as e: + logger.error(f"Error accessing metadata for player {player_name}: {e}") + + # Fallback to artist and title + if not track_info and artist and title: + track_info = f"{title} - {artist}" + elif not track_info: + track_info = title + + if track_info: + prefix = ( + f"󰓇 " if player.props.status == "Playing" and player_name == "spotify" else + f"󰗃 " if player.props.status == "Playing" and player_name == "firefox" else + f"\u200A󰏤 \u2009\u2009\u200A" + ) + track_info = prefix + track_info + + current_playing = self.get_first_playing_player() + if current_playing is None or current_playing.props.player_name == player.props.player_name: + self.write_output(track_info, player) + + def on_player_appeared(self, _, player): + # Handle new player appearance. + logger.info(f"Player has appeared: {player.name}") + + if player.name not in self.excluded_players: + if self.selected_player is None or player.name == self.selected_player: + self.init_player(player) + + def on_player_vanished(self, _, player): + # Handle player disappearance. + logger.info(f"Player {player.props.player_name} has vanished") + self.show_most_important_player() + +def parse_arguments(): + # Parse command-line arguments. + parser = argparse.ArgumentParser() + parser.add_argument("-v", "--verbose", action="count", default=0) + parser.add_argument("-x", "--exclude", help="Comma-separated list of excluded players") + parser.add_argument("--player", help="Specify player to listen to") + parser.add_argument("--enable-logging", action="store_true", help="Enable logging to a file") + return parser.parse_args() + +def main(): + # Main function to initialize and run the player manager. + arguments = parse_arguments() + + # Initialize logging if enabled + if arguments.enable_logging: + logfile = os.path.join(os.path.dirname(os.path.realpath(__file__)), "media-player.log") + logging.basicConfig( + filename=logfile, + level=logging.DEBUG, + format="%(asctime)s %(name)s %(levelname)s:%(lineno)d %(message)s" + ) + + # Set log level based on verbosity + logger.setLevel(max((3 - arguments.verbose) * 10, 0)) + + logger.info("Creating player manager") + + if arguments.player: + logger.info(f"Filtering for player: {arguments.player}") + if arguments.exclude: + logger.info(f"Excluding players: {arguments.exclude}") + + player_manager = PlayerManager(arguments.player, arguments.exclude) + player_manager.run() + +if __name__ == "__main__": + main() diff --git a/waybar/scripts/power-menu.sh b/waybar/scripts/power-menu.sh new file mode 100755 index 0000000..168bb77 --- /dev/null +++ b/waybar/scripts/power-menu.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +config="$HOME/.config/rofi/power-menu.rasi" + +actions=$(echo -e " Lock\n Shutdown\n Reboot\n Suspend\n Hibernate\n Logout") + +# Display logout menu +selected_option=$(echo -e "$actions" | rofi -dmenu -i -config "${config}" || pkill -x rofi) + +# Perform actions based on the selected option +case "$selected_option" in +*Lock) + hyprlock + ;; +*Shutdown) + systemctl poweroff + ;; +*Reboot) + systemctl reboot + ;; +*Suspend) + systemctl suspend + ;; +*Hibernate) + systemctl hibernate + ;; +*Logout) + hyprctl dispatch exit 0 + ;; +esac diff --git a/waybar/scripts/system-update.sh b/waybar/scripts/system-update.sh new file mode 100755 index 0000000..086a5dd --- /dev/null +++ b/waybar/scripts/system-update.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash + +# Check release +if [ ! -f /etc/arch-release ]; then + exit 0 +fi + +pkg_installed() { + local pkg=$1 + + if pacman -Qi "${pkg}" &>/dev/null; then + return 0 + elif pacman -Qi "flatpak" &>/dev/null && flatpak info "${pkg}" &>/dev/null; then + return 0 + elif command -v "${pkg}" &>/dev/null; then + return 0 + else + return 1 + fi +} + +get_aur_helper() { + if pkg_installed yay; then + aur_helper="yay" + elif pkg_installed paru; then + aur_helper="paru" + fi +} + +get_aur_helper +export -f pkg_installed + +# Trigger upgrade +if [ "$1" == "up" ]; then + trap 'pkill -RTMIN+20 waybar' EXIT + command=" + $0 upgrade + ${aur_helper} -Syu + if pkg_installed flatpak; then flatpak update; fi + printf '\n' + read -n 1 -p 'Press any key to continue...' + " + kitty --title "󰞒 System Update" sh -c "${command}" +fi + +# Check for AUR updates +if [ -n "$aur_helper" ]; then + aur_updates=$(${aur_helper} -Qua | grep -c '^') +else + aur_updates=0 +fi + +# Check for official repository updates +official_updates=$( + (while pgrep -x checkupdates >/dev/null; do sleep 1; done) + checkupdates | grep -c '^' +) + +# Check for Flatpak updates +if pkg_installed flatpak; then + flatpak_updates=$(flatpak remote-ls --updates | grep -c '^') +else + flatpak_updates=0 +fi + +# Calculate total available updates +total_updates=$((official_updates + aur_updates + flatpak_updates)) + +# Handle formatting based on AUR helper +if [ "$aur_helper" == "yay" ]; then + [ "${1}" == upgrade ] && printf "Official: %-10s\nAUR ($aur_helper): %-10s\nFlatpak: %-10s\n\n" "$official_updates" "$aur_updates" "$flatpak_updates" && exit + + tooltip="Official: $official_updates\nAUR ($aur_helper): $aur_updates\nFlatpak: $flatpak_updates" + +elif [ "$aur_helper" == "paru" ]; then + [ "${1}" == upgrade ] && printf "Official: %-10s\nAUR ($aur_helper): %-10s\nFlatpak: %-10s\n\n" "$official_updates" "$aur_updates" "$flatpak_updates" && exit + + tooltip="Official: $official_updates\nAUR ($aur_helper): $aur_updates\nFlatpak: $flatpak_updates" +fi + +# Module and tooltip +if [ $total_updates -eq 0 ]; then + echo "{\"text\":\"󰸟\", \"tooltip\":\"Packages are up to date\"}" +else + echo "{\"text\":\"󰞒\", \"tooltip\":\"${tooltip//\"/\\\"}\"}" +fi diff --git a/waybar/scripts/volume-control.sh b/waybar/scripts/volume-control.sh new file mode 100755 index 0000000..b9953a4 --- /dev/null +++ b/waybar/scripts/volume-control.sh @@ -0,0 +1,111 @@ +#!/usr/bin/env bash + +# Define functions +print_error() { + cat <<"EOF" +Usage: ./volumecontrol.sh -[device] +...valid devices are... + i -- input device + o -- output device + p -- player application +...valid actions are... + i -- increase volume [+2] + d -- decrease volume [-2] + m -- mute [x] +EOF + exit 1 +} + +send_notification() { + vol=$(pactl get-sink-volume @DEFAULT_SINK@ | awk '{print $5}' | sed 's/%//') + notify-send -r 91190 "Volume: ${vol}%" +} + +notify_mute() { + mute=$(pactl get-sink-mute @DEFAULT_SINK@ | awk '{print $2}') + if [ "${mute}" = "yes" ]; then + notify-send -r 91190 "Muted" + else + notify-send -r 91190 "Unmuted" + fi +} + +action_volume() { + case "${1}" in + i) + # Check current volume and increase only if below 100 + current_vol=$(pactl get-sink-volume @DEFAULT_SINK@ | awk '{print $5}' | sed 's/%//') + if [ "$current_vol" -lt 100 ]; then + new_vol=$((current_vol + 2)) + if [ "$new_vol" -gt 100 ]; then + new_vol=100 + fi + pactl set-sink-volume @DEFAULT_SINK@ "${new_vol}%" + fi + ;; + d) + # Decrease volume, ensuring it doesn't drop below 0% + current_vol=$(pactl get-sink-volume @DEFAULT_SINK@ | awk '{print $5}' | sed 's/%//') + new_vol=$((current_vol - 2)) + if [ "$new_vol" -lt 0 ]; then + new_vol=0 + fi + pactl set-sink-volume @DEFAULT_SINK@ "${new_vol}%" + ;; + esac +} + +select_output() { + if [ "$@" ]; then + desc="$*" + device=$(pactl list sinks | grep -C2 -F "Description: $desc" | grep Name | cut -d: -f2 | xargs) + if pactl set-default-sink "$device"; then + notify-send -r 91190 "Activated: $desc" + else + notify-send -r 91190 "Error activating $desc" + fi + else + pactl list sinks | grep -ie "Description:" | awk -F ': ' '{print $2}' | sort + fi +} + +# Evaluate device option +while getopts iops: DeviceOpt; do + case "${DeviceOpt}" in + i) + nsink=$(pactl list sources short | awk '{print $2}') + [ -z "${nsink}" ] && echo "ERROR: Input device not found..." && exit 0 + srce="--default-source" + ;; + o) + nsink=$(pactl list sinks short | awk '{print $2}') + [ -z "${nsink}" ] && echo "ERROR: Output device not found..." && exit 0 + srce="" + ;; + p) + nsink=$(playerctl --list-all | grep -w "${OPTARG}") + [ -z "${nsink}" ] && echo "ERROR: Player ${OPTARG} not active..." && exit 0 + # shellcheck disable=SC2034 + srce="${nsink}" + ;; + s) + # Select an output device + select_output "$@" + exit + ;; + *) print_error ;; + esac +done + +# Set default variables +shift $((OPTIND - 1)) + +# Execute action +case "${1}" in +i) action_volume i ;; +d) action_volume d ;; +m) pactl set-sink-mute @DEFAULT_SINK@ toggle && notify_mute && exit 0 ;; +*) print_error ;; +esac + +send_notification diff --git a/waybar/scripts/wifi-menu.sh b/waybar/scripts/wifi-menu.sh new file mode 100755 index 0000000..b585d2d --- /dev/null +++ b/waybar/scripts/wifi-menu.sh @@ -0,0 +1,126 @@ +#!/usr/bin/env bash + +# Author: Jesse Mirabel (@sejjy) +# GitHub: https://github.com/sejjy/mechabar + +# Rofi config +config="$HOME/.config/rofi/wifi-menu.rasi" + +options=$( + echo "Manual Entry" + echo "Disable Wi-Fi" +) +option_disabled="Enable Wi-Fi" + +# Rofi window override +override_ssid="entry { placeholder: \"Enter SSID\"; } listview { enabled: false; }" +override_password="entry { placeholder: \"Enter password\"; } listview { enabled: false; }" +override_disabled="mainbox { children: [ listview ]; } listview { lines: 1; padding: 6px; }" + +# Prompt for password +get_password() { + rofi -dmenu -password -config "${config}" -theme-str "${override_password}" -p " " || pkill -x rofi +} + +while true; do + wifi_list() { + nmcli --fields "SECURITY,SSID" device wifi list | + tail -n +2 | # Skip the header line from nmcli output + sed 's/ */ /g' | # Replace multiple spaces with a single space + sed -E "s/WPA*.?\S/󰤪 /g" | # Replace 'WPA*' with a Wi-Fi lock icon + sed "s/^--/󰤨 /g" | # Replace '--' (open networks) with an open Wi-Fi icon + sed "s/󰤪 󰤪/󰤪/g" | # Remove duplicate Wi-Fi lock icons + sed "/--/d" | # Remove lines containing '--' (empty SSIDs) + awk '!seen[$0]++' # Filter out duplicate SSIDs + } + + # Get Wi-Fi status + wifi_status=$(nmcli -fields WIFI g) + + case "$wifi_status" in + *"enabled"*) + selected_option=$(echo "$options"$'\n'"$(wifi_list)" | + rofi -dmenu -i -selected-row 1 -config "${config}" -p " " || pkill -x rofi) + ;; + *"disabled"*) + selected_option=$(echo "$option_disabled" | + rofi -dmenu -i -config "${config}" -theme-str "${override_disabled}" || pkill -x rofi) + ;; + esac + + # Extract selected SSID + read -r selected_ssid <<<"${selected_option:3}" + + # Actions based on selected option + case "$selected_option" in + "") + exit + ;; + "Enable Wi-Fi") + notify-send "Scanning for networks..." + nmcli radio wifi on + nmcli device wifi rescan + sleep 3 + ;; + "Disable Wi-Fi") + notify-send "Wi-Fi Disabled" + nmcli radio wifi off + exit + ;; + "Manual Entry") + # Prompt for SSID + manual_ssid=$(rofi -dmenu -config "${config}" -theme-str "${override_ssid}" -p " " || pkill -x rofi) + + # Exit if no option is selected + if [ -z "$manual_ssid" ]; then + exit + fi + + # Prompt for Wi-Fi password + wifi_password=$(get_password) + + if [ -z "$wifi_password" ]; then + # Without password + if nmcli device wifi connect "$manual_ssid" | grep -q "successfully"; then + notify-send "Connected to \"$manual_ssid\"." + exit + else + notify-send "Failed to connect to \"$manual_ssid\"." + fi + else + # With password + if nmcli device wifi connect "$manual_ssid" password "$wifi_password" | grep -q "successfully"; then + notify-send "Connected to \"$manual_ssid\"." + exit + else + notify-send "Failed to connect to \"$manual_ssid\"." + fi + fi + ;; + *) + # Get saved connections + saved_connections=$(nmcli -g NAME connection) + + if echo "$saved_connections" | grep -qw "$selected_ssid"; then + if nmcli connection up id "$selected_ssid" | grep -q "successfully"; then + notify-send "Connected to \"$selected_ssid\"." + exit + else + notify-send "Failed to connect to \"$selected_ssid\"." + fi + else + # Handle secure network connection + if [[ "$selected_option" =~ ^"󰤪" ]]; then + wifi_password=$(get_password) + fi + + if nmcli device wifi connect "$selected_ssid" password "$wifi_password" | grep -q "successfully"; then + notify-send "Connected to \"$selected_ssid\"." + exit + else + notify-send "Failed to connect to \"$selected_ssid\"." + fi + fi + ;; + esac +done diff --git a/waybar/scripts/wifi-status.sh b/waybar/scripts/wifi-status.sh new file mode 100755 index 0000000..bb4c236 --- /dev/null +++ b/waybar/scripts/wifi-status.sh @@ -0,0 +1,176 @@ +#!/usr/bin/env bash + +# This script gathers detailed Wi-Fi connection information. +# It collects the following fields: +# +# - SSID (Service Set Identifier): The name of the Wi-Fi network you +# are currently connected to. Example: "My_Network" +# +# - IP Address: The IP address assigned to the device by the router. +# This is typically a private IP within the local network. Example: +# "192.168.1.29/24" (with subnet mask) +# +# - Router (Gateway): The IP address of the router (default gateway) +# that your device uses to communicate outside the local network. +# Example: "192.168.1.1" +# +# - MAC Address: The unique Media Access Control address of the local +# device's Wi-Fi adapter. Example: "F8:34:41:07:1B:65" +# +# - Security: The encryption protocol being used to secure your Wi-Fi +# connection. Common security protocols include: +# - WPA2 (Wi-Fi Protected Access 2): The most commonly used security +# standard, offering strong encryption (AES). +# - WPA3: The latest version, providing even stronger security, +# especially in public or open networks. +# - WEP (Wired Equivalent Privacy): An outdated and insecure protocol +# that should not be used. +# Example: "WPA2" indicates that the connection is secured using WPA2 +# with AES encryption. +# +# - BSSID (Basic Service Set Identifier): The MAC address of the Wi-Fi +# access point you are connected to. Example: "A4:22:49:DA:91:A0" +# +# - Channel: The wireless channel your Wi-Fi network is using. This is +# associated with the frequency band. Example: "100 (5500 MHz)" +# indicates the channel number (100) and the frequency (5500 MHz), +# which is within the 5 GHz band. +# +# - RSSI (Received Signal Strength Indicator): The strength of the +# Wi-Fi signal, typically in dBm (decibels relative to 1 milliwatt). +# Closer to 0 means stronger signal, with values like -40 dBm being +# very good. Example: "-40 dBm" +# +# - Signal: The signal quality, which is represented as a percentage, +# where higher numbers mean better signal. Example: "100" +# indicates perfect signal strength. +# +# - Rx Rate (Receive Rate): The maximum data rate (in Mbit/s) at which +# the device can receive data from the Wi-Fi access point. Example: +# "866.7 MBit/s" indicates a high-speed connection on a modern +# standard. +# +# - Tx Rate (Transmit Rate): The maximum data rate (in Mbit/s) at +# which the device can send data to the Wi-Fi access point. Example: +# "866.7 MBit/s" +# +# - PHY Mode (Physical Layer Mode): The Wi-Fi protocol or standard in +# use. Common modes include 802.11n, 802.11ac, and 802.11ax (Wi-Fi +# 6). Example: "802.11ac" indicates you're using the 5 GHz band with +# a modern high-speed standard. + +if ! command -v nmcli &>/dev/null; then + echo "{\"text\": \"󰤫\", \"tooltip\": \"nmcli utility is missing\"}" + exit 1 +fi + +# Check if Wi-Fi is enabled +wifi_status=$(nmcli radio wifi) + +if [ "$wifi_status" = "disabled" ]; then + echo "{\"text\": \"󰤮\", \"tooltip\": \"Wi-Fi Disabled\"}" + exit 0 +fi + +wifi_info=$(nmcli -t -f active,ssid,signal,security dev wifi | grep "^yes") + +# If no ESSID is found, set a default value +if [ -z "$wifi_info" ]; then + essid="No Connection" + signal=0 + tooltip="No Connection" +else + # Some defaults + ip_address="127.0.0.1" + # gateway="127.0.0.1" + # mac_address="N/A" + security=$(echo "$wifi_info" | awk -F: '{print $4}') + # bssid="N/A" + chan="N/A" + # rssi="N/A" + # rx_bitrate="" + # tx_bitrate="" + # phy_mode="" + signal=$(echo "$wifi_info" | awk -F: '{print $3}') + + active_device=$(nmcli -t -f DEVICE,STATE device status | + grep -w "connected" | + grep -v -E "^(dummy|lo:)" | + awk -F: '{print $1}') + + if [ -n "$active_device" ]; then + output=$(nmcli -e no -g ip4.address,ip4.gateway,general.hwaddr device show "$active_device") + + ip_address=$(echo "$output" | sed -n '1p') + # gateway=$(echo "$output" | sed -n '2p') + # mac_address=$(echo "$output" | sed -n '3p') + + line=$(nmcli -e no -t -f active,bssid,chan,freq device wifi | grep "^yes") + + # bssid=$(echo "$line" | awk -F':' '{print $2":"$3":"$4":"$5":"$6":"$7}') + chan=$(echo "$line" | awk -F':' '{print $8}') + freq=$(echo "$line" | awk -F':' '{print $9}') + chan="$chan ($freq)" + + # if command -v iw &>/dev/null; then + # iw_output=$(iw dev "$active_device" station dump) + # rssi=$(echo "$iw_output" | grep "signal:" | awk '{print $2 " dBm"}') + + # Upload speed + # rx_bitrate=$(echo "$iw_output" | grep "rx bitrate:" | awk '{print $3 " " $4}') + + # Download speed + # tx_bitrate=$(echo "$iw_output" | grep "tx bitrate:" | awk '{print $3 " " $4}') + + # Physical Layer Mode + # if echo "$iw_output" | grep -E -q "rx bitrate:.* VHT"; then + # phy_mode="802.11ac" # Wi-Fi 5 + # elif echo "$iw_output" | grep -E -q "rx bitrate:.* HT"; then + # phy_mode="802.11n" # Wi-Fi 4 + # elif echo "$iw_output" | grep -E -q "rx bitrate:.* HE"; then + # phy_mode="802.11ax" # Wi-Fi 6 + # fi + # fi + + # Get the current Wi-Fi ESSID + essid=$(echo "$wifi_info" | awk -F: '{print $2}') + + tooltip="${essid}\n" + tooltip+="\nIP Address: ${ip_address}" + # tooltip+="\nRouter: ${gateway}" + # tooltip+="\nMAC Address: ${mac_address}" + tooltip+="\nSecurity: ${security}" + # tooltip+="\nBSSID: ${bssid}" + tooltip+="\nChannel: ${chan}" + # tooltip+="\nRSSI: ${rssi}" + tooltip+="\nStrength: ${signal} / 100" + + # if [ -n "$rx_bitrate" ]; then + # tooltip+="\nRx Rate: ${rx_bitrate}" + # fi + + # if [ -n "$tx_bitrate" ]; then + # tooltip+="\nTx Rate: ${tx_bitrate}" + # fi + + # if [ -n "$phy_mode" ]; then + # tooltip+="\nPHY Mode: ${phy_mode}" + # fi + fi +fi + +# Determine Wi-Fi icon based on signal strength +if [ "$signal" -ge 80 ]; then + icon="󰤨" # Strong signal +elif [ "$signal" -ge 60 ]; then + icon="󰤥" # Good signal +elif [ "$signal" -ge 40 ]; then + icon="󰤢" # Weak signal +elif [ "$signal" -ge 20 ]; then + icon="󰤟" # Very weak signal +else + icon="󰤯" # No signal +fi + +# Module and tooltip +echo "{\"text\": \"${icon}\", \"tooltip\": \"${tooltip}\"}" diff --git a/waybar/style.css b/waybar/style.css new file mode 100644 index 0000000..ab814e8 --- /dev/null +++ b/waybar/style.css @@ -0,0 +1,383 @@ +* { + font-family: "JetBrainsMono Nerd Font"; + font-weight: bold; + font-size: 16px; + min-height: 0; + padding: 0; + border: none; + margin: 0; +} + +@import "theme.css"; + +/* === Main Background === */ + +window#waybar { + background: @main-bg; +} + +/* === Drop Shadow === */ + +window#waybar > box { + background-color: transparent; + box-shadow: 0 0 2px 1px rgba(0, 0, 0, 1); + margin: 2px; +} + +/* === Tooltip === */ + +tooltip { + background: @main-bg; + border: solid; + border-width: 1.5px; + border-radius: 8px; + border-color: @main-br; +} +tooltip label { + color: @main-fg; + font-weight: normal; + margin: -1.5px 3px; +} + +/* === Workspace Buttons === */ + +#workspaces button { + color: @module-fg; + border-radius: 8px; + box-shadow: none; + margin: 2px 0; + padding: 0 2px; + transition: none; +} +#workspaces button:hover { + color: @hover-fg; + background: @hover-bg; + text-shadow: none; + box-shadow: none; +} +#workspaces button.active { + color: @active-fg; + background: @active-bg; + text-shadow: 0 0 2px rgba(0, 0, 0, 0.6); + box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.4); + margin: 2px; + padding: 0 6px; +} + +/* === General === */ + +#custom-ws, +#workspaces, +#window, +#custom-cpuinfo, +#memory, +#cpu, +#idle_inhibitor, +#clock, +#custom-wifi, +#bluetooth, +#custom-update, +#custom-media, +#pulseaudio, +#backlight, +#battery, +#custom-power { + opacity: 1; + color: @module-fg; + padding: 0 4px; + text-shadow: 0 0 2px rgba(0, 0, 0, 0.6); +} + +#custom-left1, +#custom-left2, +#custom-left3, +#custom-left4, +#custom-left5, +#custom-left6, +#custom-left7, +#custom-left8 { + font-size: 22.68px; + margin-bottom: 0; + text-shadow: -2px 0 2px rgba(0, 0, 0, 0.5); +} + +#custom-right1, +#custom-right2, +#custom-right3, +#custom-right4, +#custom-right5 { + font-size: 22.68px; + margin-bottom: 0; + padding-right: 3px; + text-shadow: 2px 0 2px rgba(0, 0, 0, 0.5); +} + +/* === Modules === */ + +/* == Window Icon == */ + +#custom-ws { + background: @main-bg; +} + +/* == Workspaces == */ + +#custom-left1 { + color: @workspaces; + background: @main-bg; + font-size: 22.68px; + margin-bottom: 0; + padding-left: 2px; +} +#workspaces { + background: @workspaces; +} +#custom-right1 { + color: @workspaces; + background: @main-bg; + font-size: 22.68px; + text-shadow: 3px 0 2px rgba(0, 0, 0, 0.4); + margin-bottom: 0; +} + +/* == Temperature == */ + +#custom-paddc { + padding-right: 22px; +} +#custom-left2 { + color: @cpuinfo; + background: @main-bg; + padding-left: 3px; +} +#custom-cpuinfo { + background: @cpuinfo; + padding-left: 1px; + padding-right: 0; +} + +/* == Memory == */ + +#custom-left3 { + color: @memory; + background: @cpuinfo; + padding-left: 3px; +} +#memory { + background: @memory; + padding-left: 1px; + padding-right: 0; +} +#memory.warning { + color: @warning; +} +#memory.critical { + color: @critical; +} + +/* == CPU == */ + +#custom-left4 { + color: @cpu; + background: @memory; + padding-left: 3px; +} +#cpu { + background: @cpu; +} +#custom-leftin1 { + color: @cpu; + font-size: 23.5px; + margin-bottom: -1px; +} + +/* == Distro Icon == */ + +#custom-left5 { + color: @distro-bg; + background: @main-bg; + font-size: 22.68px; + text-shadow: -2px 0 2px rgba(0, 0, 0, 0.6); + margin-bottom: 0px; + padding-left: 3px; +} +#custom-distro { + color: @distro-fg; + background: @distro-bg; + font-size: 14.6px; + margin: 0 -1px -2px 0; + padding: 0 0 0 3px; + text-shadow: 0 0 1.5px rgba(0, 0, 0, 1); +} +#custom-right2 { + color: @distro-bg; + background: @main-bg; + font-size: 22.68px; + margin-bottom: 0px; +} + +/* == Time == */ + +#custom-rightin1 { + color: @time; + font-size: 23.5px; + margin-bottom: -1px; +} +#idle_inhibitor { + background: @time; + margin-right: -2px; + padding: 0 0 0 7px; +} +#idle_inhibitor:hover { + color: @hover-fg; + text-shadow: none; + box-shadow: none; +} +#clock.time { + background: @time; + padding: 0 3px 0 0; +} +#custom-right3 { + color: @time; + background: @date; +} + +/* == Date == */ + +#clock.date { + background: @date; +} +#clock.date:hover { + color: @hover-fg; + text-shadow: none; + box-shadow: none; +} +#custom-right4 { + color: @date; + background: @tray; +} + +/* == Tray == */ + +#custom-wifi { + padding-left: 5px; + padding-right: 8px; + background: @tray; +} +#custom-wifi:hover { + color: @hover-fg; + text-shadow: none; + box-shadow: none; +} + +#bluetooth { + padding-right: 5px; + background: @tray; +} +#bluetooth:hover { + color: @hover-fg; + text-shadow: none; + box-shadow: none; +} + +#custom-update { + padding-right: 8px; + background: @tray; +} +#custom-update:hover { + color: @hover-fg; + text-shadow: none; + box-shadow: none; +} +#custom-right5 { + color: @tray; + background: @main-bg; +} + +/* == Media Info == */ + +#custom-media { + font-weight: normal; + background-color: @main-bg; + padding-right: 8px; + padding-left: 8px; +} +#custom-media:hover { + color: @hover-fg; + text-shadow: none; + box-shadow: none; +} + +/* == Output Device == */ + +#custom-left6 { + color: @pulseaudio; + background: @main-bg; + padding-left: 3px; +} +#pulseaudio { + background: @pulseaudio; +} +#pulseaudio:hover { + color: @hover-fg; + text-shadow: none; + box-shadow: none; +} + +/* == Brightness == */ + +#custom-left7 { + color: @backlight; + background: @pulseaudio; + padding-left: 2px; +} +#backlight { + background: @backlight; +} + +/* == Battery == */ + +#custom-left8 { + color: @battery; + background: @backlight; + padding-left: 2px; +} +#battery { + color: @module-fg; + background: @battery; +} +#battery.warning { + color: @warning; +} +#battery.critical { + color: @critical; +} +#battery.charging { + color: @charging; +} + +/* == Power Button == */ + +#custom-leftin2 { + color: @battery; + background: @main-bg; + font-size: 23.5px; + margin-bottom: -1px; +} +#custom-power { + color: @main-bg; + background: @power; + text-shadow: 0 0 2px rgba(0, 0, 0, 0.6); + box-shadow: 1px 0 2px 1px rgba(0, 0, 0, 0.6); + border-radius: 10px; + margin: 2px 4px 2px 0; + padding: 0 6px 0 9px; +} +#custom-power:hover { + color: @hover-fg; + background: @hover-bg; + text-shadow: none; + box-shadow: none; +} + +@import "animation.css"; diff --git a/waybar/theme.css b/waybar/theme.css new file mode 100644 index 0000000..8710796 --- /dev/null +++ b/waybar/theme.css @@ -0,0 +1,45 @@ +/* + bg - background + fg - foreground + br - border +*/ + +/* Main Colors */ + +@define-color main-fg #c7a4de; +@define-color main-bg #11111b; +@define-color main-br #cdd6f4; + +@define-color active-bg #885ab0; +@define-color active-fg #11111b; + +@define-color hover-bg #372542; +@define-color hover-fg rgba(219, 166, 237, 0.75); + +@define-color white #ffffff; +@define-color black #000000; + +/* Module Colors */ + +@define-color module-fg #f5e0dc; +@define-color workspaces #271f33; + +@define-color cpuinfo #281d30; +@define-color memory #332440; +@define-color cpu #372542; +@define-color distro-fg #000000; +@define-color distro-bg #885ab0; +@define-color time #372542; +@define-color date #332440; +@define-color tray #281d30; + +@define-color pulseaudio #281d30; +@define-color backlight #332440; +@define-color battery #372542; +@define-color power #885ab0; + +/* State Colors */ + +@define-color warning #f9e2af; +@define-color critical #f38ba8; +@define-color charging #cdd6f4;