Environments

My main/mobile laptop runs Canonical's Ubuntu 20.04 with the i3 window tiling manager. I've been using the Regolith distro, which is a preconfigured with Ubuntu and i3.

In addition to the desktop tiling, I multi-task in Tmux— a terminal "multiplexer"— and edit/write in Vim (now, Neovim). Here you'll find my various dotfile setups and resources for setting up my local environment.


<- Most Recent Unix Vibes



Description:
Reddit r/unixporn submission, multiple screens showing off my i3, Rofi, and Picom configs.



~/.bashrc

Click here to view or copy (not recommended) my full .bashrc file. The items below aren't always up-to-date; but I will try to periodically copy-paste my full bashrc.

1. Pretty Bash Prompt

RCol='\033[0m'
Gre='\033[32m';
Red='\033[31m';
Blu='\033[34m';
Yel='\033[33m';
PS1="${RCol}┌─[\`if [ \$? = 0 ]; then echo "${Gre}"; else echo "${Red}"; fi\`\T\[${Rcol}\] \[${Blu}\]\u@\h\[${RCol}\] \[${Yel}\]\w\[${RCol}\]\$(__git_ps1)]\n└───▶ "

2. Quick and handy server alias

npm install -g browser-sync
export ip4=$(ifdata -pa wlp2s0)
alias serve="browser-sync start -s -f . --no-notify --extensions 'html' --host $ip4 --port 9000"

3. Tmux

alias td='tmux detach'
alias t0='tmux attach -t 0'
alias t1='tmux attach -t 1'
alias t2='tmux attach -t 2'
alias tmain='tmux attach -t main'

4. FFMpeg

alias mkvid='ffmpeg -r 1 -f image2 -pattern_type glob -i "*.png" -vf scale=720:480 -filter:v "crop=in_w:480" -vcodec libx264 -crf 0 -pix_fmt yuv444p test.mp4'
alias convgif='ffmpeg -i test.mp4 -vf scale=iw/2:ih/2 -f gif test.gif'
function mkgif() {
  ffmpeg -pattern_type glob -r 1 -i "$1" -vf "scale='min(640,iw)':'min(480,ih)':force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2" -pix_fmt yuv420p -f gif output.gif
}
export -f mkgif

5. Connected Android phone mirroring

alias android='scrcpy --max-size 1080 --window-x 1920 --window-y 1080 --window-borderless -S'
alias androidF='android --fullscreen'

6. Easy/beautiful low-quality image placeholders (LQIP)

# polygonized lqip image for single file
function poly() {
  if [ ${1##*.} != "gif" ]
    then
      primitive -i $1 -o lqip/${1%.*}-lqip.${1##*.} -r 64 -s 64 -bg 'avg' -n 150 -v
  fi
  if [ ${1##*.} = "gif" ]
    then
      convert "$1[0]" temp.gif
      primitive -i temp.gif -o lqip/${1%.*}-lqip.jpg -bg 'avg' -r 64 -s 64 -n 150 -v
      rm temp.gif
  fi
}
export -f poly
# polygonized lqip images for all image in a directory
polyAll () {
  for image in *;
    do
      poly "$image"
  done
}
export -f polyAll

7. RONO - Rofi Notes

bindsym $mod+s exec rofi_notes.sh -a 'Daniel Tompkins' -e 'nvim' -l "AirlineTheme ayu_mirage" -o "$HOME/.scratch/"

#!/bin/bash

while getopts ":a:e:l:o:" opt; do
  case $opt in
    a) AUTHOR="$OPTARG"
    ;;
    e) EDITOR="$OPTARG"
    ;;
    l) LOOK="$OPTARG"
    ;;
    o) NOTES_FOLDER="$OPTARG"
    ;;
    \?) echo "Invalid option -$OPTARG" >&2
    ;;
  esac
done

if [[ ! -d "${NOTES_FOLDER}" ]]; then
    mkdir -p "$NOTES_FOLDER"
fi

get_notes() {
    ls "${NOTES_FOLDER}"
}

edit_note() {
    note_location=$1
    alacritty -t 'alacritty-floating' -e $EDITOR -c "${LOOK}" "$note_location"
}

delete_note() {
    local note=$1
    local action=$(echo -e "yes\nno" | rofi -dmenu -p "Are you sure you want to delete $note? ")

    case $action in
        "yes")
            rm "$NOTES_FOLDER/$note"
            main
            ;;
        "no")
            main
    esac
}

note_context() {
    local note=$1
    local note_location="$NOTES_FOLDER/$note"
    local action=$(echo -e "edit\ndelete" | rofi -dmenu -p "$note ")
    case $action in
        "edit")
            edit_note "$note_location"
            ;;
        "delete")
            delete_note "$note"

    esac
}

new_note() {
    local title=$(echo -e "cancel" | rofi -dmenu -p "input title ")

    case "$title" in
        "cancel")
            main
            ;;
        *)
            local file=$(echo "$title" | sed 's/ /_/g;s/\(.*\)/\L\1/g')
            local template=$(cat <<- END
---
title: $title
date: $(date --rfc-3339=seconds)
author: $AUTHOR
---

# $title
END
            )

            note_location="$NOTES_FOLDER/$file.md"
            if [ "$title" != "" ]; then
                echo "$template" > "$note_location" | edit_note "$note_location"
            fi
            ;;
    esac
}

main()
{
    local all_notes="$(get_notes)"
    local first_menu="NEW"

    if [ "$all_notes" ];then
        first_menu="NEW\n${all_notes}"
    fi

    local note=$(echo -e "$first_menu"  | rofi -dmenu -p "notes ")

    case $note in
        "NEW")
            new_note
            ;;
        "")
            ;;
        *)
            note_context "$note"
    esac
}


main

8. Emacs and Vi modes

set -o vi


~/.config/alacritty/alacritty.yaml

Click here to view or copy (not recommended) my full alacritty.yaml file

~/.vimrc

Click here to view or copy (not recommended) my full .vimrc file

1. Vimwiki settings

let g:vimwiki_list = [{'path': '~/vimwiki/',
      \ 'syntax': 'markdown',
      \ 'template_path': '~/vimwiki/templates/',
      \ 'template_default': 'default',
      \ 'ext': '.md',
      \ 'path_html': '/var/www/l-o-o-s-e-d/html/knowledge-base/',
      \ 'custom_wiki2html': 'vimwiki_markdown',
      \ 'template_ext': '.tpl'}]

2. Toggle wrap in vim

noremap <silent> <Leader>tw :call ToggleWrap()<CR>
function ToggleWrap()
  if &wrap
    echo "Wrap OFF"
    setlocal nowrap
    set virtualedit=all
    silent! nunmap <buffer> <Up>
    silent! nunmap <buffer> <Down>
    silent! nunmap <buffer> <Home>
    silent! nunmap <buffer> <End>
    silent! iunmap <buffer> <Up>
    silent! iunmap <buffer> <Down>
    silent! iunmap <buffer> <Home>
    silent! iunmap <buffer> <End>
  else
    echo "Wrap ON"
    setlocal wrap linebreak nolist
    set virtualedit=
    setlocal display+=lastline
    noremap  <buffer> <silent> <Up>   gk
    noremap  <buffer> <silent> <Down> gj
    noremap  <buffer> <silent> <Home> g<Home>
    noremap  <buffer> <silent> <End>  g<End>
    inoremap <buffer> <silent> <Up>   <C-o>gk
    inoremap <buffer> <silent> <Down> <C-o>gj
    inoremap <buffer> <silent> <Home> <C-o>g<Home>
    inoremap <buffer> <silent> <End>  <C-o>g<End>
  endif
endfunction

3. vim-airline plugin settings

let g:airline_powerline_fonts=1
let g:airline#extensions#tabline#enabled=1
let g:airline_theme='luna'

You might also checkout Lightline:

let g:lightline = {
\ 'colorscheme' : 'seoul256'
\ }

4. Other loaded plugins

call plug#begin('~/.vim/plugged')
Plug 'vimwiki/vimwiki'
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'edkolev/tmuxline.vim'
Plug 'junegunn/goyo.vim'
Plug 'scrooloose/nerdtree'
Plug 'inkarkat/vim-SpellCheck'
Plug 'inkarkat/vim-ingo-library'
Plug 'etdev/vim-hexcolor'
Plug 'chrisbra/Colorizer'
Plug 'junegunn/vim-emoji'
Plug 'vim-scripts/AutoComplPop'
call plug#end()

5. Vim color-schemes

Checkout ~/.vim/colors for some awesome .vim color-schemes to spruce up your edits!


~/.tmux.conf

1. My full tmux configuration file:

# Colored tmux
set -g default-terminal "tmux-256color"
set -g default-shell "/bin/bash"
set -g terminal-overrides ',xterm-256color:RGB'

set -g set-titles on
set -g set-titles-string "#T"
set -g escape-time 10
set -g focus-events on
# Set window notifications
set -g monitor-activity on
set -g visual-activity on

set -g history-limit 5000
set -g mouse on

bind c new-window -c "#{pane_current_path}"
bind '"' split-window -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"

set-option -g status-position bottom
set-option -g status on
set-option -g status-interval 1

# Vim-like pane resizing (press Ctrl+h,j,k,l).
bind -n C-h resize-pane -L 10
bind -n C-j resize-pane -D 5
bind -n C-k resize-pane -U 5
bind -n C-l resize-pane -R 10
# Vim-like pane navigation (press Alt+h,j,k,l).
bind -n M-h select-pane -L
bind -n M-j select-pane -D
bind -n M-k select-pane -U
bind -n M-l select-pane -R

# Tmuxline (to look beautiful)
source /home/dan/tmuxline

# List of plugins
# NOTE: make sure tpm is installed
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-sidebar'
set -g @plugin 'tmux-plugins/tmux-battery'

# Other examples:
# set -g @plugin 'github_username/plugin_name'
# set -g @plugin 'git@github.com:user/plugin'
# set -g @plugin 'git@bitbucket.com:user/plugin'

# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'

2. tmuxline file source

# This tmux statusbar config was created by tmuxline.vim
# on Mon, 19 Oct 2021
set -g @batt_icon_charge_tier1 '🌑'
set -g @batt_icon_charge_tier2 '🌘'
set -g @batt_icon_charge_tier3 '🌘'
set -g @batt_icon_charge_tier4 '🌗'
set -g @batt_icon_charge_tier5 '🌗'
set -g @batt_icon_charge_tier6 '🌖'
set -g @batt_icon_charge_tier7 '🌖'
set -g @batt_icon_charge_tier8 '🌕'
set -g @batt_color_status_primary_charged '#000000'
set -g @batt_color_status_primary_charging '#000000'

set -g status "on"
set -g status-justify "left"
set -g status-style "none,bg=colour000"
set -g status-left-style "none"
set -g status-left-length "100"
set -g status-right-style "none"
set -g status-right-length "100"
set -g pane-border-style "fg=colour235,bg=colour000"
set -g pane-active-border-style "fg=colour230,bg=colour000"
set -g message-style "fg=colour230,bg=colour000"
set -g message-command-style "fg=colour230,bg=colour000"
setw -g window-status-activity-style "none"
setw -g window-status-separator ""
setw -g window-status-style "none,fg=colour230,bg=colour000"
set -g status-left "#[fg=colour230,bg=colour000,bold] #S  #[fg=colour000,bg=colour230,nobold,nounderscore,noitalics]"
set -g status-right "#[fg=colour000,bg=colour230] #[fg=colour000,bg=colour230] %I:%M%p | %m/%d/%Y #[fg=colour230,bg=default,bold,nounderscore,noitalics] #[fg=colour230,bg=default]  #h     #{battery_percentage} #{battery_icon}  "
setw -g window-status-format "#[fg=colour230,bg=colour235] #I #[fg=colour230,bg=colour235] #W "
setw -g window-status-current-format "#[fg=colour230,bg=colour000]#[fg=colour230,bg=colour000] #W #[fg=colour000,bg=colour230]#[fg=colour230,bg=colour000]"

