#! /bin/sh ################################################################################ # ██████╗ ███████╗██████╗ ██╗ ██╗███╗ ███╗ # # ██╔══██╗██╔════╝██╔══██╗██║ ██║████╗ ████║ # # ██████╔╝███████╗██████╔╝██║ █╗ ██║██╔████╔██║ # # ██╔══██╗╚════██║██╔═══╝ ██║███╗██║██║╚██╔╝██║ # # ██████╔╝███████║██║ ╚███╔███╔╝██║ ╚═╝ ██║ # # ╚═════╝ ╚══════╝╚═╝ ╚══╝╚══╝ ╚═╝ ╚═╝ # ################################## By: srdusr ################################## # ############################################################################## # # ENV VARS # # ############################################################################## ## Environments export PATH="${PATH}:${HOME}/.config/bspwm/bin" # Get the name of the primary monitor mainmonitor=$(xrandr --query | awk '/ primary/{print $1}') ## Monitors # If no primary monitor is identified, use the first connected monitor if [ "$mainmonitor" = "" ]; then mainmonitor=$(xrandr --query | awk '/ connected/ {print $1; exit}') fi # Set up workspaces on the primary monitor bspc monitor "$mainmonitor" -d 󰲡 󰲣 󰲥 󰲧 󰲩 #1 2 3 4 5 # Check the number of connected monitors connected_monitors=$(xrandr --query | grep -c " connected") if [ "$connected_monitors" -gt 1 ]; then # Get the name of the secondary monitor (exclude the primary monitor) secondmonitor=$(xrandr --query | awk '/ connected/ && $1 != "'"$mainmonitor"'" {print $1; exit}') # Set up workspaces on the secondary monitor bspc monitor "$secondmonitor" -d 󰲫 󰲭 󰲯 󰲱 󰿭 #6 7 8 9 10 # Check if the secondary monitor is connected and configure the layout if [ "$secondmonitor" != "" ]; then xrandr --output "$mainmonitor" --primary --auto --output "$secondmonitor" --auto --right-of "$mainmonitor" fi fi #INTERNAL_MONITOR="LVDS-1" #EXTERNAL_MONITOR="HDMI-1" ## on first load setup default workspaces #if [[ "$1" = 0 ]]; then # if [[ $(xrandr -q | grep "${EXTERNAL_MONITOR} connected") ]]; then # bspc monitor "$EXTERNAL_MONITOR" -d 1 2 3 4 5 # bspc monitor "$INTERNAL_MONITOR" -d 6 7 8 9 10 # bspc wm -O "$EXTERNAL_MONITOR" "$INTERNAL_MONITOR" # else # bspc monitor "$INTERNAL_MONITOR" -d 1 2 3 4 5 6 7 8 9 10 # fi #fi # ############################################################################## # # FUNCTIONS # # ############################################################################## config() { bspc config "$@" & } rule() { bspc rule -a "$@" & } run_once() { if [ ! "$(pgrep -f "$1")" ]; then "$@" & fi } # ############################################################################## # # WINDOW RULES # # ############################################################################## ## Rules bspc rule -r *:* # remove all rules first rule '*' --one-shot state=below private=border_width:10 #rule '*:Tiled' --one-shot state=tiled rectangle=50x50+0+50 #rule '*' --one-shot state=floating rectangle=1028x374+0+50 #rule \* rectangle=680x700+340+40 rule '*:*:Picture-in-Picture' state=floating sticky=on layer=above rule '*:*:Picture in picture' state=floating sticky=on layer=above rule firefox:Toolkit focus=on state=floating sticky=on layer=above rectangle=400x280+955+475 #320x190+1030+480 #522x316-10+280 rule "https://www.youtube.com - Enhancer for YouTube™ — Mozilla Firefox" state=floating sticky=on layer=above rule Wezterm state=floating rule Zathura state=tiled rule Pavucontrol state=floating rectangle=490x260+862+37 rule Blueman-manager state=floating rectangle=536x420+818+37 #490x260-9+37 rule scratchpad sticky=on state=floating # SCRATCHPAD rule heads-up-display sticky=on state=floating rectangle=360x160+990+35 # Heads Up Display (scratchpad) rule Onboard sticky=on state=floating rectangle=700x205+480-89 # Virtual keyboard rule Plank layer=above border=off rule Protonvpn state=floating rule qBittorrent desktop='^2' rule discord desktop='^4' rule firefox -o desktop=^1 rule stalonetray state=floating manage=off #bspc rule -a Spotify:spotify desktop='^󰲥' state=tiled #bspc rule -a '*:spotify' desktop='^3' state=tiled # ############################################################################## # # AUTOSTART APPS # # ############################################################################## # Clear cache #rm "$HOME"/.cache/dunst.log #rm "$HOME"/.cache/fake_battery_capacity #rm "$HOME"/.cache/eww-calendar.lock #rm "$HOME"/.cache/eww-escreen.lock #rm "$HOME"/.cache/eww-control-center.lock #rm -r "$HOME"/.cache/dunst/ # Autostart applications #"$HOME"/.config/bspwm/scripts/bspwm_setup_monitors & pgrep -x sxhkd > /dev/null || sxhkd & pgrep -x plank > /dev/null || plank & pgrep -x jgmenu > /dev/null || bspc rule -a jgmenu desktop='^H' state=floating hidden=on && jgmenu --hide-on-startup & picom --config "$HOME"/.config/picom/picom.conf & rm "$HOME"/.jgmenu-lockfile "$HOME"/.config/polybar/launch.sh & run_once unclutter & # Remove mouse when idle run_once "$HOME"/.scripts/lockscreen-wallpaper & run_once xss-lock -- betterlockscreen -l & nitrogen --force-setter=xinerama --restore & run_once redshift & run_once low-bat-notifier & pkill persistentQuickUtilities.sh; "$HOME"/.config/bspwm/scripts/persistentQuickUtilities.sh & #xfce4-panel --disable-wm-check & # Start polkit agent #[ "$(pidof xfce-polkit)" != "" ] || /usr/lib/xfce-polkit/xfce-polkit & run_once /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 & # Volume and brightness indicator (xob) source "$HOME"/.virtualenvs/bin/activate # Activate virtual environment run_once "$HOME"/.config/xob/launch.sh & deactivate # Deactivate virtual environment # Eww pkill eww eww daemon xset m 0 0 # Disable mouse drift pgrep -x plank.sh > /dev/null || plank.sh & #wmname LG3D # Fixes Java applications # Solve java apps issues (e.g. JetBrains IDEs like PyCharm, CLion, etc). # #export _JAVA_AWT_WM_NONREPARENTING=1 #export QT_QPA_PLATFORMTHEME="qt5ct" # Use qt5ct to set Qt theme # Start MPD and mpDris2 #exec mpd & #exec mpDris2 & # Systray #run_once signal-desktop --start-in-tray & #--use-tray-icon #run_once onboard --not-show-in=DESKTOPS & if ! pgrep -x "stalonetray" > /dev/null; then stalonetray & fi declare -a restart=(clipit blueman-applet caffeine) for i in "${restart[@]}"; do pgrep -x "$i" | xargs kill sleep 0.5 eval "$i" & done while ! pgrep -x "clipit" > /dev/null || ! pgrep -x "blueman-applet" > /dev/null || ! pgrep -x "caffeine" > /dev/null; do #sleep 0.5 systray & done xdo hide -N stalonetray touch "/tmp/syshide.lock" # ############################################################################## # # CONFIGURATION # # ############################################################################## ## Config PANEL_HEIGHT=24 config top_padding "$PANEL_HEIGHT" config honor_size_hints true config automatic_scheme alternate config initial_polarity second_child config pointer_modifier mod4 config click_to_focus none config pointer_action1 move config pointer_action2 resize_side config pointer_action3 resize_corner config focus_follows_pointer true config remove_disabled_monitors true config remove_unplugged_monitors true config merge_overlapping_monitors true config border_width 4 config border_radius 10 config window_gap 10 config split_ratio 0.52 config borderless_monocle true config gapless_monocle true config swallow_first_click false config normal_border_color "#000000" config focused_border_color "#000000" config active_border_color "#000000" config presel_feedback_color "#BF616A" # ############################################################################## # # MISCELLANEOUS # # ############################################################################## ## Fullscreen bspc subscribe node_state | while read -r _ _ _ _ state flag; do if [[ "$state" != fullscreen ]]; then continue; fi if [[ "$flag" == on ]]; then xdo lower -N Plank #"$(which eww)" -c "$HOME"/.config/eww close-all else xdo raise -N Plank #"$(which eww)" -c "$HOME"/.config/eww open bar fi done & ## Title-bar rm -rf /tmp/title-bar_debug.log rm -rf /tmp/title-bar.lock processes=("title-bar" "update-title" "lemonbar") for process in "${processes[@]}"; do if pidof -q "$process"; then pkill -x "$process" > /dev/null; sleep 0.1 fi done # Check if title-bar is already running if ! pgrep -x "title-bar" >/dev/null; then # Create a lock file lockfile="/tmp/title-bar.lock" # Check if the lock file exists if [ ! -e "$lockfile" ]; then # Create the lock file touch "$lockfile" # Function to handle BSPWM events handle_bspwm_events() { while read; do if ! pgrep -x "title-bar" >/dev/null; then bash "$HOME/.scripts/title-bar" & fi done } # Start bspc subscribe in the background and pass events to the handler function bspc subscribe | handle_bspwm_events & # Remove the lock file when the script exits trap 'rm -f "$lockfile"' EXIT else echo "title-bar is already running." fi fi start_dunst() { # stop dunst if it has been started by any application that called notify-send killall -q dunst # Wait until the processes have been shut down while pgrep -u "$UID" -x dunst >/dev/null; do sleep .05; done while ! pgrep -u "$UID" -x dunst >/dev/null; do sleep .05; done } start_dunst & config external_rules_command ~/.config/bspwm/scripts/external_rules.sh &