#! /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=50x50+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+40 # 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 firefox desktop='^1' #rule Spotify desktop='^5' #rule "Spotify (ad-block)" desktop='^5' #bspc rule -a Spotify:spotify desktop='^󰲥' state=tiled #bspc rule -a '*:spotify' desktop='^3' state=tiled # ############################################################################## # # AUTOSTART APPS # # ############################################################################## #"$HOME"/.scripts/bspwm_setup_monitors & pgrep -x sxhkd >/dev/null || sxhkd & picom -b --experimental-backends & #xfce4-panel --disable-wm-check & "$HOME"/.config/polybar/launch.sh & dunst & # notification daemon run_once unclutter & # Remove mouse when idle nitrogen --force-setter=xinerama --restore & "$HOME"/.scripts/lockscreen-wallpaper & xss-lock -- betterlockscreen -l & # Run polkit daemon if doesn't started. #[ "$(pidof xfce-polkit)" != "" ] || /usr/lib/xfce-polkit/xfce-polkit & /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 & #rm "$HOME"/.cache/dunst.log #rm -r "$HOME"/.cache/dunst/ #rm "$HOME"/.cache/eww-control-center.lock pkill eww eww daemon #eww open notification-popup #"$HOME"/.local/bin/eww open bar & #xdo lower -N eww-bar #"$(which eww)" -c "$HOME"/.config/eww --restart open bar & #pkill hotspots #hotspots & #pkill logs.sh #logs.sh & # Volume and brightness indicator (xob) # Activate virtual environment source "$HOME"/.virtualenvs/bin/activate run_once "$HOME"/.config/xob/launch.sh & ## Deactivate virtual environment deactivate #wmname LG3D # Fixes Java applications #export QT_QPA_PLATFORMTHEME="qt5ct" # Use qt5ct to set Qt theme run_once low-bat-notifier & pkill plank.sh plank.sh & #run_once signal-desktop --start-in-tray & #--use-tray-icon #run_once onboard --not-show-in=DESKTOPS & declare -a restart=(plank flameshot clipit redshift blueman-applet) for i in "${restart[@]}"; do pgrep -x "$i" | xargs kill sleep 0.5 eval "$i" & done if [[ ! $(pidof stalonetray) ]]; then stalonetray & sleep 0.5 xdo hide -N stalonetray touch "/tmp/syshide.lock" fi # ############################################################################## # # CONFIGURATION # # ############################################################################## ## Config PANEL_HEIGHT=30 config top_padding "$PANEL_HEIGHT" config honor_size_hints true config automatic_scheme alternate config initial_polarity second_child config pointer_modifier mod1 #config pointer_modifier mod2 config pointer_action1 move config pointer_action2 resize_side config pointer_action3 resize_corner config focus_follows_pointer false config remove_disabled_monitors true config remove_unplugged_monitors true config merge_overlapping_monitors true config border_width 2 config window_gap 10 config split_ratio 0.52 config borderless_monocle true config gapless_monocle true config swallow_first_click false #config pointer_action1 resize_side #config pointer_action1 resize_corner #config pointer_action3 move config normal_border_color "#404040" config focused_border_color "#000000" config active_border_color "#000000" config presel_feedback_color "#BF616A" #config normal_border_color "#282828" #config active_border_color "#ebdbb2" #config focused_border_color "#fe8019" # ############################################################################## # # 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 pkill -9 title-bar && pkill -9 lemonbar # 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" # Start bspc subscribe in the background bspc subscribe | while read; do if ! pgrep -x "title-bar" >/dev/null; then bash "$HOME/.scripts/title-bar" & fi done & # Remove the lock file when the script exits trap 'rm -f "$lockfile"' EXIT else echo "title-bar is already running." fi fi config external_rules_command ~/.config/bspwm/scripts/external_rules.sh