#+TITLE: Desktop Configuration

This =.org= document is where I store all of my small time user-level configuration.

I prefer to use programs that I can extend the functionality of via configuration files and source code.

* Sway
*** Variables
#+begin_src shell :tangle ~/.config/sway/config :mkdirp yes
# Directional Keys
set $left h
set $down j
set $up k
set $right l

# Mod Key
set $mod Mod4

# Terminal
set $term alacritty

# Application Launcher
set $menu killall wofi || wofi
#+end_src
*** General
#+begin_src shell :tangle ~/.config/sway/config :mkdirp yes
# Start a terminal
bindsym $mod+Return exec $term

# Start wofi
bindsym $mod+d exec $menu

# Kill focused window
bindsym $mod+Shift+q kill

# Lock SwayWM
bindsym Control+Shift+l exec swaylock

# Change normal to inverse to use left mouse button for resizing and right
# mouse button for dragging.
floating_modifier $mod normal

# Reload the configuration file
bindsym $mod+Shift+c reload

# Exit sway (logs you out of your Wayland session)
bindsym $mod+Shift+x exec swaymsg -r exit
#+end_src
*** Media/Brightness
#+begin_src shell :tangle ~/.config/sway/config :mkdirp yes
## Volume
bindsym XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +5%
bindsym XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -5%
bindsym XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle

## Volume for non-media button keyboards
bindsym $mod+Shift+n exec pactl set-sink-volume @DEFAULT_SINK@ +5%
bindsym $mod+Shift+b exec pactl set-sink-volume @DEFAULT_SINK@ -5%
bindsym $mod+Shift+m exec pactl set-sink-mute @DEFAULT_SINK@ toggle

# Media playerctl
bindsym XF86AudioNext exec playerctl next
bindsym XF86AudioPrev exec playerctl previous
bindsym XF86AudioPlay exec playerctl play-pause

# Backlight
bindsym XF86MonBrightnessUp exec light -A 10 && notify-send "󰃞 Light" "Brightness: $(light)%" --hint="int:value:$(light)"
bindsym XF86MonBrightnessDown exec light -U 10 && notify-send "󰃞 Light" "Brightness: $(light)%" --hint="int:value:$(light)"
#+end_src
*** Navigation & Focus
#+begin_src shell :tangle ~/.config/sway/config :mkdirp yes
# Moving around:
# Move your focus around
bindsym $mod+$left focus left
bindsym $mod+$down focus down
bindsym $mod+$up focus up
bindsym $mod+$right focus right

# Or use $mod+[up|down|left|right]
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right

# Move the focused window with the same, but add 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

# Ditto, with arrow 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
#+end_src
*** Layout
#+begin_src shell :tangle ~/.config/sway/config :mkdirp yes
# Layout stuff:
#
# You can "split" the current object of your focus with
# $mod+b or $mod+v, for horizontal and vertical splits
# respectively.
bindsym $mod+b splith
bindsym $mod+v splitv

# Switch the current container between different layout styles
bindsym $mod+s layout stacking
bindsym $mod+w layout tabbed
# bindsym $mod+e layout toggle split

# Make the current focus fullscreen
bindsym $mod+f fullscreen

# Toggle the current focus between tiling and floating mode
bindsym $mod+Shift+space floating toggle

# Swap focus between the tiling area and the floating area
bindsym $mod+space focus mode_toggle

# Move focus to the parent container
bindsym $mod+a focus parent
#
# Scratchpad:
#
# Sway has a "scratchpad", which is a bag of holding for windows.
# You can send windows there and get them back later.

# 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
#
# Resizing containers:
#
mode "resize" {
    # left will shrink the containers width
    # right will grow the containers width
    # up will shrink the containers height
    # down will grow the containers height
    bindsym $left resize shrink width 10px
    bindsym $down resize grow height 10px
    bindsym $up resize shrink height 10px
    bindsym $right resize grow width 10px

    # Ditto, with arrow keys
    bindsym Left resize shrink width 10px
    bindsym Down resize grow height 10px
    bindsym Up resize shrink height 10px
    bindsym Right resize grow width 10px

    # Return to default mode
    bindsym Return mode "default"
    bindsym Escape mode "default"
}
bindsym $mod+r mode "resize"
#+end_src
*** Screenshot
#+begin_src shell :tangle ~/.config/sway/config :mkdirp yes
# Screenshot (Grimshot)

# Captures the currently active window
bindsym $mod+g      exec grimshot save active
# Allows manually selecting a rectangular region
bindsym $mod+Shift+g exec grimshot save area
# Captures currently active output
bindsym $mod+Mod1+g  exec grimshot save output
# Allows manually selecting a single window
bindsym $mod+Ctrl+g exec grimshot save window
# Screenshot (Grimshot)
#+end_src
*** Swaynag
#+begin_src shell :tangle ~/.config/sway/config :mkdirp yes
# Turn the system off
bindsym $mod+Shift+e exec swaynag -t custom -m 'What action would you like to perform?' -b 'Shutdown' 'poweroff' -b 'Restart' 'poweroff --reboot' -b 'Suspend' 'systemctl suspend'
#+end_src
*** Autostart
#+begin_src shell :tangle ~/.config/sway/config :mkdirp yes
# Notifications
exec_always --no-startup-id dunst

