Initial commit

This commit is contained in:
2025-11-14 17:35:52 +01:00
commit 3fc38a20d9
106 changed files with 9123 additions and 0 deletions

15
.gitignore vendored Normal file
View File

@@ -0,0 +1,15 @@
# Backup files
*~
*.bak
*.swp
# Cache files
.cache/
*.cache
# Temporary files
/tmp/
*.tmp
# Waybar backup
waybar_backup/

0
.initial_startup_done Normal file
View File

14
Monitor_Profiles/README Normal file
View File

@@ -0,0 +1,14 @@
# Create a Monitor profile you want to on this directory
# Create a unique file name i.e. Mirror, or Office, Scale, etc etc
# tip: You can easily create a profile using nwg-displays
# after creating a profile using nwg-displays, copy the ~/.config/hypr/monitors.conf file to this directory with a unique file name
# suggest not to call it default
# Note, after selecting Profiles wanted via Rofi (SUPER SHIFT E), previous content of ~/.config/hypr/monitors.conf will be backed up and named as Previous_Profile.conf
# Monitor profile should be loaded automatically once selected by KooL Rofi Settings ROfi Menu, unless you disabled the auto-reload function on Hyprland settings.
# However, if it does not load, kindly log out and re-login. This seem apparent if you are using a Virtual Environment.

View File

@@ -0,0 +1,52 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# default Monitor config
# Monitor Configuration
# See Hyprland wiki for more details
# https://wiki.hyprland.org/Configuring/Monitors/
# Configure your Display resolution, offset, scale and Monitors here, use `hyprctl monitors` to get the info.
# Monitors
monitor=,preferred,auto,1
# High Refresh Rate
monitor=,highrr,auto,1
# High Resolution
monitor=,highres,auto,1
# NOTE: for laptop, kindly check notes in Laptops.conf regarding display
# Created this inorder for the monitor display to not wake up if not intended.
# See here: https://github.com/hyprwm/Hyprland/issues/4090
# Some examples to set your own monitor
#monitor = eDP-1, preferred, auto, 1
#monitor = eDP-1, 2560x1440@165, 0x0, 1 #own screen
#monitor = DP-3, 1920x1080@240, auto, 1
#monitor = DP-1, preferred, auto, 1
#monitor = HDMI-A-1, preferred,auto,1
# QEMU-KVM, virtual box or vmware
#monitor = Virtual-1, 1920x1080@60,auto,1
# to disable a monitor
#monitor=name,disable
# Mirror samples
#monitor=DP-3,1920x1080@60,0x0,1,mirror,DP-2
#monitor=,preferred,auto,1,mirror,eDP-1
#monitor=HDMI-A-1,2560x1440@144,0x0,1,mirror,eDP-1
# 10 bit monitor support - See wiki https://wiki.hyprland.org/Configuring/Monitors/#10-bit-support - See NOTES below
# NOTE: Colors registered in Hyprland (e.g. the border color) do not support 10 bit.
# NOTE: Some applications do not support screen capture with 10 bit enabled. (Screen captures like OBS may render black screen)
# monitor=,preferred,auto,1,bitdepth,10
#monitor=eDP-1,transform,0
#monitor=eDP-1,addreserved,10,10,10,49
# workspaces - Monitor rules
# https://wiki.hyprland.org/Configuring/Workspace-Rules/
# SUPER E - Workspace-Rules
# See ~/.config/hypr/UserConfigs/WorkspaceRules.conf

16
UserConfigs/00-Readme Normal file
View File

@@ -0,0 +1,16 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
KooL's Hyprland-Dots
1.) Suggest not to rename any files in this directory. As this is connected and being sourced from hyprland.conf in ~/.config/hypr
2.) This directory, along with UserScripts directory will NOT be touch when running upgrade.sh
3.) However, if hyprland has a big change in settings, i.e., blur section is moved into another group, you should managed the change yourself.
4.) Guidance on the keybinds. Suggest NOT to assign a keybind which I set on the default Keybinds. Else will conflict. Once Hyprland decided to have a global keybinds, then I will adjust.
5.) If you think that the default keybinds SHOULD be adjusted, open an issue on my github page and present me a valid argument. Like conflicting to GLOBAL keybinds, etc etc etc.
I will update the Hyprland-Dots wiki for guidance. Make sure to check out changelogs as well

View File

@@ -0,0 +1,18 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# This is a file where you put your own default apps, default search Engine etc
# Set your default editor here uncomment and reboot to take effect.
# NOTE, this will be automatically uncommented if you select neovim or vim to your default editor
#env = EDITOR,vim #default editor
# Define preferred text editor for the KooL Quick Settings Menu (SUPER SHIFT E)
# script will take the default EDITOR and nano as fallback
$edit=${EDITOR:-nano}
# These two are for UserKeybinds.conf & Waybar Modules
$term = kitty # Terminal
$files = thunar # File Manager
# Default Search Engine for ROFI Search (SUPER S)
$Search_Engine = "https://www.google.com/search?q={}"

View File

@@ -0,0 +1,89 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# Environment variables. See https://wiki.hyprland.org/Configuring/Environment-variables/
# Set your defaults editor through ENV in ~/.config/hypr/UserConfigs/01-UserDefaults.conf
# environment-variables
# Toolkit Backend Variables
env = GDK_BACKEND,wayland,x11,*
env = QT_QPA_PLATFORM,wayland;xcb
env = CLUTTER_BACKEND,wayland
#Run SDL2 applications on Wayland.
#Remove or set to x11 if games that provide older versions of SDL cause compatibility issues
#env = SDL_VIDEODRIVER,wayland
# xdg Specifications
env = XDG_CURRENT_DESKTOP,Hyprland
env = XDG_SESSION_DESKTOP,Hyprland
env = XDG_SESSION_TYPE,wayland
# QT Variables
env = QT_AUTO_SCREEN_SCALE_FACTOR,1
env = QT_WAYLAND_DISABLE_WINDOWDECORATION,1
env = QT_QPA_PLATFORMTHEME,qt5ct
env = QT_QPA_PLATFORMTHEME,qt6ct
# hyprland-qt-support
env = QT_QUICK_CONTROLS_STYLE,org.hyprland.style
# xwayland apps scale fix (useful if you are use monitor scaling).
# Set same value if you use scaling in Monitors.conf
# 1 is 100% 1.5 is 150%
# see https://wiki.hyprland.org/Configuring/XWayland/
env = GDK_SCALE,1
env = QT_SCALE_FACTOR,1
# Bibata-Modern-Ice-Cursor
# NOTE! You must have the hyprcursor version to activate this.
# https://wiki.hyprland.org/Hypr-Ecosystem/hyprcursor/
#env = HYPRCURSOR_THEME,Bibata-Modern-Ice
#env = HYPRCURSOR_SIZE,24
# firefox
env = MOZ_ENABLE_WAYLAND,1
# electron >28 apps (may help) ##
# https://www.electronjs.org/docs/latest/api/environment-variables
env = ELECTRON_OZONE_PLATFORM_HINT,auto # auto selects Wayland if possible, X11 otherwise
# NVIDIA
# This is from Hyprland Wiki. Below will be activated nvidia gpu detected
# See hyprland wiki https://wiki.hyprland.org/Nvidia/#environment-variables
#env = LIBVA_DRIVER_NAME,nvidia
#env = __GLX_VENDOR_LIBRARY_NAME,nvidia
#env = NVD_BACKEND,direct
#env = GSK_RENDERER,ngl
# additional ENV's for nvidia. Caution, activate with care
#env = GBM_BACKEND,nvidia-drm
#env = __GL_GSYNC_ALLOWED,1 #adaptive Vsync
#env = __NV_PRIME_RENDER_OFFLOAD,1
#env = __VK_LAYER_NV_optimus,NVIDIA_only
#env = WLR_DRM_NO_ATOMIC,1
# FOR VM and POSSIBLY NVIDIA
# LIBGL_ALWAYS_SOFTWARE software mesa rendering
#env = LIBGL_ALWAYS_SOFTWARE,1 # Warning. May cause hyprland to crash
#env = WLR_RENDERER_ALLOW_SOFTWARE,1
# nvidia firefox (for hardware acceleration on FF)?
# check this post https://github.com/elFarto/nvidia-vaapi-driver#configuration
#env = MOZ_DISABLE_RDD_SANDBOX,1
#env = EGL_PLATFORM,wayland
#### Aquamarine Environment Variables #### ( Hyprland > 0.45 )
# https://wiki.hyprland.org/Configuring/Environment-variables/#aquamarine-environment-variables----ref-httpsgithubcomhyprwmaquamarineblobmaindocsenvmd---
# env = AQ_TRACE,1 # Enables more verbose logging.
# env = AQ_DRM_DEVICES,/dev/dri/card1:/dev/dri/card0 # Set an explicit list of DRM devices (GPUs) to use. Its a colon-separated list of paths, with the first being the primary. E.g. /dev/dri/card1:/dev/dri/card0
# env = AQ_MGPU_NO_EXPLICIT,1 # Disables explicit syncing on mgpu buffers
# env = AQ_NO_MODIFIERS,1 # Disables modifiers for DRM buffers
#### Hyprland Environment Variables ####
# https://wiki.hyprland.org/Configuring/Environment-variables/#hyprland-environment-variables
# env = HYPRLAND_TRACE,1 # Enables more verbose logging.
# env = HYPRLAND_NO_RT,1 # Disables realtime priority setting by Hyprland.
# env = HYPRLAND_NO_SD_NOTIFY,1 # If systemd, disables the 'sd_notify' calls.
# env = HYPRLAND_NO_SD_VARS,1 # Disables management of variables in systemd and dbus activation environments.

View File

@@ -0,0 +1,4 @@
# NOTE, THIS FILE IS BEING USED by disabling Laptop display monitor behaviour when closing lid.
# See notes on Laptops.conf
#monitor = eDP-1, preferred, auto, 1

55
UserConfigs/Laptops.conf Normal file
View File

@@ -0,0 +1,55 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# See https://wiki.hyprland.org/Configuring/Keywords/ for more variable settings
# These configs are mostly for laptops. This is addemdum to Keybinds.conf
$mainMod = SUPER
$scriptsDir = $HOME/.config/hypr/scripts
$UserConfigs = $HOME/.config/hypr/UserConfigs
# for disabling Touchpad. hyprctl devices to get device name.
$Touchpad_Device=asue1209:00-04f3:319f-touchpad
binde = , xf86KbdBrightnessDown, exec, $scriptsDir/BrightnessKbd.sh --dec # decrease keyboard brightness
binde = , xf86KbdBrightnessUp, exec, $scriptsDir/BrightnessKbd.sh --inc # increase keyboard brightness
bind = , xf86Launch1, exec, rog-control-center # ASUS Armory crate button
bind = , xf86Launch3, exec, asusctl led-mode -n # FN+F4 Switch keyboard RGB profile
bind = , xf86Launch4, exec, asusctl profile -n # FN+F5 change of fan profiles (Quite, Balance, Performance)
binde = , xf86MonBrightnessDown, exec, $scriptsDir/Brightness.sh --dec # decrease monitor brightness
binde = , xf86MonBrightnessUp, exec, $scriptsDir/Brightness.sh --inc # increase monitor brightness
bind = , xf86TouchpadToggle, exec, $scriptsDir/TouchPad.sh # disable touchpad
# Screenshot keybindings using F6 (no PrinSrc button)
bind = $mainMod, F6, exec, $scriptsDir/ScreenShot.sh --now # screenshot
bind = $mainMod SHIFT, F6, exec, $scriptsDir/ScreenShot.sh --area # screenshot (area)
bind = $mainMod CTRL, F6, exec, $scriptsDir/ScreenShot.sh --in5 # # screenshot (5 secs delay)
bind = $mainMod ALT, F6, exec, $scriptsDir/ScreenShot.sh --in10 # screenshot (10 secs delay)
bind = ALT, F6, exec, $scriptsDir/ScreenShot.sh --active # screenshot (active window only)
$TOUCHPAD_ENABLED = true
device {
name = $Touchpad_Device
enabled = $TOUCHPAD_ENABLED
}
# Below are useful when you are connecting your laptop in external display
# Suggest you edit below for your laptop display
# From WIKI This is to disable laptop monitor when lid is closed.
# consult https://wiki.hyprland.org/hyprland-wiki/pages/Configuring/Binds/#switches
#bindl = , switch:off:Lid Switch,exec,hyprctl keyword monitor "eDP-1, preferred, auto, 1"
#bindl = , switch:on:Lid Switch,exec,hyprctl keyword monitor "eDP-1, disable"
# WARNING! Using this method has some caveats!! USE THIS PART WITH SOME CAUTION!
# CONS of doing this, is that you need to set up your wallpaper (SUPER W) and choose wallpaper.
# CAVEATS! Sometimes the Main Laptop Monitor DOES NOT have display that it needs to re-connect your external monitor
# One work around is to ensure that before shutting down laptop, MAKE SURE your laptop lid is OPEN!!
# Make sure to comment (put # on the both the bindl = , switch ......) above
# NOTE: Display for laptop are being generated into LaptopDisplay.conf
# This part is to be use if you do not want your main laptop monitor to wake up during say wallpaper change etc
#bindl = , switch:off:Lid Switch,exec,echo "monitor = eDP-1, preferred, auto, 1" > $UserConfigs/LaptopDisplay.conf
#bindl = , switch:on:Lid Switch,exec,echo "monitor = eDP-1, disable" > $UserConfigs/LaptopDisplay.conf
# for laptop-lid action (to erase the last entry)
#exec-once = echo "monitor = eDP-1, preferred, auto, 1" > $HOME/.config/hypr/UserConfigs/LaptopDisplay.conf
#

View File

@@ -0,0 +1,59 @@
# Based on: /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# Edited and adapted by /* ---- https://gitea.ramforth.net ----*/
# Commands and Apps to be executed at launch
$scriptsDir = $HOME/.config/hypr/scripts
$UserScripts = $HOME/.config/hypr/UserScripts
$wallDIR=$HOME/Pictures/wallpapers
$lock = $scriptsDir/LockScreen.sh
$SwwwRandom = $UserScripts/WallpaperAutoChange.sh
$livewallpaper=""
# wallpaper stuff
exec-once = swww-daemon --format xrgb
#exec-once = mpvpaper '*' -o "load-scripts=no no-audio --loop" $livewallpaper
# wallpaper random
#exec-once = $SwwwRandom $wallDIR # random wallpaper switcher every 30 minutes
# Startup
exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
# Initialize Drop Down terminal - See Bug#810 https://github.com/JaKooLit/Hyprland-Dots/issues/810#issuecomment-3351947644
exec-once = $HOME/.config/hypr/scripts/Dropterminal.sh kitty &
# Polkit (Polkit Gnome / KDE)
exec-once = $scriptsDir/Polkit.sh
# starup apps
exec-once = nm-applet --indicator
exec-once = swaync
#exec-once = ags
#exec-once = blueman-applet
#exec-once = rog-control-center
#exec-once = waybar
exec-once = waybar -c "/home/joe/.config/waybar/configs/[TOP] Default"
#exec-once = qs # quickshell AGS Desktop Overview alternative
#clipboard manager
exec-once = wl-paste --type text --watch cliphist store
exec-once = wl-paste --type image --watch cliphist store
# Rainbow borders
#exec-once = $UserScripts/RainbowBorders.sh
# Starting hypridle to start hyprlock
exec-once = hypridle
# Here are list of features available but disabled by default
exec-once = swww img $HOME/Pictures/wallpapers/mecha-nostalgia.png # persistent wallpaper
#gnome polkit for nixos
#exec-once = $scriptsDir/Polkit-NixOS.sh
# xdg-desktop-portal-hyprland (should be auto starting. However, you can force to start)
#exec-once = $scriptsDir/PortalHyprland.sh

View File

@@ -0,0 +1,26 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
animations {
enabled = yes
bezier = wind, 0.05, 0.9, 0.1, 1.05
bezier = winIn, 0.1, 1.1, 0.1, 1.1
bezier = winOut, 0.3, -0.3, 0, 1
bezier = liner, 1, 1, 1, 1
bezier = overshot, 0.05, 0.9, 0.1, 1.05
bezier = smoothOut, 0.5, 0, 0.99, 0.99
bezier = smoothIn, 0.5, -0.5, 0.68, 1.5
animation = windows, 1, 6, wind, slide
animation = windowsIn, 1, 5, winIn, slide
animation = windowsOut, 1, 3, smoothOut, slide
animation = windowsMove, 1, 5, wind, slide
animation = border, 1, 1, liner
animation = borderangle, 1, 180, liner, loop #used by rainbow borders and rotating colors
animation = fade, 1, 3, smoothOut
animation = workspaces, 1, 5, overshot
# animations for -git or version >0.42.0
animation = workspacesIn, 1, 5, winIn, slide
animation = workspacesOut, 1, 5, winOut, slide
}

View File

@@ -0,0 +1,58 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# Decoration Settings
# Hyprland Wiki Links
# Animation - https://wiki.hyprland.org/Configuring/Animations/
# Decoration - https://wiki.hyprland.org/Configuring/Variables/#decoration
# Sourcing colors generated by wallust
source = $HOME/.config/hypr/wallust/wallust-hyprland.conf
general {
border_size = 2
gaps_in = 2
gaps_out = 4
col.active_border = $color12
col.inactive_border = $color10
}
decoration {
rounding = 10
active_opacity = 1.0
inactive_opacity = 0.9
fullscreen_opacity = 1.0
dim_inactive = true
dim_strength = 0.1
dim_special = 0.8
shadow {
enabled = true
range = 3
render_power = 1
color = $color12
color_inactive = $color10
}
blur {
enabled = true
size = 6
passes = 2
ignore_opacity = true
new_optimizations = true
special = true
popups = true
}
}
group {
col.border_active = $color15
groupbar {
col.active = $color0
}
}

View File

@@ -0,0 +1,87 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# This is where you put your own keybinds. Be Mindful to check as well ~/.config/hypr/configs/Keybinds.conf to avoid conflict
# if you think I should replace the Pre-defined Keybinds in ~/.config/hypr/configs/Keybinds.conf , submit an issue or let me know in DC and present me a valid reason as to why, such as conflicting with global shortcuts, etc etc
# See https://wiki.hyprland.org/Configuring/Keywords/ for more settings and variables
# See also Laptops.conf for laptops keybinds
# /* ---- ✴️ Variables ✴️ ---- */ #
$mainMod = SUPER
$scriptsDir = $HOME/.config/hypr/scripts
$UserScripts = $HOME/.config/hypr/UserScripts
$UserConfigs = $HOME/.config/hypr/UserConfigs
# settings for User defaults apps - set your default terminal and file manager on this file
source= $UserConfigs/01-UserDefaults.conf
# common shortcuts
#bindr = $mainMod, $mainMod_L, exec, pkill rofi || rofi -show drun -modi drun,filebrowser,run,window # Super Key to Launch rofi menu
bind = $mainMod, D, exec, pkill rofi || true && rofi -show drun -modi drun,filebrowser,run,window # Main Menu (APP Launcher)
bind = $mainMod, B, exec, xdg-open "https://" # default browser
#bind = $mainMod, A, exec, pkill rofi || true && ags -t 'overview' # desktop overview (if installed)
#bind = $mainMod, A, global, quickshell:overviewToggle # desktop overview (if installed)
bind = $mainMod, Return, exec, $term #terminal
bind = $mainMod, E, exec, $files #file manager
# FEATURES / EXTRAS
bind = $mainMod, H, exec, $scriptsDir/KeyHints.sh # help / cheat sheet
bind = $mainMod ALT, R, exec, $scriptsDir/Refresh.sh # Refresh waybar, swaync, rofi
bind = $mainMod ALT, E, exec, $scriptsDir/RofiEmoji.sh # emoji menu
bind = $mainMod, S, exec, $scriptsDir/RofiSearch.sh # Google search using rofi
bind = $mainMod CTRL, S, exec, rofi -show window # list/switch apps using rofi
bind = $mainMod ALT, O, exec, $scriptsDir/ChangeBlur.sh # Toggle blur settings
bind = $mainMod SHIFT, G, exec, $scriptsDir/GameMode.sh # Toggle animations ON/OFF
bind = $mainMod ALT, L, exec, $scriptsDir/ChangeLayout.sh # Toggle Master or Dwindle Layout
bind = $mainMod ALT, V, exec, $scriptsDir/ClipManager.sh # Clipboard Manager
bind = $mainMod CTRL, R, exec, $scriptsDir/RofiThemeSelector.sh # KooL Rofi Menu Theme Selector
bind = $mainMod CTRL SHIFT, R, exec, pkill rofi || true && $scriptsDir/RofiThemeSelector-modified.sh # modified Rofi Theme Selector
bind = $mainMod SHIFT, F, fullscreen # whole full screen
bind = $mainMod CTRL, F, fullscreen, 1 # fake full screen
bind = $mainMod, SPACE, togglefloating, #Float Mode
bind = $mainMod ALT, SPACE, exec, hyprctl dispatch workspaceopt allfloat #All Float Mode
bind = $mainMod SHIFT, Return, exec, $scriptsDir/Dropterminal.sh $term # Dropdown terminal
# Desktop zooming or magnifier
bind = $mainMod ALT, mouse_down, exec, hyprctl keyword cursor:zoom_factor "$(hyprctl getoption cursor:zoom_factor | awk 'NR==1 {factor = $2; if (factor < 1) {factor = 1}; print factor * 2.0}')"
bind = $mainMod ALT, mouse_up, exec, hyprctl keyword cursor:zoom_factor "$(hyprctl getoption cursor:zoom_factor | awk 'NR==1 {factor = $2; if (factor < 1) {factor = 1}; print factor / 2.0}')"
## NOTES for ja (Hyprland version 0.39 (Ubuntu 24.04))
#bind = $mainMod ALT, mouse_down, exec, hyprctl keyword misc:cursor_zoom_factor "$(hyprctl getoption misc:cursor_zoom_factor | awk 'NR==1 {factor = $2; if (factor < 1) {factor = 1}; print factor * 2.0}')"
#bind = $mainMod ALT, mouse_up, exec, hyprctl keyword misc:cursor_zoom_factor "$(hyprctl getoption misc:cursor_zoom_factor | awk 'NR==1 {factor = $2; if (factor < 1) {factor = 1}; print factor / 2.0}')"
# Waybar / Bar related
bind = $mainMod CTRL ALT, B, exec, pkill -SIGUSR1 waybar # Toggle hide/show waybar
bind = $mainMod CTRL, B, exec, $scriptsDir/WaybarStyles.sh # Waybar Styles Menu
bind = $mainMod ALT, B, exec, $scriptsDir/WaybarLayout.sh # Waybar Layout Menu
# Night light toggle (Hyprsunset)
bind = $mainMod, N, exec, $scriptsDir/Hyprsunset.sh toggle
# FEATURES / EXTRAS (UserScripts)
bind = $mainMod SHIFT, M, exec, $UserScripts/RofiBeats.sh # online music using rofi
bind = $mainMod, W, exec, $UserScripts/WallpaperSelect.sh # Select wallpaper to apply
bind = $mainMod SHIFT, W, exec, $UserScripts/WallpaperEffects.sh # Wallpaper Effects by imagemagick
bind = CTRL ALT, W, exec, $UserScripts/WallpaperRandom.sh # Random wallpapers
bind = $mainMod CTRL, O, exec, hyprctl setprop active opaque toggle # disable opacity on active window
bind = $mainMod SHIFT, K, exec, $scriptsDir/KeyBinds.sh # search keybinds via rofi
bind = $mainMod SHIFT, A, exec, $scriptsDir/Animations.sh #hyprland animations menu
bind = $mainMod SHIFT, O, exec, $UserScripts/ZshChangeTheme.sh # Change oh-my-zsh theme
bindln = ALT_L, SHIFT_L, exec, $scriptsDir/SwitchKeyboardLayout.sh # Change keyboard layout globally
bindln = SHIFT_L, ALT_L, exec, $scriptsDir/Tak0-Per-Window-Switch.sh # Change keyboard layout locally for each window
bind = $mainMod ALT, C, exec, $UserScripts/RofiCalc.sh # calculator (qalculate)
# Move current workspaces to monitors (left right up or down)
bind = $mainMod CTRL, F9, movecurrentworkspacetomonitor, l #move current workspace to LEFT monitor
bind = $mainMod CTRL, F10, movecurrentworkspacetomonitor, r #move current workspace to RIGHT monitor
bind = $mainMod CTRL, F11, movecurrentworkspacetomonitor, u #move current workspace to UP monitor
bind = $mainMod CTRL, F12, movecurrentworkspacetomonitor, d #move current workspace to DOWN monitor
# For passthrough keyboard into a VM
# bind = $mainMod ALT, P, submap, passthru
#submap = passthru
# to unbind
#bind = $mainMod ALT, P, submap, reset
#submap = reset

View File

@@ -0,0 +1,120 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# User Settings
# This is where you put your own settings as this will not be touched during update
# if the upgrade.sh is used.
# refer to Hyprland wiki for more info https://wiki.hyprland.org/Configuring/Variables/
# NOTE: some settings are in ~/.config/hypr/UserConfigs/UserDecorAnimations.conf
dwindle {
pseudotile = true
preserve_split = true
#smart_split = true
special_scale_factor = 0.8
}
master {
new_status = master
new_on_top = 1
mfact = 0.5
}
general {
resize_on_border = true
layout = dwindle
}
input {
kb_layout = no
kb_variant =
kb_model =
kb_options =
kb_rules =
repeat_rate = 50
repeat_delay = 300
sensitivity = 0 #mouse sensitivity
#accel_profile = # flat or adaptive or blank or EMPTY means libinputs default mode
numlock_by_default = true
left_handed = false
follow_mouse = 1
float_switch_override_focus = false
touchpad {
disable_while_typing = true
natural_scroll = true
clickfinger_behavior = false
middle_button_emulation = false
tap-to-click = true
drag_lock = false
}
# below for devices with touchdevice ie. touchscreen
touchdevice {
enabled = true
}
# below is for table see link above for proper variables
tablet {
transform = 0
left_handed = 0
}
}
gestures {
gesture = 3, horizontal, workspace
workspace_swipe_distance = 500
workspace_swipe_invert = true
workspace_swipe_min_speed_to_force = 30
workspace_swipe_cancel_ratio = 0.5
workspace_swipe_create_new = true
workspace_swipe_forever = true
#workspace_swipe_use_r = true #uncomment if wanted a forever create a new workspace with swipe right
}
misc {
disable_hyprland_logo = true
disable_splash_rendering = true
vfr = true
vrr = 2
mouse_move_enables_dpms = true
enable_swallow = off
swallow_regex = ^(kitty)$
focus_on_activate = false
initial_workspace_tracking = 0
middle_click_paste = false
enable_anr_dialog = true # Application not Responding (ANR)
anr_missed_pings = 15 # ANR Threshold default 1 is too low
allow_session_lock_restore = true # Prevent lockscreen crash when resume from suspend
}
#opengl {
# nvidia_anti_flicker = true
#}
binds {
workspace_back_and_forth = true
allow_workspace_cycles = true
pass_mouse_when_bound = false
}
#Could help when scaling and not pixelating
xwayland {
enabled = true
force_zero_scaling = true
}
render {
direct_scanout = 0
}
cursor {
sync_gsettings_theme = true
no_hardware_cursors = 2 # change to 1 if want to disable
enable_hyprcursor = true
warp_on_change_workspace = 2
no_warps = true
}

View File

@@ -0,0 +1,206 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# For window rules and layerrules
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
# NOTES: This is only for Hyprland older versions (< 0.48)
# windowrule v2 - tags - add apps under appropriate tag to use the same settings
# browser tags
windowrulev2 = tag +browser, class:^([Ff]irefox|org.mozilla.firefox|[Ff]irefox-esr|[Ff]irefox-bin)$
windowrulev2 = tag +browser, class:^([Gg]oogle-chrome(-beta|-dev|-unstable)?)$
windowrulev2 = tag +browser, class:^(chrome-.+-Default)$ # Chrome PWAs
windowrulev2 = tag +browser, class:^([Cc]hromium)$
windowrulev2 = tag +browser, class:^([Mm]icrosoft-edge(-stable|-beta|-dev|-unstable))$
windowrulev2 = tag +browser, class:^(Brave-browser(-beta|-dev|-unstable)?)$
windowrulev2 = tag +browser, class:^([Tt]horium-browser|[Cc]achy-browser)$
windowrulev2 = tag +browser, class:^(zen-alpha|zen)$
windowrulev2 = tag +notif, class:^(swaync-control-center|swaync-notification-window|swaync-client|class)$
windowrulev2 = tag +KooL_Cheat, title:^(KooL Quick Cheat Sheet)$
windowrulev2 = tag +KooL_Settings, title:^(KooL Hyprland Settings)$
windowrulev2 = tag +KooL-Settings, class:^(nwg-displays|nwg-look)$
# terminal tags
windowrulev2 = tag +terminal, class:^(Alacritty|kitty|kitty-dropterm)$
# email tags
windowrulev2 = tag +email, class:^([Tt]hunderbird|org.gnome.Evolution)$
windowrulev2 = tag +email, class:^(eu.betterbird.Betterbird)$
# project tags
windowrulev2 = tag +projects, class:^(codium|codium-url-handler|VSCodium)$
windowrulev2 = tag +projects, class:^(VSCode|code-url-handler)$
windowrulev2 = tag +projects, class:^(jetbrains-.+)$ # JetBrains IDEs
# screenshare tags
windowrulev2 = tag +screenshare, class:^(com.obsproject.Studio)$
# IM tags
windowrulev2 = tag +im, class:^([Dd]iscord|[Ww]ebCord|[Vv]esktop)$
windowrulev2 = tag +im, class:^([Ff]erdium)$
windowrulev2 = tag +im, class:^([Ww]hatsapp-for-linux)$
windowrulev2 = tag +im, class:^(ZapZap|com.rtosta.zapzap)$
windowrulev2 = tag +im, class:^(org.telegram.desktop|io.github.tdesktop_x64.TDesktop)$
windowrulev2 = tag +im, class:^(teams-for-linux)$
# game tags
windowrulev2 = tag +games, class:^(gamescope)$
windowrulev2 = tag +games, class:^(steam_app_\d+)$
# gamestore tags
windowrulev2 = tag +gamestore, class:^([Ss]team)$
windowrulev2 = tag +gamestore, title:^([Ll]utris)$
windowrulev2 = tag +gamestore, class:^(com.heroicgameslauncher.hgl)$
# file-manager tags
windowrulev2 = tag +file-manager, class:^([Tt]hunar|org.gnome.Nautilus|[Pp]cmanfm-qt)$
windowrulev2 = tag +file-manager, class:^(app.drey.Warp)$
# wallpaper tags
windowrulev2 = tag +wallpaper title:^([Ww]aytrogen)$
windowrulev2 = tag +wallpaper, class:^([Ww]aytrogen)$
# multimedia tags
windowrulev2 = tag +multimedia, class:^([Aa]udacious)$
# settings tags
windowrulev2 = tag +settings, title:^(ROG Control)$
windowrulev2 = tag +settings, class:^(wihotspot(-gui)?)$ # wifi hotspot
windowrulev2 = tag +settings, class:^([Bb]aobab|org.gnome.[Bb]aobab)$ # Disk usage analyzer
windowrulev2 = tag +settings, class:^(gnome-disks|wihotspot(-gui)?)$
windowrulev2 = tag +settings, title:(Kvantum Manager)
windowrulev2 = tag +settings, class:^(file-roller|org.gnome.FileRoller)$ # archive manager
windowrulev2 = tag +settings, class:^(nm-applet|nm-connection-editor|blueman-manager)$
windowrulev2 = tag +settings, class:^(pavucontrol|org.pulseaudio.pavucontrol|com.saivert.pwvucontrol)$
windowrulev2 = tag +settings, class:^(qt5ct|qt6ct|[Yy]ad)$
windowrulev2 = tag +settings, class:(xdg-desktop-portal-gtk)
windowrulev2 = tag +settings, class:^(org.kde.polkit-kde-authentication-agent-1)$
windowrulev2 = tag +settings, class:^([Rr]ofi)$
# viewer tags
windowrulev2 = tag +viewer, class:^(gnome-system-monitor|org.gnome.SystemMonitor|io.missioncenter.MissionCenter)$ # system monitor
windowrulev2 = tag +viewer, class:^(evince)$ # document viewer
windowrulev2 = tag +viewer, class:^(eog|org.gnome.Loupe)$ # image viewer
# POSITION
# windowrulev2 = center,floating:1 # warning, it cause even the menu to float and center.
windowrulev2 = center, tag:KooL_Cheat*
windowrulev2 = center, class:([Tt]hunar), title:negative:(.*[Tt]hunar.*)
windowrulev2 = center, title:^(ROG Control)$
windowrulev2 = center, tag:KooL-Settings*
windowrulev2 = center, title:^(Keybindings)$
windowrulev2 = center, class:^(pavucontrol|org.pulseaudio.pavucontrol|com.saivert.pwvucontrol)$
windowrulev2 = center, class:^([Ww]hatsapp-for-linux|ZapZap|com.rtosta.zapzap)$
windowrulev2 = center, class:^([Ff]erdium)$
windowrulev2 = move 72% 7%,title:^(Picture-in-Picture)$
#windowrulev2 = move 72% 7%,title:^(Firefox)$
# windowrule v2 to avoid idle for fullscreen apps
#windowrulev2 = idleinhibit fullscreen, class:^(*)$
#windowrulev2 = idleinhibit fullscreen, title:^(*)$
windowrulev2 = idleinhibit fullscreen, fullscreen:1
# windowrule v2 move to workspace
windowrulev2 = workspace 1, tag:email*
windowrulev2 = workspace 2, tag:browser*
#windowrulev2 = workspace 3, class:^([Tt]hunar)$
#windowrulev2 = workspace 3, tag:projects*
windowrulev2 = workspace 5, tag:gamestore*
windowrulev2 = workspace 7, tag:im*
windowrulev2 = workspace 8, tag:games*
# windowrule v2 move to workspace (silent)
windowrulev2 = workspace 4 silent, tag:screenshare*
windowrulev2 = workspace 6 silent, class:^(virt-manager)$
windowrulev2 = workspace 6 silent, class:^(.virt-manager-wrapped)$
windowrulev2 = workspace 9 silent, tag:multimedia*
# FLOAT
windowrulev2 = float, tag:KooL_Cheat*
windowrulev2 = float, tag:wallpaper*
windowrulev2 = float, tag:settings*
windowrulev2 = float, tag:viewer*
windowrulev2 = float, tag:KooL-Settings*
windowrulev2 = float, class:([Zz]oom|onedriver|onedriver-launcher)$
windowrulev2 = float, class:(org.gnome.Calculator), title:(Calculator)
windowrulev2 = float, class:^(mpv|com.github.rafostar.Clapper)$
windowrulev2 = float, class:^([Qq]alculate-gtk)$
#windowrulev2 = float, class:^([Ww]hatsapp-for-linux|ZapZap|com.rtosta.zapzap)$
windowrulev2 = float, class:^([Ff]erdium)$
windowrulev2 = float, title:^(Picture-in-Picture)$
#windowrulev2 = float, title:^(Firefox)$
#windowrule v2 - float popups and dialogue
windowrulev2 = float, title:^(Authentication Required)$
windowrulev2 = center, title:^(Authentication Required)$
windowrulev2 = float, class:(codium|codium-url-handler|VSCodium), title:negative:(.*codium.*|.*VSCodium.*)
windowrulev2 = float, class:^(com.heroicgameslauncher.hgl)$, title:negative:(Heroic Games Launcher)
windowrulev2 = float, class:^([Ss]team)$, title:negative:^([Ss]team)$
windowrulev2 = float, class:([Tt]hunar), title:negative:(.*[Tt]hunar.*)
#windowrulev2 = float, class:(electron), title:(Add Folder to Workspace)
windowrulev2 = float, title:^(Add Folder to Workspace)$
windowrulev2 = size 70% 60%, title:^(Add Folder to Workspace)$
windowrulev2 = center, title:^(Add Folder to Workspace)$
windowrulev2 = float, initialTitle:(Open Files)
windowrulev2 = size 70% 60%, initialTitle:(Open Files)
windowrulev2 = float, title:^(SDDM Background)$ #KooL's Dots YAD for setting SDDM background
windowrulev2 = center, title:^(SDDM Background)$ #KooL's Dots YAD for setting SDDM background
windowrulev2 = size 16% 12%, title:^(SDDM Background)$ #KooL's Dots YAD for setting SDDM background
# OPACITY
windowrulev2 = opacity 0.9 0.7, tag:browser*
windowrulev2 = opacity 0.9 0.8, tag:projects*
windowrulev2 = opacity 0.94 0.86, tag:im*
windowrulev2 = opacity 0.94 0.86, tag:multimedia*
windowrulev2 = opacity 0.9 0.8, tag:file-manager*
windowrulev2 = opacity 0.8 0.7, tag:terminal*
windowrulev2 = opacity 0.8 0.7, tag:settings*
windowrulev2 = opacity 0.82 0.75, tag:viewer*
windowrulev2 = opacity 0.9 0.7, tag:wallpaper*
windowrulev2 = opacity 0.8 0.7, class:^(gedit|org.gnome.TextEditor|mousepad)$
windowrulev2 = opacity 0.9 0.8, class:^(deluge)$
windowrulev2 = opacity 0.9 0.8, class:^(im.riot.Riot)$ # Element matrix client
windowrulev2 = opacity 0.9 0.8, class:^(seahorse)$ # gnome-keyring gui
windowrulev2 = opacity 0.95 0.75, title:^(Picture-in-Picture)$
# SIZE
windowrulev2 = size 65% 90%, tag:KooL_Cheat*
windowrulev2 = size 70% 70%, tag:wallpaper*
windowrulev2 = size 70% 70%, tag:settings*
windowrulev2 = size 60% 70%, class:^([Ww]hatsapp-for-linux|ZapZap|com.rtosta.zapzap)$
windowrulev2 = size 60% 70%, class:^([Ff]erdium)$
#windowrulev2 = size 25% 25%, title:^(Picture-in-Picture)$
#windowrulev2 = size 25% 25%, title:^(Firefox)$
# PINNING
windowrulev2 = pin, title:^(Picture-in-Picture)$
#windowrulev2 = pin,title:^(Firefox)$
# windowrule v2 - extras
windowrulev2 = keepaspectratio, title:^(Picture-in-Picture)$
# BLUR & FULLSCREEN
windowrulev2 = noblur, tag:games*
windowrulev2 = fullscreen, tag:games*
#windowrulev2 = bordercolor rgb(EE4B55) rgb(880808), fullscreen:1
#windowrulev2 = bordercolor rgb(282737) rgb(1E1D2D), floating:1
#windowrulev2 = opacity 0.8 0.8, pinned:1
# LAYER RULES
layerrule = blur, rofi
layerrule = ignorezero, rofi
layerrule = blur, notifications
layerrule = ignorezero, notifications
#layerrule = ignorealpha 0.5, tag:notif*
#layerrule = ignorezero, class:^([Rr]ofi)$
#layerrule = blur, class:^([Rr]ofi)$
#layerrule = unset,class:^([Rr]ofi)$
#layerrule = ignorezero, <rofi>
#layerrule = ignorezero, overview
#layerrule = blur, overview

