Compare commits

...

25 Commits

Author SHA1 Message Date
649e324ac7 fixes multi-monitor setup, adds f8-f10 multi monitor keybinds 2025-09-20 17:36:51 +02:00
b58b194797 first cmatrix lock fix, still needs debugging 2025-08-21 01:57:48 +02:00
ae154bcaa7 adds F7 screen rotation bind+script 2025-08-21 01:23:58 +02:00
e3b628dab1 remove alacritty from wallust 2025-08-15 14:09:59 +02:00
09f3684972 let's use kitty instead 2025-08-15 14:08:40 +02:00
ebe112090f toggle waybar 2025-08-13 19:57:02 +02:00
682e0f962e fixes opacity 2025-07-24 00:39:19 +02:00
4108cce1a4 add vscode opacity 2025-07-23 23:46:24 +02:00
6a0f661332 adds hypridle 2025-07-03 19:02:01 +02:00
b7fc65e62d adds matrix effect and style to swaylock 2025-07-03 14:42:01 +02:00
f45424899d fixes gaps and windowrules 2025-06-30 10:59:25 +02:00
7c7b3ff006 adds windowrule for zotero libreoffice citation picker 2025-06-21 18:34:26 +02:00
eca5a12a8b adds stuff to readme 2025-06-20 19:43:38 +02:00
e603a7cb77 adds wallust tofi template 2025-06-20 19:22:48 +02:00
eec1d53ad6 modifies tofi config 2025-06-20 16:18:32 +02:00
22536afc79 adds hyprpicker bind 2025-06-20 16:18:12 +02:00
d5dfbe16ee adds screen recording script and shortcut 2025-06-20 13:12:12 +02:00
07f6759d0d adds multi device support for volume keybinds 2025-06-18 14:02:41 +02:00
fbf475fa82 adds tofi clipboard management with cliphist 2025-06-12 15:47:42 +02:00
2222453712 fixes clipboard not working in some apps 2025-06-10 11:26:18 +02:00
0a3010e072 renames readme 2025-05-20 15:59:07 +02:00
a05a2c5ca3 adds stuff 2025-05-20 15:57:27 +02:00
7cb84800e4 adds readme and vscode wallust support 2025-05-20 15:43:10 +02:00
22c8288c93 adds wallust colors to hyprland config 2025-05-20 15:17:01 +02:00
27d14261fb adds waybar reload on config change 2025-05-20 14:50:05 +02:00
28 changed files with 1237 additions and 101 deletions

231
.config/README.md Normal file
View File

@@ -0,0 +1,231 @@
# Hyprland Configuration Requirements
This README contains all the necessary applications and dependencies required to run the Hyprland configuration found in this repository. My dotfiles are based on the CachyOS Hyprland configuration but extended with additional features and color schemes using wallust and other stuff.
## Packages used
### Window Management
- **Hyprland**: Tiling window manager
- **Waybar**: Status bar with system information
- **Mako**: Notification daemon
### Application Launching
- **Tofi**: Application launcher (Super + Space)
- **Alacritty**: Terminal emulator (Super + Return)
- **Dolphin**: File manager (Super + E)
### Screenshots and Recording
- **Hyprshot**: Window, output, and region screenshots
- **Grim + Slurp**: Screen capture selection
- **Swappy**: Screenshot annotation
- **wl-screenrec**: Screen recording with compression options
### System Controls
- **Swaylock**: Screen locker with customizable options
- **Brightnessctl**: Screen brightness control
- **Playerctl**: Media playback control
- **Volume controls**: Via PulseAudio/WirePlumber
### Utilities
- **Cliphist**: Clipboard history (Super + C)
- **Hyprpicker**: Color picker (Super + P)
- **Waypaper**: Wallpaper management
- **Wallust**: Color scheme generation
- **cmatrix** & **swaylock**: Matrix style screen lock
- **hypridle**: Idle management daemon
## Core Dependencies5
Install all packages:
```bash
yay -S hyprland hyprpaper hyprshot hyprpicker waybar mako swaylock swayidle grim slurp swappy alacritty tofi dolphin blueman-applet fcitx5 nm-applet polkit-kde-agent wob wl-screenrec ffmpeg wireplumber pulseaudio playerctl brightnessctl btop xsensors wl-paste xclip cliphist wl-copy waypaper wallust gnome-calculator ttf-hack cmatrix swaylock
```
## Required Packages
### Hyprland and Core Wayland Components
```bash
yay -S hyprland hyprpaper hyprshot hyprpicker
```
### Window Manager and Desktop Environment
```bash
yay -S waybar mako swaylock swayidle grim slurp swappy
```
### Terminal and Application Launcher
```bash
yay -S alacritty tofi
```
### File Manager and System Tools
```bash
yay -S dolphin blueman-applet fcitx5 nm-applet
```
### Authentication and System Integration
```bash
yay -S polkit-kde-agent wob
```
### Screenshot and Screen Recording
```bash
yay -S hyprshot grim slurp swappy wl-screenrec ffmpeg
```
### Audio and Media Control
```bash
yay -S wireplumber pulseaudio pactl playerctl
```
### System Monitoring and Hardware Control
```bash
yay -S brightnessctl btop xsensors
```
### Clipboard and Utility Tools
```bash
yay -S wl-paste xclip cliphist wl-copy
```
### Wallpaper Management
```bash
yay -S waypaper wallust
```
### Calculator and Additional Apps
```bash
yay -S gnome-calculator
```
### Fonts (if using Hack font for swaylock)
```bash
yay -S ttf-hack
```
## Optional Dependencies
### Alternative Launcher
Some keybinds use `wofi`, `rofi` or `fuzzel` as an alternative to `tofi`, e.g. the `Super + S` for wl-screenrec recording. You can install any of these launchers based on your preference but wallust is configured to use `tofi` by default.
```bash
yay -S rofi wofi fuzzel
```
### Video Compression (for screen recording)
The screencasting script uses `ffmpeg` for video compression. Ensure you have it installed:
```bash
yay -S ffmpeg
```
## Complete Installation Command
You can install all required packages with this single command:
```bash
yay -S hyprland hyprpaper hyprshot hyprpicker waybar mako swaylock swayidle grim slurp swappy alacritty tofi dolphin blueman-applet fcitx5 nm-applet polkit-kde-agent wob wl-screenrec ffmpeg wireplumber pulseaudio playerctl brightnessctl btop xsensors wl-paste xclip cliphist wl-copy waypaper wallust gnome-calculator ttf-hack
```
## Configuration Structure
The Hyprland configuration is organized as follows:
- `hyprland.conf` - Main configuration file that sources other configs
- `config/autostart.conf` - Applications that start automatically
- `config/keybinds.conf` - Keyboard shortcuts and bindings
- `config/defaults.conf` - Default applications (terminal, file manager, etc.)
- `config/environment.conf` - Environment variables
- `scripts/` - Helper scripts for various functions
## Post-Installation Setup
1. **Audio Setup**: Ensure PulseAudio or PipeWire is properly configured
2. **Input Method**: Configure fcitx5 if needed for international input
3. **Bluetooth**: Use blueman-applet for Bluetooth device management
4. **Network**: nm-applet provides network management in the system tray
5. **Wallpapers**: Use waypaper to set and manage wallpapers
## Troubleshooting
- If waybar doesn't start, check that all waybar modules dependencies are installed
- For audio issues, verify PulseAudio/PipeWire service status
- Screen lock issues may require proper PAM configuration
- Missing fonts can cause display issues in applications
## Keyboard Shortcuts
| Keybind | Action | Description |
| -------------------------------- | ------------------ | ----------------------------------------- |
| **Application Launching** | | |
| `Super + Return` | Terminal | Opens Alacritty terminal |
| `Super + E` | File Manager | Opens Dolphin file manager |
| `Super + Space` | App Launcher | Opens Tofi application launcher |
| `Super + Shift + P` | Calculator | Opens gnome-calculator |
| **Window Management** | | |
| `Super + Q` | Close Window | Closes current window (not kill) |
| `Super + V` | Toggle Float | Switches between floating and tiling mode |
| `Super + F` | Fullscreen | Toggles fullscreen mode |
| `Super + Y` | Pin Window | Pin window (shows on all workspaces) |
| `Super + J` | Toggle Split | Toggles window split mode |
| `Super + K` | Toggle Group | Toggles window group mode |
| `Super + Tab` | Group Next | Switches to next window in group |
| **Window Movement** | | |
| `Super + Shift + ←/→/↑/↓` | Move Window | Move active window in direction |
| `Super + ←/→/↑/↓` | Move Focus | Move focus in direction |
| `Super + Mouse Left` | Move Window | Drag window with mouse |
| `Super + Mouse Right` | Resize Window | Resize window with mouse |
| **Window Resizing** | | |
| `Super + Ctrl + Shift + ←/→/↑/↓` | Quick Resize | Quick resize in direction |
| `Super + Ctrl + Shift + H/J/K/L` | Quick Resize | Quick resize (vim keys) |
| `Super + R` | Resize Mode | Activate resize mode |
| **In Resize Mode:** | | |
| `←/→/↑/↓` or `H/J/K/L` | Resize | Resize window in direction |
| `Escape` | Exit Resize | Exit resize mode |
| **Workspace Management** | | |
| `Super + 1-9,0` | Switch Workspace | Switch to workspace 1-10 |
| `Super + Ctrl + 1-9,0` | Move & Switch | Move window and switch to workspace |
| `Super + Shift + 1-9,0` | Move Silent | Move window to workspace (stay current) |
| `Super + Ctrl + ←/→` | Move & Switch | Move window and switch workspace |
| `Super + Alt + ←/→` | Switch Workspace | Switch to previous/next workspace |
| `Super + , / .` | Scroll Workspaces | Scroll through workspaces |
| `Super + /` | Previous Workspace | Switch to previous workspace |
| `Super + Scroll` | Scroll Workspaces | Scroll workspaces with mouse |
| **Special Workspaces** | | |
| `Super + -` | Move to Special | Move window to special workspace |
| `Super + =` | Toggle Special | Toggle special workspace |
| `Super + F1` | Scratchpad | Toggle scratchpad workspace |
| `Super + Alt + Shift + F1` | Move to Scratchpad | Move window to scratchpad |
| **Screenshots & Recording** | | |
| `Super + A` | Capture Selection | Screen capture selection with grim/slurp |
| `Print` | Screenshot Monitor | Screenshot current monitor |
| `Super + Print` | Screenshot Window | Screenshot current window |
| `Shift + Print` | Screenshot Region | Screenshot selected region |
| `Super + S` | Record/Screenshot | Advanced recording/screenshot script |
| **System Controls** | | |
| `Super + L` | Lock Screen | Lock screen with swaylock-fancy |
| `Super + Shift + M` | Exit Hyprland | Terminate user session |
| `Super + O` | Reload Waybar | Restart Waybar |
| `Super + G` | Remove Gaps | Remove gaps between windows |
| `Super + Shift + G` | Default Gaps | Set CachyOS default gaps |
| **Media Controls** | | |
| `XF86AudioPlay` | Play/Pause | Toggle media playback |
| `XF86AudioNext` | Next Track | Next media track |
| `XF86AudioPrev` | Previous Track | Previous media track |
| `XF86AudioRaiseVolume` | Volume Up | Increase volume |
| `XF86AudioLowerVolume` | Volume Down | Decrease volume |
| `XF86AudioMute` | Mute Toggle | Toggle audio mute |
| `XF86MonBrightnessUp` | Brightness Up | Increase screen brightness (+5%) |
| `XF86MonBrightnessDown` | Brightness Down | Decrease screen brightness (-5%) |
| **Utilities** | | |
| `Super + P` | Color Picker | Launch hyprpicker |
| `Super + C` | Clipboard History | Open clipboard history with tofi |
## Customization
- Edit `config/defaults.conf` to change default applications
- Modify `config/keybinds.conf` to customize keyboard shortcuts
- Adjust `config/autostart.conf` to change startup applications
- Update waybar configuration in `~/.config/waybar/` for status bar customization