# Wlsunset (Night Light)
exec_always wlsunset -l 47.6 -L -122.3 -t 3000 -T 6500

# Clamshell Mode Script
exec_always ~/.config/sway/clamshell.sh

# udiskie - auto usb mounting
exec --no-startup-id /usr/bin/udiskie

# polkit
#exec /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1

# Network Manager tray applet
exec /usr/bin/nm-applet --indicator

# Keepassxc
for_window [class="KeepassXC"] {
    move scratchpad
}
exec /usr/bin/keepassxc

# flash focus
exec_always flashfocus

#+end_src
*** Opacity
#+begin_src shell :tangle ~/.config/sway/config :mkdirp yes
set $opacity 0.98
for_window [class=".*"] opacity $opacity
for_window [app_id=".*"] opacity $opacity
#+end_src
*** Borders/Gaps
#+begin_src shell :tangle ~/.config/sway/config :mkdirp yes
# Window Borders
default_border none
default_floating_border none

# Gaps
smart_gaps on
gaps inner 5
gaps outer 2
#+end_src
*** App Window Behavior
#+begin_src shell :tangle ~/.config/sway/config :mkdirp yes
for_window [app_id="galendae"] floating enable, sticky enable, move position cursor, move down 35
#+end_src
*** Idle Behavior
#+begin_src shell :tangle ~/.config/sway/config :mkdirp yes
# Idle configuration
exec swayidle -w \
     timeout 120 'swaylock -f' \
     timeout 600 'swaymsg "output * dpms off"' \
     timeout 15 'if pgrep -x swaylock; then swaymsg "output * dpms off"; fi' \
     resume 'swaymsg "output * dpms on"' \
     before-sleep 'swaylock -f'
#+end_src
*** Input
**** Keyboard
#+begin_src shell :tangle ~/.config/sway/config :mkdirp yes
### Input configuration
#
# Example configuration:
#
#   input "2:14:SynPS/2_Synaptics_TouchPad" {
#       dwt enabled
#       tap enabled
#       natural_scroll enabled
#       middle_emulation enabled
#   }
#
# You can get the names of your inputs by running: swaymsg -t get_inputs
# Read `man 5 sway-input` for more information about this section.
input type:keyboard {
    # Capslock key should work as escape key
    # See /usr/share/X11/xkb/rules/xorg.lst for options
    xkb_layout "us(altgr-intl)"
    xkb_options caps:escape

    repeat_delay 250
    repeat_rate 45
}
#+end_src
**** Mouse
#+begin_src shell :tangle ~/.config/sway/config :mkdirp yes
# Hide mouse cursor after inactivity
seat * hide_cursor 10000
#+end_src
*** Clamshell Mode
#+begin_src shell :tangle ~/.config/sway/config :mkdirp yes
set $laptop eDP-1
bindswitch --reload --locked lid:on output $laptop disable
bindswitch --reload --locked lid:off output $laptop enable
#+end_src

When reloading sway while using clamshell mode, the displays may reset (i.e. enable the displays). We use a bash script to mitigate this:
#+begin_src shell :tangle ~/.config/sway/clamshell.sh :mkdirp yes
#!/usr/bin/bash
if grep -q open /proc/acpi/button/lid/LID/state; then
    swaymsg output eDP-1 enable
else
    swaymsg output eDP-1 disable
fi
#+end_src
*** Wallpaper & Monitor(s)
#+begin_src shell :tangle ~/.config/sway/config :mkdirp yes
#### WORK #####
# Monitors
# You can get the names of your outputs by running: swaymsg -t get_outputs
output eDP-1 scale 1
output eDP-1 pos 2560 0 res 1920x1080 bg ~/opalfiles/.config/wallpapers/priest.jpg fill
output HDMI-A-1 scale 1
output HDMI-A-1 pos 0 0 res 2560x1440 bg ~/opalfiles/.config/wallpapers/priest.jpg fill
#+end_src
*** Workspaces
#+begin_src shell :tangle ~/.config/sway/config :mkdirp yes
# Assign workspaces to numbers
set $ws1 number 1
set $ws2 number 2
set $ws3 number 3
set $ws4 number 4
set $ws5 number 5
set $ws6 "work"

# 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

# Move focused container to workspace
bindsym $mod+Shift+1 move container to workspace $ws1
bindsym $mod+Shift+2 move container to workspace $ws2
bindsym $mod+Shift+3 move container to workspace $ws3
bindsym $mod+Shift+4 move container to workspace $ws4
bindsym $mod+Shift+5 move container to workspace $ws5
bindsym $mod+Shift+6 move container to workspace $ws6
#+end_src
*** Status Bar
#+begin_src shell :tangle ~/.config/sway/config :mkdirp yes
# Status Bar:
bar {
    swaybar_command waybar
}
#+end_src
* Swaynag
#+begin_src shell :tangle ~/.config/swaynag/config :mkdirp yes
[custom]
font=Iosevka 13
dismiss-button=Dismiss
background=0f0f0f
border=262626
border-bottom=262626
button-background=262626
text=f0f0f0
border-bottom-size=2
message-padding=5
details-border-size=2
button-border-size=0
button-gap=5
button-dismiss-gap=5
button-margin-right=5
button-padding=5
#+end_src
* Swaylock
#+begin_src shell :tangle ~/.config/swaylock/config :mkdirp yes
# Image
image=~/.config/wallpapers/wallpaper-town.jpg
scaling=fill