View File

@@ -0,0 +1,235 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# For window rules and layerrules
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
# NOTES: This is only for Hyprland > 0.48
# note for ja: This should NOT be implemented on Debian and Ubuntu
# windowrule - tags - add apps under appropriate tag to use the same settings
# browser tags
windowrule = tag +browser, class:^([Ff]irefox|org.mozilla.firefox|[Ff]irefox-esr|[Ff]irefox-bin)$
windowrule = tag +browser, class:^([Gg]oogle-chrome(-beta|-dev|-unstable)?)$
windowrule = tag +browser, class:^(chrome-.+-Default)$ # Chrome PWAs
windowrule = tag +browser, class:^([Cc]hromium)$
windowrule = tag +browser, class:^([Mm]icrosoft-edge(-stable|-beta|-dev|-unstable))$
windowrule = tag +browser, class:^(Brave-browser(-beta|-dev|-unstable)?)$
windowrule = tag +browser, class:^([Tt]horium-browser|[Cc]achy-browser)$
windowrule = tag +browser, class:^(zen-alpha|zen)$
# notif tags
windowrule = tag +notif, class:^(swaync-control-center|swaync-notification-window|swaync-client|class)$
# KooL settings tag
windowrule = tag +KooL_Cheat, title:^(KooL Quick Cheat Sheet)$
windowrule = tag +KooL_Settings, title:^(KooL Hyprland Settings)$
windowrule = tag +KooL-Settings, class:^(nwg-displays|nwg-look)$
# terminal tags
windowrule = tag +terminal, class:^(Alacritty|kitty|kitty-dropterm)$
# email tags
windowrule = tag +email, class:^([Tt]hunderbird|org.gnome.Evolution)$
windowrule = tag +email, class:^(eu.betterbird.Betterbird)$
# project tags
windowrule = tag +projects, class:^(codium|codium-url-handler|VSCodium)$
windowrule = tag +projects, class:^(VSCode|code-url-handler)$
windowrule = tag +projects, class:^(jetbrains-.+)$ # JetBrains IDEs
# screenshare tags
windowrule = tag +screenshare, class:^(com.obsproject.Studio)$
# IM tags
windowrule = tag +im, class:^([Dd]iscord|[Ww]ebCord|[Vv]esktop)$
windowrule = tag +im, class:^([Ff]erdium)$
windowrule = tag +im, class:^([Ww]hatsapp-for-linux)$
windowrule = tag +im, class:^(ZapZap|com.rtosta.zapzap)$
windowrule = tag +im, class:^(org.telegram.desktop|io.github.tdesktop_x64.TDesktop)$
windowrule = tag +im, class:^(teams-for-linux)$
windowrule = tag +im, class:^(im.riot.Riot|Element)$ # Element Matrix client
# game tags
windowrule = tag +games, class:^(gamescope)$
windowrule = tag +games, class:^(steam_app_\d+)$
# gamestore tags
windowrule = tag +gamestore, class:^([Ss]team)$
windowrule = tag +gamestore, title:^([Ll]utris)$
windowrule = tag +gamestore, class:^(com.heroicgameslauncher.hgl)$
# file-manager tags
windowrule = tag +file-manager, class:^([Tt]hunar|org.gnome.Nautilus|[Pp]cmanfm-qt)$
windowrule = tag +file-manager, class:^(app.drey.Warp)$
# wallpaper tags
windowrule = tag +wallpaper, class:^([Ww]aytrogen)$
# multimedia tags
windowrule = tag +multimedia, class:^([Aa]udacious)$
# multimedia-video tags
windowrule = tag +multimedia_video, class:^([Mm]pv|vlc)$
# settings tags
windowrule = tag +settings, title:^(ROG Control)$
windowrule = tag +settings, class:^(wihotspot(-gui)?)$ # wifi hotspot
windowrule = tag +settings, class:^([Bb]aobab|org.gnome.[Bb]aobab)$ # Disk usage analyzer
windowrule = tag +settings, class:^(gnome-disks|wihotspot(-gui)?)$
windowrule = tag +settings, title:(Kvantum Manager)
windowrule = tag +settings, class:^(file-roller|org.gnome.FileRoller)$ # archive manager
windowrule = tag +settings, class:^(nm-applet|nm-connection-editor|blueman-manager)$
windowrule = tag +settings, class:^(pavucontrol|org.pulseaudio.pavucontrol|com.saivert.pwvucontrol)$
windowrule = tag +settings, class:^(qt5ct|qt6ct|[Yy]ad)$
windowrule = tag +settings, class:(xdg-desktop-portal-gtk)
windowrule = tag +settings, class:^(org.kde.polkit-kde-authentication-agent-1)$
windowrule = tag +settings, class:^([Rr]ofi)$
# viewer tags
windowrule = tag +viewer, class:^(gnome-system-monitor|org.gnome.SystemMonitor|io.missioncenter.MissionCenter)$ # system monitor
windowrule = tag +viewer, class:^(evince)$ # document viewer
windowrule = tag +viewer, class:^(eog|org.gnome.Loupe)$ # image viewer
# Some special override rules
windowrule = noblur, tag:multimedia_video*
windowrule = opacity 1.0, tag:multimedia_video*
# POSITION
# windowrule = center,floating:1 # warning, it cause even the menu to float and center.
windowrule = center, tag:KooL_Cheat*
windowrule = center, class:([Tt]hunar), title:negative:(.*[Tt]hunar.*)
windowrule = center, title:^(ROG Control)$
windowrule = center, tag:KooL-Settings*
windowrule = center, title:^(Keybindings)$
windowrule = center, class:^(pavucontrol|org.pulseaudio.pavucontrol|com.saivert.pwvucontrol)$
windowrule = center, class:^([Ww]hatsapp-for-linux|ZapZap|com.rtosta.zapzap)$
windowrule = center, class:^([Ff]erdium)$
windowrule = move 72% 7%,title:^(Picture-in-Picture)$
#windowrule = move 72% 7%,title:^(Firefox)$
# windowrule to avoid idle for fullscreen apps
#windowrule = idleinhibit fullscreen, class:^(*)$
#windowrule = idleinhibit fullscreen, title:^(*)$
windowrule = idleinhibit fullscreen, fullscreen:1
# windowrule move to workspace
windowrule = workspace 1, tag:email*
windowrule = workspace 2, tag:browser*
#windowrule = workspace 3, class:^([Tt]hunar)$
#windowrule = workspace 3, tag:projects*
windowrule = workspace 5, tag:gamestore*
windowrule = workspace 7, tag:im*
windowrule = workspace 8, tag:games*
# windowrule move to workspace (silent)
windowrule = workspace 4 silent, tag:screenshare*
windowrule = workspace 6 silent, class:^(virt-manager)$
windowrule = workspace 6 silent, class:^(.virt-manager-wrapped)$
windowrule = workspace 9 silent, tag:multimedia*
# FLOAT
windowrule = float, tag:KooL_Cheat*
windowrule = float, tag:wallpaper*
windowrule = float, tag:settings*
windowrule = float, tag:viewer*
windowrule = float, tag:KooL-Settings*
windowrule = float, class:([Zz]oom|onedriver|onedriver-launcher)$
windowrule = float, class:(org.gnome.Calculator), title:(Calculator)
windowrule = float, class:^(mpv|com.github.rafostar.Clapper)$
windowrule = float, class:^([Qq]alculate-gtk)$
#windowrule = float, class:^([Ww]hatsapp-for-linux|ZapZap|com.rtosta.zapzap)$
windowrule = float, class:^([Ff]erdium)$
windowrule = float, title:^(Picture-in-Picture)$
#windowrule = float, title:^(Firefox)$
# windowrule - ######### float popups and dialogue #######
windowrule = float, title:^(Authentication Required)$
windowrule = center, title:^(Authentication Required)$
windowrule = float, class:(codium|codium-url-handler|VSCodium), title:negative:(.*codium.*|.*VSCodium.*)
windowrule = float, class:^(com.heroicgameslauncher.hgl)$, title:negative:(Heroic Games Launcher)
windowrule = float, class:^([Ss]team)$, title:negative:^([Ss]team)$
windowrule = float, class:([Tt]hunar), title:negative:(.*[Tt]hunar.*)
windowrule = float, title:^(Add Folder to Workspace)$
windowrule = size 70% 60%, title:^(Add Folder to Workspace)$
windowrule = center, title:^(Add Folder to Workspace)$
windowrule = float, title:^(Save As)$
windowrule = size 70% 60%, title:^(Save As)$
windowrule = center, title:^(Save As)$
windowrule = float, initialTitle:(Open Files)
windowrule = size 70% 60%, initialTitle:(Open Files)
windowrule = float, title:^(SDDM Background)$ #KooL's Dots YAD for setting SDDM background
windowrule = center, title:^(SDDM Background)$ #KooL's Dots YAD for setting SDDM background
windowrule = size 16% 12%, title:^(SDDM Background)$ #KooL's Dots YAD for setting SDDM background
# END of float popups and dialogue #######
# OPACITY
windowrule = opacity 0.9 0.7, tag:browser*
windowrule = opacity 0.9 0.8, tag:projects*
windowrule = opacity 0.94 0.86, tag:im*
windowrule = opacity 0.94 0.86, tag:multimedia*
windowrule = opacity 0.9 0.8, tag:file-manager*
windowrule = opacity 0.8 0.7, tag:terminal*
windowrule = opacity 0.8 0.7, tag:settings*
windowrule = opacity 0.82 0.75, tag:viewer*
windowrule = opacity 0.9 0.7, tag:wallpaper*
windowrule = opacity 0.8 0.7, class:^(gedit|org.gnome.TextEditor|mousepad)$
windowrule = opacity 0.9 0.8, class:^(deluge)$
windowrule = opacity 0.9 0.8, class:^(seahorse)$ # gnome-keyring gui
windowrule = opacity 0.95 0.75, title:^(Picture-in-Picture)$
windowrule = opacity 0.9,class:^(code)$
# SIZE
windowrule = size 65% 90%, tag:KooL_Cheat*
windowrule = size 70% 70%, tag:wallpaper*
windowrule = size 70% 70%, tag:settings*
windowrule = size 60% 70%, class:^([Ww]hatsapp-for-linux|ZapZap|com.rtosta.zapzap)$
windowrule = size 60% 70%, class:^([Ff]erdium)$
#windowrule = size 25% 25%, title:^(Picture-in-Picture)$
#windowrule = size 25% 25%, title:^(Firefox)$
# PINNING
windowrule = pin, title:^(Picture-in-Picture)$
#windowrule = pin,title:^(Firefox)$
# windowrule - extras
windowrule = keepaspectratio, title:^(Picture-in-Picture)$
# BLUR & FULLSCREEN
windowrule = noblur, tag:games*
windowrule = fullscreen, tag:games*
#This not gonna take the focus to the window that appears when hovering over some of the parts of the IntelliJ Products
windowrule = noinitialfocus, class:^(jetbrains-*)
windowrule = noinitialfocus, title:^(wind.*)$
#This will gonna make the VS Code bluer like other apps
windowrule = opacity 0.8,class:^(code)$
#windowrule = bordercolor rgb(EE4B55) rgb(880808), fullscreen:1
#windowrule = bordercolor rgb(282737) rgb(1E1D2D), floating:1
#windowrule = opacity 0.8 0.8, pinned:1
# LAYER RULES
layerrule = blur, rofi
layerrule = ignorezero, rofi
layerrule = blur, notifications
layerrule = ignorezero, notifications
layerrule = blur, quickshell:overview
layerrule = ignorezero, quickshell:overview
layerrule = ignorealpha 0.5, quickshell:overview
#layerrule = ignorealpha 0.5, tag:notif*
#layerrule = ignorezero, class:^([Rr]ofi)$
#layerrule = blur, class:^([Rr]ofi)$
#layerrule = unset,class:^([Rr]ofi)$
#layerrule = ignorezero, <rofi>
#layerrule = ignorezero, overview
#layerrule = blur, overview

View File

@@ -0,0 +1,32 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# NOTE: THIS IS NOT BEING SOURCED by hyprland
# It is only here as a guide if you want to do it manually
# The file you should edit is ~/.config/hypr/workspaces.conf
# Since that is the work space rules being sourced by hyprland
# use nwg-displays to handle your workspace rules.
# You can set workspace rules to achieve workspace-specific behaviors.
# For instance, you can define a workspace where all windows are drawn without borders or gaps.
# https://wiki.hyprland.org/Configuring/Workspace-Rules/
# Assigning workspace to a certain monitor. Below are just examples
# workspace = 1, monitor:eDP-1
# workspace = 2, monitor:eDP-1
# workspace = 3, monitor:eDP-1
# workspace = 4, monitor:eDP-1
# workspace = 5, monitor:DP-2
# workspace = 6, monitor:DP-2
# workspace = 7, monitor:DP-2
# workspace = 8, monitor:DP-2
# example rules (from wiki)
# workspace = 3, rounding:false, decorate:false
# workspace = name:coding, rounding:false, decorate:false, gapsin:0, gapsout:0, border:false, decorate:false, monitor:DP-1
# workspace = 8,bordersize:8
# workspace = name:Hello, monitor:DP-1, default:true
# workspace = name:gaming, monitor:desc:Chimei Innolux Corporation 0x150C, default:true
# workspace = 5, on-created-empty:[float] firefox
# workspace = special:scratchpad, on-created-empty:foot

5
UserScripts/00-Readme Executable file
View File

@@ -0,0 +1,5 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# Place your new scripts here.
# If you need to edit a script from main script (~/.config/hypr/scripts), copy it on this directory, and edit.
# Make sure to update as well the keybinds in ~/.config/hypr/UserConfigs directory if any script is linked to it

14
UserScripts/RainbowBorders.sh Executable file
View File

@@ -0,0 +1,14 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# for rainbow borders animation
function random_hex() {
random_hex=("0xff$(openssl rand -hex 3)")
echo $random_hex
}
# rainbow colors only for active window
hyprctl keyword general:col.active_border $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) 270deg
# rainbow colors for inactive window (uncomment to take effect)
#hyprctl keyword general:col.inactive_border $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) $(random_hex) 270deg

153
UserScripts/RofiBeats.sh Executable file
View File

@@ -0,0 +1,153 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# For Rofi Beats to play online Music or Locally saved media files
# Variables
mDIR="$HOME/Music/"
iDIR="$HOME/.config/swaync/icons"
rofi_theme="$HOME/.config/rofi/config-rofi-Beats.rasi"
rofi_theme_1="$HOME/.config/rofi/config-rofi-Beats-menu.rasi"
# Online Stations. Edit as required
declare -A online_music=(
["FM - Easy Rock 96.3 📻🎶"]="https://radio-stations-philippines.com/easy-rock"
["FM - Easy Rock - Baguio 91.9 📻🎶"]="https://radio-stations-philippines.com/easy-rock-baguio"
["FM - Love Radio 90.7 📻🎶"]="https://radio-stations-philippines.com/love"
["FM - WRock - CEBU 96.3 📻🎶"]="https://onlineradio.ph/126-96-3-wrock.html"
["FM - Fresh Philippines 📻🎶"]="https://onlineradio.ph/553-fresh-fm.html"
["Radio - Lofi Girl 🎧🎶"]="https://play.streamafrica.net/lofiradio"
["Radio - Chillhop 🎧🎶"]="http://stream.zeno.fm/fyn8eh3h5f8uv"
["Radio - Ibiza Global 🎧🎶"]="https://filtermusic.net/ibiza-global"
["Radio - Metal Music 🎧🎶"]="https://tunein.com/radio/mETaLmuSicRaDio-s119867/"
["YT - Wish 107.5 YT Pinoy HipHop 📻🎶"]="https://youtube.com/playlist?list=PLkrzfEDjeYJnmgMYwCKid4XIFqUKBVWEs&si=vahW_noh4UDJ5d37"
["YT - Youtube Top 100 Songs Global 📹🎶"]="https://youtube.com/playlist?list=PL4fGSI1pDJn6puJdseH2Rt9sMvt9E2M4i&si=5jsyfqcoUXBCSLeu"
["YT - Wish 107.5 YT Wishclusives 📹🎶"]="https://youtube.com/playlist?list=PLkrzfEDjeYJn5B22H9HOWP3Kxxs-DkPSM&si=d_Ld2OKhGvpH48WO"
["YT - Relaxing Piano Music 🎹🎶"]="https://youtu.be/6H7hXzjFoVU?si=nZTPREC9lnK1JJUG"
["YT - Youtube Remix 📹🎶"]="https://youtube.com/playlist?list=PLeqTkIUlrZXlSNn3tcXAa-zbo95j0iN-0"
["YT - Korean Drama OST 📹🎶"]="https://youtube.com/playlist?list=PLUge_o9AIFp4HuA-A3e3ZqENh63LuRRlQ"
["YT - lofi hip hop radio beats 📹🎶"]="https://www.youtube.com/live/jfKfPfyJRdk?si=PnJIA9ErQIAw6-qd"
["YT - Relaxing Piano Jazz Music 🎹🎶"]="https://youtu.be/85UEqRat6E4?si=jXQL1Yp2VP_G6NSn"
)
# Populate local_music array with files from music directory and subdirectories
populate_local_music() {
local_music=()
filenames=()
while IFS= read -r file; do
local_music+=("$file")
filenames+=("$(basename "$file")")
done < <(find -L "$mDIR" -type f \( -iname "*.mp3" -o -iname "*.flac" -o -iname "*.wav" -o -iname "*.ogg" -o -iname "*.mp4" \))
}
# Function for displaying notifications
notification() {
notify-send -u normal -i "$iDIR/music.png" "Now Playing:" "$@"
}
# Main function for playing local music
play_local_music() {
populate_local_music
# Prompt the user to select a song
choice=$(printf "%s\n" "${filenames[@]}" | rofi -i -dmenu -config $rofi_theme)
if [ -z "$choice" ]; then
exit 1
fi
# Find the corresponding file path based on user's choice and set that to play the song then continue on the list
for (( i=0; i<"${#filenames[@]}"; ++i )); do
if [ "${filenames[$i]}" = "$choice" ]; then
if music_playing; then
stop_music
fi
notification "$choice"
mpv --playlist-start="$i" --loop-playlist --vid=no "${local_music[@]}"
break
fi
done
}
# Main function for shuffling local music
shuffle_local_music() {
if music_playing; then
stop_music
fi
notification "Shuffle Play local music"
# Play music in $mDIR on shuffle
mpv --shuffle --loop-playlist --vid=no "$mDIR"
}
# Main function for playing online music
play_online_music() {
choice=$(for online in "${!online_music[@]}"; do
echo "$online"
done | sort | rofi -i -dmenu -config "$rofi_theme")
if [ -z "$choice" ]; then
exit 1
fi
link="${online_music[$choice]}"
if music_playing; then
stop_music
fi
notification "$choice"
# Play the selected online music using mpv
mpv --shuffle --vid=no "$link"
}
# Function to check if music is already playing
music_playing() {
pgrep -x "mpv" > /dev/null
}
# Function to stop music and kill mpv processes
stop_music() {
mpv_pids=$(pgrep -x mpv)
if [ -n "$mpv_pids" ]; then
# Get the PID of the mpv process used by mpvpaper (using the unique argument added)
mpvpaper_pid=$(ps aux | grep -- 'unique-wallpaper-process' | grep -v 'grep' | awk '{print $2}')
for pid in $mpv_pids; do
if ! echo "$mpvpaper_pid" | grep -q "$pid"; then
kill -9 $pid || true
fi
done
notify-send -u low -i "$iDIR/music.png" "Music stopped" || true
fi
}
user_choice=$(printf "%s\n" \
"Play from Online Stations" \
"Play from Music directory" \
"Shuffle Play from Music directory" \
"Stop RofiBeats" \
| rofi -dmenu -config $rofi_theme_1)
echo "User choice: $user_choice"
case "$user_choice" in
"Play from Online Stations")
play_online_music
;;
"Play from Music directory")
play_local_music
;;
"Shuffle Play from Music directory")
shuffle_local_music
;;
"Stop RofiBeats")
if music_playing; then
stop_music
fi
;;
*)
;;
esac

30
UserScripts/RofiCalc.sh Executable file
View File

@@ -0,0 +1,30 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */
# /* Calculator (using qalculate) and rofi */
# /* Submitted by: https://github.com/JosephArmas */
rofi_theme="$HOME/.config/rofi/config-calc.rasi"
# Kill Rofi if already running before execution
if pgrep -x "rofi" >/dev/null; then
pkill rofi
fi
# main function
while true; do
result=$(
rofi -i -dmenu \
-config $rofi_theme \
-mesg "$result = $calc_result"
)
if [ $? -ne 0 ]; then
exit
fi
if [ -n "$result" ]; then
calc_result=$(qalc -t "$result")
echo "$calc_result" | wl-copy
fi
done

View File