View File

@@ -6,7 +6,7 @@ source = ~/.config/hypr/config/defaults.conf
# Autostart wiki https://wiki.hyprland.org/0.45.0/Configuring/Keywords/#executing #
exec-once = waybar &
exec-once = /home/michaelb/.config/hypr/scripts/launch-waybar.sh &
exec-once = blueman-applet &
exec-once = fcitx5 -d &
exec-once = mako &
@@ -23,3 +23,8 @@ exec-once = dbus-update-activation-environment --systemd &
# ## Idle configuration
exec-once = $idlehandler
# Clipboard fix
# https://github.com/hyprwm/Hyprland/issues/2319#issuecomment-2409983376
exec-once = wl-paste -t text -w xclip -selection clipboard &
exec-once = wl-paste --watch cliphist store &

View File

@@ -1,13 +1,19 @@
# ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
# ┃ Colors Configuration ┃
# ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
$cachylgreen = rgba(8fbcbbff) # Teal
$cachymgreen = rgba(88c0d0ff) # Icy Blue
$cachydgreen = rgba(81a1c1ff) # Frost
$cachylblue = rgba(5e81acff) # Desaturated Blue
$cachymblue = rgba(4c566aff) # Slate
$cachydblue = rgba(3b4252ff) # Dark Background
$cachywhite = rgba(d8dee9ff) # Snow
$cachygrey = rgba(e5e9f0ff) # Light Gray
$cachygray = rgba(434c5eff) # Dark Gray
$wallpaper = /usr/share/wallpapers/downloaded/pexels-zetong-li-880728-18780512.jpg
$background = rgb(0D0F10)
$foreground = rgb(FCF1D3)
$color0 = rgb(38393A)
$color1 = rgb(7F4E47)
$color2 = rgb(7D7F54)
$color3 = rgb(8B7C7D)
$color4 = rgb(61868C)
$color5 = rgb(D2D1E6)
$color6 = rgb(F5D782)
$color7 = rgb(F2E3B8)
$color8 = rgb(A99F81)
$color9 = rgb(7F4E47)
$color10 = rgb(7D7F54)
$color11 = rgb(8B7C7D)
$color12 = rgb(61868C)
$color13 = rgb(D2D1E6)
$color14 = rgb(F5D782)
$color15 = rgb(F2E3B8)

View File