Alt1:

# This tmux statusbar config was created by tmuxline.vim
# on Mon, 19 Oct 2021
set -g @batt_icon_charge_tier1 '🌑'
set -g @batt_icon_charge_tier2 '🌘'
set -g @batt_icon_charge_tier3 '🌘'
set -g @batt_icon_charge_tier4 '🌗'
set -g @batt_icon_charge_tier5 '🌗'
set -g @batt_icon_charge_tier6 '🌖'
set -g @batt_icon_charge_tier7 '🌖'
set -g @batt_icon_charge_tier8 '🌕'
set -g @batt_color_status_primary_charged '#000000'
set -g @batt_color_status_primary_charging '#000000'

set -g status "on"
set -g status-justify "left"
set -g status-style "none,bg=default"
set -g status-left-style "none"
set -g status-left-length "100"
set -g status-right-style "none"
set -g status-right-length "100"
set -g pane-border-style "fg=brightwhite,bg=default"
set -g pane-active-border-style "fg=brightwhite,bg=default"
set -g pane-border-status bottom
set -g pane-border-format ""
set -g message-style "fg=brightwhite,bg=default"
set -g message-command-style "fg=brightwhite,bg=default"
setw -g window-status-activity-style "none"
setw -g window-status-separator ""
setw -g window-status-style "none,fg=brightwhite,bg=default"
set -g status-left "#[fg=brightwhite,bg=default,bold]#S #[fg=brightwhite,bg=default,nobold,nounderscore,noitalics]"
set -g status-right "#[fg=red,bg=default]  #[fg=brightwhite,bg=default]%I:%M%p #[fg=brightgreen,bg=default]•#[fg=brightwhite,bg=default] %m/%d/%Y #[fg=brightgreen,bg=default,bold,nounderscore,noitalics] #[fg=brightwhite,bg=default]#h #[fg=brightgreen,bg=default] #[fg=brightwhite,bg=default] #{battery_percentage} #{battery_icon} "
setw -g window-status-format "#[fg=brightwhite,bg=default] #I #[fg=brightwhite,bg=default] #W "
setw -g window-status-current-format "#[fg=brightgreen,bg=default]#[fg=brightwhite,bg=default] #W #[fg=brightgreen,bg=default]"

Alt2:

# This tmux statusbar config was created by tmuxline.vim
# on Mon, 04 Jan 2021
set -g @batt_icon_charge_tier8 '🌕'
set -g @batt_icon_charge_tier7 '🌖'
set -g @batt_icon_charge_tier6 '🌖'
set -g @batt_icon_charge_tier5 '🌗'
set -g @batt_icon_charge_tier4 '🌗'
set -g @batt_icon_charge_tier3 '🌘'
set -g @batt_icon_charge_tier2 '🌘'
set -g @batt_icon_charge_tier1 '🌑'
set -g @batt_color_status_primary_charged '#3daee9'
set -g @batt_color_status_primary_charging '#3daee9'
set -g status-justify "left"
set -g status "on"
set -g status-left-style "none"
set -g message-command-style "fg=colour222,bg=colour235"
set -g status-right-style "none"
set -g pane-active-border-style "fg=colour222"
set -g status-style "none,bg=colour235"
set -g message-style "fg=colour222,bg=colour235"
set -g pane-border-style "fg=colour235"
set -g status-right-length "100"
set -g status-left-length "100"
setw -g window-status-activity-style "none"
setw -g window-status-separator ""
setw -g window-status-style "none,fg=colour222,bg=colour235"
set -g status-left "#[fg=colour235,bg=colour222,none] #S #[fg=colour222,bg=colour235,nobold,nounderscore,noitalics]"
set -g status-right "#[fg=colour235,bg=colour235,nobold,nounderscore,noitalics]#[fg=colour222,bg=colour235] %m/%d/%Y  #{battery_percentage} #{battery_icon}  %I:%M #[fg=colour222,bg=colour235,nobold,nounderscore,noitalics]#[fg=colour235,bg=colour222] #h "
setw -g window-status-format "#[fg=colour222,bg=colour235] #I #[fg=colour222,bg=colour235] #W "
setw -g window-status-current-format "#[fg=colour235,bg=colour235,nobold,nounderscore,noitalics]#[fg=colour222,bg=colour235,none] #I #[fg=colour222,bg=colour235,none] #W #[fg=colour235,bg=colour235,nobold,nounderscore,noitalics]"

rofi.rasi

Rofi is a customizable navigation interface. It can fuzzy-find apps, emojis, notifications and more. The configuration below provides a floating, semi-transparent rofi window. It requires the Compton compositor for transparency and background-blur.

Click here to copy the full config.

/* global settings and color variables */
* {
  white:            #cccccc;
  blue:             #a6e1ff;
  darkblue:         #B48EAD;
  cyan:             #95e6cb;
  lightcyan:        #11d1a1;
  green:            #33bd91;
  red:              #ff6666;

  dark1:            #00000088;
  dark2:            #00000000;

  accent:           #C0A0FF;

  background-color: @dark2;
  background-alt:   @dark1;
  border-color:     @dark2;
  text-color:       @white;
  dark-text-color:  @white;
  main-color:       @white;
  highlight:        @accent;
  urgent-color:     @red;
  selected-color:   @accent;
}

window {
  background-color: @background-alt;
  width:            640px;
  transparency:     "real";
  fullscreen:       false;
  border:           none;
  border-radius:    0 0 5px 5px;
  padding:          0 0 10px 0;
  border-color:     @border-color;
}

mainbox {
  background-color: @background-color;
  spacing:          0px;
}

message {
  background-color: @background-color;
}

textbox {
  text-color:       @text-color;
  background-color: @background-color;
}

listview {
  fixed-height:     true;
  dynamic:          true;
  scrollbar:        false;
  spacing:          5px;
  padding:          1px 0px 0px 0px;
  margin:           0px 0px 1px 0px;
  background:       @background-color;
  text-color:       @dark-text-color;
}

element {
  border-radius:    5px;
  padding:          10px;
  margin:           5px 7.5px 0 7.5px;
}

element normal.normal {
  padding:          0px 15px;
  background-color: @background-color;
  text-color:       @dark-text-color;
}

element normal.urgent {
  background-color: @background-color;
  text-color:       @urgent-color;
}

element normal.active {
  background-color: @background-alt;
  text-color:       @main-color;
}

element selected.normal {
  background-color: @background-alt;
  text-color:       @selected-color;
}

element selected.urgent {
  background-color: @urgent-color;
  text-color:       @background-color;
}

element selected.active {
  background-color: @background-alt;
  text-color:       @highlight;
}

element alternate.normal {
  background-color: @background-color;
  text-color:       @dark-text-color;
}

element alternate.urgent {
  background-color: @background-color;
  text-color:       @urgent-color;
}

element alternate.active {
  background-color: @background-color;
  text-color:       @main-color;
}

scrollbar {
  background-color: @background-color;
  handle-color:     @background-color;
  handle-width:     0px;
}

mode-switcher {
  background-color: @background-color;
}

button {
  background-color: @background-color;
  text-color:       @text-color;
}

button selected {
  text-color:       @main-color;
}

inputbar {
  background-color: @background-color;
  spacing:          0px;
  children:         [ prompt,textbox-prompt-colon,entry,case-indicator ];
}

prompt {
  padding:          15px;
  background-color: @background-alt;
  text-color:       @highlight;
}

entry {
  padding:          15px;
  background-color: @background-alt;
  text-color:       @text-color;
}

case-indicator {
  padding:          15px;
  text-color:       @main-color;
  background-color: @background-alt;
}

#textbox-prompt-colon {
    padding:          15px;
  expand:           false;
  str:              "->";
  text-color:       @highlight;
  background-color: @background-alt;
}

set $mod Mod4

new_window pixel 1
new_float normal

hide_edge_borders none

bindsym $mod+u border none
bindsym $mod+y border pixel 1
bindsym $mod+n border normal

font xft:URWGothic-Book 11

floating_modifier $mod

bindsym $mod+Return exec i3-sensible-terminal

# Window kill command
bindsym $mod+Shift+q kill

# start program launcher
bindsym $mod+d exec --no-startup-id rofi -show run

# change focus
bindsym $mod+j focus left
bindsym $mod+k focus down
bindsym $mod+l focus up
bindsym $mod+semicolon focus right

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+semicolon move right

bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right

# workspace back and forth (with/without active container)
workspace_auto_back_and_forth yes
bindsym $mod+b workspace back_and_forth
bindsym $mod+Shift+b move container to workspace back_and_forth; workspace back_and_forth

# split orientation
bindsym $mod+h split h;exec notify-send 'tile horizontally'
bindsym $mod+v split v;exec notify-send 'tile vertically'
bindsym $mod+q split toggle

# toggle 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

# toggle sticky
bindsym $mod+Shift+s sticky toggle

# focus the parent container
bindsym $mod+a focus parent

# move the currently focused window to the scratchpad
bindsym $mod+Shift+minus move scratchpad

# Show the next scratchpad window or hide the focused scratchpad window.
# If there are multiple scratchpad windows, this command cycles through them.
bindsym $mod+minus scratchpad show

# navigate workspaces next / previous
bindsym $mod+Ctrl+Right workspace next
bindsym $mod+Ctrl+Left workspace prev

# workspaces
set $ws1 1
set $ws2 2
set $ws3 3
set $ws4 4
set $ws5 5
set $ws6 6
set $ws7 7
set $ws8 8

# switch to workspace
bindsym $mod+1 workspace $ws1
bindsym $mod+2 workspace $ws2
bindsym $mod+3 workspace $ws3
bindsym $mod+4 workspace $ws4
bindsym $mod+5 workspace $ws5
bindsym $mod+6 workspace $ws6
bindsym $mod+7 workspace $ws7
bindsym $mod+8 workspace $ws8

# Move focused container to workspace
bindsym $mod+Ctrl+1 move container to workspace $ws1
bindsym $mod+Ctrl+2 move container to workspace $ws2
bindsym $mod+Ctrl+3 move container to workspace $ws3
bindsym $mod+Ctrl+4 move container to workspace $ws4
bindsym $mod+Ctrl+5 move container to workspace $ws5
bindsym $mod+Ctrl+6 move container to workspace $ws6
bindsym $mod+Ctrl+7 move container to workspace $ws7
bindsym $mod+Ctrl+8 move container to workspace $ws8

# Move to workspace with focused container
bindsym $mod+Shift+1 move container to workspace $ws1; workspace $ws1
bindsym $mod+Shift+2 move container to workspace $ws2; workspace $ws2
bindsym $mod+Shift+3 move container to workspace $ws3; workspace $ws3
bindsym $mod+Shift+4 move container to workspace $ws4; workspace $ws4
bindsym $mod+Shift+5 move container to workspace $ws5; workspace $ws5
bindsym $mod+Shift+6 move container to workspace $ws6; workspace $ws6
bindsym $mod+Shift+7 move container to workspace $ws7; workspace $ws7
bindsym $mod+Shift+8 move container to workspace $ws8; workspace $ws8

# Open specific applications in floating mode
for_window [title="alsamixer"] floating enable border pixel 1
for_window [class="Calamares"] floating enable border normal
for_window [class="Clipgrab"] floating enable
for_window [title="File Transfer*"] floating enable
for_window [class="Galculator"] floating enable border pixel 1
for_window [class="GParted"] floating enable border normal
for_window [title="i3_help"] floating enable sticky enable border normal
for_window [class="Lightdm-gtk-greeter-settings"] floating enable
for_window [class="Lxappearance"] floating enable sticky enable border normal
for_window [title="MuseScore: Play Panel"] floating enable
for_window [class="Nitrogen"] floating enable sticky enable border normal
for_window [class="Oblogout"] fullscreen enable
for_window [class="octopi"] floating enable
for_window [title="About Pale Moon"] floating enable
for_window [class="Pamac-manager"] floating enable
for_window [class="Pavucontrol"] floating enable
for_window [class="qt5ct"] floating enable sticky enable border normal
for_window [class="Qtconfig-qt4"] floating enable sticky enable border normal
for_window [class="Simple-scan"] floating enable border normal
for_window [class="(?i)System-config-printer.py"] floating enable border normal
for_window [class="Thus"] floating enable border normal
for_window [class="Timeset-gui"] floating enable border normal
for_window [class="(?i)virtualbox"] floating enable border normal
for_window [class="Xfburn"] floating enable