@@ -0,0 +1,90 @@
#!/bin/bash
# USAGE / ІНСТРУКЦІЯ:
# 1) Run from terminal:
# ./dispatch.sh <application_command> <target_workspace_number>
# Example:
# ./dispatch.sh discord 2
#
# 2) Call from Hyprland config (in hyprland.conf file):
# exec-once = /path/to/dispatch.sh <application_command> <target_workspace_number>
#
# Logs are saved in dispatch.log file next to the script.
# If the window doesn't appear or is dispatched incorrectly — info will be there.
#
# Notes:
# - Script waits about ~9 seconds (30 iterations of 0.3 sec) for window to appear.
# - Uses hyprctl and jq, so these tools must be installed.
#
# USAGE / ІНСТРУКЦІЯ:
# 1) Запуск з терміналу:
# ./dispatch.sh <application_command> <target_workspace_number>
# Наприклад:
# ./dispatch.sh discord 2
#
# 2) Виклик з конфігурації Hyprland (у файлі hyprland.conf):
# exec-once = /path/to/dispatch.sh <application_command> <target_workspace_number>
#
# Логи зберігаються у файлі dispatch.log поруч зі скриптом.
# Якщо вікно не з'явилось або неправильно диспатчилось — інформація там.
#
# Примітки:
# - Скрипт чекає до ~9 секунд (30 ітерацій по 0.3 сек) поки вікно з'явиться.
# - Використовує hyprctl і jq, тому ці інструменти мають бути встановлені.
LOGFILE="$(dirname "$0")/dispatch.log"
# Log file path located next to the script.
# Файл логів розташований поруч зі скриптом.
APP=$1
# The application command or window class to launch or match.
# Команда для запуску аплікації або клас вікна для пошуку.
TARGET_WORKSPACE=$2
# The target workspace number where the window should be moved.
# Цільовий номер воркспейсу, куди потрібно перемістити вікно.
# Check if required arguments are provided.
# Перевірка наявності необхідних параметрів.
if [[ -z "$APP" || -z "$TARGET_WORKSPACE" ]]; then
echo "Usage: $0 <application_command> <target_workspace_number>" >> "$LOGFILE" 2>&1
exit 1
fi
echo "Starting dispatch of '$APP' to workspace $TARGET_WORKSPACE at $(date)" >> "$LOGFILE"
# Starting the dispatch process and logging the event.
# Початок процесу диспатчу, запис у лог.
# Avoid early workspace focus issues by switching workspace first.
# Уникаємо проблем з раннім фокусом, спочатку переключаємо воркспейс.
hyprctl dispatch workspace "$TARGET_WORKSPACE" >> "$LOGFILE" 2>&1
sleep 0.4
# Launch the application in the background and disown it.
# Запускаємо аплікацію у фоновому режимі та відв’язуємо від терміналу.
$APP & disown
pid=$!
echo "Launched '$APP' with PID $pid" >> "$LOGFILE"
# Log the launched process ID.
# Лог процесу запуску з PID.
# Wait for the application window to appear (matching window class).
# Чекаємо появи вікна аплікації (за класом вікна).
for i in {1..30}; do
win=$(hyprctl clients -j | jq -r --arg APP "$APP" '
.[] | select(.class | test($APP;"i")) | .address' 2>>"$LOGFILE")
if [[ -n "$win" ]]; then
echo "Found window $win for app '$APP', moving to workspace $TARGET_WORKSPACE" >> "$LOGFILE"
# Move the window to the target workspace.
# Переміщаємо вікно на цільовий воркспейс.
hyprctl dispatch movetoworkspace "$TARGET_WORKSPACE,address:$win" >> "$LOGFILE" 2>&1
exit 0
fi
sleep 0.3
done
echo "ERROR: Window for '$APP' was NOT found or dispatched properly to workspace $TARGET_WORKSPACE at $(date)" >> "$LOGFILE"
# Log error if window was not found or dispatched correctly.
# Запис помилки, якщо вікно не знайдено або неправильно диспатчено.
exit 1

View File

@@ -0,0 +1,42 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# source https://wiki.archlinux.org/title/Hyprland#Using_a_script_to_change_wallpaper_every_X_minutes
# This script will randomly go through the files of a directory, setting it
# up as the wallpaper at regular intervals
#
# NOTE: this script uses bash (not POSIX shell) for the RANDOM variable
wallust_refresh=$HOME/.config/hypr/scripts/RefreshNoWaybar.sh
focused_monitor=$(hyprctl monitors | awk '/^Monitor/{name=$2} /focused: yes/{print name}')
if [[ $# -lt 1 ]] || [[ ! -d $1 ]]; then
echo "Usage:
$0 <dir containing images>"
exit 1
fi
# Edit below to control the images transition
export SWWW_TRANSITION_FPS=60
export SWWW_TRANSITION_TYPE=simple
# This controls (in seconds) when to switch to the next image
INTERVAL=1800
while true; do
find "$1" \
| while read -r img; do
echo "$((RANDOM % 1000)):$img"
done \
| sort -n | cut -d':' -f2- \
| while read -r img; do
swww img -o $focused_monitor "$img"
# Regenerate colors from the exact image path to avoid cache races
$HOME/.config/hypr/scripts/WallustSwww.sh "$img"
# Refresh UI components that depend on wallust output
$wallust_refresh
sleep $INTERVAL
done
done

148
UserScripts/WallpaperEffects.sh Executable file
View File

@@ -0,0 +1,148 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# Wallpaper Effects using ImageMagick (SUPER SHIFT W)
# Variables
terminal=kitty
wallpaper_current="$HOME/.config/hypr/wallpaper_effects/.wallpaper_current"
wallpaper_output="$HOME/.config/hypr/wallpaper_effects/.wallpaper_modified"
SCRIPTSDIR="$HOME/.config/hypr/scripts"
focused_monitor=$(hyprctl monitors -j | jq -r '.[] | select(.focused) | .name')
rofi_theme="$HOME/.config/rofi/config-wallpaper-effect.rasi"
# Directory for swaync
iDIR="$HOME/.config/swaync/images"
iDIRi="$HOME/.config/swaync/icons"
# swww transition config
FPS=60
TYPE="wipe"
DURATION=2
BEZIER=".43,1.19,1,.4"
SWWW_PARAMS="--transition-fps $FPS --transition-type $TYPE --transition-duration $DURATION --transition-bezier $BEZIER"
# Define ImageMagick effects
declare -A effects=(
["No Effects"]="no-effects"
["Black & White"]="magick $wallpaper_current -colorspace gray -sigmoidal-contrast 10,40% $wallpaper_output"
["Blurred"]="magick $wallpaper_current -blur 0x10 $wallpaper_output"
["Charcoal"]="magick $wallpaper_current -charcoal 0x5 $wallpaper_output"
["Edge Detect"]="magick $wallpaper_current -edge 1 $wallpaper_output"
["Emboss"]="magick $wallpaper_current -emboss 0x5 $wallpaper_output"
["Frame Raised"]="magick $wallpaper_current +raise 150 $wallpaper_output"
["Frame Sunk"]="magick $wallpaper_current -raise 150 $wallpaper_output"
["Negate"]="magick $wallpaper_current -negate $wallpaper_output"
["Oil Paint"]="magick $wallpaper_current -paint 4 $wallpaper_output"
["Posterize"]="magick $wallpaper_current -posterize 4 $wallpaper_output"
["Polaroid"]="magick $wallpaper_current -polaroid 0 $wallpaper_output"
["Sepia Tone"]="magick $wallpaper_current -sepia-tone 65% $wallpaper_output"
["Solarize"]="magick $wallpaper_current -solarize 80% $wallpaper_output"
["Sharpen"]="magick $wallpaper_current -sharpen 0x5 $wallpaper_output"
["Vignette"]="magick $wallpaper_current -vignette 0x3 $wallpaper_output"
["Vignette-black"]="magick $wallpaper_current -background black -vignette 0x3 $wallpaper_output"
["Zoomed"]="magick $wallpaper_current -gravity Center -extent 1:1 $wallpaper_output"
)
# Function to apply no effects
no-effects() {
swww img -o "$focused_monitor" "$wallpaper_current" $SWWW_PARAMS &&
wait $!
wallust run "$wallpaper_current" -s &&
wait $!
# Refresh rofi, waybar, wallust palettes
sleep 2
"$SCRIPTSDIR/Refresh.sh"
notify-send -u low -i "$iDIR/ja.png" "No wallpaper" "effects applied"
# copying wallpaper for rofi menu
cp "$wallpaper_current" "$wallpaper_output"
}
# Function to run rofi menu
main() {
# Populate rofi menu options
options=("No Effects")
for effect in "${!effects[@]}"; do
[[ "$effect" != "No Effects" ]] && options+=("$effect")
done
choice=$(printf "%s\n" "${options[@]}" | LC_COLLATE=C sort | rofi -dmenu -i -config $rofi_theme)
# Process user choice
if [[ -n "$choice" ]]; then
if [[ "$choice" == "No Effects" ]]; then
no-effects
elif [[ "${effects[$choice]+exists}" ]]; then
# Apply selected effect
notify-send -u normal -i "$iDIR/ja.png" "Applying:" "$choice effects"
eval "${effects[$choice]}"
# intial kill process
for pid in swaybg mpvpaper; do
killall -SIGUSR1 "$pid"
done
sleep 1
swww img -o "$focused_monitor" "$wallpaper_output" $SWWW_PARAMS &
sleep 2
wallust run "$wallpaper_output" -s &
sleep 1
# Refresh rofi, waybar, wallust palettes
"${SCRIPTSDIR}/Refresh.sh"
notify-send -u low -i "$iDIR/ja.png" "$choice" "effects applied"
else
echo "Effect '$choice' not recognized."
fi
fi
}
# Check if rofi is already running and kill it
if pidof rofi > /dev/null; then
pkill rofi
fi
main
sleep 1
if [[ -n "$choice" ]]; then
# Resolve SDDM themes directory (standard and NixOS path)
sddm_themes_dir=""
if [ -d "/usr/share/sddm/themes" ]; then
sddm_themes_dir="/usr/share/sddm/themes"
elif [ -d "/run/current-system/sw/share/sddm/themes" ]; then
sddm_themes_dir="/run/current-system/sw/share/sddm/themes"
fi
if [ -n "$sddm_themes_dir" ]; then
sddm_simple="$sddm_themes_dir/simple_sddm_2"
# Only prompt if theme exists and its Backgrounds directory is writable
if [ -d "$sddm_simple" ] && [ -w "$sddm_simple/Backgrounds" ]; then
# Check if yad is running to avoid multiple yad notification
if pidof yad > /dev/null; then
killall yad
fi
if yad --info --text="Set current wallpaper as SDDM background?\n\nNOTE: This only applies to SIMPLE SDDM v2 Theme" \
--text-align=left \
--title="SDDM Background" \
--timeout=5 \
--timeout-indicator=right \
--button="yad-yes:0" \
--button="yad-no:1" \
; then
# Check if terminal exists
if ! command -v "$terminal" &>/dev/null; then
notify-send -i "$iDIR/ja.png" "Missing $terminal" "Install $terminal to enable setting of wallpaper background"
exit 1
fi
exec "$SCRIPTSDIR/sddm_wallpaper.sh" --effects
fi
fi
fi
fi

30
UserScripts/WallpaperRandom.sh Executable file
View File

@@ -0,0 +1,30 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Script for Random Wallpaper ( CTRL ALT W)
wallDIR="$HOME/Pictures/wallpapers"
SCRIPTSDIR="$HOME/.config/hypr/scripts"
focused_monitor=$(hyprctl monitors -j | jq -r '.[] | select(.focused) | .name')
PICS=($(find -L ${wallDIR} -type f \( -name "*.jpg" -o -name "*.jpeg" -o -name "*.png" -o -name "*.pnm" -o -name "*.tga" -o -name "*.tiff" -o -name "*.webp" -o -name "*.bmp" -o -name "*.farbfeld" -o -name "*.gif" \)))
RANDOMPICS=${PICS[ $RANDOM % ${#PICS[@]} ]}
# Transition config
FPS=30
TYPE="random"
DURATION=1
BEZIER=".43,1.19,1,.4"
SWWW_PARAMS="--transition-fps $FPS --transition-type $TYPE --transition-duration $DURATION --transition-bezier $BEZIER"
swww query || swww-daemon --format xrgb && swww img -o $focused_monitor ${RANDOMPICS} $SWWW_PARAMS
wait $!
"$SCRIPTSDIR/WallustSwww.sh" &&
wait $!
sleep 2
"$SCRIPTSDIR/Refresh.sh"

248
UserScripts/WallpaperSelect.sh Executable file
View File

@@ -0,0 +1,248 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */
# This script for selecting wallpapers (SUPER W)
# WALLPAPERS PATH
terminal=kitty
wallDIR="$HOME/Pictures/wallpapers"
SCRIPTSDIR="$HOME/.config/hypr/scripts"
wallpaper_current="$HOME/.config/hypr/wallpaper_effects/.wallpaper_current"
# Directory for swaync
iDIR="$HOME/.config/swaync/images"
iDIRi="$HOME/.config/swaync/icons"
# swww transition config
FPS=60
TYPE="any"
DURATION=2
BEZIER=".43,1.19,1,.4"
SWWW_PARAMS="--transition-fps $FPS --transition-type $TYPE --transition-duration $DURATION --transition-bezier $BEZIER"
# Check if package bc exists
if ! command -v bc &>/dev/null; then
notify-send -i "$iDIR/error.png" "bc missing" "Install package bc first"
exit 1
fi
# Variables
rofi_theme="$HOME/.config/rofi/config-wallpaper.rasi"
focused_monitor=$(hyprctl monitors -j | jq -r '.[] | select(.focused) | .name')
# Ensure focused_monitor is detected
if [[ -z "$focused_monitor" ]]; then
notify-send -i "$iDIR/error.png" "E-R-R-O-R" "Could not detect focused monitor"
exit 1
fi
# Monitor details
scale_factor=$(hyprctl monitors -j | jq -r --arg mon "$focused_monitor" '.[] | select(.name == $mon) | .scale')
monitor_height=$(hyprctl monitors -j | jq -r --arg mon "$focused_monitor" '.[] | select(.name == $mon) | .height')
icon_size=$(echo "scale=1; ($monitor_height * 3) / ($scale_factor * 150)" | bc)
adjusted_icon_size=$(echo "$icon_size" | awk '{if ($1 < 15) $1 = 20; if ($1 > 25) $1 = 25; print $1}')
rofi_override="element-icon{size:${adjusted_icon_size}%;}"
# Kill existing wallpaper daemons for video
kill_wallpaper_for_video() {
swww kill 2>/dev/null
pkill mpvpaper 2>/dev/null
pkill swaybg 2>/dev/null
pkill hyprpaper 2>/dev/null
}
# Kill existing wallpaper daemons for image
kill_wallpaper_for_image() {
pkill mpvpaper 2>/dev/null
pkill swaybg 2>/dev/null
pkill hyprpaper 2>/dev/null
}
# Retrieve wallpapers (both images & videos)
mapfile -d '' PICS < <(find -L "${wallDIR}" -type f \( \
-iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.gif" -o \
-iname "*.bmp" -o -iname "*.tiff" -o -iname "*.webp" -o \
-iname "*.mp4" -o -iname "*.mkv" -o -iname "*.mov" -o -iname "*.webm" \) -print0)
RANDOM_PIC="${PICS[$((RANDOM % ${#PICS[@]}))]}"
RANDOM_PIC_NAME=". random"
# Rofi command
rofi_command="rofi -i -show -dmenu -config $rofi_theme -theme-str $rofi_override"
# Sorting Wallpapers
menu() {
IFS=$'\n' sorted_options=($(sort <<<"${PICS[*]}"))
printf "%s\x00icon\x1f%s\n" "$RANDOM_PIC_NAME" "$RANDOM_PIC"
for pic_path in "${sorted_options[@]}"; do
pic_name=$(basename "$pic_path")
if [[ "$pic_name" =~ \.gif$ ]]; then
cache_gif_image="$HOME/.cache/gif_preview/${pic_name}.png"
if [[ ! -f "$cache_gif_image" ]]; then
mkdir -p "$HOME/.cache/gif_preview"
magick "$pic_path[0]" -resize 1920x1080 "$cache_gif_image"
fi
printf "%s\x00icon\x1f%s\n" "$pic_name" "$cache_gif_image"
elif [[ "$pic_name" =~ \.(mp4|mkv|mov|webm|MP4|MKV|MOV|WEBM)$ ]]; then
cache_preview_image="$HOME/.cache/video_preview/${pic_name}.png"
if [[ ! -f "$cache_preview_image" ]]; then
mkdir -p "$HOME/.cache/video_preview"
ffmpeg -v error -y -i "$pic_path" -ss 00:00:01.000 -vframes 1 "$cache_preview_image"
fi
printf "%s\x00icon\x1f%s\n" "$pic_name" "$cache_preview_image"
else
printf "%s\x00icon\x1f%s\n" "$(echo "$pic_name" | cut -d. -f1)" "$pic_path"
fi
done
}
# Offer SDDM Simple Wallpaper Option (only for non-video wallpapers)
set_sddm_wallpaper() {
sleep 1
# Resolve SDDM themes directory (standard and NixOS path)
local sddm_themes_dir=""
if [ -d "/usr/share/sddm/themes" ]; then
sddm_themes_dir="/usr/share/sddm/themes"
elif [ -d "/run/current-system/sw/share/sddm/themes" ]; then
sddm_themes_dir="/run/current-system/sw/share/sddm/themes"
fi
[ -z "$sddm_themes_dir" ] && return 0
local sddm_simple="$sddm_themes_dir/simple_sddm_2"
# Only prompt if theme exists and its Backgrounds directory is writable
if [ -d "$sddm_simple" ] && [ -w "$sddm_simple/Backgrounds" ]; then
# Check if yad is running to avoid multiple notifications
if pidof yad >/dev/null; then
killall yad
fi
if yad --info --text="Set current wallpaper as SDDM background?\n\nNOTE: This only applies to SIMPLE SDDM v2 Theme" \
--text-align=left \
--title="SDDM Background" \
--timeout=5 \
--timeout-indicator=right \
--button="yes:0" \
--button="no:1"; then
# Check if terminal exists
if ! command -v "$terminal" &>/dev/null; then
notify-send -i "$iDIR/error.png" "Missing $terminal" "Install $terminal to enable setting of wallpaper background"
exit 1
fi
exec "$SCRIPTSDIR/sddm_wallpaper.sh" --normal
fi
fi
}
modify_startup_config() {
local selected_file="$1"
local startup_config="$HOME/.config/hypr/UserConfigs/Startup_Apps.conf"
# Check if it's a live wallpaper (video)
if [[ "$selected_file" =~ \.(mp4|mkv|mov|webm)$ ]]; then
# For video wallpapers:
sed -i '/^\s*exec-once\s*=\s*swww-daemon\s*--format\s*xrgb\s*$/s/^/\#/' "$startup_config"
sed -i '/^\s*#\s*exec-once\s*=\s*mpvpaper\s*.*$/s/^#\s*//;' "$startup_config"
# Update the livewallpaper variable with the selected video path (using $HOME)
selected_file="${selected_file/#$HOME/\$HOME}" # Replace /home/user with $HOME
sed -i "s|^\$livewallpaper=.*|\$livewallpaper=\"$selected_file\"|" "$startup_config"
echo "Configured for live wallpaper (video)."
else
# For image wallpapers:
sed -i '/^\s*#\s*exec-once\s*=\s*swww-daemon\s*--format\s*xrgb\s*$/s/^\s*#\s*//;' "$startup_config"
sed -i '/^\s*exec-once\s*=\s*mpvpaper\s*.*$/s/^/\#/' "$startup_config"
echo "Configured for static wallpaper (image)."
fi
}
# Apply Image Wallpaper
apply_image_wallpaper() {
local image_path="$1"
kill_wallpaper_for_image
if ! pgrep -x "swww-daemon" >/dev/null; then
echo "Starting swww-daemon..."
swww-daemon --format xrgb &
fi
swww img -o "$focused_monitor" "$image_path" $SWWW_PARAMS
# Run additional scripts (pass the image path to avoid cache race conditions)
"$SCRIPTSDIR/WallustSwww.sh" "$image_path"
sleep 2
"$SCRIPTSDIR/Refresh.sh"
sleep 1
set_sddm_wallpaper
}
apply_video_wallpaper() {
local video_path="$1"
# Check if mpvpaper is installed
if ! command -v mpvpaper &>/dev/null; then
notify-send -i "$iDIR/error.png" "E-R-R-O-R" "mpvpaper not found"
return 1
fi
kill_wallpaper_for_video
# Apply video wallpaper using mpvpaper
mpvpaper '*' -o "load-scripts=no no-audio --loop" "$video_path" &
}
# Main function
main() {
choice=$(menu | $rofi_command)
choice=$(echo "$choice" | xargs)
RANDOM_PIC_NAME=$(echo "$RANDOM_PIC_NAME" | xargs)
if [[ -z "$choice" ]]; then
echo "No choice selected. Exiting."
exit 0
fi
# Handle random selection correctly
if [[ "$choice" == "$RANDOM_PIC_NAME" ]]; then
choice=$(basename "$RANDOM_PIC")
fi
choice_basename=$(basename "$choice" | sed 's/\(.*\)\.[^.]*$/\1/')
# Search for the selected file in the wallpapers directory, including subdirectories
selected_file=$(find "$wallDIR" -iname "$choice_basename.*" -print -quit)
if [[ -z "$selected_file" ]]; then
echo "File not found. Selected choice: $choice"
exit 1
fi
# Modify the Startup_Apps.conf file based on wallpaper type
modify_startup_config "$selected_file"
# **CHECK FIRST** if it's a video or an image **before calling any function**
if [[ "$selected_file" =~ \.(mp4|mkv|mov|webm|MP4|MKV|MOV|WEBM)$ ]]; then
apply_video_wallpaper "$selected_file"
else
apply_image_wallpaper "$selected_file"
fi
}
# Check if rofi is already running
if pidof rofi >/dev/null; then
pkill rofi
fi
main

544
UserScripts/Weather.py Executable file
View File

@@ -0,0 +1,544 @@
#!/usr/bin/env python3
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# Rewritten to use Open-Meteo APIs (worldwide, no API key) for robust weather data.
# Outputs Waybar-compatible JSON and a simple text cache.
import json
import os
import sys
import time
import html
from typing import Any, Dict, List, Optional, Tuple
import requests
# =============== Configuration ===============
# You can configure behavior via environment variables OR the constants below.
# Examples (zsh):
# # One-off run
# # WEATHER_UNITS can be "metric" or "imperial"
# WEATHER_UNITS=imperial WEATHER_PLACE="Concord, NH" python3 /home/dwilliams/Projects/Weather.py
#
# # Persist in current shell session
# export WEATHER_UNITS=imperial
# export WEATHER_LAT=43.2229
# export WEATHER_LON=-71.332
# export WEATHER_PLACE="Concord, NH"
# export WEATHER_TOOLTIP_MARKUP=1 # 1 to enable Pango markup, 0 to disable
# export WEATHER_LOC_ICON="📍" # or "*" for ASCII-only
#
CACHE_DIR = os.path.expanduser("~/.cache")
API_CACHE_PATH = os.path.join(CACHE_DIR, "open_meteo_cache.json")
SIMPLE_TEXT_CACHE_PATH = os.path.join(CACHE_DIR, ".weather_cache")
CACHE_TTL_SECONDS = int(os.getenv("WEATHER_CACHE_TTL", "600")) # default 10 minutes
# Units: metric or imperial (default metric)
UNITS = os.getenv("WEATHER_UNITS", "metric").strip().lower() # metric|imperial
# Optional manual coordinates
ENV_LAT = os.getenv("WEATHER_LAT")
ENV_LON = os.getenv("WEATHER_LON")
# Optional manual place override for tooltip
ENV_PLACE = os.getenv("WEATHER_PLACE")
# Manual place name set inside this file. If set (non-empty), this takes top priority.
# Example: MANUAL_PLACE = "Concord, NH, US"
MANUAL_PLACE: Optional[str] = None
# Location icon in tooltip (default to a standard emoji to avoid missing glyphs)
LOC_ICON = os.getenv("WEATHER_LOC_ICON", "📍")
# Enable/disable Pango markup in tooltip (1/0, true/false)
TOOLTIP_MARKUP = os.getenv("WEATHER_TOOLTIP_MARKUP", "1").lower() not in ("0", "false", "no")
# Optional debug logging to stderr (set WEATHER_DEBUG=1 to enable)
DEBUG = os.getenv("WEATHER_DEBUG", "0").lower() not in ("0", "false", "no")
# HTTP settings
UA = (
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/128.0 Safari/537.36"
)
TIMEOUT = 8
SESSION = requests.Session()
SESSION.headers.update({"User-Agent": UA})
# =============== Icon and status mapping ===============
# Reuse prior icon set for continuity
WEATHER_ICONS = {
"sunnyDay": "󰖙",
"clearNight": "󰖔",
"cloudyFoggyDay": "",
"cloudyFoggyNight": "",
"rainyDay": "",
"rainyNight": "",
"snowyIcyDay": "",
"snowyIcyNight": "",
"severe": "",
"default": "",
}
WMO_STATUS = {
0: "Clear sky",
1: "Mainly clear",
2: "Partly cloudy",
3: "Overcast",
45: "Fog",
48: "Depositing rime fog",
51: "Light drizzle",
53: "Moderate drizzle",
55: "Dense drizzle",
56: "Freezing drizzle",
57: "Freezing drizzle",
61: "Light rain",
63: "Moderate rain",
65: "Heavy rain",
66: "Freezing rain",
67: "Freezing rain",
71: "Slight snow",
73: "Moderate snow",
75: "Heavy snow",
77: "Snow grains",
80: "Rain showers",
81: "Rain showers",
82: "Violent rain showers",
85: "Snow showers",
86: "Heavy snow showers",
95: "Thunderstorm",
96: "Thunderstorm w/ hail",
99: "Thunderstorm w/ hail",
}
def wmo_to_icon(code: int, is_day: int) -> str:
day = bool(is_day)
if code == 0:
return WEATHER_ICONS["sunnyDay" if day else "clearNight"]
if code in (1, 2, 3, 45, 48):
return WEATHER_ICONS["cloudyFoggyDay" if day else "cloudyFoggyNight"]
if code in (51, 53, 55, 61, 63, 65, 80, 81, 82):
return WEATHER_ICONS["rainyDay" if day else "rainyNight"]
if code in (56, 57, 66, 67, 71, 73, 75, 77, 85, 86):
return WEATHER_ICONS["snowyIcyDay" if day else "snowyIcyNight"]
if code in (95, 96, 99):
return WEATHER_ICONS["severe"]
return WEATHER_ICONS["default"]
def wmo_to_status(code: int) -> str:
return WMO_STATUS.get(code, "Unknown")
# =============== Utilities ===============
def esc(s: Optional[str]) -> str:
return html.escape(s, quote=False) if s else ""
def log_debug(msg: str) -> None:
if DEBUG:
print(msg, file=sys.stderr)
def ensure_cache_dir() -> None:
try:
os.makedirs(CACHE_DIR, exist_ok=True)
except Exception as e:
print(f"Error creating cache dir: {e}", file=sys.stderr)
def read_api_cache() -> Optional[Dict[str, Any]]:
try:
if not os.path.exists(API_CACHE_PATH):
return None
with open(API_CACHE_PATH, "r", encoding="utf-8") as f:
data = json.load(f)
if (time.time() - data.get("timestamp", 0)) <= CACHE_TTL_SECONDS:
return data
return None
except Exception as e:
print(f"Error reading cache: {e}", file=sys.stderr)
return None
def write_api_cache(payload: Dict[str, Any]) -> None:
try:
ensure_cache_dir()
payload["timestamp"] = time.time()
with open(API_CACHE_PATH, "w", encoding="utf-8") as f:
json.dump(payload, f)
except Exception as e:
print(f"Error writing API cache: {e}", file=sys.stderr)
def write_simple_text_cache(text: str) -> None:
try:
ensure_cache_dir()
with open(SIMPLE_TEXT_CACHE_PATH, "w", encoding="utf-8") as f:
f.write(text)
except Exception as e:
print(f"Error writing simple cache: {e}", file=sys.stderr)
def get_coords() -> Tuple[float, float]:
# 1) Explicit env
if ENV_LAT and ENV_LON:
try:
return float(ENV_LAT), float(ENV_LON)
except ValueError:
print("Invalid WEATHER_LAT/WEATHER_LON; falling back to IP geolocation", file=sys.stderr)
# 2) Try cached coordinates from last successful forecast
try:
cached = read_api_cache()
if cached and isinstance(cached, dict):
fc = cached.get("forecast") or {}
lat = fc.get("latitude")
lon = fc.get("longitude")
if isinstance(lat, (int, float)) and isinstance(lon, (int, float)):
return float(lat), float(lon)
except Exception as e:
print(f"Reading cached coords failed: {e}", file=sys.stderr)
# 3) IP-based geolocation with multiple providers (prefer ipwho.is, ipapi.co; ipinfo.io as fallback)
# ipwho.is
try:
resp = SESSION.get("https://ipwho.is/", timeout=TIMEOUT)
resp.raise_for_status()
data = resp.json()
if data.get("success"):
lat = data.get("latitude")
lon = data.get("longitude")
if isinstance(lat, (int, float)) and isinstance(lon, (int, float)):
return float(lat), float(lon)
except Exception as e:
print(f"ipwho.is failed: {e}", file=sys.stderr)
# ipapi.co
try:
resp = SESSION.get("https://ipapi.co/json", timeout=TIMEOUT)
resp.raise_for_status()
data = resp.json()
lat = data.get("latitude")
lon = data.get("longitude")
if isinstance(lat, (int, float)) and isinstance(lon, (int, float)):
return float(lat), float(lon)
except Exception as e:
print(f"ipapi.co failed: {e}", file=sys.stderr)
# ipinfo.io (fallback)
try:
resp = SESSION.get("https://ipinfo.io/json", timeout=TIMEOUT)
resp.raise_for_status()
data = resp.json()
loc = data.get("loc")
if loc and "," in loc:
lat_s, lon_s = loc.split(",", 1)
return float(lat_s), float(lon_s)
except Exception as e:
print(f"ipinfo.io failed: {e}", file=sys.stderr)
# 4) Last resort
print("IP geolocation failed: no providers succeeded", file=sys.stderr)
return 0.0, 0.0
def units_params(units: str) -> Dict[str, str]:
if units == "imperial":
return {
"temperature_unit": "fahrenheit",
"wind_speed_unit": "mph",
"precipitation_unit": "inch",
}
# default metric
return {
"temperature_unit": "celsius",
"wind_speed_unit": "kmh",
"precipitation_unit": "mm",
}
def format_visibility(meters: Optional[float]) -> str:
if meters is None:
return ""
try:
if UNITS == "imperial":
miles = meters / 1609.344
return f"{miles:.1f} mi"
else:
km = meters / 1000.0
return f"{km:.1f} km"
except Exception:
return ""
# =============== API Fetching ===============
def fetch_open_meteo(lat: float, lon: float) -> Dict[str, Any]:
base = "https://api.open-meteo.com/v1/forecast"
params = {
"latitude": lat,
"longitude": lon,
"current": "temperature_2m,apparent_temperature,relative_humidity_2m,wind_speed_10m,wind_direction_10m,weather_code,visibility,precipitation,pressure_msl,is_day",
"hourly": "precipitation_probability",
"daily": "temperature_2m_max,temperature_2m_min",
"timezone": "auto",
}
params.update(units_params(UNITS))
resp = SESSION.get(base, params=params, timeout=TIMEOUT)
resp.raise_for_status()
return resp.json()
def fetch_aqi(lat: float, lon: float) -> Optional[Dict[str, Any]]:
try:
base = "https://air-quality-api.open-meteo.com/v1/air-quality"
params = {
"latitude": lat,
"longitude": lon,
"current": "european_aqi",
"timezone": "auto",
}
resp = SESSION.get(base, params=params, timeout=TIMEOUT)
resp.raise_for_status()
return resp.json()
except Exception as e:
print(f"AQI fetch failed: {e}", file=sys.stderr)
return None
def fetch_place(lat: float, lon: float) -> Optional[str]:
"""Reverse geocode lat/lon to an approximate place. Tries Nominatim first, then Open-Meteo."""
lang = os.getenv("WEATHER_LANG", "en")
# 1) Nominatim (OpenStreetMap)
try:
base = "https://nominatim.openstreetmap.org/reverse"
params = {
"lat": lat,
"lon": lon,
"format": "jsonv2",
"accept-language": lang,
}
headers = {"User-Agent": UA + " Weather.py/1.0"}
resp = SESSION.get(base, params=params, headers=headers, timeout=TIMEOUT)
resp.raise_for_status()
data = resp.json()
address = data.get("address", {})
name = data.get("name") or address.get("city") or address.get("town") or address.get("village") or address.get("hamlet")
admin1 = address.get("state")
country = address.get("country")
parts = [part for part in [name, admin1, country] if part]
if parts:
return ", ".join(parts)
except Exception as e:
log_debug(f"Reverse geocoding (Nominatim) failed: {e}")
# 2) Open-Meteo reverse (fallback)
try:
base = "https://geocoding-api.open-meteo.com/v1/reverse"
params = {
"latitude": lat,
"longitude": lon,
"language": lang,
"format": "json",
}
resp = SESSION.get(base, params=params, timeout=TIMEOUT)
resp.raise_for_status()
data = resp.json()
results = data.get("results") or []
if results:
p = results[0]
name = p.get("name")
admin1 = p.get("admin1")
country = p.get("country")
parts = [part for part in [name, admin1, country] if part]
if parts:
return ", ".join(parts)
except Exception as e:
log_debug(f"Reverse geocoding (Open-Meteo) failed: {e}")
return None
# =============== Build Output ===============
def safe_get(dct: Dict[str, Any], *keys, default=None):
cur: Any = dct
for k in keys:
if isinstance(cur, dict):
if k not in cur:
return default
cur = cur[k]
elif isinstance(cur, list):
try:
cur = cur[k] # type: ignore[index]
except Exception:
return default
else:
return default
return cur
def build_hourly_precip(forecast: Dict[str, Any]) -> str:
try:
times: List[str] = safe_get(forecast, "hourly", "time", default=[]) or []
probs: List[Optional[float]] = safe_get(
forecast, "hourly", "precipitation_probability", default=[]
) or []
cur_time: Optional[str] = safe_get(forecast, "current", "time")
idx = times.index(cur_time) if cur_time in times else 0
window = probs[idx : idx + 6]
if not window:
return ""
parts = [f"{int(p)}%" if p is not None else "-" for p in window]
return " (next 6h) " + " ".join(parts)
except Exception:
return ""
def build_output(lat: float, lon: float, forecast: Dict[str, Any], aqi: Optional[Dict[str, Any]], place: Optional[str] = None) -> Tuple[Dict[str, Any], str]:
cur = forecast.get("current", {})
cur_units = forecast.get("current_units", {})
daily = forecast.get("daily", {})
daily_units = forecast.get("daily_units", {})
temp_val = cur.get("temperature_2m")
temp_unit = cur_units.get("temperature_2m", "")
temp_str = f"{int(round(temp_val))}{temp_unit}" if isinstance(temp_val, (int, float)) else "N/A"
feels_val = cur.get("apparent_temperature")
feels_unit = cur_units.get("apparent_temperature", "")
feels_str = f"Feels like {int(round(feels_val))}{feels_unit}" if isinstance(feels_val, (int, float)) else ""
is_day = int(cur.get("is_day", 1) or 1)
code = int(cur.get("weather_code", -1) or -1)
icon = wmo_to_icon(code, is_day)
status = wmo_to_status(code)
# min/max today (index 0)
tmin_val = safe_get(daily, "temperature_2m_min", 0)
tmax_val = safe_get(daily, "temperature_2m_max", 0)
dtemp_unit = daily_units.get("temperature_2m_min", temp_unit)
tmin_str = f"{int(round(tmin_val))}{dtemp_unit}" if isinstance(tmin_val, (int, float)) else ""
tmax_str = f"{int(round(tmax_val))}{dtemp_unit}" if isinstance(tmax_val, (int, float)) else ""
min_max = f"{tmin_str}\t\t{tmax_str}" if tmin_str and tmax_str else ""
wind_val = cur.get("wind_speed_10m")
wind_unit = cur_units.get("wind_speed_10m", "")
wind_text = f"{int(round(wind_val))}{wind_unit}" if isinstance(wind_val, (int, float)) else ""
hum_val = cur.get("relative_humidity_2m")
humidity_text = f"{int(hum_val)}%" if isinstance(hum_val, (int, float)) else ""
vis_val = cur.get("visibility")
visibility_text = f"{format_visibility(vis_val)}" if isinstance(vis_val, (int, float)) else ""
aqi_val = safe_get(aqi or {}, "current", "european_aqi")
aqi_text = f"AQI {int(aqi_val)}" if isinstance(aqi_val, (int, float)) else "AQI N/A"
hourly_precip = build_hourly_precip(forecast)
prediction = f"\n\n{hourly_precip}" if hourly_precip else ""
# Build place string (priority: MANUAL_PLACE > ENV_PLACE > reverse geocode > lat,lon)
place_str = (MANUAL_PLACE or ENV_PLACE or place or f"{lat:.3f}, {lon:.3f}")
location_text = f"{LOC_ICON} {place_str}"
# Build tooltip (markup or plain)
if TOOLTIP_MARKUP:
# Escape dynamic text to avoid breaking Pango markup
tooltip_text = str.format(
"\t\t{}\t\t\n{}\n{}\n{}\n{}\n\n{}\n{}\n{}{}",
f'<span size="xx-large">{esc(temp_str)}</span>',
f"<big> {icon}</big>",
f"<b>{esc(status)}</b>",
esc(location_text),
f"<small>{esc(feels_str)}</small>" if feels_str else "",
f"<b>{esc(min_max)}</b>" if min_max else "",
f"{esc(wind_text)}\t{esc(humidity_text)}",
f"{esc(visibility_text)}\t{esc(aqi_text)}",
f"<i> {esc(prediction)}</i>" if prediction else "",
)
else:
lines = [
f"{icon} {temp_str}",
status,
location_text,
]
if feels_str:
lines.append(feels_str)
if min_max:
lines.append(min_max)
lines.append(f"{wind_text} {humidity_text}".strip())
lines.append(f"{visibility_text} {aqi_text}".strip())
if prediction:
lines.append(hourly_precip)
tooltip_text = "\n".join([ln for ln in lines if ln])
out_data = {
"text": f"{icon} {temp_str}",
"alt": status,
"tooltip": tooltip_text,
"class": f"wmo-{code} {'day' if is_day else 'night'}",
}
simple_weather = (
f"{icon} {status}\n"
+ f"{temp_str} ({feels_str})\n"
+ (f"{wind_text} \n" if wind_text else "")
+ (f"{humidity_text} \n" if humidity_text else "")
+ f"{visibility_text} {aqi_text}\n"
)
return out_data, simple_weather
def main() -> None:
lat, lon = get_coords()
# Try cache first
cached = read_api_cache()
if cached and isinstance(cached, dict):
forecast = cached.get("forecast")
aqi = cached.get("aqi")
cached_place = cached.get("place") if isinstance(cached.get("place"), str) else None
place_effective = MANUAL_PLACE or ENV_PLACE or cached_place
try:
out, simple = build_output(lat, lon, forecast, aqi, place_effective)
print(json.dumps(out, ensure_ascii=False))
write_simple_text_cache(simple)
return
except Exception as e:
print(f"Cached data build failed, refetching: {e}", file=sys.stderr)
# Fetch fresh
try:
forecast = fetch_open_meteo(lat, lon)
aqi = fetch_aqi(lat, lon)
# Use manual/env place if provided; otherwise reverse geocode
place_effective = MANUAL_PLACE or ENV_PLACE or fetch_place(lat, lon)
write_api_cache({"forecast": forecast, "aqi": aqi, "place": place_effective})
out, simple = build_output(lat, lon, forecast, aqi, place_effective)
print(json.dumps(out, ensure_ascii=False))
write_simple_text_cache(simple)
except Exception as e:
print(f"Open-Meteo fetch failed: {e}", file=sys.stderr)
# Last resort: try stale cache without TTL
try:
if os.path.exists(API_CACHE_PATH):
with open(API_CACHE_PATH, "r", encoding="utf-8") as f:
stale = json.load(f)
out, simple = build_output(lat, lon, stale.get("forecast", {}), stale.get("aqi"), stale.get("place") if isinstance(stale.get("place"), str) else None)
print(json.dumps(out, ensure_ascii=False))
write_simple_text_cache(simple)
return
except Exception as e2:
print(f"Failed to use stale cache: {e2}", file=sys.stderr)
# Fallback minimal output
fallback = {
"text": f"{WEATHER_ICONS['default']} N/A",
"alt": "Unavailable",
"tooltip": "Weather unavailable",
"class": "unavailable",
}
print(json.dumps(fallback, ensure_ascii=False))
if __name__ == "__main__":
main()

87
UserScripts/Weather.sh Executable file
View File

@@ -0,0 +1,87 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# weather info from wttr. https://github.com/chubin/wttr.in
# Remember to add city
city=
cachedir="$HOME/.cache/rbn"
cachefile=${0##*/}-$1
if [ ! -d $cachedir ]; then
mkdir -p $cachedir
fi
if [ ! -f $cachedir/$cachefile ]; then
touch $cachedir/$cachefile
fi
# Save current IFS
SAVEIFS=$IFS
# Change IFS to new line.
IFS=$'\n'
cacheage=$(($(date +%s) - $(stat -c '%Y' "$cachedir/$cachefile")))
if [ $cacheage -gt 1740 ] || [ ! -s $cachedir/$cachefile ]; then
data=($(curl -s https://en.wttr.in/"$city"$1\?0qnT 2>&1))
echo ${data[0]} | cut -f1 -d, > $cachedir/$cachefile
echo ${data[1]} | sed -E 's/^.{15}//' >> $cachedir/$cachefile
echo ${data[2]} | sed -E 's/^.{15}//' >> $cachedir/$cachefile
fi
weather=($(cat $cachedir/$cachefile))
# Restore IFSClear
IFS=$SAVEIFS
temperature=$(echo ${weather[2]} | sed -E 's/([[:digit:]]+)\.\./\1 to /g')
#echo ${weather[1]##*,}
# https://fontawesome.com/icons?s=solid&c=weather
case $(echo ${weather[1]##*,} | tr '[:upper:]' '[:lower:]') in
"clear" | "sunny")
condition=""
;;
"partly cloudy")
condition="󰖕"
;;
"cloudy")
condition=""
;;
"overcast")
condition=""
;;
"fog" | "freezing fog")
condition=""
;;
"patchy rain possible" | "patchy light drizzle" | "light drizzle" | "patchy light rain" | "light rain" | "light rain shower" | "mist" | "rain")
condition="󰼳"
;;
"moderate rain at times" | "moderate rain" | "heavy rain at times" | "heavy rain" | "moderate or heavy rain shower" | "torrential rain shower" | "rain shower")
condition=""
;;
"patchy snow possible" | "patchy sleet possible" | "patchy freezing drizzle possible" | "freezing drizzle" | "heavy freezing drizzle" | "light freezing rain" | "moderate or heavy freezing rain" | "light sleet" | "ice pellets" | "light sleet showers" | "moderate or heavy sleet showers")
condition="󰼴"
;;
"blowing snow" | "moderate or heavy sleet" | "patchy light snow" | "light snow" | "light snow showers")
condition="󰙿"
;;
"blizzard" | "patchy moderate snow" | "moderate snow" | "patchy heavy snow" | "heavy snow" | "moderate or heavy snow with thunder" | "moderate or heavy snow showers")
condition=""
;;
"thundery outbreaks possible" | "patchy light rain with thunder" | "moderate or heavy rain with thunder" | "patchy light snow with thunder")
condition=""
;;
*)
condition=""
echo -e "{\"text\":\""$condition"\", \"alt\":\""${weather[0]}"\", \"tooltip\":\""${weather[0]}: $temperature ${weather[1]}"\"}"
;;
esac
#echo $temp $condition
echo -e "{\"text\":\""$temperature $condition"\", \"alt\":\""${weather[0]}"\", \"tooltip\":\""${weather[0]}: $temperature ${weather[1]}"\"}"
cached_weather="$temperature \n$condition ${weather[1]}"
echo -e $cached_weather > "$HOME/.cache/.weather_cache"

69
UserScripts/ZshChangeTheme.sh Executable file
View File

@@ -0,0 +1,69 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Script for Oh my ZSH theme ( CTRL SHIFT O)
# preview of theme can be view here: https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
# after choosing theme, TTY need to be closed and re-open
# Variables
iDIR="$HOME/.config/swaync/images"
rofi_theme="$HOME/.config/rofi/config-zsh-theme.rasi"
if [ -n "$(grep -i nixos < /etc/os-release)" ]; then
notify-send -i "$iDIR/note.png" "NOT Supported" "Sorry NixOS does not support this KooL feature"
exit 1
fi
themes_dir="$HOME/.oh-my-zsh/themes"
file_extension=".zsh-theme"
themes_array=($(find -L "$themes_dir" -type f -name "*$file_extension" -exec basename {} \; | sed -e "s/$file_extension//"))
# Add "Random" option to the beginning of the array
themes_array=("Random" "${themes_array[@]}")
rofi_command="rofi -i -dmenu -config $rofi_theme"
menu() {
for theme in "${themes_array[@]}"; do
echo "$theme"
done
}
main() {
choice=$(menu | ${rofi_command})
# if nothing selected, script won't change anything
if [ -z "$choice" ]; then
exit 0
fi
zsh_path="$HOME/.zshrc"
var_name="ZSH_THEME"
if [[ "$choice" == "Random" ]]; then
# Pick a random theme from the original themes_array (excluding "Random")
random_theme=${themes_array[$((RANDOM % (${#themes_array[@]} - 1) + 1))]}
theme_to_set="$random_theme"
notify-send -i "$iDIR/ja.png" "Random theme:" "selected: $random_theme"
else
# Set theme to the selected choice
theme_to_set="$choice"
notify-send -i "$iDIR/ja.png" "Theme selected:" "$choice"
fi
if [ -f "$zsh_path" ]; then
sed -i "s/^$var_name=.*/$var_name=\"$theme_to_set\"/" "$zsh_path"
notify-send -i "$iDIR/ja.png" "OMZ theme" "applied. restart your terminal"
else
notify-send -i "$iDIR/error.png" "E-R-R-O-R" "~.zshrc file not found!"
fi
}
# Check if rofi is already running
if pidof rofi > /dev/null; then
pkill rofi
fi
main

View File

@@ -0,0 +1,26 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
animations {
enabled = yes
bezier = wind, 0.05, 0.9, 0.1, 1.05
bezier = winIn, 0.1, 1.1, 0.1, 1.1
bezier = winOut, 0.3, -0.3, 0, 1
bezier = liner, 1, 1, 1, 1
bezier = overshot, 0.05, 0.9, 0.1, 1.05
bezier = smoothOut, 0.5, 0, 0.99, 0.99
bezier = smoothIn, 0.5, -0.5, 0.68, 1.5
animation = windows, 1, 6, wind, slide
animation = windowsIn, 1, 5, winIn, slide
animation = windowsOut, 1, 3, smoothOut, slide
animation = windowsMove, 1, 5, wind, slide
animation = border, 1, 1, liner
animation = borderangle, 1, 180, liner, loop #used by rainbow borders and rotating colors
animation = fade, 1, 3, smoothOut
animation = workspaces, 1, 5, overshot
# animations for -git or version >0.42.0
animation = workspacesIn, 1, 5, winIn, slide
animation = workspacesOut, 1, 5, winOut, slide
}

View File

@@ -0,0 +1,27 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# old animations
animations {
enabled = yes
bezier = myBezier, 0.05, 0.9, 0.1, 1.05
bezier = linear, 0.0, 0.0, 1.0, 1.0
bezier = wind, 0.05, 0.9, 0.1, 1.05
bezier = winIn, 0.1, 1.1, 0.1, 1.1
bezier = winOut, 0.3, -0.3, 0, 1
bezier = slow, 0, 0.85, 0.3, 1
bezier = overshot, 0.7, 0.6, 0.1, 1.1
bezier = bounce, 1.1, 1.6, 0.1, 0.85
bezier = sligshot, 1, -1, 0.15, 1.25
bezier = nice, 0, 6.9, 0.5, -4.20
animation = windowsIn, 1, 5, slow, popin
animation = windowsOut, 1, 5, winOut, popin
animation = windowsMove, 1, 5, wind, slide
animation = border, 1, 10, linear
animation = borderangle, 1, 180, linear, loop #used by rainbow borders and rotating colors
animation = fade, 1, 5, overshot
animation = workspaces, 1, 5, wind
animation = windows, 1, 5, bounce, popin
}

View File

@@ -0,0 +1,5 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
animations {
enabled = no
}

40
animations/END-4.conf Normal file
View File

@@ -0,0 +1,40 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
#
# name "End-4"
# credit https://github.com/end-4/dots-hyprland
animations {
enabled = true
# Animation curves
bezier = linear, 0, 0, 1, 1
bezier = md3_standard, 0.2, 0, 0, 1
bezier = md3_decel, 0.05, 0.7, 0.1, 1
bezier = md3_accel, 0.3, 0, 0.8, 0.15
bezier = overshot, 0.05, 0.9, 0.1, 1.1
bezier = crazyshot, 0.1, 1.5, 0.76, 0.92
bezier = hyprnostretch, 0.05, 0.9, 0.1, 1.0
bezier = menu_decel, 0.1, 1, 0, 1
bezier = menu_accel, 0.38, 0.04, 1, 0.07
bezier = easeInOutCirc, 0.85, 0, 0.15, 1
bezier = easeOutCirc, 0, 0.55, 0.45, 1
bezier = easeOutExpo, 0.16, 1, 0.3, 1
bezier = softAcDecel, 0.26, 0.26, 0.15, 1
bezier = md2, 0.4, 0, 0.2, 1 # use with .2s duration
# Animation configs
animation = windows, 1, 3, md3_decel, popin 60%
animation = windowsIn, 1, 3, md3_decel, popin 60%
animation = windowsOut, 1, 3, md3_accel, popin 60%
animation = border, 1, 10, default
animation = fade, 1, 3, md3_decel
# animation = layers, 1, 2, md3_decel, slide
animation = layersIn, 1, 3, menu_decel, slide
animation = layersOut, 1, 1.6, menu_accel
animation = fadeLayersIn, 1, 2, menu_decel
animation = fadeLayersOut, 1, 4.5, menu_accel
animation = workspaces, 1, 7, menu_decel, slide
# animation = workspaces, 1, 2.5, softAcDecel, slide
# animation = workspaces, 1, 7, menu_decel, slidefade 15%
# animation = specialWorkspace, 1, 3, md3_decel, slidefadevert 15%
animation = specialWorkspace, 1, 3, md3_decel, slidevert
}

View File

@@ -0,0 +1,34 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
#
# name "Vertical"
# credit https://github.com/prasanthrangan/hyprdots
animations {
enabled = yes
bezier = fluent_decel, 0, 0.2, 0.4, 1
bezier = easeOutCirc, 0, 0.55, 0.45, 1
bezier = easeOutCubic, 0.33, 1, 0.68, 1
bezier = easeinoutsine, 0.37, 0, 0.63, 1
# Windows
animation = windowsIn, 1, 1.5, easeinoutsine, popin 60% # window open
animation = windowsOut, 1, 1.5, easeOutCubic, popin 60% # window close.
animation = windowsMove, 1, 1.5, easeinoutsine, slide # everything in between, moving, dragging, resizing.
# Fading
animation = fade, 1, 2.5, fluent_decel
animation = fadeLayersIn, 0
animation = border, 0
# Layers
animation = layers, 1, 1.5, easeinoutsine, popin
# Workspaces
#animation = workspaces, 1, 3, fluent_decel, slidefade 30% # styles: slide, slidevert, fade, slidefade, slidefadevert
animation = workspaces, 1, 3, fluent_decel, slidefadevert 30% # styles: slide, slidevert, fade, slidefade, slidefadevert
animation = specialWorkspace, 1, 2, fluent_decel, slidefade 10%
}

View File

@@ -0,0 +1,21 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
#
# name "Default"
# credit https://github.com/prasanthrangan/hyprdots
animations {
enabled = yes
bezier = wind, 0.05, 0.9, 0.1, 1.05
bezier = winIn, 0.1, 1.1, 0.1, 1.1
bezier = winOut, 0.3, -0.3, 0, 1
bezier = liner, 1, 1, 1, 1
animation = windows, 1, 6, wind, slide
animation = windowsIn, 1, 6, winIn, slide
animation = windowsOut, 1, 5, winOut, slide
animation = windowsMove, 1, 5, wind, slide
animation = border, 1, 1, liner
animation = borderangle, 1, 30, liner, once
animation = fade, 1, 10, default
animation = workspaces, 1, 5, wind
animation = specialWorkspace, 1, 5, wind, slidevert
}

View File

@@ -0,0 +1,27 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
#
# # name "Minimal-1"
# credit https://github.com/prasanthrangan/hyprdots-
animations {
enabled = true
# █▄▄ █▀▀ ▀█ █ █▀▀ █▀█   █▀▀ █░█ █▀█ █░█ █▀▀
# █▄█ ██▄ █▄ █ ██▄ █▀▄   █▄▄ █▄█ █▀▄ ▀▄▀ ██▄
bezier = wind, 0.05, 0.9, 0.1, 1.05
bezier = winIn, 0.1, 1.1, 0.1, 1.1
bezier = winOut, 0.3, -0.3, 0, 1
bezier = liner, 1, 1, 1, 1
#▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█
#█▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█
animation = windows, 1, 6, wind, slide
animation = windowsIn, 1, 6, winIn, slide
animation = windowsOut, 1, 5, winOut, slide
animation = windowsMove, 1, 5, wind, slide
animation = border, 1, 1, liner
animation = borderangle, 1, 30, liner, once
animation = fade, 1, 10, default
animation = workspaces, 1, 5, wind
}

View File

@@ -0,0 +1,16 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
#
# # name "Minimal-2"
# credit https://github.com/prasanthrangan/hyprdots
animations {
enabled = yes
bezier = quart, 0.25, 1, 0.5, 1
animation = windows, 1, 6, quart, slide
animation = border, 1, 6, quart
animation = borderangle, 1, 6, quart
animation = fade, 1, 6, quart
animation = workspaces, 1, 6, quart
}

View File

@@ -0,0 +1,41 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
#
# name "Optimized"
# credit https://github.com/prasanthrangan/hyprdots
animations {
enabled = true
bezier = wind, 0.05, 0.85, 0.03, 0.97
bezier = winIn, 0.07, 0.88, 0.04, 0.99
bezier = winOut, 0.20, -0.15, 0, 1
bezier = liner, 1, 1, 1, 1
bezier = md3_standard, 0.12, 0, 0, 1
bezier = md3_decel, 0.05, 0.80, 0.10, 0.97
bezier = md3_accel, 0.20, 0, 0.80, 0.08
bezier = overshot, 0.05, 0.85, 0.07, 1.04
bezier = crazyshot, 0.1, 1.22, 0.68, 0.98
bezier = hyprnostretch, 0.05, 0.82, 0.03, 0.94
bezier = menu_decel, 0.05, 0.82, 0, 1
bezier = menu_accel, 0.20, 0, 0.82, 0.10
bezier = easeInOutCirc, 0.75, 0, 0.15, 1
bezier = easeOutCirc, 0, 0.48, 0.38, 1
bezier = easeOutExpo, 0.10, 0.94, 0.23, 0.98
bezier = softAcDecel, 0.20, 0.20, 0.15, 1
bezier = md2, 0.30, 0, 0.15, 1
bezier = OutBack, 0.28, 1.40, 0.58, 1
bezier = easeInOutCirc, 0.78, 0, 0.15, 1
animation = border, 1, 1.6, liner
animation = borderangle, 1, 82, liner, once
animation = windowsIn, 1, 3.2, winIn, slide
animation = windowsOut, 1, 2.8, easeOutCirc
animation = windowsMove, 1, 3.0, wind, slide
animation = fade, 1, 1.8, md3_decel
animation = layersIn, 1, 1.8, menu_decel, slide
animation = layersOut, 1, 1.5, menu_accel
animation = fadeLayersIn, 1, 1.6, menu_decel
animation = fadeLayersOut, 1, 1.8, menu_accel
animation = workspaces, 1, 4.0, menu_decel, slide
animation = specialWorkspace, 1, 2.3, md3_decel, slidefadevert 15%
}

View File

@@ -0,0 +1,15 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
#
# name "Classic"
# credit https://github.com/mylinuxforwork/dotfiles
animations {
enabled = true
bezier = myBezier, 0.05, 0.9, 0.1, 1.05
animation = windows, 1, 7, myBezier
animation = windowsOut, 1, 7, default, popin 80%
animation = border, 1, 10, default
animation = borderangle, 1, 8, default
animation = fade, 1, 7, default
animation = workspaces, 1, 6, default
}

View File

@@ -0,0 +1,20 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
#
# name "Dynamic"
# credit https://github.com/mylinuxforwork/dotfiles
animations {
enabled = true
bezier = wind, 0.05, 0.9, 0.1, 1.05
bezier = winIn, 0.1, 1.1, 0.1, 1.1
bezier = winOut, 0.3, -0.3, 0, 1
bezier = liner, 1, 1, 1, 1
animation = windows, 1, 6, wind, slide
animation = windowsIn, 1, 6, winIn, slide
animation = windowsOut, 1, 5, winOut, slide
animation = windowsMove, 1, 5, wind, slide
animation = border, 1, 1, liner
animation = borderangle, 1, 30, liner, loop
animation = fade, 1, 10, default
animation = workspaces, 1, 5, wind
}

View File

@@ -0,0 +1,24 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
#
# name "Fast"
# credit https://github.com/mylinuxforwork/dotfiles
animations {
enabled = true
bezier = linear, 0, 0, 1, 1
bezier = md3_standard, 0.2, 0, 0, 1
bezier = md3_decel, 0.05, 0.7, 0.1, 1
bezier = md3_accel, 0.3, 0, 0.8, 0.15
bezier = overshot, 0.05, 0.9, 0.1, 1.1
bezier = crazyshot, 0.1, 1.5, 0.76, 0.92
bezier = hyprnostretch, 0.05, 0.9, 0.1, 1.0
bezier = fluent_decel, 0.1, 1, 0, 1
bezier = easeInOutCirc, 0.85, 0, 0.15, 1
bezier = easeOutCirc, 0, 0.55, 0.45, 1
bezier = easeOutExpo, 0.16, 1, 0.3, 1
animation = windows, 1, 3, md3_decel, popin 60%
animation = border, 1, 10, default
animation = fade, 1, 2.5, md3_decel
animation = workspaces, 1, 3.5, easeOutExpo, slide
animation = specialWorkspace, 1, 3, md3_decel, slidevert
}

View File

@@ -0,0 +1,20 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
#
# name "High"
# credit https://github.com/mylinuxforwork/dotfiles
animations {
enabled = true
bezier = wind, 0.05, 0.9, 0.1, 1.05
bezier = winIn, 0.1, 1.1, 0.1, 1.1
bezier = winOut, 0.3, -0.3, 0, 1
bezier = liner, 1, 1, 1, 1
animation = windows, 1, 6, wind, slide
animation = windowsIn, 1, 6, winIn, slide
animation = windowsOut, 1, 5, winOut, slide
animation = windowsMove, 1, 5, wind, slide
animation = border, 1, 1, liner
animation = borderangle, 1, 30, liner, once
animation = fade, 1, 10, default
animation = workspaces, 1, 5, wind
}

View File

@@ -0,0 +1,20 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
#
# name "Moving"
# credit https://github.com/mylinuxforwork/dotfiles
animations {
enabled = true
bezier = overshot, 0.05, 0.9, 0.1, 1.05
bezier = smoothOut, 0.5, 0, 0.99, 0.99
bezier = smoothIn, 0.5, -0.5, 0.68, 1.5
animation = windows, 1, 5, overshot, slide
animation = windowsOut, 1, 3, smoothOut
animation = windowsIn, 1, 3, smoothOut
animation = windowsMove, 1, 4, smoothIn, slide
animation = border, 1, 5, default
animation = fade, 1, 5, smoothIn
animation = fadeDim, 1, 5, smoothIn
animation = workspaces, 1, 6, default
}

View File

@@ -0,0 +1,15 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
#
# name "Standard"
# credit https://github.com/mylinuxforwork/dotfiles
animations {
enabled = true
bezier = myBezier, 0.05, 0.9, 0.1, 1.05
animation = windows, 1, 7, myBezier
animation = windowsOut, 1, 7, default, popin 80%
animation = border, 1, 10, default
animation = borderangle, 1, 8, default
animation = fade, 1, 7, default
animation = workspaces, 1, 6, default
}

View File

@@ -0,0 +1,55 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
#
# name "Me-1"
# credit https://github.com/mahaveergurjar
animations {
enabled = true
# Animation curves
bezier = wind, 0.05, 0.9, 0.1, 1.05
bezier = winIn, 0.1, 1.1, 0.1, 1.1
bezier = winOut, 0.3, -0.3, 0, 1
bezier = liner, 1, 1, 1, 1
# bezier = linear, 0, 0, 1, 1
bezier = md3_standard, 0.2, 0, 0, 1
bezier = md3_decel, 0.05, 0.7, 0.1, 1
bezier = md3_accel, 0.3, 0, 0.8, 0.15
bezier = overshot, 0.05, 0.9, 0.1, 1.1
bezier = crazyshot, 0.1, 1.5, 0.76, 0.92
bezier = hyprnostretch, 0.05, 0.9, 0.1, 1.0
bezier = menu_decel, 0.1, 1, 0, 1
bezier = menu_accel, 0.38, 0.04, 1, 0.07
bezier = easeInOutCirc, 0.85, 0, 0.15, 1
bezier = easeOutCirc, 0, 0.55, 0.45, 1
bezier = easeOutExpo, 0.16, 1, 0.3, 1
bezier = softAcDecel, 0.26, 0.26, 0.15, 1
bezier = md2, 0.4, 0, 0.2, 1 # use with .2s duration
# Animation configs
# animation = windows, 1, 3, md3_decel, popin 60%
# animation = windowsIn, 1, 3, md3_decel, popin 60%
# animation = windowsOut, 1, 3, md3_accel, popin 60%
# animation = windows, 1, 6, wind, slide
animation = border, 1, 1, liner
animation = borderangle, 1, 30, liner, once
animation = windows, 1, 6, wind, slide
animation = windowsIn, 1, 6, winIn, slide
animation = windowsOut, 1, 5, winOut, slide
animation = windowsMove, 1, 5, wind, slide
# animation = border, 1, 10, default
animation = fade, 1, 3, md3_decel
# animation = layers, 1, 2, md3_decel, slide
animation = layersIn, 1, 3, menu_decel, slide
animation = layersOut, 1, 1.6, menu_accel
animation = fadeLayersIn, 1, 2, menu_decel
animation = fadeLayersOut, 1, 4.5, menu_accel
animation = workspaces, 1, 7, menu_decel, slide
animation = workspaces, 1, 5, wind
# animation = workspaces, 1, 2.5, softAcDecel, slide
# animation = workspaces, 1, 7, menu_decel, slidefade 15%
animation = specialWorkspace, 1, 3, md3_decel, slidefadevert 15%
animation = specialWorkspace, 1, 3, md3_decel, slidevert
}

View File

@@ -0,0 +1,30 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
#
# name "Me-2"
# credit https://github.com/mahaveergurjar
animations {
enabled = yes
bezier = wind, 0.05, 0.9, 0.1, 1.05
bezier = winIn, 0.1, 1.1, 0.1, 1.1
bezier = winOut, 0.3, -0.3, 0, 1
bezier = liner, 1, 1, 1, 1
bezier = overshot, 0.05, 0.9, 0.1, 1.05
bezier = smoothOut, 0.5, 0, 0.99, 0.99
bezier = smoothIn, 0.5, -0.5, 0.68, 1.5
animation = windows, 1, 6, wind, slide
animation = windowsIn, 1, 5, winIn, slide
animation = windowsOut, 1, 3, smoothOut, slide
animation = windowsMove, 1, 5, wind, slide
animation = border, 1, 1, liner
animation = borderangle, 1, 180, liner, loop #used by rainbow borders and rotating colors
animation = fade, 1, 3, smoothOut
animation = workspaces, 1, 5, overshot
# animations for -git or version >0.42.0
animation = workspacesIn, 1, 5, winIn, slide
animation = workspacesOut, 1, 5, winOut, slide
}

8
application-style.conf Normal file
View File

@@ -0,0 +1,8 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# as per Hyprland wiki: hyprland-qt-support provides a QML style for hypr* qt6 apps
roundess = 2
border_width = 0
reduce_motion = false

149
configs/Keybinds.conf Normal file
View File

@@ -0,0 +1,149 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# Default Keybinds
# visit https://wiki.hyprland.org/Configuring/Binds/ for more info
# /* ---- ✴️ Variables ✴️ ---- */ #
$mainMod = SUPER
$scriptsDir = $HOME/.config/hypr/scripts
$UserConfigs = $HOME/.config/hypr/UserConfigs
$UserScripts = $HOME/.config/hypr/UserScripts
bind = CTRL ALT, Delete, exec, hyprctl dispatch exit 0 # exit Hyprland
bind = $mainMod, Q, killactive, # close active (not kill)
bind = $mainMod SHIFT, Q, exec, $scriptsDir/KillActiveProcess.sh # Kill active process
bind = CTRL ALT, L, exec, $scriptsDir/LockScreen.sh # screen lock
bind = CTRL ALT, P, exec, $scriptsDir/Wlogout.sh # power menu
bind = $mainMod SHIFT, N, exec, swaync-client -t -sw # swayNC notification panel
bind = $mainMod SHIFT, E, exec, $scriptsDir/Kool_Quick_Settings.sh # Settings Menu KooL Hyprland Settings
# Master Layout
bind = $mainMod CTRL, D, layoutmsg, removemaster
bind = $mainMod, I, layoutmsg, addmaster
bind = $mainMod, J, layoutmsg, cyclenext
bind = $mainMod, K, layoutmsg, cycleprev
bind = $mainMod CTRL, Return, layoutmsg, swapwithmaster
# Dwindle Layout
bind = $mainMod SHIFT, I, togglesplit # only works on dwindle layout
bind = $mainMod, P, pseudo, # dwindle
# Works on either layout (Master or Dwindle)
bind = $mainMod, M, exec, hyprctl dispatch splitratio 0.3
# group
bind = $mainMod, G, togglegroup # toggle group
bind = $mainMod CTRL, tab, changegroupactive # change focus to another window
# Cycle windows if floating bring to top
bind = ALT, tab, cyclenext
bind = ALT, tab, bringactivetotop
# Special Keys / Hot Keys
bindel = , xf86audioraisevolume, exec, $scriptsDir/Volume.sh --inc # volume up
bindel = , xf86audiolowervolume, exec, $scriptsDir/Volume.sh --dec # volume down
bindl = , xf86AudioMicMute, exec, $scriptsDir/Volume.sh --toggle-mic # mic mute
bindl = , xf86audiomute, exec, $scriptsDir/Volume.sh --toggle # mute
bindl = , xf86Sleep, exec, systemctl suspend # sleep button
bindl = , xf86Rfkill, exec, $scriptsDir/AirplaneMode.sh # Airplane mode
# media controls using keyboards
bindl = , xf86AudioPlayPause, exec, $scriptsDir/MediaCtrl.sh --pause
bindl = , xf86AudioPause, exec, $scriptsDir/MediaCtrl.sh --pause
bindl = , xf86AudioPlay, exec, $scriptsDir/MediaCtrl.sh --pause
bindl = , xf86AudioNext, exec, $scriptsDir/MediaCtrl.sh --nxt
bindl = , xf86AudioPrev, exec, $scriptsDir/MediaCtrl.sh --prv
bindl = , xf86audiostop, exec, $scriptsDir/MediaCtrl.sh --stop
# Screenshot keybindings NOTE: You may need to press Fn key as well
bind = $mainMod, Print, exec, $scriptsDir/ScreenShot.sh --now # screenshot
bind = $mainMod SHIFT, Print, exec, $scriptsDir/ScreenShot.sh --area # screenshot (area)
bind = $mainMod CTRL, Print, exec, $scriptsDir/ScreenShot.sh --in5 # screenshot (5 secs delay)
bind = $mainMod CTRL SHIFT, Print, exec, $scriptsDir/ScreenShot.sh --in10 # screenshot (10 secs delay)
bind = ALT, Print, exec, $scriptsDir/ScreenShot.sh --active # screenshot (active window only)
# screenshot with swappy (another screenshot tool)
bind = $mainMod SHIFT, S, exec, $scriptsDir/ScreenShot.sh --swappy #screenshot (swappy)
# Resize windows
binde = $mainMod SHIFT, left, resizeactive,-50 0
binde = $mainMod SHIFT, right, resizeactive,50 0
binde = $mainMod SHIFT, up, resizeactive,0 -50
binde = $mainMod SHIFT, down, resizeactive,0 50
# Move windows
bind = $mainMod CTRL, left, movewindow, l
bind = $mainMod CTRL, right, movewindow, r
bind = $mainMod CTRL, up, movewindow, u
bind = $mainMod CTRL, down, movewindow, d
# Swap windows
bind = $mainMod ALT, left, swapwindow, l
bind = $mainMod ALT, right, swapwindow, r
bind = $mainMod ALT, up, swapwindow, u
bind = $mainMod ALT, down, swapwindow, d
# 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 related
bind = $mainMod, tab, workspace, m+1
bind = $mainMod SHIFT, tab, workspace, m-1
# Special workspace
bind = $mainMod SHIFT, U, movetoworkspace, special
bind = $mainMod, U, togglespecialworkspace,
# The following mappings use the key codes to better support various keyboard layouts
# 1 is code:10, 2 is code 11, etc
# Switch workspaces with mainMod + [0-9]
bind = $mainMod, code:10, workspace, 1 # NOTE: code:10 = key 1
bind = $mainMod, code:11, workspace, 2 # NOTE: code:11 = key 2
bind = $mainMod, code:12, workspace, 3 # NOTE: code:12 = key 3
bind = $mainMod, code:13, workspace, 4 # NOTE: code:13 = key 4
bind = $mainMod, code:14, workspace, 5 # NOTE: code:14 = key 5
bind = $mainMod, code:15, workspace, 6 # NOTE: code:15 = key 6
bind = $mainMod, code:16, workspace, 7 # NOTE: code:16 = key 7
bind = $mainMod, code:17, workspace, 8 # NOTE: code:17 = key 8
bind = $mainMod, code:18, workspace, 9 # NOTE: code:18 = key 9
bind = $mainMod, code:19, workspace, 10 # NOTE: code:19 = key 0
# Move active window and follow to workspace mainMod + SHIFT [0-9]
bind = $mainMod SHIFT, code:10, movetoworkspace, 1 # NOTE: code:10 = key 1
bind = $mainMod SHIFT, code:11, movetoworkspace, 2 # NOTE: code:11 = key 2
bind = $mainMod SHIFT, code:12, movetoworkspace, 3 # NOTE: code:12 = key 3
bind = $mainMod SHIFT, code:13, movetoworkspace, 4 # NOTE: code:13 = key 4
bind = $mainMod SHIFT, code:14, movetoworkspace, 5 # NOTE: code:14 = key 5
bind = $mainMod SHIFT, code:15, movetoworkspace, 6 # NOTE: code:15 = key 6
bind = $mainMod SHIFT, code:16, movetoworkspace, 7 # NOTE: code:16 = key 7
bind = $mainMod SHIFT, code:17, movetoworkspace, 8 # NOTE: code:17 = key 8
bind = $mainMod SHIFT, code:18, movetoworkspace, 9 # NOTE: code:18 = key 9
bind = $mainMod SHIFT, code:19, movetoworkspace, 10 # NOTE: code:19 = key 0
bind = $mainMod SHIFT, bracketleft, movetoworkspace, -1 # brackets [
bind = $mainMod SHIFT, bracketright, movetoworkspace, +1 # brackets ]
# Move active window to a workspace silently mainMod + CTRL [0-9]
bind = $mainMod CTRL, code:10, movetoworkspacesilent, 1 # NOTE: code:10 = key 1
bind = $mainMod CTRL, code:11, movetoworkspacesilent, 2 # NOTE: code:11 = key 2
bind = $mainMod CTRL, code:12, movetoworkspacesilent, 3 # NOTE: code:12 = key 3
bind = $mainMod CTRL, code:13, movetoworkspacesilent, 4 # NOTE: code:13 = key 4
bind = $mainMod CTRL, code:14, movetoworkspacesilent, 5 # NOTE: code:14 = key 5
bind = $mainMod CTRL, code:15, movetoworkspacesilent, 6 # NOTE: code:15 = key 6
bind = $mainMod CTRL, code:16, movetoworkspacesilent, 7 # NOTE: code:16 = key 7
bind = $mainMod CTRL, code:17, movetoworkspacesilent, 8 # NOTE: code:17 = key 8
bind = $mainMod CTRL, code:18, movetoworkspacesilent, 9 # NOTE: code:18 = key 9
bind = $mainMod CTRL, code:19, movetoworkspacesilent, 10 # NOTE: code:19 = key 0
bind = $mainMod CTRL, bracketleft, movetoworkspacesilent, -1 # brackets [
bind = $mainMod CTRL, bracketright, movetoworkspacesilent, +1 # brackets ]
# Scroll through existing workspaces with mainMod + scroll
bind = $mainMod, mouse_down, workspace, e+1
bind = $mainMod, mouse_up, workspace, e-1
bind = $mainMod, period, workspace, e+1
bind = $mainMod, comma, workspace, e-1
# Move/resize windows with mainMod + LMB/RMB and dragging
bindm = $mainMod, mouse:272, movewindow # NOTE: mouse:272 = left click
bindm = $mainMod, mouse:273, resizewindow # NOTE: mouse:272 = right click

50
hypridle.conf Normal file
View File

@@ -0,0 +1,50 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# Hypridle
# Original config submitted by https://github.com/SherLock707
$iDIR="$HOME/.config/swaync/images/ja.png"
general {
lock_cmd = pidof hyprlock || hyprlock # runs hyprlock if it is not already running (this is always run when "loginctl lock-session" is called)
# unlock_cmd = killall hyprlock # kills hyprlock when unlocking (this is always run when "loginctl unlock-session" is called)
before_sleep_cmd = loginctl lock-session # ensures that the session is locked before going to sleep
after_sleep_cmd = hyprctl dispatch dpms on # turn of screen after sleep (not strictly necessary, but just in case)
ignore_dbus_inhibit = false # whether to ignore dbus-sent idle-inhibit requests (used by e.g. firefox or steam)
}
# turn off screen faster if session is already locked
# (disabled by default)
# listener {
# timeout = 30 # 30 seconds
# on-timeout = pidof hyprlock && hyprctl dispatch dpms off # turns off the screen if hyprlock is active
# on-resume = pidof hyprlock && hyprctl dispatch dpms on # command to run when activity is detected after timeout has fired.
# }
# Warn
listener {
timeout = 540 # 9 min
on-timeout = notify-send -i $iDIR " You are idle!" # command to run when timeout has passed
on-resume = notify-send -i $iDIR " Oh! you're Back" " Hello !!!" # command to run when activity is detected after timeout has fired.
}
# Screenlock
listener {
timeout = 600 # 10 min
on-timeout = loginctl lock-session # command to run when timeout has passed
#on-resume = notify-send -i $iDIR " System Unlocked!" # command to run when activity is detected after timeout has fired.
}
# Turn off screen
# (disabled by default)
# listener {
# timeout = 630 # 10.5 min
# on-timeout = hyprctl dispatch dpms off # command to run when timeout has passed
# on-resume = hyprctl dispatch dpms on # command to run when activity is detected after timeout has fired.
# }
# Suspend # disabled by default
# listener {
# timeout = 1200 # 20 min
# on-timeout = systemctl suspend # command to run when timeout has passed
# on-resume = notify-send -i $iDIR " Oh! you're back" "Hello !!!" # command to run when activity is detected after timeout has fired.
# }

43
hyprland.conf Normal file
View File

@@ -0,0 +1,43 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# always refer to Hyprland wiki
# https://wiki.hyprland.org/
# Initial boot script enable to apply initial wallpapers, theming, new settings etc.
# suggest not to change this or delete this including deleting referrence file in ~/.config/hypr/.initial_startup_done
# as long as the referrence file is present, this initial-boot.sh will not execute
exec-once = $HOME/.config/hypr/initial-boot.sh
# Sourcing external config files
$configs = $HOME/.config/hypr/configs # Default Configs directory path
source=$configs/Keybinds.conf # Pre-configured keybinds
# ## This is where you want to start tinkering
$UserConfigs = $HOME/.config/hypr/UserConfigs # User Configs directory path
source= $UserConfigs/Startup_Apps.conf # put your start-up packages on this file
source= $UserConfigs/ENVariables.conf # Environment variables to load
#source= $UserConfigs/Monitors.conf # Its all about your monitor config (old dots) will remove on push to main
#source= $UserConfigs/WorkspaceRules.conf # Hyprland workspaces (old dots) will remove on push to main
source= $UserConfigs/Laptops.conf # For laptop related
source= $UserConfigs/LaptopDisplay.conf # Laptop display related. You need to read the comment on this file
source= $UserConfigs/WindowRules.conf # all about Hyprland Window Rules and Layer Rules
source= $UserConfigs/UserDecorations.conf # Decorations config file
source= $UserConfigs/UserAnimations.conf # Animation config file
source= $UserConfigs/UserKeybinds.conf # Put your own keybinds here
source= $UserConfigs/UserSettings.conf # Main Hyprland Settings.
source= $UserConfigs/01-UserDefaults.conf # settings for User defaults apps
# nwg-displays
source= $HOME/.config/hypr/monitors.conf
source= $HOME/.config/hypr/workspaces.conf

183
hyprlock-1080p.conf Normal file
View File

@@ -0,0 +1,183 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# Hyprlock config for < 1080p monitor resolutions
# Original config submitted by https://github.com/SherLock707
# Sourcing colors generated by wallust
source = $HOME/.config/hypr/wallust/wallust-hyprland.conf
$Scripts = $HOME/.config/hypr/scripts
general {
grace = 1
fractional_scaling = 2
immediate_render = true
}
background {
monitor =
# NOTE: use only 1 path
#path = screenshot # screenshot of your desktop
#path = $HOME/.config/hypr/wallpaper_effects/.wallpaper_modified # by wallpaper effects
path = $HOME/.config/hypr/wallpaper_effects/.wallpaper_current # current wallpaper
color = rgb(0,0,0) # color will be rendered initially until path is available
# all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations
blur_size = 3
blur_passes = 2 # 0 disables blurring
noise = 0.0117
contrast = 1.3000 # Vibrant!!!
brightness = 0.8000
vibrancy = 0.2100
vibrancy_darkness = 0.0
}
# Date
label {
monitor =
text = cmd[update:18000000] echo "<b> "$(date +'%A, %-d %B')" </b>"
color = $color13
font_size = 16
font_family = Victor Mono Bold Italic
position = 0, -120
halign = center
valign = center
}
# Hour-Time
label {
monitor =
text = cmd[update:1000] echo "$(date +"%H")"
# text = cmd[update:1000] echo "$(date +"%I")" #AM/PM
#color = rgba(255, 185, 0, .8)
color = $color13
font_size = 200
font_family = JetBrainsMono Nerd Font ExtraBold
position = 0, -60
halign = center
valign = top
}
# Minute-Time
label {
monitor =
text = cmd[update:1000] echo "$(date +"%M")"
#color = rgba(15, 10, 222, .8)
color = $color12
font_size = 200
font_family = JetBrainsMono Nerd Font ExtraBold
position = 0, -340
halign = center
valign = top
}
# Seconds-Time
label {
monitor =
text = cmd[update:1000] echo "$(date +"%S")"
# text = cmd[update:1000] echo "$(date +"%S %p")" #AM/PM
color = $color11
font_size = 35
font_family = JetBrainsMono Nerd Font ExtraBold
position = 0, -350
halign = center
valign = top
}
# Put a picture of choice here. Default is the current wallpaper
#image {
# monitor =
# path = $HOME/.config/hypr/wallpaper_effects/.wallpaper_current
# size = 160
# rounding = -1
# border_size = 0
# border_color = $color11
# rotate = 0
# reload_time = -1
# position = 0, 280
# halign = center
# valign = bottom
}
# USER
label {
monitor =
text =  $USER
color = $color13
font_size = 24
font_family = Victor Mono Bold Oblique
position = 0, 220
halign = center
valign = bottom
}
# INPUT FIELD
input-field {
monitor =
size = 200, 60
outline_thickness = 2
dots_size = 0.2 # Scale of input-field height, 0.2 - 0.8
dots_spacing = 0.2 # Scale of dots' absolute size, 0.0 - 1.0
dots_center = true
outer_color = $color11
inner_color = rgba(255, 255, 255, 0.1)
capslock_color = rgb(255,255,255)
font_color = $color13
fade_on_empty = false
font_family = Victor Mono Bold Oblique
placeholder_text = <i><span foreground="##ffffff99">🔒 Type Password</span></i>
hide_input = false
position = 0, 100
halign = center
valign = bottom
}
# Keyboard LAYOUT
label {
monitor =
text = $LAYOUT
color = $color13
font_size = 10
font_family = Victor Mono Bold Oblique
position = 0, 70
halign = center
valign = bottom
}
# uptime
label {
monitor =
text = cmd[update:60000] echo "<b> "$(uptime -p || $Scripts/UptimeNixOS.sh)" </b>"
color = $color13
font_size = 16
font_family = Victor Mono Bold Oblique
position = 0, 0
halign = right
valign = bottom
}
# battery information
label {
monitor =
text = cmd[update:1000] echo "<b> "$($Scripts/Battery.sh)" </b>"
color = $color13
font_size = 16
font_family = Victor Mono Bold Oblique
position = 0, 30
halign = right
valign = bottom
}
# weather edit the scripts for locations
# weather scripts are located in ~/.config/hypr/UserScripts Weather.sh and/or Weather.py
# see https://github.com/JaKooLit/Hyprland-Dots/wiki/TIPS#%EF%B8%8F-weather-app-related-for-waybar-and-hyprlock
label {
monitor =
text = cmd[update:3600000] [ -f "$HOME/.cache/.weather_cache" ] && cat "$HOME/.cache/.weather_cache"
color = $color13
font_size = 16
font_family = Victor Mono Bold Oblique
position = 50, 0
halign = left
valign = bottom
}

184
hyprlock.conf Normal file
View File

@@ -0,0 +1,184 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# Hyprlock config for => 2k monitor resolutions
# Original config submitted by https://github.com/SherLock707
# Sourcing colors generated by wallust
source = $HOME/.config/hypr/wallust/wallust-hyprland.conf
$Scripts = $HOME/.config/hypr/scripts
general {
grace = 1
fractional_scaling = 2
immediate_render = true
}
background {
monitor =
# NOTE: use only 1 path
#path = screenshot # screenshot of your desktop
#path = $HOME/.config/hypr/wallpaper_effects/.wallpaper_modified # by wallpaper effects
path = $HOME/.config/hypr/wallpaper_effects/.wallpaper_current # current wallpaper
color = rgb(0,0,0) # color will be rendered initially until path is available
# all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations
blur_size = 3
blur_passes = 2 # 0 disables blurring
noise = 0.0117
contrast = 1.3000 # Vibrant!!!
brightness = 0.8000
vibrancy = 0.2100
vibrancy_darkness = 0.0
}
# Date
label {
monitor =
text = cmd[update:18000000] echo "<b> "$(date +'%A, %-d %B')" </b>"
color = $color13
font_size = 18
font_family = Victor Mono Bold Italic
position = 0, -120
halign = center
valign = center
}
# Hour-Time
label {
monitor =
text = cmd[update:1000] echo "$(date +"%H")"
# text = cmd[update:1000] echo "$(date +"%I")" #AM/PM
#color = rgba(255, 185, 0, .8)
color = $color13
font_size = 240
font_family = JetBrainsMono Nerd Font ExtraBold
position = 0, -100
halign = center
valign = top
}
# Minute-Time
label {
monitor =
text = cmd[update:1000] echo "$(date +"%M")"
#color = rgba(15, 10, 222, .8)
color = $color12
font_size = 240
font_family = JetBrainsMono Nerd Font ExtraBold
position = 0, -450
halign = center
valign = top
}
# Seconds-Time
label {
monitor =
text = cmd[update:1000] echo "$(date +"%S")"
# text = cmd[update:1000] echo "$(date +"%S %p")" #AM/PM
color = $color11
font_size = 50
font_family = JetBrainsMono Nerd Font ExtraBold
position = 0, -450
halign = center
valign = top
}
# Put a picture of choice here. Default is the current wallpaper
#image {
# monitor =
# #path = $HOME/.config/hypr/wallpaper_effects/.wallpaper_current
# size = 160
# rounding = -1
# border_size = 0
# border_color = $color11
# rotate = 0
# reload_time = -1
# position = 0, 400
# halign = center
# valign = bottom
#}
# USER
label {
monitor =
text =  $USER
color = $color13
font_size = 24
font_family = Victor Mono Bold Oblique
position = 0, 280
halign = center
valign = bottom
}
# INPUT FIELD
input-field {
monitor =
size = 300, 60
outline_thickness = 2
dots_size = 0.2 # Scale of input-field height, 0.2 - 0.8
dots_spacing = 0.2 # Scale of dots' absolute size, 0.0 - 1.0
dots_center = true
outer_color = $color11
inner_color = rgba(255, 255, 255, 0.1)
font_color = $color13
capslock_color = rgb(255,255,255)
fade_on_empty = false
font_family = Victor Mono Bold Oblique
placeholder_text = <i><span foreground="##ffffff99">🔒 Type Password</span></i>
hide_input = false
position = 0, 120
halign = center
valign = bottom
}
# Keyboard LAYOUT
label {
monitor =
text = $LAYOUT
color = $color13
font_size = 12
font_family = Victor Mono Bold Oblique
position = 0, 80
halign = center
valign = bottom
}
# uptime
label {
monitor =
text = cmd[update:60000] echo "<b> "$(uptime -p || $Scripts/UptimeNixOS.sh)" </b>"
color = $color13
font_size = 18
font_family = Victor Mono Bold Oblique
position = 0, 0
halign = right
valign = bottom
}
# battery information
label {
monitor =
text = cmd[update:1000] echo "<b> "$($Scripts/Battery.sh)" </b>"
color = $color13
font_size = 18
font_family = Victor Mono Bold Oblique
position = 0, 30
halign = right
valign = bottom
}
# weather edit the scripts for locations
# weather scripts are located in ~/.config/hypr/UserScripts Weather.sh and/or Weather.py
# see https://github.com/JaKooLit/Hyprland-Dots/wiki/TIPS#%EF%B8%8F-weather-app-related-for-waybar-and-hyprlock
label {
monitor =
text = cmd[update:3600000] [ -f "$HOME/.cache/.weather_cache" ] && cat "$HOME/.cache/.weather_cache"
color = $color13
font_size = 18
font_family = Victor Mono Bold Oblique
position = 50, 0
halign = left
valign = bottom
}

66
initial-boot.sh Executable file
View File

@@ -0,0 +1,66 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# A bash script designed to run only once dotfiles installed
# THIS SCRIPT CAN BE DELETED ONCE SUCCESSFULLY BOOTED!! And also, edit ~/.config/hypr/configs/Settings.conf
# NOT necessary to do since this script is only designed to run only once as long as the marker exists
# marker file is located at ~/.config/hypr/.initial_startup_done
# However, I do highly suggest not to touch it since again, as long as the marker exist, script wont run
# Variables
scriptsDir=$HOME/.config/hypr/scripts
wallpaper=$HOME/.config/hypr/wallpaper_effects/.wallpaper_current
waybar_style="$HOME/.config/waybar/style/[Extra] Neon Circuit.css"
kvantum_theme="catppuccin-mocha-blue"
color_scheme="prefer-dark"
gtk_theme="Flat-Remix-GTK-Blue-Dark"
icon_theme="Flat-Remix-Blue-Dark"
cursor_theme="Bibata-Modern-Ice"
swww="swww img"
effect="--transition-bezier .43,1.19,1,.4 --transition-fps 30 --transition-type grow --transition-pos 0.925,0.977 --transition-duration 2"
# Check if a marker file exists.
if [ ! -f "$HOME/.config/hypr/.initial_startup_done" ]; then
sleep 1
# Initialize wallust and wallpaper
if [ -f "$wallpaper" ]; then
wallust run -s $wallpaper > /dev/null
swww query || swww-daemon && $swww $wallpaper $effect
"$scriptsDir/WallustSwww.sh" > /dev/null 2>&1 &
fi
# initiate GTK dark mode and apply icon and cursor theme
gsettings set org.gnome.desktop.interface color-scheme $color_scheme > /dev/null 2>&1 &
gsettings set org.gnome.desktop.interface gtk-theme $gtk_theme > /dev/null 2>&1 &
gsettings set org.gnome.desktop.interface icon-theme $icon_theme > /dev/null 2>&1 &
gsettings set org.gnome.desktop.interface cursor-theme $cursor_theme > /dev/null 2>&1 &
gsettings set org.gnome.desktop.interface cursor-size 24 > /dev/null 2>&1 &
# NIXOS initiate GTK dark mode and apply icon and cursor theme
if [ -n "$(grep -i nixos < /etc/os-release)" ]; then
gsettings set org.gnome.desktop.interface color-scheme "'$color_scheme'" > /dev/null 2>&1 &
dconf write /org/gnome/desktop/interface/gtk-theme "'$gtk_theme'" > /dev/null 2>&1 &
dconf write /org/gnome/desktop/interface/icon-theme "'$icon_theme'" > /dev/null 2>&1 &
dconf write /org/gnome/desktop/interface/cursor-theme "'$cursor_theme'" > /dev/null 2>&1 &
dconf write /org/gnome/desktop/interface/cursor-size "24" > /dev/null 2>&1 &
fi
# initiate kvantum theme
kvantummanager --set "$kvantum_theme" > /dev/null 2>&1 &
# initiate the kb_layout (for some reason) waybar cant launch it
"$scriptsDir/SwitchKeyboardLayout.sh" > /dev/null 2>&1 &
# waybar style
#if [ -L "$HOME/.config/waybar/config" ]; then
## ln -sf "$waybar_style" "$HOME/.config/waybar/style.css"
# "$scriptsDir/Refresh.sh" > /dev/null 2>&1 &
#fi
# Create a marker file to indicate that the script has been executed.
touch "$HOME/.config/hypr/.initial_startup_done"
exit
fi

63
monitors.conf Normal file
View File

@@ -0,0 +1,63 @@
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# default Monitor config
# *********************************************************** #
#
# NOTE: This will be overwritten by NWG-Displays
# once you use and click apply. You can still find this
# default at ~/.config/hypr/Monitor_Profiles/default.conf
#
# *********************************************************** #
# Monitor Configuration
# See Hyprland wiki for more details
# https://wiki.hyprland.org/Configuring/Monitors/
# Configure your Display resolution, offset, scale and Monitors here, use `hyprctl monitors` to get the info.
# Monitors
# monitor=,preferred,auto,1
# High Refresh Rate
# monitor=,highrr,auto,1
# High Resolution
# monitor=,highres,auto,1
monitor=DP-1,3840x2160@60,0x0,1
monitor=HDMI-A-1,3840x2160@60,3840x0,1
# NOTE: for laptop, kindly check notes in Laptops.conf regarding display
# Created this inorder for the monitor display to not wake up if not intended.
# See here: https://github.com/hyprwm/Hyprland/issues/4090
# Some examples to set your own monitor
#monitor = eDP-1, preferred, auto, 1
#monitor = eDP-1, 2560x1440@165, 0x0, 1 #own screen
#monitor = DP-3, 1920x1080@240, auto, 1
#monitor = DP-1, preferred, auto, 1
#monitor = HDMI-A-1, preferred,auto,1
# QEMU-KVM, virtual box or vmware
#monitor = Virtual-1, 1920x1080@60,auto,1
# to disable a monitor
#monitor=name,disable
# Mirror samples
#monitor=DP-3,1920x1080@60,0x0,1,mirror,DP-2
#monitor=,preferred,auto,1,mirror,eDP-1
#monitor=HDMI-A-1,2560x1440@144,0x0,1,mirror,eDP-1
# 10 bit monitor support - See wiki https://wiki.hyprland.org/Configuring/Monitors/#10-bit-support - See NOTES below
# NOTE: Colors registered in Hyprland (e.g. the border color) do not support 10 bit.
# NOTE: Some applications do not support screen capture with 10 bit enabled. (Screen captures like OBS may render black screen)
# monitor=,preferred,auto,1,bitdepth,10
#monitor=eDP-1,transform,0
#monitor=eDP-1,addreserved,10,10,10,49
# workspaces - Monitor rules
# https://wiki.hyprland.org/Configuring/Workspace-Rules/
# SUPER E - Workspace-Rules
# See ~/.config/hypr/UserConfigs/WorkspaceRules.conf

16
scripts/AirplaneMode.sh Executable file
View File

@@ -0,0 +1,16 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Airplane Mode. Turning on or off all wifi using rfkill.
notif="$HOME/.config/swaync/images/ja.png"
# Check if any wireless device is blocked
wifi_blocked=$(rfkill list wifi | grep -o "Soft blocked: yes")
if [ -n "$wifi_blocked" ]; then
rfkill unblock wifi
notify-send -u low -i "$notif" " Airplane" " mode: OFF"
else
rfkill block wifi
notify-send -u low -i "$notif" " Airplane" " mode: ON"
fi

31
scripts/Animations.sh Executable file
View File

@@ -0,0 +1,31 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# For applying Animations from different users
# Check if rofi is already running
if pidof rofi > /dev/null; then
pkill rofi
fi
# Variables
iDIR="$HOME/.config/swaync/images"
SCRIPTSDIR="$HOME/.config/hypr/scripts"
animations_dir="$HOME/.config/hypr/animations"
UserConfigs="$HOME/.config/hypr/UserConfigs"
rofi_theme="$HOME/.config/rofi/config-Animations.rasi"
msg='❗NOTE:❗ This will copy animations into UserAnimations.conf'
# list of animation files, sorted alphabetically with numbers first
animations_list=$(find -L "$animations_dir" -maxdepth 1 -type f | sed 's/.*\///' | sed 's/\.conf$//' | sort -V)
# Rofi Menu
chosen_file=$(echo "$animations_list" | rofi -i -dmenu -config $rofi_theme -mesg "$msg")
# Check if a file was selected
if [[ -n "$chosen_file" ]]; then
full_path="$animations_dir/$chosen_file.conf"
cp "$full_path" "$UserConfigs/UserAnimations.conf"
notify-send -u low -i "$iDIR/ja.png" "$chosen_file" "Hyprland Animation Loaded"
fi
sleep 1
"$SCRIPTSDIR/RefreshNoWaybar.sh"

9
scripts/Battery.sh Normal file
View File

@@ -0,0 +1,9 @@
#!/bin/bash
for i in {0..3}; do
if [ -f /sys/class/power_supply/BAT$i/capacity ]; then
battery_level=$(cat /sys/class/power_supply/BAT$i/status)
battery_capacity=$(cat /sys/class/power_supply/BAT$i/capacity)
echo "Battery: $battery_capacity% ($battery_level)"
fi
done

69
scripts/Brightness.sh Executable file
View File

@@ -0,0 +1,69 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Script for Monitor backlights (if supported) using brightnessctl
iDIR="$HOME/.config/swaync/icons"
notification_timeout=1000
step=10 # INCREASE/DECREASE BY THIS VALUE
# Get current brightness as an integer (without %)
get_brightness() {
brightnessctl -m | cut -d, -f4 | tr -d '%'
}
# Determine the icon based on brightness level
get_icon_path() {
local brightness=$1
local level=$(( (brightness + 19) / 20 * 20 )) # Round up to next 20
if (( level > 100 )); then
level=100
fi
echo "$iDIR/brightness-${level}.png"
}
# Send notification
send_notification() {
local brightness=$1
local icon_path=$2
notify-send -e \
-h string:x-canonical-private-synchronous:brightness_notif \
-h int:value:"$brightness" \
-u low \
-i "$icon_path" \
"Screen" "Brightness: ${brightness}%"
}
# Change brightness and notify
change_brightness() {
local delta=$1
local current new icon
current=$(get_brightness)
new=$((current + delta))
# Clamp between 5 and 100
(( new < 5 )) && new=5
(( new > 100 )) && new=100
brightnessctl set "${new}%"
icon=$(get_icon_path "$new")
send_notification "$new" "$icon"
}
# Main
case "$1" in
"--get")
get_brightness
;;
"--inc")
change_brightness "$step"
;;
"--dec")
change_brightness "-$step"
;;
*)
get_brightness
;;
esac

51
scripts/BrightnessKbd.sh Executable file
View File

@@ -0,0 +1,51 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Script for keyboard backlights (if supported) using brightnessctl
iDIR="$HOME/.config/swaync/icons"
# Get keyboard brightness
get_kbd_backlight() {
echo $(brightnessctl -d '*::kbd_backlight' -m | cut -d, -f4)
}
# Get icons
get_icon() {
current=$(get_kbd_backlight | sed 's/%//')
if [ "$current" -le "20" ]; then
icon="$iDIR/brightness-20.png"
elif [ "$current" -le "40" ]; then
icon="$iDIR/brightness-40.png"
elif [ "$current" -le "60" ]; then
icon="$iDIR/brightness-60.png"
elif [ "$current" -le "80" ]; then
icon="$iDIR/brightness-80.png"
else
icon="$iDIR/brightness-100.png"
fi
}
# Notify
notify_user() {
notify-send -e -h string:x-canonical-private-synchronous:brightness_notif -h int:value:$current -h boolean:SWAYNC_BYPASS_DND:true -u low -i "$icon" "Keyboard" "Brightness:$current%"
}
# Change brightness
change_kbd_backlight() {
brightnessctl -d *::kbd_backlight set "$1" && get_icon && notify_user
}
# Execute accordingly
case "$1" in
"--get")
get_kbd_backlight
;;
"--inc")
change_kbd_backlight "+30%"
;;
"--dec")
change_kbd_backlight "30%-"
;;
*)
get_kbd_backlight
;;
esac