@@ -8,8 +8,10 @@ source = ~/.config/hypr/config/colors.conf
decoration {
active_opacity = 1
inactive_opacity = 0.6
rounding = 3
inactive_opacity = 0.7
rounding = 10
dim_inactive = true
dim_strength = 0.1
# https://wiki.hyprland.org/0.45.0/Configuring/Variables/#blur
blur {

View File

@@ -5,6 +5,6 @@
$filemanager = dolphin
$applauncher = tofi-drun --drun-launch=true
#$applauncher = rofi -show combi -modi window,run,combi -combi-modi window,run
$terminal = alacritty
$terminal = kitty
$idlehandler = swayidle -w timeout 300 'swaylock -f -c 000000' before-sleep 'swaylock -f -c 000000'
$capturing = grim -g "$(slurp)" - | swappy -f -

View File

@@ -21,16 +21,11 @@ bindd = $mainMod, J, Toggles curren window split mode, togglesplit, # dwindle
bindd = $mainMod, K, Toggles current window group mode (ungroup all related), togglegroup,
bindd = $mainMod, Tab, Switches to the next window in the group, changegroupactive, f
# ======= Toggle Gaps =======
bindd = $mainMod SHIFT, G, Set CachyOS default gaps, exec, hyprctl --batch "keyword general:gaps_out 5;keyword general:gaps_in 3"
bindd = $mainMod, G, Remove gaps between window, exec, hyprctl --batch "keyword general:gaps_out 0;keyword general:gaps_in 0"
# ======= Volume Control =======
bindel = , XF86AudioRaiseVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ +5% && pactl get-sink-volume @DEFAULT_SINK@ | grep -oP '\d+(?=%)' | awk '{if($1>100) system("pactl set-sink-volume @DEFAULT_SINK@ 100%")}' # Raise Volume
bindel = , XF86AudioLowerVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ -5% # Lower Volume
bindel = , XF86AudioMute, exec, amixer sset Master toggle | sed -En '/\[on\]/ s/.*\[([0-9]+)%\].*/\1/ p; /\[off\]/ s/.*/0/p' | head -1 > /tmp/$HYPRLAND_INSTANCE_SIGNATURE.wob #Mutes player audio
bindel = , XF86AudioRaiseVolume, exec, ~/.config/hypr/scripts/volume-helper.sh up
bindel = , XF86AudioLowerVolume, exec, ~/.config/hypr/scripts/volume-helper.sh down
bindel = , XF86AudioMute, exec, ~/.config/hypr/scripts/volume-helper.sh toggle
# ======= Playback Control =======
@@ -43,7 +38,7 @@ bindd = , XF86AudioPrev, Previous track, exec, playerctl previous
bindel = , XF86MonBrightnessUp, exec, brightnessctl s +5% #Increases brightness 5%
bindel = , XF86MonBrightnessDown, exec, brightnessctl s 5%- #Decreases brightness 5%
bindd = $mainMod SHIFT, P, Runs the calculator application, exec, gnome-calculator
bindd = $mainMod, L, Lock the screen, exec, swaylock-fancy -e -K -p 10 -f Hack-Regular
bindd = $mainMod, L, Lock the screen, exec, ~/.config/swaylock/lockscript.sh
bindd = $mainMod, O, Reload/restarts Waybar, exec, killall -SIGUSR2 waybar
# ======= Window Actions =======
@@ -141,7 +136,7 @@ bindd = $mainMod, slash, Switch to the previous workspace, workspace, previous
bindd = $mainMod, minus, Move active window to Special workspace, movetoworkspace,special
bindd = $mainMod, equal, Toggles the Special workspace, togglespecialworkspace, special
bindd = $mainMod, F1, Call special workspace scratchpad, togglespecialworkspace, scratchpad
bindd = $mainMod ALT SHIFT, F1, Move active window to special workspace scratchpad, movetoworkspacesilent, special:scratchpad
bindd = $mainMod ALT SHIFT, F1, Move active window to s~/.config/hypr/scripts/pecial workspace scratchpad, movetoworkspacesilent, special:scratchpad
# ======= Screenshot =======
# Screenshot a window
@@ -150,9 +145,16 @@ bind = $mainMod, PRINT, exec, hyprshot -m window
bind = , PRINT, exec, hyprshot -m output
# Screenshot a region
bind = $shiftMod, PRINT, exec, hyprshot -m region
# Screenrec
bind = $mainMod, S, exec, ~/.config/hypr/scripts/record-or-screenshot.sh
# ======= Color Picker =======
bindd = $mainMod, P, Launch hyprpicker to pick a color, exec, hyprpicker -a
# ======= Additional Settings =======
bind = $mainMod, c, exec, cliphist list | tofi --prompt-text="clip:" | cliphist decode | wl-copy
# https://wiki.hyprland.org/Configuring/Binds
binds {
allow_workspace_cycles = 1
@@ -161,3 +163,18 @@ binds {
movefocus_cycles_fullscreen = true
window_direction_monitor_fallback = true
}
# Toggle Waybar
bind = $mainMod, W, exec, killall -SIGUSR1 waybar
# ======= Monitors =======
# Toggle Monitor Flip
bind = $mainMod, F7, exec, ~/.config/hypr/scripts/rotate_current_screen.sh
# One-key flip: externals on/off
bind = $mainMod, F8, exec, ~/.config/hypr/scripts/monitor-toggle.sh toggle-externals
# Explicit profiles
bind = $mainMod, F8, exec, ~/.config/hypr/scripts/monitor-toggle.sh laptop
bind = $mainMod, F9, exec, ~/.config/hypr/scripts/monitor-toggle.sh dual
bind = $mainMod, F10, exec, ~/.config/hypr/scripts/monitor-toggle.sh triple

View File

@@ -5,7 +5,9 @@
# Monitor wiki https://wiki.hyprland.org/0.45.0/Configuring/Monitors/
monitor = eDP-2, highres@highrr, 0x0, 1, vrr, 0
monitor = DP-2, 1920x1080@60, auto-left, 1, vrr, 0
monitor = DP-2, highres@highrr, auto-left, 1, vrr, 0
monitor = HDMI-A-1, highres@highrr, auto-left, 1, transform, 1
# If you need to scale things like steam etc, please uncomment these lines.
# Adjust GDK_SCALE accordingly to your liking.

View File

@@ -4,14 +4,13 @@
source = ~/.config/hypr/config/colors.conf
# Variables wiki https://wiki.hyprland.org/0.45.0/Configuring/Variables/ #
# https://wiki.hyprland.org/0.45.0/Configuring/Variables/#general
# https://wiki.hypr.land/Configuring/Variables/#general
general {
gaps_in = 1
gaps_out = 2
border_size = 2
col.active_border = $cachylgreen
col.inactive_border = $cachymblue
gaps_in = 2
gaps_out = 1
border_size = 1
col.active_border = $color4
col.inactive_border = $color2
layout = dwindle # master|dwindle
resize_on_border = true
extend_border_grab_area = 10
@@ -32,39 +31,42 @@ gestures {
# https://wiki.hyprland.org/0.45.0/Configuring/Variables/#group
group {
col.border_active = $cachydgreen
col.border_inactive = $cachylgreen
col.border_locked_active = $cachymgreen
col.border_locked_inactive = $cachydblue
col.border_active = $color6
col.border_inactive = $color2
col.border_locked_active = $color3
col.border_locked_inactive = $color0
# https://wiki.hyprland.org/0.45.0/Configuring/Variables/#groupbar
groupbar {
font_size = 13
height = 15
indicator_height = 2
rounding = 0
font_family = "Fira Sans"
text_color = 0xbbffffff
height = 1
indicator_height = 16
rounding = 2
font_family = "Roboto Sanss"
text_color = $foreground
text_offset = -8
font_weight_active = ultraheavy
font_weight_inactive = normal
col.active = $cachydgreen
col.inactive = $cachylgreen
col.locked_active = $cachymgreen
col.locked_inactive = $cachydblue
font_weight_inactive = semibold
col.active = $color6
col.inactive = $color2
col.locked_active = $color3
col.locked_inactive = $color0
}
}
# https://wiki.hyprland.org/0.45.0/Configuring/Variables/#misc
misc {
font_family = "Fira Sans"
splash_font_family = "Fira Sans"
disable_hyprland_logo = false
col.splash = $cachylgreen
background_color = $cachydblue
font_family = "Roboto Sans"
splash_font_family = "Roboto Sans"
disable_hyprland_logo = true
col.splash = $color2
background_color = $background
enable_swallow = true
swallow_regex = ^(cachy-browser|firefox|nautilus|nemo|thunar|btrfs-assistant.)$
focus_on_activate = true
vrr = 2
# Hypridle cmatrix fix:
session_lock_xray = true
}
# https://wiki.hyprland.org/0.45.0/Configuring/Variables/#render

View File

@@ -6,40 +6,48 @@
# Float Necessary Windows
windowrule = float, title:Rofi
windowrulev2 = float, class:^(org.pulseaudio.pavucontrol)
windowrulev2 = float, class:^()$,title:^(Picture in picture)$
windowrulev2 = float, class:^()$,title:^(Save File)$
windowrulev2 = float, class:^()$,title:^(Open File)$
windowrulev2 = float, class:^(LibreWolf)$,title:^(Picture-in-Picture)$
windowrulev2 = float, class:^(blueman-manager)$
windowrulev2 = float, class:^(xdg-desktop-portal-gtk|xdg-desktop-portal-kde|xdg-desktop-portal-hyprland)(.*)$
windowrulev2 = float, class:^(polkit-gnome-authentication-agent-1|hyprpolkitagent|org.org.kde.polkit-kde-authentication-agent-1)(.*)$
windowrulev2 = float, class:^(CachyOSHello)$
windowrulev2 = float, class:^(zenity)$
windowrulev2 = float, class:^()$,title:^(Steam - Self Updater)$
windowrule = float, class:^(org.pulseaudio.pavucontrol)
windowrule = float, class:^()$,title:^(Picture in picture)$
windowrule = float, class:^()$,title:^(Save File)$
windowrule = float, class:^()$,title:^(Open File)$
windowrule = float, class:^(LibreWolf)$,title:^(Picture-in-Picture)$
windowrule = float, class:^(blueman-manager)$
windowrule = float, class:^(xdg-desktop-portal-gtk|xdg-desktop-portal-kde|xdg-desktop-portal-hyprland)(.*)$
windowrule = float, class:^(pomodorolm)$
windowrule = float, title:^(Extension:.*)$
windowrule = float, class:^(polkit-gnome-authentication-agent-1|hyprpolkitagent|org.org.kde.polkit-kde-authentication-agent-1)(.*)$
windowrule = float, class:^(CachyOSHello)$
windowrule = float, class:^(zenity)$
windowrule = float, class:^()$,title:^(Steam - Self Updater)$
windowrule = float, class:^(Zotero)$,title:^(Progress)$
# Increase the opacity
windowrulev2 = opacity 0.92, class:^(thunar|nemo|dolphin)$
windowrulev2 = opacity 0.96, class:^(discord|armcord|webcord)$
windowrulev2 = opacity 0.95, title:^(QQ|Telegram)$
windowrulev2 = opacity 0.95, title:^(NetEase Cloud Music Gtk4)$
windowrule = opacity 0.92, class:^(thunar|nemo|dolphin)$
windowrule = opacity 0.96, class:^(discord|armcord|webcord)$
windowrule = opacity 0.95, title:^(QQ|Telegram)$
windowrule = opacity 0.95, title:^(NetEase Cloud Music Gtk4)$
windowrule = opacity 1, class:^(kitty)$
# General window rules
windowrulev2 = float, title:^(Picture-in-Picture)$
windowrulev2 = size 960 540, title:^(Picture-in-Picture)$
windowrulev2 = move 25%-, title:^(Picture-in-Picture)$
windowrulev2 = float, title:^(imv|mpv|danmufloat|termfloat|nemo|ncmpcpp)$
windowrulev2 = move 25%-, title:^(imv|mpv|danmufloat|termfloat|nemo|ncmpcpp)$
windowrulev2 = size 960 540, title:^(imv|mpv|danmufloat|termfloat|nemo|ncmpcpp)$
windowrulev2 = pin, title:^(danmufloat)$
windowrulev2 = rounding 5, title:^(danmufloat|termfloat)$
windowrulev2 = animation slide right, class:^(kitty|Alacritty)$
windowrulev2 = noblur, class:^(org.mozilla.firefox)$
windowrule = size 260 340, class:^(pomodorolm)$
windowrule = float, title:^(Picture-in-Picture)$
windowrule = size 960 540, title:^(Picture-in-Picture)$
windowrule = move 25%-, title:^(Picture-in-Picture)$
windowrule = float, title:^(imv|mpv|danmufloat|termfloat|nemo|ncmpcpp|nwg-look|nwg-displays)$
windowrule = move 25%-, title:^(imv|mpv|danmufloat|termfloat|nemo|ncmpcpp)$
windowrule = size 960 540, title:^(imv|mpv|danmufloat|termfloat|nemo|ncmpcpp)$
windowrule = pin, title:^(danmufloat)$
windowrule = rounding 5, title:^(danmufloat|termfloat)$
windowrule = animation slide right, class:^(kitty|Alacritty)$
windowrule = noblur, class:^(org.mozilla.firefox)$
windowrule = nodim, class:^(zen)$
windowrule = float, title:^(Zotero Settings)$
# Decorations related to floating windows on workspaces 1 to 10
windowrulev2 = bordersize 2, floating:1, onworkspace:w[fv1-10]
windowrulev2 = bordercolor $cachylblue, floating:1, onworkspace:w[fv1-10]
windowrulev2 = rounding 8, floating:1, onworkspace:w[fv1-10]
windowrule = bordersize 2, floating:1, onworkspace:w[fv1-10]
windowrule = bordercolor $color4, floating:1, onworkspace:w[fv1-10]
windowrule = rounding 8, floating:1, onworkspace:w[fv1-10]
# Decorations related to tiling windows on workspaces 1 to 10
windowrulev2 = bordersize 3, floating:0, onworkspace:f[1-10]
windowrulev2 = rounding 4, floating:0, onworkspace:f[1-10]
windowrule = bordersize 3, floating:0, onworkspace:f[1-10]
windowrule = rounding 4, floating:0, onworkspace:f[1-10]
windowrule = opacity 0.9, title:^(.+nvim$)
# Windows Rules End #
# Workspaces Rules https://wiki.hyprland.org/0.45.0/Configuring/Workspace-Rules/ #
@@ -51,8 +59,8 @@ windowrulev2 = rounding 4, floating:0, onworkspace:f[1-10]
# workspace = special:scratchpad, on-created-empty:$applauncher
# no_gaps_when_only deprecated instead workspaces rules with selectors can do the same
# Smart gaps from 0.45.0 https://wiki.hyprland.org/0.45.0/Configuring/Workspace-Rules/#smart-gaps
workspace = w[tv1-10], gapsout:5, gapsin:3
workspace = f[1], gapsout:5, gapsin:3
#workspace = w[tv1-10], gapsout:5, gapsin:3
#workspace = f[1], gapsout:5, gapsin:3
# Workspaces Rules End #
# Layers Rules #
@@ -61,3 +69,8 @@ layerrule = animation slide top, logout_dialog
layerrule = animation slide down, waybar
layerrule = animation fade 50%, wallpaper
# Layers Rules End #
# Zotero Libreoffice
windowrule = float,class:^(Zotero)$,title:^(Citation Dialog)$
windowrule = center,class:^(Zotero)$,title:^(Citation Dialog)$
windowrule = noanim,class:^(Zotero)$,title:^(Citation Dialog)$

View File

@@ -11,3 +11,6 @@ workspace = 5, monitor:DP-2
workspace = 6, monitor:DP-2
workspace = 7, monitor:DP-2
workspace = 8, monitor:DP-2
workspace = 7, monitor:HDMI-A-1
workspace = 8, monitor:HDMI-A-1

View File

@@ -0,0 +1,29 @@
general {
lock_cmd = pidof swaylock || swaylock # avoid starting multiple hyprlock instances.
before_sleep_cmd = brightnessctl -r # lock before suspend.
after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display.
}
listener {
timeout = 150 # 2.5min.
on-timeout = brightnessctl -s set 10 # set monitor backlight to minimum, avoid 0 on OLED monitor.
on-resume = brightnessctl -r # monitor backlight restore.
}
# turn off keyboard backlight, comment out this section if you dont have a keyboard backlight.
listener {
timeout = 150 # 2.5min.
on-timeout = brightnessctl -sd asus::kbd_backlight set 0 # turn off keyboard backlight.
on-resume = brightnessctl -rd asus::kbd_backlight # turn on keyboard backlight.
}
listener {
timeout = 300 # 5min
on-timeout = ~/.config/swaylock/lockscript.sh # lock screen when timeout has passed
}
listener {
timeout = 900 # 15min
on-timeout = hyprctl dispatch dpms off 5.5 # screen off when timeout has passed
on-resume = hyprctl dispatch dpms on && brightnessctl -r # screen on when activity is detected after timeout has fired.
}

View File

@@ -0,0 +1,33 @@
#!/bin/bash
# start waybar if not started
if ! pgrep -x "waybar" > /dev/null; then
waybar &
fi
# current checksums
current_checksum_config=$(md5sum ~/.config/waybar/config)
current_checksum_style=$(md5sum ~/.config/waybar/style.css)
current_checksum_colors=$(md5sum ~/.config/waybar/colors-wallust.css)
# loop forever
while true; do
# new checksums
new_checksum_config=$(md5sum ~/.config/waybar/config)
new_checksum_style=$(md5sum ~/.config/waybar/style.css)
new_checksum_colors==$(md5sum ~/.config/waybar/colors-wallust.css)
# if checksums are different
if [ "$current_checksum_config" != "$new_checksum_config" ] || [ "$current_checksum_style" != "$new_checksum_style" ] || [ "$current_checksum_colors" != "$new_checksum_colors" ]; then
# kill waybar
killall waybar
# start waybar
waybar &
# update checksums
current_checksum_config=$new_checksum_config
current_checksum_style=$new_checksum_style
current_checksum_colors=$new_checksum_colors
fi
done

View File

@@ -0,0 +1,132 @@
#!/usr/bin/env bash
# Quick display control for Hyprland
# Profiles:
# laptop -> keep eDP-2, disable all externals
# dual -> eDP-2 + primary external
# triple -> eDP-2 + both externals
# Toggles:
# toggle-externals -> if any external enabled => laptop; else => triple (or dual if only one preset)
# dpms-toggle-focused -> blank/unblank the currently focused monitor (does NOT change layout)
set -euo pipefail
PRIMARY="eDP-2"
# --- exact enable lines (copy from hyprland.conf) ---
EXT1='desc:Samsung Electric Company S24F350 H4ZR302705, highres@highrr, auto-right, 1'
EXT2='desc:Samsung Electric Company S24F350 H4ZK111233, highres@highrr, auto-right, 1, transform, 1'
# Optional fallback by connector (harmless if not present)
EXT_FALLBACK='HDMI-A-1, highres@highrr, auto-right, 1'
# Which external is the "main" one you prefer for Dual:
DUAL_MAIN="$EXT1"
notify() {
if command -v notify-send >/dev/null 2>&1; then
notify-send -a "Hyprland" "$1" "${2:-}"
else
[ -n "${2:-}" ] && printf '%s: %s\n' "$1" "$2" >&2 || printf '%s\n' "$1" >&2
fi
}
hypr() {
local out
if ! out="$(hyprctl "$@" 2>&1)"; then
notify "hyprctl failed" "$out"
exit 1
fi
}
jqok(){ command -v jq >/dev/null; }
monjson(){ hyprctl -j monitors 2>/dev/null || true; }
any_external_enabled() {
if jqok; then
monjson | jq -e --arg P "$PRIMARY" '.[] | select(.name!=$P and (.disabled!=true))' >/dev/null
else
hyprctl monitors | awk -v P="$PRIMARY" '/^Monitor /{gsub(/^Monitor[ \t]+/, "", $0); split($0,a," "); if (a[1]!=P){print; exit 0}}' | grep -q .
fi
}
disable_all_externals() {
if jqok; then
mapfile -t names < <(monjson | jq -r --arg P "$PRIMARY" '.[] | select(.name!=$P) | .name')
else
mapfile -t names < <(hyprctl monitors | awk -v P="$PRIMARY" '/^Monitor /{gsub(/^Monitor[ \t]+/, "", $0); split($0,a," "); if (a[1]!=P) print a[1]}')
fi
for n in "${names[@]:-}"; do
hypr keyword monitor "$n, disable"
done
}
enable_line() {
local line="$1"
[ -n "$line" ] && hypr keyword monitor "$line"
}
profile_laptop() {
disable_all_externals
notify "Profile: Laptop-only" "$PRIMARY active, externals disabled"
}
profile_dual() {
# Ensure only one external is on
disable_all_externals
enable_line "$DUAL_MAIN"
notify "Profile: Dual" "Enabled main external with preferred transform"
}
profile_triple() {
# Ensure both externals are on (and only those two)
disable_all_externals
enable_line "$EXT1"
enable_line "$EXT2"
# You can drop EXT_FALLBACK if you don't actually need it:
# enable_line "$EXT_FALLBACK"
notify "Profile: Triple" "Enabled both externals"
}
toggle_externals() {
if any_external_enabled; then
profile_laptop
else
# Prefer triple if we have two presets, else dual
if [ -n "$EXT1" ] && [ -n "$EXT2" ]; then
profile_triple
else
profile_dual
fi
fi
}
dpms_toggle_focused() {
# Blank/unblank the currently focused output, layout unchanged
local name
if jqok; then
name="$(monjson | jq -r '.[] | select(.focused==true) | .name // empty')"
else
name="$(hyprctl monitors | awk '$1=="Monitor"{gsub(/^Monitor[ \t]+/,""); split($0,a," "); name=a[1]} /focused: yes/{print name; exit}')"
fi
[ -z "$name" ] && { notify "No focused monitor" ""; exit 2; }
hypr dispatch dpms toggle "$name"
notify "DPMS toggle" "$name"
}
case "${1:-}" in
laptop) profile_laptop ;;
dual) profile_dual ;;
triple) profile_triple ;;
toggle-externals) toggle_externals ;;
dpms-toggle-focused) dpms_toggle_focused ;;
*)
cat <<EOF
Usage:
$(basename "$0") laptop # eDP-2 only
$(basename "$0") dual # eDP-2 + main external
$(basename "$0") triple # eDP-2 + both externals
$(basename "$0") toggle-externals # flip between laptop-only and (dual/triple)
$(basename "$0") dpms-toggle-focused # blank/unblank focused output (no layout change)
EOF
exit 2
;;
esac