# Indicator
ignore-empty-password
indicator-caps-lock

# Behavior
show-failed-attempts
#+end_src
* Waybar
*** waybar/config
#+begin_src shell :tangle ~/.config/waybar/config :mkdirp yes
{
    "layer": "top",
    "position": "top",
    "height": 35,
    "modules-left": ["sway/workspaces"],
    "modules-center": ["clock", "backlight"],
    "modules-right": ["idle_inhibitor", "pulseaudio", "network", "battery", "tray"],
    "sway/workspaces": {
        // "persistent_workspaces": {
            // "<span font=\"FontAwesome 5 Free\"></span>": ["HDMI-A-1"],
            // "<span font=\"FontAwesome 5 Free\"></span>": ["HDMI-A-1"],
            // "<span font=\"FontAwesome 5 Free\"></span>": ["HDMI-A-1"],
            // "<span font=\"FontAwesome 5 Free\"></span>": ["HDMI-A-1"],
            // "<span font=\"FontAwesome 5 Free\"></span>": ["HDMI-A-1"],
            // "<span font=\"FontAwesome 5 Free\"></span>": ["HDMI-A-1"],
          // },
        "disable-scroll": true,
        "all-outputs": true,
        "format": "<span size='large'>{icon}</span>",
        // "format-icons": {
        //    "1": "<span font=\"FontAwesome 5 Free\"></span>",
        //    "2": "<span font=\"FontAwesome 5 Free\"></span>",
        //    "3": "<span font=\"FontAwesome 5 Free\"></span>",
        //    "4": "<span font=\"FontAwesome 5 Free\"></span>",
        //    "5": "<span font=\"FontAwesome 5 Free\"></span>",
        //    "6": "<span font=\"FontAwesome 5 Free\"></span>",
        //    "7": "<span font=\"FontAwesome 5 Free\"></span>",
        //    "urgent": "<span font=\"FontAwesome 5 Free\"></span>",
        //    "focused": " <span font=\"FontAwesome 5 Free\"></span>",
        //    "default": "<span font=\"FontAwesome 5 Free\"></span>",
       // },
    },

    "sway/mode": {
        "format": "<span style='italic'>{}</span>"
    },

    "tray": {
        "icon-size": 18,
        "spacing": 8
    },

    "clock": {
        "format": "{: %I:%M %A %B %d}",
        "tooltip": false,
        "on-click": "galendae -c $HOME/.config/galendae-cal/galendae.conf"
    },

    "battery": {
        "interval": 30,
        "states": {
            // "good": 95,
            "warning": 30,
            "critical": 15
        },
        "full-at":  "99",
        "format": " {capacity}%",
        "format-good": " {capacity}%", // An empty format will hide the module
        "format-full": "<span size='large' rise='-1600'></span> Full",
        "format-charging": "<span size='large' rise='-1600'></span> {capacity}% "
    },

    "network": {
        "interval": 5,
        "format-wifi": "<span size='large' rise='-1000'></span> {essid}",
        "format-ethernet": "<span size='large' rise='-1000'></span> {ifname}",
        "format-disconnected": "",
        "tooltip-format-wifi": "{essid}:{signalStrength}\nSpeed:{bandwidthDownBits} \n{ipaddr}"

    },
    "pulseaudio": {
        "scroll-step": 1,
        "on-scroll-up": "amixer set Master 3%+",
        "on-click": "pavucontrol",
        "on-scroll-down": "amixer set Master 3%-",
        "format": "",
        "format": "<span size='large' rise='-1600'>{icon}</span> {volume}%",
        "format-source": "<span size='large' rise='-1600'>{icon}</span> {volume}%",
        "format-muted": "<span font=\"FontAwesome 5 Free\"></span>  Muted",
        "format-icons": {
            "headset": "",
            "headphone": "",
            "default": ["", ""]
        },
    },
    "backlight": {
        "device": "intel_backlight",
        "format": "",
        "format-icons": ["", ""],
        // "on-scroll-up": "brightnessctl set 1%+",
        // "on-scroll-down": "brightnessctl set 1%-",
        "on-click": "wlsunset -l 47.6 -L -122.3 -t 3000 -T 6500"
    },
    "idle_inhibitor": {
        "format": "<span rise='-4000' size='large'>{icon}</span>",
        "format-icons": {
            "activated": " Idle Inhibit On",
            "deactivated": " Idle Inhibit Off",
        },
    },
}
#+end_src
*** waybar/style.css
#+begin_src shell :tangle ~/.config/waybar/style.css :mkdirp yes
\* {
    border: none;
    border-radius: 0;
    font-family: Iosevka, FontAwesome;
    font-size: 15px;
    min-height: 0;
}