# switch to workspace with urgent window automatically
for_window [urgent=latest] focus

# 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'"

# Set shut down, restart and locking features
bindsym $mod+0 mode "$mode_system"
set $mode_system (l)ock, (e)xit, switch_(u)ser, (s)uspend, (h)ibernate, (r)eboot, (Shift+s)hutdown
mode "$mode_system" {
    bindsym l exec --no-startup-id i3exit lock, mode "default"
    bindsym s exec --no-startup-id i3exit suspend, mode "default"
    bindsym u exec --no-startup-id i3exit switch_user, mode "default"
    bindsym e exec --no-startup-id i3exit logout, mode "default"
    bindsym h exec --no-startup-id i3exit hibernate, mode "default"
    bindsym r exec --no-startup-id i3exit reboot, mode "default"
    bindsym Shift+s exec --no-startup-id i3exit shutdown, mode "default"

    # exit system mode: "Enter" or "Escape"
    bindsym Return mode "default"
    bindsym Escape mode "default"
}

# Resize window (you can also use the mouse for that)
bindsym $mod+r mode "resize"
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 5 px or 5 ppt
        bindsym k resize grow height 5 px or 5 ppt
        bindsym l resize shrink height 5 px or 5 ppt
        bindsym semicolon resize grow width 5 px or 5 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

        # exit resize mode: Enter or Escape
        bindsym Return mode "default"
        bindsym Escape mode "default"
}

# Autostart applications
exec --no-startup-id nitrogen --restore; sleep 1; compton -b
exec --no-startup-id nm-applet
# exec --no-startup-id xfce4-power-manager
exec --no-startup-id pamac-tray
exec --no-startup-id clipit
exec_always --no-startup-id ff-theme-util
exec_always --no-startup-id fix_xcursor
exec_always --no-startup-id $HOME/.config/polybar/i3wmthemer_bar_launch.sh

# Theme colors
client.focused #56737a #1e1e20 #56737a #56737a #56737a
client.focused_inactive #56737a #1e1e20 #56737a #2c5159 #2c5159
client.unfocused #56737a #1e1e20 #56737a #2c5159 #2c5159
client.urgent #56737a #1e1e20 #56737a #2c5159 #2c5159
client.placeholder #56737a #1e1e20 #56737a #2c5159 #2c5159

client.background #1e1e20

# Gaps
gaps inner 10
gaps outer -4

smart_gaps on

# Press $mod+Shift+g to enter the gap mode. Choose o or i for modifying outer/inner gaps. Press one of + / - (in-/decrement for current workspace) or 0 (remove gaps for current workspace). If you also press Shift with these keys, the change will be global for all workspaces.
set $mode_gaps Gaps: (o) outer, (i) inner
set $mode_gaps_outer Outer Gaps: +|-|0 (local), Shift + +|-|0 (global)
set $mode_gaps_inner Inner Gaps: +|-|0 (local), Shift + +|-|0 (global)
bindsym $mod+Shift+g mode "$mode_gaps"

mode "$mode_gaps" {
        bindsym o      mode "$mode_gaps_outer"
        bindsym i      mode "$mode_gaps_inner"
        bindsym Return mode "default"
        bindsym Escape mode "default"
}
mode "$mode_gaps_inner" {
        bindsym plus  gaps inner current plus 5
        bindsym minus gaps inner current minus 5
        bindsym 0     gaps inner current set 0

        bindsym Shift+plus  gaps inner all plus 5
        bindsym Shift+minus gaps inner all minus 5
        bindsym Shift+0     gaps inner all set 0

        bindsym Return mode "default"
        bindsym Escape mode "default"
}
mode "$mode_gaps_outer" {
        bindsym plus  gaps outer current plus 5
        bindsym minus gaps outer current minus 5
        bindsym 0     gaps outer current set 0

        bindsym Shift+plus  gaps outer all plus 5
        bindsym Shift+minus gaps outer all minus 5
        bindsym Shift+0     gaps outer all set 0

        bindsym Return mode "default"
        bindsym Escape mode "default"
}

# set power-manager and volume control
exec --no-startup-id mate-power-manager

bindsym XF86AudioRaiseVolume exec --no-startup-id amixer -D pulse sset Master 5%+ unmute
bindsym XF86AudioLowerVolume exec --no-startup-id amixer -D pulse sset Master 5%- unmute
bindsym XF86AudioMute exec --no-startup-id amixer -D pulse sset Master toggle

# touchpad on and off controller on laptop with Fn+<touchpad control functional key>
bindsym XF86TouchpadOn exec --no-startup-id synclient Touchpadoff=0
bindsym XF86TouchpadOff exec --no-startup-id synclient Touchpadoff=1

~/.config/i3/config

Click here to view or copy my full i3 config.

1. This is a config file for i3-radius

Some parts won't work if using with i3 or i3-gaps. Use the Picom compositor for cleaner rounded corners.

###############################################################################
# i3-gaps config file for the Regolith Desktop Environment
#
# Please see http://i3wm.org/docs/userguide.html for a complete reference!
#
###############################################################################
#
# In this config file many values are taken from Xresources with the directive
# set_from_resource:
#
# set_from_resource <i3 variable name> <Xresources key> <default value>
#
# This configuration file utilizes Xresource variables to change configuration
# without having to make a copy of this config file.
# The benefit to not copying this file is easier upgrades in the future.
# To update a value in this config without making a copy, update the Xresource
# value in the file ~/.config/regolith/Xresources.
#
# For example, to change the bar position to the top of the screen this is the
# i3 config entry in this file:
# set_from_resource $i3-wm.bar.position i3-wm.bar.position bottom
#
# So add this line to ~/.config/regolith/Xresources to change it's value:
# i3-wm.bar.position: top
#
# Reload i3 after making Xresource changes.  Learn more at
# https://regolith-linux.org/docs/howto/override-xres/
#
###############################################################################
#
# This file uses a machine-parsable format for comments. The schema is:
# ## <Category> // <Action> // <Keybinding> ##
# Learn more at https://github.com/regolith-linux/remontoire
#
###############################################################################

###############################################################################
# Key Mappings
###############################################################################

# Meta Key - Alt key is Mod1, and Windows key is Mod4
set_from_resource $mod  i3-wm.mod Mod4
set_from_resource $alt  i3-wm.alt Mod1

set_from_resource $i3-wm.binding. i3-wm.binding.

###############################################################################
# Custom Mappings and Settings
###############################################################################

for_window [class="^.*"] border pixel 0
smart_borders on
smart_borders no_gaps
border_radius 7

bindsym $mod+Shift+o exec alacritty -t 'alacritty-floating' -e td --interactive
bindsym $mod+s exec rofi_notes.sh -a 'Daniel Tompkins' -e 'nvim' -l "colo duotone-dark | AirlineTheme hybrid" -o "$HOME/.scratch/"
bindsym $mod+Shift+s exec alacritty -t 'alacritty-floating' -e nvim -c "colo duotone-dark | AirlineTheme hybrid | startinsert" scratchpad
for_window [title="^alacritty-floating$"] floating enable, move position center
bindsym $mod+Ctrl+o exec sm _ --foreground="#c02907" --background="#222222" -n "JetBrainsMono Nerd Font" -a 0
bindsym $mod+Shift+i exec i3-msg open
bindsym $mod+y fullscreen disable; floating enable; resize set 300 200; sticky enable; move window to position 11 11

###############################################################################
# Workspace Names
# These are the labels which define each i3 workspace.
###############################################################################

set_from_resource $ws1  i3-wm.workspace.01.name "1"
set_from_resource $ws2  i3-wm.workspace.02.name "2"
set_from_resource $ws3  i3-wm.workspace.03.name "3"
set_from_resource $ws4  i3-wm.workspace.04.name "4"
set_from_resource $ws5  i3-wm.workspace.05.name "5"
set_from_resource $ws6  i3-wm.workspace.06.name "6"
set_from_resource $ws7  i3-wm.workspace.07.name "7"
set_from_resource $ws8  i3-wm.workspace.08.name "8"
set_from_resource $ws9  i3-wm.workspace.09.name "9"
set_from_resource $ws10 i3-wm.workspace.10.name "10"
set_from_resource $ws11 i3-wm.workspace.11.name "11"
set_from_resource $ws12 i3-wm.workspace.12.name "12"
set_from_resource $ws13 i3-wm.workspace.13.name "13"
set_from_resource $ws14 i3-wm.workspace.14.name "14"
set_from_resource $ws15 i3-wm.workspace.15.name "15"
set_from_resource $ws16 i3-wm.workspace.16.name "16"
set_from_resource $ws17 i3-wm.workspace.17.name "17"
set_from_resource $ws18 i3-wm.workspace.18.name "18"
set_from_resource $ws19 i3-wm.workspace.19.name "19"

###############################################################################
# Workspace Keys
# These are the keys which will be used while binding workspace switching
###############################################################################

set_from_resource $ws1_key  i3-wm.workspace.01.key 1
set_from_resource $ws2_key  i3-wm.workspace.02.key 2
set_from_resource $ws3_key  i3-wm.workspace.03.key 3
set_from_resource $ws4_key  i3-wm.workspace.04.key 4
set_from_resource $ws5_key  i3-wm.workspace.05.key 5
set_from_resource $ws6_key  i3-wm.workspace.06.key 6
set_from_resource $ws7_key  i3-wm.workspace.07.key 7
set_from_resource $ws8_key  i3-wm.workspace.08.key 8
set_from_resource $ws9_key  i3-wm.workspace.09.key 9
set_from_resource $ws10_key i3-wm.workspace.10.key 0

###############################################################################
# Launcher dialogs
###############################################################################

## Launch // Terminal // <> Enter ##
set_from_resource $i3-wm.binding.terminal i3-wm.binding.terminal Return
bindsym $mod+$i3-wm.binding.terminal exec /usr/bin/x-terminal-emulator

## Launch // Browser // <><Shift> Enter ##
set_from_resource $i3-wm.binding.browser i3-wm.binding.browser Shift+Return
bindsym $mod+$i3-wm.binding.browser exec gtk-launch $(xdg-settings get default-web-browser)

set_from_resource $rofiTheme rofi.theme /etc/regolith/styles/lascaille/rofi.rasi

## Launch // Application // <> Space ##
set_from_resource $i3-wm.binding.launcher.app i3-wm.binding.launcher.app space
set_from_resource $i3-wm.program.launcher.app i3-wm.program.launcher.app rofi -show drun -theme $rofiTheme
bindsym $mod+$i3-wm.binding.launcher.app exec $i3-wm.program.launcher.app

## Launch // Command // <><Shift> Space ##
set_from_resource $i3-wm.binding.launcher.cmd i3-wm.binding.launcher.cmd Shift+space
set_from_resource $i3-wm.program.launcher.cmd i3-wm.program.launcher.cmd rofi -show run -theme $rofiTheme
bindsym $mod+$i3-wm.binding.launcher.cmd exec $i3-wm.program.launcher.cmd

## Navigate // Window by Name // <><Ctrl> Space ##
set_from_resource $i3-wm.binding.launcher.window i3-wm.binding.launcher.window Ctrl+space
set_from_resource $i3-wm.program.launcher.window i3-wm.program.launcher.window rofi -show window -theme $rofiTheme
bindsym $mod+$i3-wm.binding.launcher.window exec $i3-wm.program.launcher.window

