From 0f5bd0f36535411d583654b3e9cc674737387e96 Mon Sep 17 00:00:00 2001 From: ION606 Date: Wed, 12 Nov 2025 15:07:06 -0500 Subject: [PATCH] added support for multiple monitors --- i3/config | 14 ++++-- i3/main.module | 121 ++++++++++++++++++++++++++++++++++++++++++--- i3/setupScreens.sh | 53 ++++++++++++++++++++ 3 files changed, 177 insertions(+), 11 deletions(-) create mode 100644 i3/setupScreens.sh diff --git a/i3/config b/i3/config index 7720813..e72218a 100644 --- a/i3/config +++ b/i3/config @@ -22,7 +22,12 @@ font pango:monospace 8 # Start XDG autostart .desktop files using dex. See also # https://wiki.archlinux.org/index.php/XDG_Autostart exec --no-startup-id dex --autostart --environment i3 -exec_always --no-startup-id killall -q polybar; polybar -c .config/polybar/main.module & + +# COMMENT THIS IN FOR ONE SCREEN +# exec_always --no-startup-id killall -q polybar; polybar -c .config/polybar/main.module & + +# DELETEME if you change your monitor setup +exec_always --no-startup-id bash /home/ion606/setupScreens.sh # The combination of xss-lock, nm-applet and pactl is a popular choice, so # they are included here as an example. Modify as you see fit. @@ -30,14 +35,15 @@ exec_always --no-startup-id killall -q polybar; polybar -c .config/polybar/main. # xss-lock grabs a logind suspend inhibit lock and will use i3lock to lock the # screen before suspend. Use loginctl lock-session to lock your screen. exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock --nofork +exec_always --no-startup-id dunst # NetworkManager is the most popular way to manage wireless networks on Linux, # and nm-applet is a desktop environment-independent system tray GUI for it. exec --no-startup-id nm-applet exec --no-startup-id /usr/lib/notify-osd/notify-osd & -exec_always feh --bg-fill "$(find /home/ion606/Pictures/astolfo/ -type f | shuf -n 1)" -exec_always picom --config /home/ion606/.config/picom/picom.config +exec_always feh --bg-fill "$(find /home/ion606/Pictures/astolfo/ -type f | shuf -n 1)" +exec_always picom --config /home/ion606/.config/picom/picom.conf exec_always --no-startup-id eww daemon focus_follows_mouse no @@ -53,7 +59,7 @@ bindsym XF86MonBrightnessDown exec brightnessctl set 10%- bindsym XF86MonBrightnessUp exec brightnessctl set +10% -bindsym $mod+Shift+B exec feh --bg-fill "/home/ion606/Pictures/bk.gif" +bindsym $mod+Shift+B exec feh --bg-fill "$(find /home/ion606/Pictures/astolfo/ -type f | shuf -n 1)" # Use Mouse+$mod to drag floating windows to their wanted position floating_modifier $mod diff --git a/i3/main.module b/i3/main.module index 6849c9e..d6495a8 100644 --- a/i3/main.module +++ b/i3/main.module @@ -1,4 +1,5 @@ [bar/example] +monitor = ${env:MONITOR:} width = 100% height = 30 background = #2c2c54 @@ -41,6 +42,9 @@ pseudo-transparency = false [module/i3] type = internal/i3 +index-sort = true +sort-workspaces = true +pin-workspaces = true ws-icon-0 = 1;♚ ws-icon-1 = 2;♛ ws-icon-2 = 3;♜ @@ -123,7 +127,7 @@ label-warn = CPU %percentage%% [module/wifi] type = internal/network -interface = wlo1 +interface = wlan0 interface-type = wireless interval = 3.0 udspeed-minwidth = 5 @@ -237,10 +241,113 @@ ramp-4 = 🌕 [module/battery] -type = custom/script -exec = ~/.config/polybar/scripts/battery_status.sh -interval = 5 +type = internal/battery -; toggle the display mode (percentage vs time remaining) on left-click and refresh the module immediately -click-left = ~/.config/polybar/scripts/toggle_battery_display.sh && polybar-msg hook battery_script 1 -hook-0 = ~/.config/polybar/scripts/battery_status.sh +; This is useful in case the battery never reports 100% charge +; Default: 100 +full-at = 98 + +; format-low once this charge percentage is reached +; Default: 10 +; New in version 3.6.0 +low-at = 20 + +; Use the following command to list batteries and adapters: +; $ ls -1 /sys/class/power_supply/ +battery = BAT1 +adapter = ADP1 + +; If an inotify event haven't been reported in this many +; seconds, manually poll for new values. +; +; Needed as a fallback for systems that don't report events +; on sysfs/procfs. +; +; Disable polling by setting the interval to 0. +; +; Default: 5 +poll-interval = 5 + +; see "man date" for details on how to format the time string +; NOTE: if you want to use syntax tags here you need to use %%{...} +; Default: %H:%M:%S +time-format = %H:%M + +; Available tags: +; (default) +; +; +; +format-charging = ⚡ + +; Available tags: +; (default) +; +; +; +; format-discharging = + +; Available tags: +; (default) +; +; +format-full = + +; Format used when battery level drops to low-at +; If not defined, format-discharging is used instead. +; Available tags: +; +; +; +; +; New in version 3.6.0 +format-low = + +; Available tokens: +; %percentage% (default) - is set to 100 if full-at is reached +; %percentage_raw% +; %time% +; %consumption% (shows current charge rate in watts) +label-charging = %percentage%% + +; Available tokens: +; %percentage% (default) - is set to 100 if full-at is reached +; %percentage_raw% +label-full = %percentage%% ^~^ + +; Available tokens: +; %percentage% (default) - is set to 100 if full-at is reached +; %percentage_raw% +; %time% +; %consumption% (shows current discharge rate in watts) +; New in version 3.6.0 +label-low = BATTERY LOW AT %percentage% + +; Only applies if is used +ramp-capacity-0 =  +ramp-capacity-1 =  +ramp-capacity-2 =  +ramp-capacity-3 =  +ramp-capacity-4 =  + +; Only applies if is used +bar-capacity-width = 10 + +; Only applies if is used +animation-charging-0 =  +animation-charging-1 =  +animation-charging-2 =  +animation-charging-3 =  +animation-charging-4 =  +; Framerate in milliseconds +animation-charging-framerate = 750 + +; Only applies if is used +; New in version 3.6.0 +animation-low-0 = ⚠️ +animation-low-1 = ⚠️ +animation-low-2 = ⚠️ +animation-low-3 =  +animation-low-4 =  +animation-low-5 =  +animation-low-framerate = 600 diff --git a/i3/setupScreens.sh b/i3/setupScreens.sh new file mode 100644 index 0000000..587d2b2 --- /dev/null +++ b/i3/setupScreens.sh @@ -0,0 +1,53 @@ +# get list of connected outputs +outputs=$(xrandr --query | grep " connected" | awk '{print $1}') +current_workspace=$(i3-msg -t get_workspaces | jq -r '.[] | select(.focused==true).name') || 1 + +dp="" +hdmi="" + +for out in $outputs; do + if [[ $out == DisplayPort-* ]]; then + dp="$out" + elif [[ $out == HDMI-* ]]; then + # pick the first HDMI found + if [[ -z $hdmi ]]; then + hdmi="$out" + fi + fi +done + +if [[ -z $dp ]]; then + echo "No DisplayPort output found. Exiting." + exit 1 +fi + +if [[ -z $hdmi ]]; then + echo "No HDMI output found. Using only $dp as primary." + xrandr --output "$dp" --auto --primary + exit 0 +fi + +# both found: apply layout +xrandr --output "$dp" --auto --primary --output "$hdmi" --auto --left-of "$dp" + +# move windows + +# send workspace 1 to HDMI output +i3-msg "workspace 1; move workspace to output $hdmi" + +# move 2,3,4 to DP out +i3-msg "workspace 2; move workspace to output $dp" +i3-msg "workspace 3; move workspace to output $dp" +i3-msg "workspace 4; move workspace to output $dp" + +# polybar +killall -q polybar + +while pgrep -u $UID -x polybar >/dev/null; do sleep 0.1; done + +for m in $(xrandr --query | grep " connected" | cut -d" " -f1); do + MONITOR=$m polybar -c .config/polybar/main.module & +done + +# switch back to the workspace I was on +i3-msg "workspace number $current_workspace" \ No newline at end of file