View File

@@ -0,0 +1,176 @@
#!/bin/env bash
# Menu launcher wrapper
menu_prompt() {
if command -v tofi &>/dev/null; then
printf "%b" "$1" | tofi --prompt-text="$2"
elif command -v fuzzel &>/dev/null; then
printf "%b" "$1" | fuzzel -d -p "$2" -w 25 -l 10
elif command -v wofi &>/dev/null; then
printf "%b" "$1" | wofi --dmenu --prompt="$2"
elif command -v rofi &>/dev/null; then
printf "%b" "$1" | rofi -dmenu -p "$2"
else
notify-send "No compatible launcher found" "Install tofi, fuzzel, wofi, or rofi."
exit 1
fi
}
# Directories
SCREENSHOT_DIR="${HOME}/Pictures"
RECORDING_DIR="${HOME}/Videos"
# Ensure directories exist
mkdir -p "$SCREENSHOT_DIR" "$RECORDING_DIR"
# Stop active wl-screenrec session
if pgrep -u "$USER" wl-screenrec > /dev/null; then
pkill -INT -u "$USER" wl-screenrec
notify-send "Recording stopped"
# Ask if user wants to compress the video
COMPRESS=$(menu_prompt "✅ compress\n❌ keep original" "🗜️ Compress video?")
if [[ "$COMPRESS" == "✅ compress" ]]; then
# Find the most recent video file
LATEST_VIDEO=$(find "$RECORDING_DIR" -name "*.mp4" -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -d' ' -f2-)
if [[ -n "$LATEST_VIDEO" ]] && [[ -f "$LATEST_VIDEO" ]]; then
COMPRESSED_VIDEO="${LATEST_VIDEO%.mp4}_compressed.mp4"
notify-send "Compressing video..." "This may take a moment"
if ffmpeg -i "$LATEST_VIDEO" -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k "$COMPRESSED_VIDEO" -y &>/dev/null; then
notify-send "Compression complete" "$COMPRESSED_VIDEO"
# Ask if user wants to delete original
DELETE_ORIGINAL=$(menu_prompt "🗑️ delete original\n📁 keep both" "Delete original?")
if [[ "$DELETE_ORIGINAL" == "🗑️ delete original" ]]; then
rm "$LATEST_VIDEO"
notify-send "Original deleted" "Keeping compressed version only"
fi
else
notify-send "Compression failed" "Keeping original file"
fi
fi
fi
exit 0
fi
# Get current outputs dynamically
OUTPUTS=$(hyprctl monitors | grep "Monitor" | awk '{print $2}' | paste -sd " " -)
OPTIONS=$(
cat <<EOF
screenshot selection
$(for OUTPUT in $OUTPUTS; do echo "screenshot $OUTPUT"; done)
screenshot all
record selection
$(for OUTPUT in $OUTPUTS; do echo "record $OUTPUT"; done)
record all
EOF
)
SELECTION=$(menu_prompt "$OPTIONS" "󰄀 ")
[ -z "$SELECTION" ] && exit 0
# Ask for audio mode if it's a recording
select_audio_mode() {
AUDIO_MODE=$(menu_prompt "🎤 mic\n💻 internal\n🚫 none" "🎙️ Audio?")
[ -z "$AUDIO_MODE" ] && echo "__cancel__" && return
case "$AUDIO_MODE" in
"🚫 none")
echo ""
;;
"🎤 mic")
echo "--audio"
;;
"💻 internal")
echo "--audio --audio-device default.monitor"
;;
*)
echo ""
;;
esac
}
# Screenshot or record depending on selection
case "$SELECTION" in
"screenshot selection")
TIMESTAMP="$(date +%Y-%m-%d_%H-%M-%S)"
IMG="${SCREENSHOT_DIR}/${TIMESTAMP}.png"
grim -g "$(slurp)" "$IMG" || { notify-send "Error" "Failed to take screenshot"; exit 1; }
[ -x "$(command -v wl-copy)" ] && wl-copy < "$IMG"
notify-send "Screenshot Taken" "$IMG"
;;
"screenshot all")
TIMESTAMP="$(date +%Y-%m-%d_%H-%M-%S)"
IMG="${SCREENSHOT_DIR}/${TIMESTAMP}.png"
TEMP_FILES=()
for OUTPUT in $OUTPUTS; do
OUT_IMG="${IMG//.png/-$OUTPUT.png}"
grim -c -o "$OUTPUT" "$OUT_IMG" && TEMP_FILES+=("$OUT_IMG")
done
if [ "${#TEMP_FILES[@]}" -gt 1 ]; then
montage "${TEMP_FILES[@]}" -tile x1 -geometry +0+0 "$IMG"
rm "${TEMP_FILES[@]}"
[ -x "$(command -v wl-copy)" ] && wl-copy < "$IMG"
notify-send "Screenshot Taken" "$IMG"
else
notify-send "Error" "Not enough outputs to montage"
fi
;;
"record selection")
TIMESTAMP="$(date +%Y-%m-%d_%H-%M-%S)"
VID="${RECORDING_DIR}/${TIMESTAMP}.mp4"
AUDIO_ARGS=$(select_audio_mode)
[ "$AUDIO_ARGS" == "__cancel__" ] && notify-send "Recording cancelled" && exit 0
# Get selection geometry
notify-send "Select area" "Click and drag to select recording area"
GEOMETRY="$(slurp)"
if [ $? -ne 0 ] || [ -z "$GEOMETRY" ]; then
notify-send "Recording cancelled" "Area selection was cancelled"
exit 0
fi
# Start recording
if [ -n "$AUDIO_ARGS" ]; then
eval "wl-screenrec --geometry '$GEOMETRY' --filename '$VID' $AUDIO_ARGS" &
else
wl-screenrec --geometry "$GEOMETRY" --filename "$VID" &
fi
notify-send "Recording started" "Saving to $VID"
;;
"record all")
notify-send "Not implemented" "Recording all screens is not supported yet."
;;
"screenshot "*)
TIMESTAMP="$(date +%Y-%m-%d_%H-%M-%S)"
IMG="${SCREENSHOT_DIR}/${TIMESTAMP}.png"
OUT=$(echo "$SELECTION" | awk '{print $2}')
grim -c -o "$OUT" "$IMG" || { notify-send "Error" "Failed to screenshot $OUT"; exit 1; }
[ -x "$(command -v wl-copy)" ] && wl-copy < "$IMG"
notify-send "Screenshot Taken" "$IMG"
;;
"record "*)
TIMESTAMP="$(date +%Y-%m-%d_%H-%M-%S)"
VID="${RECORDING_DIR}/${TIMESTAMP}.mp4"
OUT=$(echo "$SELECTION" | awk '{print $2}')
AUDIO_ARGS=$(select_audio_mode)
[ "$AUDIO_ARGS" == "__cancel__" ] && notify-send "Recording cancelled" && exit 0
# Start recording
if [ -n "$AUDIO_ARGS" ]; then
eval "wl-screenrec --output '$OUT' --filename '$VID' $AUDIO_ARGS" &
else
wl-screenrec --output "$OUT" --filename "$VID" &
fi
notify-send "Recording started" "Saving to $VID"
;;
*)
notify-send "Invalid selection" "$SELECTION"
;;
esac