## Launch // This Dialog // <><Shift> ? ##
set_from_resource $i3-wm.binding.help i3-wm.binding.help Shift+question
set_from_resource $i3-wm.program.help i3-wm.program.help /usr/bin/remontoire -c /etc/regolith/i3/config
bindsym $mod+$i3-wm.binding.help exec --no-startup-id $i3-wm.program.help

## Launch // File Search // <><Alt> Space ##
set_from_resource $i3-wm.binding.file_search i3-wm.binding.file_search Mod1+space
set_from_resource $i3-wm.program.file_search i3-wm.program.file_search rofi -show find -modi find:/usr/share/rofi/modi/finder.sh
bindsym $mod+$i3-wm.binding.file_search exec $i3-wm.program.file_search

## Launch // Look Selector // <><Alt> l ##
set_from_resource $i3-wm.binding.look_selector i3-wm.binding.look_selector Mod1+l
set_from_resource $i3-wm.program.look_selector i3-wm.program.look_selector rofi -show look -modi look:/usr/share/rofi/modi/look-selector.sh
bindsym $mod+$i3-wm.binding.look_selector exec $i3-wm.program.look_selector

## Launch // Emoji // <Ctrl> Space ##
set_from_resource $i3-wm.program.launcher.emoji i3-wm.program.launcher.emoji rofi -show emoji -modi emoji -theme $rofiTheme
bindsym Ctrl+space exec $i3-wm.program.launcher.emoji

###############################################################################
# Window and Workspace Navigation
###############################################################################

## Navigate // Relative Parent // <> a ##/
set_from_resource $i3-wm.binding.focus_parent i3-wm.binding.focus_parent a
bindsym $mod+$i3-wm.binding.focus_parent focus parent

## Navigate // Relative Child // <> z ##/
set_from_resource $i3-wm.binding.focus_child i3-wm.binding.focus_child z
bindsym $mod+$i3-wm.binding.focus_child focus child

## Navigate // Relative Window // <> ↑ ↓ ← → ##
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right

## Navigate // Relative Window // <> k j h l ##
set_from_resource $i3-wm.binding.left i3-wm.binding.left h
set_from_resource $i3-wm.binding.right i3-wm.binding.right l
set_from_resource $i3-wm.binding.up i3-wm.binding.up k
set_from_resource $i3-wm.binding.down i3-wm.binding.down j
bindsym $mod+$i3-wm.binding.left focus left
bindsym $mod+$i3-wm.binding.down focus down
bindsym $mod+$i3-wm.binding.up focus up
bindsym $mod+$i3-wm.binding.right focus right

## Navigate // Workspaces 1-10 // <> 0..9 ##
bindsym $mod+$ws1_key workspace number $ws1
bindsym $mod+$ws2_key workspace number $ws2
bindsym $mod+$ws3_key workspace number $ws3
bindsym $mod+$ws4_key workspace number $ws4
bindsym $mod+$ws5_key workspace number $ws5
bindsym $mod+$ws6_key workspace number $ws6
bindsym $mod+$ws7_key workspace number $ws7
bindsym $mod+$ws8_key workspace number $ws8
bindsym $mod+$ws9_key workspace number $ws9
bindsym $mod+$ws10_key workspace number $ws10
## Navigate // Workspace 11 - 19 // <><Ctrl> 1..9 ##
bindsym $mod+Ctrl+$ws1_key workspace number $ws11
bindsym $mod+Ctrl+$ws2_key workspace number $ws12
bindsym $mod+Ctrl+$ws3_key workspace number $ws13
bindsym $mod+Ctrl+$ws4_key workspace number $ws14
bindsym $mod+Ctrl+$ws5_key workspace number $ws15
bindsym $mod+Ctrl+$ws6_key workspace number $ws16
bindsym $mod+Ctrl+$ws7_key workspace number $ws17
bindsym $mod+Ctrl+$ws8_key workspace number $ws18
bindsym $mod+Ctrl+$ws9_key workspace number $ws19

## Navigate // Next Workspace // <> Tab ##
set_from_resource $i3-wm.binding.ws_next i3-wm.binding.ws_next Tab
bindsym $mod+$i3-wm.binding.ws_next workspace next

## Navigate // Next Workspace // <><Alt> → ##
set_from_resource $i3-wm.binding.ws_next2 i3-wm.binding.ws_next2 Mod1+Right
bindsym $mod+$i3-wm.binding.ws_next2 workspace next

## Navigate // Next Workspace on Output // <><Ctrl> Tab ##
set_from_resource $i3-wm.binding.ws_next_on_output i3-wm.binding.ws_next_on_output Ctrl+Tab
bindsym $mod+$i3-wm.binding.ws_next_on_output workspace next_on_output

## Navigate // Next Workspace on Output // <><Ctrl> l ##
set_from_resource $i3-wm.binding.ws_next_on_output2 i3-wm.binding.ws_next_on_output2 Ctrl+l
bindsym $mod+$i3-wm.binding.ws_next_on_output2 workspace next_on_output

## Navigate // Previous Workspace // <><Shift> Tab ##
set_from_resource $i3-wm.binding.ws_prev i3-wm.binding.ws_prev Shift+Tab
bindsym $mod+$i3-wm.binding.ws_prev workspace prev

## Navigate // Previous Workspace // <><Alt> ← ##
set_from_resource $i3-wm.binding.ws_prev2 i3-wm.binding.ws_prev2 Mod1+Left
bindsym $mod+$i3-wm.binding.ws_prev2 workspace prev

## Navigate // Previous Workspace on Output // <><Ctrl><Shift> Tab ##
set_from_resource $i3-wm.binding.ws_prev_on_output i3-wm.binding.ws_prev_on_output Ctrl+Shift+Tab
bindsym $mod+$i3-wm.binding.ws_prev_on_output workspace prev_on_output

## Navigate // Previous Workspace on Output // <><Ctrl> h ##
set_from_resource $i3-wm.binding.ws_prev_on_output2 i3-wm.binding.ws_prev_on_output2 Ctrl+h
bindsym $mod+$i3-wm.binding.ws_prev_on_output2 workspace prev_on_output

## Navigate // Next Free Workspace // <> ` ##
set_from_resource $i3-wm.binding.next_free i3-wm.binding.next_free grave
bindsym $mod+$i3-wm.binding.next_free exec --no-startup-id /usr/bin/i3-next-workspace

## Navigate // Scratchpad // <><Ctrl> a ##
set_from_resource $i3-wm.binding.scratchpad i3-wm.binding.scratchpad Ctrl+a
bindsym $mod+$i3-wm.binding.scratchpad scratchpad show

###############################################################################
# Window and Workspace Configuration
###############################################################################

## Modify // Window Position // <><Shift> ↑ ↓ ← → ##
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right

## Modify // Window Position // <><Shift> k j h l ##
set_from_resource $i3-wm.binding.move_left i3-wm.binding.move_left Shift+h
set_from_resource $i3-wm.binding.move_right i3-wm.binding.move_right Shift+l
set_from_resource $i3-wm.binding.move_up i3-wm.binding.move_up Shift+k
set_from_resource $i3-wm.binding.move_down i3-wm.binding.move_down Shift+j
bindsym $mod+$i3-wm.binding.move_left move left
bindsym $mod+$i3-wm.binding.move_down move down
bindsym $mod+$i3-wm.binding.move_up move up
bindsym $mod+$i3-wm.binding.move_right move right

## Modify // Containing Workspace // <><Ctrl><Shift> ↑ ↓ ← → ##
bindsym $mod+Ctrl+Shift+Left move workspace to output left
bindsym $mod+Ctrl+Shift+Down move workspace to output down
bindsym $mod+Ctrl+Shift+Up move workspace to output up
bindsym $mod+Ctrl+Shift+Right move workspace to output right

## Modify // Containing Workspace // <><Ctrl><Shift> k j h l ##
set_from_resource $i3-wm.binding.take_left i3-wm.binding.take_left Ctrl+Shift+h
set_from_resource $i3-wm.binding.take_right i3-wm.binding.take_right Ctrl+Shift+l
set_from_resource $i3-wm.binding.take_up i3-wm.binding.take_up Ctrl+Shift+k
set_from_resource $i3-wm.binding.take_down i3-wm.binding.take_down Ctrl+Shift+j
bindsym $mod+$i3-wm.binding.take_left move workspace to output left
bindsym $mod+$i3-wm.binding.take_down move workspace to output down
bindsym $mod+$i3-wm.binding.take_up move workspace to output up
bindsym $mod+$i3-wm.binding.take_right move workspace to output right

# Screenshots
bindsym Print exec --no-startup-id maim "/home/$USER/Pictures/$(date)" && mpv /usr/share/sounds/freedesktop/stereo/camera-shutter.oga &
bindsym $mod+Print exec --no-startup-id maim --window $(xdotool getactivewindow) "/home/$USER/Pictures/$(date)" && mpv /usr/share/sounds/freedesktop/stereo/camera-shutter.oga &
bindsym Shift+Print exec --no-startup-id maim --select "/home/$USER/Pictures/$(date)" && mpv /usr/share/sounds/freedesktop/stereo/camera-shutter.oga &

## Clipboard Screenshots
bindsym Ctrl+Print exec --no-startup-id maim | xclip -selection clipboard -t image/png && mpv /usr/share/sounds/freedesktop/stereo/camera-shutter.oga &
bindsym Ctrl+$mod+Print exec --no-startup-id maim --window $(xdotool getactivewindow) | xclip -selection clipboard -t image/png && mpv /usr/share/sounds/freedesktop/stereo/camera-shutter.oga &
bindsym Ctrl+Shift+Print exec --no-startup-id maim --select | xclip -selection clipboard -t image/png && mpv /usr/share/sounds/freedesktop/stereo/camera-shutter.oga &

## Modify // Vertical Window Orientation // <> v ##
set_from_resource $i3-wm.binding.split_v i3-wm.binding.split_v v
bindsym $mod+$i3-wm.binding.split_v split vertical

## Modify // Horizontal Window Orientation // <> g ##
set_from_resource $i3-wm.binding.split_h i3-wm.binding.split_h g
bindsym $mod+$i3-wm.binding.split_h split horizontal

## Modify // Toggle Window Orientation // <> Backspace ##
set_from_resource $i3-wm.binding.orientation_toggle i3-wm.binding.orientation_toggle BackSpace
bindsym $mod+$i3-wm.binding.orientation_toggle split toggle

## Modify // Window Fullscreen Toggle // <> f ##
set_from_resource $i3-wm.binding.fullscreen_toggle i3-wm.binding.fullscreen_toggle f
bindsym $mod+$i3-wm.binding.fullscreen_toggle fullscreen toggle

## Modify // Window Floating Toggle // <><Shift> f ##
set_from_resource $i3-wm.binding.float_toggle i3-wm.binding.float_toggle Shift+f
bindsym $mod+Shift+$i3-wm.binding.float_toggle floating toggle

## Modify // Move to Scratchpad // <><Ctrl> m ##
set_from_resource $i3-wm.binding.move_scratchpad i3-wm.binding.move_scratchpad Ctrl+m
bindsym $mod+$i3-wm.binding.move_scratchpad move to scratchpad

## Modify // Tile/Float Focus Toggle // <><Shift> t ##
set_from_resource $i3-wm.binding.focus_toggle i3-wm.binding.focus_toggle Shift+t
bindsym $mod+$i3-wm.binding.focus_toggle focus mode_toggle

## Modify // Window Layout Mode // <> t ##
set_from_resource $i3-wm.binding.layout_mode i3-wm.binding.layout_mode t
bindsym $mod+$i3-wm.binding.layout_mode layout toggle tabbed splith splitv

