diff --git a/.config/hypr/hyprland.conf b/.config/hypr/hyprland.conf new file mode 100644 index 0000000..ad7d194 --- /dev/null +++ b/.config/hypr/hyprland.conf @@ -0,0 +1,217 @@ +# +# Please note not all available settings / options are set here. +# For a full list, see the wiki +# +# + +# See https://wiki.hyprland.org/Configuring/Monitors/ +monitor=,highrr,auto,auto + +# Some default env vars. +env = XCURSOR_SIZE,24 + +# For all categories, see https://wiki.hyprland.org/Configuring/Variables/ +input { + kb_layout = us + kb_variant = + kb_model = + kb_options = + kb_rules = + + follow_mouse = 1 + + touchpad { + natural_scroll = yes + } + + repeat_delay = 300 + repeat_rate = 50 + + sensitivity = 0 # -1.0 - 1.0, 0 means no modification. +} + +general { + # See https://wiki.hyprland.org/Configuring/Variables/ for more + + gaps_in = 6 + gaps_out = 12 + border_size = 2 + col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg + col.inactive_border = rgba(595959aa) + + layout = master + + # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on + allow_tearing = false +} + +decoration { + # See https://wiki.hyprland.org/Configuring/Variables/ for more + + rounding = 10 + + blur { + enabled = true + size = 3 + passes = 1 + } + + drop_shadow = yes + shadow_range = 4 + shadow_render_power = 3 + col.shadow = rgba(1a1a1aee) +} + +animations { + enabled = yes + + # Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more + + 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 +} + +dwindle { + # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more + pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below + preserve_split = yes # you probably want this +} + +master { + # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more + new_is_master = true + no_gaps_when_only = true +} + +gestures { + # See https://wiki.hyprland.org/Configuring/Variables/ for more + workspace_swipe = off +} + +misc { + # See https://wiki.hyprland.org/Configuring/Variables/ for more + force_default_wallpaper = 0 # Set to 0 to disable the anime mascot wallpapers + enable_swallow = true + swallow_regex = ^foot$ +} + +# Example per-device config +# See https://wiki.hyprland.org/Configuring/Keywords/#executing for more +device:epic-mouse-v1 { + sensitivity = -0.5 +} + +# Example windowrule v1 +# windowrule = float, ^(kitty)$ +# Example windowrule v2 +# windowrulev2 = float,class:^(kitty)$,title:^(kitty)$ +# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more + +$mainMod = SUPER + +# Program spawning hotkeys +bind = CONTROL ALT, BACKSPACE, exec, $TERMINAL -e $SHELL -c 'htop' +bind = $mainMod, RETURN, exec, foot +bind = $mainMod, W, exec, firefox +bind = $mainMod, E, exec, $TERMINAL -e $SHELL -c 'tmp="$(mktemp)" && command lf -last-dir-path="$tmp" "$@" && test -f "$tmp" && dir="$(command cat "$tmp")" && rm -f "$tmp" && test -d "$dir" && cd "$dir" && exec $SHELL' +bind = $mainMod SHIFT, E, exec, emacsclient -c -a 'emacs' + +# Menu hoykeys +bind = $mainMod, R, exec, menu-run + +# System control keybinds +binde = $mainMod, MINUS, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 1%- +binde = $mainMod SHIFT, MINUS, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- +binde = $mainMod, EQUAL, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 1%+ +binde = $mainMod SHIFT, EQUAL, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ +binde = ,F7, exec, change-brightness up +binde = ,XF86MonBrightnessUp, exec, change-brightness up +binde = ,F6, exec, change-brightness down +binde = ,XF86MonBrightnessDown, exec, change-brightness down +bind = $mainMod, L, exec, swaylock -e -c 000000 + +# Kill commands +bind = $mainMod CONTROL SHIFT, Q, exit, +bind = $mainMod, Q, killactive, + +# Change gaps +binde = $mainMod, Z, exec, hyprgaps -i 3 +binde = $mainMod, X, exec, hyprgaps -d 3 + +# Master stack movement commands +bind = $mainMod, J, layoutmsg, cyclenext +bind = $mainMod SHIFT, J, layoutmsg, swapnext +bind = $mainMod, K, layoutmsg, cycleprev +bind = $mainMod SHIFT, K, layoutmsg, swapprev +bind = $mainMod SHIFT, L, splitratio, +0.05 +bind = $mainMod SHIFT, H, splitratio, -0.05 + +# Changing number of masters +bind = $mainMod, O, layoutmsg, addmaster +bind = $mainMod SHIFT, O, layoutmsg, removemaster + +# Change tiling direction +bind = $mainMod, T, layoutmsg, orientationleft +bind = $mainMod SHIFT, T, layoutmsg, orientationtop + +# Special windows +bind = $mainMod, F, togglefloating, +bind = $mainMod, S, togglespecialworkspace, magic +bind = $mainMod SHIFT, S, movetoworkspace, special:magic + +# Switch workspaces with mainMod + [0-9] +bind = $mainMod, 1, exec, hyprdwm goto 1 +bind = $mainMod, 2, exec, hyprdwm goto 2 +bind = $mainMod, 3, exec, hyprdwm goto 3 +bind = $mainMod, 4, exec, hyprdwm goto 4 +bind = $mainMod, 5, exec, hyprdwm goto 5 +bind = $mainMod, 6, exec, hyprdwm goto 6 +bind = $mainMod, 7, exec, hyprdwm goto 7 +bind = $mainMod, 8, exec, hyprdwm goto 8 +bind = $mainMod, 9, exec, hyprdwm goto 9 +bind = $mainMod, 0, exec, hyprdwm goto 10 + +# Move active window to a workspace with mainMod + SHIFT + [0-9] +bind = $mainMod SHIFT, 1, exec, hyprdwm moveto 1 +bind = $mainMod SHIFT, 2, exec, hyprdwm moveto 2 +bind = $mainMod SHIFT, 3, exec, hyprdwm moveto 3 +bind = $mainMod SHIFT, 4, exec, hyprdwm moveto 4 +bind = $mainMod SHIFT, 5, exec, hyprdwm moveto 5 +bind = $mainMod SHIFT, 6, exec, hyprdwm moveto 6 +bind = $mainMod SHIFT, 7, exec, hyprdwm moveto 7 +bind = $mainMod SHIFT, 8, exec, hyprdwm moveto 8 +bind = $mainMod SHIFT, 9, exec, hyprdwm moveto 9 +bind = $mainMod SHIFT, 9, exec, hyprdwm moveto 10 + +# Moving between monitors +bind = $mainMod, COMMA, movewindow, mon:l +bind = $mainMod, LEFT, movewindow, mon:l +bind = $mainMod, PERIOD, movewindow, mon:r +bind = $mainMod, RIGHT, movewindow, mon:r + +# Scroll through existing workspaces with mainMod + scroll +bind = $mainMod, mouse_down, workspace, e+1 +bind = $mainMod, mouse_up, workspace, e-1 + +# Move/resize windows with mainMod + LMB/RMB and dragging +bindm = $mainMod, mouse:272, movewindow +bindm = $mainMod, mouse:273, resizewindow + +exec-once = swww init # Do this early so the daemon has time to load + +# Set default workspace per monitor +exec-once = hyprctl dispatch focusmonitor 1; hyprctl dispatch exec 'hyprdwm goto 1' +exec-once = hyprctl dispatch focusmonitor 2; hyprctl dispatch exec 'hyprdwm goto 1' +exec-once = hyprctl dispatch focusmonitor 3; hyprctl dispatch exec 'hyprdwm goto 1' + +exec-once = waybar +exec-once = hyprland-autoname-workspaces +exec-once = kanshi +exec-once = sleep 1 && swww img ~/.config/wallpaper + diff --git a/.config/hyprland-autoname-workspaces/config.toml b/.config/hyprland-autoname-workspaces/config.toml new file mode 100644 index 0000000..87afac2 --- /dev/null +++ b/.config/hyprland-autoname-workspaces/config.toml @@ -0,0 +1,103 @@ +version = "1.1.11" + +[format] +# Deduplicate icons if enable. +# A superscripted counter will be added. +# dedup = false +# dedup_inactive_fullscreen = false # dedup more +# window delimiter +delim = "" + +# available formatter: +# {counter_sup} - superscripted count of clients on the workspace, and simple {counter}, {delim} +# {icon}, {client} +# workspace formatter +workspace = "{id}:{delim}{clients}" # {id}, {delim} and {clients} are supported +# workspace_empty = "{id}" # {id}, {delim} and {clients} are supported +# client formatter +# client = "{icon}" +# client_active = "*{icon}*" + +# deduplicate client formatter +# client_fullscreen = "[{icon}]" +# client_dup = "{client}{counter_sup}" +# client_dup_fullscreen = "[{icon}]{delim}{icon}{counter_unfocused}" +# client_dup_active = "*{icon}*{delim}{icon}{counter_unfocused}" + +[class] +# Add your icons mapping +# use double quote the key and the value +# take class name from 'hyprctl clients' +"DEFAULT" = "{class}" +"(?i)Kitty" = " " +"(?i)foot" = " " +"(?i)st" = " " +"[Ff]irefox" = " " +"(?i)slack" = "󰒱 " +"(?i)discord" = "󰙯 " +"(?i)spotify" = " " +"(?i)chromium" = " " +"(?i)emacs" = " " + +# [class_active] +# DEFAULT = "*{icon}*" +# "(?i)ExampleOneTerm" = "{icon}" + +# [initial_class] +# "DEFAULT" = "test" +# "(?i)Kitty" = "term" + +# [initial_class_active] +# "(?i)Kitty" = "*TERM*" + +[title_in_class."(?i)kitty"] +"(?i)neomutt" = "neomutt" + +[title_in_class."(?i)foot"] +"(?i)nvim" = "nvim" +"(?i)neovim" = "neovim" + +# regex captures support is supported +# "emerge: (.+?/.+?)-.*" = "{match1}" + +[title_in_class_active."(?i)firefox"] +"(?i)twitch" = "{icon}" + +# [title_in_initial_class."(?i)kitty"] +# "(?i)neomutt" = "neomutt" + +# [initial_title_in_class."(?i)kitty"] +# "(?i)neomutt" = "neomutt" + +# [initial_title_in_initial_class."(?i)kitty"] +# "(?i)neomutt" = "neomutt" + +# [initial_title."(?i)kitty"] +# "zsh" = "Zsh" + +# [initial_title_active."(?i)kitty"] +# "zsh" = "*Zsh*" + +# Add your applications that need to be exclude +# The key is the class, the value is the title. +# You can put an empty title to exclude based on +# class name only, "" make the job. +[exclude] +"" = "^$" # prevent displaying icon for empty class +"(?i)fcitx" = ".*" # will match all title for fcitx +"(?i)TestApp" = "" # will match all title for TestApp +aProgram = "^$" # will match null title for aProgram +"[Ss]team" = "^(Friends List.*)?$" # will match Steam friends list plus all popups (empty titles) + +[workspaces_name] +0 = "zero" +1 = "one" +2 = "two" +3 = "three" +4 = "four" +5 = "five" +6 = "six" +7 = "seven" +8 = "eight" +9 = "nine" +10 = "ten" diff --git a/.config/kanshi/config b/.config/kanshi/config new file mode 100644 index 0000000..96202ec --- /dev/null +++ b/.config/kanshi/config @@ -0,0 +1,9 @@ +profile default { + output eDP-1 enable position 0,0 +} + +profile dual-monitor-main { + output eDP-1 enable position 0,600 + output DP-3 enable mode 1920x1080@143.856003Hz position 1920,0 +} + diff --git a/.config/waybar/config b/.config/waybar/config new file mode 100644 index 0000000..a1e5d76 --- /dev/null +++ b/.config/waybar/config @@ -0,0 +1,72 @@ +{ + "layer": "top", + "position": "top", + "height": 27, + + "modules-left": ["hyprland/workspaces", "custom/scratch", "hyprland/mode", "hyprland/window"], + "modules-center": [], + "modules-right": ["memory", "network", "pulseaudio", "clock", "tray", "battery"], + + "hyprland/workspaces": { + "disable-scroll": true, + "disable-markup": true, + "format": "{name}" + }, + + "hyprland/window": { + "format": "{}", + "max-length": 150 + }, + + "tray": { + "icon-size": 18, + "spacing": 15 + }, + + "clock": { + "format": "{: %a %b%e  %R}", + "interval": 30 + }, + + "memory": { + "interval": 5, + "format": " {used:0.1f}G/{total:0.1f}G " + }, + + "battery": { + "bat": "BAT0", + "states": { + "full": 99, + "good": 98, + "normal": 98, + "warning": 20, + "critical": 20 + }, + "format": "{icon} {capacity}%", + "format-good": "{icon} {capacity}%", + "format-full": " {capacity}%", + "format-charging": "󰂄 {capacity}%", + "format-icons": ["", "", "", "", ""], + "interval": 30 + }, + + "network": { + "interface": "wlp0s20f3", + "format-wifi": " {essid} ", + "format-disconnected": " ", + "interval": 60 + }, + + "pulseaudio": { + "format": "{icon} {volume}% ", + "format-bluetooth": " {volume}% ", + "format-muted":"婢 Mute ", + "interval": 60, + + "format-icons": { + "default": [""] + }, + + "on-click": "blueman-manager" + } +} diff --git a/.config/waybar/style.css b/.config/waybar/style.css new file mode 100644 index 0000000..39de3b7 --- /dev/null +++ b/.config/waybar/style.css @@ -0,0 +1,78 @@ +* { + font-family: FiraCode Nerd Font, FontAwesome; + font-size: 15px; +} + +window#waybar { + background-color: rgba(0, 0, 0, 0.8); + color: #ffffff; +} + +#window { + color: #ffffff; + padding: 0px 10px 0px 10px; +} + +button:hover { + color: #ffffff; + border-bottom: 3px solid #ffffff; + background: rgba(150, 150, 150, 0.5); + box-shadow: inset 0 -3px #ffffff; +} + +.modules-left { + padding: 0px 0px 0px 0px; +} + +.modules-right { + padding: 0px 5px 0px 0px; +} + + +#custom-scratch { + color: #b8b8b8; + padding: 0px 9px 0px 9px; +} + +#workspaces button { + padding: 0px 11px 0px 11px; + min-width: 1px; + color: #888888; + border: none; + border-radius: 0; +} + +#workspaces button.active { + padding: 0px 11px 0px 11px; + color: #ffffff; + box-shadow: inset 0 -3px #ffffff; +} + +#mode { + background-color: #900000; + color: #ffffff; + padding: 0px 5px 0px 5px; + border: 1px solid #2f343a; +} + +#network, #temperature, #backlight, #pulseudio, #battery { + padding: 0px 15px 0px 15px; +} + +#clock { + margin: 0px 15px 0px 15px; +} + +#tray{ + padding: 0px 8px 0px 5px; + margin: 0px 5px 0px 5px; +} + +#battery.critical { + color: #ff5555; +} + +#network.disconnected { + color: #ff5555; +} + diff --git a/.local/bin/hyprdwm b/.local/bin/hyprdwm new file mode 100755 index 0000000..9e01001 --- /dev/null +++ b/.local/bin/hyprdwm @@ -0,0 +1,32 @@ +#!/usr/bin/env sh +# This is a script aimed at replicating the functionality of DWM where +# there are 9 workspaces per monitor. + +if [ ! "$1" = "goto" ] && [ ! "$1" = "moveto" ]; then + echo "Invalid instruction" + exit 1 +fi + +case $2 in + ''|*[!0-9]*) + echo "Provide a number" + exit 1 + ;; + *) ;; +esac + +monitor="$(hyprctl activeworkspace | grep "monitorID:" | awk '{print $2}')" +workspace="$(($monitor * 10 + $2))" +hyprctl dispatch moveworkspacetomonitor "$workspace" "$monitor" +hyprctl dispatch focusmonitor "$monitor" + +case "$1" in + goto) + hyprctl dispatch workspace "$workspace" + ;; + moveto) + hyprctl dispatch movetoworkspace "$workspace" + ;; + *) ;; +esac + diff --git a/.local/bin/hyprgaps b/.local/bin/hyprgaps new file mode 100755 index 0000000..66af956 --- /dev/null +++ b/.local/bin/hyprgaps @@ -0,0 +1,29 @@ +#!/usr/bin/env sh + +increase=0 +if [ "$1" != "-i" ] && [ "$1" != "-d" ] || [ -z "$2" ]; then + echo "Wrong number of arguments" + exit 1 +else + [ "$1" = "-i" ] && increase=1 +fi + +amount="$2" +curr_out="$(hyprctl -j getoption general:gaps_out | jq '.int')" + +if [ $increase = 1 ]; then + new_out=$(($curr_out + $amount)) +else + new_out=$(($curr_out - $amount)) +fi + +new_in="$(($new_out / 2))" + +if [ $new_out -lt 0 ] || [ $new_in -lt 0 ]; then + new_out=0 + new_in=0 +fi + +hyprctl keyword general:gaps_out "$new_out" +hyprctl keyword general:gaps_in "$new_in" +