IN2JBH5MRX5RB4ZZG2WSDUJWSXCX6AZLP5O77763HX5KKPXAW4WQC
Host blackstaff
HostName blackstaff
Port 22
User jleechpe
Host git.blackstaff
HostName blackstaff
Port 22
User git
Host ssh.pijul.com
HostName ssh.pijul.com
Port 22
User jleechpe
AddKeysToAgent yes
return {
automatically_reload_config = true,
enable_scroll_bar = true,
exit_behavior = "Close",
ssh_domains = {
{
name = "blackstaff",
remote_address = "192.168.4.99",
username = "jleechpe",
}
},
unix_domains = {
{
name = "unix",
connect_automatically = false,
no_serve_automatically = false,
},
},
}
[qt]
customfont=false
customicontheme=false
customlocale=false
custompalette=false
customstylesheet=false
customwidgetstyle=false
font="Sans Serif,9,-1,5,50,0,0,0,0,0"
icontheme=hicolor
iconthemepath=
locale=en_US
palette=@Variant(\0\0\0\x44\x1\x1\xff\xff\0\0\0\0\0\0\0\0\x1\x1\xff\xff\xef\xef\xef\xef\xef\xef\0\0\x1\x1\xff\xff\xff\xff\xff\xff\xff\xff\0\0\x1\x1\xff\xff\xcb\x4\xcb\x4\xcb\x4\0\0\x1\x1\xff\xff\x9f\xf4\x9f\xf4\x9f\xf4\0\0\x1\x1\xff\xff\xb8\x90\xb8\x90\xb8\x90\0\0\x1\x1\xff\xff\0\0\0\0\0\0\0\0\x1\x1\xff\xff\xff\xff\xff\xff\xff\xff\0\0\x1\x1\xff\xff\0\0\0\0\0\0\0\0\x1\x1\xff\xff\xff\xff\xff\xff\xff\xff\0\0\x1\x1\xff\xff\xef\xef\xef\xef\xef\xef\0\0\x1\x1\xff\xffv{v{v{\0\0\x1\x1\xff\xff\x30\x30\x8c\x8c\xc6\xc6\0\0\x1\x1\xff\xff\xff\xff\xff\xff\xff\xff\0\0\x1\x1\xff\xff\0\0\0\0\xff\xff\0\0\x1\x1\xff\xff\xff\xff\0\0\xff\xff\0\0\x1\x1\xff\xff\xf7\xf7\xf7\xf7\xf7\xf7\0\0\x1\x1\xff\xff\xbe\xbe\xbe\xbe\xbe\xbe\0\0\x1\x1\xff\xff\xef\xef\xef\xef\xef\xef\0\0\x1\x1\xff\xff\xff\xff\xff\xff\xff\xff\0\0\x1\x1\xff\xff\xcb\x4\xcb\x4\xcb\x4\0\0\x1\x1\xff\xff\xbe\xbe\xbe\xbe\xbe\xbe\0\0\x1\x1\xff\xff\xb8\x90\xb8\x90\xb8\x90\0\0\x1\x1\xff\xff\xbe\xbe\xbe\xbe\xbe\xbe\0\0\x1\x1\xff\xff\xff\xff\xff\xff\xff\xff\0\0\x1\x1\xff\xff\xbe\xbe\xbe\xbe\xbe\xbe\0\0\x1\x1\xff\xff\xef\xef\xef\xef\xef\xef\0\0\x1\x1\xff\xff\xef\xef\xef\xef\xef\xef\0\0\x1\x1\xff\xff\xb1\xb8\xb1\xb8\xb1\xb8\0\0\x1\x1\xff\xff\x91\x91\x91\x91\x91\x91\0\0\x1\x1\xff\xff\xff\xff\xff\xff\xff\xff\0\0\x1\x1\xff\xff\0\0\0\0\xff\xff\0\0\x1\x1\xff\xff\xff\xff\0\0\xff\xff\0\0\x1\x1\xff\xff\xf7\xf7\xf7\xf7\xf7\xf7\0\0\x1\x1\xff\xff\0\0\0\0\0\0\0\0\x1\x1\xff\xff\xef\xef\xef\xef\xef\xef\0\0\x1\x1\xff\xff\xff\xff\xff\xff\xff\xff\0\0\x1\x1\xff\xff\xcb\x4\xcb\x4\xcb\x4\0\0\x1\x1\xff\xff\x9f\xf4\x9f\xf4\x9f\xf4\0\0\x1\x1\xff\xff\xb8\x90\xb8\x90\xb8\x90\0\0\x1\x1\xff\xff\0\0\0\0\0\0\0\0\x1\x1\xff\xff\xff\xff\xff\xff\xff\xff\0\0\x1\x1\xff\xff\0\0\0\0\0\0\0\0\x1\x1\xff\xff\xff\xff\xff\xff\xff\xff\0\0\x1\x1\xff\xff\xef\xef\xef\xef\xef\xef\0\0\x1\x1\xff\xffv{v{v{\0\0\x1\x1\xff\xff\x30\x30\x8c\x8c\xc6\xc6\0\0\x1\x1\xff\xff\xff\xff\xff\xff\xff\xff\0\0\x1\x1\xff\xff\0\0\0\0\xff\xff\0\0\x1\x1\xff\xff\xff\xff\0\0\xff\xff\0\0\x1\x1\xff\xff\xf7\xf7\xf7\xf7\xf7\xf7\0\0)
plugindir=
stylesheetpath=
trpath=
widgetstyle=fusion
[startup]
considerForReconnect=true
considerLauncherForReconnect=false
showButton=true
showLauncherButton=false
syncthingArgs="-no-browser -no-restart -logflags=3"
syncthingAutostart=false
syncthingPath=syncthing
syncthingUnit=syncthing.service
systemUnit=false
tools\Inotify\args=
tools\Inotify\autostart=false
tools\Inotify\path=
useLibSyncthing=false
[tray]
brightTextColors=false
connections\1\apiKey=@ByteArray(mDPDddN43xejPGiziNk4gRAV55Ya7dqL)
connections\1\authEnabled=false
connections\1\autoConnect=false
connections\1\devStatsPollInterval=60000
connections\1\errorsPollInterval=30000
connections\1\httpsCertPath=
connections\1\label=Primary instance
connections\1\password=
connections\1\reconnectInterval=0
connections\1\statusComputionFlags=11
connections\1\syncthingUrl=http://127.0.0.1:8384
connections\1\trafficPollInterval=5000
connections\1\userName=
connections\size=1
dbusNotifications=true
distinguishTrayIcons=false
frameStyle=16
ignoreInavailabilityAfterStart=15
notifyOnDisconnect=true
notifyOnErrors=true
notifyOnLauncherErrors=true
notifyOnLocalSyncComplete=false
notifyOnNewDeviceConnects=false
notifyOnNewDirectoryShared=true
notifyOnRemoteSyncComplete=false
positioning\assumedIconPos=@Point(0 0)
positioning\useCursorPos=true
showSyncthingNotifications=true
showTraffic=true
statusIcons="#ff26b6db,#ff0882c8,#ffffffff;#ffdb3c26,#ffc80828,#ffffffff;#ffc9ce3b,#ffebb83b,#ffffffff;#ff2d9d69,#ff2d9d69,#ffffffff;#ff26b6db,#ff0882c8,#ffffffff;#ff26b6db,#ff0882c8,#ffffffff;#ffa9a9a9,#ff58656c,#ffffffff;#ffa9a9a9,#ff58656c,#ffffffff"
statusIconsRenderSize=@Size(32 32)
tabPos=1
trayIcons="#ff26b6db,#ff0882c8,#ffffffff;#ffdb3c26,#ffc80828,#ffffffff;#ffc9ce3b,#ffebb83b,#ffffffff;#ff2d9d69,#ff2d9d69,#ffffffff;#ff26b6db,#ff0882c8,#ffffffff;#ff26b6db,#ff0882c8,#ffffffff;#ffa9a9a9,#ff58656c,#ffffffff;#ffa9a9a9,#ff58656c,#ffffffff"
trayIconsRenderSize=@Size(32 32)
trayMenuSize=@Size(450 400)
[webview]
disabled=false
geometry=@ByteArray()
keepRunning=true
zoomFactor=1
configuration {
theme: "/home/jleechpe/.local/share/rofi/themes/oxide.rasi";
}
import os
import socket
import subprocess
import re
import asyncio
from libqtile.config import Key, Screen, Group, Drag, Click, Match
from libqtile.command import lazy
from libqtile import layout, bar, widget, hook, qtile, extension
from libqtile.log_utils import logger
try:
from typing import List # noqa: F401
except ImportError:
pass
def mpris_playpause():
qtile.cmd_spawn(["playerctl", "--player=spotify", "play-pause"])
def mpris_nexttrack():
qtile.cmd_spawn(["playerctl", "--player=spotify", "next"])
def mpris_prevtrack():
qtile.cmd_spawn(["playerctl", "--player=spotify", "previous"])
@hook.subscribe.startup_once
def autostart():
logger.info("Running autostart")
home = os.path.expanduser("~/.config/qtile/autostart.sh")
subprocess.call([home])
@lazy.function
def window_to_prev_group(qtile):
if qtile.currentWindow is not None:
i = qtile.groups.index(qtile.currentGroup)
qtile.currentWindow.togroup(qtile.groups[i - 1].name)
@lazy.function
def window_to_next_group(qtile):
if qtile.currentWindow is not None:
i = qtile.groups.index(qtile.currentGroup)
qtile.currentWindow.togroup(qtile.groups[i + 1].name)
GREY = "#444444"
DARK_GREY = "#333333"
BLUE = "#007fcf"
DARK_BLUE = "#005083"
ORANGE = "#dd6600"
DARK_ORANGE = "#582c00"
mod = "mod4"
hostname = socket.gethostname()
homedir = os.getenv("HOME")
keys = [
Key([mod], "Return", lazy.spawn("wezterm")),
# Switch window focus to other pane(s) of stack
Key([mod], "space", lazy.layout.next()),
# Swap panes of split stack
Key([mod, "shift"], "space", lazy.layout.rotate()),
# Toggle between split and unsplit sides of stack.
# Split = all windows displayed
# Unsplit = 1 window displayed, like Max layout, but still with
# multiple stack panes
Key([mod, "shift"], "Return", lazy.layout.toggle_split()),
# Toggle between different layouts as defined below
Key([mod], "Tab", lazy.next_layout()),
Key([mod], "w", lazy.window.kill()),
Key([mod, "control"], "r", lazy.restart()),
Key([mod, "control"], "q", lazy.shutdown()),
Key([mod], "r", lazy.spawncmd()),
Key([mod], "p", lazy.spawn("rofi -show drun")),
Key([mod, "shift"], "p", lazy.spawn("rofi-pass")),
Key(["mod1", "control"], "l", lazy.spawn("slock")),
Key(
[mod, "shift"],
"w",
lazy.spawn(
"sh -c 'feh --randomize --bg-scale {:s}/.config/qtile/wallpapers/*/*'".format(
homedir
)
),
),
Key(
[mod, "control"],
"m",
lazy.run_extension(
extension.CommandSet(
commands={
"play/pause": "playerctl play-pause",
"next": "playerctl next",
"previous": "playerctl previous",
},
)
),
),
Key(["shift"], "Print", lazy.spawn("flameshot gui")),
Key([mod], "Print", lazy.spawn("flameshot launcher")),
Key([], "Print", lazy.spawn("flameshot full -c")),
Key(["control"], "Print", lazy.spawn("flameshot screen -c")),
# Window controls
Key([mod], "h", lazy.layout.left()), # Switch between windows in current stack pane
Key([mod], "j", lazy.layout.up()), # Switch between windows in current stack pane
Key([mod], "k", lazy.layout.down()), # Switch between windows in current stack pane
Key(
[mod], "l", lazy.layout.right() # Switch between windows in current stack pane
),
Key(
[mod, "shift"],
"k",
lazy.layout.shuffle_down(), # Move windows down in current stack
),
Key(
[mod, "shift"],
"j",
lazy.layout.shuffle_up(), # Move windows up in current stack
),
Key(
[mod, "shift"],
"l",
lazy.layout.grow(), # Grow size of current window (XmonadTall)
lazy.layout.increase_nmaster(), # Increase number in master pane (Tile)
),
Key(
[mod, "shift"],
"h",
lazy.layout.shrink(), # Shrink size of current window (XmonadTall)
lazy.layout.decrease_nmaster(), # Decrease number in master pane (Tile)
),
Key(
[mod, "shift"],
"Left", # Move window to workspace to the left
window_to_prev_group,
),
Key(
[mod, "shift"],
"Right", # Move window to workspace to the right
window_to_next_group,
),
Key(
[mod],
"n",
lazy.layout.normalize(), # Restore all windows to default size ratios
),
Key(
[mod],
"m",
lazy.layout.maximize(), # Toggle a window between minimum and maximum sizes
),
Key([mod, "shift"], "f", lazy.window.toggle_fullscreen()),
Key([mod, "shift"], "KP_Enter", lazy.window.toggle_floating()), # Toggle floating
Key(
[mod, "shift"],
"space",
lazy.layout.rotate(), # Swap panes of split stack (Stack)
lazy.layout.flip(), # Switch which side main pane occupies (XmonadTall)
),
# Stack controls
Key(
[mod],
"space",
lazy.layout.next(), # Switch window focus to other pane(s) of stack
),
Key(
[mod, "control"],
"Return",
lazy.layout.toggle_split(), # Toggle between split and unsplit sides of stack
),
# Laptop keys
Key([], "XF86AudioMute", lazy.spawn("pulseaudio-ctl mute")),
Key([], "XF86AudioLowerVolume", lazy.spawn("pulseaudio-ctl up")),
Key([], "XF86AudioRaiseVolume", lazy.spawn("pulseaudio-ctl up")),
Key([], "XF86MonBrightnessUp", lazy.spawn("light -A 10")),
Key([], "XF86MonBrightnessDown", lazy.spawn("light -U 10")),
Key([], "XF86KbdBrightnessUp", lazy.spawn("light -k -A 10")),
Key([], "XF86KbdBrightnessDown", lazy.spawn("light -k -U 10")),
]
groups = [Group(i) for i in "123456789"]
groups.append(
Group(
name="m",
label="Media",
matches=[
Match(wm_class=["spotify", "Spotify"]),
Match(wm_class="Spotify"),
Match(title=re.compile(".*Spotify.*")),
],
persist=False,
init=False,
exclusive=True,
)
)
for i in groups:
keys.extend(
[
# mod1 + letter of group = switch to group
Key([mod], i.name, lazy.group[i.name].toscreen()),
# mod1 + shift + letter of group = switch to & move focused window to group
Key([mod, "shift"], i.name, lazy.window.togroup(i.name)),
]
)
@hook.subscribe.client_new
async def move_spotify(client):
await asyncio.sleep(0.01)
if re.compile("^Spotify(?: Premium)?$").search(client.name):
qtile.cmd_addgroup("m", label="Media")
client.togroup("m")
layout_theme = {
"border_width": 2,
"margin": 10,
"border_focus": "007fcf",
"border_normal": "1D2330",
}
border_args = {"border_width": 2}
layouts = [
layout.Max(**layout_theme),
layout.MonadTall(**layout_theme),
layout.MonadWide(**layout_theme),
layout.Bsp(**layout_theme),
layout.TreeTab(
font="Ubuntu",
fontsize=10,
sections=["FIRST", "SECOND"],
section_fontsize=11,
bg_color="141414",
active_bg="90C435",
active_fg="000000",
inactive_bg="384323",
inactive_fg="a0a0a0",
padding_y=5,
section_top=10,
panel_width=320,
**layout_theme
),
# layout.Stack(stacks=2, **layout_theme),
# layout.Columns(**layout_theme),
# layout.RatioTile(**layout_theme),
# layout.VerticalTile(**layout_theme),
# layout.Tile(shift_windows=True, **layout_theme),
# layout.Matrix(**layout_theme),
# layout.Zoomy(**layout_theme),
layout.Floating(**layout_theme),
]
widget_defaults = dict(font="Terminus (TTF)", fontsize=14, padding=0, background=BLUE)
extension_defaults = widget_defaults.copy()
prompt = "{0}@{1}: ".format(os.environ["USER"], hostname)
screen_defs = [
{
"width": 2560,
"height": 1440,
"x": 1080,
},
{
"width": 2560,
"height": 1440,
"x": 3640,
},
{
"width": 1080,
"height": 19200,
"x": 0,
},
]
screens = []
for screen in screen_defs:
screens.append(
Screen(
top=bar.Bar(
[
widget.Prompt(prompt=prompt, background=BLUE),
widget.TextBox(
text=" ",
fontsize=45,
padding=-8,
foreground=DARK_BLUE,
background=BLUE,
),
widget.CurrentLayoutIcon(background=BLUE),
widget.TextBox(
text=" ",
fontsize=45,
padding=-8,
foreground=BLUE,
background=DARK_BLUE,
),
widget.GroupBox(
urgent_border=DARK_BLUE,
disable_drag=True,
highlight_method="block",
this_screen_border=DARK_BLUE,
other_screen_border=DARK_ORANGE,
this_current_screen_border=BLUE,
other_current_screen_border=ORANGE,
background=DARK_BLUE,
),
widget.TextBox(
text=" ",
fontsize=45,
padding=-8,
foreground=DARK_BLUE,
background=BLUE,
),
widget.TaskList(
markup=True,
markup_focused='<span background="#005083" foreground="#aaffaa">{}</span>',
background=BLUE,
border=DARK_BLUE,
urgent_border=DARK_BLUE,
),
widget.TextBox(
text=" ",
fontsize=45,
padding=-8,
foreground=DARK_GREY,
background=BLUE,
),
widget.Mpris2(
name="spotify",
objname="org.mpris.MediaPlayer2.spotify",
display_metadata=["xesam:title", "xesam:artist"],
scroll_chars=None,
stop_pause_text="",
background=DARK_GREY,
mouse_callbacks={
"Button1": mpris_playpause,
"Button4": mpris_nexttrack,
"Button5": mpris_prevtrack,
},
),
widget.Volume(
background=DARK_GREY,
foreground=ORANGE,
cardid="1",
mute_command="pactl set-sink-mute 8 toggle",
volume_app="/usr/bin/pavucontrol",
),
widget.TextBox(
text=" ",
fontsize=45,
padding=-8,
foreground=DARK_BLUE,
background=DARK_GREY,
),
widget.Systray(background=DARK_BLUE),
widget.TextBox(
text=" ",
fontsize=45,
padding=-8,
foreground=BLUE,
background=DARK_BLUE,
),
widget.TextBox(
text=" ⌚", foreground=BLUE, fontsize=18, background=BLUE
),
widget.Clock(format="%Y-%m-%d %a %H:%M:%S", background=BLUE),
widget.TextBox(
text=" ",
fontsize=45,
padding=-8,
foreground=DARK_BLUE,
background=BLUE,
),
widget.CurrentLayout(background=DARK_BLUE),
],
18,
),
width=screen["width"],
height=screen["height"],
x=screen["x"],
y=0,
)
)
# Drag floating layouts.
mouse = [
Drag(
[mod],
"Button1",
lazy.window.set_position_floating(),
start=lazy.window.get_position(),
),
Drag(
[mod], "Button3", lazy.window.set_size_floating(), start=lazy.window.get_size()
),
Click([mod], "Button2", lazy.window.bring_to_front()),
]
dgroups_key_binder = None
dgroups_app_rules = [] # type: List
main = None
follow_mouse_focus = True
bring_front_click = False
cursor_warp = False
floating_layout = layout.Floating(
float_rules=[
Match(
wm_class="Steam", title=re.compile("Friends List|Install - .*|.* - Steam")
),
Match(wm_class="confirm"),
Match(wm_class="dialog"),
Match(wm_class="download"),
Match(wm_class="error"),
Match(wm_class="file_progress"),
Match(wm_class="notification"),
Match(wm_class="splash"),
Match(wm_class="toolbar"),
Match(wm_class="confirmreset"), # gitk
Match(wm_class="makebranch"), # gitk
Match(wm_class="maketag"), # gitk
Match(title="branchdialog"), # gitk
Match(title="pinentry"), # GPG key password entry
Match(wm_class="ssh-askpass"), # ssh-askpass,
],
**layout_theme
)
auto_fullscreen = True
focus_on_window_activation = "smart"
reconfigure_screens = True
# XXX: Gasp! We're lying here. In fact, nobody really uses or cares about this
# string besides java UI toolkits; you can see several discussions on the
# mailing lists, github issues, and other WM documentation that suggest setting
# this string if your java app doesn't work correctly. We may as well just lie
# and say that we're a working one by default.
#
# We choose LG3D to maximize irony: it is a 3D non-reparenting WM written in
# java that happens to be on java's whitelist.
wmname = "Qtile"
autoclip: false
autoimport: true
cliptimeout: 45
exportkeys: true
nocolor: false
nopager: false
notifications: true
parsing: true
path: /home/jleechpe/.password-store
safecontent: true
{{ if .includes.jlptech -}}
mounts:
jlptech: /home/jleechpe/.jlptech-store
{{- end }}
[author]
name = "{{ .user.username }}"
full_name = "{{ .user.fullname }}"
email = "{{ .user.email }}"
defaults
auth on
tls on
tls_starttls off
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile ~/.cache/msmtp.log
# JLP
account JLP
tls_starttls off
host mail.leechpepin.com
port 465
from jonathan@leechpepin.com
user jonathan@leechpepin.com
passwordeval "pass show email/jonathan@leechpepin.com"
{{ if .includes.jlptech -}}
# JLP Tech Consulting
account Consulting
host mail.consultjlp.com
port 465
tls_starttls off
from jlp@consultjlp.com
user jlp@consultjlp.com
passwordeval "pass show jlptech/email/jlp@consultjlp.com"
{{- end }}
SSH_AGENT_PID=""
SSH_AUTH_SOCK="${XDG_RUNTIME_DIR}/gnupg/S.gpg-agent.ssh"
EDITOR="/usr/bin/emacsclient -c"
VISUAL="/usr/bin/emacsclient -c"
# Ensure pacmatic uses powerpill
pacman_program="/usr/bin/powerpill"
[global]
### Display ###
# Which monitor should the notifications be displayed on.
monitor = 1
# 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 = "300x5-30+20"
# Turn on the progess bar
progress_bar = true
# Set the progress bar height. This includes the frame, so make sure
# it's at least twice as big as the frame width.
progress_bar_height = 10
# Set the frame width of the progress bar
progress_bar_frame_width = 1
# Set the minimum width for the progress bar
progress_bar_min_width = 150
# Set the maximum width for the progress bar
progress_bar_max_width = 300
# 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 = 2
# Padding between text and separator.
padding = 8
# Horizontal padding.
horizontal_padding = 8
# Padding between text and icon.
text_icon_padding = 0
# Defines width in pixels of frame around the notification window.
# Set to 0 to disable.
frame_width = 3
# Defines color of the frame around the notification window.
frame_color = "#aaaaaa"
# 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.
# A client can set the 'transient' hint to bypass this. See the rules
# section for how to disable this if necessary
idle_threshold = 120
### Text ###
font = Monospace 8
# 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
# <https://developer.gnome.org/pango/stable/pango-Markup.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
# %% Literal %
# Markup is allowed
format = "<b>%s</b>\n%b"
# Alignment of message text.
# Possible values are "left", "center" and "right".
alignment = left
# Vertical alignment of message text and icon.
# Possible values are "top", "center" and "bottom".
vertical_alignment = center
# 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
# When word_wrap is set to no, specify where to make an ellipsis in long lines.
# Possible values are "start", "middle" and "end".
ellipsize = middle
# Ignore newlines '\n' in notifications.
ignore_newline = no
# Stack together notifications with the same content
stack_duplicates = true
# Hide the count of stacked 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 = left
# Scale small icons up to this size, set to 0 to disable. Helpful
# for e.g. small files or high-dpi screens. In case of conflict,
# max_icon_size takes precedence over this.
min_icon_size = 0
# Scale larger icons down to this size, set to 0 to disable
max_icon_size = 32
# Paths to default icons.
icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/
### 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/dmenu -p dunst:
# Browser for opening urls in context menu.
browser = /usr/bin/firefox -new-tab
# 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
# Manage dunst's desire for talking
# Can be one of the following values:
# crit: Critical features. Dunst aborts
# warn: Only non-fatal warnings
# mesg: Important Messages
# info: all unimportant stuff
# debug: all less than unimportant stuff
verbosity = mesg
# Define the corner radius of the notification window
# in pixel size. If the radius is 0, you have no rounded
# corners.
# The radius will be automatically lowered if it exceeds half of the
# notification height to avoid clipping text and/or icons.
corner_radius = 0
# Ignore the dbus closeNotification message.
# Useful to enforce the timeout set by dunst configuration. Without this
# parameter, an application may close the notification sent before the
# user defined timeout.
ignore_dbusclose = false
### Wayland ###
# These settings are Wayland-specific. They have no effect when using X11
# Uncomment this if you want to let notications appear under fullscreen
# applications (default: overlay)
# layer = top
# Set this to true to use X11 output on Wayland.
force_xwayland = 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
### mouse
# Defines list of actions for each mouse event
# Possible values are:
# * none: Don't do anything.
# * do_action: If the notification has exactly one action, or one is marked as default,
# invoke it. If there are multiple and no default, open the context menu.
# * close_current: Close current notification.
# * close_all: Close all notifications.
# These values can be strung together for each mouse event, and
# will be executed in sequence.
mouse_left_click = close_current
mouse_middle_click = do_action, close_current
mouse_right_click = close_all
# 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
# The internal keyboard shortcut support in dunst is now considered deprecated
# and should be replaced by dunstctl calls. You can use the configuration of your
# WM or DE to bind these to shortcuts of your choice.
# Check the dunstctl manual page for more info.
[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. Equivalent dunstctl command:
# dunstctl close
# close = ctrl+space
# Close all notifications. Equivalent dunstctl command:
# dunstctl close-all
# close_all = ctrl+shift+space
# Redisplay last message(s). Equivalent dunstctl command:
# dunstctl history-pop
# history = ctrl+grave
# Context menu. Equivalent dunstctl command:
# dunstctl context
# context = ctrl+shift+period
[urgency_low]
# IMPORTANT: colors have to be defined in quotation marks.
# Otherwise the "#" and following would be interpreted as a comment.
background = "#222222"
foreground = "#888888"
timeout = 10
# Icon for notifications with low urgency, uncomment to enable
#icon = /path/to/icon
[urgency_normal]
background = "#285577"
foreground = "#ffffff"
timeout = 10
# Icon for notifications with normal urgency, uncomment to enable
#icon = /path/to/icon
[urgency_critical]
background = "#900000"
foreground = "#ffffff"
frame_color = "#ff0000"
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 (discouraged, see desktop_entry)
# body
# category
# desktop_entry
# icon
# match_transient
# msg_urgency
# stack_tag
# summary
#
# and you can override the
# background
# foreground
# format
# frame_color
# fullscreen
# new_icon
# set_stack_tag
# set_transient
# timeout
# urgency
#
# Shell-like globbing will get expanded.
#
# Instead of the appname filter, it's recommended to use the desktop_entry filter.
# GLib based applications export their desktop-entry name. In comparison to the appname,
# the desktop-entry won't get localized.
#
# 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.
# Disable the transient hint so that idle_threshold cannot be bypassed from the
# client
#[transient_disable]
# match_transient = yes
# set_transient = no
#
# Make the handling of transient notifications more strict by making them not
# be placed in history.
#[transient_history_ignore]
# match_transient = yes
# history_ignore = yes
# fullscreen values
# show: show the notifications, regardless if there is a fullscreen window opened
# delay: displays the new notification, if there is no fullscreen window active
# If the notification is already drawn, it won't get undrawn.
# pushback: same as delay, but when switching into fullscreen, the notification will get
# withdrawn from screen again and will get delayed like a new notification
#[fullscreen_delay_everything]
# fullscreen = delay
#[fullscreen_show_critical]
# msg_urgency = critical
# fullscreen = show
#[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
#[skip-display]
# # This notification will not be displayed, but will be included in the history
# summary = "foobar"
# skip_display = 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
#
#[stack-volumes]
# appname = "some_volume_notifiers"
# set_stack_tag = "volume"
#
# vim: ft=cfg