17
scripts/ChangeBlur.sh Executable file
View File

@@ -0,0 +1,17 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Script for changing blurs on the fly
notif="$HOME/.config/swaync/images"
STATE=$(hyprctl -j getoption decoration:blur:passes | jq ".int")
if [ "${STATE}" == "2" ]; then
hyprctl keyword decoration:blur:size 2
hyprctl keyword decoration:blur:passes 1
notify-send -e -u low -i "$notif/note.png" " Less Blur"
else
hyprctl keyword decoration:blur:size 5
hyprctl keyword decoration:blur:passes 2
notify-send -e -u low -i "$notif/ja.png" " Normal Blur"
fi

30
scripts/ChangeLayout.sh Executable file
View File

@@ -0,0 +1,30 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# for changing Hyprland Layouts (Master or Dwindle) on the fly
notif="$HOME/.config/swaync/images/ja.png"
LAYOUT=$(hyprctl -j getoption general:layout | jq '.str' | sed 's/"//g')
case $LAYOUT in
"master")
hyprctl keyword general:layout dwindle
hyprctl keyword unbind SUPER,J
hyprctl keyword unbind SUPER,K
hyprctl keyword bind SUPER,J,cyclenext
hyprctl keyword bind SUPER,K,cyclenext,prev
hyprctl keyword bind SUPER,O,togglesplit
notify-send -e -u low -i "$notif" " Dwindle Layout"
;;
"dwindle")
hyprctl keyword general:layout master
hyprctl keyword unbind SUPER,J
hyprctl keyword unbind SUPER,K
hyprctl keyword unbind SUPER,O
hyprctl keyword bind SUPER,J,layoutmsg,cyclenext
hyprctl keyword bind SUPER,K,layoutmsg,cycleprev
notify-send -e -u low -i "$notif" " Master Layout"
;;
*) ;;
esac

