From d71e6c720bd7a704b5251f960fdb012c7ad29831 Mon Sep 17 00:00:00 2001
From: Salt <rehashedsalt@cock.li>
Date: Tue, 19 Jan 2021 01:46:02 -0600
Subject: [PATCH] Port over more of my basic bitch gruvbox desktop

---
 desktop-gruvbox/.config/bspwm/bspwmrc         | 115 ++++++
 desktop-gruvbox/.config/compton.conf          |  90 +++++
 .../.config/conky/conky-clock.conf            |  49 +++
 desktop-gruvbox/.config/conky/gen.sh          | 334 ++++++++++++++++++
 desktop-gruvbox/.config/dunst/dunstrc         | 321 +++++++++++++++++
 desktop-gruvbox/.config/dunst/dunstrc-light   | 321 +++++++++++++++++
 desktop-gruvbox/.config/gtk-3.0/settings.ini  |  16 +
 .../.config/oomox/colors/Gruvbox/Dark         |  78 ++++
 desktop-gruvbox/.config/polybar/config        | 288 +++++++++++++++
 desktop-gruvbox/.config/polybar/launch.sh     |  82 +++++
 desktop-gruvbox/.config/qt5ct/qt5ct.conf      |  28 ++
 desktop-gruvbox/.config/rofi/config.rasi      | 108 ++++++
 desktop-gruvbox/.config/sxhkd/sxhkdrc         |  74 ++++
 13 files changed, 1904 insertions(+)
 create mode 100755 desktop-gruvbox/.config/bspwm/bspwmrc
 create mode 100644 desktop-gruvbox/.config/compton.conf
 create mode 100644 desktop-gruvbox/.config/conky/conky-clock.conf
 create mode 100755 desktop-gruvbox/.config/conky/gen.sh
 create mode 100644 desktop-gruvbox/.config/dunst/dunstrc
 create mode 100644 desktop-gruvbox/.config/dunst/dunstrc-light
 create mode 100644 desktop-gruvbox/.config/gtk-3.0/settings.ini
 create mode 100644 desktop-gruvbox/.config/oomox/colors/Gruvbox/Dark
 create mode 100644 desktop-gruvbox/.config/polybar/config
 create mode 100755 desktop-gruvbox/.config/polybar/launch.sh
 create mode 100644 desktop-gruvbox/.config/qt5ct/qt5ct.conf
 create mode 100644 desktop-gruvbox/.config/rofi/config.rasi
 create mode 100644 desktop-gruvbox/.config/sxhkd/sxhkdrc