## Modify // Move Window to Workspace 1 - 10 // <><Shift> 0..9 ##
bindsym $mod+Shift+$ws1_key move container to workspace number $ws1
bindsym $mod+Shift+$ws2_key move container to workspace number $ws2
bindsym $mod+Shift+$ws3_key move container to workspace number $ws3
bindsym $mod+Shift+$ws4_key move container to workspace number $ws4
bindsym $mod+Shift+$ws5_key move container to workspace number $ws5
bindsym $mod+Shift+$ws6_key move container to workspace number $ws6
bindsym $mod+Shift+$ws7_key move container to workspace number $ws7
bindsym $mod+Shift+$ws8_key move container to workspace number $ws8
bindsym $mod+Shift+$ws9_key move container to workspace number $ws9
bindsym $mod+Shift+$ws10_key move container to workspace number $ws10
## Modify // Move Window to Workspace 11 - 19// <><Ctrl><Shift> 1..9 ##
bindsym $mod+Shift+Ctrl+$ws1_key move container to workspace number $ws11
bindsym $mod+Shift+Ctrl+$ws2_key move container to workspace number $ws12
bindsym $mod+Shift+Ctrl+$ws3_key move container to workspace number $ws13
bindsym $mod+Shift+Ctrl+$ws4_key move container to workspace number $ws14
bindsym $mod+Shift+Ctrl+$ws5_key move container to workspace number $ws15
bindsym $mod+Shift+Ctrl+$ws6_key move container to workspace number $ws16
bindsym $mod+Shift+Ctrl+$ws7_key move container to workspace number $ws17
bindsym $mod+Shift+Ctrl+$ws8_key move container to workspace number $ws18
bindsym $mod+Shift+Ctrl+$ws9_key move container to workspace number $ws19

## Modify // Move Window to Next Free Workspace // <><Shift> ` ##
set_from_resource $i3-wm.binding.move_next_free i3-wm.binding.move_next_free Shift+grave
bindsym $mod+$i3-wm.binding.move_next_free exec --no-startup-id /usr/bin/i3-next-workspace --move-window

# move focused container to workspace, move to workspace
## Modify // Carry Window to Workspace 1 - 10// <><Alt> 0..9 ##
bindsym $mod+$alt+$ws1_key move container to workspace number $ws1; workspace number $ws1
bindsym $mod+$alt+$ws2_key move container to workspace number $ws2; workspace number $ws2
bindsym $mod+$alt+$ws3_key move container to workspace number $ws3; workspace number $ws3
bindsym $mod+$alt+$ws4_key move container to workspace number $ws4; workspace number $ws4
bindsym $mod+$alt+$ws5_key move container to workspace number $ws5; workspace number $ws5
bindsym $mod+$alt+$ws6_key move container to workspace number $ws6; workspace number $ws6
bindsym $mod+$alt+$ws7_key move container to workspace number $ws7; workspace number $ws7
bindsym $mod+$alt+$ws8_key move container to workspace number $ws8; workspace number $ws8
bindsym $mod+$alt+$ws9_key move container to workspace number $ws9; workspace number $ws9
bindsym $mod+$alt+$ws10_key move container to workspace number $ws10; workspace number $ws10
## Modify // Carry Window to Workspace 11 - 19 // <><Alt><Ctrl> 1..9 ##
bindsym $mod+$alt+Ctrl+$ws1_key move container to workspace number $ws11; workspace number $ws11
bindsym $mod+$alt+Ctrl+$ws2_key move container to workspace number $ws12; workspace number $ws12
bindsym $mod+$alt+Ctrl+$ws3_key move container to workspace number $ws13; workspace number $ws13
bindsym $mod+$alt+Ctrl+$ws4_key move container to workspace number $ws14; workspace number $ws14
bindsym $mod+$alt+Ctrl+$ws5_key move container to workspace number $ws15; workspace number $ws15
bindsym $mod+$alt+Ctrl+$ws6_key move container to workspace number $ws16; workspace number $ws16
bindsym $mod+$alt+Ctrl+$ws7_key move container to workspace number $ws17; workspace number $ws17
bindsym $mod+$alt+Ctrl+$ws8_key move container to workspace number $ws18; workspace number $ws18
bindsym $mod+$alt+Ctrl+$ws9_key move container to workspace number $ws19; workspace number $ws19

## Modify // Carry Window to Next Free Workspace // <><Alt> ` ##
set_from_resource $i3-wm.binding.take_next_free i3-wm.binding.take_next_free Mod1+grave
bindsym $mod+$i3-wm.binding.take_next_free exec --no-startup-id /usr/bin/i3-next-workspace --move-window-and-follow

# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod

# Hiding borders adjacent to the screen edges.
# The "smart" setting hides borders on workspaces with only one window visible.
set_from_resource $i3-wm.hide.edge.borders i3-wm.hide.edge.borders smart
hide_edge_borders $i3-wm.hide.edge.borders

###############################################################################
# Session Management
###############################################################################

## Session // Exit App // <><Shift> q ##
set_from_resource $i3-wm.binding.exit_app i3-wm.binding.exit_app Shift+q
bindsym $mod+$i3-wm.binding.exit_app [con_id="__focused__"] kill

## Session // Terminate App // <><Alt> q ##
set_from_resource $i3-wm.binding.kill_app i3-wm.binding.kill_app Mod1+q
bindsym $mod+$i3-wm.binding.kill_app [con_id="__focused__"] exec --no-startup-id kill -9 $(xdotool getwindowfocus getwindowpid)

## Session // Reload i3 Config // <><Shift> c ##
set_from_resource $i3-wm.binding.reload i3-wm.binding.reload Shift+c
bindsym $mod+$i3-wm.binding.reload reload

## Session // Refresh Session // <><Shift> r ##
set_from_resource $i3-wm.binding.refresh i3-wm.binding.refresh Shift+r
set_from_resource $i3-wm.program.refresh_ui i3-wm.program.refresh_ui /usr/bin/regolith-look refresh
bindsym $mod+$i3-wm.binding.refresh exec --no-startup-id $i3-wm.program.refresh_ui

## Session // Restart i3 // <><Ctrl> r ##
set_from_resource $i3-wm.binding.restart i3-wm.binding.restart Ctrl+r
bindsym $mod+$i3-wm.binding.restart restart

## Session // Logout // <><Shift> e ##
set_from_resource $i3-wm.binding.logout i3-wm.binding.logout Shift+e
set_from_resource $i3-wm.program.logout i3-wm.program.logout /usr/bin/gnome-session-quit --logout
bindsym $mod+$i3-wm.binding.logout exec $i3-wm.program.logout

## Session // Reboot // <><Shift> b ##
set_from_resource $i3-wm.binding.reboot i3-wm.binding.reboot Shift+b
set_from_resource $i3-wm.program.reboot i3-wm.program.reboot /usr/bin/gnome-session-quit --reboot
bindsym $mod+$i3-wm.binding.reboot exec $i3-wm.program.reboot

## Session // Power Down // <><Shift> p ##
set_from_resource $i3-wm.binding.shutdown i3-wm.binding.shutdown Shift+p
set_from_resource $i3-wm.program.shutdown i3-wm.program.shutdown /usr/bin/gnome-session-quit --power-off
bindsym $mod+$i3-wm.binding.shutdown exec $i3-wm.program.shutdown

## Session // Lock Screen // <> Escape ##
set_from_resource $i3-wm.binding.lock i3-wm.binding.lock Escape
set_from_resource $i3-wm.program.lock i3-wm.program.lock dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
bindsym $mod+$i3-wm.binding.lock exec $i3-wm.program.lock

## Session // Sleep // <><Shift> s ##
set_from_resource $i3-wm.binding.sleep i3-wm.binding.sleep Ctrl+s
set_from_resource $i3-wm.program.sleep i3-wm.program.sleep systemctl suspend
bindsym $mod+$i3-wm.binding.sleep exec $i3-wm.program.sleep

###############################################################################
# System Management
###############################################################################

## Modify // Settings // <> c ##
set_from_resource $i3-wm.binding.settings i3-wm.binding.settings c
set_from_resource $i3-wm.program.settings i3-wm.program.settings gnome-control-center --class=floating_window
bindsym $mod+$i3-wm.binding.settings exec $i3-wm.program.settings

## Modify // Display Settings // <> d ##
set_from_resource $i3-wm.binding.display i3-wm.binding.display d
set_from_resource $i3-wm.program.display i3-wm.program.display gnome-control-center --class=floating_window display
bindsym $mod+$i3-wm.binding.display exec $i3-wm.program.display

## Modify // Wifi Settings // <> w ##
set_from_resource $i3-wm.binding.wifi i3-wm.binding.wifi w
set_from_resource $i3-wm.program.wifi i3-wm.program.wifi gnome-control-center --class=floating_window wifi
bindsym $mod+$i3-wm.binding.wifi exec $i3-wm.program.wifi

## Modify // Bluetooth Settings // <> b ##
set_from_resource $i3-wm.binding.bluetooth i3-wm.binding.bluetooth b
set_from_resource $i3-wm.program.bluetooth i3-wm.program.bluetooth gnome-control-center --class=floating_window bluetooth
bindsym $mod+$i3-wm.binding.bluetooth exec $i3-wm.program.bluetooth

## Launch // File Browser // <><Shift> n ##
set_from_resource $i3-wm.binding.files i3-wm.binding.files Shift+n
set_from_resource $i3-wm.program.files i3-wm.program.files /usr/bin/nautilus --new-window
bindsym $mod+$i3-wm.binding.files exec $i3-wm.program.files

## Launch // Notification Viewer // <> n ##
set_from_resource $i3-wm.binding.notification_ui i3-wm.binding.notification_ui n
set_from_resource $i3-wm.program.notification_ui i3-wm.program.notification_ui /usr/bin/rofication-gui
bindsym $mod+$i3-wm.binding.notification_ui exec $i3-wm.program.notification_ui

###############################################################################
# Workspace Management
###############################################################################

# i3-snapshot for load/save current layout
## Modify // Save Window Layout // <> , ##
set_from_resource $i3-wm.binding.save_layout i3-wm.binding.save_layout comma
bindsym $mod+$i3-wm.binding.save_layout  exec /usr/bin/i3-snapshot -o > /tmp/i3-snapshot
## Modify // Load Window Layout // <> . ##
set_from_resource $i3-wm.binding.load_layout i3-wm.binding.load_layout period
bindsym $mod+$i3-wm.binding.load_layout exec /usr/bin/i3-snapshot -c < /tmp/i3-snapshot

# Toggle bar visibility
## Modify // Toggle Bar // <> i ##
set_from_resource $i3-wm.binding.bar_toggle i3-wm.binding.bar_toggle i
bindsym $mod+$i3-wm.binding.bar_toggle bar mode toggle

# Cause Settings app to float above tiled windows
floating_maximum_size -1 x -1
for_window [class="floating_window"] floating enable
for_window [window_role = "pop-up"] floating enable
for_window [window_role = "bubble"] floating enable
for_window [window_role = "dialog"] floating enable
for_window [window_type = "dialog"] floating enable
for_window [id="evolution-alarm-notify"] floating enable
for_window [class="mpv"] fullscreen disable, floating enable, resize set 300 200, sticky enable, move window to position 11 32
for_window [id="mpv"] floating enable
for_window [id="mpv"] resize set 960 540
for_window [id="mpv"] border pixel 0
for_window [id="firefox" title="Firefox – Sharing Indicator"] floating enable
for_window [id="firefox" title="Picture-in-Picture"] floating enable
for_window [id="firefox" title="Pushbullet – Mozilla Firefox"] floating enable
for_window [id="firefox" title="About Mozilla Firefox"] floating enable

set_from_resource $i3-wm.workspace.auto_back_and_forth i3-wm.workspace.auto_back_and_forth no
workspace_auto_back_and_forth $i3-wm.workspace.auto_back_and_forth

###############################################################################
# Window Resize and Gaps
###############################################################################

set_from_resource $i3-wm.binding.inc_gaps i3-wm.binding.inc_gaps plus
set_from_resource $i3-wm.binding.dec_gaps i3-wm.binding.dec_gaps minus

set_from_resource $i3-wm.binding.inc_gaps_big i3-wm.binding.inc_gaps_big Shift+plus
set_from_resource $i3-wm.binding.dec_gaps_big i3-wm.binding.dec_gaps_big Shift+minus

