Add i3 config
This commit is contained in:
223
i3/config
Normal file
223
i3/config
Normal file
@@ -0,0 +1,223 @@
|
||||
# This file has been auto-generated by i3-config-wizard(1).
|
||||
# It will not be overwritten, so edit it as you like.
|
||||
#
|
||||
# Should you change your keyboard layout some time, delete
|
||||
# this file and re-run i3-config-wizard(1).
|
||||
#
|
||||
|
||||
# i3 config file (v4)
|
||||
#
|
||||
# Please see https://i3wm.org/docs/userguide.html for a complete reference!
|
||||
|
||||
set $mod Mod4
|
||||
|
||||
# Font for window titles. Will also be used by the bar unless a different font
|
||||
# is used in the bar {} block below.
|
||||
font pango:monospace 8
|
||||
|
||||
# This font is widely installed, provides lots of unicode glyphs, right-to-left
|
||||
# text rendering and scalability on retina/hidpi displays (thanks to pango).
|
||||
#font pango:DejaVu Sans Mono 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
|
||||
|
||||
# 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.
|
||||
|
||||
# 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 -f --nofork
|
||||
|
||||
# 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
|
||||
|
||||
# Wallpaper rotation script
|
||||
exec --no-startup-id ~/.config/i3/wallpaper-rotate.sh --once
|
||||
exec --no-startup-id ~/.config/i3/wallpaper-rotate.sh --daemon 1800
|
||||
|
||||
# Use pactl to adjust volume in PulseAudio.
|
||||
set $refresh_i3status killall -SIGUSR1 i3status
|
||||
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status
|
||||
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status
|
||||
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
|
||||
bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status
|
||||
|
||||
# Use Mouse+$mod to drag floating windows to their wanted position
|
||||
floating_modifier $mod
|
||||
|
||||
# start a terminal
|
||||
bindsym $mod+Return exec alacritty
|
||||
|
||||
# kill focused window
|
||||
bindsym $mod+Shift+q kill
|
||||
|
||||
# start dmenu (a program launcher)
|
||||
# bindsym $mod+d exec --no-startup-id dmenu_run
|
||||
# A more modern dmenu replacement is rofi:
|
||||
# bindcode $mod+40 exec "rofi -modi drun,run -show drun"
|
||||
# There also is i3-dmenu-desktop which only displays applications shipping a
|
||||
# .desktop file. It is a wrapper around dmenu, so you need that installed.
|
||||
# bindcode $mod+40 exec --no-startup-id i3-dmenu-desktop
|
||||
bindsym $mod+d exec rofi -show run
|
||||
|
||||
# change focus
|
||||
bindsym $mod+j focus left
|
||||
bindsym $mod+k focus down
|
||||
bindsym $mod+l focus up
|
||||
bindsym $mod+odiaeresis focus right
|
||||
|
||||
# alternatively, you can use the cursor keys:
|
||||
bindsym $mod+Left focus left
|
||||
bindsym $mod+Down focus down
|
||||
bindsym $mod+Up focus up
|
||||
bindsym $mod+Right focus right
|
||||
|
||||
# move focused window
|
||||
bindsym $mod+Shift+j move left
|
||||
bindsym $mod+Shift+k move down
|
||||
bindsym $mod+Shift+l move up
|
||||
bindsym $mod+Shift+odiaeresis move right
|
||||
|
||||
# alternatively, you can use the cursor keys:
|
||||
bindsym $mod+Shift+Left move left
|
||||
bindsym $mod+Shift+Down move down
|
||||
bindsym $mod+Shift+Up move up
|
||||
bindsym $mod+Shift+Right move right
|
||||
|
||||
# split in horizontal orientation
|
||||
bindsym $mod+h split h
|
||||
|
||||
# split in vertical orientation
|
||||
bindsym $mod+v split v
|
||||
|
||||
# enter fullscreen mode for the focused container
|
||||
bindsym $mod+f fullscreen toggle
|
||||
|
||||
# change container layout (stacked, tabbed, toggle split)
|
||||
bindsym $mod+s layout stacking
|
||||
bindsym $mod+w layout tabbed
|
||||
bindsym $mod+e layout toggle split
|
||||
|
||||
# toggle tiling / floating
|
||||
bindsym $mod+Shift+space floating toggle
|
||||
|
||||
# change focus between tiling / floating windows
|
||||
bindsym $mod+space focus mode_toggle
|
||||
|
||||
# focus the parent container
|
||||
bindsym $mod+a focus parent
|
||||
|
||||
# focus the child container
|
||||
#bindsym $mod+d focus child
|
||||
|
||||
# Wallpaper controls
|
||||
bindsym $mod+Shift+w exec --no-startup-id ~/.config/i3/wallpaper-rotate.sh --once
|
||||
bindsym $mod+Shift+n exec --no-startup-id ~/.config/i3/wallpaper-rotate.sh --category nature
|
||||
bindsym $mod+Control+s exec --no-startup-id ~/.config/i3/wallpaper-rotate.sh --category space
|
||||
bindsym $mod+Control+c exec --no-startup-id ~/.config/i3/wallpaper-rotate.sh --category cityscape
|
||||
|
||||
# Define names for default workspaces for which we configure key bindings later on.
|
||||
# We use variables to avoid repeating the names in multiple places.
|
||||
set $ws1 "1"
|
||||
set $ws2 "2"
|
||||
set $ws3 "3"
|
||||
set $ws4 "4"
|
||||
set $ws5 "5"
|
||||
set $ws6 "6"
|
||||
set $ws7 "7"
|
||||
set $ws8 "8"
|
||||
set $ws9 "9"
|
||||
set $ws10 "10"
|
||||
|
||||
# switch to workspace
|
||||
bindsym $mod+1 workspace number $ws1
|
||||
bindsym $mod+2 workspace number $ws2
|
||||
bindsym $mod+3 workspace number $ws3
|
||||
bindsym $mod+4 workspace number $ws4
|
||||
bindsym $mod+5 workspace number $ws5
|
||||
bindsym $mod+6 workspace number $ws6
|
||||
bindsym $mod+7 workspace number $ws7
|
||||
bindsym $mod+8 workspace number $ws8
|
||||
bindsym $mod+9 workspace number $ws9
|
||||
bindsym $mod+0 workspace number $ws10
|
||||
|
||||
# move focused container to workspace
|
||||
bindsym $mod+Shift+1 move container to workspace number $ws1
|
||||
bindsym $mod+Shift+2 move container to workspace number $ws2
|
||||
bindsym $mod+Shift+3 move container to workspace number $ws3
|
||||
bindsym $mod+Shift+4 move container to workspace number $ws4
|
||||
bindsym $mod+Shift+5 move container to workspace number $ws5
|
||||
bindsym $mod+Shift+6 move container to workspace number $ws6
|
||||
bindsym $mod+Shift+7 move container to workspace number $ws7
|
||||
bindsym $mod+Shift+8 move container to workspace number $ws8
|
||||
bindsym $mod+Shift+9 move container to workspace number $ws9
|
||||
bindsym $mod+Shift+0 move container to workspace number $ws10
|
||||
|
||||
# reload the configuration file
|
||||
bindsym $mod+Shift+c reload
|
||||
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
|
||||
bindsym $mod+Shift+r restart
|
||||
# exit i3 (logs you out of your X session)
|
||||
bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -B 'Yes, exit i3' 'i3-msg exit'"
|
||||
|
||||
# resize window (you can also use the mouse for that)
|
||||
mode "resize" {
|
||||
# These bindings trigger as soon as you enter the resize mode
|
||||
|
||||
# Pressing left will shrink the window’s width.
|
||||
# Pressing right will grow the window’s width.
|
||||
# Pressing up will shrink the window’s height.
|
||||
# Pressing down will grow the window’s height.
|
||||
bindsym j resize shrink width 10 px or 10 ppt
|
||||
bindsym k resize grow height 10 px or 10 ppt
|
||||
bindsym l resize shrink height 10 px or 10 ppt
|
||||
bindsym odiaeresis resize grow width 10 px or 10 ppt
|
||||
|
||||
# same bindings, but for the arrow keys
|
||||
bindsym Left resize shrink width 10 px or 10 ppt
|
||||
bindsym Down resize grow height 10 px or 10 ppt
|
||||
bindsym Up resize shrink height 10 px or 10 ppt
|
||||
bindsym Right resize grow width 10 px or 10 ppt
|
||||
|
||||
# back to normal: Enter or Escape or $mod+r
|
||||
bindsym Return mode "default"
|
||||
bindsym Escape mode "default"
|
||||
bindsym $mod+r mode "default"
|
||||
}
|
||||
|
||||
bindsym $mod+r mode "resize"
|
||||
|
||||
# Start i3bar to display a workspace bar (plus the system information i3status
|
||||
# finds out, if available)
|
||||
bar {
|
||||
status_command i3status
|
||||
}
|
||||
|
||||
# keybinding to lock screen
|
||||
bindsym Control+Mod1+l exec "i3lock -f -c 000000"
|
||||
|
||||
# keybinding to manually trigger monitor setup
|
||||
bindsym $mod+Shift+m exec "/home/jenlue/.config/i3/monitor-setup.sh"
|
||||
|
||||
# Workspace assignments for multi-monitor setup
|
||||
# Primary monitor (laptop) - workspaces 1-4
|
||||
workspace $ws1 output eDP-1
|
||||
workspace $ws2 output eDP-1
|
||||
workspace $ws3 output eDP-1
|
||||
workspace $ws4 output eDP-1
|
||||
|
||||
# First external monitor - workspaces 5-7
|
||||
workspace $ws5 output DVI-I-2-2
|
||||
workspace $ws6 output DVI-I-2-2
|
||||
workspace $ws7 output DVI-I-2-2
|
||||
|
||||
# Second external monitor - workspaces 8-10
|
||||
workspace $ws8 output DVI-I-1-1
|
||||
workspace $ws9 output DVI-I-1-1
|
||||
workspace $ws10 output DVI-I-1-1
|
||||
|
||||
# Fallback for any monitor if specific ones are disconnected (removed duplicates)
|
||||
|
||||
65
i3/monitor-setup.sh
Executable file
65
i3/monitor-setup.sh
Executable file
@@ -0,0 +1,65 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Monitor setup script for i3wm
|
||||
# This script automatically detects connected monitors and configures them
|
||||
|
||||
# Get the internal display name (usually eDP-1 or LVDS-1)
|
||||
INTERNAL=$(xrandr | grep " connected" | grep -E "(eDP|LVDS)" | cut -d" " -f1)
|
||||
|
||||
# Get external displays
|
||||
EXTERNAL=$(xrandr | grep " connected" | grep -v -E "(eDP|LVDS)" | cut -d" " -f1)
|
||||
|
||||
# If no internal display found, fallback to first connected display
|
||||
if [ -z "$INTERNAL" ]; then
|
||||
INTERNAL=$(xrandr | grep " connected" | head -n1 | cut -d" " -f1)
|
||||
fi
|
||||
|
||||
echo "Internal display: $INTERNAL"
|
||||
echo "External displays: $EXTERNAL"
|
||||
|
||||
# Turn off all displays first
|
||||
xrandr --auto
|
||||
|
||||
# Configure displays based on what's connected
|
||||
if [ -n "$EXTERNAL" ]; then
|
||||
# External monitor(s) connected
|
||||
# Count external monitors
|
||||
EXT_COUNT=$(echo "$EXTERNAL" | wc -l)
|
||||
echo "Found $EXT_COUNT external monitor(s)"
|
||||
|
||||
if [ $EXT_COUNT -eq 1 ]; then
|
||||
# Single external monitor - place to the right
|
||||
ext=$(echo "$EXTERNAL" | head -n1)
|
||||
echo "Configuring single external display: $ext"
|
||||
xrandr --output $INTERNAL --auto --primary --output $ext --auto --right-of $INTERNAL
|
||||
else
|
||||
# Multiple external monitors - chain them
|
||||
echo "Configuring multiple external displays"
|
||||
prev_output=$INTERNAL
|
||||
|
||||
# First, enable the internal display
|
||||
xrandr --output $INTERNAL --auto --primary
|
||||
|
||||
# Then chain each external monitor
|
||||
for ext in $EXTERNAL; do
|
||||
echo "Configuring external display: $ext (right of $prev_output)"
|
||||
xrandr --output $ext --auto --right-of $prev_output
|
||||
prev_output=$ext
|
||||
done
|
||||
fi
|
||||
|
||||
# Restart i3 to refresh workspace assignments
|
||||
i3-msg restart
|
||||
else
|
||||
# Only internal display
|
||||
echo "Only internal display connected"
|
||||
xrandr --output $INTERNAL --auto
|
||||
|
||||
# Turn off any disconnected displays
|
||||
for output in $(xrandr | grep " disconnected" | cut -d" " -f1); do
|
||||
xrandr --output $output --off
|
||||
done
|
||||
fi
|
||||
|
||||
# Refresh i3bar
|
||||
i3-msg reload
|
||||
100
i3/wallpaper-rotate.sh
Executable file
100
i3/wallpaper-rotate.sh
Executable file
@@ -0,0 +1,100 @@
|
||||
#!/bin/bash
|
||||
|
||||
WALLPAPER_DIR="$HOME/.cache/wallpapers"
|
||||
CURRENT_WALLPAPER="$WALLPAPER_DIR/current.jpg"
|
||||
CATEGORIES=("nature" "space" "cityscape")
|
||||
|
||||
mkdir -p "$WALLPAPER_DIR"
|
||||
|
||||
fetch_wallpaper() {
|
||||
local category=$1
|
||||
local temp_file="$WALLPAPER_DIR/temp_${category}_$(date +%s).jpg"
|
||||
|
||||
echo "Fetching $category wallpaper..."
|
||||
|
||||
# Try different image sources
|
||||
local urls=(
|
||||
"https://picsum.photos/1920/1080?random=$(date +%s)"
|
||||
"https://source.unsplash.com/1920x1080/?${category}"
|
||||
)
|
||||
|
||||
for url in "${urls[@]}"; do
|
||||
echo "Trying source..."
|
||||
if wget --timeout=10 --tries=2 -q -O "$temp_file" "$url" 2>/dev/null; then
|
||||
if [[ -f "$temp_file" ]] && [[ $(stat -c%s "$temp_file") -gt 10000 ]]; then
|
||||
mv "$temp_file" "$CURRENT_WALLPAPER"
|
||||
echo "Successfully fetched wallpaper"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
rm -f "$temp_file"
|
||||
done
|
||||
|
||||
echo "Failed to fetch from all sources"
|
||||
return 1
|
||||
}
|
||||
|
||||
set_wallpaper() {
|
||||
if command -v feh >/dev/null 2>&1; then
|
||||
feh --bg-fill "$CURRENT_WALLPAPER"
|
||||
elif command -v nitrogen >/dev/null 2>&1; then
|
||||
nitrogen --set-zoom-fill "$CURRENT_WALLPAPER" --save
|
||||
elif command -v xwallpaper >/dev/null 2>&1; then
|
||||
xwallpaper --zoom "$CURRENT_WALLPAPER"
|
||||
else
|
||||
echo "Error: No wallpaper setter found. Install feh, nitrogen, or xwallpaper."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
rotate_wallpaper() {
|
||||
local random_category=${CATEGORIES[$RANDOM % ${#CATEGORIES[@]}]}
|
||||
|
||||
if fetch_wallpaper "$random_category"; then
|
||||
set_wallpaper
|
||||
echo "Wallpaper set: $random_category theme"
|
||||
else
|
||||
echo "Failed to fetch wallpaper. Keeping current wallpaper."
|
||||
fi
|
||||
}
|
||||
|
||||
cleanup_old_wallpapers() {
|
||||
find "$WALLPAPER_DIR" -name "temp_*.jpg" -mtime +1 -delete 2>/dev/null
|
||||
}
|
||||
|
||||
case "${1:-}" in
|
||||
--once)
|
||||
rotate_wallpaper
|
||||
cleanup_old_wallpapers
|
||||
;;
|
||||
--daemon)
|
||||
INTERVAL=${2:-1800} # Default 30 minutes
|
||||
echo "Starting wallpaper rotation daemon (interval: ${INTERVAL}s)"
|
||||
while true; do
|
||||
rotate_wallpaper
|
||||
cleanup_old_wallpapers
|
||||
sleep "$INTERVAL"
|
||||
done
|
||||
;;
|
||||
--category)
|
||||
if [[ -n "${2:-}" ]]; then
|
||||
if fetch_wallpaper "$2"; then
|
||||
set_wallpaper
|
||||
echo "Wallpaper set: $2 theme"
|
||||
else
|
||||
echo "Failed to fetch $2 wallpaper"
|
||||
fi
|
||||
else
|
||||
echo "Usage: $0 --category <nature|space|cityscape>"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo "Wallpaper Rotation Script"
|
||||
echo "Usage:"
|
||||
echo " $0 --once Rotate wallpaper once"
|
||||
echo " $0 --daemon [seconds] Run as daemon (default: 1800s/30min)"
|
||||
echo " $0 --category <type> Set specific category wallpaper"
|
||||
echo ""
|
||||
echo "Categories: nature, space, cityscape"
|
||||
;;
|
||||
esac
|
||||
Reference in New Issue
Block a user