diff --git a/desktop-gruvbox/.config/bspwm/bspwmrc b/desktop-gruvbox/.config/bspwm/bspwmrc
new file mode 100755
index 00000000..80dce62d
--- /dev/null
+++ b/desktop-gruvbox/.config/bspwm/bspwmrc
@@ -0,0 +1,115 @@
+#!/bin/bash
+#
+# bspwmrc
+# bspwm configuration file
+#
+
+## Start a hotkey daemon
+pgrep sxhkd -u "$UID" || sxhkd &
+
+## Monitor allocation
+# Honestly pretty complex
+setmon() {
+	desktops_total=10
+	desktops_primary=8
+	desktops_secondary=$(( desktops_total - desktops_primary ))
+
+	monitor_primary="$(xrandr -q | awk '/primary/{print $1}')"
+	monitors_secondary=($(xrandr -q | grep ' connected' | grep -v 'primary' | awk '{print $1}'))
+	# Ensure we have enough for every monitor
+	if (( desktops_secondary < ${#monitors_secondary[@]} )); then
+		echo "Adding more desktops to match connected monitors"
+		desktops_secondary=${#monitors_secondary[@]}
+		desktops_total=$(( desktops_secondary + desktops_primary ))
+	fi
+	if (( ${#monitors_secondary[@]} == 0 )); then
+		echo "Only one monitor allocated"
+		layout=$(seq --separator=" " 1 $desktops_total)
+		echo "Setting layout $layout"
+		bspc monitor $monitor_primary -d $layout
+	else
+		echo "${#monitors_secondary[@]} monitors connected"
+		deskpermon=$(( desktops_secondary / ${#monitors_secondary[@]} ))
+		layout=$(seq --separator=" " 1 $desktops_primary)
+		echo "Setting primary layout $layout"
+		bspc monitor $monitor_primary -d $layout
+
+		for m in $(seq 0 $(( ${#monitors_secondary[@]} - 1 ))); do
+			layout=$(seq --separator=" " \
+				$(( 1 + m + desktops_primary )) \
+				${#monitors_secondary[@]} \
+				"$desktops_total" \
+				)
+			echo "Setting layout for ${monitors_secondary[$m]} to $layout"
+			bspc monitor ${monitors_secondary[$m]} -d $layout
+		done
+	fi
+}
+setmon
+
+## Behavior
+# Tiling behavior
+bspc config split_ratio			0.50
+bspc config remove_disabled_monitors	false
+bspc config remove_unplugged_monitors	true
+
+# Pointer behavior
+bspc config click_to_focus		any
+bspc config focus_follows_pointer	true
+bspc config pointer_follows_monitor	true
+bspc config pointer_modifier		mod1
+bspc config pointer_action1		move #LMB
+bspc config pointer_action2		resize_corner #RMB
+
+# ewmh behavior
+bspc config ignore_ewmh_focus		true # Fuck you, Discord
+
+## Looks
+# Padding
+bspc config border_width		4
+bspc config window_gap			6
+bspc config single_monocle		false
+bspc config borderless_monocle		false
+bspc config gapless_monocle		false
+# Colors
+case $THEME in
+	light)
+		bspc config normal_border_color			"#f2e5bc" #Unfocused
+		bspc config active_border_color			"#8ec07c" #Focused, but current monitor isn't
+		bspc config focused_border_color		"#83a598" #Focused completely
+		bspc config presel_feedback_color		"#ebdbb2" #???
+		;;
+	*)
+		bspc config normal_border_color			"#32302f" #Unfocused
+		bspc config active_border_color			"#8ec07c" #Focused, but current monitor isn't
+		bspc config focused_border_color		"#83a598" #Focused completely
+		bspc config presel_feedback_color		"#ebdbb2" #???
+		;;
+esac
+
+## Rules
+bspc rule -r '*'
+case $HOSTNAME in
+	dsk-cstm-0*)
+		# Big boy gets pseudotiled Firefox
+		bspc rule -a Firefox state=pseudo_tiled rectangle=1920x1080+0+0
+		;;
+	*)
+		;;
+esac
+bspc rule -a Steam desktop=7
+bspc rule -a KeePassXC desktop=8
+bspc rule -a slack desktop=9
+bspc rule -a Riot desktop=9
+bspc rule -a Element desktop=9
+bspc rule -a discord desktop=9
+bspc rule -a spotify desktop=10
+bspc rule -a cantata desktop=10
+bspc rule -a 'Minecraft 1.7.10' state=fullscreen
+bspc rule -a 'NieR:Automata' state=fullscreen
+# Plasma rules
+bspc rule -a plasmashell state=floating sticky=on border=off
+bspc rule -a krunner state=floating layer=above sticky=on border=off
+# Widgets
+bspc rule -a Conky state=floating layer=below sticky=on
+bspc rule -a pavucontrol-qt state=floating layer=above sticky=on
diff --git a/desktop-gruvbox/.config/compton.conf b/desktop-gruvbox/.config/compton.conf
new file mode 100644
index 00000000..0576c9d3
--- /dev/null
+++ b/desktop-gruvbox/.config/compton.conf
@@ -0,0 +1,90 @@
+## BACKEND
+
+backend = "glx";
+glx-no-stencil = true;
+glx-copy-from-front = 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).
+# Recommended if it works.
+glx-no-rebind-pixmap = true;
+
+## SHADOWS
+
+shadow = true;
+shadow-radius = 30;
+shadow-offset-x = -25;
+shadow-offset-y = -25;
+shadow-opacity = 0.45;
+# shadow-red = 0.0;
+# shadow-green = 0.0;
+# shadow-blue = 0.0;
+shadow-ignore-shaped = false;
+
+shadow-exclude = [
+	"name = 'oneko'",
+	"name = 'Notification'",
+	"name = 'xfce4-notifyd'",
+	"name *= 'VLC'",
+	"name *= 'compton'",
+	"name *= 'cpt_frame_window'",
+	"name *= 'Chromium'",
+	"name *= 'Chrome'",
+	"name *= 'Conky'",
+	"name *= 'Polybar tray window'",
+	"class_g = 'Conky'",
+	"class_g ?= 'Notify-osd'",
+	"class_g ?= 'Xfce4-notifyd'",
+	"class_g ?= 'Xfce4-power-manager'",
+	"class_g ?= 'Wine'",
+	"_GTK_FRAME_EXTENTS@:c"
+];
+
+## FADING
+
+fading = true;
+# The time between steps in a fade in milliseconds. (default 10).
+fade-delta = 5;
+# Opacity change between steps while fading in. (default 0.028).
+fade-in-step = 0.08;
+# Opacity change between steps while fading out. (default 0.03).
+fade-out-step = 0.08;
+# Fade windows in/out when opening/closing
+# no-fading-openclose = true;
+
+fade-exclude = [ ];
+
+## OTHER
+
+# Try to detect WM windows and mark them as active.
+mark-wmwin-focused = true;
+# Mark all non-WM but override-redirect windows active (e.g. menus).
+mark-ovredir-focused = true;
+use-ewmh-active-win = true;
+detect-rounded-corners = true;
+detect-client-opacity = true;
+refresh-rate = 143.86;
+vsync = true;
+# Enable DBE painting mode, intended to use with VSync to (hopefully) eliminate tearing.
+# Reported to have no effect, though.
+dbe = false;
+# Unredirect all windows if a full-screen opaque window is detected, to maximize performance for full-screen windows, like games.
+# Known to cause flickering when redirecting/unredirecting windows.
+# paint-on-overlay may make the flickering less obvious.
+unredir-if-possible = false;
+
+# Specify a list of conditions of windows that should always be considered focused.
+focus-exclude = [ ];
+
+detect-transient = true;
+detect-client-leader = true;
+
+## WINDOW TYPE SETTINGS
+
+wintypes:
+{
+	tooltip =
+	{
+		focus = true;
+	};
+};
diff --git a/desktop-gruvbox/.config/conky/conky-clock.conf b/desktop-gruvbox/.config/conky/conky-clock.conf
new file mode 100644
index 00000000..65ea5eea
--- /dev/null
+++ b/desktop-gruvbox/.config/conky/conky-clock.conf
@@ -0,0 +1,49 @@
+-- vim: ts=4 sw=4 noet ai cindent syntax=lua
+conky.config = {
+	own_window = true,
+	own_window_title = 'Conky',
+	own_window_class = 'Conky',
+	own_window_type = 'desktop',
+	own_window_hints = 'undecorated,below,sticky,skip_taskbar,skip_pager',
+	own_window_colour = '232629',
+
+	double_buffer = true,
+	cpu_avg_samples = 2,
+	net_avg_samples = 2,
+	no_buffers = true,
+	update_interval = 1,
+
+	use_xft = true,
+	font = 'IBM Plex Sans:style=Light:size=9',
+	default_color = '#fffcf6',
+	color1 = '232629', -- Background
+	color2 = 'fffcf6', -- Foreground
+	color3 = '4b5162', -- Background-alt
+
+	alignment = 'bottom_right',
+	xinerama_head = 0,
+	minimum_height = 0,
+	minimum_width = 304,
+	border_width = 0,
+	border_outer_margin = 0,
+	border_inner_margin = 16,
+	gap_x = 27,
+	gap_y = 72,
+
+	format_human_readable = true,
+	temperature_unit = "celsius",
+	if_up_strictness = "link",
+
+	default_bar_height = 11,
+	default_bar_width = 130,
+	default_graph_height = 36,
+	draw_borders = true,
+	draw_outline = false,
+	draw_graph_borders = true,
+	draw_shades = false
+}
+conky.text = [[
+${font IBM Plex Sans:style=Light:size=96}$alignr${time %l:%M %p}$font
+
+${font IBM Plex Sans:style=Light:size=32}$alignr${time %A, %B %d, %Y}$font
+]]
diff --git a/desktop-gruvbox/.config/conky/gen.sh b/desktop-gruvbox/.config/conky/gen.sh
new file mode 100755
index 00000000..ee452577
--- /dev/null
+++ b/desktop-gruvbox/.config/conky/gen.sh
@@ -0,0 +1,334 @@
+#! /bin/bash
+#                  _
+#   ___ ___  _ __ | | ___   _  __ _  ___ _ __
+#  / __/ _ \| '_ \| |/ / | | |/ _` |/ _ \ '_ \
+# | (_| (_) | | | |   <| |_| | (_| |  __/ | | |
+#  \___\___/|_| |_|_|\_\\__, |\__, |\___|_| |_|
+#                       |___/ |___/
+#
+# conkygen.sh
+# Create a Conky configuration file dynamically
+#
+# Copyright (c) 2020 Vintage Salt <rehashedsalt@cock.li>
+# Distributed under the terms of the MIT License
+#
+set -e
+
+# Read-only set-once variables
+declare -r _name="$(basename -- "$0")"
+# Options
+declare _optout="${XDG_CONFIG_HOME:-$HOME/.config}/conky/conky.conf"
+declare -i _optbar=1
+declare -i _optgraph=1
+declare -i _opthelp
+declare -i _optverbose
+declare -i _opttopitems=4
+# Working variables
+declare -a _args
+declare _return
+
+# Helper functions
+log() {
+	# Print a line to the terminal if _optverbose is greater than $2
+	# $2 defaults to 0
+	# loglevel 0: Daily-use messages
+	# loglevel 1: Detailed but not quite debugging
+	# loglevel 2: Definitely debugging
+	[ -z "$1" ] && return 1
+	if (( _optverbose >= ${2:-0} )); then
+		printf "%s\\n" "$1"
+	fi
+}
+warn() {
+	# Print a yellow line to the terminal, respecting _optverbose
+	[ -z "$1" ] && return 1
+	if (( _optverbose >= ${2:-0} )); then
+		if [ -t 1 ]; then
+			printf "\\e[33m%s\\e[0m\\n" "$1"
+		else
+			printf "WARN: %s\\n" "$1"
+		fi
+	fi
+}
+error() {
+	# Print a red line to the terminal, exit if $2 is specified
+	[ -z "$1" ] && return 1
+	if [ -t 2 ]; then
+		printf "\\e[31m%s\\e[0m\\n" "$1" 1>&2
+	else
+		printf "ERROR: %s\\n" "$1" 1>&2
+	fi
+	[ -z "$2" ] && return
+	exit "${2:-1}"
+}
+has() {
+	# Parse out all arguments and try to find them in path
+	# If an argument cannot be found, set _return and fail
+	for prog in "$@"; do
+		if ! command -v "$prog" > /dev/null 2>&1; then
+			_return="$prog"
+			return 1
+		fi
+	done
+	return 0
+}
+
+# Core program functions
+printhelp() {
+	cat << EOF
+Usage: $_name [OPTION]...
+Generate a conky.conf configuration file in the current directory
+
+  -o			Specify output file. Defaults to
+			~/.config/conky/conky.conf
+  -b			Hide bars
+  -g			Hide graphs
+  -h			Print this help text
+  -t			Number of items to print in top lists. Defaults to 4
+  -v			Print more status messages. Stacks
+
+Copyright (c) 2020 rehashedsalt@cock.li
+Licensed under the MIT license
+EOF
+}
+step_header() {
+	# Clobber output file with header
+	cat << EOF > "$_optout"
+-- vim: ts=4 sw=4 noet ai cindent syntax=lua
+-- WARNING:
+-- This file was generated with conkygen. See gen.sh if you need to edit this!
+-- Any changes you make here can and probably will be clobbered!
+EOF
+}
+step_config() {
+	# Append config to the output file
+	cat << EOF >> "$_optout"
+conky.config = {
+	own_window = true,
+	own_window_title = 'Conky',
+	own_window_class = 'Conky',
+	own_window_type = 'desktop',
+	own_window_hints = 'undecorated,below,sticky,skip_taskbar,skip_pager',
+	own_window_argb_visual = true,
+	own_window_transparent = true,
+	own_window_colour = '000000',
+
+	double_buffer = true,
+	cpu_avg_samples = 2,
+	net_avg_samples = 2,
+	no_buffers = true,
+	update_interval = 1,
+
+	use_xft = true,
+	font = 'IBM Plex Sans:style=Light:size=9',
+	default_color = '#ebdbb2',
+	color1 = '282828', -- Background
+	color2 = 'ebdbb2', -- Foreground
+	color3 = '32302f', -- Background-alt
+	color4 = 'b8bb26', -- Green (Battery)
+	color6 = '8ec07c', -- Cyan (Network)
+	color7 = 'fabd2f', -- Yellow (Disk)
+	color8 = '83a598', -- Blue (CPU)
+	color9 = 'de869b', -- Magenta (Memory)
+
+	alignment = 'top_left',
+	xinerama_head = 0,
+	minimum_height = 0,
+	minimum_width = 304,
+	border_width = 0,
+	border_outer_margin = 0,
+	border_inner_margin = 16,
+	gap_x = 22,
+	gap_y = 66,
+
+	format_human_readable = true,
+	temperature_unit = "celsius",
+	if_up_strictness = "link",
+
+	default_bar_height = 11,
+	default_bar_width = 130,
+	default_graph_height = 36,
+	draw_borders = true,
+	draw_outline = false,
+	draw_graph_borders = true,
+	draw_shades = false
+}
+EOF
+}
+step_text() {
+	local -r nproc="$(nproc)"
+	# Generate our actual functional Conky stuff
+	# Header
+	cat <<- 'EOF' >> "$_optout"
+	conky.text = [[
+	${font IBM Plex Sans:style=Light:size=64}$alignr${time %l:%M %p}$font
+	${font IBM Plex Sans:style=Light:size=18}$alignr${time %A, %B %d, %Y}$font
+	${font IBM Plex Sans:style=Light:size=12}${acpitemp}°C$alignr${no_update $nodename_short}$font
+	EOF
+
+	# CPU info
+	cat <<- 'EOF' >> "$_optout"
+	${color3}$hr$color
+	${font IBM Plex Sans:style=Medium:size=9}CPU$font: $freq_g GHz$alignr$cpu%
+	EOF
+	if (( _optgraph > 0 )); then
+		local gpl=1
+		if (( nproc <= 2 )); then
+			gpl=1
+		elif (( nproc <= 4 )); then
+			gpl=2
+		elif (( nproc <= 8 )); then
+			gpl=4
+		else
+			gpl=8
+		fi
+		local width=$(( ( 400 - ( gpl - 1 ) * 3 ) / gpl ))
+		log "Generating $gpl graphs per row of CPU core stats" 1
+		log "Graphs will be $width wide" 2
+		local cpuinfo
+		for i in $(seq 1 "$gpl" "$nproc"); do
+			# Generate lines
+			local line
+			for j in $(seq 0 $(( gpl - 1 ))); do
+				# Generate graphs
+				local cpu=$(( i + j ))
+				log "Generating graph for CPU $cpu" 2
+				if [ -z "$line" ]; then
+					line="\${cpugraph cpu$cpu 36,$width}"
+				else
+					line="$line \${cpugraph cpu$cpu 36,$width}"
+				fi
+			done
+			# Trim whitespace
+			line="\${color8}${line%" "}\$color"
+			log "Appending line: $line" 2
+			cpuinfo="$cpuinfo$line\n"
+			unset line
+		done
+		while [ "$cpuinfo" != "${cpuinfo%\\n}" ]; do
+			cpuinfo="${cpuinfo%\\n}"
+		done
+		echo -e "$cpuinfo" >> "$_optout"
+	fi
+	for i in $(seq $_opttopitems); do
+		echo "\${color8}\${top name $i}\$color\$alignr\${top cpu $i}%" >> "$_optout"
+	done
+
+	# Memory info
+	cat <<- 'EOF' >> "$_optout"
+	${color3}$hr$color
+	${font IBM Plex Sans:style=Medium:size=9}Memory$font: $mem / $memmax used$alignr$memperc%
+	EOF
+	if (( _optgraph > 0 )); then
+		echo -e '${color9}${memgraph}$color' >> "$_optout"
+	fi
+	if (( _optbar > 0 )); then
+		echo -e 'Memory$alignr$memeasyfree ${color9}${membar}$color' >> "$_optout"
+		if [ -n "$(swapon)" ]; then
+			echo "Swap\$alignr\$swapfree \${color9}\${swapbar}\$color" >> "$_optout"
+		fi
+	fi
+	for i in $(seq $_opttopitems); do
+		echo "\${color9}\${top_mem name $i}\$color\$alignr\${top_mem mem $i}%" >> "$_optout"
+	done
+
+	# Disk info
+	cat <<- 'EOF' >> "$_optout"
+	${color3}$hr$color
+	${font IBM Plex Sans:style=Medium:size=9}Disk$font (R/W):$alignr${diskio /dev/sda}
+	EOF
+	if (( _optgraph > 0 )); then
+		echo '${color7}${diskiograph_read /dev/sda 36,200} ${diskiograph_write /dev/sda 36,200}$color' >> "$_optout"
+	fi
+	# Mountpoint detection
+	if (( _optbar > 0 )); then
+		for mountpoint in / /home /var /usr /opt /boot /boot/efi; do
+			if mountpoint $mountpoint > /dev/null 2>&1; then
+				echo "$mountpoint\$alignr\${fs_free $mountpoint} \${color7}\${fs_bar $mountpoint}\$color" >> "$_optout"
+			fi
+		done
+	fi
+	for i in $(seq $_opttopitems); do
+		echo "\${color7}\${top_io name $i}\$color\$alignr\${top_io io_perc $i}%" >> "$_optout"
+	done
+
+	# Networking
+	cat <<-'EOF' >>"$_optout"
+	${color3}$hr$color
+	${font IBM Plex Sans:style=Medium:size=9}Network$font:${alignr}Default $gw_iface${if_up wlp1s0}
+	EOF
+	for interface in $(iw dev | awk '$1=="Interface"{print $2}'); do
+		echo "$interface (U/D): \$alignr\${addr $interface} / \${wireless_essid $interface}" >> "$_optout"
+		if (( _optgraph > 0 )); then
+			echo "\${color6}\${upspeedgraph $interface 36,200} \${downspeedgraph $interface 36,200}\$color" >> "$_optout"
+		fi
+	done
+	echo "]]" >> "$_optout"
+}
+genconfig() {
+	log "Generating config: $_optout"
+	step_header
+	step_config
+	step_text
+}
+
+# Main
+main() {
+	# Parse out arguments
+	while [ -n "$1" ]; do
+		# Parse out flags
+		while getopts ":bgho:t:v" opt; do
+			case $opt in
+				b)
+					_optbar=0
+					;;
+				g)
+					_optgraph=0
+					;;
+				o)
+					_optout="$OPTARG"
+					;;
+				h)
+					_opthelp=1
+					;;
+				t)
+					_opttopitems="$OPTARG"
+					;;
+				v)
+					_optverbose+=1
+					;;
+				:)
+					error "Option requires argument: -$OPTARG" 2
+					;;
+				*)
+					error "Invalid option: -$OPTARG" 2
+					;;
+			esac
+		done
+		# Store arguments
+		shift $((OPTIND - 1))
+		if [ -n "$1" ]; then
+			_args+=("$1")
+			shift
+		fi
+		unset OPTIND
+	done
+	# Early hook for help
+	[ -n "$_opthelp" ] && printhelp && exit 0
+	# Validate critical options
+	if ! (( _opttopitems >= 0 )); then
+		error "Option -t requires non-negative integer as argument" 2
+	fi
+	# Validate core program dependencies
+	log "Validating dependencies" 2
+	if ! has awk basename iw seq; then
+		error "Failed to find program: $_return" 1
+	fi
+
+	# Do the do
+	genconfig
+	exit 0
+}
+
+main "$@"
+
diff --git a/desktop-gruvbox/.config/dunst/dunstrc b/desktop-gruvbox/.config/dunst/dunstrc
new file mode 100644
index 00000000..3b5e9f0a
--- /dev/null
+++ b/desktop-gruvbox/.config/dunst/dunstrc
@@ -0,0 +1,321 @@
+[global]
+    ### Display ###
+
+    # Which monitor should the notifications be displayed on.
+    monitor = 0
+
+    # Display notification on focused monitor.  Possible modes are:
+    #   mouse: follow mouse pointer
+    #   keyboard: follow window with keyboard focus
+    #   none: don't follow anything
+    #
+    # "keyboard" needs a window manager that exports the
+    # _NET_ACTIVE_WINDOW property.
+    # This should be the case for almost all modern window managers.
+    #
+    # If this option is set to mouse or keyboard, the monitor option
+    # will be ignored.
+    follow = mouse
+
+    # The geometry of the window:
+    #   [{width}]x{height}[+/-{x}+/-{y}]
+    # The geometry of the message window.
+    # The height is measured in number of notifications everything else
+    # in pixels.  If the width is omitted but the height is given
+    # ("-geometry x2"), the message window expands over the whole screen
+    # (dmenu-like).  If width is 0, the window expands to the longest
+    # message displayed.  A positive x is measured from the left, a
+    # negative from the right side of the screen.  Y is measured from
+    # the top and down respectively.
+    # The width can be negative.  In this case the actual width is the
+    # screen width minus the width defined in within the geometry option.
+    geometry = "500x8-6+50"
+    corner_radius = 0
+
+    # Show how many messages are currently hidden (because of geometry).
+    indicate_hidden = yes
+
+    # Shrink window if it's smaller than the width.  Will be ignored if
+    # width is 0.
+    shrink = no
+
+    # The transparency of the window.  Range: [0; 100].
+    # This option will only work if a compositing window manager is
+    # present (e.g. xcompmgr, compiz, etc.).
+    transparency = 0
+
+    # The height of the entire notification.  If the height is smaller
+    # than the font height and padding combined, it will be raised
+    # to the font height and padding.
+    notification_height = 0
+
+    # Draw a line of "separator_height" pixel height between two
+    # notifications.
+    # Set to 0 to disable.
+    separator_height = 4
+
+    # Padding between text and separator.
+    padding = 12
+
+    # Horizontal padding.
+    horizontal_padding = 12
+
+    # Defines width in pixels of frame around the notification window.
+    # Set to 0 to disable.
+    frame_width = 4
+
+    # Defines color of the frame around the notification window.
+     frame_color = "#f2e5bc"
+
+    # Define a color for the separator.
+    # possible values are:
+    #  * auto: dunst tries to find a color fitting to the background;
+    #  * foreground: use the same color as the foreground;
+    #  * frame: use the same color as the frame;
+    #  * anything else will be interpreted as a X color.
+    separator_color = frame
+
+    # Sort messages by urgency.
+    sort = yes
+
+    # Don't remove messages, if the user is idle (no mouse or keyboard input)
+    # for longer than idle_threshold seconds.
+    # Set to 0 to disable.
+    idle_threshold = 120
+
+    ### Text ###
+
+    #font = Monospace 8
+     font = Roboto 10
+
+    # The spacing between lines.  If the height is smaller than the
+    # font height, it will get raised to the font height.
+    line_height = 0
+
+    # Possible values are:
+    # full: Allow a small subset of html markup in notifications:
+    #        <b>bold</b>
+    #        <i>italic</i>
+    #        <s>strikethrough</s>
+    #        <u>underline</u>
+    #
+    #        For a complete reference see
+    #        <http://developer.gnome.org/pango/stable/PangoMarkupFormat.html>.
+    #
+    # strip: This setting is provided for compatibility with some broken
+    #        clients that send markup even though it's not enabled on the
+    #        server. Dunst will try to strip the markup but the parsing is
+    #        simplistic so using this option outside of matching rules for
+    #        specific applications *IS GREATLY DISCOURAGED*.
+    #
+    # no:    Disable markup parsing, incoming notifications will be treated as
+    #        plain text. Dunst will not advertise that it has the body-markup
+    #        capability if this is set as a global setting.
+    #
+    # It's important to note that markup inside the format option will be parsed
+    # regardless of what this is set to.
+    markup = full
+
+    # The format of the message.  Possible variables are:
+    #   %a  appname
+    #   %s  summary
+    #   %b  body
+    #   %i  iconname (including its path)
+    #   %I  iconname (without its path)
+    #   %p  progress value if set ([  0%] to [100%]) or nothing
+    #   %n  progress value if set without any extra characters
+    # Markup is allowed
+    format = "<span font='Bold'>%s</span> <span font='Light'>(%a)</span>\n%b"
+
+    # Alignment of message text.
+    # Possible values are "left", "center" and "right".
+    alignment = left
+
+    # Show age of message if message is older than show_age_threshold
+    # seconds.
+    # Set to -1 to disable.
+    show_age_threshold = 60
+
+    # Split notifications into multiple lines if they don't fit into
+    # geometry.
+    word_wrap = yes
+
+    # Ignore newlines '\n' in notifications.
+    ignore_newline = no
+
+    # Merge multiple notifications with the same content
+    stack_duplicates = true
+
+    # Hide the count of merged notifications with the same content
+    hide_duplicate_count = false
+
+    # Display indicators for URLs (U) and actions (A).
+    show_indicators = yes
+
+    ### Icons ###
+
+    # Align icons left/right/off
+    icon_position = right
+
+    # Scale larger icons down to this size, set to 0 to disable
+    max_icon_size = 48
+
+    # Paths to default icons.
+    icon_path = /usr/share/icons/Papirus-Light/48x48/status/:/usr/share/icons/Papirus-Light/48x48/devices/:/usr/share/icons/Papirus-Light/48x48/apps
+
+    ### History ###
+
+    # Should a notification popped up from history be sticky or timeout
+    # as if it would normally do.
+    sticky_history = yes
+
+    # Maximum amount of notifications kept in history
+    history_length = 20
+
+    ### Misc/Advanced ###
+
+    # dmenu path.
+    dmenu = /usr/bin/rofi -dmenu -p dunst:
+
+    # Browser for opening urls in context menu.
+    browser = xdg-open
+
+    # Always run rule-defined scripts, even if the notification is suppressed
+    always_run_script = true
+
+    # Define the title of the windows spawned by dunst
+    title = Dunst
+
+    # Define the class of the windows spawned by dunst
+    class = Dunst
+
+    # Print a notification on startup.
+    # This is mainly for error detection, since dbus (re-)starts dunst
+    # automatically after a crash.
+    startup_notification = false
+
+    ### Legacy
+
+    # Use the Xinerama extension instead of RandR for multi-monitor support.
+    # This setting is provided for compatibility with older nVidia drivers that
+    # do not support RandR and using it on systems that support RandR is highly
+    # discouraged.
+    #
+    # By enabling this setting dunst will not be able to detect when a monitor
+    # is connected or disconnected which might break follow mode if the screen
+    # layout changes.
+    force_xinerama = false
+
+# Experimental features that may or may not work correctly. Do not expect them
+# to have a consistent behaviour across releases.
+[experimental]
+    # Calculate the dpi to use on a per-monitor basis.
+    # If this setting is enabled the Xft.dpi value will be ignored and instead
+    # dunst will attempt to calculate an appropriate dpi value for each monitor
+    # using the resolution and physical size. This might be useful in setups
+    # where there are multiple screens with very different dpi values.
+    per_monitor_dpi = false
+
+[shortcuts]
+
+    # Shortcuts are specified as [modifier+][modifier+]...key
+    # Available modifiers are "ctrl", "mod1" (the alt-key), "mod2",
+    # "mod3" and "mod4" (windows-key).
+    # Xev might be helpful to find names for keys.
+
+    # Close notification.
+    close = mod1+shift+space
+
+    # Close all notifications.
+    close_all = mod1+shift+enter
+
+    # Redisplay last message(s).
+    # On the US keyboard layout "grave" is normally above TAB and left
+    # of "1". Make sure this key actually exists on your keyboard layout,
+    # e.g. check output of 'xmodmap -pke'
+    history = mod1+shift+d
+
+    # Context menu.
+    context = mod1+shift+o
+
+[urgency_low]
+    # IMPORTANT: colors have to be defined in quotation marks.
+    # Otherwise the "#" and following would be interpreted as a comment.
+    background = "#fbf1c7"
+    foreground = "#3c3836"
+    timeout = 10
+    # Icon for notifications with low urgency, uncomment to enable
+    #icon = /path/to/icon
+
+[urgency_normal]
+    background = "#fbf1c7"
+    foreground = "#3c3836"
+    timeout = 10
+    # Icon for notifications with normal urgency, uncomment to enable
+    #icon = /path/to/icon
+
+[urgency_critical]
+    background = "#fbf1c7"
+    foreground = "#fb4934"
+    timeout = 0
+    # Icon for notifications with critical urgency, uncomment to enable
+    #icon = /path/to/icon
+
+# Every section that isn't one of the above is interpreted as a rules to
+# override settings for certain messages.
+# Messages can be matched by "appname", "summary", "body", "icon", "category",
+# "msg_urgency" and you can override the "timeout", "urgency", "foreground",
+# "background", "new_icon" and "format".
+# Shell-like globbing will get expanded.
+#
+# SCRIPTING
+# You can specify a script that gets run when the rule matches by
+# setting the "script" option.
+# The script will be called as follows:
+#   script appname summary body icon urgency
+# where urgency can be "LOW", "NORMAL" or "CRITICAL".
+#
+# NOTE: if you don't want a notification to be displayed, set the format
+# to "".
+# NOTE: It might be helpful to run dunst -print in a terminal in order
+# to find fitting options for rules.
+
+#[espeak]
+#    summary = "*"
+#    script = dunst_espeak.sh
+
+#[script-test]
+#    summary = "*script*"
+#    script = dunst_test.sh
+
+#[ignore]
+#    # This notification will not be displayed
+#    summary = "foobar"
+#    format = ""
+
+#[history-ignore]
+#    # This notification will not be saved in history
+#    summary = "foobar"
+#    history_ignore = yes
+
+#[signed_on]
+#    appname = Pidgin
+#    summary = "*signed on*"
+#    urgency = low
+#
+#[signed_off]
+#    appname = Pidgin
+#    summary = *signed off*
+#    urgency = low
+#
+#[says]
+#    appname = Pidgin
+#    summary = *says*
+#    urgency = critical
+#
+#[twitter]
+#    appname = Pidgin
+#    summary = *twitter.com*
+#    urgency = normal
+#
+# vim: ft=cfg
diff --git a/desktop-gruvbox/.config/dunst/dunstrc-light b/desktop-gruvbox/.config/dunst/dunstrc-light
new file mode 100644
index 00000000..365be6b2
--- /dev/null
+++ b/desktop-gruvbox/.config/dunst/dunstrc-light
@@ -0,0 +1,321 @@
+[global]
+    ### Display ###
+
+    # Which monitor should the notifications be displayed on.
+    monitor = 0
+
+    # Display notification on focused monitor.  Possible modes are:
+    #   mouse: follow mouse pointer
+    #   keyboard: follow window with keyboard focus
+    #   none: don't follow anything
+    #
+    # "keyboard" needs a window manager that exports the
+    # _NET_ACTIVE_WINDOW property.
+    # This should be the case for almost all modern window managers.
+    #
+    # If this option is set to mouse or keyboard, the monitor option
+    # will be ignored.
+    follow = mouse
+
+    # The geometry of the window:
+    #   [{width}]x{height}[+/-{x}+/-{y}]
+    # The geometry of the message window.
+    # The height is measured in number of notifications everything else
+    # in pixels.  If the width is omitted but the height is given
+    # ("-geometry x2"), the message window expands over the whole screen
+    # (dmenu-like).  If width is 0, the window expands to the longest
+    # message displayed.  A positive x is measured from the left, a
+    # negative from the right side of the screen.  Y is measured from
+    # the top and down respectively.
+    # The width can be negative.  In this case the actual width is the
+    # screen width minus the width defined in within the geometry option.
+    geometry = "500x8-6+50"
+    corner_radius = 0
+
+    # Show how many messages are currently hidden (because of geometry).
+    indicate_hidden = yes
+
+    # Shrink window if it's smaller than the width.  Will be ignored if
+    # width is 0.
+    shrink = no
+
+    # The transparency of the window.  Range: [0; 100].
+    # This option will only work if a compositing window manager is
+    # present (e.g. xcompmgr, compiz, etc.).
+    transparency = 0
+
+    # The height of the entire notification.  If the height is smaller
+    # than the font height and padding combined, it will be raised
+    # to the font height and padding.
+    notification_height = 0
+
+    # Draw a line of "separator_height" pixel height between two
+    # notifications.
+    # Set to 0 to disable.
+    separator_height = 4
+
+    # Padding between text and separator.
+    padding = 12
+
+    # Horizontal padding.
+    horizontal_padding = 12
+
+    # Defines width in pixels of frame around the notification window.
+    # Set to 0 to disable.
+    frame_width = 4
+
+    # Defines color of the frame around the notification window.
+     frame_color = "#32302f"
+
+    # Define a color for the separator.
+    # possible values are:
+    #  * auto: dunst tries to find a color fitting to the background;
+    #  * foreground: use the same color as the foreground;
+    #  * frame: use the same color as the frame;
+    #  * anything else will be interpreted as a X color.
+    separator_color = frame
+
+    # Sort messages by urgency.
+    sort = yes
+
+    # Don't remove messages, if the user is idle (no mouse or keyboard input)
+    # for longer than idle_threshold seconds.
+    # Set to 0 to disable.
+    idle_threshold = 120
+
+    ### Text ###
+
+    #font = Monospace 8
+     font = Roboto 10
+
+    # The spacing between lines.  If the height is smaller than the
+    # font height, it will get raised to the font height.
+    line_height = 0
+
+    # Possible values are:
+    # full: Allow a small subset of html markup in notifications:
+    #        <b>bold</b>
+    #        <i>italic</i>
+    #        <s>strikethrough</s>
+    #        <u>underline</u>
+    #
+    #        For a complete reference see
+    #        <http://developer.gnome.org/pango/stable/PangoMarkupFormat.html>.
+    #
+    # strip: This setting is provided for compatibility with some broken
+    #        clients that send markup even though it's not enabled on the
+    #        server. Dunst will try to strip the markup but the parsing is
+    #        simplistic so using this option outside of matching rules for
+    #        specific applications *IS GREATLY DISCOURAGED*.
+    #
+    # no:    Disable markup parsing, incoming notifications will be treated as
+    #        plain text. Dunst will not advertise that it has the body-markup
+    #        capability if this is set as a global setting.
+    #
+    # It's important to note that markup inside the format option will be parsed
+    # regardless of what this is set to.
+    markup = full
+
+    # The format of the message.  Possible variables are:
+    #   %a  appname
+    #   %s  summary
+    #   %b  body
+    #   %i  iconname (including its path)
+    #   %I  iconname (without its path)
+    #   %p  progress value if set ([  0%] to [100%]) or nothing
+    #   %n  progress value if set without any extra characters
+    # Markup is allowed
+    format = "<span font='Bold'>%s</span> <span font='Light'>(%a)</span>\n%b"
+
+    # Alignment of message text.
+    # Possible values are "left", "center" and "right".
+    alignment = left
+
+    # Show age of message if message is older than show_age_threshold
+    # seconds.
+    # Set to -1 to disable.
+    show_age_threshold = 60
+
+    # Split notifications into multiple lines if they don't fit into
+    # geometry.
+    word_wrap = yes
+
+    # Ignore newlines '\n' in notifications.
+    ignore_newline = no
+
+    # Merge multiple notifications with the same content
+    stack_duplicates = true
+
+    # Hide the count of merged notifications with the same content
+    hide_duplicate_count = false
+
+    # Display indicators for URLs (U) and actions (A).
+    show_indicators = yes
+
+    ### Icons ###
+
+    # Align icons left/right/off
+    icon_position = right
+
+    # Scale larger icons down to this size, set to 0 to disable
+    max_icon_size = 48
+
+    # Paths to default icons.
+    icon_path = /usr/share/icons/Papirus-Dark/48x48/status/:/usr/share/icons/Papirus-Dark/48x48/devices/:/usr/share/icons/Papirus-Dark/48x48/apps
+
+    ### History ###
+
+    # Should a notification popped up from history be sticky or timeout
+    # as if it would normally do.
+    sticky_history = yes
+
+    # Maximum amount of notifications kept in history
+    history_length = 20
+
+    ### Misc/Advanced ###
+
+    # dmenu path.
+    dmenu = /usr/bin/rofi -dmenu -p dunst:
+
+    # Browser for opening urls in context menu.
+    browser = xdg-open
+
+    # Always run rule-defined scripts, even if the notification is suppressed
+    always_run_script = true
+
+    # Define the title of the windows spawned by dunst
+    title = Dunst
+
+    # Define the class of the windows spawned by dunst
+    class = Dunst
+
+    # Print a notification on startup.
+    # This is mainly for error detection, since dbus (re-)starts dunst
+    # automatically after a crash.
+    startup_notification = false
+
+    ### Legacy
+
+    # Use the Xinerama extension instead of RandR for multi-monitor support.
+    # This setting is provided for compatibility with older nVidia drivers that
+    # do not support RandR and using it on systems that support RandR is highly
+    # discouraged.
+    #
+    # By enabling this setting dunst will not be able to detect when a monitor
+    # is connected or disconnected which might break follow mode if the screen
+    # layout changes.
+    force_xinerama = false
+
+# Experimental features that may or may not work correctly. Do not expect them
+# to have a consistent behaviour across releases.
+[experimental]
+    # Calculate the dpi to use on a per-monitor basis.
+    # If this setting is enabled the Xft.dpi value will be ignored and instead
+    # dunst will attempt to calculate an appropriate dpi value for each monitor
+    # using the resolution and physical size. This might be useful in setups
+    # where there are multiple screens with very different dpi values.
+    per_monitor_dpi = false
+
+[shortcuts]
+
+    # Shortcuts are specified as [modifier+][modifier+]...key
+    # Available modifiers are "ctrl", "mod1" (the alt-key), "mod2",
+    # "mod3" and "mod4" (windows-key).
+    # Xev might be helpful to find names for keys.
+
+    # Close notification.
+    close = mod1+shift+space
+
+    # Close all notifications.
+    close_all = mod1+shift+enter
+
+    # Redisplay last message(s).
+    # On the US keyboard layout "grave" is normally above TAB and left
+    # of "1". Make sure this key actually exists on your keyboard layout,
+    # e.g. check output of 'xmodmap -pke'
+    history = mod1+shift+d
+
+    # Context menu.
+    context = mod1+shift+o
+
+[urgency_low]
+    # IMPORTANT: colors have to be defined in quotation marks.
+    # Otherwise the "#" and following would be interpreted as a comment.
+    background = "#282828"
+    foreground = "#ebdbb2"
+    timeout = 10
+    # Icon for notifications with low urgency, uncomment to enable
+    #icon = /path/to/icon
+
+[urgency_normal]
+    background = "#282828"
+    foreground = "#ebdbb2"
+    timeout = 10
+    # Icon for notifications with normal urgency, uncomment to enable
+    #icon = /path/to/icon
+
+[urgency_critical]
+    background = "#282828"
+    foreground = "#fabd2f"
+    timeout = 0
+    # Icon for notifications with critical urgency, uncomment to enable
+    #icon = /path/to/icon
+
+# Every section that isn't one of the above is interpreted as a rules to
+# override settings for certain messages.
+# Messages can be matched by "appname", "summary", "body", "icon", "category",
+# "msg_urgency" and you can override the "timeout", "urgency", "foreground",
+# "background", "new_icon" and "format".
+# Shell-like globbing will get expanded.
+#
+# SCRIPTING
+# You can specify a script that gets run when the rule matches by
+# setting the "script" option.
+# The script will be called as follows:
+#   script appname summary body icon urgency
+# where urgency can be "LOW", "NORMAL" or "CRITICAL".
+#
+# NOTE: if you don't want a notification to be displayed, set the format
+# to "".
+# NOTE: It might be helpful to run dunst -print in a terminal in order
+# to find fitting options for rules.
+
+#[espeak]
+#    summary = "*"
+#    script = dunst_espeak.sh
+
+#[script-test]
+#    summary = "*script*"
+#    script = dunst_test.sh
+
+#[ignore]
+#    # This notification will not be displayed
+#    summary = "foobar"
+#    format = ""
+
+#[history-ignore]
+#    # This notification will not be saved in history
+#    summary = "foobar"
+#    history_ignore = yes
+
+#[signed_on]
+#    appname = Pidgin
+#    summary = "*signed on*"
+#    urgency = low
+#
+#[signed_off]
+#    appname = Pidgin
+#    summary = *signed off*
+#    urgency = low
+#
+#[says]
+#    appname = Pidgin
+#    summary = *says*
+#    urgency = critical
+#
+#[twitter]
+#    appname = Pidgin
+#    summary = *twitter.com*
+#    urgency = normal
+#
+# vim: ft=cfg
diff --git a/desktop-gruvbox/.config/gtk-3.0/settings.ini b/desktop-gruvbox/.config/gtk-3.0/settings.ini
new file mode 100644
index 00000000..8efe22eb
--- /dev/null
+++ b/desktop-gruvbox/.config/gtk-3.0/settings.ini
@@ -0,0 +1,16 @@
+[Settings]
+gtk-theme-name=Materia-Gruvbox
+gtk-icon-theme-name=Papirus-Dark-Gruvbox
+gtk-font-name=IBM Plex Sans Medium 10
+gtk-cursor-theme-name=Breeze_Snow
+gtk-cursor-theme-size=0
+gtk-toolbar-style=GTK_TOOLBAR_BOTH
+gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
+gtk-button-images=1
+gtk-menu-images=1
+gtk-enable-event-sounds=1
+gtk-enable-input-feedback-sounds=1
+gtk-xft-antialias=1
+gtk-xft-hinting=1
+gtk-xft-hintstyle=hintslight
+gtk-xft-rgba=rgb
diff --git a/desktop-gruvbox/.config/oomox/colors/Gruvbox/Dark b/desktop-gruvbox/.config/oomox/colors/Gruvbox/Dark
new file mode 100644
index 00000000..fb4fac37
--- /dev/null
+++ b/desktop-gruvbox/.config/oomox/colors/Gruvbox/Dark
@@ -0,0 +1,78 @@
+ACCENT_BG=83a598
+ARC_TRANSPARENCY=True
+ARC_WIDGET_BORDER_COLOR=59554a
+BASE16_GENERATE_DARK=False
+BASE16_INVERT_TERMINAL=False
+BASE16_MILD_TERMINAL=False
+BG=282828
+BTN_BG=282828
+BTN_FG=610a7a
+BTN_OUTLINE_OFFSET=-3
+BTN_OUTLINE_WIDTH=1
+CARET1_FG=cac10f
+CARET2_FG=cac10f
+CARET_SIZE=0.04
+CINNAMON_OPACITY=1.0
+FG=ebdbb2
+GRADIENT=0.01
+GTK3_GENERATE_DARK=True
+HDR_BG=32302f
+HDR_BTN_BG=282828
+HDR_BTN_FG=01bf9b
+HDR_FG=ebdbb2
+ICONS_ARCHDROID=d2f000
+ICONS_DARK=282828
+ICONS_LIGHT=bc8ef4
+ICONS_LIGHT_FOLDER=83a598
+ICONS_MEDIUM=458588
+ICONS_NUMIX_STYLE=0
+ICONS_STYLE=papirus_icons
+ICONS_SYMBOLIC_ACTION=ebdbb2
+ICONS_SYMBOLIC_PANEL=ebdbb2
+MATERIA_PANEL_OPACITY=0.6
+MATERIA_SELECTION_OPACITY=0.32
+MATERIA_STYLE_COMPACT=True
+MENU_BG=12afaf
+MENU_FG=01bf9b
+NAME="Gruvbox/Dark"
+OUTLINE_WIDTH=1
+ROUNDNESS=6
+SEL_BG=83a598
+SEL_FG=282828
+SPACING=3
+SPOTIFY_PROTO_BG=282828
+SPOTIFY_PROTO_FG=ebdbb2
+SPOTIFY_PROTO_SEL=b8bb26
+SURUPLUS_GRADIENT1=21826e
+SURUPLUS_GRADIENT2=f728dd
+SURUPLUS_GRADIENT_ENABLED=False
+TERMINAL_ACCENT_COLOR=f728dd
+TERMINAL_BACKGROUND=237095
+TERMINAL_BASE_TEMPLATE=material
+TERMINAL_COLOR0=36868b
+TERMINAL_COLOR1=ffec53
+TERMINAL_COLOR10=acffb8
+TERMINAL_COLOR11=fff453
+TERMINAL_COLOR12=91ffff
+TERMINAL_COLOR13=bd68aa
+TERMINAL_COLOR14=36faed
+TERMINAL_COLOR15=fcffff
+TERMINAL_COLOR2=9bff9d
+TERMINAL_COLOR3=ffff5a
+TERMINAL_COLOR4=13fdff
+TERMINAL_COLOR5=f972b6
+TERMINAL_COLOR6=10eadb
+TERMINAL_COLOR7=dfffff
+TERMINAL_COLOR8=479ba2
+TERMINAL_COLOR9=fffba0
+TERMINAL_FOREGROUND=d2f000
+TERMINAL_THEME_ACCURACY=128
+TERMINAL_THEME_AUTO_BGFG=True
+TERMINAL_THEME_EXTEND_PALETTE=False
+TERMINAL_THEME_MODE=smarty
+THEME_STYLE=materia
+TXT_BG=282828
+TXT_FG=d2f000
+UNITY_DEFAULT_LAUNCHER_STYLE=False
+WM_BORDER_FOCUS=f728dd
+WM_BORDER_UNFOCUS=c158ce
diff --git a/desktop-gruvbox/.config/polybar/config b/desktop-gruvbox/.config/polybar/config
new file mode 100644
index 00000000..1843f25a
--- /dev/null
+++ b/desktop-gruvbox/.config/polybar/config
@@ -0,0 +1,288 @@
+# vim:ft=dosini
+#              _       _
+#  _ __   ___ | |_   _| |__   __ _ _ __
+# | '_ \ / _ \| | | | | '_ \ / _` | '__|
+# | |_) | (_) | | |_| | |_) | (_| | |
+# | .__/ \___/|_|\__, |_.__/ \__,_|_|
+# |_|            |___/
+#
+# Copyright (c) 2020 Vintage Salt <rehashedsalt@cock.li>
+# Distributed under the terms of the MIT License
+#
+
+## VARIABLES
+[res/colors]
+red = #fb4934
+green = #b8bb26
+yellow = #fabd2f
+blue = #83a598
+magenta = #de869b
+cyan = #8ec07c
+white = #ebdbb2
+black = #282828
+gray = #32302f
+
+bg = ${env:PB_COLOR_BG:#282828}
+fg = ${env:PB_COLOR_FG:#ebdbb2}
+border = ${env:PB_COLOR_BORDER:#32302f}
+selection = #83a598
+
+[res/config]
+bar-width = 50
+bar-fill = |
+bar-empty = |
+bar-indicator = 
+border-size = 4
+padding = 2
+
+[settings]
+screenchange-reload = true
+format-padding = ${res/config.padding}
+format-background = ${res/colors.bg}
+
+## BARS
+[template/bar]
+bottom = false
+wm-restack = ${env:PB_WM_RESTACK:i3}
+tray-maxsize = 16
+background = ${res/colors.bg}
+foreground = ${res/colors.fg}
+border-color = ${res/colors.border}
+tray-background = ${res/colors.bg}
+height = 40
+width = 100%
+padding = 2
+border-bottom-size = ${res/config.border-size}
+font-0 = "IBM Plex Sans:style=Medium:size=10;2"
+font-1 = "Deja Vu Sans Mono:style=Regular:size=10;2"
+font-2 = "IBM Plex Sans:style=Bold:size=10;2"
+font-3 = "Fork Awesome:style=Regular:size=12;2"
+font-4 = "Font Awesome 5 Free:style=Regular:size=12;2"
+font-5 = "Font Awesome 5 Brands:style=Regular:size=12;2"
+
+[bar/primary]
+monitor = ${env:PB_MONITOR:eDP-1}
+inherit = template/bar
+tray-position = center
+modules-left = i3 bspwm service-ansible service-backup reboot-required
+modules-right = backlight pulse battery | date
+
+[bar/secondary]
+monitor= ${env:PB_MONITOR:HDMI-A-0}
+inherit = template/bar
+modules-left = i3 bspwm
+modules-right = wlan-desktop-stats mpd | date
+
+## MODULES
+[module/|]
+type = custom/text
+content = |
+content-foreground = ${res/colors.border}
+
+[module/backlight]
+type = internal/xbacklight
+format = <bar>
+format-prefix = "BRI: "
+format-prefix-foreground = ${res/colors.blue}
+bar-width = ${res/config.bar-width}
+bar-fill = ${res/config.bar-fill}
+bar-fill-foreground = ${res/colors.blue}
+bar-empty = ${res/config.bar-empty}
+bar-empty-foreground = ${res/colors.border}
+bar-indicator = ${res/config.bar-indicator}
+
+[module/battery]
+type = internal/battery
+full-at = 100
+time-format = %H:%M
+interval = 15
+
+format-charging = <ramp-capacity>
+format-charging-foreground = ${res/colors.green}
+format-discharging = <ramp-capacity>
+format-full = <ramp-capacity>
+format-full-foreground = ${res/colors.green}
+ramp-capacity-0 = 
+ramp-capacity-0-foreground = ${res/colors.yellow}
+ramp-capacity-1 = 
+ramp-capacity-2 = 
+ramp-capacity-3 = 
+ramp-capacity-4 = 
+
+[module/bspwm]
+type = internal/bspwm
+format = <label-state> <label-mode>
+format-padding = 0
+enable-scroll = false
+pin-workspaces = true
+
+label-mode-padding = 4
+label-mode-background = ${res/colors.red}
+label-focused = %name%
+label-focused-padding = 4
+label-focused-font = 3
+label-focused-foreground = ${res/colors.bg}
+label-focused-background = ${res/colors.selection}
+label-occupied = %name%
+label-occupied-padding = 4
+label-occupied-font = 3
+label-urgent = %name%
+label-urgent-padding = 4
+label-urgent-font = 3
+label-urgent-foreground = ${res/colors.bg}
+label-urgent-background = ${res/colors.yellow}
+label-empty = %name%
+label-empty-foreground = ${res/colors.border}
+label-empty-padding = 4
+
+[module/cpu]
+type = internal/cpu
+interval = 1
+format = <bar-load>
+format-prefix = "CPU: "
+format-prefix-foreground = ${res/colors.blue}
+bar-load-width = ${res/config.bar-width}
+bar-load-fill = ${res/config.bar-fill}
+bar-load-fill-foreground = ${res/colors.blue}
+bar-load-empty = ${res/config.bar-empty}
+bar-load-empty-foreground = ${res/colors.border}
+bar-load-indicator = ${res/config.bar-indicator}
+
+[module/date]
+type = internal/date
+date = %a %b %d
+time = %I:%M %p
+interval = 5
+format = <label>
+label = %date% %time%
+
+[module/fshome]
+type = internal/fs
+mount-0 = /home
+format-mounted = <bar-used> <label-mounted>
+format-mounted-prefix = "Home: "
+format-mounted-prefix-foreground = ${res/colors.yellow}
+format-unmounted = 
+label-mounted = %free% free
+bar-used-width = ${res/config.bar-width}
+bar-used-fill = ${res/config.bar-fill}
+bar-used-fill-foreground = ${res/colors.yellow}
+bar-used-empty = ${res/config.bar-empty}
+bar-used-empty-foreground = ${res/colors.border}
+bar-used-indicator = ${res/config.bar-indicator}
+
+[module/fsroot]
+type = internal/fs
+mount-0 = /
+format-mounted = <bar-used> <label-mounted>
+format-mounted-prefix = "Root: "
+format-mounted-prefix-foreground = ${res/colors.yellow}
+label-mounted = %free% free
+bar-used-width = ${res/config.bar-width}
+bar-used-fill = ${res/config.bar-fill}
+bar-used-fill-foreground = ${res/colors.yellow}
+bar-used-empty = ${res/config.bar-empty}
+bar-used-empty-foreground = ${res/colors.border}
+bar-used-indicator = ${res/config.bar-indicator}
+
+[module/i3]
+type = internal/i3
+format = <label-state> <label-mode>
+format-padding = 0
+enable-scroll = false
+pin-workspaces = true
+
+label-mode-padding = 4
+label-mode-background = ${res/colors.red}
+label-focused = %name%
+label-focused-padding = 4
+label-focused-foreground = ${res/colors.bg}
+label-focused-background = ${res/colors.selection}
+label-unfocused = %name%
+label-unfocused-background = ${res/colors.bg}
+label-unfocused-padding = 4
+label-visible = %name%
+label-visible-background = ${res/colors.border}
+label-visible-padding = 4
+
+[module/memory]
+type = internal/memory
+format = <bar-used> <label>
+format-prefix = "Memory: "
+format-prefix-foreground = ${res/colors.magenta}
+label = %gb_free:8%
+bar-used-width = ${res/config.bar-width}
+bar-used-fill = ${res/config.bar-fill}
+bar-used-fill-foreground = ${res/colors.magenta}
+bar-used-empty = ${res/config.bar-empty}
+bar-used-empty-foreground = ${res/colors.border}
+bar-used-indicator = ${res/config.bar-indicator}
+
+[module/mpd]
+type=internal/mpd
+format-online=<label-song> <label-time>
+label-song=%artist% - %title%
+label-time=%elapsed% / %total%
+
+[module/pulse]
+type = internal/pulseaudio
+format-volume = <label-volume>
+format-volume-prefix = " "
+format-muted = <label-muted>
+format-muted-prefix = " "
+format-muted-foreground = ${res/colors.border}
+
+[module/reboot-required]
+type = custom/script
+exec = "echo Reboot required"
+exec-if = "[ -f /var/run/reboot-required ]"
+format-foreground = ${res/colors.yellow}
+
+[module/service-ansible]
+type = custom/script
+interval = 5
+exec = "echo "
+exec-if = "systemctl is-failed --quiet ansible-pull.service"
+format-foreground = ${res/colors.red}
+
+[module/service-backup]
+type = custom/script
+interval = 5
+exec = "echo "
+exec-if = "systemctl is-failed --quiet backup.service"
+format-foreground = ${res/colors.red}
+
+[module/wlan-laptop]
+type = internal/network
+interface = wlp0s20f3
+format-connected-prefix = "WLAN: "
+format-connected-prefix-foreground = ${res/colors.green}
+format-disconnected-prefix = "WLAN: "
+format-disconnected-prefix-foreground = ${res/colors.green}
+label-connected = %essid%
+label-disconnected = Disconnected
+
+[module/wlan-desktop]
+type = internal/network
+interface = wlp5s0
+format-connected-prefix = "WLAN: "
+format-connected-prefix-foreground = ${res/colors.green}
+format-disconnected-prefix = "WLAN: "
+format-disconnected-prefix-foreground = ${res/colors.green}
+label-connected = %essid%
+label-disconnected = Disconnected
+
+[module/wlan-desktop-stats]
+type = internal/network
+interface = wlp5s0
+label-connected = U %upspeed% D %downspeed%
+
+[module/xkeyboard]
+type = internal/xkeyboard
+format = <label-layout>
+label-layout = %name%
+
+[module/xwindow]
+type = internal/xwindow
+label = %title%
+label-maxlen = 100
diff --git a/desktop-gruvbox/.config/polybar/launch.sh b/desktop-gruvbox/.config/polybar/launch.sh
new file mode 100755
index 00000000..a241c33a
--- /dev/null
+++ b/desktop-gruvbox/.config/polybar/launch.sh
@@ -0,0 +1,82 @@
+#! /bin/bash
+#
+# launch.sh
+# A Polybar launch script with a heck of a lot of compat
+# Copyright (C) 2019 Vintage Salt <rehashedsalt@cock.li>
+#
+# Distributed under terms of the MIT license.
+#
+
+log() {
+	[ -z "$1" ] && return 1
+	printf "$1\\n"
+}
+
+# Trap our exit
+die() {
+	kill $(jobs -p)
+}
+trap die EXIT
+
+# Steps
+step_fallback() {
+	if ! command -v polybar > /dev/null 2>&1; then
+		if command -v tint2 > /dev/null 2>&1; then
+			log "Executing fallback"
+			exec tint2
+		fi
+		log "No valid bars found"
+		exit 51
+	fi
+}
+step_configure() {
+	# Restack compatibility
+	if pgrep -U "$UID" bspwm > /dev/null 2>&1; then
+		export PB_WM_RESTACK="bspwm"
+	elif pgrep -U "$UID" i3 > /dev/null 2>&1; then
+		export PB_WM_RESTACK="i3"
+	fi
+	# Light theme
+	if [ "$THEME" == "light" ]; then
+		export PB_COLOR_BG="#fbf1c7"
+		export PB_COLOR_FG="#3c3836"
+		export PB_COLOR_BORDER="#f2e5bc"
+	fi
+}
+step_spawn_primary() {
+	# Spawn bars on the primary monitor
+	log "Spawning primary bars"
+	export PB_MONITOR=$(xrandr -q | awk '/primary/{print $1}')
+	polybar -r primary &
+	polybar -r primary-2 &
+}
+step_spawn_secondary() {
+	# Spawn more for each secondary
+	log "Spawning secondary bars"
+	export secondary_monitors=$(xrandr -q | grep ' connected' | grep -v 'primary' | awk '{print $1}')
+	if [ "$secondary_monitors" == "" ]; then
+		return 0
+	fi
+	for monitor in $secondary_monitors; do
+		PB_MONITOR=$monitor
+		polybar -r secondary &
+		polybar -r secondary-2 &
+	done
+}
+step_wait() {
+	# And wait
+	log "Waiting"
+	wait
+}
+
+# Main
+main() {
+	step_fallback
+	step_configure
+	step_spawn_primary
+	step_spawn_secondary
+	step_wait
+}
+
+main "$@"
+
diff --git a/desktop-gruvbox/.config/qt5ct/qt5ct.conf b/desktop-gruvbox/.config/qt5ct/qt5ct.conf
new file mode 100644
index 00000000..086eeb70
--- /dev/null
+++ b/desktop-gruvbox/.config/qt5ct/qt5ct.conf
@@ -0,0 +1,28 @@
+[Appearance]
+color_scheme_path=/usr/share/qt5ct/colors/airy.conf
+custom_palette=false
+icon_theme=Papirus-Dark-Gruvbox
+standard_dialogs=kde
+style=Breeze
+
+[Fonts]
+fixed=@Variant(\0\0\0@\0\0\0\x16\0I\0n\0\x63\0o\0n\0s\0o\0l\0\x61\0t\0\x61@$\0\0\0\0\0\0\xff\xff\xff\xff\x5\x1\0\x39\x10)
+general=@Variant(\0\0\0@\0\0\0\x1a\0I\0\x42\0M\0 \0P\0l\0\x65\0x\0 \0S\0\x61\0n\0s@$\0\0\0\0\0\0\xff\xff\xff\xff\x5\x1\0\x39\x10)
+
+[Interface]
+activate_item_on_single_click=2
+buttonbox_layout=2
+cursor_flash_time=1000
+dialog_buttons_have_icons=2
+double_click_interval=400
+gui_effects=@Invalid()
+keyboard_scheme=2
+menus_have_icons=true
+show_shortcuts_in_context_menus=true
+stylesheets=@Invalid()
+toolbutton_style=4
+underline_shortcut=1
+wheel_scroll_lines=3
+
+[SettingsWindow]
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x3\xc3\0\0\0\x6\0\0\ay\0\0\x4\x5\0\0\x3\xc7\0\0\0\n\0\0\au\0\0\x4\x1\0\0\0\0\0\0\0\0\a\x80\0\0\x3\xc7\0\0\0\n\0\0\au\0\0\x4\x1)
diff --git a/desktop-gruvbox/.config/rofi/config.rasi b/desktop-gruvbox/.config/rofi/config.rasi
new file mode 100644
index 00000000..6d42441f
--- /dev/null
+++ b/desktop-gruvbox/.config/rofi/config.rasi
@@ -0,0 +1,108 @@
+/*
+ * config.rasi
+ * Copyright (C) 2020 Vintage Salt <rehashedsalt@cock.li>
+ *
+ * Distributed under terms of the MIT License
+ *
+ * See rofi-theme(5) for documentation
+ */
+
+configuration {
+	matching: "normal";
+	show-icons: true;
+	icon-theme: "Papirus-Gruvbox-Dark";
+	modi: "drun,ssh,window";
+}
+
+* {
+	background: #282828;
+	background-alt: #32302f;
+	foreground: #ebdbb2;
+	foreground-alt: #fb4934;
+	yellow: #fabd2f;
+	blue: #83a598;
+	cyan: #8ec07c;
+
+	text-color: @foreground;
+	background-color: @background;
+	font: "IBM Plex Sans 10";
+}
+
+#window {
+	location: southwest;
+	anchor: southwest;
+
+	border-color: @background-alt;
+	background-color: @background;
+
+	border: 4px 4px 0 0;
+	height: 60%;
+	width: 30%;
+}
+	#inputbar {
+		background-color: @background-alt;
+		padding: 1em;
+	}
+		#case-indicator {
+			enabled: false;
+			background-color: @background-alt;
+			text-color: @foreground-alt;
+		}
+		#prompt {
+			enabled: false;
+			background-color: @background-alt;
+			font: "IBM Plex Sans Medium 12";
+			padding: 0.5em;
+		}
+		#entry {
+			background-color: @background-alt;
+			font: "IBM Plex Sans 12";
+			padding: 0.5em;
+		}
+	#message {
+		padding: 4px;
+	}
+		#textbox {
+			padding: 4px 12px 4px 12px;
+			font-color: @foreground-alt;
+		}
+
+	#listview {
+		padding: 1em;
+	}
+		#element {
+			orientation: vertical;
+			padding: 1em;
+		}
+		#element normal active {
+			text-color: @cyan;
+		}
+		#element normal urgent {
+			text-color: @yellow;
+		}
+		#element selected normal {
+			background-color: @blue;
+			text-color: @background;
+		}
+		#element selected active {
+			background-color: @cyan;
+			text-color: @background;
+		}
+		#element selected urgent {
+			background-color: @yellow;
+			text-color: @background;
+		}
+	
+	#sidebar {
+	}
+
+		#button {
+			padding: 8px;
+		}
+
+		#button selected {
+			background-color: @background-alt;
+		}
+
+/* vim:ft=css
+*/
diff --git a/desktop-gruvbox/.config/sxhkd/sxhkdrc b/desktop-gruvbox/.config/sxhkd/sxhkdrc
new file mode 100644
index 00000000..78130483
--- /dev/null
+++ b/desktop-gruvbox/.config/sxhkd/sxhkdrc
@@ -0,0 +1,74 @@
+# vim:ft=bash
+
+## GENERAL HOTKEYS
+alt + Return
+	$TERMINAL
+alt + space
+	rofi -show drun
+alt + backslash
+	rofi -show ssh
+alt + Tab
+	rofi -show window
+alt + Escape
+	pkill -USR1 -x sxhkd
+ctrl + alt + l
+	loginctl lock-session
+
+## APPLICATION TOGGLES
+alt + p
+	killall pavucontrol-qt || pavucontrol-qt
+alt + shift + m
+	killall picom || ~/.firestarter/firestarter start compositor
+
+## HARDWARE CONTROLS
+XF86Audio{Raise,Lower}Volume
+	pactl set-sink-volume 0 {+,-}5%
+XF86AudioMute
+	pactl set-sink-mute 0 toggle
+XF86MonBrightness{Up,Down}
+	xbacklight {-inc,-dec} 5
+
+## BSPWM
+# Reload configs
+alt + shift + r
+	~/.config/bspwm/bspwmrc
+# Close or kill node
+alt + {_,shift + }q
+	bspc node -{c,k}
+# Focus or move the node in the given direction
+alt + {_,shift + }{h,j,k,l}
+	bspc node -{f,s} {west,south,north,east}
+# Focus or send to the given desktop
+alt + {_,shift + }{1-9,0}
+	bspc {desktop -f,node -d} '{1-9,10}'
+# Toggle monocle mode
+alt + m
+	bspc desktop -l next
+# Switch current node with biggest on current desktop
+alt + g
+	bspc node -s biggest.local --follow
+# Focus the node for the given path jump
+alt + {a,c}
+	bspc node -f {@parent,biggest.descendant_of}
+# Rotate, equalize, or balance selection
+alt + {r,e,u}
+	bspc node -{R 90,E,B @/}
+# Set window states
+alt + {t,shift + t,f,shift + f}
+	bspc node -t {tiled,pseudo_tiled,floating,fullscreen}
+# Set node flags
+alt + ctrl + {x,y,z}
+	bspc node -g {locked,sticky,private}
+# Focus the next/previous node in the current desktop
+alt + {_,shift + }c
+	bspc node -f {next,prev}.local
+# Focus the next/previous desktop in the current monitor
+alt + {comma,period}
+	bspc desktop -f {prev,next}.local
+# Expand a window by moving one of its side outward
+super + alt + {h,j,k,l}
+	bspc node -z {left -20 0,bottom 0 20,top 0 -20,right 20 0}
+# Contract a window by moving one of its side inward
+super + alt + shift + {h,j,k,l}
+	bspc node -z {right -20 0,top 0 20,bottom 0 -20,left 20 0}
+