## Resize // Enter Resize Mode // <> r ##
mode "Resize Mode" {
        # These bindings trigger as soon as you enter the resize mode

        ## Resize // Resize Window // ↑ ↓ ← → ##
        bindsym Left resize shrink width 6 px or 6 ppt
        bindsym Down resize grow height 6 px or 6 ppt
        bindsym Up resize shrink height 6 px or 6 ppt
        bindsym Right resize grow width 6 px or 6 ppt

        bindsym Shift+Left resize shrink width 12 px or 12 ppt
        bindsym Shift+Down resize grow height 12 px or 12 ppt
        bindsym Shift+Up resize shrink height 12 px or 12 ppt
        bindsym Shift+Right resize grow width 12 px or 12 ppt

        ## Resize // Resize Window // k j h l ##
        bindsym $i3-wm.binding.left resize shrink width 1 px or 1 ppt
        bindsym $i3-wm.binding.up resize grow height 1 px or 1 ppt
        bindsym $i3-wm.binding.down resize shrink height 1 px or 1 ppt
        bindsym $i3-wm.binding.right resize grow width 1 px or 1 ppt

        bindsym $i3-wm.binding.move_left resize shrink width 3 px or 3 ppt
        bindsym $i3-wm.binding.move_up resize grow height 3 px or 3 ppt
        bindsym $i3-wm.binding.move_down resize shrink height 3 px or 3 ppt
        bindsym $i3-wm.binding.move_right resize grow width 3 px or 3 ppt

        ## Resize // Window Gaps // + - ##
        bindsym $i3-wm.binding.dec_gaps gaps inner current minus 6
        bindsym $i3-wm.binding.dec_gaps gaps outer current minus 6
        bindsym $i3-wm.binding.inc_gaps gaps inner current plus 6
        bindsym $i3-wm.binding.inc_gaps gaps outer current plus 6
        bindsym $i3-wm.binding.dec_gaps_big gaps inner current minus 12
        bindsym $i3-wm.binding.dec_gaps_big gaps outer current minus 12
        bindsym $i3-wm.binding.inc_gaps_big gaps inner current plus 12
        bindsym $i3-wm.binding.inc_gaps_big gaps outer current plus 12

        ## Resize // Exit Resize Mode // Escape or Enter ##
        bindsym Return mode "default"
        bindsym Escape mode "default"
        bindsym $mod+r mode "default"
}
bindsym $mod+r mode "Resize Mode"

###############################################################################
# i3 Appearance and Behavior
###############################################################################

# Disable titlebar
set_from_resource $i3-wm.window.border.size i3-wm.window.border.size 1
set_from_resource $i3-wm.floatingwindow.border.size i3-wm.floatingwindow.border.size 1
default_border pixel $i3-wm.window.border.size
default_floating_border pixel $i3-wm.floatingwindow.border.size


# Specify the distance between windows in pixels. (i3-gaps)
set_from_resource $i3-wm.gaps.inner.size i3-wm.gaps.inner.size 5
set_from_resource $i3-wm.gaps.outer.size i3-wm.gaps.outer.size 5
gaps inner $i3-wm.gaps.inner.size
gaps outer $i3-wm.gaps.outer.size

# Only enable gaps on a workspace when there is at least one container
set_from_resource $i3-wm.gaps.smart i3-wm.gaps.smart on
smart_gaps $i3-wm.gaps.smart
smart_gaps inverse_outer

# Enable popup during fullscreen
set_from_resource $i3-wm.gaps.popup_during_fullscreen i3-wm.gaps.popup_during_fullscreen smart
popup_during_fullscreen $i3-wm.gaps.popup_during_fullscreen

# window focus follows your mouse movements as the mouse crosses window borders
set_from_resource $i3-wm.gaps.focus_follows_mouse i3-wm.gaps.focus_follows_mouse yes
focus_follows_mouse $i3-wm.gaps.focus_follows_mouse

###############################################################################
# i3 Colors and Fonts
###############################################################################

# Create variables from Xresources for i3's look.

set_from_resource $focused.color.border i3-wm.client.focused.color.border "#002b36"
set_from_resource $focused.color.background i3-wm.client.focused.color.background "#586e75"
set_from_resource $focused.color.text i3-wm.client.focused.color.text "#fdf6e3"
set_from_resource $focused.color.indicator i3-wm.client.focused.color.indicator "#268bd2"
set_from_resource $focused.color.child_border i3-wm.client.focused.color.child_border

set_from_resource $focused_inactive.color.border i3-wm.client.focused_inactive.color.border "#002b36"
set_from_resource $focused_inactive.color.background i3-wm.client.focused_inactive.color.background "#073642"
set_from_resource $focused_inactive.color.text i3-wm.client.focused_inactive.color.text "#839496"
set_from_resource $focused_inactive.color.indicator i3-wm.client.focused_inactive.color.indicator "#073642"
set_from_resource $focused_inactive.color.child_border i3-wm.client.focused_inactive.color.child_border

set_from_resource $unfocused.color.border i3-wm.client.unfocused.color.border "#002b36"
set_from_resource $unfocused.color.background i3-wm.client.unfocused.color.background "#073642"
set_from_resource $unfocused.color.text i3-wm.client.unfocused.color.text "#839496"
set_from_resource $unfocused.color.indicator i3-wm.client.unfocused.color.indicator "#073642"
set_from_resource $unfocused.color.child_border i3-wm.client.unfocused.color.child_border

set_from_resource $urgent.color.border i3-wm.client.urgent.color.border "#002b36"
set_from_resource $urgent.color.background i3-wm.client.urgent.color.background "#dc322f"
set_from_resource $urgent.color.text i3-wm.client.urgent.color.text "#fdf6e3"
set_from_resource $urgent.color.indicator i3-wm.client.urgent.color.indicator "#002b36"
set_from_resource $urgent.color.child_border i3-wm.client.urgent.color.child_border


# Window Border color
# class                 border                             background                         text                               indicator                          child_border
client.focused          $focused.color.border              $focused.color.background          $focused.color.text                $focused.color.indicator           $focused.color.child_border
client.focused_inactive $focused_inactive.color.border     $focused_inactive.color.background $focused_inactive.color.text       $focused_inactive.color.indicator  $focused_inactive.color.child_border
client.unfocused        $unfocused.color.border            $unfocused.color.background        $unfocused.color.text              $unfocused.color.indicator         $unfocused.color.child_border
client.urgent           $urgent.color.border               $urgent.color.background           $urgent.color.text                 $urgent.color.indicator            $urgent.color.child_border

#set_from_resource $i3-wm.bar.background.color i3-wm.bar.background.color "#00000000"
set_from_resource $i3-wm.bar.statusline.color i3-wm.bar.statusline.color "#00000000"
set_from_resource $i3-wm.bar.separator.color i3-wm.bar.separator.color "#00000000"

set_from_resource $i3-wm.bar.workspace.focused.border.color i3-wm.bar.workspace.focused.border.color "#073642"
set_from_resource $i3-wm.bar.workspace.focused.background.color i3-wm.bar.workspace.focused.background.color "#073642"
set_from_resource $i3-wm.bar.workspace.focused.text.color i3-wm.bar.workspace.focused.text.color "#eee8d5"

set_from_resource $i3-wm.bar.workspace.active.border.color i3-wm.bar.workspace.active.border.color "#073642"
set_from_resource $i3-wm.bar.workspace.active.background.color i3-wm.bar.workspace.active.background.color "#073642"
set_from_resource $i3-wm.bar.workspace.active.text.color i3-wm.bar.workspace.active.text.color "#586e75"

set_from_resource $i3-wm.bar.workspace.inactive.border.color i3-wm.bar.workspace.inactive.border.color "#002b36"
set_from_resource $i3-wm.bar.workspace.inactive.background.color i3-wm.bar.workspace.inactive.background.color "#002b36"
set_from_resource $i3-wm.bar.workspace.inactive.text.color i3-wm.bar.workspace.inactive.text.color "#586e75"

set_from_resource $i3-wm.bar.workspace.urgent.border.color i3-wm.bar.workspace.urgent.border.color "#dc322f"
set_from_resource $i3-wm.bar.workspace.urgent.background.color i3-wm.bar.workspace.urgent.background.color "#dc322f"
set_from_resource $i3-wm.bar.workspace.urgent.text.color i3-wm.bar.workspace.urgent.text.color "#fdf6e3"

# Sets i3 font for dialogs
set_from_resource $i3-wm.font i3-wm.font pango:Source Code Pro Medium 13
font $i3-wm.font

###############################################################################
# i3 Bar
###############################################################################

set_from_resource $i3-wm.bar.position i3-wm.bar.position bottom
set_from_resource $i3-wm.bar.font i3-wm.bar.font pango:Source Code Pro Medium 13, Material Design Icons 13
set_from_resource $i3-wm.bar.separator i3-wm.bar.separator " "
set_from_resource $i3-wm.bar.trayoutput i3-wm.bar.trayoutput primary
set_from_resource $i3-wm.bar.stripworkspacenumbers i3-wm.bar.stripworkspacenumbers yes
set_from_resource $i3-wm.bar.mode i3-wm.bar.mode dock

# i3xrocks config file. Override this for a custom status bar generator.
set_from_resource $i3-wm.bar.status_command i3-wm.bar.status_command i3xrocks -u ~/.config/regolith/i3xrocks/conf.d -d /etc/regolith/i3xrocks/conf.d

# The bar configuration
bar {
  i3bar_command i3bar -t
  position $i3-wm.bar.position
  mode $i3-wm.bar.mode
  font $i3-wm.bar.font
  separator_symbol $i3-wm.bar.separator
  status_command $i3-wm.bar.status_command
  tray_output $i3-wm.bar.trayoutput
  strip_workspace_numbers $i3-wm.bar.stripworkspacenumbers

  colors {
      background #00000000
      statusline $i3-wm.bar.statusline.color
      separator  $i3-wm.bar.separator.color

#                        BORDER                                         BACKGROUND                                      TEXT
      focused_workspace  $i3-wm.bar.workspace.focused.border.color      $i3-wm.bar.workspace.focused.background.color   $i3-wm.bar.workspace.focused.text.color
      active_workspace   $i3-wm.bar.workspace.active.border.color       $i3-wm.bar.workspace.active.background.color    $i3-wm.bar.workspace.active.text.color
      inactive_workspace $i3-wm.bar.workspace.inactive.border.color     $i3-wm.bar.workspace.inactive.background.color  $i3-wm.bar.workspace.inactive.text.color
      urgent_workspace   $i3-wm.bar.workspace.urgent.border.color       $i3-wm.bar.workspace.urgent.background.color    $i3-wm.bar.workspace.urgent.text.color
  }
}

###############################################################################
# External programs launched with i3
###############################################################################

# Start the installed regolith-compositor
set_from_resource $i3-wm.program.compositor i3-wm.program.compositor /usr/share/regolith-compositor/init
exec_always --no-startup-id $i3-wm.program.compositor

# Start Rofication for notifications
set_from_resource $i3-wm.program.notifications i3-wm.program.notifications /usr/bin/rofication-daemon
exec --no-startup-id $i3-wm.program.notifications

# Launch first time user experience script
set_from_resource $i3-wm.program.ftui i3-wm.program.ftui /usr/bin/regolith-ftue
exec --no-startup-id $i3-wm.program.ftui

# Hide the mouse pointer if unused for a duration
set_from_resource $i3-wm.program.unclutter i3-wm.program.unclutter /usr/bin/unclutter -b
exec --no-startup-id $i3-wm.program.unclutter

# Load nm-applet to provide auth dialogs for network access
set_from_resource $i3-wm.program.nm-applet i3-wm.program.nm-applet /usr/bin/nm-applet
exec --no-startup-id $i3-wm.program.nm-applet

# User programs from Xresources
# To use, define an Xresource key i3-wm.program.[1-3] with the value of the program to launch.
# See https://regolith-linux.org/docs/howto/override-xres/ for details.
set_from_resource $i3-wm.program.1 i3-wm.program.1 :
exec --no-startup-id $i3-wm.program.1
set_from_resource $i3-wm.program.2 i3-wm.program.2 :
exec --no-startup-id $i3-wm.program.2
set_from_resource $i3-wm.program.3 i3-wm.program.3 :
exec --no-startup-id $i3-wm.program.3