49
scripts/ClipManager.sh Executable file
View File

@@ -0,0 +1,49 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Clipboard Manager. This script uses cliphist, rofi, and wl-copy.
# Variables
rofi_theme="$HOME/.config/rofi/config-clipboard.rasi"
msg='👀 **note** CTRL DEL = cliphist del (entry) or ALT DEL - cliphist wipe (all)'
# Actions:
# CTRL Del to delete an entry
# ALT Del to wipe clipboard contents
# Check if rofi is already running
if pidof rofi > /dev/null; then
pkill rofi
fi
while true; do
result=$(
rofi -i -dmenu \
-kb-custom-1 "Control-Delete" \
-kb-custom-2 "Alt-Delete" \
-config $rofi_theme < <(cliphist list) \
-mesg "$msg"
)
case "$?" in
1)
exit
;;
0)
case "$result" in
"")
continue
;;
*)
cliphist decode <<<"$result" | wl-copy
exit
;;
esac
;;
10)
cliphist delete <<<"$result"
;;
11)
cliphist wipe
;;
esac
done

254
scripts/DarkLight.sh Executable file
View File

@@ -0,0 +1,254 @@
#!/bin/bash
## /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# For Dark and Light switching
# Note: Scripts are looking for keywords Light or Dark except for wallpapers as the are in a separate directories
# Paths
wallpaper_base_path="$HOME/Pictures/wallpapers/Dynamic-Wallpapers"
dark_wallpapers="$wallpaper_base_path/Dark"
light_wallpapers="$wallpaper_base_path/Light"
hypr_config_path="$HOME/.config/hypr"
swaync_style="$HOME/.config/swaync/style.css"
ags_style="$HOME/.config/ags/user/style.css"
SCRIPTSDIR="$HOME/.config/hypr/scripts"
notif="$HOME/.config/swaync/images/bell.png"
wallust_rofi="$HOME/.config/wallust/templates/colors-rofi.rasi"
kitty_conf="$HOME/.config/kitty/kitty.conf"
wallust_config="$HOME/.config/wallust/wallust.toml"
pallete_dark="dark16"
pallete_light="light16"
# intial kill process
for pid in waybar rofi swaync ags swaybg; do
killall -SIGUSR1 "$pid"
done
# Initialize swww if needed
swww query || swww-daemon --format xrgb
# Set swww options
swww="swww img"
effect="--transition-bezier .43,1.19,1,.4 --transition-fps 60 --transition-type grow --transition-pos 0.925,0.977 --transition-duration 2"
# Determine current theme mode
if [ "$(cat $HOME/.cache/.theme_mode)" = "Light" ]; then
next_mode="Dark"
# Logic for Dark mode
wallpaper_path="$dark_wallpapers"
else
next_mode="Light"
# Logic for Light mode
wallpaper_path="$light_wallpapers"
fi
# Function to update theme mode for the next cycle
update_theme_mode() {
echo "$next_mode" > "$HOME/.cache/.theme_mode"
}
# Function to notify user
notify_user() {
notify-send -u low -i "$notif" " Switching to" " $1 mode"
}
# Use sed to replace the palette setting in the wallust config file
if [ "$next_mode" = "Dark" ]; then
sed -i 's/^palette = .*/palette = "'"$pallete_dark"'"/' "$wallust_config"
else
sed -i 's/^palette = .*/palette = "'"$pallete_light"'"/' "$wallust_config"
fi
# Function to set Waybar style
set_waybar_style() {
theme="$1"
waybar_styles="$HOME/.config/waybar/style"
waybar_style_link="$HOME/.config/waybar/style.css"
style_prefix="\\[${theme}\\].*\\.css$"
style_file=$(find -L "$waybar_styles" -maxdepth 1 -type f -regex ".*$style_prefix" | shuf -n 1)
if [ -n "$style_file" ]; then
ln -sf "$style_file" "$waybar_style_link"
else
echo "Style file not found for $theme theme."
fi
}
# Call the function after determining the mode
set_waybar_style "$next_mode"
notify_user "$next_mode"
# swaync color change
if [ "$next_mode" = "Dark" ]; then
sed -i '/@define-color noti-bg/s/rgba([0-9]*,\s*[0-9]*,\s*[0-9]*,\s*[0-9.]*);/rgba(0, 0, 0, 0.8);/' "${swaync_style}"
#sed -i '/@define-color noti-bg-alt/s/#.*;/#111111;/' "${swaync_style}"
else
sed -i '/@define-color noti-bg/s/rgba([0-9]*,\s*[0-9]*,\s*[0-9]*,\s*[0-9.]*);/rgba(255, 255, 255, 0.9);/' "${swaync_style}"
#sed -i '/@define-color noti-bg-alt/s/#.*;/#F0F0F0;/' "${swaync_style}"
fi
# ags color change
if command -v ags >/dev/null 2>&1; then
if [ "$next_mode" = "Dark" ]; then
sed -i '/@define-color noti-bg/s/rgba([0-9]*,\s*[0-9]*,\s*[0-9]*,\s*[0-9.]*);/rgba(0, 0, 0, 0.4);/' "${ags_style}"
sed -i '/@define-color text-color/s/rgba([0-9]*,\s*[0-9]*,\s*[0-9]*,\s*[0-9.]*);/rgba(255, 255, 255, 0.7);/' "${ags_style}"
sed -i '/@define-color noti-bg-alt/s/#.*;/#111111;/' "${ags_style}"
else
sed -i '/@define-color noti-bg/s/rgba([0-9]*,\s*[0-9]*,\s*[0-9]*,\s*[0-9.]*);/rgba(255, 255, 255, 0.4);/' "${ags_style}"
sed -i '/@define-color text-color/s/rgba([0-9]*,\s*[0-9]*,\s*[0-9]*,\s*[0-9.]*);/rgba(0, 0, 0, 0.7);/' "${ags_style}"
sed -i '/@define-color noti-bg-alt/s/#.*;/#F0F0F0;/' "${ags_style}"
fi
fi
# kitty background color change
if [ "$next_mode" = "Dark" ]; then
sed -i '/^foreground /s/^foreground .*/foreground #dddddd/' "${kitty_conf}"
sed -i '/^background /s/^background .*/background #000000/' "${kitty_conf}"
sed -i '/^cursor /s/^cursor .*/cursor #dddddd/' "${kitty_conf}"
else
sed -i '/^foreground /s/^foreground .*/foreground #000000/' "${kitty_conf}"
sed -i '/^background /s/^background .*/background #dddddd/' "${kitty_conf}"
sed -i '/^cursor /s/^cursor .*/cursor #000000/' "${kitty_conf}"
fi
for pid_kitty in $(pidof kitty); do
kill -SIGUSR1 "$pid_kitty"
done
# Set Dynamic Wallpaper for Dark or Light Mode
if [ "$next_mode" = "Dark" ]; then
next_wallpaper="$(find -L "${dark_wallpapers}" -type f \( -iname "*.jpg" -o -iname "*.png" \) -print0 | shuf -n1 -z | xargs -0)"
else
next_wallpaper="$(find -L "${light_wallpapers}" -type f \( -iname "*.jpg" -o -iname "*.png" \) -print0 | shuf -n1 -z | xargs -0)"
fi
# Update wallpaper using swww command
$swww "${next_wallpaper}" $effect
# Set Kvantum Manager theme & QT5/QT6 settings
if [ "$next_mode" = "Dark" ]; then
kvantum_theme="catppuccin-mocha-blue"
#qt5ct_color_scheme="$HOME/.config/qt5ct/colors/Catppuccin-Mocha.conf"
#qt6ct_color_scheme="$HOME/.config/qt6ct/colors/Catppuccin-Mocha.conf"
else
kvantum_theme="catppuccin-latte-blue"
#qt5ct_color_scheme="$HOME/.config/qt5ct/colors/Catppuccin-Latte.conf"
#qt6ct_color_scheme="$HOME/.config/qt6ct/colors/Catppuccin-Latte.conf"
fi
sed -i "s|^color_scheme_path=.*$|color_scheme_path=$qt5ct_color_scheme|" "$HOME/.config/qt5ct/qt5ct.conf"
sed -i "s|^color_scheme_path=.*$|color_scheme_path=$qt6ct_color_scheme|" "$HOME/.config/qt6ct/qt6ct.conf"
kvantummanager --set "$kvantum_theme"
# set the rofi color for background
if [ "$next_mode" = "Dark" ]; then
sed -i '/^background:/s/.*/background: rgba(0,0,0,0.7);/' $wallust_rofi
else
sed -i '/^background:/s/.*/background: rgba(255,255,255,0.9);/' $wallust_rofi
fi
# GTK themes and icons switching
set_custom_gtk_theme() {
mode=$1
gtk_themes_directory="$HOME/.themes"
icon_directory="$HOME/.icons"
color_setting="org.gnome.desktop.interface color-scheme"
theme_setting="org.gnome.desktop.interface gtk-theme"
icon_setting="org.gnome.desktop.interface icon-theme"
if [ "$mode" == "Light" ]; then
search_keywords="*Light*"
gsettings set $color_setting 'prefer-light'
elif [ "$mode" == "Dark" ]; then
search_keywords="*Dark*"
gsettings set $color_setting 'prefer-dark'
else
echo "Invalid mode provided."
return 1
fi
themes=()
icons=()
while IFS= read -r -d '' theme_search; do
themes+=("$(basename "$theme_search")")
done < <(find "$gtk_themes_directory" -maxdepth 1 -type d -iname "$search_keywords" -print0)
while IFS= read -r -d '' icon_search; do
icons+=("$(basename "$icon_search")")
done < <(find "$icon_directory" -maxdepth 1 -type d -iname "$search_keywords" -print0)
if [ ${#themes[@]} -gt 0 ]; then
if [ "$mode" == "Dark" ]; then
selected_theme=${themes[RANDOM % ${#themes[@]}]}
else
selected_theme=${themes[$RANDOM % ${#themes[@]}]}
fi
echo "Selected GTK theme for $mode mode: $selected_theme"
gsettings set $theme_setting "$selected_theme"
# Flatpak GTK apps (themes)
if command -v flatpak &> /dev/null; then
flatpak --user override --filesystem=$HOME/.themes
sleep 0.5
flatpak --user override --env=GTK_THEME="$selected_theme"
fi
else
echo "No $mode GTK theme found"
fi
if [ ${#icons[@]} -gt 0 ]; then
if [ "$mode" == "Dark" ]; then
selected_icon=${icons[RANDOM % ${#icons[@]}]}
else
selected_icon=${icons[$RANDOM % ${#icons[@]}]}
fi
echo "Selected icon theme for $mode mode: $selected_icon"
gsettings set $icon_setting "$selected_icon"
## QT5ct icon_theme
sed -i "s|^icon_theme=.*$|icon_theme=$selected_icon|" "$HOME/.config/qt5ct/qt5ct.conf"
sed -i "s|^icon_theme=.*$|icon_theme=$selected_icon|" "$HOME/.config/qt6ct/qt6ct.conf"
# Flatpak GTK apps (icons)
if command -v flatpak &> /dev/null; then
flatpak --user override --filesystem=$HOME/.icons
sleep 0.5
flatpak --user override --env=ICON_THEME="$selected_icon"
fi
else
echo "No $mode icon theme found"
fi
}
# Call the function to set GTK theme and icon theme based on mode
set_custom_gtk_theme "$next_mode"
# Update theme mode for the next cycle
update_theme_mode
${SCRIPTSDIR}/WallustSwww.sh &&
sleep 2
# kill process
for pid1 in waybar rofi swaync ags swaybg; do
killall "$pid1"
done
sleep 1
${SCRIPTSDIR}/Refresh.sh
sleep 0.5
# Display notifications for theme and icon changes
notify-send -u low -i "$notif" " Themes switched to:" " $next_mode Mode"
exit 0

40
scripts/Distro_update.sh Executable file
View File

@@ -0,0 +1,40 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Simple bash script to check and will try to update your system
# Local Paths
iDIR="$HOME/.config/swaync/images"
# Check for required tools (kitty)
if ! command -v kitty &> /dev/null; then
notify-send -i "$iDIR/error.png" "Need Kitty:" "Kitty terminal not found. Please install Kitty terminal."
exit 1
fi
# Detect distribution and update accordingly
if command -v paru &> /dev/null || command -v yay &> /dev/null; then
# Arch-based
if command -v paru &> /dev/null; then
kitty -T update paru -Syu
notify-send -i "$iDIR/ja.png" -u low 'Arch-based system' 'has been updated.'
else
kitty -T update yay -Syu
notify-send -i "$iDIR/ja.png" -u low 'Arch-based system' 'has been updated.'
fi
elif command -v dnf &> /dev/null; then
# Fedora-based
kitty -T update sudo dnf update --refresh -y
notify-send -i "$iDIR/ja.png" -u low 'Fedora system' 'has been updated.'
elif command -v apt &> /dev/null; then
# Debian-based (Debian, Ubuntu, etc.)
kitty -T update sudo apt update && sudo apt upgrade -y
notify-send -i "$iDIR/ja.png" -u low 'Debian/Ubuntu system' 'has been updated.'
elif command -v zypper &> /dev/null; then
# openSUSE-based
kitty -T update sudo zypper dup -y
notify-send -i "$iDIR/ja.png" -u low 'openSUSE system' 'has been updated.'
else
# Unsupported distro
notify-send -i "$iDIR/error.png" -u critical "Unsupported system" "This script does not support your distribution."
exit 1
fi

380
scripts/Dropterminal.sh Executable file
View File

@@ -0,0 +1,380 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
#
# Made and brought to by Kiran George
# /* -- ✨ https://github.com/SherLock707 ✨ -- */ ##
# Dropdown Terminal
# Usage: ./Dropdown.sh [-d] <terminal_command>
# Example: ./Dropdown.sh foot
# ./Dropdown.sh -d foot (with debug output)
# ./Dropdown.sh "kitty -e zsh"
# ./Dropdown.sh "alacritty --working-directory /home/user"
DEBUG=false
SPECIAL_WS="special:scratchpad"
ADDR_FILE="/tmp/dropdown_terminal_addr"
# Dropdown size and position configuration (percentages)
WIDTH_PERCENT=50 # Width as percentage of screen width
HEIGHT_PERCENT=50 # Height as percentage of screen height
Y_PERCENT=5 # Y position as percentage from top (X is auto-centered)
# Animation settings
ANIMATION_DURATION=100 # milliseconds
SLIDE_STEPS=5
SLIDE_DELAY=5 # milliseconds between steps
# Parse arguments
if [ "$1" = "-d" ]; then
DEBUG=true
shift
fi
TERMINAL_CMD="$1"
# Debug echo function
debug_echo() {
if [ "$DEBUG" = true ]; then
echo "$@"
fi
}
# Validate input
if [ -z "$TERMINAL_CMD" ]; then
echo "Missing terminal command. Usage: $0 [-d] <terminal_command>"
echo "Examples:"
echo " $0 foot"
echo " $0 -d foot (with debug output)"
echo " $0 'kitty -e zsh'"
echo " $0 'alacritty --working-directory /home/user'"
echo ""
echo "Edit the script to modify size and position:"
echo " WIDTH_PERCENT - Width as percentage of screen (default: 50)"
echo " HEIGHT_PERCENT - Height as percentage of screen (default: 50)"
echo " Y_PERCENT - Y position from top as percentage (default: 5)"
echo " Note: X position is automatically centered"
exit 1
fi
# Function to get window geometry
get_window_geometry() {
local addr="$1"
hyprctl clients -j | jq -r --arg ADDR "$addr" '.[] | select(.address == $ADDR) | "\(.at[0]) \(.at[1]) \(.size[0]) \(.size[1])"'
}
# Function to animate window slide down (show)
animate_slide_down() {
local addr="$1"
local target_x="$2"
local target_y="$3"
local width="$4"
local height="$5"
debug_echo "Animating slide down for window $addr to position $target_x,$target_y"
# Start position (above screen)
local start_y=$((target_y - height - 50))
# Calculate step size
local step_y=$(((target_y - start_y) / SLIDE_STEPS))
# Move window to start position instantly (off-screen)
hyprctl dispatch movewindowpixel "exact $target_x $start_y,address:$addr" >/dev/null 2>&1
sleep 0.05
# Animate slide down
for i in $(seq 1 $SLIDE_STEPS); do
local current_y=$((start_y + (step_y * i)))
hyprctl dispatch movewindowpixel "exact $target_x $current_y,address:$addr" >/dev/null 2>&1
sleep 0.03
done
# Ensure final position is exact
hyprctl dispatch movewindowpixel "exact $target_x $target_y,address:$addr" >/dev/null 2>&1
}
# Function to animate window slide up (hide)
animate_slide_up() {
local addr="$1"
local start_x="$2"
local start_y="$3"
local width="$4"
local height="$5"
debug_echo "Animating slide up for window $addr from position $start_x,$start_y"
# End position (above screen)
local end_y=$((start_y - height - 50))
# Calculate step size
local step_y=$(((start_y - end_y) / SLIDE_STEPS))
# Animate slide up
for i in $(seq 1 $SLIDE_STEPS); do
local current_y=$((start_y - (step_y * i)))
hyprctl dispatch movewindowpixel "exact $start_x $current_y,address:$addr" >/dev/null 2>&1
sleep 0.03
done
debug_echo "Slide up animation completed"
}
# Function to get monitor info including scale and name of focused monitor
get_monitor_info() {
local monitor_data=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | "\(.x) \(.y) \(.width) \(.height) \(.scale) \(.name)"')
if [ -z "$monitor_data" ] || [[ "$monitor_data" =~ ^null ]]; then
debug_echo "Error: Could not get focused monitor information"
return 1
fi
echo "$monitor_data"
}
# Function to calculate dropdown position with proper scaling and centering
calculate_dropdown_position() {
local monitor_info=$(get_monitor_info)
if [ $? -ne 0 ] || [ -z "$monitor_info" ]; then
debug_echo "Error: Failed to get monitor info, using fallback values"
echo "100 100 800 600 fallback-monitor"
return 1
fi
local mon_x=$(echo $monitor_info | cut -d' ' -f1)
local mon_y=$(echo $monitor_info | cut -d' ' -f2)
local mon_width=$(echo $monitor_info | cut -d' ' -f3)
local mon_height=$(echo $monitor_info | cut -d' ' -f4)
local mon_scale=$(echo $monitor_info | cut -d' ' -f5)
local mon_name=$(echo $monitor_info | cut -d' ' -f6)
debug_echo "Monitor info: x=$mon_x, y=$mon_y, width=$mon_width, height=$mon_height, scale=$mon_scale"
# Validate scale value and provide fallback
if [ -z "$mon_scale" ] || [ "$mon_scale" = "null" ] || [ "$mon_scale" = "0" ]; then
debug_echo "Invalid scale value, using 1.0 as fallback"
mon_scale="1.0"
fi
# Calculate logical dimensions by dividing physical dimensions by scale
local logical_width logical_height
if command -v bc >/dev/null 2>&1; then
# Use bc for precise floating point calculation
logical_width=$(echo "scale=0; $mon_width / $mon_scale" | bc | cut -d'.' -f1)
logical_height=$(echo "scale=0; $mon_height / $mon_scale" | bc | cut -d'.' -f1)
else
# Fallback to integer math (multiply by 100 for precision, then divide)
local scale_int=$(echo "$mon_scale" | sed 's/\.//' | sed 's/^0*//')
if [ -z "$scale_int" ]; then scale_int=100; fi
logical_width=$(((mon_width * 100) / scale_int))
logical_height=$(((mon_height * 100) / scale_int))
fi
# Ensure we have valid integer values
if ! [[ "$logical_width" =~ ^-?[0-9]+$ ]]; then logical_width=$mon_width; fi
if ! [[ "$logical_height" =~ ^-?[0-9]+$ ]]; then logical_height=$mon_height; fi
debug_echo "Physical resolution: ${mon_width}x${mon_height}"
debug_echo "Logical resolution: ${logical_width}x${logical_height} (physical ÷ scale)"
# Calculate window dimensions based on LOGICAL space percentages
local width=$((logical_width * WIDTH_PERCENT / 100))
local height=$((logical_height * HEIGHT_PERCENT / 100))
# Calculate Y position from top based on percentage of LOGICAL height
local y_offset=$((logical_height * Y_PERCENT / 100))
# Calculate centered X position in LOGICAL space
local x_offset=$(((logical_width - width) / 2))
# Apply monitor offset to get final positions in logical coordinates
local final_x=$((mon_x + x_offset))
local final_y=$((mon_y + y_offset))
debug_echo "Window size: ${width}x${height} (logical pixels)"
debug_echo "Final position: x=$final_x, y=$final_y (logical coordinates)"
debug_echo "Hyprland will scale these to physical coordinates automatically"
echo "$final_x $final_y $width $height $mon_name"
}
# Get the current workspace
CURRENT_WS=$(hyprctl activeworkspace -j | jq -r '.id')
# Function to get stored terminal address
get_terminal_address() {
if [ -f "$ADDR_FILE" ] && [ -s "$ADDR_FILE" ]; then
cut -d' ' -f1 "$ADDR_FILE"
fi
}
# Function to get stored monitor name
get_terminal_monitor() {
if [ -f "$ADDR_FILE" ] && [ -s "$ADDR_FILE" ]; then
cut -d' ' -f2- "$ADDR_FILE"
fi
}
# Function to check if terminal exists
terminal_exists() {
local addr=$(get_terminal_address)
if [ -n "$addr" ]; then
hyprctl clients -j | jq -e --arg ADDR "$addr" 'any(.[]; .address == $ADDR)' >/dev/null 2>&1
else
return 1
fi
}
# Function to check if terminal is in special workspace
terminal_in_special() {
local addr=$(get_terminal_address)
if [ -n "$addr" ]; then
hyprctl clients -j | jq -e --arg ADDR "$addr" 'any(.[]; .address == $ADDR and .workspace.name == "special:scratchpad")' >/dev/null 2>&1
else
return 1
fi
}
# Function to spawn terminal and capture its address
spawn_terminal() {
debug_echo "Creating new dropdown terminal with command: $TERMINAL_CMD"
# Calculate dropdown position for later use
local pos_info=$(calculate_dropdown_position)
if [ $? -ne 0 ]; then
debug_echo "Warning: Using fallback positioning"
fi
local target_x=$(echo $pos_info | cut -d' ' -f1)
local target_y=$(echo $pos_info | cut -d' ' -f2)
local width=$(echo $pos_info | cut -d' ' -f3)
local height=$(echo $pos_info | cut -d' ' -f4)
local monitor_name=$(echo $pos_info | cut -d' ' -f5)
debug_echo "Target position: ${target_x},${target_y}, size: ${width}x${height}"
# Get window count before spawning
local windows_before=$(hyprctl clients -j)
local count_before=$(echo "$windows_before" | jq 'length')
# Launch terminal directly in special workspace to avoid visible spawn
hyprctl dispatch exec "[float; size $width $height; workspace special:scratchpad silent] $TERMINAL_CMD"
# Wait for window to appear
sleep 0.1
# Get windows after spawning
local windows_after=$(hyprctl clients -j)
local count_after=$(echo "$windows_after" | jq 'length')
local new_addr=""
if [ "$count_after" -gt "$count_before" ]; then
# Find the new window by comparing before/after lists
new_addr=$(comm -13 \
<(echo "$windows_before" | jq -r '.[].address' | sort) \
<(echo "$windows_after" | jq -r '.[].address' | sort) \
| head -1)
fi
# Fallback: try to find by the most recently mapped window
if [ -z "$new_addr" ] || [ "$new_addr" = "null" ]; then
new_addr=$(hyprctl clients -j | jq -r 'sort_by(.focusHistoryID) | .[-1] | .address')
fi
if [ -n "$new_addr" ] && [ "$new_addr" != "null" ]; then
# Store the address and monitor name
echo "$new_addr $monitor_name" > "$ADDR_FILE"
debug_echo "Terminal created with address: $new_addr in special workspace on monitor $monitor_name"
# Small delay to ensure it's properly in special workspace
sleep 0.2
# Now bring it back with the same animation as subsequent shows
# Use movetoworkspacesilent to avoid affecting workspace history
hyprctl dispatch movetoworkspacesilent "$CURRENT_WS,address:$new_addr"
hyprctl dispatch pin "address:$new_addr"
animate_slide_down "$new_addr" "$target_x" "$target_y" "$width" "$height"
return 0
fi
debug_echo "Failed to get terminal address"
return 1
}
# Main logic
if terminal_exists; then
TERMINAL_ADDR=$(get_terminal_address)
debug_echo "Found existing terminal: $TERMINAL_ADDR"
focused_monitor=$(get_monitor_info | awk '{print $6}')
dropdown_monitor=$(get_terminal_monitor)
if [ "$focused_monitor" != "$dropdown_monitor" ]; then
debug_echo "Monitor focus changed: moving dropdown to $focused_monitor"
# Calculate new position for focused monitor
pos_info=$(calculate_dropdown_position)
target_x=$(echo $pos_info | cut -d' ' -f1)
target_y=$(echo $pos_info | cut -d' ' -f2)
width=$(echo $pos_info | cut -d' ' -f3)
height=$(echo $pos_info | cut -d' ' -f4)
monitor_name=$(echo $pos_info | cut -d' ' -f5)
# Move and resize window
hyprctl dispatch movewindowpixel "exact $target_x $target_y,address:$TERMINAL_ADDR"
hyprctl dispatch resizewindowpixel "exact $width $height,address:$TERMINAL_ADDR"
# Update ADDR_FILE
echo "$TERMINAL_ADDR $monitor_name" > "$ADDR_FILE"
fi
if terminal_in_special; then
debug_echo "Bringing terminal from scratchpad with slide down animation"
# Calculate target position
pos_info=$(calculate_dropdown_position)
target_x=$(echo $pos_info | cut -d' ' -f1)
target_y=$(echo $pos_info | cut -d' ' -f2)
width=$(echo $pos_info | cut -d' ' -f3)
height=$(echo $pos_info | cut -d' ' -f4)
# Use movetoworkspacesilent to avoid affecting workspace history
hyprctl dispatch movetoworkspacesilent "$CURRENT_WS,address:$TERMINAL_ADDR"
hyprctl dispatch pin "address:$TERMINAL_ADDR"
# Set size and animate slide down
hyprctl dispatch resizewindowpixel "exact $width $height,address:$TERMINAL_ADDR"
animate_slide_down "$TERMINAL_ADDR" "$target_x" "$target_y" "$width" "$height"
hyprctl dispatch focuswindow "address:$TERMINAL_ADDR"
else
debug_echo "Hiding terminal to scratchpad with slide up animation"
# Get current geometry for animation
geometry=$(get_window_geometry "$TERMINAL_ADDR")
if [ -n "$geometry" ]; then
curr_x=$(echo $geometry | cut -d' ' -f1)
curr_y=$(echo $geometry | cut -d' ' -f2)
curr_width=$(echo $geometry | cut -d' ' -f3)
curr_height=$(echo $geometry | cut -d' ' -f4)
debug_echo "Current geometry: ${curr_x},${curr_y} ${curr_width}x${curr_height}"
# Animate slide up first
animate_slide_up "$TERMINAL_ADDR" "$curr_x" "$curr_y" "$curr_width" "$curr_height"
# Small delay then move to special workspace and unpin
sleep 0.1
hyprctl dispatch pin "address:$TERMINAL_ADDR" # Unpin (toggle)
hyprctl dispatch movetoworkspacesilent "$SPECIAL_WS,address:$TERMINAL_ADDR"
else
debug_echo "Could not get window geometry, moving to scratchpad without animation"
hyprctl dispatch pin "address:$TERMINAL_ADDR"
hyprctl dispatch movetoworkspacesilent "$SPECIAL_WS,address:$TERMINAL_ADDR"
fi
fi
else
debug_echo "No existing terminal found, creating new one"
if spawn_terminal; then
TERMINAL_ADDR=$(get_terminal_address)
if [ -n "$TERMINAL_ADDR" ]; then
hyprctl dispatch focuswindow "address:$TERMINAL_ADDR"
fi
fi
fi

34
scripts/GameMode.sh Executable file
View File

@@ -0,0 +1,34 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Game Mode. Turning off all animations
notif="$HOME/.config/swaync/images/ja.png"
SCRIPTSDIR="$HOME/.config/hypr/scripts"
HYPRGAMEMODE=$(hyprctl getoption animations:enabled | awk 'NR==1{print $2}')
if [ "$HYPRGAMEMODE" = 1 ] ; then
hyprctl --batch "\
keyword animations:enabled 0;\
keyword decoration:shadow:enabled 0;\
keyword decoration:blur:enabled 0;\
keyword general:gaps_in 0;\
keyword general:gaps_out 0;\
keyword general:border_size 1;\
keyword decoration:rounding 0"
hyprctl keyword "windowrule opacity 1 override 1 override 1 override, ^(.*)$"
swww kill
notify-send -e -u low -i "$notif" " Gamemode:" " enabled"
exit
else
swww-daemon --format xrgb && swww img "$HOME/.config/rofi/.current_wallpaper" &
sleep 0.1
${SCRIPTSDIR}/WallustSwww.sh
sleep 0.5
hyprctl reload
${SCRIPTSDIR}/Refresh.sh
notify-send -e -u normal -i "$notif" " Gamemode:" " disabled"
exit
fi
hyprctl reload

23
scripts/Hypridle.sh Executable file
View File

@@ -0,0 +1,23 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# This is for custom version of waybar idle_inhibitor which activates / deactivates hypridle instead
PROCESS="hypridle"
if [[ "$1" == "status" ]]; then
sleep 1
if pgrep -x "$PROCESS" >/dev/null; then
echo '{"text": "RUNNING", "class": "active", "tooltip": "idle_inhibitor NOT ACTIVE\nLeft Click: Activate\nRight Click: Lock Screen"}'
else
echo '{"text": "NOT RUNNING", "class": "notactive", "tooltip": "idle_inhibitor is ACTIVE\nLeft Click: Deactivate\nRight Click: Lock Screen"}'
fi
elif [[ "$1" == "toggle" ]]; then
if pgrep -x "$PROCESS" >/dev/null; then
pkill "$PROCESS"
else
"$PROCESS"
fi
else
echo "Usage: $0 {status|toggle}"
exit 1
fi

99
scripts/Hyprsunset.sh Executable file
View File

@@ -0,0 +1,99 @@
#!/usr/bin/env bash
set -euo pipefail
# Hyprsunset toggle + Waybar status helper
# Phase 1: manual toggle only (no scheduling)
# Icons:
# - Off: bright sun
# - On: sunset icon if available, otherwise a blue sun
#
# Customize via env vars:
# HYPERSUNSET_TEMP default 4500 (K)
# HYPERSUNSET_ICON_MODE sunset|blue (default: sunset)
STATE_FILE="$HOME/.cache/.hyprsunset_state"
TARGET_TEMP="${HYPERSUNSET_TEMP:-4500}"
ICON_MODE="${HYPERSUNSET_ICON_MODE:-sunset}"
ensure_state() {
[[ -f "$STATE_FILE" ]] || echo "off" > "$STATE_FILE"
}
# Render icons using pango markup to allow colorization
icon_off() {
# universally available sun symbol
printf "☀"
}
icon_on() {
case "$ICON_MODE" in
sunset)
# sunset emoji (falls back to tofu if no emoji font)
printf "🌇"
;;
blue)
# no color in text; rely on CSS .on to style if desired
printf "☀"
;;
*)
printf "☀"
;;
esac
}
cmd_toggle() {
ensure_state
state="$(cat "$STATE_FILE" || echo off)"
# Always stop any running hyprsunset first to avoid CTM manager conflicts
if pgrep -x hyprsunset >/dev/null 2>&1; then
pkill -x hyprsunset || true
# give it a moment to release the CTM manager
sleep 0.2
fi
if [[ "$state" == "on" ]]; then
# Turning OFF: set identity and exit
if command -v hyprsunset >/dev/null 2>&1; then
nohup hyprsunset -i >/dev/null 2>&1 &
# if hyprsunset persists, stop it shortly after applying identity
sleep 0.3 && pkill -x hyprsunset || true
fi
echo off > "$STATE_FILE"
notify-send -u low "Hyprsunset: Disabled" || true
else
# Turning ON: start hyprsunset at target temp in background
if command -v hyprsunset >/dev/null 2>&1; then
nohup hyprsunset -t "$TARGET_TEMP" >/dev/null 2>&1 &
fi
echo on > "$STATE_FILE"
notify-send -u low "Hyprsunset: Enabled" "${TARGET_TEMP}K" || true
fi
}
cmd_status() {
ensure_state
# Prefer live process detection; fall back to state file
if pgrep -x hyprsunset >/dev/null 2>&1; then
onoff="on"
else
onoff="$(cat "$STATE_FILE" || echo off)"
fi
if [[ "$onoff" == "on" ]]; then
txt="<span size='18pt'>$(icon_on)</span>"
cls="on"
tip="Night light on @ ${TARGET_TEMP}K"
else
txt="<span size='16pt'>$(icon_off)</span>"
cls="off"
tip="Night light off"
fi
printf '{"text":"%s","class":"%s","tooltip":"%s"}\n' "$txt" "$cls" "$tip"
}
case "${1:-}" in
toggle) cmd_toggle ;;
status) cmd_status ;;
*) echo "usage: $0 [toggle|status]" >&2; exit 2 ;;
esac

39
scripts/KeyBinds.sh Executable file
View File

@@ -0,0 +1,39 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# searchable enabled keybinds using rofi
# kill yad to not interfere with this binds
pkill yad || true
# check if rofi is already running
if pidof rofi > /dev/null; then
pkill rofi
fi
# define the config files
keybinds_conf="$HOME/.config/hypr/configs/Keybinds.conf"
user_keybinds_conf="$HOME/.config/hypr/UserConfigs/UserKeybinds.conf"
laptop_conf="$HOME/.config/hypr/UserConfigs/Laptops.conf"
rofi_theme="$HOME/.config/rofi/config-keybinds.rasi"
msg='☣️ NOTE ☣️: Clicking with Mouse or Pressing ENTER will have NO function'
# combine the contents of the keybinds files and filter for keybinds
keybinds=$(cat "$keybinds_conf" "$user_keybinds_conf" | grep -E '^bind')
# check if laptop.conf exists and add its keybinds if present
if [[ -f "$laptop_conf" ]]; then
laptop_binds=$(grep -E '^bind' "$laptop_conf")
keybinds+=$'\n'"$laptop_binds"
fi
# check for any keybinds to display
if [[ -z "$keybinds" ]]; then
echo "no keybinds found."
exit 1
fi
# replace $mainmod with super in the displayed keybinds for rofi
display_keybinds=$(echo "$keybinds" | sed 's/\$mainMod/SUPER/g')
# use rofi to display the keybinds with the modified content
echo "$display_keybinds" | rofi -dmenu -i -config "$rofi_theme" -mesg "$msg"

72
scripts/KeyHints.sh Executable file
View File

@@ -0,0 +1,72 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# GDK BACKEND. Change to either wayland or x11 if having issues
BACKEND=wayland
# Check if rofi or yad is running and kill them if they are
if pidof rofi > /dev/null; then
pkill rofi
fi
if pidof yad > /dev/null; then
pkill yad
fi
# Launch yad with calculated width and height
GDK_BACKEND=$BACKEND yad \
--center \
--title="KooL Quick Cheat Sheet" \
--no-buttons \
--list \
--column=Key: \
--column=Description: \
--column=Command: \
--timeout-indicator=bottom \
"ESC" "close this app" "" " = " "SUPER KEY (Windows Key Button)" "(SUPER KEY)" \
" SHIFT K" "Searchable Keybinds" "(Search all Keybinds via rofi)" \
" SHIFT E" "KooL Hyprland Settings Menu" "" \
"" "" "" \
" enter" "Terminal" "(kitty)" \
" SHIFT enter" "DropDown Terminal" " Q to close" \
" B" "Launch Browser" "(Default browser)" \
" A" "Desktop Overview" "(AGS - if opted to install)" \
" D" "Application Launcher" "(rofi-wayland)" \
" E" "Open File Manager" "(Thunar)" \
" S" "Google Search using rofi" "(rofi)" \
" Q" "close active window" "(not kill)" \
" Shift Q " "kills an active window" "(kill)" \
" ALT mouse scroll up/down " "Desktop Zoom" "Desktop Magnifier" \
" Alt V" "Clipboard Manager" "(cliphist)" \
" W" "Choose wallpaper" "(Wallpaper Menu)" \
" Shift W" "Choose wallpaper effects" "(imagemagick + swww)" \
"CTRL ALT W" "Random wallpaper" "(via swww)" \
" CTRL ALT B" "Hide/UnHide Waybar" "waybar" \
" CTRL B" "Choose waybar styles" "(waybar styles)" \
" ALT B" "Choose waybar layout" "(waybar layout)" \
" ALT R" "Reload Waybar swaync Rofi" "CHECK NOTIFICATION FIRST!!!" \
" SHIFT N" "Launch Notification Panel" "swaync Notification Center" \
" Print" "screenshot" "(grim)" \
" Shift Print" "screenshot region" "(grim + slurp)" \
" Shift S" "screenshot region" "(swappy)" \
" CTRL Print" "screenshot timer 5 secs " "(grim)" \
" CTRL SHIFT Print" "screenshot timer 10 secs " "(grim)" \
"ALT Print" "Screenshot active window" "active window only" \
"CTRL ALT P" "power-menu" "(wlogout)" \
"CTRL ALT L" "screen lock" "(hyprlock)" \
"CTRL ALT Del" "Hyprland Exit" "(NOTE: Hyprland Will exit immediately)" \
" SHIFT F" "Fullscreen" "Toggles to full screen" \
" CTL F" "Fake Fullscreen" "Toggles to fake full screen" \
" ALT L" "Toggle Dwindle | Master Layout" "Hyprland Layout" \
" SPACEBAR" "Toggle float" "single window" \
" ALT SPACEBAR" "Toggle all windows to float" "all windows" \
" ALT O" "Toggle Blur" "normal or less blur" \
" CTRL O" "Toggle Opaque ON or OFF" "on active window only" \
" Shift A" "Animations Menu" "Choose Animations via rofi" \
" CTRL R" "Rofi Themes Menu" "Choose Rofi Themes via rofi" \
" CTRL Shift R" "Rofi Themes Menu v2" "Choose Rofi Themes via Theme Selector (modified)" \
" SHIFT G" "Gamemode! All animations OFF or ON" "toggle" \
" ALT E" "Rofi Emoticons" "Emoticon" \
" H" "Launch this Quick Cheat Sheet" "" \
"" "" "" \
"More tips:" "https://github.com/JaKooLit/Hyprland-Dots/wiki" ""\

11
scripts/KillActiveProcess.sh Executable file
View File

@@ -0,0 +1,11 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Copied from Discord post. Thanks to @Zorg
# Get id of an active window
active_pid=$(hyprctl activewindow | grep -o 'pid: [0-9]*' | cut -d' ' -f2)
# Close active window
kill $active_pid

136
scripts/Kitty_themes.sh Executable file
View File

@@ -0,0 +1,136 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */  #
# Kitty Themes Source https://github.com/dexpota/kitty-themes #
# Define directories and variables
kitty_themes_DiR="$HOME/.config/kitty/kitty-themes" # Kitty Themes Directory
kitty_config="$HOME/.config/kitty/kitty.conf"
iDIR="$HOME/.config/swaync/images" # For notifications
rofi_theme_for_this_script="$HOME/.config/rofi/config-kitty-theme.rasi"
# --- Helper Functions ---
notify_user() {
notify-send -u low -i "$1" "$2" "$3"
}
# Function to apply the selected kitty theme
apply_kitty_theme_to_config() {
local theme_name_to_apply="$1"
if [ -z "$theme_name_to_apply" ]; then
echo "Error: No theme name provided to apply_kitty_theme_to_config." >&2
return 1
fi
local theme_file_path_to_apply="$kitty_themes_DiR/$theme_name_to_apply.conf"
if [ ! -f "$theme_file_path_to_apply" ]; then
notify_user "$iDIR/error.png" "Error" "Theme file not found: $theme_name_to_apply.conf"
return 1
fi
local temp_kitty_config_file
temp_kitty_config_file=$(mktemp)
cp "$kitty_config" "$temp_kitty_config_file"
if grep -q -E '^[#[:space:]]*include\s+\./kitty-themes/.*\.conf' "$temp_kitty_config_file"; then
sed -i -E "s|^([#[:space:]]*include\s+\./kitty-themes/).*\.conf|include ./kitty-themes/$theme_name_to_apply.conf|g" "$temp_kitty_config_file"
else
if [ -s "$temp_kitty_config_file" ] && [ "$(tail -c1 "$temp_kitty_config_file")" != "" ]; then
echo >>"$temp_kitty_config_file"
fi
echo "include ./kitty-themes/$theme_name_to_apply.conf" >>"$temp_kitty_config_file"
fi
cp "$temp_kitty_config_file" "$kitty_config"
rm "$temp_kitty_config_file"
for pid_kitty in $(pidof kitty); do
if [ -n "$pid_kitty" ]; then
kill -SIGUSR1 "$pid_kitty"
fi
done
return 0
}
# --- Main Script Execution ---
if [ ! -d "$kitty_themes_DiR" ]; then
notify_user "$iDIR/error.png" "E-R-R-O-R" "Kitty Themes directory not found: $kitty_themes_DiR"
exit 1
fi
if [ ! -f "$rofi_theme_for_this_script" ]; then
notify_user "$iDIR/error.png" "Rofi Config Missing" "Rofi theme for Kitty selector not found at: $rofi_theme_for_this_script."
exit 1
fi
original_kitty_config_content_backup=$(cat "$kitty_config")
mapfile -t available_theme_names < <(find "$kitty_themes_DiR" -maxdepth 1 -name "*.conf" -type f -printf "%f\n" | sed 's/\.conf$//' | sort)
if [ ${#available_theme_names[@]} -eq 0 ]; then
notify_user "$iDIR/error.png" "No Kitty Themes" "No .conf files found in $kitty_themes_DiR."
exit 1
fi
current_selection_index=0
current_active_theme_name=$(awk -F'include ./kitty-themes/|\\.conf' '/^[[:space:]]*include \.\/kitty-themes\/.*\.conf/{print $2; exit}' "$kitty_config")
if [ -n "$current_active_theme_name" ]; then
for i in "${!available_theme_names[@]}"; do
if [[ "${available_theme_names[$i]}" == "$current_active_theme_name" ]]; then
current_selection_index=$i
break
fi
done
fi
while true; do
theme_to_preview_now="${available_theme_names[$current_selection_index]}"
if ! apply_kitty_theme_to_config "$theme_to_preview_now"; then
echo "$original_kitty_config_content_backup" >"$kitty_config"
for pid_kitty in $(pidof kitty); do if [ -n "$pid_kitty" ]; then kill -SIGUSR1 "$pid_kitty"; fi; done
notify_user "$iDIR/error.png" "Preview Error" "Failed to apply $theme_to_preview_now. Reverted."
exit 1
fi
rofi_input_list=""
for theme_name_in_list in "${available_theme_names[@]}"; do
rofi_input_list+="$theme_name_in_list\n"
done
rofi_input_list_trimmed="${rofi_input_list%\\n}"
chosen_index_from_rofi=$(echo -e "$rofi_input_list_trimmed" |
rofi -dmenu -i \
-format 'i' \
-p "Kitty Theme" \
-mesg "Preview: ${theme_to_preview_now} | Enter: Preview | Ctrl+S: Apply & Exit | Esc: Cancel" \
-config "$rofi_theme_for_this_script" \
-selected-row "$current_selection_index" \
-kb-custom-1 "Control+s") # MODIFIED HERE: Changed to Control+s for custom action 1
rofi_exit_code=$?
if [ $rofi_exit_code -eq 0 ]; then
if [[ "$chosen_index_from_rofi" =~ ^[0-9]+$ ]] && [ "$chosen_index_from_rofi" -lt "${#available_theme_names[@]}" ]; then
current_selection_index="$chosen_index_from_rofi"
else
:
fi
elif [ $rofi_exit_code -eq 1 ]; then
notify_user "$iDIR/note.png" "Kitty Theme" "Selection cancelled. Reverting to original theme."
echo "$original_kitty_config_content_backup" >"$kitty_config"
for pid_kitty in $(pidof kitty); do if [ -n "$pid_kitty" ]; then kill -SIGUSR1 "$pid_kitty"; fi; done
break
elif [ $rofi_exit_code -eq 10 ]; then # This is the exit code for -kb-custom-1
notify_user "$iDIR/ja.png" "Kitty Theme Applied" "$theme_to_preview_now"
break
else
notify_user "$iDIR/error.png" "Rofi Error" "Unexpected Rofi exit ($rofi_exit_code). Reverting."
echo "$original_kitty_config_content_backup" >"$kitty_config"
for pid_kitty in $(pidof kitty); do if [ -n "$pid_kitty" ]; then kill -SIGUSR1 "$pid_kitty"; fi; done
break
fi
done
exit 0

73
scripts/KooLsDotsUpdate.sh Executable file
View File

@@ -0,0 +1,73 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# simple bash script to check if update is available by comparing local version and github version
# Local Paths
local_dir="$HOME/.config/hypr"
iDIR="$HOME/.config/swaync/images/"
local_version=$(ls $local_dir/v* 2>/dev/null | sort -V | tail -n 1 | sed 's/.*v\(.*\)/\1/')
KooL_Dots_DIR="$HOME/Hyprland-Dots"
# exit if cannot find local version
if [ -z "$local_version" ]; then
notify-send -i "$iDIR/error.png" "ERROR "!?!?!!"" "Unable to find KooL's dots version . exiting.... "
exit 1
fi
# GitHub URL - KooL's dots
branch="main"
github_url="https://github.com/JaKooLit/Hyprland-Dots/tree/$branch/config/hypr/"
# Fetch the version from GitHub URL - KooL's dots
github_version=$(curl -s $github_url | grep -o 'v[0-9]\+\.[0-9]\+\.[0-9]\+' | sort -V | tail -n 1 | sed 's/v//')
# Cant find GitHub URL - KooL's dots version
if [ -z "$github_version" ]; then
exit 1
fi
# Comparing local and github versions
if [ "$(echo -e "$github_version\n$local_version" | sort -V | head -n 1)" = "$github_version" ]; then
notify-send -i "$iDIR/note.png" "KooL Hyprland:" "No update available"
exit 0
else
# update available
notify_cmd_base="notify-send -t 10000 -A action1=Update -A action2=NO -h string:x-canonical-private-synchronous:shot-notify"
notify_cmd_shot="${notify_cmd_base} -i $iDIR/ja.png"
response=$($notify_cmd_shot "KooL Hyprland:" "Update available! Update now?")
case "$response" in
"action1")
if [ -d $KooL_Dots_DIR ]; then
if ! command -v kitty &> /dev/null; then
notify-send -i "$iDIR/error.png" "E-R-R-O-R" "Kitty terminal not found. Please install Kitty terminal."
exit 1
fi
kitty -e bash -c "
cd $KooL_Dots_DIR &&
git stash &&
git pull &&
./copy.sh &&
notify-send -u critical -i "$iDIR/ja.png" 'Update Completed:' 'Kindly log out and relogin to take effect'
"
else
if ! command -v kitty &> /dev/null; then
notify-send -i "$iDIR/error.png" "E-R-R-O-R" "Kitty terminal not found. Please install Kitty terminal."
exit 1
fi
kitty -e bash -c "
git clone --depth=1 https://github.com/JaKooLit/Hyprland-Dots.git $KooL_Dots_DIR &&
cd $KooL_Dots_DIR &&
chmod +x copy.sh &&
./copy.sh &&
notify-send -u critical -i "$iDIR/ja.png" 'Update Completed:' 'Kindly log out and relogin to take effect'
"
fi
;;
"action2")
exit 0
;;
esac
fi

117
scripts/Kool_Quick_Settings.sh Executable file
View File

@@ -0,0 +1,117 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Rofi menu for KooL Hyprland Quick Settings (SUPER SHIFT E)
# Modify this config file for default terminal and EDITOR
config_file="$HOME/.config/hypr/UserConfigs/01-UserDefaults.conf"
tmp_config_file=$(mktemp)
sed 's/^\$//g; s/ = /=/g' "$config_file" > "$tmp_config_file"
source "$tmp_config_file"
# ##################################### #
# variables
configs="$HOME/.config/hypr/configs"
UserConfigs="$HOME/.config/hypr/UserConfigs"
rofi_theme="$HOME/.config/rofi/config-edit.rasi"
msg=' ⁉️ Choose what to do ⁉️'
iDIR="$HOME/.config/swaync/images"
scriptsDir="$HOME/.config/hypr/scripts"
UserScripts="$HOME/.config/hypr/UserScripts"
# Function to display the menu options without numbers
menu() {
cat <<EOF
view/edit User Defaults
view/edit ENV variables
view/edit Window Rules
view/edit User Keybinds
view/edit User Settings
view/edit Startup Apps
view/edit Decorations
view/edit Animations
view/edit Laptop Keybinds
view/edit Default Keybinds
Choose Kitty Terminal Theme
Configure Monitors (nwg-displays)
Configure Workspace Rules (nwg-displays)
GTK Settings (nwg-look)
QT Apps Settings (qt6ct)
QT Apps Settings (qt5ct)
Choose Hyprland Animations
Choose Monitor Profiles
Choose Rofi Themes
Search for Keybinds
Toggle Game Mode
Switch Dark-Light Theme
EOF
}
# Main function to handle menu selection
main() {
choice=$(menu | rofi -i -dmenu -config $rofi_theme -mesg "$msg")
# Map choices to corresponding files
case "$choice" in
"view/edit User Defaults") file="$UserConfigs/01-UserDefaults.conf" ;;
"view/edit ENV variables") file="$UserConfigs/ENVariables.conf" ;;
"view/edit Window Rules") file="$UserConfigs/WindowRules.conf" ;;
"view/edit User Keybinds") file="$UserConfigs/UserKeybinds.conf" ;;
"view/edit User Settings") file="$UserConfigs/UserSettings.conf" ;;
"view/edit Startup Apps") file="$UserConfigs/Startup_Apps.conf" ;;
"view/edit Decorations") file="$UserConfigs/UserDecorations.conf" ;;
"view/edit Animations") file="$UserConfigs/UserAnimations.conf" ;;
"view/edit Laptop Keybinds") file="$UserConfigs/Laptops.conf" ;;
"view/edit Default Keybinds") file="$configs/Keybinds.conf" ;;
"Choose Kitty Terminal Theme") $scriptsDir/Kitty_themes.sh ;;
"Configure Monitors (nwg-displays)")
if ! command -v nwg-displays &>/dev/null; then
notify-send -i "$iDIR/error.png" "E-R-R-O-R" "Install nwg-displays first"
exit 1
fi
nwg-displays ;;
"Configure Workspace Rules (nwg-displays)")
if ! command -v nwg-displays &>/dev/null; then
notify-send -i "$iDIR/error.png" "E-R-R-O-R" "Install nwg-displays first"
exit 1
fi
nwg-displays ;;
"GTK Settings (nwg-look)")
if ! command -v nwg-look &>/dev/null; then
notify-send -i "$iDIR/error.png" "E-R-R-O-R" "Install nwg-look first"
exit 1
fi
nwg-look ;;
"QT Apps Settings (qt6ct)")
if ! command -v qt6ct &>/dev/null; then
notify-send -i "$iDIR/error.png" "E-R-R-O-R" "Install qt6ct first"
exit 1
fi
qt6ct ;;
"QT Apps Settings (qt5ct)")
if ! command -v qt5ct &>/dev/null; then
notify-send -i "$iDIR/error.png" "E-R-R-O-R" "Install qt5ct first"
exit 1
fi
qt5ct ;;
"Choose Hyprland Animations") $scriptsDir/Animations.sh ;;
"Choose Monitor Profiles") $scriptsDir/MonitorProfiles.sh ;;
"Choose Rofi Themes") $scriptsDir/RofiThemeSelector.sh ;;
"Search for Keybinds") $scriptsDir/KeyBinds.sh ;;
"Toggle Game Mode") $scriptsDir/GameMode.sh ;;
"Switch Dark-Light Theme") $scriptsDir/DarkLight.sh ;;
*) return ;; # Do nothing for invalid choices
esac
# Open the selected file in the terminal with the text editor
if [ -n "$file" ]; then
$term -e $edit "$file"
fi
}
# Check if rofi is already running
if pidof rofi > /dev/null; then
pkill rofi
fi
main