window#waybar {
    opacity: 0.7;
    background: #000000;
    color: #bebebe;
}

#workspaces button {
    color: #bebebe;
    background: transparent;
    padding: 0px 5px 0px 5px;
    margin: 5px 10px 0 10px;
}
#workspaces button.focused {
    color: white;
    margin: 5px 10px 0 10px;
}

#workspaces button.active {
    color: white;
    margin: 5px 10px 0 10px;
}

#workspaces button.urgent{
    margin: 5px 10px 0 10px;
    padding: 0px 8px 0px 8px;
    animation-duration: 0.5s;
    animation-timing-function: linear;
    animation-iteration-count: infinite;
    animation-direction: alternate;
    border-radius: 7px;
     }
#mode {
    font-family: "Iosevka";
    margin: 0px 15px 0px 15px;
    padding: 0px 12px 0px 12px;
    color: black;
    background: white;
}

#battery{
    margin:7px 4px 0 4px;
    border-radius: 5px;
    padding: 0px 8px 0px 8px;
    }

#network {
    margin:7px 4px 0 4px;
    border-radius: 6px;
    padding: 0px 8px 0px 8px;
}

@keyframes critical {
    to {
    background: rgba(187,56,0, 1);
    border-radius: 7px;
    margin:7px 4px 0 4px;
    padding: 3px 8px 2px 8px;
    }
}
@keyframes urgent {
    to {
    background: rgba(212,140,0, 1);
    color: black;
    border-radius: 7px;
    }
}

#battery.critical:not(.charging) {
    padding: 0px 6px 0px 6px;
    color: white;
    animation-name: critical;
    animation-duration: 0.5s;
    animation-timing-function: linear;
    animation-iteration-count: infinite;
    animation-direction: alternate;
}

#clock {
    margin:7px 0 0 13px;
    font-family: Manjari;
    font-size: 16.5px;
    border-radius: 6px;
    padding: 3px 6px 2px 0px;
}

#clock:hover {
 background: rgba(40,40,40, .95);
}


#backlight {
    margin:7px 4px 0 4px;
    border-radius: 5px;
    padding: 3px 8px 2px 8px;
}

#pulseaudio {
    margin:7px 4px 0 4px;
    border-radius: 5px;
    padding: 0px 8px 0px 8px;
}

#tray {
    margin: 7px 15px 0 4px;
    background: rgba(40,40,40, .65);
    border-radius: 6px;
    padding: 0px 5px 0px 5px;
}

#idle_inhibitor {
    margin: 7px 4px 0 4px;
    border-radius: 6px;
    padding: 0px 5px 0px 5px;
}
#+end_src

#+RESULTS:

*** extra
#+begin_src shell
    "sway/workspaces": {
        "disable-scroll": true,
        "all-outputs": false,
        "format": "<span size='large'>{icon}</span>",
        "format-icons": {
            "1": "",
            "2": "",
            "3": "",
            "4": "",
            "5": "",
            "6": "",
            "7": "",
         }
#+end_src
* Wofi
*** wofi/config
#+begin_src shell :tangle ~/.config/wofi/config :mkdirp yes
style=/home/opal/.config/wofi/style.css
show=drun
width=1000
height=300
always_parse_args=true
show_all=true
print_command=true
layer=overlay
insensitive=true
prompt=Search...
term=alacritty
#+end_src
*** wofi/style.css
#+begin_src shell :tangle ~/.config/wofi/style.css :mkdirp yes
*{
    font-family: monospace;
}

window {
    background-color: #7C818C;
}

#input {
    margin: 5px;
    border-radius: 0px;
    border: none;
    border-bottom: 3px solid black;
    background-color: #383C4A;
    color: white;
}

#inner-box {
    background-color: #383C4A;

}

#outer-box {
    margin: 5px;
    padding:20px;
    background-color: #383C4A;
}

#scroll {
}

#text {
padding: 5px;
color: white;
}

#entry:nth-child(even){
    background-color: #404552;
}

#entry:selected {
    background-color: #5291e2;
}

#text:selected {
}


#+end_src
* Dunst
#+begin_src shell :tangle ~/.config/dunst/dunstrc :mkdirp yes
[global]
monitor = 0
follow = keyboard
geometry = "250x50-24+24"
indicate_hidden = yes
shrink = no
separator_height = 0
padding = 16
horizontal_padding = 24
frame_width = 2
sort = no
idle_threshold = 120
font = Noto Sans 8
line_height = 4
markup = full
format = "<b>%s</b>\n%b"
alignment = left
show_age_threshold = 60
word_wrap = yes
ignore_newline = no
stack_duplicates = false
hide_duplicate_count = yes
show_indicators = no
icon_position = off
sticky_history = yes
history_length = 20
browser = /usr/bin/icecat -new-tab
always_run_script = true
title = Dunst
class = Dunst

[shortcuts]
close = ctrl+space
close_all = ctrl+shift+space
history = ctrl+grave
context = ctrl+shift+period

[urgency_low]
background = "#2f343f"
foreground = "#d8dee8"
timeout = 2