~/.config/polybar/config

Click here to view or copy my full polybar config.

1. Polybar is a customizable taskbar for i3wm

[bar/i3wmthemer_bar]
width = 100%
height = 27
radius = 0
fixed-center = true

background = #1e1e20
foreground = #c5c8c6

line-size = 3
line-color =

border-size = 0
border-color =

padding-left = 0
padding-right = 2

module-margin-left = 1
module-margin-right = 2

font-0 = "Source Code Pro Semibold:size=10;1"
font-1 = "Font Awesome 5 Free:style=Solid:size=10;1"
font-2 = "Font Awesome 5 Brands:size=10;1"

modules-left = i3
modules-center = date
modules-right = wlan battery powermenu

tray-position =
;tray-padding =
wm-restack = i3
override-redirect = true

cursor-click = pointer
cursor-scroll = ns-resize

[module/i3]
type = internal/i3
format = <label-state> <label-mode>
index-sort = true
wrapping-scroll = false

label-mode-padding = 2
label-mode-foreground = #1e1e20
label-mode-background = #56737a

label-focused = %index%
label-focused-background = #2c5159
label-focused-foreground = #6b7443
label-focused-padding = 2

label-unfocused = %index%
label-unfocused-background = #56737a
label-unfocused-foreground = #1e1e20
label-unfocused-padding = 2

label-visible = %index%
label-visible-background = #56737a
label-visible-foreground = #1e1e20
label-visible-padding = 2

label-urgent = %index%
label-urgent-background = #BA2922
label-urgent-padding = 2

[module/wlan]
type = internal/network
interface = wlp2s0
interval = 3.0

format-connected = <ramp-signal> <label-connected>
format-connected-foreground = #80969b
format-connected-background = #1e1e20
format-connected-padding = 2
label-connected = %essid%

format-disconnected =

ramp-signal-0 = 
ramp-signal-1 = 
ramp-signal-2 = 
ramp-signal-3 = 
ramp-signal-4 = 
ramp-signal-foreground = #1e1e20

[module/eth]
type = internal/network
interface = enp0s3
interval = 3.0

format-connected-padding = 2
format-connected-foreground = #80969b
format-connected-background = #1e1e20
format-connected-prefix = " "
format-connected-prefix-foreground = #80969b
label-connected = %local_ip%

format-disconnected =

[module/date]
type = internal/date
interval = 5

date =
date-alt = " %Y-%m-%d"

time = %I:%M
time-alt = %I:%M:%S

format-prefix = 
format-foreground = #1e1e20
format-background = #416269
format-padding = 2

label = %date% %time%

[module/powermenu]
type = custom/menu

expand-right = true

format-spacing = 1

label-open = 
label-open-foreground = #56737a
label-close =  cancel
label-close-foreground = #56737a
label-separator = |
label-separator-foreground = #80969b

menu-0-0 = reboot
menu-0-0-exec = menu-open-1
menu-0-1 = power off
menu-0-1-exec = menu-open-2
menu-0-2 = log off
menu-0-2-exec = menu-open-3

menu-1-0 = cancel
menu-1-0-exec = menu-open-0
menu-1-1 = reboot
menu-1-1-exec = reboot

menu-2-0 = power off
menu-2-0-exec = poweroff
menu-2-1 = cancel
menu-2-1-exec = menu-open-0

menu-3-0 = log off
menu-3-0-exec = i3 exit logout
menu-3-1 = cancel
menu-3-1-exec = menu-open-0

[module/battery]
type = internal/battery

; This is useful in case the battery never reports 100% charge
full-at = 99

battery = BAT0
adapter = AC

poll-interval = 5
format-charging = <animation-charging> <label-charging>
format-discharging = <animation-discharging> <label-discharging>
label-charging = %percentage%%
label-discharging = %percentage%%
label-full = Charged

animation-charging-0 = ▁
animation-charging-1 = ▂
animation-charging-2 = ▃
animation-charging-3 = ▄
animation-charging-4 = ▅
animation-charging-5 = ▆
animation-charging-6 = ▇
animation-charging-framerate = 1000

animation-discharging-0 = ▇
animation-discharging-1 = ▆
animation-discharging-2 = ▅
animation-discharging-3 = ▄
animation-discharging-4 = ▃
animation-discharging-5 = ▂
animation-discharging-6 = ▁
animation-discharging-framerate = 1000

[settings]
screenchange-reload = true

[global/wm]
margin-top = 0
margin-bottom = 0

2. Polybar reloading script

#!/bin/env sh

pkill polybar
sleep 1;
polybar i3wmthemer_bar &

~/.config/picom/config | full

This page contains key files and configs for setting up the jonaburg Compton fork, Picom, as the compositor in Regolith Linux.

Regolith is a distro which uses the i3 Window Manager. If you're using another distro, the snippets on this page might not be as useful.

Build Picom

First of all, make sure to carefully read through the directions in Picom repo on GitHub. User jonaburg provides some great documentation. Basically the repo is a cleaned merge of 3 or 4 other Compton forks.

If you follow the repo's directions, you should end up with an executable file named compton. Move that to a PATH-sourced location.

Regolith uses a compton executable to run another Compton fork. So when I ran which compton, bash echoed back:

/usr/local/bin/compton

I made a backup, and replaced this executable with the new Picom-generated one.

Update Regolith Configs

I replaced the default compton compositor (default with Regolith, at the time of writing) with the new compton executable after following the build instructions in the GitHub repo. Regolith's config files are still pointing to the original config file, however.

So, I had to make a new config for Picom and tell Regolith where to look for that.

1. /usr/share/regolith-compositor/init

Around line 690 in my Regolith's i3 config is where it calls the init script for the compositor. This line number will vary, because my i3 config isn't the default. You should be able to find it by searching for:

set_from_resource $i3-wm.program.compositor i3-wm.program.compositor /usr/share/regolith-compositor/init

This is what my edited init file looks like:

#!/bin/bash
# See https://regolith-linux.org/docs/customize/compositors/

compositor_PID=$(pidof picom)

while [ ! -z "$compositor_PID" ]; do
  kill $compositor_PID
  sleep .1
  compositor_PID=$(pidof picom)
done

if [[ -f "$HOME/.config/regolith/picom/config" ]]; then
  /usr/local/bin/compton --config "$HOME/.config/regolith/picom/config"
else
  /usr/local/bin/compton --config /etc/regolith/picom/config
fi

2. ~/.config/picom/config

You can see in the script above that it's finding whether or not the process already exists. If it doesn't exist, start it. Look for a config file in one location (~/.config/regolith/picom/config). If that config doesn't exist, then run with the config located at:

/etc/regolith/picom/config

Other sample picom configs can be found in the jonaburg/picom repo.

-> /etc/regolith/picom/config/

#################################
#          Animations           #
#################################
# requires https://github.com/jonaburg/picom
# (These are also the default values)
transition-length = 350
transition-pow-x = 0.35
transition-pow-y = 0.35
transition-pow-w = 0.35
transition-pow-h = 0.35
size-transition = true


#################################
#             Corners           #
#################################
# requires: https://github.com/sdhand/compton or https://github.com/jonaburg/picom
corner-radius = 10.0;
rounded-corners-exclude = [
  #"window_type = 'normal'",
  "class_g = 'i3bar'",
  "class_g = 'notification'",
  "class_g = 'awesome'",
  "class_g = 'URxvt'",
  "class_g = 'XTerm'",
  "class_g = 'Polybar'",
  "class_g = 'code-oss'",
  #"class_g = 'TelegramDesktop'",
  "class_g = 'Thunderbird'"
];
round-borders = 1;
round-borders-exclude = [
  #"class_g = 'TelegramDesktop'",
];

#################################
#             Shadows           #
#################################


# Enabled client-side shadows on windows. Note desktop windows
# (windows with '_NET_WM_WINDOW_TYPE_DESKTOP') never get shadow,
# unless explicitly requested using the wintypes option.
#
# shadow = false
shadow = true;

# The blur radius for shadows, in pixels. (defaults to 12)
# shadow-radius = 12
shadow-radius = 10;

# The opacity of shadows. (0.0 - 1.0, defaults to 0.75)
shadow-opacity = .75

# The left offset for shadows, in pixels. (defaults to -15)
# shadow-offset-x = -15
shadow-offset-x = -10;

# The top offset for shadows, in pixels. (defaults to -15)
# shadow-offset-y = -15
shadow-offset-y = -10;

# Avoid drawing shadows on dock/panel windows. This option is deprecated,
# you should use the *wintypes* option in your config file instead.
#
# no-dock-shadow = false

# Don't draw shadows on drag-and-drop windows. This option is deprecated,
# you should use the *wintypes* option in your config file instead.
#
# no-dnd-shadow = false

# Red color value of shadow (0.0 - 1.0, defaults to 0).
# shadow-red = 0

# Green color value of shadow (0.0 - 1.0, defaults to 0).
# shadow-green = 0

# Blue color value of shadow (0.0 - 1.0, defaults to 0).
# shadow-blue = 0

# Do not paint shadows on shaped windows. Note shaped windows
# here means windows setting its shape through X Shape extension.
# Those using ARGB background is beyond our control.
# Deprecated, use
#   shadow-exclude = 'bounding_shaped'
# or
#   shadow-exclude = 'bounding_shaped && !rounded_corners'
# instead.
#
# shadow-ignore-shaped = ''

# Specify a list of conditions of windows that should have no shadow.
#
# examples:
#   shadow-exclude = "n:e:Notification";
#
# shadow-exclude = []
shadow-exclude = [
  "! name~=''",
  "name = 'Notification'",
  "name = 'gnome-flashback'",
  "name = 'Plank'",
  "class_g = 'Conky'",
  "class_g = 'popup'",
  "class_g ?= 'Notify-osd'",
  "class_g = 'notification'",
  "class_g = 'Kupfer'",
  "class_g = 'Synapse'",
  "class_g = 'Cairo-clock'",
  "class_g = 'Cairo-dock'",
  "class_g = 'Rofi'",
  "class_g = 'slop'",
  "class_g = 'Polybar'",
  "_GTK_FRAME_EXTENTS@:c"
];

# Specify a X geometry that describes the region in which shadow should not
# be painted in, such as a dock window region. Use
#    shadow-exclude-reg = "x10+0+0"
# for example, if the 10 pixels on the bottom of the screen should not have shadows painted on.
#
# shadow-exclude-reg = ""

# Crop shadow of a window fully on a particular Xinerama screen to the screen.
# xinerama-shadow-crop = false


#################################
#           Fading              #
#################################


# Fade windows in/out when opening/closing and when opacity changes,
#  unless no-fading-openclose is used.
# fading = false
fading = true;

# Opacity change between steps while fading in. (0.01 - 1.0, defaults to 0.028)
# fade-in-step = 0.028
fade-in-step = 0.1;

# Opacity change between steps while fading out. (0.01 - 1.0, defaults to 0.03)
# fade-out-step = 0.03
fade-out-step = 0.1;

# The time between steps in fade step, in milliseconds. (> 0, defaults to 10)
fade-delta = 13.5

# Specify a list of conditions of windows that should not be faded.
# don't need this, we disable fading for all normal windows with wintypes: {}
fade-exclude = [
  "class_g = 'slop'",   # maim
  "class_g = 'Rofi'"
]

# Do not fade on window open/close.
# no-fading-openclose = false

# Do not fade destroyed ARGB windows with WM frame. Workaround of bugs in Openbox, Fluxbox, etc.
# no-fading-destroyed-argb = false


#################################
#   Transparency / Opacity      #
#################################


# Opacity of inactive windows. (0.1 - 1.0, defaults to 1.0)
# inactive-opacity = 1
inactive-opacity = 0.5;