7
scripts/LockScreen.sh Executable file
View File

@@ -0,0 +1,7 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# For Hyprlock
#pidof hyprlock || hyprlock -q
loginctl lock-session

62
scripts/MediaCtrl.sh Executable file
View File

@@ -0,0 +1,62 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Playerctl
music_icon="$HOME/.config/swaync/icons/music.png"
# Play the next track
play_next() {
playerctl next
show_music_notification
}
# Play the previous track
play_previous() {
playerctl previous
show_music_notification
}
# Toggle play/pause
toggle_play_pause() {
playerctl play-pause
sleep 0.1
show_music_notification
}
# Stop playback
stop_playback() {
playerctl stop
notify-send -e -u low -i $music_icon " Playback:" " Stopped"
}
# Display notification with song information
show_music_notification() {
status=$(playerctl status)
if [[ "$status" == "Playing" ]]; then
song_title=$(playerctl metadata title)
song_artist=$(playerctl metadata artist)
notify-send -e -u low -i $music_icon "Now Playing:" "$song_title by $song_artist"
elif [[ "$status" == "Paused" ]]; then
notify-send -e -u low -i $music_icon " Playback:" " Paused"
fi
}
# Get media control action from command line argument
case "$1" in
"--nxt")
play_next
;;
"--prv")
play_previous
;;
"--pause")
toggle_play_pause
;;
"--stop")
stop_playback
;;
*)
echo "Usage: $0 [--nxt|--prv|--pause|--stop]"
exit 1
;;
esac