[urgency_normal]
background = "#2f343f"
foreground = "#d8dee8"
timeout = 4

[urgency_critical]
background = "#2f343f"
foreground = "#d8dee8"
frame_color = "#bf616a"
timeout = 0
#+end_src

* Galendae (Calendar Popup)
#+begin_src shell :tangle ~/.config/galendae-cal/galendae.conf
### WINDOW SETTINGS

# Stick window to all workspaces: 0=No, 1=Yes
stick=1
# Undecorated window: 0=No, 1=Yes
undecorated=1
# Close the window if it loses focus: 0=No, 1=Yes
close_on_unfocus=1
# Initial window position: 'center', 'mouse' or 'none'
position=mouse
# Move the window horizontally from its intial position
x_offset=1
# Move the window vertically from its initial position
y_offset=1

### COLORS

# Window background specified with CSS color
background_color=#000000
# Text color specified with CSS color
foreground_color=#dfdfdf
# Dates of previous and following months, colored with CSS
fringe_date_color=#404040
# Highlight color for the current date
highlight_color=#c61740

### FONTS

# Month font with CSS size and weight
month_font_size=xx-large
month_font_weight=normal

# Weekday column header font with CSS size and weight
day_font_size=75%
day_font_weight=normal

# Date number font with CSS size and weight
date_font_size=x-large
date_font_weight=bold

# Arrow font, ie '<' and '>' with CSS size and weight
arrow_font_size = xx-large
arrow_font_weight = bold

### CALENDAR SETTINGS

# Sunday=0,   Monday=1, Tuesday=2, Wednesday=3
# Thursday=4, Friday=5, Saturday=6
week_start=1
#+end_src
* Qutebrowser

#+begin_src shell :tangle ~/.config/qutebrowser/config.py
#!/usr/bin/env python3
config.load_autoconfig()

c.content.javascript.enabled = False
c.content.user_stylesheets = [ "stylesheet.css" ]
c.downloads.location.directory = "~/downloads"
c.editor.command = [ "alacritty", "-e", "vim", "{}" ]
c.editor.encoding = "utf-8"

c.url.searchengines = {
    "DEFAULT" : "https://search.brave.com/search?q={}",
}

c.url.start_pages = [ "https://search.brave.com" ]

config.bind('<Ctrl-Shift-y>', 'hint links spawn --detach mpv --force-window yes {hint-url}')
#+end_src
* Zsh
Aside from using e-shell for quick command line usage, I mainly use vterm with Zsh. It's a bit of a complicated setup but allows for the maximum number of files possible to live in .config instead of littering my home directory.
** zshrc
#+begin_src shell :tangle ~/opalfiles/.config/zsh/.zshrc :mkdirp yes
#### ~~~~ General ~~~~ #####
HISTFILE=$XDG_CONFIG_HOME/zsh/.history

#### ~~~~ Path Additions ~~~~ #####
export PATH=/home/opal/scripts:$PATH # Scripts
export PATH=/home/opal/.config/emacs/bin:$PATH # Doom Path
export PATH=/home/opal/.local/bin:$PATH # .local path

#### ~~~~ Locale ~~~~ #####
export LANG=en_US.UTF-8

# #### ~~~~ Import ~~~~ #####
ALIAS_LOCATION="$XDG_CONFIG_HOME/zsh/zsh_aliases"
FUNCTION_LOCATION="$XDG_CONFIG_HOME/zsh/zsh_functions"
. $ALIAS_LOCATION
. $FUNCTION_LOCATION