# Opacity of window titlebars and borders. (0.1 - 1.0, disabled by default)
# frame-opacity = 1.0
frame-opacity = 0.5;

# Default opacity for dropdown menus and popup menus. (0.0 - 1.0, defaults to 1.0)
# menu-opacity = 1.0
# menu-opacity is depreciated use dropdown-menu and popup-menu instead.

#If using these 2 below change their values in line 510 & 511 aswell
popup_menu = { opacity = 0.8; }
dropdown_menu = { opacity = 0.8; }


# Let inactive opacity set by -i override the '_NET_WM_OPACITY' values of windows.
# inactive-opacity-override = true
inactive-opacity-override = true;

# Default opacity for active windows. (0.0 - 1.0, defaults to 1.0)
active-opacity = 0.80;

# Dim inactive windows. (0.0 - 1.0, defaults to 0.0)
# inactive-dim = 0.0

# Specify a list of conditions of windows that should always be considered focused.
# focus-exclude = []
focus-exclude = [
  "class_g = 'mpv'" ,
  "class_g = 'vlc'",
  "class_g = 'icecat'",
  "class_g = 'notification'",
  "class_g = 'Cairo-clock'",
  "class_g = 'Bar'",                    # lemonbar
  "class_g = 'slop'"                    # maim
];

# Use fixed inactive dim value, instead of adjusting according to window opacity.
# inactive-dim-fixed = 1.0

# Specify a list of opacity rules, in the format `PERCENT:PATTERN`,
# like `50:name *= "Firefox"`. picom-trans is recommended over this.
# Note we don't make any guarantee about possible conflicts with other
# programs that set '_NET_WM_WINDOW_OPACITY' on frame or client windows.
# example:
#    opacity-rule = [ "80:class_g = 'URxvt'" ];
#
# opacity-rule = []
opacity-rule = [
  "0:_NET_WM_STATE@:32a *= '_NET_WM_STATE_HIDDEN'" ,
  "99:class_g     = 'mpv'" ,
  "99:class_g     = 'icecat'",
  "99:class_g     = 'vlc'",
  "100:class_g    = 'i3bar'",
  "100:class_g    = 'Bar'",             # lemonbar
  "50:name        = 'gnome-flashback'",
  "100:class_g    = 'slop'",            # maim
  #"100:class_g    = 'XTerm'",
  #"100:class_g    = 'URxvt'",
  #"100:class_g    = 'kitty'",
  #"100:class_g    = 'Alacritty'",
  "80:class_g     = 'Polybar'",
  "100:class_g    = 'code-oss'",
  "100:class_g    = 'Meld'",
  "70:class_g     = 'TelegramDesktop'",
  "90:class_g     = 'Joplin'",
  #"100:class_g    = 'firefox'",
  "100:class_g    = 'Thunderbird'"
];


#################################
#     Background-Blurring       #
#################################


# Parameters for background blurring, see the *BLUR* section for more information.
# blur-method =
# blur-size = 12
#
# blur-deviation = false

# Blur background of semi-transparent / ARGB windows.
# Bad in performance, with driver-dependent behavior.
# The name of the switch may change without prior notifications.
#
# blur-background = true;

# Blur background of windows when the window frame is not opaque.
# Implies:
#    blur-background
# Bad in performance, with driver-dependent behavior. The name may change.
#
# blur-background-frame = false;


# Use fixed blur strength rather than adjusting according to window opacity.
# blur-background-fixed = false;


# Specify the blur convolution kernel, with the following format:
# example:
#   blur-kern = "5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1";
#
# blur-kern = ''
# blur-kern = "3x3box";

blur: {
  # requires: https://github.com/ibhagwan/picom
  method = "kawase";
  #method = "kernel";
  strength = 7;
  # deviation = 1.0;
  # kernel = "11x11gaussian";
  background = false;
  background-frame = false;
  background-fixed = false;
  kern = "3x3box";
}

# Exclude conditions for background blur.
blur-background-exclude = [
  "window_type = 'dock'",
  #"window_type = 'desktop'",
  #"class_g = 'URxvt'",
  #
  # prevents picom from blurring the background
  # when taking selection screenshot with `main`
  # https://github.com/naelstrof/maim/issues/130
  "class_g = 'slop'",
  "_GTK_FRAME_EXTENTS@:c"
];


#################################
#       General Settings        #
#################################

# Daemonize process. Fork to background after initialization. Causes issues with certain (badly-written) drivers.
# daemon = false

# Specify the backend to use: `xrender`, `glx`, or `xr_glx_hybrid`.
# `xrender` is the default one.
#
experimental-backends = true;
backend = "glx";
#backend = "xrender";


# Enable/disable VSync.
# vsync = false
vsync = true

# Enable remote control via D-Bus. See the *D-BUS API* section below for more details.
# dbus = false

# Try to detect WM windows (a non-override-redirect window with no
# child that has 'WM_STATE') and mark them as active.
#
# mark-wmwin-focused = false
mark-wmwin-focused = true;

# Mark override-redirect windows that doesn't have a child window with 'WM_STATE' focused.
# mark-ovredir-focused = false
mark-ovredir-focused = true;

# Try to detect windows with rounded corners and don't consider them
# shaped windows. The accuracy is not very high, unfortunately.
#
# detect-rounded-corners = false
detect-rounded-corners = true;

# Detect '_NET_WM_OPACITY' on client windows, useful for window managers
# not passing '_NET_WM_OPACITY' of client windows to frame windows.
#
# detect-client-opacity = false
detect-client-opacity = true;

# Specify refresh rate of the screen. If not specified or 0, picom will
# try detecting this with X RandR extension.
#
# refresh-rate = 60
refresh-rate = 0

# Limit picom to repaint at most once every 1 / 'refresh_rate' second to
# boost performance. This should not be used with
#   vsync drm/opengl/opengl-oml
# as they essentially does sw-opti's job already,
# unless you wish to specify a lower refresh rate than the actual value.
#
# sw-opti =

# Use EWMH '_NET_ACTIVE_WINDOW' to determine currently focused window,
# rather than listening to 'FocusIn'/'FocusOut' event. Might have more accuracy,
# provided that the WM supports it.
#
# use-ewmh-active-win = false

# Unredirect all windows if a full-screen opaque window is detected,
# to maximize performance for full-screen windows. Known to cause flickering
# when redirecting/unredirecting windows. paint-on-overlay may make the flickering less obvious.
#
# unredir-if-possible = false

# Delay before unredirecting the window, in milliseconds. Defaults to 0.
# unredir-if-possible-delay = 0

# Conditions of windows that shouldn't be considered full-screen for unredirecting screen.
# unredir-if-possible-exclude = []

# Use 'WM_TRANSIENT_FOR' to group windows, and consider windows
# in the same group focused at the same time.
#
# detect-transient = false
detect-transient = true

# Use 'WM_CLIENT_LEADER' to group windows, and consider windows in the same
# group focused at the same time. 'WM_TRANSIENT_FOR' has higher priority if
# detect-transient is enabled, too.
#
# detect-client-leader = false
detect-client-leader = true

# Resize damaged region by a specific number of pixels.
# A positive value enlarges it while a negative one shrinks it.
# If the value is positive, those additional pixels will not be actually painted
# to screen, only used in blur calculation, and such. (Due to technical limitations,
# with use-damage, those pixels will still be incorrectly painted to screen.)
# Primarily used to fix the line corruption issues of blur,
# in which case you should use the blur radius value here
# (e.g. with a 3x3 kernel, you should use `--resize-damage 1`,
# with a 5x5 one you use `--resize-damage 2`, and so on).
# May or may not work with *--glx-no-stencil*. Shrinking doesn't function correctly.
#
# resize-damage = 1

# Specify a list of conditions of windows that should be painted with inverted color.
# Resource-hogging, and is not well tested.
#
# invert-color-include = []

# GLX backend: Avoid using stencil buffer, useful if you don't have a stencil buffer.
# Might cause incorrect opacity when rendering transparent content (but never
# practically happened) and may not work with blur-background.
# My tests show a 15% performance boost. Recommended.
#
# glx-no-stencil = false

# GLX backend: Avoid rebinding pixmap on window damage.
# Probably could improve performance on rapid window content changes,
# but is known to break things on some drivers (LLVMpipe, xf86-video-intel, etc.).
# Recommended if it works.
#
# glx-no-rebind-pixmap = false

# Disable the use of damage information.
# This cause the whole screen to be redrawn everytime, instead of the part of the screen
# has actually changed. Potentially degrades the performance, but might fix some artifacts.
# The opposing option is use-damage
#
# no-use-damage = false
#use-damage = true (Causing Weird Black semi opaque rectangles when terminal is opened)
#Changing use-damage to false fixes the problem
use-damage = false

# Use X Sync fence to sync clients' draw calls, to make sure all draw
# calls are finished before picom starts drawing. Needed on nvidia-drivers
# with GLX backend for some users.
#
# xrender-sync-fence = false

# GLX backend: Use specified GLSL fragment shader for rendering window contents.
# See `compton-default-fshader-win.glsl` and `compton-fake-transparency-fshader-win.glsl`
# in the source tree for examples.
#
# glx-fshader-win = ''

# Force all windows to be painted with blending. Useful if you
# have a glx-fshader-win that could turn opaque pixels transparent.
#
# force-win-blend = false

# Do not use EWMH to detect fullscreen windows.
# Reverts to checking if a window is fullscreen based only on its size and coordinates.
#
# no-ewmh-fullscreen = false

# Dimming bright windows so their brightness doesn't exceed this set value.
# Brightness of a window is estimated by averaging all pixels in the window,
# so this could comes with a performance hit.
# Setting this to 1.0 disables this behaviour. Requires --use-damage to be disabled. (default: 1.0)
#
# max-brightness = 1.0

# Make transparent windows clip other windows like non-transparent windows do,
# instead of blending on top of them.
#
# transparent-clipping = false

# Set the log level. Possible values are:
#  "trace", "debug", "info", "warn", "error"
# in increasing level of importance. Case doesn't matter.
# If using the "TRACE" log level, it's better to log into a file
# using *--log-file*, since it can generate a huge stream of logs.
#
# log-level = "debug"
log-level = "info";

# Set the log file.
# If *--log-file* is never specified, logs will be written to stderr.
# Otherwise, logs will to written to the given file, though some of the early
# logs might still be written to the stderr.
# When setting this option from the config file, it is recommended to use an absolute path.
#
# log-file = '/path/to/your/log/file'

# Show all X errors (for debugging)
# show-all-xerrors = false

# Write process ID to a file.
# write-pid-path = '/path/to/your/log/file'

# Window type settings
#
# 'WINDOW_TYPE' is one of the 15 window types defined in EWMH standard:
#     "unknown", "desktop", "dock", "toolbar", "menu", "utility",
#     "splash", "dialog", "normal", "dropdown_menu", "popup_menu",
#     "tooltip", "notification", "combo", and "dnd".
#
# Following per window-type options are available: ::
#
#   fade, shadow:::
#     Controls window-type-specific shadow and fade settings.
#
#   opacity:::
#     Controls default opacity of the window type.
#
#   focus:::
#     Controls whether the window of this type is to be always considered focused.
#     (By default, all window types except "normal" and "dialog" has this on.)
#
#   full-shadow:::
#     Controls whether shadow is drawn under the parts of the window that you
#     normally won't be able to see. Useful when the window has parts of it
#     transparent, and you want shadows in those areas.
#
#   redir-ignore:::
#     Controls whether this type of windows should cause screen to become
#     redirected again after been unredirected. If you have unredir-if-possible
#     set, and doesn't want certain window to cause unnecessary screen redirection,
#     you can set this to `true`.
#
wintypes:
{
  normal = { fade = true; shadow = true; }
  tooltip = { fade = true; shadow = true; opacity = 0.75; focus = true; full-shadow = false; };
  dock = { shadow = false; }
  dnd = { shadow = false; }
  popup_menu = { opacity = 0.8; }
  dropdown_menu = { opacity = 0.8; }
};