42
scripts/MonitorProfiles.sh Executable file
View File

@@ -0,0 +1,42 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# For applying Pre-configured Monitor Profiles
# Check if rofi is already running
if pidof rofi > /dev/null; then
pkill rofi
fi
# Variables
iDIR="$HOME/.config/swaync/images"
SCRIPTSDIR="$HOME/.config/hypr/scripts"
monitor_dir="$HOME/.config/hypr/Monitor_Profiles"
target="$HOME/.config/hypr/monitors.conf"
rofi_theme="$HOME/.config/rofi/config-Monitors.rasi"
msg='❗NOTE:❗ This will overwrite $HOME/.config/hypr/monitors.conf'
# Define the list of files to ignore
ignore_files=(
"README"
)
# list of Monitor Profiles, sorted alphabetically with numbers first
mon_profiles_list=$(find -L "$monitor_dir" -maxdepth 1 -type f | sed 's/.*\///' | sed 's/\.conf$//' | sort -V)
# Remove ignored files from the list
for ignored_file in "${ignore_files[@]}"; do
mon_profiles_list=$(echo "$mon_profiles_list" | grep -v -E "^$ignored_file$")
done
# Rofi Menu
chosen_file=$(echo "$mon_profiles_list" | rofi -i -dmenu -config $rofi_theme -mesg "$msg")
if [[ -n "$chosen_file" ]]; then
full_path="$monitor_dir/$chosen_file.conf"
cp "$full_path" "$target"
notify-send -u low -i "$iDIR/ja.png" "$chosen_file" "Monitor Profile Loaded"
fi
sleep 1
${SCRIPTSDIR}/RefreshNoWaybar.sh &

21
scripts/Polkit-NixOS.sh Executable file
View File

@@ -0,0 +1,21 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# For NixOS starting of polkit-gnome. Dec 2023, the settings stated in NixOS wiki does not work so have to manual start it
# Find all polkit-gnome executables in the Nix store
polkit_gnome_paths=$(find /nix/store -name 'polkit-gnome-authentication-agent-1' -type f 2>/dev/null)
for polkit_gnome_path in $polkit_gnome_paths; do
# Extract the directory containing the executable
polkit_gnome_dir=$(dirname "$polkit_gnome_path")
# Check if the executable is valid and exists
if [ -x "$polkit_gnome_dir/polkit-gnome-authentication-agent-1" ]; then
# Start the Polkit-GNOME Authentication Agent
"$polkit_gnome_dir/polkit-gnome-authentication-agent-1" &
exit 0
fi
done
# If no valid executable is found, report an error
echo "No valid Polkit-GNOME Authentication Agent executable found."

34
scripts/Polkit.sh Executable file
View File

@@ -0,0 +1,34 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# This script starts the first available Polkit agent from a list of possible locations
# List of potential Polkit agent file paths
polkit=(
"/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1"
"/usr/libexec/hyprpolkitagent"
"/usr/lib/hyprpolkitagent"
"/usr/lib/hyprpolkitagent/hyprpolkitagent"
"/usr/lib/polkit-kde-authentication-agent-1"
"/usr/lib/polkit-gnome-authentication-agent-1"
"/usr/libexec/polkit-gnome-authentication-agent-1"
"/usr/libexec/polkit-mate-authentication-agent-1"
"/usr/lib/x86_64-linux-gnu/libexec/polkit-kde-authentication-agent-1"
"/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1"
)
executed=false
# Loop through the list of paths
for file in "${polkit[@]}"; do
if [ -e "$file" ] && [ ! -d "$file" ]; then
echo "Found: $file — executing..."
exec "$file"
executed=true
break
fi
done
# Fallback message if nothing executed
if [ "$executed" == false ]; then
echo "No valid Polkit agent found. Please install one."
fi

16
scripts/PortalHyprland.sh Executable file
View File

@@ -0,0 +1,16 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# For manually starting xdg-desktop-portal-hyprland
sleep 1
killall xdg-desktop-portal-hyprland
killall xdg-desktop-portal-wlr
killall xdg-desktop-portal-gnome
killall xdg-desktop-portal
sleep 1
/usr/lib/xdg-desktop-portal-hyprland &
/usr/libexec/xdg-desktop-portal-hyprland &
sleep 2
/usr/lib/xdg-desktop-portal &
/usr/libexec/xdg-desktop-portal &

55
scripts/Refresh.sh Executable file
View File

@@ -0,0 +1,55 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Scripts for refreshing ags, waybar, rofi, swaync, wallust
SCRIPTSDIR=$HOME/.config/hypr/scripts
UserScripts=$HOME/.config/hypr/UserScripts
# Define file_exists function
file_exists() {
if [ -e "$1" ]; then
return 0 # File exists
else
return 1 # File does not exist
fi
}
# Kill already running processes
_ps=(waybar rofi swaync ags)
for _prs in "${_ps[@]}"; do
if pidof "${_prs}" >/dev/null; then
pkill "${_prs}"
fi
done
# added since wallust sometimes not applying
killall -SIGUSR2 waybar
# quit ags & relaunch ags
#ags -q && ags &
# quit quickshell & relaunch quickshell
#pkill qs && qs &
# some process to kill
for pid in $(pidof waybar rofi swaync ags swaybg); do
kill -SIGUSR1 "$pid"
done
#Restart waybar
sleep 1
waybar &
# relaunch swaync
sleep 0.5
swaync > /dev/null 2>&1 &
# reload swaync
swaync-client --reload-config
# Relaunching rainbow borders if the script exists
sleep 1
if file_exists "${UserScripts}/RainbowBorders.sh"; then
${UserScripts}/RainbowBorders.sh &
fi
exit 0

48
scripts/RefreshNoWaybar.sh Executable file
View File

@@ -0,0 +1,48 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Modified version of Refresh.sh but waybar wont refresh
# Used by automatic wallpaper change
# Modified inorder to refresh rofi background, Wallust, SwayNC only
SCRIPTSDIR=$HOME/.config/hypr/scripts
UserScripts=$HOME/.config/hypr/UserScripts
# Define file_exists function
file_exists() {
if [ -e "$1" ]; then
return 0 # File exists
else
return 1 # File does not exist
fi
}
# Kill already running processes
_ps=(rofi)
for _prs in "${_ps[@]}"; do
if pidof "${_prs}" >/dev/null; then
pkill "${_prs}"
fi
done
# quit ags & relaunch ags
#ags -q && ags &
# quit quickshell & relaunch quickshell
#pkill qs && qs &
# Wallust refresh (synchronous to ensure colors are ready)
${SCRIPTSDIR}/WallustSwww.sh
sleep 0.2
# reload swaync
swaync-client --reload-config
# Relaunching rainbow borders if the script exists
sleep 1
if file_exists "${UserScripts}/RainbowBorders.sh"; then
${UserScripts}/RainbowBorders.sh &
fi
exit 0

1871
scripts/RofiEmoji.sh Executable file

File diff suppressed because it is too large Load Diff

36
scripts/RofiSearch.sh Executable file
View File

@@ -0,0 +1,36 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# For Searching via web browsers
# Define the path to the config file
config_file=$HOME/.config/hypr/UserConfigs/01-UserDefaults.conf
# Check if the config file exists
if [[ ! -f "$config_file" ]]; then
echo "Error: Configuration file not found!"
exit 1
fi
# Process the config file in memory, removing the $ and fixing spaces
config_content=$(sed 's/\$//g' "$config_file" | sed 's/ = /=/')
# Source the modified content directly from the variable
eval "$config_content"
# Check if $term is set correctly
if [[ -z "$Search_Engine" ]]; then
echo "Error: \$Search_Engine is not set in the configuration file!"
exit 1
fi
# Rofi theme and message
rofi_theme="$HOME/.config/rofi/config-search.rasi"
msg='‼️ **note** ‼️ search via default web browser'
# Kill Rofi if already running before execution
if pgrep -x "rofi" >/dev/null; then
pkill rofi
fi
# Open Rofi and pass the selected query to xdg-open for Google search
echo "" | rofi -dmenu -config "$rofi_theme" -mesg "$msg" | xargs -I{} xdg-open $Search_Engine

View File

@@ -0,0 +1,229 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# A modified version of Rofi-Theme-Selector, concentrating only on ~/.local and also, applying only 10 @themes in ~/.config/rofi/config.rasi
# as opposed to continous adding of //@theme
# This code is released in public domain by Dave Davenport <qball@gmpclient.org>
iDIR="$HOME/.config/swaync/images"
OS="linux"
ROFI=$(command -v rofi)
SED=$(command -v sed)
MKTEMP=$(command -v mktemp)
NOTIFY_SEND=$(command -v notify-send)
if [ -z "${SED}" ]
then
echo "Did not find 'sed', script cannot continue."
exit 1
fi
if [ -z "${MKTEMP}" ]
then
echo "Did not find 'mktemp', script cannot continue."
exit 1
fi
if [ -z "${ROFI}" ]
then
echo "Did not find rofi, there is no point to continue."
exit 1
fi
if [ -z "${NOTIFY_SEND}" ]
then
echo "Did not find 'notify-send', notifications won't work."
fi
TMP_CONFIG_FILE=$(${MKTEMP}).rasi
#rofi_theme_dir="${HOME}/.local/share/rofi/themes"
rofi_config_file="${XDG_CONFIG_HOME:-${HOME}/.config}/rofi/config.rasi"
##
# Array with parts to the found themes.
# And array with the printable name.
##
declare -a themes
declare -a theme_names
##
# Function that tries to find all installed rofi themes.
# This fills in #themes array and formats a displayable string #theme_names
##
# Find themes in defined directories
find_themes() {
directories=("$HOME/.local/share/rofi/themes" "$HOME/.config/rofi/themes")
for TD in "${directories[@]}"; do
if [ -d "$TD" ]; then
echo "Checking themes in: $TD"
for file in "$TD"/*.rasi; do
if [ -f "$file" ] && [ ! -L "$file" ]; then
themes+=("$file")
theme_names+=("$(basename "${file%.*}")")
else
echo "Skipping symlink: $file"
fi
done
else
echo "Directory does not exist: $TD"
fi
done
}
##
# Function to add or update theme in the config.rasi
##
add_theme_to_config() {
local theme_name="$1"
local theme_path
# Determine the correct path for the theme
if [[ -f "$HOME/.local/share/rofi/themes/$theme_name.rasi" ]]; then
theme_path="$HOME/.local/share/rofi/themes/$theme_name.rasi"
elif [[ -f "$HOME/.config/rofi/themes/$theme_name.rasi" ]]; then
theme_path="$HOME/.config/rofi/themes/$theme_name.rasi"
else
echo "Theme not found: $theme_name"
return 1
fi
# Resolve symlinks if present
if [[ -L "$theme_path" ]]; then
theme_path=$(readlink -f "$theme_path")
fi
# Convert path to use ~ for home directory
theme_path_with_tilde="~${theme_path#$HOME}"
# Add or update @theme line in config
if ! grep -q '^\s*@theme' "$rofi_config_file"; then
echo -e "\n\n@theme \"$theme_path_with_tilde\"" >> "$rofi_config_file"
echo "Added @theme \"$theme_path_with_tilde\" to $rofi_config_file"
else
$SED -i "s/^\(\s*@theme.*\)/\/\/\1/" "$rofi_config_file"
echo -e "@theme \"$theme_path_with_tilde\"" >> "$rofi_config_file"
echo "Updated @theme line to $theme_path_with_tilde"
fi
# Limit the number of @theme lines to a maximum of 9
max_lines=9
total_lines=$(grep -c '^\s*//@theme' "$rofi_config_file")
if [ "$total_lines" -gt "$max_lines" ]; then
excess=$((total_lines - max_lines))
for i in $(seq 1 "$excess"); do
$SED -i '0,/^\s*\/\/@theme/ { /^\s*\/\/@theme/ {d; q; }}' "$rofi_config_file"
done
echo "Removed excess //@theme lines"
fi
}
##
# Create a copy of rofi config
##
create_config_copy()
{
${ROFI} -dump-config > "${TMP_CONFIG_FILE}"
# remove theme entry.
${SED} -i 's/^\s*theme:\s\+".*"\s*;//g' "${TMP_CONFIG_FILE}"
}
###
# Print the list out so it can be displayed by rofi.
##
create_theme_list()
{
OLDIFS=${IFS}
IFS='|'
for themen in ${theme_names[@]}
do
echo "${themen}"
done
IFS=${OLDIFS}
}
##
# Thee indicate what entry is selected.
##
declare -i SELECTED
select_theme()
{
local MORE_FLAGS=(-dmenu -format i -no-custom -p "Theme" -markup -config "${TMP_CONFIG_FILE}" -i)
MORE_FLAGS+=(-kb-custom-1 "Alt-a")
MORE_FLAGS+=(-u 2,3 -a 4,5 )
local CUR="default"
while true
do
declare -i RTR
declare -i RES
local MESG="""You can preview themes by hitting <b>Enter</b>.
<b>Alt-a</b> to accept the new theme.
<b>Escape</b> to cancel
Current theme: <b>${CUR}</b>
<span weight=\"bold\" size=\"xx-small\">When setting a new theme this will override previous theme settings.
Please update your config file if you have local modifications.</span>"""
THEME_FLAG=
if [ -n "${SELECTED}" ]
then
THEME_FLAG="-theme ${themes[${SELECTED}]}"
fi
RES=$( create_theme_list | ${ROFI} ${THEME_FLAG} ${MORE_FLAGS[@]} -cycle -selected-row "${SELECTED}" -mesg "${MESG}")
RTR=$?
if [ "${RTR}" = 10 ]
then
return 0;
elif [ "${RTR}" = 1 ]
then
return 1;
elif [ "${RTR}" = 65 ]
then
return 1;
fi
CUR=${theme_names[${RES}]}
SELECTED=${RES}
done
}
############################################################################################################
# Actual program execution
###########################################################################################################
##
# Find all themes
##
find_themes
##
# Do check if there are themes.
##
if [ ${#themes[@]} = 0 ]
then
${ROFI} -e "No themes found."
exit 0
fi
##
# Create copy of config to play with in preview
##
create_config_copy
##
# Show the themes to user.
##
if select_theme && [ -n "${SELECTED}" ]
then
# Apply the selected theme
add_theme_to_config "${theme_names[${SELECTED}]}"
# Send notification with the selected theme name
selection="${theme_names[${SELECTED}]}"
if [ -n "$NOTIFY_SEND" ]; then
notify-send -u low -i "$iDIR/ja.png" "Rofi Theme applied:" "$selection"
fi
fi
##
# Remove temp. config.
##
rm -- "${TMP_CONFIG_FILE}"

154
scripts/RofiThemeSelector.sh Executable file
View File

@@ -0,0 +1,154 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */  #
# Rofi Themes - Script to preview and apply themes by live-reloading the config.
# --- Configuration ---
ROFI_THEMES_DIR_CONFIG="$HOME/.config/rofi/themes"
ROFI_THEMES_DIR_LOCAL="$HOME/.local/share/rofi/themes"
ROFI_CONFIG_FILE="$HOME/.config/rofi/config.rasi"
ROFI_THEME_FOR_THIS_SCRIPT="$HOME/.config/rofi/config-rofi-theme.rasi" # A separate rofi theme for the picker itself
IDIR="$HOME/.config/swaync/images" # For notifications
# --- Helper Functions ---
# Function to send a notification
notify_user() {
notify-send -u low -i "$1" "$2" "$3"
}
# Function to apply the selected rofi theme to the main config file
apply_rofi_theme_to_config() {
local theme_name_to_apply="$1"
# Find the full path of the theme file
local theme_path
if [[ -f "$ROFI_THEMES_DIR_CONFIG/$theme_name_to_apply" ]]; then
theme_path="$ROFI_THEMES_DIR_CONFIG/$theme_name_to_apply"
elif [[ -f "$ROFI_THEMES_DIR_LOCAL/$theme_name_to_apply" ]]; then
theme_path="$ROFI_THEMES_DIR_LOCAL/$theme_name_to_apply"
else
notify_user "$IDIR/error.png" "Error" "Theme file not found: $theme_name_to_apply"
return 1
fi
# Use ~ for the home directory in the config path
local theme_path_with_tilde="~${theme_path#$HOME}"
# Create a temporary file to safely edit the config
local temp_rofi_config_file
temp_rofi_config_file=$(mktemp)
cp "$ROFI_CONFIG_FILE" "$temp_rofi_config_file"
# Comment out any existing @theme entry
sed -i -E 's/^(\s*@theme)/\\/\\/\1/' "$temp_rofi_config_file"
# Add the new @theme entry at the end of the file
echo "@theme \"$theme_path_with_tilde\"" >>"$temp_rofi_config_file"
# Overwrite the original config file
cp "$temp_rofi_config_file" "$ROFI_CONFIG_FILE"
rm "$temp_rofi_config_file"
# Prune old commented-out theme lines to prevent clutter
local max_lines=10
local total_lines=$(grep -c '^//\s*@theme' "$ROFI_CONFIG_FILE")
if [ "$total_lines" -gt "$max_lines" ]; then
local excess=$((total_lines - max_lines))
for ((i = 1; i <= excess; i++)); do
sed -i '0,/^\s*\/\/@theme/s///' "$ROFI_CONFIG_FILE"
done
fi
return 0
}
# --- Main Script Execution ---
# Check for required directories and files
if [ ! -d "$ROFI_THEMES_DIR_CONFIG" ] && [ ! -d "$ROFI_THEMES_DIR_LOCAL" ]; then
notify_user "$IDIR/error.png" "E-R-R-O-R" "No Rofi themes directory found."
exit 1
fi
if [ ! -f "$ROFI_CONFIG_FILE" ]; then
notify_user "$IDIR/error.png" "E-R-R-O-R" "Rofi config file not found: $ROFI_CONFIG_FILE"
exit 1
fi
# Backup the original config content
original_rofi_config_content_backup=$(cat "$ROFI_CONFIG_FILE")
# Generate a sorted list of available theme file names
mapfile -t available_theme_names < <((
find "$ROFI_THEMES_DIR_CONFIG" -maxdepth 1 -name "*.rasi" -type f -printf "%f\n" 2>/dev/null
find "$ROFI_THEMES_DIR_LOCAL" -maxdepth 1 -name "*.rasi" -type f -printf "%f\n" 2>/dev/null
) | sort -V -u)
if [ ${#available_theme_names[@]} -eq 0 ]; then
notify_user "$IDIR/error.png" "No Rofi Themes" "No .rasi files found in theme directories."
exit 1
fi
# Find the currently active theme to set as the initial selection
current_selection_index=0
current_active_theme_path=$(grep -oP '^\s*@theme\s*"\K[^"]+' "$ROFI_CONFIG_FILE" | tail -n 1)
if [ -n "$current_active_theme_path" ]; then
current_active_theme_name=$(basename "$current_active_theme_path")
for i in "${!available_theme_names[@]}"; do
if [[ "${available_theme_names[$i]}" == "$current_active_theme_name" ]]; then
current_selection_index=$i
break
fi
done
fi
# Main preview loop
while true; do
theme_to_preview_now="${available_theme_names[$current_selection_index]}"
# Apply the theme for preview
if ! apply_rofi_theme_to_config "$theme_to_preview_now"; then
echo "$original_rofi_config_content_backup" >"$ROFI_CONFIG_FILE"
notify_user "$IDIR/error.png" "Preview Error" "Failed to apply $theme_to_preview_now. Reverted."
exit 1
fi
# Prepare theme list for Rofi
rofi_input_list=""
for theme_name_in_list in "${available_theme_names[@]}"; do
rofi_input_list+="$(basename "$theme_name_in_list" .rasi)\n"
done
rofi_input_list_trimmed="${rofi_input_list%\\n}"
# Launch Rofi and get user's choice
chosen_index_from_rofi=$(echo -e "$rofi_input_list_trimmed" |
rofi -dmenu -i \
-format 'i' \
-p "Rofi Theme" \
-mesg "‼️ **note** ‼️ Enter: Preview || Ctrl+S: Apply &amp; Exit || Esc: Cancel" \
-config "$ROFI_THEME_FOR_THIS_SCRIPT" \
-selected-row "$current_selection_index" \
-kb-custom-1 "Control+s")
rofi_exit_code=$?
# Handle Rofi's exit code
if [ $rofi_exit_code -eq 0 ]; then # Enter
if [[ "$chosen_index_from_rofi" =~ ^[0-9]+$ ]] && [ "$chosen_index_from_rofi" -lt "${#available_theme_names[@]}" ]; then
current_selection_index="$chosen_index_from_rofi"
fi
elif [ $rofi_exit_code -eq 1 ]; then # Escape
notify_user "$IDIR/note.png" "Rofi Theme" "Selection cancelled. Reverting to original theme."
echo "$original_rofi_config_content_backup" >"$ROFI_CONFIG_FILE"
break
elif [ $rofi_exit_code -eq 10 ]; then # Custom bind 1 (Ctrl+S)
notify_user "$IDIR/ja.png" "Rofi Theme Applied" "$(basename "$theme_to_preview_now" .rasi)"
break
else # Error or unexpected exit code
notify_user "$IDIR/error.png" "Rofi Error" "Unexpected Rofi exit ($rofi_exit_code). Reverting."
echo "$original_rofi_config_content_backup" >"$ROFI_CONFIG_FILE"
break
fi
done
exit 0

164
scripts/ScreenShot.sh Executable file
View File

@@ -0,0 +1,164 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Screenshots scripts
# variables
time=$(date "+%d-%b_%H-%M-%S")
dir="$(xdg-user-dir PICTURES)/Screenshots"
file="Screenshot_${time}_${RANDOM}.png"
iDIR="$HOME/.config/swaync/icons"
iDoR="$HOME/.config/swaync/images"
sDIR="$HOME/.config/hypr/scripts"
active_window_class=$(hyprctl -j activewindow | jq -r '(.class)')
active_window_file="Screenshot_${time}_${active_window_class}.png"
active_window_path="${dir}/${active_window_file}"
notify_cmd_base="notify-send -t 10000 -A action1=Open -A action2=Delete -h string:x-canonical-private-synchronous:shot-notify"
notify_cmd_shot="${notify_cmd_base} -i ${iDIR}/picture.png "
notify_cmd_shot_win="${notify_cmd_base} -i ${iDIR}/picture.png "
notify_cmd_NOT="notify-send -u low -i ${iDoR}/note.png "
# notify and view screenshot
notify_view() {
if [[ "$1" == "active" ]]; then
if [[ -e "${active_window_path}" ]]; then
"${sDIR}/Sounds.sh" --screenshot
resp=$(timeout 5 ${notify_cmd_shot_win} " Screenshot of:" " ${active_window_class} Saved.")
case "$resp" in
action1)
xdg-open "${active_window_path}" &
;;
action2)
rm "${active_window_path}" &
;;
esac
else
${notify_cmd_NOT} " Screenshot of:" " ${active_window_class} NOT Saved."
"${sDIR}/Sounds.sh" --error
fi
elif [[ "$1" == "swappy" ]]; then
"${sDIR}/Sounds.sh" --screenshot
resp=$(${notify_cmd_shot} " Screenshot:" " Captured by Swappy")
case "$resp" in
action1)
swappy -f - <"$tmpfile"
;;
action2)
rm "$tmpfile"
;;
esac
else
local check_file="${dir}/${file}"
if [[ -e "$check_file" ]]; then
"${sDIR}/Sounds.sh" --screenshot
resp=$(timeout 5 ${notify_cmd_shot} " Screenshot" " Saved")
case "$resp" in
action1)
xdg-open "${check_file}" &
;;
action2)
rm "${check_file}" &
;;
esac
else
${notify_cmd_NOT} " Screenshot" " NOT Saved"
"${sDIR}/Sounds.sh" --error
fi
fi
}
# countdown
countdown() {
for sec in $(seq $1 -1 1); do
notify-send -h string:x-canonical-private-synchronous:shot-notify -t 1000 -i "$iDIR"/timer.png " Taking shot" " in: $sec secs"
sleep 1
done
}
# take shots
shotnow() {
cd ${dir} && grim - | tee "$file" | wl-copy
sleep 2
notify_view
}
shot5() {
countdown '5'
sleep 1 && cd ${dir} && grim - | tee "$file" | wl-copy
sleep 1
notify_view
}
shot10() {
countdown '10'
sleep 1 && cd ${dir} && grim - | tee "$file" | wl-copy
notify_view
}
shotwin() {
w_pos=$(hyprctl activewindow | grep 'at:' | cut -d':' -f2 | tr -d ' ' | tail -n1)
w_size=$(hyprctl activewindow | grep 'size:' | cut -d':' -f2 | tr -d ' ' | tail -n1 | sed s/,/x/g)
cd ${dir} && grim -g "$w_pos $w_size" - | tee "$file" | wl-copy
notify_view
}
shotarea() {
tmpfile=$(mktemp)
grim -g "$(slurp)" - >"$tmpfile"
# Copy with saving
if [[ -s "$tmpfile" ]]; then
wl-copy <"$tmpfile"
mv "$tmpfile" "$dir/$file"
fi
notify_view
}
shotactive() {
active_window_class=$(hyprctl -j activewindow | jq -r '(.class)')
active_window_file="Screenshot_${time}_${active_window_class}.png"
active_window_path="${dir}/${active_window_file}"
hyprctl -j activewindow | jq -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"' | grim -g - "${active_window_path}"
sleep 1
notify_view "active"
}
shotswappy() {
tmpfile=$(mktemp)
grim -g "$(slurp)" - >"$tmpfile"
# Copy without saving
if [[ -s "$tmpfile" ]]; then
wl-copy <"$tmpfile"
notify_view "swappy"
fi
}
if [[ ! -d "$dir" ]]; then
mkdir -p "$dir"
fi
if [[ "$1" == "--now" ]]; then
shotnow
elif [[ "$1" == "--in5" ]]; then
shot5
elif [[ "$1" == "--in10" ]]; then
shot10
elif [[ "$1" == "--win" ]]; then
shotwin
elif [[ "$1" == "--area" ]]; then
shotarea
elif [[ "$1" == "--active" ]]; then
shotactive
elif [[ "$1" == "--swappy" ]]; then
shotswappy
else
echo -e "Available Options : --now --in5 --in10 --win --area --active --swappy"
fi
exit 0

