commit 3fc38a20d94d31272e426c87a3040fe59e26e58c Author: ramforth Date: Fri Nov 14 17:35:52 2025 +0100 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d55635a --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +# Backup files +*~ +*.bak +*.swp + +# Cache files +.cache/ +*.cache + +# Temporary files +/tmp/ +*.tmp + +# Waybar backup +waybar_backup/ diff --git a/.initial_startup_done b/.initial_startup_done new file mode 100644 index 0000000..e69de29 diff --git a/Monitor_Profiles/README b/Monitor_Profiles/README new file mode 100644 index 0000000..86075d7 --- /dev/null +++ b/Monitor_Profiles/README @@ -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. + diff --git a/Monitor_Profiles/default.conf b/Monitor_Profiles/default.conf new file mode 100644 index 0000000..a96cac7 --- /dev/null +++ b/Monitor_Profiles/default.conf @@ -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 + diff --git a/UserConfigs/00-Readme b/UserConfigs/00-Readme new file mode 100644 index 0000000..e989d2b --- /dev/null +++ b/UserConfigs/00-Readme @@ -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 diff --git a/UserConfigs/01-UserDefaults.conf b/UserConfigs/01-UserDefaults.conf new file mode 100644 index 0000000..ae510f8 --- /dev/null +++ b/UserConfigs/01-UserDefaults.conf @@ -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={}" \ No newline at end of file diff --git a/UserConfigs/ENVariables.conf b/UserConfigs/ENVariables.conf new file mode 100644 index 0000000..f24cc30 --- /dev/null +++ b/UserConfigs/ENVariables.conf @@ -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. diff --git a/UserConfigs/LaptopDisplay.conf b/UserConfigs/LaptopDisplay.conf new file mode 100644 index 0000000..9f76658 --- /dev/null +++ b/UserConfigs/LaptopDisplay.conf @@ -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 diff --git a/UserConfigs/Laptops.conf b/UserConfigs/Laptops.conf new file mode 100644 index 0000000..edb6846 --- /dev/null +++ b/UserConfigs/Laptops.conf @@ -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 +# diff --git a/UserConfigs/Startup_Apps.conf b/UserConfigs/Startup_Apps.conf new file mode 100644 index 0000000..a4a6257 --- /dev/null +++ b/UserConfigs/Startup_Apps.conf @@ -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 diff --git a/UserConfigs/UserAnimations.conf b/UserConfigs/UserAnimations.conf new file mode 100644 index 0000000..0f40b5e --- /dev/null +++ b/UserConfigs/UserAnimations.conf @@ -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 +} \ No newline at end of file diff --git a/UserConfigs/UserDecorations.conf b/UserConfigs/UserDecorations.conf new file mode 100644 index 0000000..0b45090 --- /dev/null +++ b/UserConfigs/UserDecorations.conf @@ -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 + } +} diff --git a/UserConfigs/UserKeybinds.conf b/UserConfigs/UserKeybinds.conf new file mode 100644 index 0000000..338bf0d --- /dev/null +++ b/UserConfigs/UserKeybinds.conf @@ -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 diff --git a/UserConfigs/UserSettings.conf b/UserConfigs/UserSettings.conf new file mode 100644 index 0000000..33f9838 --- /dev/null +++ b/UserConfigs/UserSettings.conf @@ -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 +} diff --git a/UserConfigs/WindowRules-old.conf b/UserConfigs/WindowRules-old.conf new file mode 100644 index 0000000..d6e1dea --- /dev/null +++ b/UserConfigs/WindowRules-old.conf @@ -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, + +#layerrule = ignorezero, overview +#layerrule = blur, overview \ No newline at end of file diff --git a/UserConfigs/WindowRules.conf b/UserConfigs/WindowRules.conf new file mode 100644 index 0000000..d6959dc --- /dev/null +++ b/UserConfigs/WindowRules.conf @@ -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, + +#layerrule = ignorezero, overview +#layerrule = blur, overview diff --git a/UserConfigs/WorkSpaceRules b/UserConfigs/WorkSpaceRules new file mode 100644 index 0000000..aa86b35 --- /dev/null +++ b/UserConfigs/WorkSpaceRules @@ -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 \ No newline at end of file diff --git a/UserScripts/00-Readme b/UserScripts/00-Readme new file mode 100755 index 0000000..091bac8 --- /dev/null +++ b/UserScripts/00-Readme @@ -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 \ No newline at end of file diff --git a/UserScripts/RainbowBorders.sh b/UserScripts/RainbowBorders.sh new file mode 100755 index 0000000..cc1419f --- /dev/null +++ b/UserScripts/RainbowBorders.sh @@ -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 \ No newline at end of file diff --git a/UserScripts/RofiBeats.sh b/UserScripts/RofiBeats.sh new file mode 100755 index 0000000..1cddce0 --- /dev/null +++ b/UserScripts/RofiBeats.sh @@ -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 diff --git a/UserScripts/RofiCalc.sh b/UserScripts/RofiCalc.sh new file mode 100755 index 0000000..4b3b8b6 --- /dev/null +++ b/UserScripts/RofiCalc.sh @@ -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 diff --git a/UserScripts/Tak0-Autodispatch.sh b/UserScripts/Tak0-Autodispatch.sh new file mode 100755 index 0000000..a1f7212 --- /dev/null +++ b/UserScripts/Tak0-Autodispatch.sh @@ -0,0 +1,90 @@ +#!/bin/bash +# USAGE / ІНСТРУКЦІЯ: +# 1) Run from terminal: +# ./dispatch.sh +# Example: +# ./dispatch.sh discord 2 +# +# 2) Call from Hyprland config (in hyprland.conf file): +# exec-once = /path/to/dispatch.sh +# +# 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 +# Наприклад: +# ./dispatch.sh discord 2 +# +# 2) Виклик з конфігурації Hyprland (у файлі hyprland.conf): +# exec-once = /path/to/dispatch.sh +# +# Логи зберігаються у файлі 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 " >> "$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 diff --git a/UserScripts/WallpaperAutoChange.sh b/UserScripts/WallpaperAutoChange.sh new file mode 100755 index 0000000..a6d2ced --- /dev/null +++ b/UserScripts/WallpaperAutoChange.sh @@ -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 " + 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 diff --git a/UserScripts/WallpaperEffects.sh b/UserScripts/WallpaperEffects.sh new file mode 100755 index 0000000..ac8fc0e --- /dev/null +++ b/UserScripts/WallpaperEffects.sh @@ -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 diff --git a/UserScripts/WallpaperRandom.sh b/UserScripts/WallpaperRandom.sh new file mode 100755 index 0000000..7939650 --- /dev/null +++ b/UserScripts/WallpaperRandom.sh @@ -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" + diff --git a/UserScripts/WallpaperSelect.sh b/UserScripts/WallpaperSelect.sh new file mode 100755 index 0000000..466832b --- /dev/null +++ b/UserScripts/WallpaperSelect.sh @@ -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 \ No newline at end of file diff --git a/UserScripts/Weather.py b/UserScripts/Weather.py new file mode 100755 index 0000000..ca1d528 --- /dev/null +++ b/UserScripts/Weather.py @@ -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'{esc(temp_str)}', + f" {icon}", + f"{esc(status)}", + esc(location_text), + f"{esc(feels_str)}" if feels_str else "", + f"{esc(min_max)}" if min_max else "", + f"{esc(wind_text)}\t{esc(humidity_text)}", + f"{esc(visibility_text)}\t{esc(aqi_text)}", + f" {esc(prediction)}" 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() diff --git a/UserScripts/Weather.sh b/UserScripts/Weather.sh new file mode 100755 index 0000000..9bdaff4 --- /dev/null +++ b/UserScripts/Weather.sh @@ -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" \ No newline at end of file diff --git a/UserScripts/ZshChangeTheme.sh b/UserScripts/ZshChangeTheme.sh new file mode 100755 index 0000000..cffaf5c --- /dev/null +++ b/UserScripts/ZshChangeTheme.sh @@ -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 diff --git a/animations/00-default.conf b/animations/00-default.conf new file mode 100644 index 0000000..0f40b5e --- /dev/null +++ b/animations/00-default.conf @@ -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 +} \ No newline at end of file diff --git a/animations/01-default - v2.conf b/animations/01-default - v2.conf new file mode 100644 index 0000000..dfbbed7 --- /dev/null +++ b/animations/01-default - v2.conf @@ -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 +} \ No newline at end of file diff --git a/animations/03- Disable Animation.conf b/animations/03- Disable Animation.conf new file mode 100644 index 0000000..f73a485 --- /dev/null +++ b/animations/03- Disable Animation.conf @@ -0,0 +1,5 @@ +# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ # + +animations { + enabled = no +} \ No newline at end of file diff --git a/animations/END-4.conf b/animations/END-4.conf new file mode 100644 index 0000000..0ab8d1a --- /dev/null +++ b/animations/END-4.conf @@ -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 +} diff --git a/animations/HYDE - Vertical.conf b/animations/HYDE - Vertical.conf new file mode 100644 index 0000000..ccceccf --- /dev/null +++ b/animations/HYDE - Vertical.conf @@ -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% +} diff --git a/animations/HYDE - default.conf b/animations/HYDE - default.conf new file mode 100644 index 0000000..96c439d --- /dev/null +++ b/animations/HYDE - default.conf @@ -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 +} diff --git a/animations/HYDE - minimal-1.conf b/animations/HYDE - minimal-1.conf new file mode 100644 index 0000000..6dbcf8e --- /dev/null +++ b/animations/HYDE - minimal-1.conf @@ -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 +} diff --git a/animations/HYDE - minimal-2.conf b/animations/HYDE - minimal-2.conf new file mode 100644 index 0000000..6ac56bc --- /dev/null +++ b/animations/HYDE - minimal-2.conf @@ -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 +} \ No newline at end of file diff --git a/animations/HYDE - optimized.conf b/animations/HYDE - optimized.conf new file mode 100644 index 0000000..7534c69 --- /dev/null +++ b/animations/HYDE - optimized.conf @@ -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% +} diff --git a/animations/ML4W - classic.conf b/animations/ML4W - classic.conf new file mode 100644 index 0000000..af8c5e1 --- /dev/null +++ b/animations/ML4W - classic.conf @@ -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 +} diff --git a/animations/ML4W - dynamic.conf b/animations/ML4W - dynamic.conf new file mode 100644 index 0000000..c5f1da0 --- /dev/null +++ b/animations/ML4W - dynamic.conf @@ -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 +} diff --git a/animations/ML4W - fast.conf b/animations/ML4W - fast.conf new file mode 100644 index 0000000..9623c41 --- /dev/null +++ b/animations/ML4W - fast.conf @@ -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 +} \ No newline at end of file diff --git a/animations/ML4W - high.conf b/animations/ML4W - high.conf new file mode 100644 index 0000000..e881d8b --- /dev/null +++ b/animations/ML4W - high.conf @@ -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 +} diff --git a/animations/ML4W - moving.conf b/animations/ML4W - moving.conf new file mode 100644 index 0000000..974a8f6 --- /dev/null +++ b/animations/ML4W - moving.conf @@ -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 +} diff --git a/animations/ML4W - standard.conf b/animations/ML4W - standard.conf new file mode 100644 index 0000000..aa312bb --- /dev/null +++ b/animations/ML4W - standard.conf @@ -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 +} diff --git a/animations/Mahaveer - me-1.conf b/animations/Mahaveer - me-1.conf new file mode 100644 index 0000000..7c93f3e --- /dev/null +++ b/animations/Mahaveer - me-1.conf @@ -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 +} + + diff --git a/animations/Mahaveer - me-2.conf b/animations/Mahaveer - me-2.conf new file mode 100644 index 0000000..4cc2bfa --- /dev/null +++ b/animations/Mahaveer - me-2.conf @@ -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 +} \ No newline at end of file diff --git a/application-style.conf b/application-style.conf new file mode 100644 index 0000000..7e67f10 --- /dev/null +++ b/application-style.conf @@ -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 \ No newline at end of file diff --git a/configs/Keybinds.conf b/configs/Keybinds.conf new file mode 100644 index 0000000..c2ba968 --- /dev/null +++ b/configs/Keybinds.conf @@ -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 \ No newline at end of file diff --git a/hypridle.conf b/hypridle.conf new file mode 100644 index 0000000..4b8cd7e --- /dev/null +++ b/hypridle.conf @@ -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. +# } diff --git a/hyprland.conf b/hyprland.conf new file mode 100644 index 0000000..71f243e --- /dev/null +++ b/hyprland.conf @@ -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 \ No newline at end of file diff --git a/hyprlock-1080p.conf b/hyprlock-1080p.conf new file mode 100644 index 0000000..14f2f35 --- /dev/null +++ b/hyprlock-1080p.conf @@ -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 " "$(date +'%A, %-d %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 = 🔒 Type Password + 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 " "$(uptime -p || $Scripts/UptimeNixOS.sh)" " + 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 " "$($Scripts/Battery.sh)" " + 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 +} diff --git a/hyprlock.conf b/hyprlock.conf new file mode 100644 index 0000000..b67bba5 --- /dev/null +++ b/hyprlock.conf @@ -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 " "$(date +'%A, %-d %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 = 🔒 Type Password + 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 " "$(uptime -p || $Scripts/UptimeNixOS.sh)" " + 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 " "$($Scripts/Battery.sh)" " + 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 +} diff --git a/initial-boot.sh b/initial-boot.sh new file mode 100755 index 0000000..5b49cb6 --- /dev/null +++ b/initial-boot.sh @@ -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 diff --git a/monitors.conf b/monitors.conf new file mode 100644 index 0000000..52a3d08 --- /dev/null +++ b/monitors.conf @@ -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 \ No newline at end of file diff --git a/scripts/AirplaneMode.sh b/scripts/AirplaneMode.sh new file mode 100755 index 0000000..4379935 --- /dev/null +++ b/scripts/AirplaneMode.sh @@ -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 diff --git a/scripts/Animations.sh b/scripts/Animations.sh new file mode 100755 index 0000000..477e5cd --- /dev/null +++ b/scripts/Animations.sh @@ -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" diff --git a/scripts/Battery.sh b/scripts/Battery.sh new file mode 100644 index 0000000..d783005 --- /dev/null +++ b/scripts/Battery.sh @@ -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 diff --git a/scripts/Brightness.sh b/scripts/Brightness.sh new file mode 100755 index 0000000..63fd02f --- /dev/null +++ b/scripts/Brightness.sh @@ -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 \ No newline at end of file diff --git a/scripts/BrightnessKbd.sh b/scripts/BrightnessKbd.sh new file mode 100755 index 0000000..24737b7 --- /dev/null +++ b/scripts/BrightnessKbd.sh @@ -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 diff --git a/scripts/ChangeBlur.sh b/scripts/ChangeBlur.sh new file mode 100755 index 0000000..895987a --- /dev/null +++ b/scripts/ChangeBlur.sh @@ -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 diff --git a/scripts/ChangeLayout.sh b/scripts/ChangeLayout.sh new file mode 100755 index 0000000..b083fcd --- /dev/null +++ b/scripts/ChangeLayout.sh @@ -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 diff --git a/scripts/ClipManager.sh b/scripts/ClipManager.sh new file mode 100755 index 0000000..9937b6f --- /dev/null +++ b/scripts/ClipManager.sh @@ -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 + diff --git a/scripts/DarkLight.sh b/scripts/DarkLight.sh new file mode 100755 index 0000000..1bc1602 --- /dev/null +++ b/scripts/DarkLight.sh @@ -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 + diff --git a/scripts/Distro_update.sh b/scripts/Distro_update.sh new file mode 100755 index 0000000..b0b1446 --- /dev/null +++ b/scripts/Distro_update.sh @@ -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 diff --git a/scripts/Dropterminal.sh b/scripts/Dropterminal.sh new file mode 100755 index 0000000..4833545 --- /dev/null +++ b/scripts/Dropterminal.sh @@ -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] +# 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] " + 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 diff --git a/scripts/GameMode.sh b/scripts/GameMode.sh new file mode 100755 index 0000000..7a39da3 --- /dev/null +++ b/scripts/GameMode.sh @@ -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 diff --git a/scripts/Hypridle.sh b/scripts/Hypridle.sh new file mode 100755 index 0000000..5617671 --- /dev/null +++ b/scripts/Hypridle.sh @@ -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 diff --git a/scripts/Hyprsunset.sh b/scripts/Hyprsunset.sh new file mode 100755 index 0000000..c7c4b39 --- /dev/null +++ b/scripts/Hyprsunset.sh @@ -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="$(icon_on)" + cls="on" + tip="Night light on @ ${TARGET_TEMP}K" + else + txt="$(icon_off)" + 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 diff --git a/scripts/KeyBinds.sh b/scripts/KeyBinds.sh new file mode 100755 index 0000000..9c6b5ab --- /dev/null +++ b/scripts/KeyBinds.sh @@ -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" \ No newline at end of file diff --git a/scripts/KeyHints.sh b/scripts/KeyHints.sh new file mode 100755 index 0000000..7917ae3 --- /dev/null +++ b/scripts/KeyHints.sh @@ -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" ""\ \ No newline at end of file diff --git a/scripts/KillActiveProcess.sh b/scripts/KillActiveProcess.sh new file mode 100755 index 0000000..bee146d --- /dev/null +++ b/scripts/KillActiveProcess.sh @@ -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 \ No newline at end of file diff --git a/scripts/Kitty_themes.sh b/scripts/Kitty_themes.sh new file mode 100755 index 0000000..48bfa99 --- /dev/null +++ b/scripts/Kitty_themes.sh @@ -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 diff --git a/scripts/KooLsDotsUpdate.sh b/scripts/KooLsDotsUpdate.sh new file mode 100755 index 0000000..f4b8814 --- /dev/null +++ b/scripts/KooLsDotsUpdate.sh @@ -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 diff --git a/scripts/Kool_Quick_Settings.sh b/scripts/Kool_Quick_Settings.sh new file mode 100755 index 0000000..e43749b --- /dev/null +++ b/scripts/Kool_Quick_Settings.sh @@ -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 </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 \ No newline at end of file diff --git a/scripts/LockScreen.sh b/scripts/LockScreen.sh new file mode 100755 index 0000000..5e79918 --- /dev/null +++ b/scripts/LockScreen.sh @@ -0,0 +1,7 @@ +#!/bin/bash +# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ## + +# For Hyprlock +#pidof hyprlock || hyprlock -q + +loginctl lock-session \ No newline at end of file diff --git a/scripts/MediaCtrl.sh b/scripts/MediaCtrl.sh new file mode 100755 index 0000000..000c3ad --- /dev/null +++ b/scripts/MediaCtrl.sh @@ -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 diff --git a/scripts/MonitorProfiles.sh b/scripts/MonitorProfiles.sh new file mode 100755 index 0000000..67316c0 --- /dev/null +++ b/scripts/MonitorProfiles.sh @@ -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 & \ No newline at end of file diff --git a/scripts/Polkit-NixOS.sh b/scripts/Polkit-NixOS.sh new file mode 100755 index 0000000..51675ef --- /dev/null +++ b/scripts/Polkit-NixOS.sh @@ -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." \ No newline at end of file diff --git a/scripts/Polkit.sh b/scripts/Polkit.sh new file mode 100755 index 0000000..dcea765 --- /dev/null +++ b/scripts/Polkit.sh @@ -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 diff --git a/scripts/PortalHyprland.sh b/scripts/PortalHyprland.sh new file mode 100755 index 0000000..9bdf4b8 --- /dev/null +++ b/scripts/PortalHyprland.sh @@ -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 & + diff --git a/scripts/Refresh.sh b/scripts/Refresh.sh new file mode 100755 index 0000000..719c368 --- /dev/null +++ b/scripts/Refresh.sh @@ -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 \ No newline at end of file diff --git a/scripts/RefreshNoWaybar.sh b/scripts/RefreshNoWaybar.sh new file mode 100755 index 0000000..8454124 --- /dev/null +++ b/scripts/RefreshNoWaybar.sh @@ -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 \ No newline at end of file diff --git a/scripts/RofiEmoji.sh b/scripts/RofiEmoji.sh new file mode 100755 index 0000000..4570831 --- /dev/null +++ b/scripts/RofiEmoji.sh @@ -0,0 +1,1871 @@ +#!/bin/bash +# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ ## + +# Variables +rofi_theme="$HOME/.config/rofi/config-emoji.rasi" +msg='** note ** 👀 Click or Return to choose || Ctrl V to Paste' + +# Check if rofi is already running +if pidof rofi > /dev/null; then + pkill rofi +fi + +sed '1,/^# # DATA # #$/d' "$0" | \ +rofi -i -dmenu -mesg "$msg" -config $rofi_theme | \ +awk '{print $1}' | \ +head -n 1 | \ +tr -d '\n' | \ +wl-copy + +exit + +# # DATA # # +😀 grinning face face smile happy joy :D grin +😃 grinning face with big eyes face happy joy haha :D :) smile funny +😄 grinning face with smiling eyes face happy joy funny haha laugh like :D :) smile +😁 beaming face with smiling eyes face happy smile joy kawaii +😆 grinning squinting face happy joy lol satisfied haha face glad XD laugh +😅 grinning face with sweat face hot happy laugh sweat smile relief +🤣 rolling on the floor laughing face rolling floor laughing lol haha rofl +😂 face with tears of joy face cry tears weep happy happytears haha +🙂 slightly smiling face face smile +🙃 upside down face face flipped silly smile +😉 winking face face happy mischievous secret ;) smile eye +😊 smiling face with smiling eyes face smile happy flushed crush embarrassed shy joy +😇 smiling face with halo face angel heaven halo +🥰 smiling face with hearts face love like affection valentines infatuation crush hearts adore +😍 smiling face with heart eyes face love like affection valentines infatuation crush heart +🤩 star struck face smile starry eyes grinning +😘 face blowing a kiss face love like affection valentines infatuation kiss +😗 kissing face love like face 3 valentines infatuation kiss +☺️ smiling face face blush massage happiness +😚 kissing face with closed eyes face love like affection valentines infatuation kiss +😙 kissing face with smiling eyes face affection valentines infatuation kiss +😋 face savoring food happy joy tongue smile face silly yummy nom delicious savouring +😛 face with tongue face prank childish playful mischievous smile tongue +😜 winking face with tongue face prank childish playful mischievous smile wink tongue +🤪 zany face face goofy crazy +😝 squinting face with tongue face prank playful mischievous smile tongue +🤑 money mouth face face rich dollar money +🤗 hugging face face smile hug +🤭 face with hand over mouth face whoops shock surprise +🤫 shushing face face quiet shhh +🤔 thinking face face hmmm think consider +🤐 zipper mouth face face sealed zipper secret +🤨 face with raised eyebrow face distrust scepticism disapproval disbelief surprise +😐 neutral face indifference meh :| neutral +😑 expressionless face face indifferent - - meh deadpan +😶 face without mouth face hellokitty +😏 smirking face face smile mean prank smug sarcasm +😒 unamused face indifference bored straight face serious sarcasm unimpressed skeptical dubious side eye +🙄 face with rolling eyes face eyeroll frustrated +😬 grimacing face face grimace teeth +🤥 lying face face lie pinocchio +😌 relieved face face relaxed phew massage happiness +😔 pensive face face sad depressed upset +😪 sleepy face face tired rest nap +🤤 drooling face face +😴 sleeping face face tired sleepy night zzz +😷 face with medical mask face sick ill disease +🤒 face with thermometer sick temperature thermometer cold fever +🤕 face with head bandage injured clumsy bandage hurt +🤢 nauseated face face vomit gross green sick throw up ill +🤮 face vomiting face sick +🤧 sneezing face face gesundheit sneeze sick allergy +🥵 hot face face feverish heat red sweating +🥶 cold face face blue freezing frozen frostbite icicles +🥴 woozy face face dizzy intoxicated tipsy wavy +😵 dizzy face spent unconscious xox dizzy +🤯 exploding head face shocked mind blown +🤠 cowboy hat face face cowgirl hat +🥳 partying face face celebration woohoo +😎 smiling face with sunglasses face cool smile summer beach sunglass +🤓 nerd face face nerdy geek dork +🧐 face with monocle face stuffy wealthy +😕 confused face face indifference huh weird hmmm :/ +😟 worried face face concern nervous :( +🙁 slightly frowning face face frowning disappointed sad upset +☹️ frowning face face sad upset frown +😮 face with open mouth face surprise impressed wow whoa :O +😯 hushed face face woo shh +😲 astonished face face xox surprised poisoned +😳 flushed face face blush shy flattered +🥺 pleading face face begging mercy +😦 frowning face with open mouth face aw what +😧 anguished face face stunned nervous +😨 fearful face face scared terrified nervous oops huh +😰 anxious face with sweat face nervous sweat +😥 sad but relieved face face phew sweat nervous +😢 crying face face tears sad depressed upset :'( +😭 loudly crying face face cry tears sad upset depressed +😱 face screaming in fear face munch scared omg +😖 confounded face face confused sick unwell oops :S +😣 persevering face face sick no upset oops +😞 disappointed face face sad upset depressed :( +😓 downcast face with sweat face hot sad tired exercise +😩 weary face face tired sleepy sad frustrated upset +😫 tired face sick whine upset frustrated +🥱 yawning face tired sleepy +😤 face with steam from nose face gas phew proud pride +😡 pouting face angry mad hate despise +😠 angry face mad face annoyed frustrated +🤬 face with symbols on mouth face swearing cursing cussing profanity expletive +😈 smiling face with horns devil horns +👿 angry face with horns devil angry horns +💀 skull dead skeleton creepy death +☠️ skull and crossbones poison danger deadly scary death pirate evil +💩 pile of poo hankey shitface fail turd shit +🤡 clown face face +👹 ogre monster red mask halloween scary creepy devil demon japanese ogre +👺 goblin red evil mask monster scary creepy japanese goblin +👻 ghost halloween spooky scary +👽 alien UFO paul weird outer space +👾 alien monster game arcade play +🤖 robot computer machine bot +😺 grinning cat animal cats happy smile +😸 grinning cat with smiling eyes animal cats smile +😹 cat with tears of joy animal cats haha happy tears +😻 smiling cat with heart eyes animal love like affection cats valentines heart +😼 cat with wry smile animal cats smirk +😽 kissing cat animal cats kiss +🙀 weary cat animal cats munch scared scream +😿 crying cat animal tears weep sad cats upset cry +😾 pouting cat animal cats +🙈 see no evil monkey monkey animal nature haha +🙉 hear no evil monkey animal monkey nature +🙊 speak no evil monkey monkey animal nature omg +💋 kiss mark face lips love like affection valentines +💌 love letter email like affection envelope valentines +💘 heart with arrow love like heart affection valentines +💝 heart with ribbon love valentines +💖 sparkling heart love like affection valentines +💗 growing heart like love affection valentines pink +💓 beating heart love like affection valentines pink heart +💞 revolving hearts love like affection valentines +💕 two hearts love like affection valentines heart +💟 heart decoration purple-square love like +❣️ heart exclamation decoration love +💔 broken heart sad sorry break heart heartbreak +❤️ red heart love like valentines +🧡 orange heart love like affection valentines +💛 yellow heart love like affection valentines +💚 green heart love like affection valentines +💙 blue heart love like affection valentines +💜 purple heart love like affection valentines +🤎 brown heart coffee +🖤 black heart evil +🤍 white heart pure +💯 hundred points score perfect numbers century exam quiz test pass hundred +💢 anger symbol angry mad +💥 collision bomb explode explosion collision blown +💫 dizzy star sparkle shoot magic +💦 sweat droplets water drip oops +💨 dashing away wind air fast shoo fart smoke puff +🕳️ hole embarrassing +💣 bomb boom explode explosion terrorism +💬 speech balloon bubble words message talk chatting +👁️‍🗨️ eye in speech bubble info +🗨️ left speech bubble words message talk chatting +🗯️ right anger bubble caption speech thinking mad +💭 thought balloon bubble cloud speech thinking dream +💤 zzz sleepy tired dream +👋 waving hand hands gesture goodbye solong farewell hello hi palm +🤚 raised back of hand fingers raised backhand +🖐️ hand with fingers splayed hand fingers palm +✋ raised hand fingers stop highfive palm ban +🖖 vulcan salute hand fingers spock star trek +👌 ok hand fingers limbs perfect ok okay +🤏 pinching hand tiny small size +✌️ victory hand fingers ohyeah hand peace victory two +🤞 crossed fingers good lucky +🤟 love you gesture hand fingers gesture +🤘 sign of the horns hand fingers evil eye sign of horns rock on +🤙 call me hand hands gesture shaka +👈 backhand index pointing left direction fingers hand left +👉 backhand index pointing right fingers hand direction right +👆 backhand index pointing up fingers hand direction up +🖕 middle finger hand fingers rude middle flipping +👇 backhand index pointing down fingers hand direction down +☝️ index pointing up hand fingers direction up +👍 thumbs up thumbsup yes awesome good agree accept cool hand like +1 +👎 thumbs down thumbsdown no dislike hand -1 +✊ raised fist fingers hand grasp +👊 oncoming fist angry violence fist hit attack hand +🤛 left facing fist hand fistbump +🤜 right facing fist hand fistbump +👏 clapping hands hands praise applause congrats yay +🙌 raising hands gesture hooray yea celebration hands +👐 open hands fingers butterfly hands open +🤲 palms up together hands gesture cupped prayer +🤝 handshake agreement shake +🙏 folded hands please hope wish namaste highfive pray +✍️ writing hand lower left ballpoint pen stationery write compose +💅 nail polish beauty manicure finger fashion nail +🤳 selfie camera phone +💪 flexed biceps arm flex hand summer strong biceps +🦾 mechanical arm accessibility +🦿 mechanical leg accessibility +🦵 leg kick limb +🦶 foot kick stomp +👂 ear face hear sound listen +🦻 ear with hearing aid accessibility +👃 nose smell sniff +🧠 brain smart intelligent +🦷 tooth teeth dentist +🦴 bone skeleton +👀 eyes look watch stalk peek see +👁️ eye face look see watch stare +👅 tongue mouth playful +👄 mouth mouth kiss +👶 baby child boy girl toddler +🧒 child gender-neutral young +👦 boy man male guy teenager +👧 girl female woman teenager +🧑 person gender-neutral person +👱 person blond hair hairstyle +👨 man mustache father dad guy classy sir moustache +🧔 man beard person bewhiskered +👨‍🦰 man red hair hairstyle +👨‍🦱 man curly hair hairstyle +👨‍🦳 man white hair old elder +👨‍🦲 man bald hairless +👩 woman female girls lady +👩‍🦰 woman red hair hairstyle +🧑‍🦰 person red hair hairstyle +👩‍🦱 woman curly hair hairstyle +🧑‍🦱 person curly hair hairstyle +👩‍🦳 woman white hair old elder +🧑‍🦳 person white hair elder old +👩‍🦲 woman bald hairless +🧑‍🦲 person bald hairless +👱‍♀️ woman blond hair woman female girl blonde person +👱‍♂️ man blond hair man male boy blonde guy person +🧓 older person human elder senior gender-neutral +👴 old man human male men old elder senior +👵 old woman human female women lady old elder senior +🙍 person frowning worried +🙍‍♂️ man frowning male boy man sad depressed discouraged unhappy +🙍‍♀️ woman frowning female girl woman sad depressed discouraged unhappy +🙎 person pouting upset +🙎‍♂️ man pouting male boy man +🙎‍♀️ woman pouting female girl woman +🙅 person gesturing no decline +🙅‍♂️ man gesturing no male boy man nope +🙅‍♀️ woman gesturing no female girl woman nope +🙆 person gesturing ok agree +🙆‍♂️ man gesturing ok men boy male blue human man +🙆‍♀️ woman gesturing ok women girl female pink human woman +💁 person tipping hand information +💁‍♂️ man tipping hand male boy man human information +💁‍♀️ woman tipping hand female girl woman human information +🙋 person raising hand question +🙋‍♂️ man raising hand male boy man +🙋‍♀️ woman raising hand female girl woman +🧏 deaf person accessibility +🧏‍♂️ deaf man accessibility +🧏‍♀️ deaf woman accessibility +🙇 person bowing respectiful +🙇‍♂️ man bowing man male boy +🙇‍♀️ woman bowing woman female girl +🤦 person facepalming disappointed +🤦‍♂️ man facepalming man male boy disbelief +🤦‍♀️ woman facepalming woman female girl disbelief +🤷 person shrugging regardless +🤷‍♂️ man shrugging man male boy confused indifferent doubt +🤷‍♀️ woman shrugging woman female girl confused indifferent doubt +🧑‍⚕️ health worker hospital +👨‍⚕️ man health worker doctor nurse therapist healthcare man human +👩‍⚕️ woman health worker doctor nurse therapist healthcare woman human +🧑‍🎓 student learn +👨‍🎓 man student graduate man human +👩‍🎓 woman student graduate woman human +🧑‍🏫 teacher professor +👨‍🏫 man teacher instructor professor man human +👩‍🏫 woman teacher instructor professor woman human +🧑‍⚖️ judge law +👨‍⚖️ man judge justice court man human +👩‍⚖️ woman judge justice court woman human +🧑‍🌾 farmer crops +👨‍🌾 man farmer rancher gardener man human +👩‍🌾 woman farmer rancher gardener woman human +🧑‍🍳 cook food kitchen culinary +👨‍🍳 man cook chef man human +👩‍🍳 woman cook chef woman human +🧑‍🔧 mechanic worker technician +👨‍🔧 man mechanic plumber man human wrench +👩‍🔧 woman mechanic plumber woman human wrench +🧑‍🏭 factory worker labor +👨‍🏭 man factory worker assembly industrial man human +👩‍🏭 woman factory worker assembly industrial woman human +🧑‍💼 office worker business +👨‍💼 man office worker business manager man human +👩‍💼 woman office worker business manager woman human +🧑‍🔬 scientist chemistry +👨‍🔬 man scientist biologist chemist engineer physicist man human +👩‍🔬 woman scientist biologist chemist engineer physicist woman human +🧑‍💻 technologist computer +👨‍💻 man technologist coder developer engineer programmer software man human laptop computer +👩‍💻 woman technologist coder developer engineer programmer software woman human laptop computer +🧑‍🎤 singer song artist performer +👨‍🎤 man singer rockstar entertainer man human +👩‍🎤 woman singer rockstar entertainer woman human +🧑‍🎨 artist painting draw creativity +👨‍🎨 man artist painter man human +👩‍🎨 woman artist painter woman human +🧑‍✈️ pilot fly plane airplane +👨‍✈️ man pilot aviator plane man human +👩‍✈️ woman pilot aviator plane woman human +🧑‍🚀 astronaut outerspace +👨‍🚀 man astronaut space rocket man human +👩‍🚀 woman astronaut space rocket woman human +🧑‍🚒 firefighter fire +👨‍🚒 man firefighter fireman man human +👩‍🚒 woman firefighter fireman woman human +👮 police officer cop +👮‍♂️ man police officer man police law legal enforcement arrest 911 +👮‍♀️ woman police officer woman police law legal enforcement arrest 911 female +🕵️ detective human spy detective +🕵️‍♂️ man detective crime +🕵️‍♀️ woman detective human spy detective female woman +💂 guard protect +💂‍♂️ man guard uk gb british male guy royal +💂‍♀️ woman guard uk gb british female royal woman +👷 construction worker labor build +👷‍♂️ man construction worker male human wip guy build construction worker labor +👷‍♀️ woman construction worker female human wip build construction worker labor woman +🤴 prince boy man male crown royal king +👸 princess girl woman female blond crown royal queen +👳 person wearing turban headdress +👳‍♂️ man wearing turban male indian hinduism arabs +👳‍♀️ woman wearing turban female indian hinduism arabs woman +👲 man with skullcap male boy chinese +🧕 woman with headscarf female hijab mantilla tichel +🤵 man in tuxedo couple marriage wedding groom +👰 bride with veil couple marriage wedding woman bride +🤰 pregnant woman baby +🤱 breast feeding nursing baby +👼 baby angel heaven wings halo +🎅 santa claus festival man male xmas father christmas +🤶 mrs claus woman female xmas mother christmas +🦸 superhero marvel +🦸‍♂️ man superhero man male good hero superpowers +🦸‍♀️ woman superhero woman female good heroine superpowers +🦹 supervillain marvel +🦹‍♂️ man supervillain man male evil bad criminal hero superpowers +🦹‍♀️ woman supervillain woman female evil bad criminal heroine superpowers +🧙 mage magic +🧙‍♂️ man mage man male mage sorcerer +🧙‍♀️ woman mage woman female mage witch +🧚 fairy wings magical +🧚‍♂️ man fairy man male +🧚‍♀️ woman fairy woman female +🧛 vampire blood twilight +🧛‍♂️ man vampire man male dracula +🧛‍♀️ woman vampire woman female +🧜 merperson sea +🧜‍♂️ merman man male triton +🧜‍♀️ mermaid woman female merwoman ariel +🧝 elf magical +🧝‍♂️ man elf man male +🧝‍♀️ woman elf woman female +🧞 genie magical wishes +🧞‍♂️ man genie man male +🧞‍♀️ woman genie woman female +🧟 zombie dead +🧟‍♂️ man zombie man male dracula undead walking dead +🧟‍♀️ woman zombie woman female undead walking dead +💆 person getting massage relax +💆‍♂️ man getting massage male boy man head +💆‍♀️ woman getting massage female girl woman head +💇 person getting haircut hairstyle +💇‍♂️ man getting haircut male boy man +💇‍♀️ woman getting haircut female girl woman +🚶 person walking move +🚶‍♂️ man walking human feet steps +🚶‍♀️ woman walking human feet steps woman female +🧍 person standing still +🧍‍♂️ man standing still +🧍‍♀️ woman standing still +🧎 person kneeling pray respectful +🧎‍♂️ man kneeling pray respectful +🧎‍♀️ woman kneeling respectful pray +🧑‍🦯 person with probing cane blind +👨‍🦯 man with probing cane blind +👩‍🦯 woman with probing cane blind +🧑‍🦼 person in motorized wheelchair disability accessibility +👨‍🦼 man in motorized wheelchair disability accessibility +👩‍🦼 woman in motorized wheelchair disability accessibility +🧑‍🦽 person in manual wheelchair disability accessibility +👨‍🦽 man in manual wheelchair disability accessibility +👩‍🦽 woman in manual wheelchair disability accessibility +🏃 person running move +🏃‍♂️ man running man walking exercise race running +🏃‍♀️ woman running woman walking exercise race running female +💃 woman dancing female girl woman fun +🕺 man dancing male boy fun dancer +🕴️ man in suit levitating suit business levitate hover jump +👯 people with bunny ears perform costume +👯‍♂️ men with bunny ears male bunny men boys +👯‍♀️ women with bunny ears female bunny women girls +🧖 person in steamy room relax spa +🧖‍♂️ man in steamy room male man spa steamroom sauna +🧖‍♀️ woman in steamy room female woman spa steamroom sauna +🧗 person climbing sport +🧗‍♂️ man climbing sports hobby man male rock +🧗‍♀️ woman climbing sports hobby woman female rock +🤺 person fencing sports fencing sword +🏇 horse racing animal betting competition gambling luck +⛷️ skier sports winter snow +🏂 snowboarder sports winter +🏌️ person golfing sports business +🏌️‍♂️ man golfing sport +🏌️‍♀️ woman golfing sports business woman female +🏄 person surfing sport sea +🏄‍♂️ man surfing sports ocean sea summer beach +🏄‍♀️ woman surfing sports ocean sea summer beach woman female +🚣 person rowing boat sport move +🚣‍♂️ man rowing boat sports hobby water ship +🚣‍♀️ woman rowing boat sports hobby water ship woman female +🏊 person swimming sport pool +🏊‍♂️ man swimming sports exercise human athlete water summer +🏊‍♀️ woman swimming sports exercise human athlete water summer woman female +⛹️ person bouncing ball sports human +⛹️‍♂️ man bouncing ball sport +⛹️‍♀️ woman bouncing ball sports human woman female +🏋️ person lifting weights sports training exercise +🏋️‍♂️ man lifting weights sport +🏋️‍♀️ woman lifting weights sports training exercise woman female +🚴 person biking sport move +🚴‍♂️ man biking sports bike exercise hipster +🚴‍♀️ woman biking sports bike exercise hipster woman female +🚵 person mountain biking sport move +🚵‍♂️ man mountain biking transportation sports human race bike +🚵‍♀️ woman mountain biking transportation sports human race bike woman female +🤸 person cartwheeling sport gymnastic +🤸‍♂️ man cartwheeling gymnastics +🤸‍♀️ woman cartwheeling gymnastics +🤼 people wrestling sport +🤼‍♂️ men wrestling sports wrestlers +🤼‍♀️ women wrestling sports wrestlers +🤽 person playing water polo sport +🤽‍♂️ man playing water polo sports pool +🤽‍♀️ woman playing water polo sports pool +🤾 person playing handball sport +🤾‍♂️ man playing handball sports +🤾‍♀️ woman playing handball sports +🤹 person juggling performance balance +🤹‍♂️ man juggling juggle balance skill multitask +🤹‍♀️ woman juggling juggle balance skill multitask +🧘 person in lotus position meditate +🧘‍♂️ man in lotus position man male meditation yoga serenity zen mindfulness +🧘‍♀️ woman in lotus position woman female meditation yoga serenity zen mindfulness +🛀 person taking bath clean shower bathroom +🛌 person in bed bed rest +🧑‍🤝‍🧑 people holding hands friendship +👭 women holding hands pair friendship couple love like female people human +👫 woman and man holding hands pair people human love date dating like affection valentines marriage +👬 men holding hands pair couple love like bromance friendship people human +💏 kiss pair valentines love like dating marriage +👩‍❤️‍💋‍👨 kiss woman man love +👨‍❤️‍💋‍👨 kiss man man pair valentines love like dating marriage +👩‍❤️‍💋‍👩 kiss woman woman pair valentines love like dating marriage +💑 couple with heart pair love like affection human dating valentines marriage +👩‍❤️‍👨 couple with heart woman man love +👨‍❤️‍👨 couple with heart man man pair love like affection human dating valentines marriage +👩‍❤️‍👩 couple with heart woman woman pair love like affection human dating valentines marriage +👪 family home parents child mom dad father mother people human +👨‍👩‍👦 family man woman boy love +👨‍👩‍👧 family man woman girl home parents people human child +👨‍👩‍👧‍👦 family man woman girl boy home parents people human children +👨‍👩‍👦‍👦 family man woman boy boy home parents people human children +👨‍👩‍👧‍👧 family man woman girl girl home parents people human children +👨‍👨‍👦 family man man boy home parents people human children +👨‍👨‍👧 family man man girl home parents people human children +👨‍👨‍👧‍👦 family man man girl boy home parents people human children +👨‍👨‍👦‍👦 family man man boy boy home parents people human children +👨‍👨‍👧‍👧 family man man girl girl home parents people human children +👩‍👩‍👦 family woman woman boy home parents people human children +👩‍👩‍👧 family woman woman girl home parents people human children +👩‍👩‍👧‍👦 family woman woman girl boy home parents people human children +👩‍👩‍👦‍👦 family woman woman boy boy home parents people human children +👩‍👩‍👧‍👧 family woman woman girl girl home parents people human children +👨‍👦 family man boy home parent people human child +👨‍👦‍👦 family man boy boy home parent people human children +👨‍👧 family man girl home parent people human child +👨‍👧‍👦 family man girl boy home parent people human children +👨‍👧‍👧 family man girl girl home parent people human children +👩‍👦 family woman boy home parent people human child +👩‍👦‍👦 family woman boy boy home parent people human children +👩‍👧 family woman girl home parent people human child +👩‍👧‍👦 family woman girl boy home parent people human children +👩‍👧‍👧 family woman girl girl home parent people human children +🗣️ speaking head user person human sing say talk +👤 bust in silhouette user person human +👥 busts in silhouette user person human group team +👣 footprints feet tracking walking beach +🐵 monkey face animal nature circus +🐒 monkey animal nature banana circus +🦍 gorilla animal nature circus +🦧 orangutan animal +🐶 dog face animal friend nature woof puppy pet faithful +🐕 dog animal nature friend doge pet faithful +🦮 guide dog animal blind +🐕‍🦺 service dog blind animal +🐩 poodle dog animal 101 nature pet +🐺 wolf animal nature wild +🦊 fox animal nature face +🦝 raccoon animal nature +🐱 cat face animal meow nature pet kitten +🐈 cat animal meow pet cats +🦁 lion animal nature +🐯 tiger face animal cat danger wild nature roar +🐅 tiger animal nature roar +🐆 leopard animal nature +🐴 horse face animal brown nature +🐎 horse animal gamble luck +🦄 unicorn animal nature mystical +🦓 zebra animal nature stripes safari +🦌 deer animal nature horns venison +🐮 cow face beef ox animal nature moo milk +🐂 ox animal cow beef +🐃 water buffalo animal nature ox cow +🐄 cow beef ox animal nature moo milk +🐷 pig face animal oink nature +🐖 pig animal nature +🐗 boar animal nature +🐽 pig nose animal oink +🐏 ram animal sheep nature +🐑 ewe animal nature wool shipit +🐐 goat animal nature +🐪 camel animal hot desert hump +🐫 two hump camel animal nature hot desert hump +🦙 llama animal nature alpaca +🦒 giraffe animal nature spots safari +🐘 elephant animal nature nose th circus +🦏 rhinoceros animal nature horn +🦛 hippopotamus animal nature +🐭 mouse face animal nature cheese wedge rodent +🐁 mouse animal nature rodent +🐀 rat animal mouse rodent +🐹 hamster animal nature +🐰 rabbit face animal nature pet spring magic bunny +🐇 rabbit animal nature pet magic spring +🐿️ chipmunk animal nature rodent squirrel +🦔 hedgehog animal nature spiny +🦇 bat animal nature blind vampire +🐻 bear animal nature wild +🐨 koala animal nature +🐼 panda animal nature panda +🦥 sloth animal +🦦 otter animal +🦨 skunk animal +🦘 kangaroo animal nature australia joey hop marsupial +🦡 badger animal nature honey +🐾 paw prints animal tracking footprints dog cat pet feet +🦃 turkey animal bird +🐔 chicken animal cluck nature bird +🐓 rooster animal nature chicken +🐣 hatching chick animal chicken egg born baby bird +🐤 baby chick animal chicken bird +🐥 front facing baby chick animal chicken baby bird +🐦 bird animal nature fly tweet spring +🐧 penguin animal nature +🕊️ dove animal bird +🦅 eagle animal nature bird +🦆 duck animal nature bird mallard +🦢 swan animal nature bird +🦉 owl animal nature bird hoot +🦩 flamingo animal +🦚 peacock animal nature peahen bird +🦜 parrot animal nature bird pirate talk +🐸 frog animal nature croak toad +🐊 crocodile animal nature reptile lizard alligator +🐢 turtle animal slow nature tortoise +🦎 lizard animal nature reptile +🐍 snake animal evil nature hiss python +🐲 dragon face animal myth nature chinese green +🐉 dragon animal myth nature chinese green +🦕 sauropod animal nature dinosaur brachiosaurus brontosaurus diplodocus extinct +🦖 t rex animal nature dinosaur tyrannosaurus extinct +🐳 spouting whale animal nature sea ocean +🐋 whale animal nature sea ocean +🐬 dolphin animal nature fish sea ocean flipper fins beach +🐟 fish animal food nature +🐠 tropical fish animal swim ocean beach nemo +🐡 blowfish animal nature food sea ocean +🦈 shark animal nature fish sea ocean jaws fins beach +🐙 octopus animal creature ocean sea nature beach +🐚 spiral shell nature sea beach +🐌 snail slow animal shell +🦋 butterfly animal insect nature caterpillar +🐛 bug animal insect nature worm +🐜 ant animal insect nature bug +🐝 honeybee animal insect nature bug spring honey +🐞 lady beetle animal insect nature ladybug +🦗 cricket animal cricket chirp +🕷️ spider animal arachnid +🕸️ spider web animal insect arachnid silk +🦂 scorpion animal arachnid +🦟 mosquito animal nature insect malaria +🦠 microbe amoeba bacteria germs virus +💐 bouquet flowers nature spring +🌸 cherry blossom nature plant spring flower +💮 white flower japanese spring +🏵️ rosette flower decoration military +🌹 rose flowers valentines love spring +🥀 wilted flower plant nature flower +🌺 hibiscus plant vegetable flowers beach +🌻 sunflower nature plant fall +🌼 blossom nature flowers yellow +🌷 tulip flowers plant nature summer spring +🌱 seedling plant nature grass lawn spring +🌲 evergreen tree plant nature +🌳 deciduous tree plant nature +🌴 palm tree plant vegetable nature summer beach mojito tropical +🌵 cactus vegetable plant nature +🌾 sheaf of rice nature plant +🌿 herb vegetable plant medicine weed grass lawn +☘️ shamrock vegetable plant nature irish clover +🍀 four leaf clover vegetable plant nature lucky irish +🍁 maple leaf nature plant vegetable ca fall +🍂 fallen leaf nature plant vegetable leaves +🍃 leaf fluttering in wind nature plant tree vegetable grass lawn spring +🍇 grapes fruit food wine +🍈 melon fruit nature food +🍉 watermelon fruit food picnic summer +🍊 tangerine food fruit nature orange +🍋 lemon fruit nature +🍌 banana fruit food monkey +🍍 pineapple fruit nature food +🥭 mango fruit food tropical +🍎 red apple fruit mac school +🍏 green apple fruit nature +🍐 pear fruit nature food +🍑 peach fruit nature food +🍒 cherries food fruit +🍓 strawberry fruit food nature +🥝 kiwi fruit fruit food +🍅 tomato fruit vegetable nature food +🥥 coconut fruit nature food palm +🥑 avocado fruit food +🍆 eggplant vegetable nature food aubergine +🥔 potato food tuber vegatable starch +🥕 carrot vegetable food orange +🌽 ear of corn food vegetable plant +🌶️ hot pepper food spicy chilli chili +🥒 cucumber fruit food pickle +🥬 leafy green food vegetable plant bok choy cabbage kale lettuce +🥦 broccoli fruit food vegetable +🧄 garlic food spice cook +🧅 onion cook food spice +🍄 mushroom plant vegetable +🥜 peanuts food nut +🌰 chestnut food squirrel +🍞 bread food wheat breakfast toast +🥐 croissant food bread french +🥖 baguette bread food bread french +🥨 pretzel food bread twisted +🥯 bagel food bread bakery schmear +🥞 pancakes food breakfast flapjacks hotcakes +🧇 waffle food breakfast +🧀 cheese wedge food chadder +🍖 meat on bone good food drumstick +🍗 poultry leg food meat drumstick bird chicken turkey +🥩 cut of meat food cow meat cut chop lambchop porkchop +🥓 bacon food breakfast pork pig meat +🍔 hamburger meat fast food beef cheeseburger mcdonalds burger king +🍟 french fries chips snack fast food +🍕 pizza food party +🌭 hot dog food frankfurter +🥪 sandwich food lunch bread +🌮 taco food mexican +🌯 burrito food mexican +🥙 stuffed flatbread food flatbread stuffed gyro +🧆 falafel food +🥚 egg food chicken breakfast +🍳 cooking food breakfast kitchen egg +🥘 shallow pan of food food cooking casserole paella +🍲 pot of food food meat soup +🥣 bowl with spoon food breakfast cereal oatmeal porridge +🥗 green salad food healthy lettuce +🍿 popcorn food movie theater films snack +🧈 butter food cook +🧂 salt condiment shaker +🥫 canned food food soup +🍱 bento box food japanese box +🍘 rice cracker food japanese +🍙 rice ball food japanese +🍚 cooked rice food china asian +🍛 curry rice food spicy hot indian +🍜 steaming bowl food japanese noodle chopsticks +🍝 spaghetti food italian noodle +🍠 roasted sweet potato food nature +🍢 oden food japanese +🍣 sushi food fish japanese rice +🍤 fried shrimp food animal appetizer summer +🍥 fish cake with swirl food japan sea beach narutomaki pink swirl kamaboko surimi ramen +🥮 moon cake food autumn +🍡 dango food dessert sweet japanese barbecue meat +🥟 dumpling food empanada pierogi potsticker +🥠 fortune cookie food prophecy +🥡 takeout box food leftovers +🦀 crab animal crustacean +🦞 lobster animal nature bisque claws seafood +🦐 shrimp animal ocean nature seafood +🦑 squid animal nature ocean sea +🦪 oyster food +🍦 soft ice cream food hot dessert summer +🍧 shaved ice hot dessert summer +🍨 ice cream food hot dessert +🍩 doughnut food dessert snack sweet donut +🍪 cookie food snack oreo chocolate sweet dessert +🎂 birthday cake food dessert cake +🍰 shortcake food dessert +🧁 cupcake food dessert bakery sweet +🥧 pie food dessert pastry +🍫 chocolate bar food snack dessert sweet +🍬 candy snack dessert sweet lolly +🍭 lollipop food snack candy sweet +🍮 custard dessert food +🍯 honey pot bees sweet kitchen +🍼 baby bottle food container milk +🥛 glass of milk beverage drink cow +☕ hot beverage beverage caffeine latte espresso coffee +🍵 teacup without handle drink bowl breakfast green british +🍶 sake wine drink drunk beverage japanese alcohol booze +🍾 bottle with popping cork drink wine bottle celebration +🍷 wine glass drink beverage drunk alcohol booze +🍸 cocktail glass drink drunk alcohol beverage booze mojito +🍹 tropical drink beverage cocktail summer beach alcohol booze mojito +🍺 beer mug relax beverage drink drunk party pub summer alcohol booze +🍻 clinking beer mugs relax beverage drink drunk party pub summer alcohol booze +🥂 clinking glasses beverage drink party alcohol celebrate cheers wine champagne toast +🥃 tumbler glass drink beverage drunk alcohol liquor booze bourbon scotch whisky glass shot +🥤 cup with straw drink soda +🧃 beverage box drink +🧉 mate drink tea beverage +🧊 ice water cold +🥢 chopsticks food +🍽️ fork and knife with plate food eat meal lunch dinner restaurant +🍴 fork and knife cutlery kitchen +🥄 spoon cutlery kitchen tableware +🔪 kitchen knife knife blade cutlery kitchen weapon +🏺 amphora vase jar +🌍 globe showing europe africa globe world international +🌎 globe showing americas globe world USA international +🌏 globe showing asia australia globe world east international +🌐 globe with meridians earth international world internet interweb i18n +🗺️ world map location direction +🗾 map of japan nation country japanese asia +🧭 compass magnetic navigation orienteering +🏔️ snow capped mountain photo nature environment winter cold +⛰️ mountain photo nature environment +🌋 volcano photo nature disaster +🗻 mount fuji photo mountain nature japanese +🏕️ camping photo outdoors tent +🏖️ beach with umbrella weather summer sunny sand mojito +🏜️ desert photo warm saharah +🏝️ desert island photo tropical mojito +🏞️ national park photo environment nature +🏟️ stadium photo place sports concert venue +🏛️ classical building art culture history +🏗️ building construction wip working progress +🧱 brick bricks +🏘️ houses buildings photo +🏚️ derelict house abandon evict broken building +🏠 house building home +🏡 house with garden home plant nature +🏢 office building building bureau work +🏣 japanese post office building envelope communication +🏤 post office building email +🏥 hospital building health surgery doctor +🏦 bank building money sales cash business enterprise +🏨 hotel building accomodation checkin +🏩 love hotel like affection dating +🏪 convenience store building shopping groceries +🏫 school building student education learn teach +🏬 department store building shopping mall +🏭 factory building industry pollution smoke +🏯 japanese castle photo building +🏰 castle building royalty history +💒 wedding love like affection couple marriage bride groom +🗼 tokyo tower photo japanese +🗽 statue of liberty american newyork +⛪ church building religion christ +🕌 mosque islam worship minaret +🛕 hindu temple religion +🕍 synagogue judaism worship temple jewish +⛩️ shinto shrine temple japan kyoto +🕋 kaaba mecca mosque islam +⛲ fountain photo summer water fresh +⛺ tent photo camping outdoors +🌁 foggy photo mountain +🌃 night with stars evening city downtown +🏙️ cityscape photo night life urban +🌄 sunrise over mountains view vacation photo +🌅 sunrise morning view vacation photo +🌆 cityscape at dusk photo evening sky buildings +🌇 sunset photo good morning dawn +🌉 bridge at night photo sanfrancisco +♨️ hot springs bath warm relax +🎠 carousel horse photo carnival +🎡 ferris wheel photo carnival londoneye +🎢 roller coaster carnival playground photo fun +💈 barber pole hair salon style +🎪 circus tent festival carnival party +🚂 locomotive transportation vehicle train +🚃 railway car transportation vehicle +🚄 high speed train transportation vehicle +🚅 bullet train transportation vehicle speed fast public travel +🚆 train transportation vehicle +🚇 metro transportation blue-square mrt underground tube +🚈 light rail transportation vehicle +🚉 station transportation vehicle public +🚊 tram transportation vehicle +🚝 monorail transportation vehicle +🚞 mountain railway transportation vehicle +🚋 tram car transportation vehicle carriage public travel +🚌 bus car vehicle transportation +🚍 oncoming bus vehicle transportation +🚎 trolleybus bart transportation vehicle +🚐 minibus vehicle car transportation +🚑 ambulance health 911 hospital +🚒 fire engine transportation cars vehicle +🚓 police car vehicle cars transportation law legal enforcement +🚔 oncoming police car vehicle law legal enforcement 911 +🚕 taxi uber vehicle cars transportation +🚖 oncoming taxi vehicle cars uber +🚗 automobile red transportation vehicle +🚘 oncoming automobile car vehicle transportation +🚙 sport utility vehicle transportation vehicle +🚚 delivery truck cars transportation +🚛 articulated lorry vehicle cars transportation express +🚜 tractor vehicle car farming agriculture +🏎️ racing car sports race fast formula f1 +🏍️ motorcycle race sports fast +🛵 motor scooter vehicle vespa sasha +🦽 manual wheelchair accessibility +🦼 motorized wheelchair accessibility +🛺 auto rickshaw move transportation +🚲 bicycle sports bicycle exercise hipster +🛴 kick scooter vehicle kick razor +🛹 skateboard board +🚏 bus stop transportation wait +🛣️ motorway road cupertino interstate highway +🛤️ railway track train transportation +🛢️ oil drum barrell +⛽ fuel pump gas station petroleum +🚨 police car light police ambulance 911 emergency alert error pinged law legal +🚥 horizontal traffic light transportation signal +🚦 vertical traffic light transportation driving +🛑 stop sign stop +🚧 construction wip progress caution warning +⚓ anchor ship ferry sea boat +⛵ sailboat ship summer transportation water sailing +🛶 canoe boat paddle water ship +🚤 speedboat ship transportation vehicle summer +🛳️ passenger ship yacht cruise ferry +⛴️ ferry boat ship yacht +🛥️ motor boat ship +🚢 ship transportation titanic deploy +✈️ airplane vehicle transportation flight fly +🛩️ small airplane flight transportation fly vehicle +🛫 airplane departure airport flight landing +🛬 airplane arrival airport flight boarding +🪂 parachute fly glide +💺 seat sit airplane transport bus flight fly +🚁 helicopter transportation vehicle fly +🚟 suspension railway vehicle transportation +🚠 mountain cableway transportation vehicle ski +🚡 aerial tramway transportation vehicle ski +🛰️ satellite communication gps orbit spaceflight NASA ISS +🚀 rocket launch ship staffmode NASA outer space outer space fly +🛸 flying saucer transportation vehicle ufo +🛎️ bellhop bell service +🧳 luggage packing travel +⌛ hourglass done time clock oldschool limit exam quiz test +⏳ hourglass not done oldschool time countdown +⌚ watch time accessories +⏰ alarm clock time wake +⏱️ stopwatch time deadline +⏲️ timer clock alarm +🕰️ mantelpiece clock time +🕛 twelve o clock time noon midnight midday late early schedule +🕧 twelve thirty time late early schedule +🕐 one o clock time late early schedule +🕜 one thirty time late early schedule +🕑 two o clock time late early schedule +🕝 two thirty time late early schedule +🕒 three o clock time late early schedule +🕞 three thirty time late early schedule +🕓 four o clock time late early schedule +🕟 four thirty time late early schedule +🕔 five o clock time late early schedule +🕠 five thirty time late early schedule +🕕 six o clock time late early schedule dawn dusk +🕡 six thirty time late early schedule +🕖 seven o clock time late early schedule +🕢 seven thirty time late early schedule +🕗 eight o clock time late early schedule +🕣 eight thirty time late early schedule +🕘 nine o clock time late early schedule +🕤 nine thirty time late early schedule +🕙 ten o clock time late early schedule +🕥 ten thirty time late early schedule +🕚 eleven o clock time late early schedule +🕦 eleven thirty time late early schedule +🌑 new moon nature twilight planet space night evening sleep +🌒 waxing crescent moon nature twilight planet space night evening sleep +🌓 first quarter moon nature twilight planet space night evening sleep +🌔 waxing gibbous moon nature night sky gray twilight planet space evening sleep +🌕 full moon nature yellow twilight planet space night evening sleep +🌖 waning gibbous moon nature twilight planet space night evening sleep waxing gibbous moon +🌗 last quarter moon nature twilight planet space night evening sleep +🌘 waning crescent moon nature twilight planet space night evening sleep +🌙 crescent moon night sleep sky evening magic +🌚 new moon face nature twilight planet space night evening sleep +🌛 first quarter moon face nature twilight planet space night evening sleep +🌜 last quarter moon face nature twilight planet space night evening sleep +🌡️ thermometer weather temperature hot cold +☀️ sun weather nature brightness summer beach spring +🌝 full moon face nature twilight planet space night evening sleep +🌞 sun with face nature morning sky +🪐 ringed planet outerspace +⭐ star night yellow +🌟 glowing star night sparkle awesome good magic +🌠 shooting star night photo +🌌 milky way photo space stars +☁️ cloud weather sky +⛅ sun behind cloud weather nature cloudy morning fall spring +⛈️ cloud with lightning and rain weather lightning +🌤️ sun behind small cloud weather +🌥️ sun behind large cloud weather +🌦️ sun behind rain cloud weather +🌧️ cloud with rain weather +🌨️ cloud with snow weather +🌩️ cloud with lightning weather thunder +🌪️ tornado weather cyclone twister +🌫️ fog weather +🌬️ wind face gust air +🌀 cyclone weather swirl blue cloud vortex spiral whirlpool spin tornado hurricane typhoon +🌈 rainbow nature happy unicorn face photo sky spring +🌂 closed umbrella weather rain drizzle +☂️ umbrella weather spring +☔ umbrella with rain drops rainy weather spring +⛱️ umbrella on ground weather summer +⚡ high voltage thunder weather lightning bolt fast +❄️ snowflake winter season cold weather christmas xmas +☃️ snowman winter season cold weather christmas xmas frozen +⛄ snowman without snow winter season cold weather christmas xmas frozen without snow +☄️ comet space +🔥 fire hot cook flame +💧 droplet water drip faucet spring +🌊 water wave sea water wave nature tsunami disaster +🎃 jack o lantern halloween light pumpkin creepy fall +🎄 christmas tree festival vacation december xmas celebration +🎆 fireworks photo festival carnival congratulations +🎇 sparkler stars night shine +🧨 firecracker dynamite boom explode explosion explosive +✨ sparkles stars shine shiny cool awesome good magic +🎈 balloon party celebration birthday circus +🎉 party popper party congratulations birthday magic circus celebration tada +🎊 confetti ball festival party birthday circus +🎋 tanabata tree plant nature branch summer +🎍 pine decoration plant nature vegetable panda pine decoration +🎎 japanese dolls japanese toy kimono +🎏 carp streamer fish japanese koinobori carp banner +🎐 wind chime nature ding spring bell +🎑 moon viewing ceremony photo japan asia tsukimi +🧧 red envelope gift +🎀 ribbon decoration pink girl bowtie +🎁 wrapped gift present birthday christmas xmas +🎗️ reminder ribbon sports cause support awareness +🎟️ admission tickets sports concert entrance +🎫 ticket event concert pass +🎖️ military medal award winning army +🏆 trophy win award contest place ftw ceremony +🏅 sports medal award winning +🥇 1st place medal award winning first +🥈 2nd place medal award second +🥉 3rd place medal award third +⚽ soccer ball sports football +⚾ baseball sports balls +🥎 softball sports balls +🏀 basketball sports balls NBA +🏐 volleyball sports balls +🏈 american football sports balls NFL +🏉 rugby football sports team +🎾 tennis sports balls green +🥏 flying disc sports frisbee ultimate +🎳 bowling sports fun play +🏏 cricket game sports +🏑 field hockey sports +🏒 ice hockey sports +🥍 lacrosse sports ball stick +🏓 ping pong sports pingpong +🏸 badminton sports +🥊 boxing glove sports fighting +🥋 martial arts uniform judo karate taekwondo +🥅 goal net sports +⛳ flag in hole sports business flag hole summer +⛸️ ice skate sports +🎣 fishing pole food hobby summer +🤿 diving mask sport ocean +🎽 running shirt play pageant +🎿 skis sports winter cold snow +🛷 sled sleigh luge toboggan +🥌 curling stone sports +🎯 direct hit game play bar target bullseye +🪀 yo yo toy +🪁 kite wind fly +🎱 pool 8 ball pool hobby game luck magic +🔮 crystal ball disco party magic circus fortune teller +🧿 nazar amulet bead charm +🎮 video game play console PS4 controller +🕹️ joystick game play +🎰 slot machine bet gamble vegas fruit machine luck casino +🎲 game die dice random tabletop play luck +🧩 puzzle piece interlocking puzzle piece +🧸 teddy bear plush stuffed +♠️ spade suit poker cards suits magic +♥️ heart suit poker cards magic suits +♦️ diamond suit poker cards magic suits +♣️ club suit poker cards magic suits +♟️ chess pawn expendable +🃏 joker poker cards game play magic +🀄 mahjong red dragon game play chinese kanji +🎴 flower playing cards game sunset red +🎭 performing arts acting theater drama +🖼️ framed picture photography +🎨 artist palette design paint draw colors +🧵 thread needle sewing spool string +🧶 yarn ball crochet knit +👓 glasses fashion accessories eyesight nerdy dork geek +🕶️ sunglasses face cool accessories +🥽 goggles eyes protection safety +🥼 lab coat doctor experiment scientist chemist +🦺 safety vest protection +👔 necktie shirt suitup formal fashion cloth business +👕 t shirt fashion cloth casual shirt tee +👖 jeans fashion shopping +🧣 scarf neck winter clothes +🧤 gloves hands winter clothes +🧥 coat jacket +🧦 socks stockings clothes +👗 dress clothes fashion shopping +👘 kimono dress fashion women female japanese +🥻 sari dress +🩱 one piece swimsuit fashion +🩲 briefs clothing +🩳 shorts clothing +👙 bikini swimming female woman girl fashion beach summer +👚 woman s clothes fashion shopping bags female +👛 purse fashion accessories money sales shopping +👜 handbag fashion accessory accessories shopping +👝 clutch bag bag accessories shopping +🛍️ shopping bags mall buy purchase +🎒 backpack student education bag backpack +👞 man s shoe fashion male +👟 running shoe shoes sports sneakers +🥾 hiking boot backpacking camping hiking +🥿 flat shoe ballet slip-on slipper +👠 high heeled shoe fashion shoes female pumps stiletto +👡 woman s sandal shoes fashion flip flops +🩰 ballet shoes dance +👢 woman s boot shoes fashion +👑 crown king kod leader royalty lord +👒 woman s hat fashion accessories female lady spring +🎩 top hat magic gentleman classy circus +🎓 graduation cap school college degree university graduation cap hat legal learn education +🧢 billed cap cap baseball +⛑️ rescue worker s helmet construction build +📿 prayer beads dhikr religious +💄 lipstick female girl fashion woman +💍 ring wedding propose marriage valentines diamond fashion jewelry gem engagement +💎 gem stone blue ruby diamond jewelry +🔇 muted speaker sound volume silence quiet +🔈 speaker low volume sound volume silence broadcast +🔉 speaker medium volume volume speaker broadcast +🔊 speaker high volume volume noise noisy speaker broadcast +📢 loudspeaker volume sound +📣 megaphone sound speaker volume +📯 postal horn instrument music +🔔 bell sound notification christmas xmas chime +🔕 bell with slash sound volume mute quiet silent +🎼 musical score treble clef compose +🎵 musical note score tone sound +🎶 musical notes music score +🎙️ studio microphone sing recording artist talkshow +🎚️ level slider scale +🎛️ control knobs dial +🎤 microphone sound music PA sing talkshow +🎧 headphone music score gadgets +📻 radio communication music podcast program +🎷 saxophone music instrument jazz blues +🎸 guitar music instrument +🎹 musical keyboard piano instrument compose +🎺 trumpet music brass +🎻 violin music instrument orchestra symphony +🪕 banjo music instructment +🥁 drum music instrument drumsticks snare +📱 mobile phone technology apple gadgets dial +📲 mobile phone with arrow iphone incoming +☎️ telephone technology communication dial telephone +📞 telephone receiver technology communication dial +📟 pager bbcall oldschool 90s +📠 fax machine communication technology +🔋 battery power energy sustain +🔌 electric plug charger power +💻 laptop technology laptop screen display monitor +🖥️ desktop computer technology computing screen +🖨️ printer paper ink +⌨️ keyboard technology computer type input text +🖱️ computer mouse click +🖲️ trackball technology trackpad +💽 computer disk technology record data disk 90s +💾 floppy disk oldschool technology save 90s 80s +💿 optical disk technology dvd disk disc 90s +📀 dvd cd disk disc +🧮 abacus calculation +🎥 movie camera film record +🎞️ film frames movie +📽️ film projector video tape record movie +🎬 clapper board movie film record +📺 television technology program oldschool show television +📷 camera gadgets photography +📸 camera with flash photography gadgets +📹 video camera film record +📼 videocassette record video oldschool 90s 80s +🔍 magnifying glass tilted left search zoom find detective +🔎 magnifying glass tilted right search zoom find detective +🕯️ candle fire wax +💡 light bulb light electricity idea +🔦 flashlight dark camping sight night +🏮 red paper lantern light paper halloween spooky +🪔 diya lamp lighting +📔 notebook with decorative cover classroom notes record paper study +📕 closed book read library knowledge textbook learn +📖 open book book read library knowledge literature learn study +📗 green book read library knowledge study +📘 blue book read library knowledge learn study +📙 orange book read library knowledge textbook study +📚 books literature library study +📓 notebook stationery record notes paper study +📒 ledger notes paper +📃 page with curl documents office paper +📜 scroll documents ancient history paper +📄 page facing up documents office paper information +📰 newspaper press headline +🗞️ rolled up newspaper press headline +📑 bookmark tabs favorite save order tidy +🔖 bookmark favorite label save +🏷️ label sale tag +💰 money bag dollar payment coins sale +💴 yen banknote money sales japanese dollar currency +💵 dollar banknote money sales bill currency +💶 euro banknote money sales dollar currency +💷 pound banknote british sterling money sales bills uk england currency +💸 money with wings dollar bills payment sale +💳 credit card money sales dollar bill payment shopping +🧾 receipt accounting expenses +💹 chart increasing with yen green-square graph presentation stats +💱 currency exchange money sales dollar travel +💲 heavy dollar sign money sales payment currency buck +✉️ envelope letter postal inbox communication +📧 e mail communication inbox +📨 incoming envelope email inbox +📩 envelope with arrow email communication +📤 outbox tray inbox email +📥 inbox tray email documents +📦 package mail gift cardboard box moving +📫 closed mailbox with raised flag email inbox communication +📪 closed mailbox with lowered flag email communication inbox +📬 open mailbox with raised flag email inbox communication +📭 open mailbox with lowered flag email inbox +📮 postbox email letter envelope +🗳️ ballot box with ballot election vote +✏️ pencil stationery write paper writing school study +✒️ black nib pen stationery writing write +🖋️ fountain pen stationery writing write +🖊️ pen stationery writing write +🖌️ paintbrush drawing creativity art +🖍️ crayon drawing creativity +📝 memo write documents stationery pencil paper writing legal exam quiz test study compose +💼 briefcase business documents work law legal job career +📁 file directory documents business office +📂 open file directory documents load +🗂️ card index dividers organizing business stationery +📅 calendar calendar schedule +📆 tear off calendar schedule date planning +🗒️ spiral notepad memo stationery +🗓️ spiral calendar date schedule planning +📇 card index business stationery +📈 chart increasing graph presentation stats recovery business economics money sales good success +📉 chart decreasing graph presentation stats recession business economics money sales bad failure +📊 bar chart graph presentation stats +📋 clipboard stationery documents +📌 pushpin stationery mark here +📍 round pushpin stationery location map here +📎 paperclip documents stationery +🖇️ linked paperclips documents stationery +📏 straight ruler stationery calculate length math school drawing architect sketch +📐 triangular ruler stationery math architect sketch +✂️ scissors stationery cut +🗃️ card file box business stationery +🗄️ file cabinet filing organizing +🗑️ wastebasket bin trash rubbish garbage toss +🔒 locked security password padlock +🔓 unlocked privacy security +🔏 locked with pen security secret +🔐 locked with key security privacy +🔑 key lock door password +🗝️ old key lock door password +🔨 hammer tools build create +🪓 axe tool chop cut +⛏️ pick tools dig +⚒️ hammer and pick tools build create +🛠️ hammer and wrench tools build create +🗡️ dagger weapon +⚔️ crossed swords weapon +🔫 pistol violence weapon pistol revolver +🏹 bow and arrow sports +🛡️ shield protection security +🔧 wrench tools diy ikea fix maintainer +🔩 nut and bolt handy tools fix +⚙️ gear cog +🗜️ clamp tool +⚖️ balance scale law fairness weight +🦯 probing cane accessibility +🔗 link rings url +⛓️ chains lock arrest +🧰 toolbox tools diy fix maintainer mechanic +🧲 magnet attraction magnetic +⚗️ alembic distilling science experiment chemistry +🧪 test tube chemistry experiment lab science +🧫 petri dish bacteria biology culture lab +🧬 dna biologist genetics life +🔬 microscope laboratory experiment zoomin science study +🔭 telescope stars space zoom science astronomy +📡 satellite antenna communication future radio space +💉 syringe health hospital drugs blood medicine needle doctor nurse +🩸 drop of blood period hurt harm wound +💊 pill health medicine doctor pharmacy drug +🩹 adhesive bandage heal +🩺 stethoscope health +🚪 door house entry exit +🛏️ bed sleep rest +🛋️ couch and lamp read chill +🪑 chair sit furniture +🚽 toilet restroom wc washroom bathroom potty +🚿 shower clean water bathroom +🛁 bathtub clean shower bathroom +🪒 razor cut +🧴 lotion bottle moisturizer sunscreen +🧷 safety pin diaper +🧹 broom cleaning sweeping witch +🧺 basket laundry +🧻 roll of paper roll +🧼 soap bar bathing cleaning lather +🧽 sponge absorbing cleaning porous +🧯 fire extinguisher quench +🛒 shopping cart trolley +🚬 cigarette kills tobacco cigarette joint smoke +⚰️ coffin vampire dead die death rip graveyard cemetery casket funeral box +⚱️ funeral urn dead die death rip ashes +🗿 moai rock easter island moai +🏧 atm sign money sales cash blue-square payment bank +🚮 litter in bin sign blue-square sign human info +🚰 potable water blue-square liquid restroom cleaning faucet +♿ wheelchair symbol blue-square disabled accessibility +🚹 men s room toilet restroom wc blue-square gender male +🚺 women s room purple-square woman female toilet loo restroom gender +🚻 restroom blue-square toilet refresh wc gender +🚼 baby symbol orange-square child +🚾 water closet toilet restroom blue-square +🛂 passport control custom blue-square +🛃 customs passport border blue-square +🛄 baggage claim blue-square airport transport +🛅 left luggage blue-square travel +⚠️ warning exclamation wip alert error problem issue +🚸 children crossing school warning danger sign driving yellow-diamond +⛔ no entry limit security privacy bad denied stop circle +🚫 prohibited forbid stop limit denied disallow circle +🚳 no bicycles cyclist prohibited circle +🚭 no smoking cigarette blue-square smell smoke +🚯 no littering trash bin garbage circle +🚱 non potable water drink faucet tap circle +🚷 no pedestrians rules crossing walking circle +📵 no mobile phones iphone mute circle +🔞 no one under eighteen 18 drink pub night minor circle +☢️ radioactive nuclear danger +☣️ biohazard danger +⬆️ up arrow blue-square continue top direction +↗️ up right arrow blue-square point direction diagonal northeast +➡️ right arrow blue-square next +↘️ down right arrow blue-square direction diagonal southeast +⬇️ down arrow blue-square direction bottom +↙️ down left arrow blue-square direction diagonal southwest +⬅️ left arrow blue-square previous back +↖️ up left arrow blue-square point direction diagonal northwest +↕️ up down arrow blue-square direction way vertical +↔️ left right arrow shape direction horizontal sideways +↩️ right arrow curving left back return blue-square undo enter +↪️ left arrow curving right blue-square return rotate direction +⤴️ right arrow curving up blue-square direction top +⤵️ right arrow curving down blue-square direction bottom +🔃 clockwise vertical arrows sync cycle round repeat +🔄 counterclockwise arrows button blue-square sync cycle +🔙 back arrow arrow words return +🔚 end arrow words arrow +🔛 on arrow arrow words +🔜 soon arrow arrow words +🔝 top arrow words blue-square +🛐 place of worship religion church temple prayer +⚛️ atom symbol science physics chemistry +🕉️ om hinduism buddhism sikhism jainism +✡️ star of david judaism +☸️ wheel of dharma hinduism buddhism sikhism jainism +☯️ yin yang balance +✝️ latin cross christianity +☦️ orthodox cross suppedaneum religion +☪️ star and crescent islam +☮️ peace symbol hippie +🕎 menorah hanukkah candles jewish +🔯 dotted six pointed star purple-square religion jewish hexagram +♈ aries sign purple-square zodiac astrology +♉ taurus purple-square sign zodiac astrology +♊ gemini sign zodiac purple-square astrology +♋ cancer sign zodiac purple-square astrology +♌ leo sign purple-square zodiac astrology +♍ virgo sign zodiac purple-square astrology +♎ libra sign purple-square zodiac astrology +♏ scorpio sign zodiac purple-square astrology scorpio +♐ sagittarius sign zodiac purple-square astrology +♑ capricorn sign zodiac purple-square astrology +♒ aquarius sign purple-square zodiac astrology +♓ pisces purple-square sign zodiac astrology +⛎ ophiuchus sign purple-square constellation astrology +🔀 shuffle tracks button blue-square shuffle music random +🔁 repeat button loop record +🔂 repeat single button blue-square loop +▶️ play button blue-square right direction play +⏩ fast forward button blue-square play speed continue +⏭️ next track button forward next blue-square +⏯️ play or pause button blue-square play pause +◀️ reverse button blue-square left direction +⏪ fast reverse button play blue-square +⏮️ last track button backward +🔼 upwards button blue-square triangle direction point forward top +⏫ fast up button blue-square direction top +🔽 downwards button blue-square direction bottom +⏬ fast down button blue-square direction bottom +⏸️ pause button pause blue-square +⏹️ stop button blue-square +⏺️ record button blue-square +⏏️ eject button blue-square +🎦 cinema blue-square record film movie curtain stage theater +🔅 dim button sun afternoon warm summer +🔆 bright button sun light +📶 antenna bars blue-square reception phone internet connection wifi bluetooth bars +📳 vibration mode orange-square phone +📴 mobile phone off mute orange-square silence quiet +♀️ female sign woman women lady girl +♂️ male sign man boy men +⚕️ medical symbol health hospital +♾️ infinity forever +♻️ recycling symbol arrow environment garbage trash +⚜️ fleur de lis decorative scout +🔱 trident emblem weapon spear +📛 name badge fire forbid +🔰 japanese symbol for beginner badge shield +⭕ hollow red circle circle round +✅ check mark button green-square ok agree vote election answer tick +☑️ check box with check ok agree confirm black-square vote election yes tick +✔️ check mark ok nike answer yes tick +✖️ multiplication sign math calculation +❌ cross mark no delete remove cancel red +❎ cross mark button x green-square no deny +➕ plus sign math calculation addition more increase +➖ minus sign math calculation subtract less +➗ division sign divide math calculation +➰ curly loop scribble draw shape squiggle +➿ double curly loop tape cassette +〽️ part alternation mark graph presentation stats business economics bad +✳️ eight spoked asterisk star sparkle green-square +✴️ eight pointed star orange-square shape polygon +❇️ sparkle stars green-square awesome good fireworks +‼️ double exclamation mark exclamation surprise +⁉️ exclamation question mark wat punctuation surprise +❓ question mark doubt confused +❔ white question mark doubts gray huh confused +❕ white exclamation mark surprise punctuation gray wow warning +❗ exclamation mark heavy exclamation mark danger surprise punctuation wow warning +〰️ wavy dash draw line moustache mustache squiggle scribble +©️ copyright ip license circle law legal +®️ registered alphabet circle +™️ trade mark trademark brand law legal +ycap symbol blue-square twitter +*️⃣ keycap star keycap +0️⃣ keycap 0 0 numbers blue-square null +1️⃣ keycap 1 blue-square numbers 1 +2️⃣ keycap 2 numbers 2 prime blue-square +3️⃣ keycap 3 3 numbers prime blue-square +4️⃣ keycap 4 4 numbers blue-square +5️⃣ keycap 5 5 numbers blue-square prime +6️⃣ keycap 6 6 numbers blue-square +7️⃣ keycap 7 7 numbers blue-square prime +8️⃣ keycap 8 8 blue-square numbers +9️⃣ keycap 9 blue-square numbers 9 +🔟 keycap 10 numbers 10 blue-square +🔠 input latin uppercase alphabet words blue-square +🔡 input latin lowercase blue-square alphabet +🔢 input numbers numbers blue-square +🔣 input symbols blue-square music note ampersand percent glyphs characters +🔤 input latin letters blue-square alphabet +🅰️ a button red-square alphabet letter +🆎 ab button red-square alphabet +🅱️ b button red-square alphabet letter +🆑 cl button alphabet words red-square +🆒 cool button words blue-square +🆓 free button blue-square words +ℹ️ information blue-square alphabet letter +🆔 id button purple-square words +Ⓜ️ circled m alphabet blue-circle letter +🆕 new button blue-square words start +🆖 ng button blue-square words shape icon +🅾️ o button alphabet red-square letter +🆗 ok button good agree yes blue-square +🅿️ p button cars blue-square alphabet letter +🆘 sos button help red-square words emergency 911 +🆙 up button blue-square above high +🆚 vs button words orange-square +🈁 japanese here button blue-square here katakana japanese destination +🈂️ japanese service charge button japanese blue-square katakana +🈷️ japanese monthly amount button chinese month moon japanese orange-square kanji +🈶 japanese not free of charge button orange-square chinese have kanji +🈯 japanese reserved button chinese point green-square kanji +🉐 japanese bargain button chinese kanji obtain get circle +🈹 japanese discount button cut divide chinese kanji pink-square +🈚 japanese free of charge button nothing chinese kanji japanese orange-square +🈲 japanese prohibited button kanji japanese chinese forbidden limit restricted red-square +🉑 japanese acceptable button ok good chinese kanji agree yes orange-circle +🈸 japanese application button chinese japanese kanji orange-square +🈴 japanese passing grade button japanese chinese join kanji red-square +🈳 japanese vacancy button kanji japanese chinese empty sky blue-square +㊗️ japanese congratulations button chinese kanji japanese red-circle +㊙️ japanese secret button privacy chinese sshh kanji red-circle +🈺 japanese open for business button japanese opening hours orange-square +🈵 japanese no vacancy button full chinese japanese red-square kanji +🔴 red circle shape error danger +🟠 orange circle round +🟡 yellow circle round +🟢 green circle round +🔵 blue circle shape icon button +🟣 purple circle round +🟤 brown circle round +⚫ black circle shape button round +⚪ white circle shape round +🟥 red square +🟧 orange square +🟨 yellow square +🟩 green square +🟦 blue square +🟪 purple square +🟫 brown square +⬛ black large square shape icon button +⬜ white large square shape icon stone button +◼️ black medium square shape button icon +◻️ white medium square shape stone icon +◾ black medium small square icon shape button +◽ white medium small square shape stone icon button +▪️ black small square shape icon +▫️ white small square shape icon +🔶 large orange diamond shape jewel gem +🔷 large blue diamond shape jewel gem +🔸 small orange diamond shape jewel gem +🔹 small blue diamond shape jewel gem +🔺 red triangle pointed up shape direction up top +🔻 red triangle pointed down shape direction bottom +💠 diamond with a dot jewel blue gem crystal fancy +🔘 radio button input old music circle +🔳 white square button shape input +🔲 black square button shape input frame +🏁 chequered flag contest finishline race gokart +🚩 triangular flag mark milestone place +🎌 crossed flags japanese nation country border +🏴 black flag pirate +🏳️ white flag losing loser lost surrender give up fail +🏳️‍🌈 rainbow flag flag rainbow pride gay lgbt glbt queer homosexual lesbian bisexual transgender +🏴‍☠️ pirate flag skull crossbones flag banner +🇦🇨 flag ascension island +🇦🇩 flag andorra ad flag nation country banner andorra +🇦🇪 flag united arab emirates united arab emirates flag nation country banner united arab emirates +🇦🇫 flag afghanistan af flag nation country banner afghanistan +🇦🇬 flag antigua barbuda antigua barbuda flag nation country banner antigua barbuda +🇦🇮 flag anguilla ai flag nation country banner anguilla +🇦🇱 flag albania al flag nation country banner albania +🇦🇲 flag armenia am flag nation country banner armenia +🇦🇴 flag angola ao flag nation country banner angola +🇦🇶 flag antarctica aq flag nation country banner antarctica +🇦🇷 flag argentina ar flag nation country banner argentina +🇦🇸 flag american samoa american ws flag nation country banner american samoa +🇦🇹 flag austria at flag nation country banner austria +🇦🇺 flag australia au flag nation country banner australia +🇦🇼 flag aruba aw flag nation country banner aruba +🇦🇽 flag aland islands Åland islands flag nation country banner aland islands +🇦🇿 flag azerbaijan az flag nation country banner azerbaijan +🇧🇦 flag bosnia herzegovina bosnia herzegovina flag nation country banner bosnia herzegovina +🇧🇧 flag barbados bb flag nation country banner barbados +🇧🇩 flag bangladesh bd flag nation country banner bangladesh +🇧🇪 flag belgium be flag nation country banner belgium +🇧🇫 flag burkina faso burkina faso flag nation country banner burkina faso +🇧🇬 flag bulgaria bg flag nation country banner bulgaria +🇧🇭 flag bahrain bh flag nation country banner bahrain +🇧🇮 flag burundi bi flag nation country banner burundi +🇧🇯 flag benin bj flag nation country banner benin +🇧🇱 flag st barthelemy saint barthélemy flag nation country banner st barthelemy +🇧🇲 flag bermuda bm flag nation country banner bermuda +🇧🇳 flag brunei bn darussalam flag nation country banner brunei +🇧🇴 flag bolivia bo flag nation country banner bolivia +🇧🇶 flag caribbean netherlands bonaire flag nation country banner caribbean netherlands +🇧🇷 flag brazil br flag nation country banner brazil +🇧🇸 flag bahamas bs flag nation country banner bahamas +🇧🇹 flag bhutan bt flag nation country banner bhutan +🇧🇻 flag bouvet island norway +🇧🇼 flag botswana bw flag nation country banner botswana +🇧🇾 flag belarus by flag nation country banner belarus +🇧🇿 flag belize bz flag nation country banner belize +🇨🇦 flag canada ca flag nation country banner canada +🇨🇨 flag cocos islands cocos keeling islands flag nation country banner cocos islands +🇨🇩 flag congo kinshasa congo democratic republic flag nation country banner congo kinshasa +🇨🇫 flag central african republic central african republic flag nation country banner central african republic +🇨🇬 flag congo brazzaville congo flag nation country banner congo brazzaville +🇨🇭 flag switzerland ch flag nation country banner switzerland +🇨🇮 flag cote d ivoire ivory coast flag nation country banner cote d ivoire +🇨🇰 flag cook islands cook islands flag nation country banner cook islands +🇨🇱 flag chile flag nation country banner chile +🇨🇲 flag cameroon cm flag nation country banner cameroon +🇨🇳 flag china china chinese prc flag country nation banner china +🇨🇴 flag colombia co flag nation country banner colombia +🇨🇵 flag clipperton island +🇨🇷 flag costa rica costa rica flag nation country banner costa rica +🇨🇺 flag cuba cu flag nation country banner cuba +🇨🇻 flag cape verde cabo verde flag nation country banner cape verde +🇨🇼 flag curacao curaçao flag nation country banner curacao +🇨🇽 flag christmas island christmas island flag nation country banner christmas island +🇨🇾 flag cyprus cy flag nation country banner cyprus +🇨🇿 flag czechia cz flag nation country banner czechia +🇩🇪 flag germany german nation flag country banner germany +🇩🇬 flag diego garcia +🇩🇯 flag djibouti dj flag nation country banner djibouti +🇩🇰 flag denmark dk flag nation country banner denmark +🇩🇲 flag dominica dm flag nation country banner dominica +🇩🇴 flag dominican republic dominican republic flag nation country banner dominican republic +🇩🇿 flag algeria dz flag nation country banner algeria +🇪🇦 flag ceuta melilla +🇪🇨 flag ecuador ec flag nation country banner ecuador +🇪🇪 flag estonia ee flag nation country banner estonia +🇪🇬 flag egypt eg flag nation country banner egypt +🇪🇭 flag western sahara western sahara flag nation country banner western sahara +🇪🇷 flag eritrea er flag nation country banner eritrea +🇪🇸 flag spain spain flag nation country banner spain +🇪🇹 flag ethiopia et flag nation country banner ethiopia +🇪🇺 flag european union european union flag banner +🇫🇮 flag finland fi flag nation country banner finland +🇫🇯 flag fiji fj flag nation country banner fiji +🇫🇰 flag falkland islands falkland islands malvinas flag nation country banner falkland islands +🇫🇲 flag micronesia micronesia federated states flag nation country banner micronesia +🇫🇴 flag faroe islands faroe islands flag nation country banner faroe islands +🇫🇷 flag france banner flag nation france french country france +🇬🇦 flag gabon ga flag nation country banner gabon +🇬🇧 flag united kingdom united kingdom great britain northern ireland flag nation country banner british UK english england union jack united kingdom +🇬🇩 flag grenada gd flag nation country banner grenada +🇬🇪 flag georgia ge flag nation country banner georgia +🇬🇫 flag french guiana french guiana flag nation country banner french guiana +🇬🇬 flag guernsey gg flag nation country banner guernsey +🇬🇭 flag ghana gh flag nation country banner ghana +🇬🇮 flag gibraltar gi flag nation country banner gibraltar +🇬🇱 flag greenland gl flag nation country banner greenland +🇬🇲 flag gambia gm flag nation country banner gambia +🇬🇳 flag guinea gn flag nation country banner guinea +🇬🇵 flag guadeloupe gp flag nation country banner guadeloupe +🇬🇶 flag equatorial guinea equatorial gn flag nation country banner equatorial guinea +🇬🇷 flag greece gr flag nation country banner greece +🇬🇸 flag south georgia south sandwich islands south georgia sandwich islands flag nation country banner south georgia south sandwich islands +🇬🇹 flag guatemala gt flag nation country banner guatemala +🇬🇺 flag guam gu flag nation country banner guam +🇬🇼 flag guinea bissau gw bissau flag nation country banner guinea bissau +🇬🇾 flag guyana gy flag nation country banner guyana +🇭🇰 flag hong kong sar china hong kong flag nation country banner hong kong sar china +🇭🇲 flag heard mcdonald islands +🇭🇳 flag honduras hn flag nation country banner honduras +🇭🇷 flag croatia hr flag nation country banner croatia +🇭🇹 flag haiti ht flag nation country banner haiti +🇭🇺 flag hungary hu flag nation country banner hungary +🇮🇨 flag canary islands canary islands flag nation country banner canary islands +🇮🇩 flag indonesia flag nation country banner indonesia +🇮🇪 flag ireland ie flag nation country banner ireland +🇮🇱 flag israel il flag nation country banner israel +🇮🇲 flag isle of man isle man flag nation country banner isle of man +🇮🇳 flag india in flag nation country banner india +🇮🇴 flag british indian ocean territory british indian ocean territory flag nation country banner british indian ocean territory +🇮🇶 flag iraq iq flag nation country banner iraq +🇮🇷 flag iran iran islamic republic flag nation country banner iran +🇮🇸 flag iceland is flag nation country banner iceland +🇮🇹 flag italy italy flag nation country banner italy +🇯🇪 flag jersey je flag nation country banner jersey +🇯🇲 flag jamaica jm flag nation country banner jamaica +🇯🇴 flag jordan jo flag nation country banner jordan +🇯🇵 flag japan japanese nation flag country banner japan +🇰🇪 flag kenya ke flag nation country banner kenya +🇰🇬 flag kyrgyzstan kg flag nation country banner kyrgyzstan +🇰🇭 flag cambodia kh flag nation country banner cambodia +🇰🇮 flag kiribati ki flag nation country banner kiribati +🇰🇲 flag comoros km flag nation country banner comoros +🇰🇳 flag st kitts nevis saint kitts nevis flag nation country banner st kitts nevis +🇰🇵 flag north korea north korea nation flag country banner north korea +🇰🇷 flag south korea south korea nation flag country banner south korea +🇰🇼 flag kuwait kw flag nation country banner kuwait +🇰🇾 flag cayman islands cayman islands flag nation country banner cayman islands +🇰🇿 flag kazakhstan kz flag nation country banner kazakhstan +🇱🇦 flag laos lao democratic republic flag nation country banner laos +🇱🇧 flag lebanon lb flag nation country banner lebanon +🇱🇨 flag st lucia saint lucia flag nation country banner st lucia +🇱🇮 flag liechtenstein li flag nation country banner liechtenstein +🇱🇰 flag sri lanka sri lanka flag nation country banner sri lanka +🇱🇷 flag liberia lr flag nation country banner liberia +🇱🇸 flag lesotho ls flag nation country banner lesotho +🇱🇹 flag lithuania lt flag nation country banner lithuania +🇱🇺 flag luxembourg lu flag nation country banner luxembourg +🇱🇻 flag latvia lv flag nation country banner latvia +🇱🇾 flag libya ly flag nation country banner libya +🇲🇦 flag morocco ma flag nation country banner morocco +🇲🇨 flag monaco mc flag nation country banner monaco +🇲🇩 flag moldova moldova republic flag nation country banner moldova +🇲🇪 flag montenegro me flag nation country banner montenegro +🇲🇫 flag st martin +🇲🇬 flag madagascar mg flag nation country banner madagascar +🇲🇭 flag marshall islands marshall islands flag nation country banner marshall islands +🇲🇰 flag north macedonia macedonia flag nation country banner north macedonia +🇲🇱 flag mali ml flag nation country banner mali +🇲🇲 flag myanmar mm flag nation country banner myanmar +🇲🇳 flag mongolia mn flag nation country banner mongolia +🇲🇴 flag macao sar china macao flag nation country banner macao sar china +🇲🇵 flag northern mariana islands northern mariana islands flag nation country banner northern mariana islands +🇲🇶 flag martinique mq flag nation country banner martinique +🇲🇷 flag mauritania mr flag nation country banner mauritania +🇲🇸 flag montserrat ms flag nation country banner montserrat +🇲🇹 flag malta mt flag nation country banner malta +🇲🇺 flag mauritius mu flag nation country banner mauritius +🇲🇻 flag maldives mv flag nation country banner maldives +🇲🇼 flag malawi mw flag nation country banner malawi +🇲🇽 flag mexico mx flag nation country banner mexico +🇲🇾 flag malaysia my flag nation country banner malaysia +🇲🇿 flag mozambique mz flag nation country banner mozambique +🇳🇦 flag namibia na flag nation country banner namibia +🇳🇨 flag new caledonia new caledonia flag nation country banner new caledonia +🇳🇪 flag niger ne flag nation country banner niger +🇳🇫 flag norfolk island norfolk island flag nation country banner norfolk island +🇳🇬 flag nigeria flag nation country banner nigeria +🇳🇮 flag nicaragua ni flag nation country banner nicaragua +🇳🇱 flag netherlands nl flag nation country banner netherlands +🇳🇴 flag norway no flag nation country banner norway +🇳🇵 flag nepal np flag nation country banner nepal +🇳🇷 flag nauru nr flag nation country banner nauru +🇳🇺 flag niue nu flag nation country banner niue +🇳🇿 flag new zealand new zealand flag nation country banner new zealand +🇴🇲 flag oman om symbol flag nation country banner oman +🇵🇦 flag panama pa flag nation country banner panama +🇵🇪 flag peru pe flag nation country banner peru +🇵🇫 flag french polynesia french polynesia flag nation country banner french polynesia +🇵🇬 flag papua new guinea papua new guinea flag nation country banner papua new guinea +🇵🇭 flag philippines ph flag nation country banner philippines +🇵🇰 flag pakistan pk flag nation country banner pakistan +🇵🇱 flag poland pl flag nation country banner poland +🇵🇲 flag st pierre miquelon saint pierre miquelon flag nation country banner st pierre miquelon +🇵🇳 flag pitcairn islands pitcairn flag nation country banner pitcairn islands +🇵🇷 flag puerto rico puerto rico flag nation country banner puerto rico +🇵🇸 flag palestinian territories palestine palestinian territories flag nation country banner palestinian territories +🇵🇹 flag portugal pt flag nation country banner portugal +🇵🇼 flag palau pw flag nation country banner palau +🇵🇾 flag paraguay py flag nation country banner paraguay +🇶🇦 flag qatar qa flag nation country banner qatar +🇷🇪 flag reunion réunion flag nation country banner reunion +🇷🇴 flag romania ro flag nation country banner romania +🇷🇸 flag serbia rs flag nation country banner serbia +🇷🇺 flag russia russian federation flag nation country banner russia +🇷🇼 flag rwanda rw flag nation country banner rwanda +🇸🇦 flag saudi arabia flag nation country banner saudi arabia +🇸🇧 flag solomon islands solomon islands flag nation country banner solomon islands +🇸🇨 flag seychelles sc flag nation country banner seychelles +🇸🇩 flag sudan sd flag nation country banner sudan +🇸🇪 flag sweden se flag nation country banner sweden +🇸🇬 flag singapore sg flag nation country banner singapore +🇸🇭 flag st helena saint helena ascension tristan cunha flag nation country banner st helena +🇸🇮 flag slovenia si flag nation country banner slovenia +🇸🇯 flag svalbard jan mayen +🇸🇰 flag slovakia sk flag nation country banner slovakia +🇸🇱 flag sierra leone sierra leone flag nation country banner sierra leone +🇸🇲 flag san marino san marino flag nation country banner san marino +🇸🇳 flag senegal sn flag nation country banner senegal +🇸🇴 flag somalia so flag nation country banner somalia +🇸🇷 flag suriname sr flag nation country banner suriname +🇸🇸 flag south sudan south sd flag nation country banner south sudan +🇸🇹 flag sao tome principe sao tome principe flag nation country banner sao tome principe +🇸🇻 flag el salvador el salvador flag nation country banner el salvador +🇸🇽 flag sint maarten sint maarten dutch flag nation country banner sint maarten +🇸🇾 flag syria syrian arab republic flag nation country banner syria +🇸🇿 flag eswatini sz flag nation country banner eswatini +🇹🇦 flag tristan da cunha +🇹🇨 flag turks caicos islands turks caicos islands flag nation country banner turks caicos islands +🇹🇩 flag chad td flag nation country banner chad +🇹🇫 flag french southern territories french southern territories flag nation country banner french southern territories +🇹🇬 flag togo tg flag nation country banner togo +🇹🇭 flag thailand th flag nation country banner thailand +🇹🇯 flag tajikistan tj flag nation country banner tajikistan +🇹🇰 flag tokelau tk flag nation country banner tokelau +🇹🇱 flag timor leste timor leste flag nation country banner timor leste +🇹🇲 flag turkmenistan flag nation country banner turkmenistan +🇹🇳 flag tunisia tn flag nation country banner tunisia +🇹🇴 flag tonga to flag nation country banner tonga +🇹🇷 flag turkey turkey flag nation country banner turkey +🇹🇹 flag trinidad tobago trinidad tobago flag nation country banner trinidad tobago +🇹🇻 flag tuvalu flag nation country banner tuvalu +🇹🇼 flag taiwan tw flag nation country banner taiwan +🇹🇿 flag tanzania tanzania united republic flag nation country banner tanzania +🇺🇦 flag ukraine ua flag nation country banner ukraine +🇺🇬 flag uganda ug flag nation country banner uganda +🇺🇲 flag u s outlying islands +🇺🇳 flag united nations un flag banner +🇺🇸 flag united states united states america flag nation country banner united states +🇺🇾 flag uruguay uy flag nation country banner uruguay +🇺🇿 flag uzbekistan uz flag nation country banner uzbekistan +🇻🇦 flag vatican city vatican city flag nation country banner vatican city +🇻🇨 flag st vincent grenadines saint vincent grenadines flag nation country banner st vincent grenadines +🇻🇪 flag venezuela ve bolivarian republic flag nation country banner venezuela +🇻🇬 flag british virgin islands british virgin islands bvi flag nation country banner british virgin islands +🇻🇮 flag u s virgin islands virgin islands us flag nation country banner u s virgin islands +🇻🇳 flag vietnam viet nam flag nation country banner vietnam +🇻🇺 flag vanuatu vu flag nation country banner vanuatu +🇼🇫 flag wallis futuna wallis futuna flag nation country banner wallis futuna +🇼🇸 flag samoa ws flag nation country banner samoa +🇽🇰 flag kosovo xk flag nation country banner kosovo +🇾🇪 flag yemen ye flag nation country banner yemen +🇾🇹 flag mayotte yt flag nation country banner mayotte +🇿🇦 flag south africa south africa flag nation country banner south africa +🇿🇲 flag zambia zm flag nation country banner zambia +🇿🇼 flag zimbabwe zw flag nation country banner zimbabwe +🏴󠁧󠁢󠁥󠁮󠁧󠁿 flag england flag english +🏴󠁧󠁢󠁳󠁣󠁴󠁿 flag scotland flag scottish +🏴󠁧󠁢󠁷󠁬󠁳󠁿 flag wales flag welsh +🥲 smiling face with tear sad cry pretend +🥸 disguised face pretent brows glasses moustache +🤌 pinched fingers size tiny small +🫀 anatomical heart health heartbeat +🫁 lungs breathe +🥷 ninja ninjutsu skills japanese +🤵‍♂️ man in tuxedo formal fashion +🤵‍♀️ woman in tuxedo formal fashion +👰‍♂️ man with veil wedding marriage +👰‍♀️ woman with veil wedding marriage +👩‍🍼 woman feeding baby birth food +👨‍🍼 man feeding baby birth food +🧑‍🍼 person feeding baby birth food +🧑‍🎄 mx claus christmas +🫂 people hugging care +🐈‍⬛ black cat superstition luck +🦬 bison ox +🦣 mammoth elephant tusks +🦫 beaver animal rodent +🐻‍❄️ polar bear animal arctic +🦤 dodo animal bird +🪶 feather bird fly +🦭 seal animal creature sea +🪲 beetle insect +🪳 cockroach insect pests +🪰 fly insect +🪱 worm animal +🪴 potted plant greenery house +🫐 blueberries fruit +🫒 olive fruit +🫑 bell pepper fruit plant +🫓 flatbread flour food +🫔 tamale food masa +🫕 fondue cheese pot food +🫖 teapot drink hot +🧋 bubble tea taiwan boba milk tea straw +🪨 rock stone +🪵 wood nature timber trunk +🛖 hut house structure +🛻 pickup truck car transportation +🛼 roller skate footwear sports +🪄 magic wand supernature power +🪅 pinata mexico candy celebration +🪆 nesting dolls matryoshka toy +🪡 sewing needle stitches +🪢 knot rope scout +🩴 thong sandal footwear summer +🪖 military helmet army protection +🪗 accordion music +🪘 long drum music +🪙 coin money currency +🪃 boomerang weapon +🪚 carpentry saw cut chop +🪛 screwdriver tools +🪝 hook tools +🪜 ladder tools +🛗 elevator lift +🪞 mirror reflection +🪟 window scenery +🪠 plunger toilet +🪤 mouse trap cheese +🪣 bucket water container +🪥 toothbrush hygiene dental +🪦 headstone death rip grave +🪧 placard announcement +⚧️ transgender symbol lgbtq +🏳️‍⚧️ transgender flag lgbtq +😶‍🌫️ face in clouds shower steam dream +😮‍💨 face exhaling relieve relief tired sigh +😵‍💫 face with spiral eyes sick ill confused nauseous nausea +❤️‍🔥 heart on fire passionate enthusiastic +❤️‍🩹 mending heart broken heart bandage wounded +🧔‍♂️ man beard facial hair +🧔‍♀️ woman beard facial hair +🫠 melting face hot heat +🫢 face with open eyes and hand over mouth silence secret shock surprise +🫣 face with peeking eye scared frightening embarrassing +🫡 saluting face respect salute +🫥 dotted line face invisible lonely isolation depression +🫤 face with diagonal mouth skeptic confuse frustrated indifferent +🥹 face holding back tears touched gratitude +🫱 rightwards hand palm offer +🫲 leftwards hand palm offer +🫳 palm down hand palm drop +🫴 palm up hand lift offer demand +🫰 hand with index finger and thumb crossed heart love money expensive +🫵 index pointing at the viewer you recruit +🫶 heart hands love appreciation support +🫦 biting lip flirt sexy pain worry +🫅 person with crown royalty power +🫃 pregnant man baby belly +🫄 pregnant person baby belly +🧌 troll mystical monster +🪸 coral ocean sea reef +🪷 lotus flower calm meditation +🪹 empty nest bird +🪺 nest with eggs bird +🫘 beans food +🫗 pouring liquid cup water +🫙 jar container sauce +🛝 playground slide fun park +🛞 wheel car transport +🛟 ring buoy life saver life preserver +🪬 hamsa religion protection +🪩 mirror ball disco dance party +🪫 low battery drained dead +🩼 crutch accessibility assist +🩻 x-ray skeleton medicine +🫧 bubbles soap fun carbonation sparkling +🪪 identification card document +🟰 heavy equals sign math \ No newline at end of file diff --git a/scripts/RofiSearch.sh b/scripts/RofiSearch.sh new file mode 100755 index 0000000..4218bed --- /dev/null +++ b/scripts/RofiSearch.sh @@ -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 \ No newline at end of file diff --git a/scripts/RofiThemeSelector-modified.sh b/scripts/RofiThemeSelector-modified.sh new file mode 100755 index 0000000..2cfc2d2 --- /dev/null +++ b/scripts/RofiThemeSelector-modified.sh @@ -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 + +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 Enter. +Alt-a to accept the new theme. +Escape to cancel +Current theme: ${CUR} +When setting a new theme this will override previous theme settings. +Please update your config file if you have local modifications.""" + 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}" diff --git a/scripts/RofiThemeSelector.sh b/scripts/RofiThemeSelector.sh new file mode 100755 index 0000000..8b2fcb7 --- /dev/null +++ b/scripts/RofiThemeSelector.sh @@ -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 diff --git a/scripts/ScreenShot.sh b/scripts/ScreenShot.sh new file mode 100755 index 0000000..0a37c7e --- /dev/null +++ b/scripts/ScreenShot.sh @@ -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 diff --git a/scripts/Sounds.sh b/scripts/Sounds.sh new file mode 100755 index 0000000..8b2cc76 --- /dev/null +++ b/scripts/Sounds.sh @@ -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" \ No newline at end of file diff --git a/scripts/SwitchKeyboardLayout.sh b/scripts/SwitchKeyboardLayout.sh new file mode 100755 index 0000000..f505fa6 --- /dev/null +++ b/scripts/SwitchKeyboardLayout.sh @@ -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" diff --git a/scripts/Tak0-Autodispatch.sh b/scripts/Tak0-Autodispatch.sh new file mode 100755 index 0000000..a1f7212 --- /dev/null +++ b/scripts/Tak0-Autodispatch.sh @@ -0,0 +1,90 @@ +#!/bin/bash +# USAGE / ІНСТРУКЦІЯ: +# 1) Run from terminal: +# ./dispatch.sh +# Example: +# ./dispatch.sh discord 2 +# +# 2) Call from Hyprland config (in hyprland.conf file): +# exec-once = /path/to/dispatch.sh +# +# 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 +# Наприклад: +# ./dispatch.sh discord 2 +# +# 2) Виклик з конфігурації Hyprland (у файлі hyprland.conf): +# exec-once = /path/to/dispatch.sh +# +# Логи зберігаються у файлі 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 " >> "$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 diff --git a/scripts/Tak0-Per-Window-Switch.sh b/scripts/Tak0-Per-Window-Switch.sh new file mode 100755 index 0000000..76b6ad2 --- /dev/null +++ b/scripts/Tak0-Per-Window-Switch.sh @@ -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 diff --git a/scripts/TouchPad.sh b/scripts/TouchPad.sh new file mode 100755 index 0000000..8509d79 --- /dev/null +++ b/scripts/TouchPad.sh @@ -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 diff --git a/scripts/UptimeNixOS.sh b/scripts/UptimeNixOS.sh new file mode 100755 index 0000000..654ae2c --- /dev/null +++ b/scripts/UptimeNixOS.sh @@ -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" diff --git a/scripts/Volume.sh b/scripts/Volume.sh new file mode 100755 index 0000000..8efdb55 --- /dev/null +++ b/scripts/Volume.sh @@ -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 \ No newline at end of file diff --git a/scripts/WallustSwww.sh b/scripts/WallustSwww.sh new file mode 100755 index 0000000..5e0148e --- /dev/null +++ b/scripts/WallustSwww.sh @@ -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 diff --git a/scripts/WaybarCava.sh b/scripts/WaybarCava.sh new file mode 100755 index 0000000..6809e60 --- /dev/null +++ b/scripts/WaybarCava.sh @@ -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" </dev/null; then + pkill rofi + #exit 0 +fi + +main diff --git a/scripts/WaybarScripts.sh b/scripts/WaybarScripts.sh new file mode 100755 index 0000000..7b3aaba --- /dev/null +++ b/scripts/WaybarScripts.sh @@ -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 \ No newline at end of file diff --git a/scripts/WaybarStyles.sh b/scripts/WaybarStyles.sh new file mode 100755 index 0000000..7906faa --- /dev/null +++ b/scripts/WaybarStyles.sh @@ -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 diff --git a/scripts/Wlogout.sh b/scripts/Wlogout.sh new file mode 100755 index 0000000..f552b83 --- /dev/null +++ b/scripts/Wlogout.sh @@ -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 diff --git a/scripts/sddm_wallpaper.sh b/scripts/sddm_wallpaper.sh new file mode 100644 index 0000000..9487188 --- /dev/null +++ b/scripts/sddm_wallpaper.sh @@ -0,0 +1,95 @@ +#!/bin/bash +# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ +# SDDM Wallpaper and Wallust Colors Setter + +# for the upcoming changes on the simple_sddm_theme + +# variables +terminal=kitty +wallDIR="$HOME/Pictures/wallpapers" +SCRIPTSDIR="$HOME/.config/hypr/scripts" +wallpaper_current="$HOME/.config/hypr/wallpaper_effects/.wallpaper_current" +wallpaper_modified="$HOME/.config/hypr/wallpaper_effects/.wallpaper_modified" +# Resolve SDDM themes directory (standard paths and NixOS path) +sddm_themes_dir="/usr/share/sddm/themes" +if [ ! -d "$sddm_themes_dir" ] && [ -d "/run/current-system/sw/share/sddm/themes" ]; then + sddm_themes_dir="/run/current-system/sw/share/sddm/themes" +fi +sddm_simple="$sddm_themes_dir/simple_sddm_2" + +# rofi-wallust-sddm colors path +rofi_wallust="$HOME/.config/rofi/wallust/colors-rofi.rasi" +sddm_theme_conf="$sddm_simple/theme.conf" + +# Directory for swaync +iDIR="$HOME/.config/swaync/images" +iDIRi="$HOME/.config/swaync/icons" + +# Parse arguments +mode="effects" # default +if [[ "$1" == "--normal" ]]; then + mode="normal" +elif [[ "$1" == "--effects" ]]; then + mode="effects" +fi + +# Extract colors from rofi wallust config + +color0=$(grep -oP 'color1:\s*\K#[A-Fa-f0-9]+' "$rofi_wallust") +color1=$(grep -oP 'color0:\s*\K#[A-Fa-f0-9]+' "$rofi_wallust") +color7=$(grep -oP 'color14:\s*\K#[A-Fa-f0-9]+' "$rofi_wallust") +color10=$(grep -oP 'color10:\s*\K#[A-Fa-f0-9]+' "$rofi_wallust") +color12=$(grep -oP 'color12:\s*\K#[A-Fa-f0-9]+' "$rofi_wallust") +color13=$(grep -oP 'color13:\s*\K#[A-Fa-f0-9]+' "$rofi_wallust") +foreground=$(grep -oP 'foreground:\s*\K#[A-Fa-f0-9]+' "$rofi_wallust") +#background-color=$(grep -oP 'background:\s*\K#[A-Fa-f0-9]+' "$rofi_wallust") + +# wallpaper to use +if [[ "$mode" == "normal" ]]; then + wallpaper_path="$wallpaper_current" +else + wallpaper_path="$wallpaper_modified" +fi + +# Abort on NixOS where this repo doesn't manage SDDM and themes are typically read-only +if hostnamectl 2>/dev/null | grep -q 'Operating System: NixOS'; then + notify-send -i "$iDIR/error.png" "SDDM" "NixOS detected: skipping SDDM background change." + exit 0 +fi + +# Launch terminal and apply changes +$terminal -e bash -c " +echo 'Enter your password to update SDDM wallpapers and colors'; + +# Update the colors in the SDDM config +sudo sed -i \"s/HeaderTextColor=\\\"#.*\\\"/HeaderTextColor=\\\"$color13\\\"/\" \"$sddm_theme_conf\" +sudo sed -i \"s/DateTextColor=\\\"#.*\\\"/DateTextColor=\\\"$color13\\\"/\" \"$sddm_theme_conf\" +sudo sed -i \"s/TimeTextColor=\\\"#.*\\\"/TimeTextColor=\\\"$color13\\\"/\" \"$sddm_theme_conf\" +sudo sed -i \"s/DropdownSelectedBackgroundColor=\\\"#.*\\\"/DropdownSelectedBackgroundColor=\\\"$color13\\\"/\" \"$sddm_theme_conf\" +sudo sed -i \"s/SystemButtonsIconsColor=\\\"#.*\\\"/SystemButtonsIconsColor=\\\"$color13\\\"/\" \"$sddm_theme_conf\" +sudo sed -i \"s/SessionButtonTextColor=\\\"#.*\\\"/SessionButtonTextColor=\\\"$color13\\\"/\" \"$sddm_theme_conf\" +sudo sed -i \"s/VirtualKeyboardButtonTextColor=\\\"#.*\\\"/VirtualKeyboardButtonTextColor=\\\"$color13\\\"/\" \"$sddm_theme_conf\" +sudo sed -i \"s/HighlightBackgroundColor=\\\"#.*\\\"/HighlightBackgroundColor=\\\"$color12\\\"/\" \"$sddm_theme_conf\" +sudo sed -i \"s/LoginFieldTextColor=\\\"#.*\\\"/LoginFieldTextColor=\\\"$color12\\\"/\" \"$sddm_theme_conf\" +sudo sed -i \"s/PasswordFieldTextColor=\\\"#.*\\\"/PasswordFieldTextColor=\\\"$color12\\\"/\" \"$sddm_theme_conf\" + +sudo sed -i \"s/DropdownBackgroundColor=\\\"#.*\\\"/DropdownBackgroundColor=\\\"$color1\\\"/\" \"$sddm_theme_conf\" +sudo sed -i \"s/HighlightTextColor=\\\"#.*\\\"/HighlightTextColor=\\\"$color10\\\"/\" \"$sddm_theme_conf\" + +sudo sed -i \"s/PlaceholderTextColor=\\\"#.*\\\"/PlaceholderTextColor=\\\"$color7\\\"/\" \"$sddm_theme_conf\" +sudo sed -i \"s/UserIconColor=\\\"#.*\\\"/UserIconColor=\\\"$color7\\\"/\" \"$sddm_theme_conf\" +sudo sed -i \"s/PasswordIconColor=\\\"#.*\\\"/PasswordIconColor=\\\"$color7\\\"/\" \"$sddm_theme_conf\" + +# Copy wallpaper to SDDM theme +# Primary: set Backgrounds/default (no extension) for simple_sddm_2 +sudo cp -f \"$wallpaper_path\" \"$sddm_simple/Backgrounds/default\" || true +# Fallbacks: if theme ships default.jpg or default.png, update those too +if [ -e \"$sddm_simple/Backgrounds/default.jpg\" ]; then + sudo cp -f \"$wallpaper_path\" \"$sddm_simple/Backgrounds/default.jpg\" +fi +if [ -e \"$sddm_simple/Backgrounds/default.png\" ]; then + sudo cp -f \"$wallpaper_path\" \"$sddm_simple/Backgrounds/default.png\" +fi + +notify-send -i \"$iDIR/ja.png\" \"SDDM\" \"Background SET\" +" \ No newline at end of file diff --git a/v2.3.17 b/v2.3.17 new file mode 100644 index 0000000..31b3414 --- /dev/null +++ b/v2.3.17 @@ -0,0 +1,5 @@ +### https://github.com/JaKooLit ### +## https://github.com/JaKooLit/Hyprland-Dots +## This is to have a reference of which version would be + +## note that this will always be higher than the released versions \ No newline at end of file diff --git a/wallpaper_effects/.wallpaper_current b/wallpaper_effects/.wallpaper_current new file mode 100644 index 0000000..4dfddb0 Binary files /dev/null and b/wallpaper_effects/.wallpaper_current differ diff --git a/wallpaper_effects/.wallpaper_modified b/wallpaper_effects/.wallpaper_modified new file mode 100644 index 0000000..795cdef Binary files /dev/null and b/wallpaper_effects/.wallpaper_modified differ diff --git a/wallust/wallust-hyprland.conf b/wallust/wallust-hyprland.conf new file mode 100644 index 0000000..c7c1deb --- /dev/null +++ b/wallust/wallust-hyprland.conf @@ -0,0 +1,21 @@ +# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ +# /* wallust template - colors-hyprland */ + +$background = rgb(010102) +$foreground = rgb(FDF8FE) +$color0 = rgb(313131) +$color1 = rgb(09050C) +$color2 = rgb(221647) +$color3 = rgb(2C1A40) +$color4 = rgb(5E3887) +$color5 = rgb(7344A6) +$color6 = rgb(BAB0BD) +$color7 = rgb(F3ECF5) +$color8 = rgb(AAA5AC) +$color9 = rgb(0B0711) +$color10 = rgb(2D1D5F) +$color11 = rgb(3B2355) +$color12 = rgb(7D4AB4) +$color13 = rgb(9A5BDD) +$color14 = rgb(F8EAFC) +$color15 = rgb(F3ECF5) diff --git a/workspaces.conf b/workspaces.conf new file mode 100644 index 0000000..708dee0 --- /dev/null +++ b/workspaces.conf @@ -0,0 +1,33 @@ +# /* ---- 💫 https://github.com/JaKooLit 💫 ---- */ # + +# *********************************************************** # +# +# NOTE: This will be overwritten by NWG-Displays +# once you use and click apply. +# +# *********************************************************** # + +# 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 \ No newline at end of file