View File

@@ -0,0 +1,75 @@
#!/usr/bin/env bash
# Rotate the CURRENTLY FOCUSED monitor in 90° steps: 0→90→180→270→0…
set -euo pipefail
notify() {
if command -v notify-send >/dev/null 2>&1; then
notify-send -a "Hyprland" "$1" "${2:-}"
else
[ -n "${2:-}" ] && printf '%s: %s\n' "$1" "$2" >&2 || printf '%s\n' "$1" >&2
fi
}
# Read monitors
MON_JSON="$(hyprctl -j monitors 2>/dev/null || true)"
if [ -z "$MON_JSON" ]; then
notify "Hyprland error" "Couldnt read monitors via hyprctl."
exit 1
fi
# Focused monitor info
if command -v jq >/dev/null 2>&1; then
NAME="$(printf '%s' "$MON_JSON" | jq -r '.[] | select(.focused==true) | .name' | head -n1)"
DESC="$(printf '%s' "$MON_JSON" | jq -r '.[] | select(.focused==true) | .description' | head -n1)"
TFORM="$(printf '%s' "$MON_JSON" | jq -r '.[] | select(.focused==true) | (.transform // 0)' | head -n1)"
else
NAME=""; DESC=""; TFORM=""; FOC=0; GOT=0
while IFS= read -r line || [ -n "$line" ]; do
if [[ $line =~ ^Monitor[[:space:]]+([^[:space:]]+)[[:space:]]+\(ID[[:space:]] ]]; then
if (( FOC==1 )); then GOT=1; break; fi
NAME="${BASH_REMATCH[1]}"; DESC=""; TFORM=""; FOC=0
elif [[ $line =~ ^[[:space:]]*description:[[:space:]]*(.*)$ ]]; then
DESC="${BASH_REMATCH[1]}"
elif [[ $line =~ ^[[:space:]]*transform:[[:space:]]*([0-9]+)$ ]]; then
TFORM="${BASHREMATCH[1]}"
elif [[ $line =~ ^[[:space:]]*focused:[[:space:]]*yes$ ]]; then
FOC=1
elif [[ -z $line ]]; then
if (( FOC==1 )); then GOT=1; break; fi
fi
done < <(hyprctl monitors 2>/dev/null)
if (( GOT==0 && FOC==1 )); then GOT=1; fi
if (( GOT==0 )); then NAME=""; fi
: "${TFORM:=0}"
fi
if [ -z "${NAME:-}" ] || [ "${NAME:-null}" = "null" ]; then
notify "No active monitor to rotate" "Couldnt determine a focused monitor."
exit 1
fi
# Use description if available (most specific), else connector name
if [ -n "${DESC:-}" ] && [ "${DESC:-null}" != "null" ]; then
IDENT="desc:${DESC}"
else
IDENT="${NAME}" # bare connector name; no "name:" prefix
fi
# Base monitor string
BASE="${IDENT}, highres@highrr, auto-right, 1"
# Compute next transform in 90° steps (ignore flipped bit if present)
if ! [[ "${TFORM:-}" =~ ^[0-9]+$ ]]; then TFORM=0; fi
BASE_ROT=$(( TFORM % 4 ))
NEXT=$(( (BASE_ROT + 1) % 4 ))
DEG=$(( NEXT * 90 ))
run_hyprctl() {
if ! OUT="$(hyprctl keyword monitor "$1" 2>&1)"; then
notify "hyprctl failed" "$OUT"
exit 1
fi
}
run_hyprctl "$BASE, transform, $NEXT"
notify "Rotation applied" "${DESC:-$NAME}${DEG}° (transform $NEXT)"

View File

@@ -0,0 +1,80 @@
#!/bin/bash
#
# volume-helper.sh — Unified volume control script for Hyprland using pactl
#
# Purpose:
# Many systems have multiple audio output devices (sinks), such as onboard
# audio and an external device (e.g. M-Audio M-Track). This script adjusts the
# volume of both:
#
# - The default sink (`@DEFAULT_SINK@`)
# - A second sink (identified by partial name, e.g., "M-Track")
#
# Supports:
# - up → Increase volume by 5% (defined by STEP, capped at MAX_VOLUME)
# - down → Decrease volume by 5%
# - mute → Mute all sinks
# - unmute → Unmute all sinks
# - toggle → Toggle mute state of all sinks
#
# Do NOT run this with sudo! pactl must run in your user session.
#
MAX_VOLUME=140
STEP=5
# Secondary sink (e.g. M-Track 2X2)
SECOND_SINK=$(pactl list short sinks | grep "M-Track" | awk '{print $1}')
DEFAULT_SINK="@DEFAULT_SINK@"
adjust_volume() {
local sink=$1
local direction=$2
if [[ "$direction" == "up" ]]; then
pactl set-sink-volume "$sink" +${STEP}%
VOL=$(pactl get-sink-volume "$sink" | grep -oP '\d+(?=%)' | sort -nr | head -1)
if [ "$VOL" -gt "$MAX_VOLUME" ]; then
pactl set-sink-volume "$sink" "$MAX_VOLUME"%
fi
elif [[ "$direction" == "down" ]]; then
pactl set-sink-volume "$sink" -${STEP}%
fi
}
toggle_mute() {
local sink=$1
pactl set-sink-mute "$sink" "$2"
}
# Process action
case "$1" in
up)
adjust_volume "$DEFAULT_SINK" up
[[ -n "$SECOND_SINK" ]] && adjust_volume "$SECOND_SINK" up
;;
down)
adjust_volume "$DEFAULT_SINK" down
[[ -n "$SECOND_SINK" ]] && adjust_volume "$SECOND_SINK" down
;;
mute)
toggle_mute "$DEFAULT_SINK" 1
[[ -n "$SECOND_SINK" ]] && toggle_mute "$SECOND_SINK" 1
;;
unmute)
toggle_mute "$DEFAULT_SINK" 0
[[ -n "$SECOND_SINK" ]] && toggle_mute "$SECOND_SINK" 0
;;
toggle)
CURRENT_STATE=$(pactl get-sink-mute "$DEFAULT_SINK" | grep -oE "yes|no")
if [[ "$CURRENT_STATE" == "yes" ]]; then
"$0" unmute
else
"$0" mute
fi
;;
*)
echo "Usage: $0 up|down|mute|unmute|toggle"
exit 1
;;
esac