77
scripts/Sounds.sh Executable file
View File

@@ -0,0 +1,77 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# This script is used to play system sounds.
# Script is used by Volume.Sh and ScreenShots.sh
theme="freedesktop" # Set the theme for the system sounds.
mute=false # Set to true to mute the system sounds.
# Mute individual sounds here.
muteScreenshots=false
muteVolume=false
# Exit if the system sounds are muted.
if [[ "$mute" = true ]]; then
exit 0
fi
# Choose the sound to play.
if [[ "$1" == "--screenshot" ]]; then
if [[ "$muteScreenshots" = true ]]; then
exit 0
fi
soundoption="screen-capture.*"
elif [[ "$1" == "--volume" ]]; then
if [[ "$muteVolume" = true ]]; then
exit 0
fi
soundoption="audio-volume-change.*"
elif [[ "$1" == "--error" ]]; then
if [[ "$muteScreenshots" = true ]]; then
exit 0
fi
soundoption="dialog-error.*"
else
echo -e "Available sounds: --screenshot, --volume, --error"
exit 0
fi
# Set the directory defaults for system sounds.
if [ -d "/run/current-system/sw/share/sounds" ]; then
systemDIR="/run/current-system/sw/share/sounds" # NixOS
else
systemDIR="/usr/share/sounds"
fi
userDIR="$HOME/.local/share/sounds"
defaultTheme="freedesktop"
# Prefer the user's theme, but use the system's if it doesn't exist.
sDIR="$systemDIR/$defaultTheme"
if [ -d "$userDIR/$theme" ]; then
sDIR="$userDIR/$theme"
elif [ -d "$systemDIR/$theme" ]; then
sDIR="$systemDIR/$theme"
fi
# Get the theme that it inherits.
iTheme=$(cat "$sDIR/index.theme" | grep -i "inherits" | cut -d "=" -f 2)
iDIR="$sDIR/../$iTheme"
# Find the sound file and play it.
sound_file=$(find -L $sDIR/stereo -name "$soundoption" -print -quit)
if ! test -f "$sound_file"; then
sound_file=$(find -L $iDIR/stereo -name "$soundoption" -print -quit)
if ! test -f "$sound_file"; then
sound_file=$(find -L $userDIR/$defaultTheme/stereo -name "$soundoption" -print -quit)
if ! test -f "$sound_file"; then
sound_file=$(find -L $systemDIR/$defaultTheme/stereo -name "$soundoption" -print -quit)
if ! test -f "$sound_file"; then
echo "Error: Sound file not found."
exit 1
fi
fi
fi
fi
# pipewire priority, fallback pulseaudio
pw-play "$sound_file" || pa-play "$sound_file"

104
scripts/SwitchKeyboardLayout.sh Executable file
View File

@@ -0,0 +1,104 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# This is for changing kb_layouts. Set kb_layouts in $settings_file
layout_file="$HOME/.cache/kb_layout"
settings_file="$HOME/.config/hypr/UserConfigs/UserSettings.conf"
notif_icon="$HOME/.config/swaync/images/ja.png"
# Refined ignore list with patterns or specific device names
ignore_patterns=(
"--(avrcp)"
"Bluetooth Speaker"
"Other Device
Name"
)
# Create layout file with default layout if it does not exist
if [ ! -f "$layout_file" ]; then
echo "Creating layout file..."
default_layout=$(grep 'kb_layout = ' "$settings_file" | cut -d '=' -f 2 | tr -d '[:space:]' | cut -d ',' -f 1 2>/dev/null)
default_layout=${default_layout:-"us"} # Default to 'us' layout
echo "$default_layout" > "$layout_file"
echo "Default layout set to $default_layout"
fi
current_layout=$(cat "$layout_file")
echo "Current layout: $current_layout"
# Read available layouts from settings file
if [ -f "$settings_file" ]; then
kb_layout_line=$(grep 'kb_layout = ' "$settings_file" | cut -d '=' -f 2)
# Remove leading and trailing spaces around each layout
kb_layout_line=$(echo "$kb_layout_line" | tr -d '[:space:]')
IFS=',' read -r -a layout_mapping <<< "$kb_layout_line"
else
echo "Settings file not found!"
exit 1
fi
layout_count=${#layout_mapping[@]}
echo "Number of layouts: $layout_count"
# Find current layout index and calculate next layout
for ((i = 0; i < layout_count; i++)); do
if [ "$current_layout" == "${layout_mapping[i]}" ]; then
current_index=$i
break
fi
done
next_index=$(( (current_index + 1) % layout_count ))
new_layout="${layout_mapping[next_index]}"
echo "Next layout: $new_layout"
# Function to get keyboard names
get_keyboard_names() {
hyprctl devices -j | jq -r '.keyboards[].name'
}
# Function to check if a device matches any ignore pattern
is_ignored() {
local device_name=$1
for pattern in "${ignore_patterns[@]}"; do
if [[ "$device_name" == *"$pattern"* ]]; then
return 0 # Device matches ignore pattern
fi
done
return 1 # Device does not match any ignore pattern
}
# Function to change keyboard layout
change_layout() {
local error_found=false
while read -r name; do
if is_ignored "$name"; then
echo "Skipping ignored device: $name"
continue
fi
echo "Switching layout for $name to $new_layout..."
hyprctl switchxkblayout "$name" "$next_index"
if [ $? -ne 0 ]; then
echo "Error while switching layout for $name." >&2
error_found=true
fi
done <<< "$(get_keyboard_names)"
$error_found && return 1
return 0
}
# Execute layout change and notify
if ! change_layout; then
notify-send -u low -t 2000 'kb_layout' " Error:" " Layout change failed"
echo "Layout change failed." >&2
exit 1
else
notify-send -u low -i "$notif_icon" " kb_layout: $new_layout"
echo "Layout change notification sent."
fi
echo "$new_layout" > "$layout_file"

90
scripts/Tak0-Autodispatch.sh Executable file
View File

@@ -0,0 +1,90 @@
#!/bin/bash
# USAGE / ІНСТРУКЦІЯ:
# 1) Run from terminal:
# ./dispatch.sh <application_command> <target_workspace_number>
# Example:
# ./dispatch.sh discord 2
#
# 2) Call from Hyprland config (in hyprland.conf file):
# exec-once = /path/to/dispatch.sh <application_command> <target_workspace_number>
#
# Logs are saved in dispatch.log file next to the script.
# If the window doesn't appear or is dispatched incorrectly — info will be there.
#
# Notes:
# - Script waits about ~9 seconds (30 iterations of 0.3 sec) for window to appear.
# - Uses hyprctl and jq, so these tools must be installed.
#
# USAGE / ІНСТРУКЦІЯ:
# 1) Запуск з терміналу:
# ./dispatch.sh <application_command> <target_workspace_number>
# Наприклад:
# ./dispatch.sh discord 2
#
# 2) Виклик з конфігурації Hyprland (у файлі hyprland.conf):
# exec-once = /path/to/dispatch.sh <application_command> <target_workspace_number>
#
# Логи зберігаються у файлі dispatch.log поруч зі скриптом.
# Якщо вікно не з'явилось або неправильно диспатчилось — інформація там.
#
# Примітки:
# - Скрипт чекає до ~9 секунд (30 ітерацій по 0.3 сек) поки вікно з'явиться.
# - Використовує hyprctl і jq, тому ці інструменти мають бути встановлені.
LOGFILE="$(dirname "$0")/dispatch.log"
# Log file path located next to the script.
# Файл логів розташований поруч зі скриптом.
APP=$1
# The application command or window class to launch or match.
# Команда для запуску аплікації або клас вікна для пошуку.
TARGET_WORKSPACE=$2
# The target workspace number where the window should be moved.
# Цільовий номер воркспейсу, куди потрібно перемістити вікно.
# Check if required arguments are provided.
# Перевірка наявності необхідних параметрів.
if [[ -z "$APP" || -z "$TARGET_WORKSPACE" ]]; then
echo "Usage: $0 <application_command> <target_workspace_number>" >> "$LOGFILE" 2>&1
exit 1
fi
echo "Starting dispatch of '$APP' to workspace $TARGET_WORKSPACE at $(date)" >> "$LOGFILE"
# Starting the dispatch process and logging the event.
# Початок процесу диспатчу, запис у лог.
# Avoid early workspace focus issues by switching workspace first.
# Уникаємо проблем з раннім фокусом, спочатку переключаємо воркспейс.
hyprctl dispatch workspace "$TARGET_WORKSPACE" >> "$LOGFILE" 2>&1
sleep 0.4
# Launch the application in the background and disown it.
# Запускаємо аплікацію у фоновому режимі та відв’язуємо від терміналу.
$APP & disown
pid=$!
echo "Launched '$APP' with PID $pid" >> "$LOGFILE"
# Log the launched process ID.
# Лог процесу запуску з PID.
# Wait for the application window to appear (matching window class).
# Чекаємо появи вікна аплікації (за класом вікна).
for i in {1..30}; do
win=$(hyprctl clients -j | jq -r --arg APP "$APP" '
.[] | select(.class | test($APP;"i")) | .address' 2>>"$LOGFILE")
if [[ -n "$win" ]]; then
echo "Found window $win for app '$APP', moving to workspace $TARGET_WORKSPACE" >> "$LOGFILE"
# Move the window to the target workspace.
# Переміщаємо вікно на цільовий воркспейс.
hyprctl dispatch movetoworkspace "$TARGET_WORKSPACE,address:$win" >> "$LOGFILE" 2>&1
exit 0
fi
sleep 0.3
done
echo "ERROR: Window for '$APP' was NOT found or dispatched properly to workspace $TARGET_WORKSPACE at $(date)" >> "$LOGFILE"
# Log error if window was not found or dispatched correctly.
# Запис помилки, якщо вікно не знайдено або неправильно диспатчено.
exit 1

123
scripts/Tak0-Per-Window-Switch.sh Executable file
View File

@@ -0,0 +1,123 @@
##################################################################
# #
# #
# TAK_0'S Per-Window-Switch #
# #
# #
# #
# Just a little script that I made to switch keyboard layouts #
# per-window instead of global switching for the more #
# smooth and comfortable workflow. #
# #
##################################################################
# This is for changing kb_layouts. Set kb_layouts in
MAP_FILE="$HOME/.cache/kb_layout_per_window"
CFG_FILE="$HOME/.config/hypr/UserConfigs/UserSettings.conf"
ICON="$HOME/.config/swaync/images/ja.png"
SCRIPT_NAME="$(basename "$0")"
# Ensure map file exists
touch "$MAP_FILE"
# Read layouts from config
if ! grep -q 'kb_layout' "$CFG_FILE"; then
echo "Error: cannot find kb_layout in $CFG_FILE" >&2
exit 1
fi
kb_layouts=($(grep 'kb_layout' "$CFG_FILE" | cut -d '=' -f2 | tr -d '[:space:]' | tr ',' ' '))
count=${#kb_layouts[@]}
# Get current active window ID
get_win() {
hyprctl activewindow -j | jq -r '.address // .id'
}
# Get available keyboards
get_keyboards() {
hyprctl devices -j | jq -r '.keyboards[].name'
}
# Save window-specific layout
save_map() {
local W=$1 L=$2
grep -v "^${W}:" "$MAP_FILE" > "$MAP_FILE.tmp"
echo "${W}:${L}" >> "$MAP_FILE.tmp"
mv "$MAP_FILE.tmp" "$MAP_FILE"
}
# Load layout for window (fallback to default)
load_map() {
local W=$1
local E
E=$(grep "^${W}:" "$MAP_FILE")
[[ -n "$E" ]] && echo "${E#*:}" || echo "${kb_layouts[0]}"
}
# Switch layout for all keyboards to layout index
do_switch() {
local IDX=$1
for kb in $(get_keyboards); do
hyprctl switchxkblayout "$kb" "$IDX" 2>/dev/null
done
}
# Toggle layout for current window only
cmd_toggle() {
local W=$(get_win)
[[ -z "$W" ]] && return
local CUR=$(load_map "$W")
local i NEXT
for idx in "${!kb_layouts[@]}"; do
if [[ "${kb_layouts[idx]}" == "$CUR" ]]; then
i=$idx
break
fi
done
NEXT=$(( (i+1) % count ))
do_switch "$NEXT"
save_map "$W" "${kb_layouts[NEXT]}"
notify-send -u low -i "$ICON" "kb_layout: ${kb_layouts[NEXT]}"
}
# Restore layout on focus
cmd_restore() {
local W=$(get_win)
[[ -z "$W" ]] && return
local LAY=$(load_map "$W")
for idx in "${!kb_layouts[@]}"; do
if [[ "${kb_layouts[idx]}" == "$LAY" ]]; then
do_switch "$idx"
break
fi
done
}
# Listen to focus events and restore window-specific layouts
subscribe() {
local SOCKET2="$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock"
[[ -S "$SOCKET2" ]] || { echo "Error: Hyprland socket not found." >&2; exit 1; }
socat -u UNIX-CONNECT:"$SOCKET2" - | while read -r line; do
[[ "$line" =~ ^activewindow ]] && cmd_restore
done
}
# Ensure only one listener
if ! pgrep -f "$SCRIPT_NAME.*--listener" >/dev/null; then
subscribe --listener &
fi
# CLI
case "$1" in
toggle|"") cmd_toggle ;;
*) echo "Usage: $SCRIPT_NAME [toggle]" >&2; exit 1 ;;
esac

32
scripts/TouchPad.sh Executable file
View File

@@ -0,0 +1,32 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# For disabling touchpad.
# Edit the Touchpad_Device on ~/.config/hypr/UserConfigs/Laptops.conf according to your system
# use hyprctl devices to get your system touchpad device name
# source https://github.com/hyprwm/Hyprland/discussions/4283?sort=new#discussioncomment-8648109
notif="$HOME/.config/swaync/images/ja.png"
export STATUS_FILE="$XDG_RUNTIME_DIR/touchpad.status"
enable_touchpad() {
printf "true" >"$STATUS_FILE"
notify-send -u low -i $notif " Enabling" " touchpad"
hyprctl keyword '$TOUCHPAD_ENABLED' "true" -r
}
disable_touchpad() {
printf "false" >"$STATUS_FILE"
notify-send -u low -i $notif " Disabling" " touchpad"
hyprctl keyword '$TOUCHPAD_ENABLED' "false" -r
}
if ! [ -f "$STATUS_FILE" ]; then
enable_touchpad
else
if [ $(cat "$STATUS_FILE") = "true" ]; then
disable_touchpad
elif [ $(cat "$STATUS_FILE") = "false" ]; then
enable_touchpad
fi
fi

33
scripts/UptimeNixOS.sh Executable file
View File

@@ -0,0 +1,33 @@
#!/usr/bin/env bash
# Script parses /proc/uptime to get the system uptime
# and prints it in a human-readable format
# This is a workaround for system where `uptime` command is taken from coreutils
# where `uptime -p` is not supported
if [[ -r /proc/uptime ]]; then
s=$(< /proc/uptime)
s=${s/.*}
else
echo "Error UptimeNixOS.sh: Uptime could not be determined." >&2
exit 1
fi
d="$((s / 60 / 60 / 24)) days"
h="$((s / 60 / 60 % 24)) hours"
m="$((s / 60 % 60)) minutes"
# Remove plural if < 2.
((${d/ *} == 1)) && d=${d/s}
((${h/ *} == 1)) && h=${h/s}
((${m/ *} == 1)) && m=${m/s}
# Hide empty fields.
((${d/ *} == 0)) && unset d
((${h/ *} == 0)) && unset h
((${m/ *} == 0)) && unset m
uptime=${d:+$d, }${h:+$h, }$m
uptime=${uptime%', '}
uptime=${uptime:-$s seconds}
echo "up $uptime"

143
scripts/Volume.sh Executable file
View File

@@ -0,0 +1,143 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Scripts for volume controls for audio and mic
iDIR="$HOME/.config/swaync/icons"
sDIR="$HOME/.config/hypr/scripts"
# Get Volume
get_volume() {
volume=$(pamixer --get-volume)
if [[ "$volume" -eq "0" ]]; then
echo "Muted"
else
echo "$volume %"
fi
}
# Get icons
get_icon() {
current=$(get_volume)
if [[ "$current" == "Muted" ]]; then
echo "$iDIR/volume-mute.png"
elif [[ "${current%\%}" -le 30 ]]; then
echo "$iDIR/volume-low.png"
elif [[ "${current%\%}" -le 60 ]]; then
echo "$iDIR/volume-mid.png"
else
echo "$iDIR/volume-high.png"
fi
}
# Notify
notify_user() {
if [[ "$(get_volume)" == "Muted" ]]; then
notify-send -e -h string:x-canonical-private-synchronous:volume_notif -h boolean:SWAYNC_BYPASS_DND:true -u low -i "$(get_icon)" " Volume:" " Muted"
else
notify-send -e -h int:value:"$(get_volume | sed 's/%//')" -h string:x-canonical-private-synchronous:volume_notif -h boolean:SWAYNC_BYPASS_DND:true -u low -i "$(get_icon)" " Volume Level:" " $(get_volume)" &&
"$sDIR/Sounds.sh" --volume
fi
}
# Increase Volume
inc_volume() {
if [ "$(pamixer --get-mute)" == "true" ]; then
toggle_mute
else
pamixer -i 5 --allow-boost --set-limit 150 && notify_user
fi
}
# Decrease Volume
dec_volume() {
if [ "$(pamixer --get-mute)" == "true" ]; then
toggle_mute
else
pamixer -d 5 && notify_user
fi
}
# Toggle Mute
toggle_mute() {
if [ "$(pamixer --get-mute)" == "false" ]; then
pamixer -m && notify-send -e -u low -h boolean:SWAYNC_BYPASS_DND:true -i "$iDIR/volume-mute.png" " Mute"
elif [ "$(pamixer --get-mute)" == "true" ]; then
pamixer -u && notify-send -e -u low -h boolean:SWAYNC_BYPASS_DND:true -i "$(get_icon)" " Volume:" " Switched ON"
fi
}
# Toggle Mic
toggle_mic() {
if [ "$(pamixer --default-source --get-mute)" == "false" ]; then
pamixer --default-source -m && notify-send -e -u low -h boolean:SWAYNC_BYPASS_DND:true -i "$iDIR/microphone-mute.png" " Microphone:" " Switched OFF"
elif [ "$(pamixer --default-source --get-mute)" == "true" ]; then
pamixer -u --default-source u && notify-send -e -u low -h boolean:SWAYNC_BYPASS_DND:true -i "$iDIR/microphone.png" " Microphone:" " Switched ON"
fi
}
# Get Mic Icon
get_mic_icon() {
current=$(pamixer --default-source --get-volume)
if [[ "$current" -eq "0" ]]; then
echo "$iDIR/microphone-mute.png"
else
echo "$iDIR/microphone.png"
fi
}
# Get Microphone Volume
get_mic_volume() {
volume=$(pamixer --default-source --get-volume)
if [[ "$volume" -eq "0" ]]; then
echo "Muted"
else
echo "$volume %"
fi
}
# Notify for Microphone
notify_mic_user() {
volume=$(get_mic_volume)
icon=$(get_mic_icon)
notify-send -e -h int:value:"$volume" -h "string:x-canonical-private-synchronous:volume_notif" -h boolean:SWAYNC_BYPASS_DND:true -u low -i "$icon" " Mic Level:" " $volume"
}
# Increase MIC Volume
inc_mic_volume() {
if [ "$(pamixer --default-source --get-mute)" == "true" ]; then
toggle_mic
else
pamixer --default-source -i 5 && notify_mic_user
fi
}
# Decrease MIC Volume
dec_mic_volume() {
if [ "$(pamixer --default-source --get-mute)" == "true" ]; then
toggle-mic
else
pamixer --default-source -d 5 && notify_mic_user
fi
}
# Execute accordingly
if [[ "$1" == "--get" ]]; then
get_volume
elif [[ "$1" == "--inc" ]]; then
inc_volume
elif [[ "$1" == "--dec" ]]; then
dec_volume
elif [[ "$1" == "--toggle" ]]; then
toggle_mute
elif [[ "$1" == "--toggle-mic" ]]; then
toggle_mic
elif [[ "$1" == "--get-icon" ]]; then
get_icon
elif [[ "$1" == "--get-mic-icon" ]]; then
get_mic_icon
elif [[ "$1" == "--mic-inc" ]]; then
inc_mic_volume
elif [[ "$1" == "--mic-dec" ]]; then
dec_mic_volume
else
get_volume
fi

59
scripts/WallustSwww.sh Executable file
View File

@@ -0,0 +1,59 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Wallust: derive colors from the current wallpaper and update templates
# Usage: WallustSwww.sh [absolute_path_to_wallpaper]
set -euo pipefail
# Inputs and paths
passed_path="${1:-}"
cache_dir="$HOME/.cache/swww/"
rofi_link="$HOME/.config/rofi/.current_wallpaper"
wallpaper_current="$HOME/.config/hypr/wallpaper_effects/.wallpaper_current"
# Helper: get focused monitor name (prefer JSON)
get_focused_monitor() {
if command -v jq >/dev/null 2>&1; then
hyprctl monitors -j | jq -r '.[] | select(.focused) | .name'
else
hyprctl monitors | awk '/^Monitor/{name=$2} /focused: yes/{print name}'
fi
}
# Determine wallpaper_path
wallpaper_path=""
if [[ -n "$passed_path" && -f "$passed_path" ]]; then
wallpaper_path="$passed_path"
else
# Try to read from swww cache for the focused monitor, with a short retry loop
current_monitor="$(get_focused_monitor)"
cache_file="$cache_dir$current_monitor"
# Wait briefly for swww to write its cache after an image change
for i in {1..10}; do
if [[ -f "$cache_file" ]]; then
break
fi
sleep 0.1
done
if [[ -f "$cache_file" ]]; then
# The first non-filter line is the original wallpaper path
# wallpaper_path="$(grep -v 'Lanczos3' "$cache_file" | head -n 1)"
wallpaper_path=$(swww query | grep $current_monitor | awk '{print $9}')
fi
fi
if [[ -z "${wallpaper_path:-}" || ! -f "$wallpaper_path" ]]; then
# Nothing to do; avoid failing loudly so callers can continue
exit 0
fi
# Update helpers that depend on the path
ln -sf "$wallpaper_path" "$rofi_link" || true
mkdir -p "$(dirname "$wallpaper_current")"
cp -f "$wallpaper_path" "$wallpaper_current" || true
# Run wallust (silent) to regenerate templates defined in ~/.config/wallust/wallust.toml
# -s is used in this repo to keep things quiet and avoid extra prompts
wallust run -s "$wallpaper_path" || true

55
scripts/WaybarCava.sh Executable file
View File

@@ -0,0 +1,55 @@
#!/usr/bin/env bash
# WaybarCava.sh — safer single-instance handling, cleanup, and robustness
# Original concept by JaKooLit; this variant focuses on lifecycle hardening.
set -euo pipefail
# Ensure cava exists
if ! command -v cava >/dev/null 2>&1; then
echo "cava not found in PATH" >&2
exit 1
fi
# 0..7 → ▁▂▃▄▅▆▇█
bar="▁▂▃▄▅▆▇█"
dict="s/;//g"
bar_length=${#bar}
for ((i = 0; i < bar_length; i++)); do
dict+=";s/$i/${bar:$i:1}/g"
done
# Single-instance guard (only kill our previous instance if its still alive)
RUNTIME_DIR="${XDG_RUNTIME_DIR:-/tmp}"
pidfile="$RUNTIME_DIR/waybar-cava.pid"
if [[ -f "$pidfile" ]]; then
oldpid="$(cat "$pidfile" || true)"
if [[ -n "$oldpid" ]] && kill -0 "$oldpid" 2>/dev/null; then
kill "$oldpid" 2>/dev/null || true
sleep 0.1 || true
fi
fi
printf '%d' $$ >"$pidfile"
# Unique temp config + cleanup on exit
config_file="$(mktemp "$RUNTIME_DIR/waybar-cava.XXXXXX.conf")"
cleanup() { rm -f "$config_file" "$pidfile"; }
trap cleanup EXIT INT TERM
cat >"$config_file" <<EOF
[general]
framerate = 30
bars = 10
[input]
method = pulse
source = auto
[output]
method = raw
raw_target = /dev/stdout
data_format = ascii
ascii_max_range = 7
EOF
# Stream cava output and translate digits 0..7 to bar glyphs
exec cava -p "$config_file" | sed -u "$dict"

71
scripts/WaybarLayout.sh Executable file
View File

@@ -0,0 +1,71 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Script for waybar layout or configs
IFS=$'\n\t'
# Define directories
waybar_layouts="$HOME/.config/waybar/configs"
waybar_config="$HOME/.config/waybar/config"
SCRIPTSDIR="$HOME/.config/hypr/scripts"
rofi_config="$HOME/.config/rofi/config-waybar-layout.rasi"
msg=' 🎌 NOTE: Some waybar LAYOUT NOT fully compatible with some STYLES'
# Apply selected configuration
apply_config() {
ln -sf "$waybar_layouts/$1" "$waybar_config"
"${SCRIPTSDIR}/Refresh.sh" &
}
main() {
# Resolve current symlink target and basename
current_target=$(readlink -f "$waybar_config")
current_name=$(basename "$current_target")
# Build sorted list of available layouts
mapfile -t options < <(
find -L "$waybar_layouts" -maxdepth 1 -type f -printf '%f\n' | sort
)
# Mark and locate the active layout
default_row=0
MARKER="👉"
for i in "${!options[@]}"; do
if [[ "${options[i]}" == "$current_name" ]]; then
options[i]="$MARKER ${options[i]}"
default_row=$i
break
fi
done
# Launch rofi with the annotated list, preselecting the active row
choice=$(printf '%s\n' "${options[@]}" \
| rofi -i -dmenu \
-config "$rofi_config" \
-mesg "$msg" \
-selected-row "$default_row"
)
# Exit if nothing chosen
[[ -z "$choice" ]] && { echo "No option selected. Exiting."; exit 0; }
# Strip marker before applying
choice=${choice# $MARKER}
case "$choice" in
"no panel")
pgrep -x "waybar" && pkill waybar || true
;;
*)
apply_config "$choice"
;;
esac
}
# Kill Rofi if already running before execution
if pgrep -x "rofi" >/dev/null; then
pkill rofi
#exit 0
fi
main

44
scripts/WaybarScripts.sh Executable file
View File

@@ -0,0 +1,44 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
# This file used on waybar modules sourcing defaults set in $HOME/.config/hypr/UserConfigs/01-UserDefaults.conf
# Define the path to the config file
config_file=$HOME/.config/hypr/UserConfigs/01-UserDefaults.conf
# Check if the config file exists
if [[ ! -f "$config_file" ]]; then
echo "Error: Configuration file not found!"
exit 1
fi
# Process the config file in memory, removing the $ and fixing spaces
config_content=$(sed 's/\$//g' "$config_file" | sed 's/ = /=/')
# Source the modified content directly from the variable
eval "$config_content"
# Check if $term is set correctly
if [[ -z "$term" ]]; then
echo "Error: \$term is not set in the configuration file!"
exit 1
fi
# Execute accordingly based on the passed argument
if [[ "$1" == "--btop" ]]; then
$term --title btop sh -c 'btop'
elif [[ "$1" == "--nvtop" ]]; then
$term --title nvtop sh -c 'nvtop'
elif [[ "$1" == "--nmtui" ]]; then
$term nmtui
elif [[ "$1" == "--term" ]]; then
$term &
elif [[ "$1" == "--files" ]]; then
$files &
else
echo "Usage: $0 [--btop | --nvtop | --nmtui | --term]"
echo "--btop : Open btop in a new term"
echo "--nvtop : Open nvtop in a new term"
echo "--nmtui : Open nmtui in a new term"
echo "--term : Launch a term window"
echo "--files : Launch a file manager"
fi

64
scripts/WaybarStyles.sh Executable file
View File

@@ -0,0 +1,64 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# Script for waybar styles
IFS=$'\n\t'
# Define directories
waybar_styles="$HOME/.config/waybar/style"
waybar_style="$HOME/.config/waybar/style.css"
SCRIPTSDIR="$HOME/.config/hypr/scripts"
rofi_config="$HOME/.config/rofi/config-waybar-style.rasi"
msg=' 🎌 NOTE: Some waybar STYLES NOT fully compatible with some LAYOUTS'
# Apply selected style
apply_style() {
ln -sf "$waybar_styles/$1.css" "$waybar_style"
pkill waybar && waybar &
}
main() {
# resolve current symlink and strip .css
current_target=$(readlink -f "$waybar_style")
current_name=$(basename "$current_target" .css)
# gather all style names (without .css) into an array
mapfile -t options < <(
find -L "$waybar_styles" -maxdepth 1 -type f -name '*.css' \
-exec basename {} .css \; \
| sort
)
# mark the active style and record its index
default_row=0
MARKER="👉"
for i in "${!options[@]}"; do
if [[ "${options[i]}" == "$current_name" ]]; then
options[i]="$MARKER ${options[i]}"
default_row=$i
break
fi
done
# launch rofi with the annotated list and preselected row
choice=$(printf '%s\n' "${options[@]}" \
| rofi -i -dmenu \
-config "$rofi_config" \
-mesg "$msg" \
-selected-row "$default_row"
)
[[ -z "$choice" ]] && { echo "No option selected. Exiting."; exit 0; }
# remove annotation and apply
choice=${choice# $MARKER}
apply_style "$choice"
}
# Kill Rofi if already running before execution
if pgrep -x "rofi" >/dev/null; then
pkill rofi
#exit 0
fi
main

57
scripts/Wlogout.sh Executable file
View File

@@ -0,0 +1,57 @@
#!/bin/bash
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ##
# wlogout (Power, Screen Lock, Suspend, etc)
# Set variables for parameters. First numbers corresponts to Monitor Resolution
# i.e 2160 means 2160p
A_2160=600
B_2160=600
A_1600=400
B_1600=400
A_1440=400
B_1440=400
A_1080=200
B_1080=200
A_720=50
B_720=50
# Check if wlogout is already running
if pgrep -x "wlogout" > /dev/null; then
pkill -x "wlogout"
exit 0
fi
# Detect monitor resolution and scaling factor
resolution=$(hyprctl -j monitors | jq -r '.[] | select(.focused==true) | .height / .scale' | awk -F'.' '{print $1}')
hypr_scale=$(hyprctl -j monitors | jq -r '.[] | select(.focused==true) | .scale')
# Set parameters based on screen resolution and scaling factor
if ((resolution >= 2160)); then
T_val=$(awk "BEGIN {printf \"%.0f\", $A_2160 * 2160 * $hypr_scale / $resolution}")
B_val=$(awk "BEGIN {printf \"%.0f\", $B_2160 * 2160 * $hypr_scale / $resolution}")
echo "Setting parameters for resolution >= 4k"
wlogout --protocol layer-shell -b 6 -T $T_val -B $B_val &
elif ((resolution >= 1600 && resolution < 2160)); then
T_val=$(awk "BEGIN {printf \"%.0f\", $A_1600 * 1600 * $hypr_scale / $resolution}")
B_val=$(awk "BEGIN {printf \"%.0f\", $B_1600 * 1600 * $hypr_scale / $resolution}")
echo "Setting parameters for resolution >= 2.5k and < 4k"
wlogout --protocol layer-shell -b 6 -T $T_val -B $B_val &
elif ((resolution >= 1440 && resolution < 1600)); then
T_val=$(awk "BEGIN {printf \"%.0f\", $A_1440 * 1440 * $hypr_scale / $resolution}")
B_val=$(awk "BEGIN {printf \"%.0f\", $B_1440 * 1440 * $hypr_scale / $resolution}")
echo "Setting parameters for resolution >= 2k and < 2.5k"
wlogout --protocol layer-shell -b 6 -T $T_val -B $B_val &
elif ((resolution >= 1080 && resolution < 1440)); then
T_val=$(awk "BEGIN {printf \"%.0f\", $A_1080 * 1080 * $hypr_scale / $resolution}")
B_val=$(awk "BEGIN {printf \"%.0f\", $B_1080 * 1080 * $hypr_scale / $resolution}")
echo "Setting parameters for resolution >= 1080p and < 2k"
wlogout --protocol layer-shell -b 6 -T $T_val -B $B_val &
elif ((resolution >= 720 && resolution < 1080)); then
T_val=$(awk "BEGIN {printf \"%.0f\", $A_720 * 720 * $hypr_scale / $resolution}")
B_val=$(awk "BEGIN {printf \"%.0f\", $B_720 * 720 * $hypr_scale / $resolution}")
echo "Setting parameters for resolution >= 720p and < 1080p"
wlogout --protocol layer-shell -b 3 -T $T_val -B $B_val &
else
echo "Setting default parameters"
wlogout &
fi

Some files were not shown because too many files have changed in this diff Show More