#### ~~~~ Prompt ~~~~ ####
git_prompt_status() {
  local INDEX STATUS

  INDEX=$(command git status --porcelain -b 2> /dev/null)

  STATUS=""

  if $(echo "$INDEX" | command grep -E '^\?\? ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_UNTRACKED$STATUS"
  fi

  if $(echo "$INDEX" | grep '^A  ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS"
  elif $(echo "$INDEX" | grep '^M  ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS"
  elif $(echo "$INDEX" | grep '^MM ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS"
  fi

  if $(echo "$INDEX" | grep '^ M ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
  elif $(echo "$INDEX" | grep '^AM ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
  elif $(echo "$INDEX" | grep '^MM ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
  elif $(echo "$INDEX" | grep '^ T ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
  fi

  if $(echo "$INDEX" | grep '^R  ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_RENAMED$STATUS"
  fi

  if $(echo "$INDEX" | grep '^ D ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
  elif $(echo "$INDEX" | grep '^D  ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
  elif $(echo "$INDEX" | grep '^AD ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
  fi

  if $(command git rev-parse --verify refs/stash >/dev/null 2>&1); then
    STATUS="$ZSH_THEME_GIT_PROMPT_STASHED$STATUS"
  fi

  if $(echo "$INDEX" | grep '^UU ' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_UNMERGED$STATUS"
  fi

  if $(echo "$INDEX" | grep '^## [^ ]\+ .*ahead' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_AHEAD$STATUS"
  fi

  if $(echo "$INDEX" | grep '^## [^ ]\+ .*behind' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_BEHIND$STATUS"
  fi

  if $(echo "$INDEX" | grep '^## [^ ]\+ .*diverged' &> /dev/null); then
    STATUS="$ZSH_THEME_GIT_PROMPT_DIVERGED$STATUS"
  fi

  if [[ ! -z "$STATUS" ]]; then
    echo " [ $STATUS]"
  fi
}


prompt_git_branch() {
    autoload -Uz vcs_info
    precmd_vcs_info() { vcs_info }
    precmd_functions+=( precmd_vcs_info )
    setopt prompt_subst
    zstyle ':vcs_info:git:*' formats '%b'
}

prompt_git_info() {
    [ ! -z "$vcs_info_msg_0_" ] && echo "$ZSH_THEME_GIT_PROMPT_PREFIX%F{white}$vcs_info_msg_0_%f$ZSH_THEME_GIT_PROMPT_SUFFIX"
}

prompt_purity_precmd() {
    # Pass a line before each prompt
    print -P ''
}

prompt_purification_setup() {
    # Display git branch

    autoload -Uz add-zsh-hook
    add-zsh-hook precmd prompt_purity_precmd

    ZSH_THEME_GIT_PROMPT_PREFIX=" %F{red}λ%f:"
    ZSH_THEME_GIT_PROMPT_DIRTY=""
    ZSH_THEME_GIT_PROMPT_CLEAN=""

    ZSH_THEME_GIT_PROMPT_ADDED="%F{green}+%f "
    ZSH_THEME_GIT_PROMPT_MODIFIED="%F{blue}%f "
    ZSH_THEME_GIT_PROMPT_DELETED="%F{red}x%f "
    ZSH_THEME_GIT_PROMPT_RENAMED="%F{magenta}➜%f "
    ZSH_THEME_GIT_PROMPT_UNMERGED="%F{yellow}═%f "
    ZSH_THEME_GIT_PROMPT_UNTRACKED="%F{white}%f "
    ZSH_THEME_GIT_PROMPT_STASHED="%B%F{red}%f%b "
    ZSH_THEME_GIT_PROMPT_BEHIND="%B%F{red}%f%b "
    ZSH_THEME_GIT_PROMPT_AHEAD="%B%F{green}%f%b "

    prompt_git_branch
    RPROMPT='$(prompt_git_info) $(git_prompt_status)'
    PROMPT=$'%F{white}%~ %B%F{blue}>%f%b '
}

prompt_purification_setup


bindkey "^[[1;5C" forward-word
bindkey "^[[1;5D" backward-word

source /home/opal/bin/zsh-autocomplete/zsh-autocomplete.plugin.zsh

#source <(kubectl completion zsh)
#+end_src

** zsh_aliases
#+begin_src shell :tangle ~/opalfiles/.config/zsh/zsh_aliases
# ~ Pacman ~ #
alias install="sudo pacman -S"
alias remove="sudo pacman -R"
alias search="pacman -Ss"
alias update="sudo pacman -Syyu"

# ~ Commands ~ #
alias ip="ip -c"
alias rm='echo "This is not the command you are looking for."; false'
alias cls='ls-awk'

# ~ Heck the GNU Coreutils ~ #
alias ls="exa"
alias cat="bat"
alias grep="rg"
alias dog="dog-dig"

# ~ Derp ~ #
alias unmount="umount"
alias please="sudo"

# ~ Source Zsh Configuration ~ #
alias zshrcsource="source ~/.config/zsh/.zshrc"
#+end_src
** zsh_functions
#+begin_src shell :tangle ~/opalfiles/.config/zsh/zsh_functions
# Make directory and CD into i.
mkcd () { mkdir -p -- "$1" && cd -P -- "$1" }

ls-awk () { ls -l --color=always | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/) \
             ,*2^(8-i));if(k)printf("%0o ",k);print}' }

dog-dig () { dog "$1" A AAAA MX NS TXT SOA }
#+end_src
** zprofile
#+begin_src shell :tangle ~/opalfiles/.config/zsh/.zprofile :mkdirp yes

# Each new shell auto-imports all environment variables.
# Hence exporting needs to be done only once.
# Also, all non-login shells are descendants of a login shell.
# Ergo, exports need to be done in the login shell only.
# Hence, we put exports in .zprofile

# Only vars needed by external commands should be exported.
# Note that you can export vars w/out assigning a value to them.

eval $(keychain --eval --quiet ry_ecdsa)
export XDG_CURRENT_DESKTOP=Unity
export BROWSER=/usr/bin/qutebrowser
export BW_SESSION="yWLHouCQOUDNWXOgK7eX/7lN4hvkqwyyjhfvhKlDwGjJOEpNX6G9dA/FLUqJ+QCpHxnGrVFDhmYjpGPmZZ+cnA=="
export XDG_CONFIG_HOME=~/.config
export XDG_CACHE_HOME=~/.cache
export XDG_DATA_HOME=~/.local/share
export XDG_STATE_HOME=~/.config/zsh
export EDITOR=vim
export VISUAL=vim

#+end_src
** zshenv
#+begin_src shell :tangle ~/opalfiles/.zshenv :mkdirp yes
if [[ -z "$XDG_CONFIG_HOME" ]]
then
        export XDG_CONFIG_HOME="$HOME/.config"
fi

if [[ -d "$XDG_CONFIG_HOME/zsh" ]]
then
        export ZDOTDIR="$XDG_CONFIG_HOME/zsh"
fi
#+end_src

#+RESULTS:
* Alacritty
#+begin_src sh :tangle ~/opalfiles/.config/alacritty/alacritty.yml :mkdirp yes
# Env
env:
  TERM: xterm-256color

# Font configuration
  size: 14
  offset:
    x: 0
    y: 0
#+end_src
* XDG User Directories
#+begin_src shell :tangle ~/opalfiles/.config/user-dirs.dirs :mkdirp yes
# This file is written by xdg-user-dirs-update
# If you want to change or add directories, just edit the line you're
# interested in. All local changes will be retained on the next run.
# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped
# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
# absolute path. No other format is supported.
#
XDG_DESKTOP_DIR="$HOME"
XDG_DOWNLOAD_DIR="$HOME/downloads"
XDG_TEMPLATES_DIR="$HOME"
XDG_PUBLICSHARE_DIR="$HOME"
XDG_DOCUMENTS_DIR="$HOME/documents"
XDG_MUSIC_DIR="$HOME/music"
XDG_PICTURES_DIR="$HOME/pictures"
XDG_VIDEOS_DIR="$HOME/videos"
#+end_src
* Archive
Programs that I've retired for one reason or another, and their configurations.
** i3
#+begin_src shell
# Autostart
# Background 
exec_always --no-startup-id feh --bg-scale ~/.config/wallpapers/fog-wallpaper.jpg

# Redshift
exec_always --no-startup-id redshift

# Picom
exec_always --no-startup-id picom &

# Turn Caps Lock into Escape because Caps Lock is useless unless you're a DB admin.
exec_always --no-startup-id xmodmap ~/.config/xmodmap/xmodmap

# Set key repeat rate so text cursors move faster.
exec_always --no-startup-id xset r rate 200 35

# Dunst
exec_always --no-startup-id dunst

# xss-lock grabs a logind suspend inhibit lock and will use i3lock to lock the
# screen before suspend. Use loginctl lock-session to lock your screen.
# exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock --nofork

# 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

# i3 config file (v4)
set $mod Mod4

# Title Bars
for_window [class="*"] border pixel 0

# Gaps
smart_gaps on
gaps inner 10
gaps outer 10

# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.
font pango:Fira Code Regular 12

# 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

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


# 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

# Lock
bindsym Control+Shift+e exec loginctl lock-session

# 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 rofi -show drun -columns 3 -theme ~/.config/rofi/config.rasi
# There also is the (new) i3-dmenu-desktop which only displays applications
# shipping a .desktop file. It is a wrapper around dmenu, so you need that
# installed.
# bindsym $mod+d exec --no-startup-id i3-dmenu-desktop

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

# move focused window
bindsym $mod+Shift+h move left
bindsym $mod+Shift+j move down
bindsym $mod+Shift+k move up
bindsym $mod+Shift+l move right

# split in horizontal orientation
bindsym $mod+b 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

# 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 semicolon 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)
# panel
bar {
        colors {
        background #2f343f
        statusline #2f343f
        separator #4b5262

        # colour of border, background, and text
        focused_workspace       #2f343f #bf616a #d8dee8
        active_workspace        #2f343f #2f343f #d8dee8
        inactive_workspace      #2f343f #2f343f #d8dee8
        urgent_workspacei       #2f343f #ebcb8b #2f343f
    }
        status_command i3status
        position top
}
#+end_src

** i3status
#+begin_src shell
general {
        output_format = "i3bar"
        colors = false
        markup = pango
        interval = 5
        color_good = '#2f343f'
        color_degraded = '#ebcb8b'
        color_bad = '#ba5e57'
}

order += "load"
order += "cpu_temperature 0"
order += "disk /"
order += "disk /home"
order += "ethernet enp0s13f0u2u1"
order += "wireless wlp0s20f3"
order += "volume master"
order += "battery 0"
order += "tztime local"

load {
        format = "<span background='#f59335'>  %5min Load </span>"
}

cpu_temperature 0 {
        format = "<span background='#bf616a'>  %degrees °C </span>"
        path = "/sys/class/thermal/thermal_zone0/temp"
}

disk "/" {
        format = "<span background='#fec7cd'>  %free Free </span>"
}

disk "/home" {
        format = "<span background='#a1d569'>  %free Free </span>"
}

ethernet enp0s13f0u2u1 {
        format_up = "<span background='#88c0d0'>  %ip </span>"
        format_down = "<span background='#88c0d0'>  Disconnected </span>"
}

wireless wlp0s20f3 {
        format_up = "<span background='#b48ead'>  %essid </span>"
        format_down = "<span background='#b48ead'>  Disconnected </span>"
}

volume master {
        format = "<span background='#ebcb8b'>  %volume </span>"
        format_muted = "<span background='#ebcb8b'>  Muted </span>"
        device = "default"
        mixer = "Master"
        mixer_idx = 0
}

battery 0 {
	last_full_capacity = true
        format = "<span background='#a3be8c'>  %status %percentage </span>"
        format_down = "No Battery"
        status_chr = "Charging"
        status_bat = "Battery"
        status_unk = "Unknown"
        status_full = "Charged"
        path = "/sys/class/power_supply/BAT0/uevent"
        low_threshold = 10
}

tztime local {
		format = "<span background='#81a1c1'> %time </span>"
		format_time = " %a %-d %b %H:%M"
}
#+end_src

** Rofi
#+begin_src shell
configuration {
	modi:				"drun";
	font:				"Fira Code Regular 10";
	show-icons:                     true;
	icon-theme: 			"Reversal-dark";
	display-drun: 			"";
	drun-display-format:            "{name}";
	sidebar-mode: 			false;
}

@theme "/dev/null"

 * {
	bg:				#151515;
	fg:				#e8e8d3;
	accent:				#687363;
	button:				#1c1c1c;

	background-color:		@bg;
	text-color:			@fg;
}

window {
	border-radius:                  7px;
	width:			    	50%;
	padding: 			32px;
}

prompt {
	background-color:		@button;
	enabled:			true;
	padding:			0.5% 32px 0% -0.5%;
	font:				"Rubik 10";
}

entry {
    	placeholder:			"Search";
	background-color:               @button;
    	placeholder-color:              @fg;
    	expand:                         true;
    	padding:                        0.15% 0% 0% 0%;
}

inputbar {
	children:			[ prompt, entry ];
    	background-color:               @button;
    	expand:                         false;
    	border-radius:                  6px;
    	margin:                         0%;
    	padding:                        10px;
}

listview {
    	columns:                        4;
    	lines:	                        3;
    	cycle:                          false;
    	dynamic:                        true;
    	layout:                         vertical;
}

mainbox {
    	children:                       [ inputbar, listview ];
    	spacing:                       	2%;
    	padding:                        2% 1% 2% 1%;
}

element {
    	orientation:                    vertical;
    	padding:                        2% 0% 2% 0%;
}

element-icon {
    	size:                           48px;
    	horizontal-align:	 	0.5;
}

element-text {
    	expand:                         true;
    	horizontal-align:               0.5;
    	vertical-align:                 0.5;
    	margin:                         0.5% 0.5% -0.5% 0.5%;
}

element-text, element-icon {
	background-color:		inherit;
	text-color:			inherit;
}

element selected {
    	background-color:               @button;
    	border-radius:                  6px;
}
#+end_src
** Picom
#+begin_src shell
#################################
#             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 = 7;

# 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 = -7;

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

# 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

# Hex string color value of shadow (#000000 - #FFFFFF, defaults to #000000). This option will override options set shadow-(red/green/blue)
# shadow-color = "#000000"

# Specify a list of conditions of windows that should have no shadow.
#
# examples:
#   shadow-exclude = "n:e:Notification";
#
# shadow-exclude = []
shadow-exclude = [
  "name = 'Notification'",
  "class_g = 'Conky'",
  "class_g ?= 'Notify-osd'",
  "class_g = 'Cairo-clock'",
  "_GTK_FRAME_EXTENTS@:c"
];

# Specify a list of conditions of windows that should have no shadow painted over, such as a dock window.
# clip-shadow-above = []

# 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.03;

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

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

# Specify a list of conditions of windows that should not be faded.
# fade-exclude = []

# 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.8;

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

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

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

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

# Specify a list of conditions of windows that should never be considered focused.
# focus-exclude = []
focus-exclude = [ "class_g = 'Cairo-clock'" ];

# 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 = []


#################################
#           Corners             #
#################################

# Sets the radius of rounded window corners. When > 0, the compositor will
# round the corners of windows. Does not interact well with
# `transparent-clipping`.
corner-radius = 0

# Exclude conditions for rounded corners.
rounded-corners-exclude = [
  "window_type = 'dock'",
  "window_type = 'desktop'"
];


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


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

# 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 = false

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


# Exclude conditions for background blur.
# blur-background-exclude = []
blur-background-exclude = [
  "window_type = 'dock'",
  "window_type = 'desktop'",
  "_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.
#
# 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;

# 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.
#
# 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. This usually means windows from the same application
# will be considered focused or unfocused at the same time.
# 'WM_TRANSIENT_FOR' has higher priority if detect-transient is enabled, too.
#
# detect-client-leader = false

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

# 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 = "warn";

# 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.
#
#   clip-shadow-above:::
#     Controls wether shadows that would have been drawn above the window should
#     be clipped. Useful for dock windows that should have no shadow painted on top.
#
#   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:
{
  tooltip = { fade = true; shadow = true; opacity = 0.75; focus = true; full-shadow = false; };
  dock = { shadow = false; clip-shadow-above = true; }
  dnd = { shadow = false; }
  popup_menu = { opacity = 0.8; }
  dropdown_menu = { opacity = 0.8; }
};
#+end_src

** Redshift
#+begin_src shell
[redshift]
temp-day=5700
temp-night=3400
fade=1
location-provider=manual
adjustment-method=randr

[manual]
lat=47.6
lon=-122.3
#+end_src