6
.config/kitty/kitty.conf Normal file
View File

@@ -0,0 +1,6 @@
include colors.conf
background_opacity .3
background_blur 16

View File

@@ -0,0 +1,139 @@
[env]
TERM = "xterm-256color"
WINIT_X11_SCALE_FACTOR = "1"
[window]
dynamic_padding = true
decorations = "full"
title = "Alacritty"
opacity = 0.3
decorations_theme_variant = "Dark"
[window.dimensions]
columns = 100
lines = 30
[window.class]
instance = "Alacritty"
general = "Alacritty"
[scrolling]
history = 10000
multiplier = 4
[font]
size = 11
[font.normal]
family = "monospace"
style = "Regular"
[font.bold]
family = "monospace"
style = "Bold"
[font.italic]
family = "monospace"
style = "Italic"
[font.bold_italic]
family = "monospace"
style = "Bold Italic"
[selection]
semantic_escape_chars = ",│`|:\"' ()[]{}<>\t"
save_to_clipboard = true
[cursor]
style = "Underline"
vi_mode_style = "None"
unfocused_hollow = true
thickness = 0.15
[mouse]
hide_when_typing = true
[[mouse.bindings]]
mouse = "Middle"
action = "PasteSelection"
[keyboard]
[[keyboard.bindings]]
key = "Paste"
action = "Paste"
[[keyboard.bindings]]
key = "Copy"
action = "Copy"
[[keyboard.bindings]]
key = "L"
mods = "Control"
action = "ClearLogNotice"
[[keyboard.bindings]]
key = "L"
mods = "Control"
mode = "~Vi"
chars = "\f"
[[keyboard.bindings]]
key = "PageUp"
mods = "Shift"
mode = "~Alt"
action = "ScrollPageUp"
[[keyboard.bindings]]
key = "PageDown"
mods = "Shift"
mode = "~Alt"
action = "ScrollPageDown"
[[keyboard.bindings]]
key = "Home"
mods = "Shift"
mode = "~Alt"
action = "ScrollToTop"
[[keyboard.bindings]]
key = "End"
mods = "Shift"
mode = "~Alt"
action = "ScrollToBottom"
[[keyboard.bindings]]
key = "V"
mods = "Control|Shift"
action = "Paste"
[[keyboard.bindings]]
key = "C"
mods = "Control|Shift"
action = "Copy"
[[keyboard.bindings]]
key = "F"
mods = "Control|Shift"
action = "SearchForward"
[[keyboard.bindings]]
key = "B"
mods = "Control|Shift"
action = "SearchBackward"
[[keyboard.bindings]]
key = "C"
mods = "Control|Shift"
mode = "Vi"
action = "ClearSelection"
[[keyboard.bindings]]
key = "Key0"
mods = "Control"
action = "ResetFontSize"
[general]
live_config_reload = true
working_directory = "None"
import = ["/home/michaelb/.config/alacritty/colors.toml"]

