dotfiles/_desktop/qtile/config.py

216 lines
7.7 KiB
Python

import os
import psutil
import subprocess
from libqtile import bar, extension, hook, layout, widget
from libqtile.config import Click, Drag, DropDown, Group, Key, Match, ScratchPad, Screen
from libqtile.dgroups import simple_key_binder
from libqtile.lazy import lazy
@hook.subscribe.startup_once
def autostart():
home = os.path.expanduser('~/.config/qtile/autostart.sh')
subprocess.Popen([home])
groups = [
Group("1", label="\uf292"),
Group("2", label="\uf738", matches=[Match(wm_class=["firefox"])]),
Group("3", label="\uf70d", matches=[Match(wm_class=["Ferdi"])]),
Group("4", label="\uf7aa", matches=[Match(wm_class=["mutt"])]),
Group("5", label="\uf120"),
Group("6", label="\uf120"),
Group("7", label="\ufce1", matches=[Match(wm_class=["1Password"])]),
Group("8", label="\uf9b0", matches=[Match(wm_class=["Slack"])]),
Group("9", label="\uf296"),
Group("0", label="\uf2bb", matches=[Match(wm_class=["workfx"])]),
ScratchPad("scratchpad", [
DropDown(
"spterm", "sh -c 'BROWSER=firefox st'",
on_focus_lost_hide=False,
width=0.40,
height=0.50,
x=0.30,
y=0.25,
),
DropDown(
"spwork", "sh -c 'BROWSER=workfx st -n work'",
on_focus_lost_hide=False,
width=0.40,
height=0.50,
x=0.30,
y=0.25,
),
]),
]
mod = "mod4"
keys = [
# switch between windows
Key([mod], "h", lazy.layout.left()),
Key([mod], "l", lazy.layout.right()),
Key([mod], "j", lazy.layout.down()),
Key([mod], "k", lazy.layout.up()),
# move windows
Key([mod, "control"], "h", lazy.layout.shuffle_left()),
Key([mod, "control"], "l", lazy.layout.shuffle_right()),
Key([mod, "control"], "j", lazy.layout.shuffle_down()),
Key([mod, "control"], "k", lazy.layout.shuffle_up()),
# resize windows
Key([mod, "shift"], "h", lazy.layout.grow_left()),
Key([mod, "shift"], "l", lazy.layout.grow_right()),
Key([mod, "shift"], "j", lazy.layout.grow_down()),
Key([mod, "shift"], "k", lazy.layout.grow_up()),
Key([mod, "shift", "control"], "0", lazy.layout.normalize()),
# app binds
Key([mod], "Return", lazy.spawn("sh -c 'BROWSER=firefox st'")),
Key([mod], "space", lazy.spawncmd()),
Key([mod], "a", lazy.spawn("authenticator")),
Key([mod], "e", lazy.group["scratchpad"].dropdown_toggle('spterm')),
Key([mod], "i", lazy.spawn("scrot -f -s 'scrot_%Y-%m-%d_%H-%M-%S_%s.png'")),
Key([mod], "m", lazy.spawn("sh -c 'pgrep -x neomutt > /dev/null || BROWSER=firefox st -n mutt -e neomutt'")),
Key([mod, "shift"], "e", lazy.group["scratchpad"].dropdown_toggle('spwork')),
Key([mod, "shift"], "i", lazy.spawn("scrot -f 'scrot_%Y-%m-%d_%H-%M-%S_%s.png'")),
Key([mod, "shift"], "Return", lazy.spawn("sh -c 'BROWSER=workfx st -n work'")),
Key([mod, "control"], "a", lazy.spawn("dmenu-audio")),
Key([mod, "control"], "b", lazy.spawn("dmenu-bluetooth")),
Key([mod, "control"], "e", lazy.spawn("dmenu-emoji")),
Key([mod, "control"], "d", lazy.spawn("dmenu-display")),
# WM control
Key([mod], "q", lazy.window.kill()),
Key([mod, "control", "shift"], "l", lazy.spawn("physlock")),
Key([mod, "control", "shift"], "q", lazy.shutdown()),
Key([mod, "control", "shift"], "r", lazy.reload_config()),
# media keys
Key([], "XF86AudioMute", lazy.spawn("pactl set-sink-mute @DEFAULT_SINK@ toggle")),
Key([], "XF86AudioMicMute", lazy.spawn("key-micmute")),
Key([], "XF86AudioRaiseVolume", lazy.spawn("sb-volume inc")),
Key([], "XF86AudioLowerVolume", lazy.spawn("sb-volume dec")),
Key([], "XF86MonBrightnessUp", lazy.spawn("xbacklight -inc 10")),
Key([], "XF86MonBrightnessDown", lazy.spawn("xbacklight -dec 10")),
]
dgroups_key_binder = simple_key_binder(mod)
dgroups_app_rules = [] # type: list
layouts = [
layout.Columns(
border_focus='#ffffff',
border_normal='#0f1419',
border_on_single = False,
border_width=2,
insert_position=1,
margin=[5, 5, 5, 5]
),
]
widget_defaults = dict(
background='#0f1419',
foreground='#e6e1cf',
font="RobotoMono Nerd Font Medium",
fontsize=14,
)
extension_defaults = widget_defaults.copy()
screens = [
Screen(
top=bar.Bar(
[
widget.GroupBox(
disable_drag=True,
highlight_method='block',
rounded=False,
this_current_screen_border='#005577',
urgent_alert_method='block',
urgent_border='#770000',
),
widget.Prompt(
prompt='open: ',
record_history=False,
),
widget.Spacer(),
widget.GenPollText(
background='#e8b923',
foreground='#000000',
font='RobotoMono Nerd Font Bold',
update_interval=0.5,
func=lambda: subprocess.check_output("sb-yubikey").decode(),
),
widget.GenPollText(
background='#005577',
foreground='#ffffff',
update_interval=1,
func=lambda: subprocess.check_output("sb-mail").decode(),
),
widget.GenPollText(
background='#770000',
foreground='#ffffff',
update_interval=1,
func=lambda: subprocess.check_output("sb-network").decode(),
),
widget.GenPollText(
background='#770000',
foreground='#ffffff',
update_interval=1,
func=lambda: subprocess.check_output("sb-volume").decode(),
),
widget.GenPollText(
update_interval=1,
func=lambda: subprocess.check_output("sb-battery").decode(),
),
widget.Clock(
format='[%d] %H:%M:%S'
),
widget.Systray(),
],
24,
margin=[5, 5, 5, 5]
),
),
]
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()),
]
floating_layout = layout.Floating(
float_rules=[
*layout.Floating.default_float_rules,
Match(wm_class='Authenticator'),
],
border_focus='#ffffff',
border_normal="#272822",
border_width=2,
)
@hook.subscribe.client_new
def _swallow(window):
pid = window.window.get_net_wm_pid()
ppid = psutil.Process(pid).ppid()
cpids = {c.window.get_net_wm_pid(): wid for wid, c in window.qtile.windows_map.items()}
for i in range(5):
if not ppid:
return
if ppid in cpids:
parent = window.qtile.windows_map.get(cpids[ppid])
if parent.window.get_wm_class()[0] != "xterm-256color":
return
parent.minimized = True
window.parent = parent
return
ppid = psutil.Process(ppid).ppid()
@hook.subscribe.client_killed
def _unswallow(window):
if hasattr(window, 'parent'):
window.parent.minimized = False
auto_fullscreen = True
auto_minimize = True
bring_front_click = False
cursor_warp = False
focus_on_window_activation = "smart"
follow_mouse_focus = True
reconfigure_screens = True
wmname = "LG3D"