Initial commit
This commit is contained in:
15
.gitignore
vendored
Normal file
15
.gitignore
vendored
Normal 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
0
.initial_startup_done
Normal file
14
Monitor_Profiles/README
Normal file
14
Monitor_Profiles/README
Normal 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.
|
||||||
|
|
||||||
52
Monitor_Profiles/default.conf
Normal file
52
Monitor_Profiles/default.conf
Normal 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
16
UserConfigs/00-Readme
Normal 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
|
||||||
18
UserConfigs/01-UserDefaults.conf
Normal file
18
UserConfigs/01-UserDefaults.conf
Normal 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={}"
|
||||||
89
UserConfigs/ENVariables.conf
Normal file
89
UserConfigs/ENVariables.conf
Normal 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. It’s 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.
|
||||||
4
UserConfigs/LaptopDisplay.conf
Normal file
4
UserConfigs/LaptopDisplay.conf
Normal 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
55
UserConfigs/Laptops.conf
Normal 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
|
||||||
|
#
|
||||||
59
UserConfigs/Startup_Apps.conf
Normal file
59
UserConfigs/Startup_Apps.conf
Normal 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
|
||||||
26
UserConfigs/UserAnimations.conf
Normal file
26
UserConfigs/UserAnimations.conf
Normal 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
|
||||||
|
}
|
||||||
58
UserConfigs/UserDecorations.conf
Normal file
58
UserConfigs/UserDecorations.conf
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
87
UserConfigs/UserKeybinds.conf
Normal file
87
UserConfigs/UserKeybinds.conf
Normal 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
|
||||||
120
UserConfigs/UserSettings.conf
Normal file
120
UserConfigs/UserSettings.conf
Normal 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 libinput’s 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
|
||||||
|
}
|
||||||
206
UserConfigs/WindowRules-old.conf
Normal file
206
UserConfigs/WindowRules-old.conf
Normal 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
|
||||||
235
UserConfigs/WindowRules.conf
Normal file
235
UserConfigs/WindowRules.conf
Normal 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
|
||||||
32
UserConfigs/WorkSpaceRules
Normal file
32
UserConfigs/WorkSpaceRules
Normal 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
5
UserScripts/00-Readme
Executable 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
14
UserScripts/RainbowBorders.sh
Executable 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
153
UserScripts/RofiBeats.sh
Executable 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
30
UserScripts/RofiCalc.sh
Executable 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
|
||||||
90
UserScripts/Tak0-Autodispatch.sh
Executable file
90
UserScripts/Tak0-Autodispatch.sh
Executable 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
|
||||||
42
UserScripts/WallpaperAutoChange.sh
Executable file
42
UserScripts/WallpaperAutoChange.sh
Executable 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
148
UserScripts/WallpaperEffects.sh
Executable 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
30
UserScripts/WallpaperRandom.sh
Executable 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
248
UserScripts/WallpaperSelect.sh
Executable 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
544
UserScripts/Weather.py
Executable 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
87
UserScripts/Weather.sh
Executable 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
69
UserScripts/ZshChangeTheme.sh
Executable 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
|
||||||
26
animations/00-default.conf
Normal file
26
animations/00-default.conf
Normal 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
|
||||||
|
}
|
||||||
27
animations/01-default - v2.conf
Normal file
27
animations/01-default - v2.conf
Normal 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
|
||||||
|
}
|
||||||
5
animations/03- Disable Animation.conf
Normal file
5
animations/03- Disable Animation.conf
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ #
|
||||||
|
|
||||||
|
animations {
|
||||||
|
enabled = no
|
||||||
|
}
|
||||||
40
animations/END-4.conf
Normal file
40
animations/END-4.conf
Normal 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
|
||||||
|
}
|
||||||
34
animations/HYDE - Vertical.conf
Normal file
34
animations/HYDE - Vertical.conf
Normal 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%
|
||||||
|
}
|
||||||
21
animations/HYDE - default.conf
Normal file
21
animations/HYDE - default.conf
Normal 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
|
||||||
|
}
|
||||||
27
animations/HYDE - minimal-1.conf
Normal file
27
animations/HYDE - minimal-1.conf
Normal 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
|
||||||
|
}
|
||||||
16
animations/HYDE - minimal-2.conf
Normal file
16
animations/HYDE - minimal-2.conf
Normal 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
|
||||||
|
}
|
||||||
41
animations/HYDE - optimized.conf
Normal file
41
animations/HYDE - optimized.conf
Normal 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%
|
||||||
|
}
|
||||||
15
animations/ML4W - classic.conf
Normal file
15
animations/ML4W - classic.conf
Normal 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
|
||||||
|
}
|
||||||
20
animations/ML4W - dynamic.conf
Normal file
20
animations/ML4W - dynamic.conf
Normal 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
|
||||||
|
}
|
||||||
24
animations/ML4W - fast.conf
Normal file
24
animations/ML4W - fast.conf
Normal 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
|
||||||
|
}
|
||||||
20
animations/ML4W - high.conf
Normal file
20
animations/ML4W - high.conf
Normal 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
|
||||||
|
}
|
||||||
20
animations/ML4W - moving.conf
Normal file
20
animations/ML4W - moving.conf
Normal 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
|
||||||
|
}
|
||||||
15
animations/ML4W - standard.conf
Normal file
15
animations/ML4W - standard.conf
Normal 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
|
||||||
|
}
|
||||||
55
animations/Mahaveer - me-1.conf
Normal file
55
animations/Mahaveer - me-1.conf
Normal 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
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
30
animations/Mahaveer - me-2.conf
Normal file
30
animations/Mahaveer - me-2.conf
Normal 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
8
application-style.conf
Normal 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
149
configs/Keybinds.conf
Normal 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
50
hypridle.conf
Normal 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
43
hyprland.conf
Normal 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
183
hyprlock-1080p.conf
Normal 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
184
hyprlock.conf
Normal 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
66
initial-boot.sh
Executable 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
63
monitors.conf
Normal 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
16
scripts/AirplaneMode.sh
Executable 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
31
scripts/Animations.sh
Executable 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
9
scripts/Battery.sh
Normal 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
69
scripts/Brightness.sh
Executable 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
51
scripts/BrightnessKbd.sh
Executable 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
17
scripts/ChangeBlur.sh
Executable 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
30
scripts/ChangeLayout.sh
Executable 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
49
scripts/ClipManager.sh
Executable 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
254
scripts/DarkLight.sh
Executable 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
40
scripts/Distro_update.sh
Executable 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
380
scripts/Dropterminal.sh
Executable 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
34
scripts/GameMode.sh
Executable 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
23
scripts/Hypridle.sh
Executable 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
99
scripts/Hyprsunset.sh
Executable 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
39
scripts/KeyBinds.sh
Executable 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
72
scripts/KeyHints.sh
Executable 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
11
scripts/KillActiveProcess.sh
Executable 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
136
scripts/Kitty_themes.sh
Executable 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
73
scripts/KooLsDotsUpdate.sh
Executable 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
117
scripts/Kool_Quick_Settings.sh
Executable 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
7
scripts/LockScreen.sh
Executable 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
62
scripts/MediaCtrl.sh
Executable 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
42
scripts/MonitorProfiles.sh
Executable 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
21
scripts/Polkit-NixOS.sh
Executable 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
34
scripts/Polkit.sh
Executable 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
16
scripts/PortalHyprland.sh
Executable 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
55
scripts/Refresh.sh
Executable 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
48
scripts/RefreshNoWaybar.sh
Executable 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
1871
scripts/RofiEmoji.sh
Executable file
File diff suppressed because it is too large
Load Diff
36
scripts/RofiSearch.sh
Executable file
36
scripts/RofiSearch.sh
Executable 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
|
||||||
229
scripts/RofiThemeSelector-modified.sh
Executable file
229
scripts/RofiThemeSelector-modified.sh
Executable 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
154
scripts/RofiThemeSelector.sh
Executable 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 & 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
164
scripts/ScreenShot.sh
Executable 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
77
scripts/Sounds.sh
Executable 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
104
scripts/SwitchKeyboardLayout.sh
Executable 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
90
scripts/Tak0-Autodispatch.sh
Executable 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
123
scripts/Tak0-Per-Window-Switch.sh
Executable 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
32
scripts/TouchPad.sh
Executable 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
33
scripts/UptimeNixOS.sh
Executable 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
143
scripts/Volume.sh
Executable 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
59
scripts/WallustSwww.sh
Executable 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
55
scripts/WaybarCava.sh
Executable 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 it’s 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
71
scripts/WaybarLayout.sh
Executable 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, pre‑selecting 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
44
scripts/WaybarScripts.sh
Executable 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
64
scripts/WaybarStyles.sh
Executable 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 pre‑selected 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
57
scripts/Wlogout.sh
Executable 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
Reference in New Issue
Block a user