33
.config/swaylock/config Normal file
View File

@@ -0,0 +1,33 @@
show-failed-attempts
clock
color=00000000
indicator
indicator-radius=100
indicator-thickness=1
line-color=00000000
ring-color=00000000
inside-color=00000000
key-hl-color=ffffff88
separator-color=00000000
text-color=ffffff88
text-caps-lock-color=""
line-ver-color=00000000
ring-ver-color=00000000
inside-ver-color=00000000
text-ver-color=ffffff88
ring-wrong-color=00000000
text-wrong-color=ffffff88
inside-wrong-color=00000000
inside-clear-color=00000000
text-clear-color=ffffff88
ring-clear-color=00000000
line-clear-color=00000000
line-wrong-color=00000000
bs-hl-color=ffffff88
grace=2
grace-no-mouse
grace-no-touch
datestr=%a, %B %e
timestr=%I:%M %p
fade-in=0.2
ignore-empty-password

26
.config/swaylock/lockscript.sh Executable file
View File

@@ -0,0 +1,26 @@
#!/usr/bin/env bash
set -Eeuo pipefail
USER_HOME="$HOME"
MATRIX_SCRIPT="$USER_HOME/.config/swaylock/matrix.sh"
ALACRITTY_CONF="$USER_HOME/.config/swaylock/alacritty-matrix.toml"
# 1) Spawn matrix per monitor
mapfile -t MONS < <(hyprctl -j monitors | jq -r '.[].name')
for mon in "${MONS[@]}"; do
hyprctl dispatch focusmonitor "$mon"
printf "Monitor: $mon\n"
sleep 0.06
kitty \
--class matrix \
--title "matrix-$mon" \
--start-as fullscreen \
bash -lc "$MATRIX_SCRIPT" &
sleep 0.15
done
# 2) Lock screen (blocks until unlock)
swaylock
# 3) Tear down matrix
pkill -f "$MATRIX_SCRIPT" || true

