Qtile Config
- Table of Contents
- About This Config
- Imports
- Helper Flags For X11/Wayland
- Variables
- Custom Functions
- Keybindings
- Groups
- Colorscheme
- Default Settings For All Layouts
- Layouts
- Default Settings For All Widgets
- Widgets
- Screens
- Some Important Functions
- Drag Floating Layouts
- Window Rules
- Autostart Programs
- Java Apps Might Need This
Table of Contents toc
About This Config
Modified by Derek Taylor
- My YouTube: http://www.youtube.com/c/DistroTube
- My GitLab: http://www.gitlab.com/dwt1/
# Copyright (c) 2010 Aldo Cortesi
# Copyright (c) 2010, 2014 dequis
# Copyright (c) 2012 Randall Ma
# Copyright (c) 2012-2014 Tycho Andersen
# Copyright (c) 2012 Craig Barnes
# Copyright (c) 2013 horsik
# Copyright (c) 2013 Tao Sauvage
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
Imports
These are python modules that must be imported for this config.
import os
import subprocess
from libqtile import bar, extension, hook, layout, qtile, widget
from libqtile.config import Click, Drag, Group, Key, KeyChord, Match, Screen
from libqtile.lazy import lazy
import colors
Helper Flags For X11/Wayland
IS_WAYLAND = qtile.core.name == "wayland"
IS_X11 = qtile.core.name == "x11"
Variables
Just some variables I am setting to make my life easier.
mod = "mod4" # Sets mod key to SUPER/WINDOWS
myTerm = "alacritty" # My terminal of choice
myBrowser = "brave" # My browser of choice
myEmacs = "emacsclient -c -a 'emacs' " # The space at the end is IMPORTANT!
Custom Functions
# Allows you to input a name when adding treetab section.
@lazy.layout.function
def add_treetab_section(layout):
prompt = qtile.widgets_map["prompt"]
prompt.start_input("Section name: ", layout.cmd_add_section)
# A function for hide/show all the windows in a group
@lazy.function
def minimize_all(qtile):
for win in qtile.current_group.windows:
if hasattr(win, "toggle_minimize"):
win.toggle_minimize()
# A function for toggling between MAX and MONADTALL layouts
@lazy.function
def maximize_by_switching_layout(qtile):
current_layout_name = qtile.current_group.layout.name
if current_layout_name == 'monadtall':
qtile.current_group.layout = 'max'
elif current_layout_name == 'max':
qtile.current_group.layout = 'monadtall'
Keybindings
A list of available commands that can be bound to keys can be found at: https://docs.qtile.org/en/latest/manual/config/lazy.html
| IMPORTANT KEYBINDINGS | ASSOCIATED ACTION |
|---|---|
| MODKEY + RETURN | opens terminal (alacritty) |
| MODKEY + SHIFT + RETURN | opens run launcher (rofi) |
| MODKEY + TAB | rotates through the available layouts |
| MODKEY + SHIFT + c | closes window with focus |
| MODKEY + SHIFT + r | restarts qtile |
| MODKEY + SHIFT + q | quits qtile |
| MODKEY + 1-9 | switch focus to workspace (1-9) |
| MODKEY + SHIFT + 1-9 | send focused window to workspace (1-9) |
| MODKEY + j | lazy layout down (switches focus between windows in the stack) |
| MODKEY + k | lazy layout up (switches focus between windows in the stack) |
| MODKEY + SHIFT + j | lazy layout shuffle_down (rotates the windows in the stack) |
| MODKEY + SHIFT + k | lazy layout shuffle_up (rotates the windows in the stack) |
| MODKEY + equals | expand size of window (MondadTall layout) |
| MODKEY + minus | shrink size of window (MondadTall layout) |
| MODKEY + period | switch focus to next monitor |
| MODKEY + comma | switch focus to prev monitor |
keys = [
# The essentials
Key([mod], "Return", lazy.spawn(myTerm), desc="Terminal"),
# Use 'rofi' as your run launcher.
Key([mod, "shift"], "Return", lazy.spawn("rofi -show drun -show-icons"), desc='Run Launcher'),
# Use 'emacs' as your run launcher
# Key([mod, "shift"], "Return", lazy.spawn('emacsclient -ce "(dt/emacs-run-launcher)" -F "((name . \\"emacs-run-launcher\\")(minibuffer . only)(width . 80)(height . 11))"'), desc='Run Launcher'),
Key([mod], "w", lazy.spawn(myBrowser), desc='Web browser'),
Key([mod], "b", lazy.hide_show_bar(position='all'), desc="Toggles the bar to show/hide"),
Key([mod], "Tab", lazy.next_layout(), desc="Toggle between layouts"),
Key([mod, "shift"], "c", lazy.window.kill(), desc="Kill focused window"),
Key([mod, "shift"], "r", lazy.reload_config(), desc="Reload the config"),
Key([mod, "shift"], "q", lazy.spawn("dm-logout -r"), desc="Logout menu"),
Key([mod], "r", lazy.spawncmd(), desc="Spawn a command using a prompt widget"),
Key([mod, "shift"], "T", lazy.spawn("conky-toggle"), desc="Conky toggle on/off"),
# Switch between windows
# Some layouts like 'monadtall' only need to use j/k to move
# through the stack, but other layouts like 'columns' will
# require all four directions h/j/k/l to move around.
Key([mod], "h", lazy.layout.left(), desc="Move focus to left"),
Key([mod], "l", lazy.layout.right(), desc="Move focus to right"),
Key([mod], "j", lazy.layout.down(), desc="Move focus down"),
Key([mod], "k", lazy.layout.up(), desc="Move focus up"),
Key([mod], "space", lazy.layout.next(), desc="Move window focus to other window"),
# Move windows between left/right columns or move up/down in current stack.
# Moving out of range in Columns layout will create new column.
Key([mod, "shift"], "h",
lazy.layout.shuffle_left(),
lazy.layout.move_left().when(layout=["treetab"]),
desc="Move window to the left/move tab left in treetab"),
Key([mod, "shift"], "l",
lazy.layout.shuffle_right(),
lazy.layout.move_right().when(layout=["treetab"]),
desc="Move window to the right/move tab right in treetab"),
Key([mod, "shift"], "j",
lazy.layout.shuffle_down(),
lazy.layout.section_down().when(layout=["treetab"]),
desc="Move window down/move down a section in treetab"
),
Key([mod, "shift"], "k",
lazy.layout.shuffle_up(),
lazy.layout.section_up().when(layout=["treetab"]),
desc="Move window downup/move up a section in treetab"
),
# 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"], "space", lazy.layout.toggle_split(), desc="Toggle between split and unsplit sides of stack"),
# Treetab prompt
Key([mod, "shift"], "a", add_treetab_section, desc='Prompt to add new section in treetab'),
# Grow/shrink windows left/right.
# This is mainly for the 'monadtall' and 'monadwide' layouts
# although it does also work in the 'bsp' and 'columns' layouts.
Key([mod], "equal",
lazy.layout.grow_left().when(layout=["bsp", "columns"]),
lazy.layout.grow().when(layout=["monadtall", "monadwide"]),
desc="Grow window to the left"
),
Key([mod], "minus",
lazy.layout.grow_right().when(layout=["bsp", "columns"]),
lazy.layout.shrink().when(layout=["monadtall", "monadwide"]),
desc="Grow window to the left"
),
# Grow windows up, down, left, right. Only works in certain layouts.
# Works in 'bsp' and 'columns' layout.
Key([mod, "control"], "h", lazy.layout.grow_left(), desc="Grow window to the left"),
Key([mod, "control"], "l", lazy.layout.grow_right(), desc="Grow window to the right"),
Key([mod, "control"], "j", lazy.layout.grow_down(), desc="Grow window down"),
Key([mod, "control"], "k", lazy.layout.grow_up(), desc="Grow window up"),
Key([mod], "n", lazy.layout.normalize(), desc="Reset all window sizes"),
Key([mod], "m", lazy.layout.maximize(), desc='Toggle between min and max sizes'),
Key([mod], "t", lazy.window.toggle_floating(), desc='toggle floating'),
Key([mod], "f", maximize_by_switching_layout(), lazy.window.toggle_fullscreen(), desc='toggle fullscreen'),
Key([mod, "shift"], "m", minimize_all(), desc="Toggle hide/show all windows on current group"),
# Switch focus of monitors
Key([mod], "period", lazy.next_screen(), desc='Move focus to next monitor'),
Key([mod], "comma", lazy.prev_screen(), desc='Move focus to prev monitor'),
# Emacs programs launched using the key chord SUPER+e followed by 'key'
KeyChord([mod],"e", [
Key([], "e", lazy.spawn(myEmacs), desc='Emacs Dashboard'),
Key([], "a", lazy.spawn(myEmacs + "--eval '(emms-play-directory-tree \"~/Music/\")'"), desc='Emacs EMMS'),
Key([], "b", lazy.spawn(myEmacs + "--eval '(ibuffer)'"), desc='Emacs Ibuffer'),
Key([], "d", lazy.spawn(myEmacs + "--eval '(dired nil)'"), desc='Emacs Dired'),
Key([], "i", lazy.spawn(myEmacs + "--eval '(erc)'"), desc='Emacs ERC'),
Key([], "s", lazy.spawn(myEmacs + "--eval '(eshell)'"), desc='Emacs Eshell'),
Key([], "v", lazy.spawn(myEmacs + "--eval '(vterm)'"), desc='Emacs Vterm'),
Key([], "w", lazy.spawn(myEmacs + "--eval '(eww \"distro.tube\")'"), desc='Emacs EWW'),
Key([], "F4", lazy.spawn("killall emacs"),
lazy.spawn("/usr/bin/emacs --daemon"),
desc='Kill/restart the Emacs daemon')
]),
# Dmenu/rofi scripts launched using the key chord SUPER+p followed by 'key'
KeyChord([mod], "p", [
Key([], "h", lazy.spawn("dm-hub -r"), desc='List all dmscripts'),
Key([], "a", lazy.spawn("dm-sounds -r"), desc='Choose ambient sound'),
Key([], "b", lazy.spawn("dm-setbg -r"), desc='Set background'),
Key([], "c", lazy.spawn("dtos-colorscheme -r"), desc='Choose color scheme'),
Key([], "e", lazy.spawn("dm-confedit -r"), desc='Choose a config file to edit'),
Key([], "i", lazy.spawn("dm-maim -r"), desc='Take a screenshot'),
Key([], "k", lazy.spawn("dm-kill -r"), desc='Kill processes '),
Key([], "m", lazy.spawn("dm-man -r"), desc='View manpages'),
Key([], "n", lazy.spawn("dm-note -r"), desc='Store and copy notes'),
Key([], "o", lazy.spawn("dm-bookman -r"), desc='Browser bookmarks'),
Key([], "p", lazy.spawn("rofi-pass"), desc='Password menu'),
Key([], "q", lazy.spawn("dm-logout -r"), desc='Logout menu'),
Key([], "r", lazy.spawn("dm-radio -r"), desc='Listen to online radio'),
Key([], "s", lazy.spawn("dm-websearch -r"), desc='Search various engines'),
Key([], "t", lazy.spawn("dm-translate -r"), desc='Translate text'),
Key([], "u", lazy.spawn("dm-music -r"), desc='Toggle music mpc/mpd')
])
]
Groups
Groups are really workspaces. group_names should remain 0-9 so the MOD+0-9 keybindings work as expected. group_labels are the labels of the groups that are displayed in the bar. Feel free to change group_labels to anything you wish. group_layouts sets the default layout for each group.
groups = []
group_names = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
# Uncomment only one of the following lines
group_labels = ["⬤", "⬤", "⬤", "⬤", "⬤", "⬤", "⬤", "⬤", "⬤", "⬤", ]
#group_labels = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
#group_labels = ["DEV", "WWW", "SYS", "DOC", "VBOX", "CHAT", "MUS", "VID", "GFX", "MISC"]
# The default layout for each of the 10 workspaces
group_layouts = ["monadtall", "monadtall", "monadtall", "monadtall", "monadtall", "monadtall", "monadtall", "monadtall", "monadtall", "monadtall"]
for i in range(len(group_names)):
groups.append(
Group(
name=group_names[i],
layout=group_layouts[i].lower(),
label=group_labels[i],
))
for i in groups:
keys.extend(
[
# mod1 + letter of group = switch to group
Key(
[mod],
i.name,
lazy.group[i.name].toscreen(),
desc="Switch to group {}".format(i.name),
),
# mod1 + shift + letter of group = move focused window to group
Key(
[mod, "shift"],
i.name,
lazy.window.togroup(i.name, switch_group=False),
desc="Move focused window to group {}".format(i.name),
),
]
)
Colorscheme
Colors are defined in a separate 'colors.py' file. It is best not manually change the colorscheme; instead run 'dtos-colorscheme' which is set to 'MOD + p c'. There are 10 colorschemes available to choose from:
- colors.DoomOne
- colors.Dracula
- colors.GruvboxDark
- colors.MonokaiPro
- colors.Nord
- colors.OceanicNext
- colors.Palenight
- colors.SolarizedDark
- colors.SolarizedLight
- colors.TomorrowNight
colors = colors.DoomOne
Default Settings For All Layouts
Some settings that I use on almost every layout, which saves me from having to type these out for each individual layout.
layout_theme = {"border_width": 2,
"margin": 12,
"border_focus": colors[8],
"border_normal": colors[0]
}
Layouts
The layouts that I use, plus several that I don't use. Uncomment the layouts you want; comment out the ones that you don't want to use.
layouts = [
layout.MonadTall(**layout_theme),
layout.MonadWide(**layout_theme),
layout.Tile(**layout_theme),
layout.Max(**layout_theme),
#layout.Bsp(**layout_theme),
#layout.Floating(**layout_theme)
#layout.RatioTile(**layout_theme),
#layout.VerticalTile(**layout_theme),
#layout.Matrix(**layout_theme),
#layout.Stack(**layout_theme, num_stacks=2),
#layout.Columns(**layout_theme),
#layout.TreeTab(
# font = "Ubuntu Bold",
# fontsize = 11,
# border_width = 0,
# bg_color = colors[0],
# active_bg = colors[8],
# active_fg = colors[2],
# inactive_bg = colors[1],
# inactive_fg = colors[0],
# padding_left = 8,
# padding_x = 8,
# padding_y = 6,
# sections = ["ONE", "TWO", "THREE"],
# section_fontsize = 10,
# section_fg = colors[7],
# section_top = 15,
# section_bottom = 15,
# level_shift = 8,
# vspace = 3,
# panel_width = 240
# ),
#layout.Zoomy(**layout_theme),
]
Default Settings For All Widgets
Some settings that I use on almost every widget, which saves me from having to type these out for each individual widget.
widget_defaults = dict(
font="Ubuntu Bold",
fontsize = 12,
padding = 0,
background=colors[0]
)
extension_defaults = widget_defaults.copy()
Widgets
This is the bar (the panel) and the widgets within the bar.
System Tray Widget
This will be a different widget depending on if we are logging into the X11 session or the Wayland session.
def tray_widget():
if IS_WAYLAND:
return widget.StatusNotifier(padding=6)
else:
return widget.Systray(padding=6)
The Rest of the Widgets
def init_widgets_list(include_tray=True):
widgets_list = [
widget.Spacer(length = 8),
widget.Image(
filename = "~/.config/qtile/icons/cachyos.svg",
scale = "False",
mouse_callbacks = {'Button1': lambda: qtile.cmd_spawn("qtilekeys-yad")},
),
widget.Prompt(
font = "Ubuntu Mono",
fontsize=14,
foreground = colors[1]
),
widget.GroupBox(
fontsize = 8,
margin_y = 5,
margin_x = 10,
padding_y = 0,
padding_x = 2,
borderwidth = 3,
active = colors[8],
inactive = colors[9],
rounded = False,
highlight_color = colors[0],
highlight_method = "line",
this_current_screen_border = colors[7],
this_screen_border = colors [4],
other_current_screen_border = colors[7],
other_screen_border = colors[4],
),
widget.TextBox(
text = '|',
font = "Ubuntu Mono",
foreground = colors[9],
padding = 2,
fontsize = 14
),
widget.LaunchBar(
progs = [("🦁", "brave", "Brave web browser"),
("🚀", "alacritty", "Alacritty terminal"),
("📁", "pcmanfm", "PCManFM file manager"),
("🎸", "vlc", "VLC media player")
],
fontsize = 12,
padding = 5,
foreground = colors[3],
),
widget.TextBox(
text = '|',
font = "Ubuntu Mono",
foreground = colors[9],
padding = 2,
fontsize = 14
),
widget.CurrentLayout(
foreground = colors[1],
padding = 5
),
widget.TextBox(
text = '|',
font = "Ubuntu Mono",
foreground = colors[9],
padding = 2,
fontsize = 14
),
widget.WindowName(
foreground = colors[6],
padding = 8,
max_chars = 40
),
widget.GenPollText(
update_interval = 300,
func = lambda: subprocess.check_output("printf $(uname -r)", shell=True, text=True),
foreground = colors[3],
padding = 8,
fmt = '{}',
),
widget.CPU(
foreground = colors[4],
padding = 8,
mouse_callbacks = {'Button1': lambda: qtile.cmd_spawn(myTerm + ' -e htop')},
format = 'Cpu: {load_percent}%',
),
widget.Memory(
foreground = colors[8],
padding = 8,
mouse_callbacks = {'Button1': lambda: qtile.cmd_spawn(myTerm + ' -e htop')},
format = '{MemUsed: .0f}{mm}',
fmt = 'Mem: {}',
),
widget.DF(
update_interval = 60,
foreground = colors[5],
padding = 8,
mouse_callbacks = {'Button1': lambda: qtile.cmd_spawn('notify-disk')},
partition = '/',
#format = '[{p}] {uf}{m} ({r:.0f}%)',
format = '{uf}{m} free',
fmt = 'Disk: {}',
visible_on_warn = False,
),
widget.Volume(
foreground = colors[7],
padding = 8,
fmt = 'Vol: {}',
),
widget.Clock(
foreground = colors[8],
padding = 8,
mouse_callbacks = {'Button1': lambda: qtile.cmd_spawn('notify-date')},
## Uncomment for date and time
# format = "%a, %b %d - %H:%M",
## Uncomment for time only
format = "%I:%M %p",
),
]
if include_tray:
widgets_list.extend([
tray_widget(),
widget.Spacer(length=8),
])
return widgets_list
Screens
Screen settings for my triple monitor setup. Monitor 1 will display ALL widgets in widgets_list. It is important that this is the only monitor that displays all widgets because the systray widget will crash if you try to run multiple instances of it.
def init_widgets_screen1():
widgets_screen1 = init_widgets_list()
return widgets_screen1
# All other monitors' bars will display everything but widgets 22 (systray) and 23 (spacer).
def init_widgets_screen2():
widgets_screen2 = init_widgets_list()
del widgets_screen2[16:17]
return widgets_screen2
# For adding transparency to your bar, add (background="#00000000") to the "Screen" line(s)
# For ex: Screen(top=bar.Bar(widgets=init_widgets_screen2(), background="#00000000", size=24)),
def init_screens():
return [Screen(top=bar.Bar(widgets=init_widgets_screen1(), margin=[8, 12, 0, 12], size=30)),
Screen(top=bar.Bar(widgets=init_widgets_screen2(), margin=[8, 12, 0, 12], size=30)),
Screen(top=bar.Bar(widgets=init_widgets_screen2(), margin=[8, 12, 0, 12], size=30))]
if __name__ in ["config", "__main__"]:
screens = init_screens()
widgets_list = init_widgets_list()
widgets_screen1 = init_widgets_screen1()
widgets_screen2 = init_widgets_screen2()
Some Important Functions
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)
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)
def window_to_previous_screen(qtile):
i = qtile.screens.index(qtile.current_screen)
if i != 0:
group = qtile.screens[i - 1].group.name
qtile.current_window.togroup(group)
def window_to_next_screen(qtile):
i = qtile.screens.index(qtile.current_screen)
if i + 1 != len(qtile.screens):
group = qtile.screens[i + 1].group.name
qtile.current_window.togroup(group)
def switch_screens(qtile):
i = qtile.screens.index(qtile.current_screen)
group = qtile.screens[i - 1].group
qtile.current_screen.set_group(group)
Drag Floating Layouts
Sets SUPER + left mouse to drag floating windows. Sets SUPER + right mouse to resize floating windows. NOTE When inside a virtual machine, you may not be able to use the SUPER key for floating windows if you use SUPER as the mod key for your window manager in the host machine. Thus, I've duplicated all of the mouse bindings to also function with ALT.
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()),
# Drag(["mod1"], "Button1", lazy.window.set_position_floating(), start=lazy.window.get_position()),
# Drag(["mod1"], "Button3", lazy.window.set_size_floating(), start=lazy.window.get_size()),
# Click(["mod1"], "Button2", lazy.window.bring_to_front()),
]
Window Rules
dgroups_key_binder = None
dgroups_app_rules = [] # type: list
follow_mouse_focus = True
bring_front_click = False
cursor_warp = False
floating_layout = layout.Floating(
border_focus=colors[8],
border_width=2,
float_rules=[
# Run the utility of `xprop` to see the wm class and name of an X client.
*layout.Floating.default_float_rules,
Match(wm_class="confirmreset"), # gitk
Match(wm_class="dialog"), # dialog boxes
Match(wm_class="download"), # downloads
Match(wm_class="error"), # error msgs
Match(wm_class="file_progress"), # file progress boxes
Match(wm_class='kdenlive'), # kdenlive
Match(wm_class="makebranch"), # gitk
Match(wm_class="maketag"), # gitk
Match(wm_class="notification"), # notifications
Match(wm_class='pinentry-gtk-2'), # GPG key password entry
Match(wm_class="ssh-askpass"), # ssh-askpass
Match(wm_class="toolbar"), # toolbars
Match(wm_class="Yad"), # yad boxes
Match(title="branchdialog"), # gitk
Match(title='Confirmation'), # tastyworks exit box
Match(title="emacs-run-launcher"), # dt/emacs-run-launcher
Match(title="pinentry"), # GPG key password entry
Match(title='Qalculate!'), # qalculate-gtk
Match(title="tastycharts"), # tastytrade pop-out charts
Match(title="tastytrade"), # tastytrade pop-out side gutter
Match(title="tastytrade - Portfolio Report"), # tastytrade pop-out allocation
Match(wm_class="tasty.javafx.launcher.LauncherFxApp"), # tastytrade settings
]
)
auto_fullscreen = True
focus_on_window_activation = "smart"
reconfigure_screens = True
# If things like steam games want to auto-minimize themselves when losing
# focus, should we respect this or not?
auto_minimize = True
# When using the Wayland backend, this can be used to configure input devices.
wl_input_rules = None
Autostart Programs
Executes a bash script (autostart.sh) which launches programs for autostart.
@hook.subscribe.startup_once
def start_once():
home = os.path.expanduser("~")
if IS_WAYLAND:
subprocess.call([home + "/.config/qtile/autostart-wayland"])
else:
subprocess.call([home + "/.config/qtile/autostart-x11"])
Java Apps Might Need This
# 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 = "LG3D"