4
.config/swaylock/matrix.sh Executable file
View File

@@ -0,0 +1,4 @@
#!/bin/bash
sleep 0.21
cmatrix

View File

@@ -1,28 +1,25 @@
font = Fanwood Text
font = Roboto Sans
font-size = 32
outline-width = 0
border-width = 0
padding-left = 34%
padding-left = 25%
padding-top = 22%
padding-right = 0
padding-bottom = 0
background-color = #111
background-color = #FFF
text-color = #f9fbff
selection-color = #933
width = 100%
height = 100%
hide-cursor = true
text-color = #cdd6f4
prompt-color = #f38ba8
selection-color = #f9e2af
background-color = #1e1e2eAA
hide-cursor = false
text-color = #ffffff77
prompt-color = #ffffff77
selection-color = #ffffff
background-color = #00000099
#
### Behaviour
#
hide-cursor = true
history = true
history = true

View File

@@ -0,0 +1,19 @@
$wallpaper = {{wallpaper}}
$background = rgb({{background | strip}})
$foreground = rgb({{foreground | strip}})
$color0 = rgb({{color0 | strip}})
$color1 = rgb({{color1 | strip}})
$color2 = rgb({{color2 | strip}})
$color3 = rgb({{color3 | strip}})
$color4 = rgb({{color4 | strip}})
$color5 = rgb({{color5 | strip}})
$color6 = rgb({{color6 | strip}})
$color7 = rgb({{color7 | strip}})
$color8 = rgb({{color8 | strip}})
$color9 = rgb({{color9 | strip}})
$color10 = rgb({{color10 | strip}})
$color11 = rgb({{color11 | strip}})
$color12 = rgb({{color12 | strip}})
$color13 = rgb({{color13 | strip}})
$color14 = rgb({{color14 | strip}})
$color15 = rgb({{color15 | strip}})

View File

@@ -0,0 +1,25 @@
# uses https://codeberg.org/explosion-mental/wallust-templates/src/branch/master/kitty.conf
background {{ background }}
foreground {{ foreground }}
color0 {{ color0 }}
color1 {{ color1 }}
color2 {{ color2 }}
color3 {{ color3 }}
color4 {{ color4 }}
color5 {{ color5 }}
color6 {{ color6 }}
color7 {{ color7 }}
color8 {{ color8 }}
color9 {{ color9 }}
color10 {{ color10 }}
color11 {{ color11 }}
color12 {{ color12 }}
color13 {{ color13 }}
color14 {{ color14 }}
color15 {{ color15 }}
mark1_foreground {{ color6 | saturate(0.2) }}
mark2_foreground {{ color7 | saturate(0.2) }}
mark3_foreground {{ color6 | saturate(0.2) }}

View File

@@ -0,0 +1,20 @@
font = Roboto Sans
font-size = 32
outline-width = 0
border-width = 0
padding-left = 25%
padding-top = 22%
padding-right = 0
padding-bottom = 22%
width = 100%
height = 100%
hide-cursor = false
text-color = #{{ color1 | strip }}55
prompt-color = #{{ foreground | strip }}77
selection-color = #{{ color5 | strip }}
background-color = #{{ background | strip }}99
history = true

View File

@@ -0,0 +1,16 @@
{{ background }}
{{ color1 }}
{{ color2 }}
{{ color3 }}
{{ color4 }}
{{ color5 }}
{{ color6 }}
{{ color7 }}
{{ color8 }}
{{ color9 }}
{{ color10 }}
{{ color11 }}
{{ color12 }}
{{ color13 }}
{{ color14 }}
{{ color15 }}

View File

@@ -1,7 +1,48 @@
# wallust v3.3
#
# You can copy this file to ~/.config/wallust/wallust.toml (keep in mind is a sample config)
# SIMPLE TUTORIAL, or `man wallust.5`:
# https://explosion-mental.codeberg.page/wallust/
#
# If comming from v2: https://explosion-mental.codeberg.page/wallust/v3.html#wallusttoml
# Global section - values below can be overwritten by command line flags
# How the image is parse, in order to get the colors:
# # full - resized - wal - thumb - fastresize - kmeans
backend = "fastresize"
color_space = "lch"
# What color space to use to produce and select the most prominent colors:
# lab - labmixed - lch - lchmixed
color_space = "lab"
# Use the most prominent colors in a way that makes sense, a scheme color palette:
# dark - dark16 - darkcomp - darkcomp16
# light - light16 - lightcomp - lightcomp16
# harddark - harddark16 - harddarkcomp - harddarkcomp16
# softdark - softdark16 - softdarkcomp - softdarkcomp16
# softlight - softlight16 - softlightcomp - softlightcomp16
palette = "dark"
# Ensures a "readable contrast" (OPTIONAL, disabled by default)
# Should only be enabled when you notice an unreadable contrast frequently happening
# with your images. The reference color for the contrast is the background color.
check_contrast = true
# Color saturation, between [1% and 100%] (OPTIONAL, disabled by default)
# usually something higher than 50 increases the saturation and below
# decreases it (on a scheme with strong and vivid colors)
#saturation = 35
# Alpha value for templating, by default 100 (no other use whatsoever)
#alpha = 50
[templates]
waybar = { template = 'waybar.css', target = '~/.config/waybar/colors-wallust.css' }
alacritty = { template = 'alacritty.toml', target = '~/.config/alacritty/colors.toml' }
# alacritty = { template = 'alacritty.toml', target = '~/.config/alacritty/colors.toml' }
hyprland = { template = 'hyprland.conf', target = '~/.config/hypr/config/colors.conf' }
vscode = { template = 'vscode', target = '~/.cache/wal/colors' }
kitty = { template = 'kitty.conf', target = '~/.config/kitty/colors.conf'}
tofi = { template = 'tofi', target = '~/.config/tofi/config' }

View File

@@ -34,6 +34,10 @@ window#waybar.hidden {
opacity: 0.2;
}
window#waybar.empty #window {
background-color: transparent;
}
#workspaces button {
padding: 3px 2px;
margin: 3px 2px;