Changelog¶
Unreleased changes
Qtile x.xx.x, released XXXX-XX-XX¶
Breaking changes¶
- this release drops support for python 3.9
- deleted the (very old)
libqtile/command_*
deprecation wrappers - SIGUSR2 no longer restarts qtile, instead it dumps stack traces
lazy.<object>.when(when_floating=X)
now behaves differently: the lazy call will be executed independently of the current window's float state by default, and can be limited to when it is floating or tiled by passingwhen_floating
as True or False respectively.
Features¶
- automatically lift types to their annotated type when specified via the
qtile cmd-obj
command line - Add
Plasma
layout. The original layout (https://github.com/numirias/qtile-plasma) appears to be unmaintained so we have added this to the main codebase. - Add ability to specify muted and unmuted formats for
Volume
andPulseVolume
widgets.
Qtile 0.25.0, released 2024-04-06¶
Features¶
- The Battery widget now supports dynamic charge control, allowing for protecting battery life.
- To support the above (plus the other widgets that modify sysfs), qtile now ships with its own udev rules, located at /resources/99-qtile.rules; distro packagers will probably want to install this rule set.
Bug fixes¶
- Fix groups marked with
persist=False
not being deleted when their last window is moved to another group. - Fallback icon in StatusNotifier widget
Qtile 0.24.0, released 2024-01-20¶
Breaking changes (configuration)¶
- Matches no longer use "include/substring" style matching. But match the string exactly. Previously on X11, if the WM_TYPE of a spawned window is e.g. dialog a match with wm_type dialognoonereadschangelogs would return true. Additionally a window with an empty WM_CLASS (which can happen) would match anything. If you rely this style of substring matching, pass a regex to your match or use a function with func=. Using a list of strings inside Match with role, title, wm_class, wm_instance_class, wm_type are also deprecated, use a regex. Right now we replace the property with a regex if it's a list and warn with a deprecation message. You can use "qtile migrate" to migrate your config to this.
Features¶
- Change how
tox
runs tests. See https://docs.qtile.org/en/latest/manual/contributing.html#running-tests-locally for more information on how to run tests locally. - Add
ScreenSplit
layout which allows multiple layouts per screen. Also addsScreenSplit
widget to display name of active split. - Updated
Bluetooth
widget which allows users to manage multiple devices in a single widget - Add
align
option toColumns
layout so new windows can be added to left or right column. .when()
have two new parameters:func: Callable
: Enable call when the result of the callable evaluates to Truecondition: bool
: a boolean value to determine whether the lazy object should be run. Unlikefunc
, the condition is evaluated once when the config file is first loaded.- Add ability to have bar drawns over windows by adding
reserve=False
to bar's config to stop the bar reserving screen space. - Add ability for third-party code (widgets, layouts) to create hooks
- Add ability to create user-defined hooks which can be fired from external scripts
Bug fixes¶
- Fix two bugs in stacking transient windows in X11
- Checking configs containing
qtile.core.name
withpython config.py
don't fail anymore (butqtile.core.name
will beNone
) - Fix an error if a wayland xwindow has unknown wm_type
Qtile 0.23.0, released 2023-09-24¶
Dependencies¶
- xcffib must be upgraded to >= 1.4.0
- cairocffi must be upgraded to >= 1.6.0
- New optional dependency
pulsectl-asyncio
required forPulseVolume
widget
Notice for packagers¶
- wlroots (optional dependency) bump
- Qtile's wayland backend now requires on wlroots 0.16 (and pywlroots 0.16)
Breaking changes (configuration)¶
- The
cmd_
prefix has been dropped from all commands (this means command names are common when accessed via the command interface or internal python objects). - Custom widgets should now expose command methods with the
@expose_command
decorator (available viafrom libqtile.command.base import expose_command
). - Some commands have been renamed (in addition to dropping the 'cmd_' prefix):
hints
->get_hints
groups
->get_groups
screens
->get_screens
- Layouts need to rename some methods:
add
toadd_client
cmd_next
tonext
cmd_previous
toprevious
-
Layouts or widgets that redefine the
commands
property need to update the signature:@expose_command() def commands(self) -> list[str]: ...
-
Window.getsize
has been renamedWindow.get_size
(i.e. merged with the get_size command). Window.getposition
has been renamedWindow.get_position
(i.e. merged with the get_position command).- The
StockTicker
widgetfunction
option is being deprecated: rename it tofunc
. - The formatting of
NetWidget
has changed, if you use theformat
parameter in your config includeup_suffix
,total_suffix
anddown_suffix
to display the respective units. - The
Notify
widget now has separatedefault_timeout
properties for differenct urgency levels. Previously,default_timeout
wasNone
which meant that there was no timeout for all notifications (unless this had been set by the client sending the notification). Now,default_timeout
is for normal urgency notifications and this has been set to a default of 10 seconds.default_timeout_urgent
, for critical notifications, has a timeout ofNone
. - The
PulseVolume
widget now depends on a third party library,pulsectl-asyncio
, to interact with the pulse audio server. Users will now see anImportError
until they install that library.
Features¶
- Add ability to set icon size in
LaunchBar
widget. - Add 'warp_pointer' option to
Drag
that when set will warp the pointer to the bottom right of the window when dragging begins. - Add
currentsong
status toMpd2
widget. - Add ability to disable group toggling in
GroupBox
widget - Add ability to have different border color when windows are stacked in Stack layout. Requires
setting
border_focus_stack
andborder_normal_stack
variables. - Add ability to have different single border width for Columns layout by setting 'single_border_width' key.
- Add ability to have different border and margin widths when VerticalTile layout only contains 1 window by setting 'single_border_width' and 'single_margin' keys.
- New widget: GenPollCommand
- Add
format
andplay_icon
parameters for styling cmus widget. - Add ability to add a group at a specified index
- Add ability to spawn the
WidgetBox
widget opened. - Add ability to swap focused window based on index, and change the order of windows inside current group
- Add ability to update the widget only once if
update_interval
is None. - Add
move_to_slice
command to move current window to single layout inSlice
layout - Made the
NetWidget
text formattable. - Qtile no longer floods the log following X server disconnection, instead handling those errors.
Key
andKeyChord
bindings now have another argumentswallow
. It indicates whether or not the pressed keys should be passed on to the focused client. By default the keys are not passed (swallowed), so this argument is set toTrue
. When set toFalse
, the keys are passed to the focused client. A key is never swallowed if the function is not executed, e.g. due to failing the.when()
check.- Add ability to set custom "Undefined" status key value to
Mpd2Widget
. Mpd2Widget
now searches for artist name in all similar keys (i.ealbumartist
,performer
, etc.).- Add svg support to
CustomLayoutIcon
- added layering controls for X11 (Wayland support coming soon!):
lazy.window.keep_above()/keep_below()
marks windows to be kept above/below other windows permanently. Calling the functions with no arguments toggles the state, otherwise passenable=True
orenable=False
.lazy.window.move_up()/move_down()
moves windows up and down the z axis.- added
only_focused
setting to Max layout, allowing to draw multiple clients on top of each other when set to False - Add
suspend
hook to run functions before system goes to sleep.
Bug fixes¶
- Fix bug where Window.center() centers window on the wrong screen when using multiple monitors.
- Fix
Notify
bug when apps close notifications. - Fix
CPU
precision bug with specific version ofpsutil
- Fix config being reevaluated twice during reload (e.g. all hooks from config were doubled)
- Fix
PulseVolume
high CPU usage when update_interval set to 0. - Fix
Battery
widget on FreeBSD without explicitbattery
index given. - Fix XMonad layout faulty call to nonexistent _shrink_up
- Fix setting tiled position by mouse for layouts using _SimpleLayoutBase. To support this in other layouts, add a swap method taking two windows.
- Fix unfullscreening bug in conjunction with Chromium based clients when auto_fullscreen is set to
False
. - Ensure
CurrentLayoutIcon
expands paths for custom folders. - Fix vertical alignment of icons in
TaskList
widget - Fix laggy resize/positioning of floating windows in X11 by handling motion notify events later. We also introduced a cap setting if you want to limit these events further, e.g. for limiting resource usage. This is configurable with the x11_drag_polling_rate variable for each
Screen
which is set to None by default, indicating no cap. - python version support
- We have added support for python 3.11 and pypy 3.9.
- python 3.7, 3.8 and pypy 3.7 are not longer supported.
- Fix bug where
StatusNotifier
does not update icons
Qtile 0.22.0, released 2022-09-22¶
Breaking changes (configuration)¶
- lazy.qtile.display_kb() no longer receives any arguments. If you passed it any arguments (which were ignored previously), remove them.
- If you have a custom startup Python script that you use instead of
qtile start
and run init_log manually, the signature has changed. Please check the source for the updated arguments. KeyChord
's signature has changed.mode
is now a boolean to indicate whether the mode should persist. Thename
parameter should be used to name the chord (e.g. for theChord
widget).
Features¶
- Add ability to draw borders and add margins to the
Max
layout. - The default XWayland cursor is now set at startup to left_ptr, so an xsetroot call is not needed to avoid the ugly X cursor.
- Wayland: primary clipboard should now behave same way as with X after selecting something it should be copied into clipboard
- Add
resume
hook when computer resumes from sleep/suspend/hibernate. - Add
text_only
option forLaunchBar
widget. - Add
force_update
command toThreadPoolText
widgets to simplify updating from key bindings - Add scrolling ability to
_TextBox
-based widgets. - Add player controls (via mouse callbacks) to
Mpris2
widget. - Wayland: input inhibitor protocol support added (pywayland>=0.4.14 & pywlroots>=0.15.19)
- Add commands to control Pomodoro widget.
- Add icon theme support to
TaskList
widget (available on X11 and Wayland backends). - Wayland: Use
qtile cmd-obj -o core -f get_inputs
to get input device identifiers for configuring inputs. Also input configs will be updated by config reloads (pywlroots>=0.15.21)
Bug fixes¶
- Widgets that are incompatible with a backend (e.g. Systray on Wayland) will no longer show as a ConfigError in the bar. Instead the widget is silently removed from the bar and a message included in the logs.
- Reduce error messages in
StatusNotifier
widget from certain apps. - Reset colours in
Chord
widget - Prevent crash in
LaunchBar
when using SVG icons - Improve scrolling in
Mpris2
widget (options to repeat scrolling etc.)
Qtile 0.21.0, released 2022-03-23¶
Features¶
- Add
lazy.window.center()
command to center a floating window on the screen. - Wayland: added power-output-management-v1 protocol support, added idle protocol, added idle inhibit protocol
- Add MonadThreeCol layout based on XMonad's ThreeColumns.
- Add
lazy.screen.set_wallpaper
command. - Added ability to scale the battery icon's size
- Add Spiral layout
- Add
toggle
argument toWindow.togroup
with the same functionality as inGroup.toscreen
. - Added
margin_on_single
andborder_on_single
to Bsp layout
Bug fixes¶
- Fix
Systray
crash onreconfigure_screens
. - Fix bug where widgets can't be mirrored in same bar.
- Fix various issues with setting fullscreen windows floating and vice versa.
- Fix a bug where a .when() check for lazy functions errors out when matching
on focused windows when none is focused. By default we do not match on focused windows,
to change this set
if_no_focused
to True. - Widget with duplicate names will be automatically renamed by appending numeric suffixes
- Fix resizing of wallpaper when screen scale changes (X11)
- Two small bugfixes for
StatusNotifier
- better handling of Ayatana indicators - Fix bug where StatusNotifierItem crashes due to invalid object paths (e.g. Zoom)
Qtile 0.20.0, released 2022-01-24¶
Features¶
- Add
place_right
option in the TreeTab layout to place the tab panel on the right side - X11: Add support for _NET_DESKTOP_VIEWPORT. E.g. can be used by rofi to map on current output.
- Wayland: Bump wlroots version. 0.15.x wlroots and 0.15.2+ pywlroots are required.
- Add XWayland support to the Wayland backend. XWayland will start up as needed, if it is installed.
Bug fixes¶
- Remove non-commandable windows from IPC. Fixes bug where IPC would fail when trying to get info
on all windows but Systray has icons (which are non-commandable
_Window
s.) - Fix bug where bars were not reconfigured correctly when screen layout changes.
- Fix a Wayland bug where layer-shell surface like dunst would freeze up and stop updating.
- Change timing of
screens_reconfigured
hook. Will now be called ONLY ifcmd_reconfigure_screens
has been called and completed. - Fix order of icons in Systray widget when restarting/reloading config.
- Fix rounding error in PulseVolume widget's reported volume.
- Fix bug where Volume widget did not load images where
theme_path
had been set inwidget_defaults
. - Remove ability to have multiple
Systray
widgets. AdditionalSystray
widgets will result in a ConfigError. - Release notification name from dbus when finalising
Notify
widget. This allows other notification managers to request the name. - Fix bug where
Battery
widget did not retrievebackground
fromwidget_defaults
. - Fix bug where widgets in a
WidgetBox
are rendered on top of bar borders. - Add ability to swap focused window based on index, and change the order of windows inside current group
Qtile 0.19.0, released 2021-12-22¶
Features¶
- Add ability to draw borders to the Bar. Can customise size and colour per edge.
- Add
StatusNotifier
widget implementing theStatusNotifierItem
specification. NB Widget does not provide context menus. - Add
total
bandwidth format value to the Net widget. - Scratchpad groups could be defined as single so that only one of the scratchpad in the group is visible at a given time.
- All scratchpads in a Scratchpad group can be hidden with hide_all() function.
- For saving states of scratchpads during restart, we use wids instead of pids.
- Scratchpads can now be defined with an optional matcher to match with window properties.
Qtile.cmd_reload_config
is added for reloading the config without completely restarting.- Window.cmd_togroup's argument
groupName
should be changed togroup_name
. For the time being a log warning is in place and a migration is added. In the futuregroupName
will fail. - Add
min/max_ratio
to Tile layout and fix bug where windows can extend offscreen. - Add ability for widget
mouse_callbacks
to takelazy
calls (similar to keybindings) - Add
aliases
tolazy.spawncmd()
which takes a dictionary mapping convenient aliases to full command lines. - Add a new 'prefix' option to the net widget to display speeds with a static unit (e.g. MB).
lazy.group.toscreen()
now does not toggle groups by default. To get this behaviour back, uselazy.group.toscreen(toggle=True)
- Tile layout has new
margin_on_single
andborder_on_single
option to specify whether to draw margin and border when there is only one window. - Thermal zone widget.
- Allow TextBox-based widgets to display in vertical bars.
- Added a focused attribute to
lazy.function.when
which can be used to Match on focused windows. - Allow to update Image widget with update() function by giving a new path.
Bug fixes¶
- Windows are now properly re-ordered in the layouts when toggled on and off fullscreen
Qtile 0.18.1, released 2021-09-16¶
Features¶
- All layouts will accept a list of colors for border_* options with which they will draw multiple borders on the appropriate windows.
Qtile 0.18.0, released 2021-07-04¶
Breaking changes (configuration)¶
- The `qtile` entry point doesn't run `qtile start` by default anymore
- New optional dependency for dbus related features: dbus-next.
Replaces previous reliance on dbus/Glib and allows qtile to use async
dbus calls within asyncio's eventloop.
- widget.BatteryIcon no longer has a fallback text mode; use
widget.Battery instead
- MonadX layout key new_at_current is deprecated, use new_client_position.
- `libqtile.window` has been moved to `libqtile.backend.x11.window`; a migration has been added for this.
Deprecations¶
- 'main' config functions, deprecated in 0.16.1, will no longer be executed.
Notice for packagers¶
- new dependencies
- Tests now require the 'dbus-next' python module plus 'dbus-launch' and 'notify-send' applications
Features¶
- added transparency in x11 and wayland backends
- added measure_mem and measure_swap attributes to memory widget to allow user to choose measurement units.
- memory widget can now be displayed with decimal values
- new "qtile migrate" command, which will attempt to upgrade previous configs to the current version in the case of qtile API breaks.
- A new
reconfigure_screens
config setting. WhenTrue
(default) it hooksQtile.reconfigure_screens
to thescreen_change
hook, reconfiguring qtile's screens in response to randr events. This removes the need to restart qtile when adding/removing external monitors. - improved key chord / sequence functionality. Leaving a chord with
mode
set brings you to a named mode you activated before, see #2264. A new command,lazy.ungrab_all_chords
, was introduced to return to the root bindings. Theenter_chord
hook is now always called with a string argument. The third argument toKeyChord
was renamed fromsubmaping
tosubmapping
(typo fix). - added new argument for CheckUpdates widget:
custom_command_modify
which allows user to modify the the line count of the output ofcustom_command
with a lambda function (i.e.lambda x: x-3
). Argument defaults tolambda x: x
and is overridden bydistro
argument's internal lambda. - added new argument for the WindowName, WindowTabs and Tasklist widgets:
parse_text
which allows users to define a function that takes a window name as an input, modify it in some way (e.g. str.replace(), str.upper() or regex) and show that modification on screen. - A Wayland backend has been added which can be used by calling
qtile start -b wayland
directly in your TTY. It requires the latest releases of wlroots, python-xkbcommon, pywayland and pywlroots. It is expected to be unstable so please let us know if you find any bugs! - The 'focus
argument to
Clickand
Drag` objects in your config are no longer necessary (and are ignored).
Qtile 0.17.0, released 2021-02-13¶
Breaking changes (Python version support)¶
- Python 3.5 and 3.6 are no longer supported
Breaking changes (configuration)¶
- Pacman widget has been removed. Use CheckUpdates instead.
- Mpris widget has been removed. Use Mpris2 instead.
- property "masterWindows" of Tile layout renamed to master_length
-
Match objects now only allow one string argument for their wm name/class/etc. properties. to update your config, do e.g.
Group('www', spawn='firefox', layout='xmonad', - matches=[Match(wm_class=['Firefox', 'google-chrome', 'Google-chrome'])]), + matches=[Match(wm_class='Firefox'), Match(wm_class='google-chrome'), Match(wm_class='Google-chrome')]),
-
properties wname, wmclass and role of Slice-layout replaced by Match- type property "match"
- rules specified in
layout.Floating
'sfloat_rules
are now evaluated with AND-semantics instead of OR-semantics, i.e. if you specify 2 different property rules, both have to match - check the new
float_rules
forfloating_layout
in the default config and extend your own rules appropriately: some non-configurable auto-floating rules were made explicit and added to the default config - using
dict
s forlayout.Floating
'sfloat_rules
is now deprecated, please useconfig.Match
objects instead no_reposition_match
inlayout.Floating
has been removed; use the list ofconfig.Match
-objectsno_reposition_rules
instead-
Command line has been modernized to a single entry point, the
qtile
binary. Translations are below:qtile -> qtile start qtile-cmd -> qtile cmd-obj qtile-run -> qtile run-cmd qtile-top -> qtile top qshell -> qtile shell
iqshell and dqtile-cmd are no longer distributed with the package, as they were either user or developer scripts. Both are still available in the qtile repo in /scripts.
Running qtile
without arguments will continue to work for the
forseeable future, but will be eventually deprecated. qtile prints a
warning when run in this configuration.
- Qtile.cmd_focus_by_click is no longer an available command.
- Qtile.cmd_get_info is no longer an available command.
- libqtile.command_ has been deprecated, it has been moved to
libqtile.command.
- libqtile.widget.base.ThreadedPollText has been removed; out of tree
widgets can use ThreadPoolText in the same package instead.
- the YahooWeather widget was removed since Yahoo retired their free
tier of the weather API
- Deprecated hook window_name_change
got removed, use
client_name_updated
instead.
- show_state attribute from WindowName widget has been removed. Use format attribute instead.
```
show_state = True -> format = '{state}{name}'
show_state = False -> format = '{name}'
```
- mouse_callbacks no longer receives the qtile object as an argument
(they receive no arguments); import it via
from libqtile import qtile
instead.
Features¶
- new WidgetBox widget
- new restart and shutdown hooks
- rules specified in
layout.Floating
'sfloat_rules
are now evaluated with AND-semantics, allowing for more complex and specific rules - Python 3.9 support
- switch to Github Actions for CI
- Columns layout has new
margin_on_single
option to specify margin size when there is only one window (default -1: usemargin
option). - new OpenWeather widget to replace YahooWeather
- new format attribute for WindowName widget
- new max_chars attribute for WindowName widget
- libqtile now exports type information
- add a new
qtile check
subcommand, which will check qtile configs for various things: - validates configs against the newly exported type information if mypy is present in the environment
- validates that qtile can import the config file (e.g. that syntax is correct, ends in a .py extension, etc.)
- validates Key and Mouse mod/keysym arguments are ok.
- Columns layout now enables column swapping by using swap_column_left and swap_column_right
Update notes¶
When (re)starting, Qtile passes its state to the new process in a file now, where previously it passed state directly as a string. This fixes a bug where some character encodings (i.e. in group names) were getting messed up in the conversion to/from said string. This change will cause issues if you update Qtile then restart it, causing the running old version to pass state in the previous format to the new process which recognises the new.
Qtile 0.16.1, released 2020-08-11¶
Breaking changes (configuration)¶
- Hooks 'addgroup', 'delgroup' and 'screen_change' will no longer receive the qtile object as an argument. It can be accessed directly at libqtile.qtile.
Deprecations¶
- defining a main function in your config is deprecated. You should use @hook.subscribe.startup_complete instead. If you need access to the qtile object, import it from libqtile directly.
Bug fixes¶
- include tests in the release for distros to consume
- don't resize 0th screen incorrectly on root ConfigureNotify
- expose qtile object as libqtile.qtile (note that we still consider anything not prefixed with cmd_ to be a private API)
- fix transparent borders
- MonadTall, MonadWide, and TreeTab now work with Slice
Qtile 0.16.0, released 2020-07-20¶
Breaking changes (configuration)¶
- Imports from libqtile.widget are now made through a function proxy to avoid the side effects of importing all widgets at once. If you subclass a widget in your config, import it from its own module. e.g. from libqtile.widget.pomodoro import Pomodoro
Features¶
- added
guess_terminal
in utils - added keybinding cheet sheet image generator
- custom keyboardlayout display
- added native support for key chords
- validate config before restart and refuse to restart with a bad config
- added a bunch of type annotations to config objects (more to come)
Bug fixes¶
- major focus rework; Java-based IDEs such as PyCharm, NetBrains, etc. now focus correctly
- fix a bug where spotify (or any window with focus-to=parent) was closed, nothing would be focused and no hotkeys would work
- support windows unsetting the input hint
- respects window's/user's location setting if present (WM_SIZE_HINTS)
- fixed YahooWeather widget for new API
- fix a bug where _NET_WM_DESKTOPS wasn't correctly updated when switching screens in some cases
- fix a crash in the BSP layout
- fix a stacktrace when unknown keysyms are encounted
- make qtile --version output more sane
- fix a rendering issue with special characters in window names
- keyboard widget no longer re-sets the keyboard settings every second
- fix qtile-top with the new IPC model
- Image widget respects its background setting now
- correctly re-draw non-focused screens on qtile restart
- fix a crash when decoding images
- fix the .when() constraint for lazy objects
Qtile 0.15.1, released 2020-04-14¶
Bug fixes¶
- fix qtile reload (it was crashing)
Qtile 0.15.0, released 2020-04-12¶
Breaking changes (configuration)¶
- removed the mpd widget, which depended on python-mpd.
- the Clock widget now requires pytz to handle timezones that are passed as string
- libqtile.command.Client does not exist anymore and has been replaced by libqtile.command_client.CommandClient
Deprecations¶
- libqtile.command.lazy is deprecated in favor of libqtile.lazy.lazy
Features¶
- Python 3.8 support
wallpaper
andwallpaper_mode
for screens- bars can now have margins
lazy.toscreen
called twice will now toggle the groups (optional with thetoggle
parameter)lazy.window.togroup
now hasswitch_group
parameter to follow the window to the group it is sent to- qtile now copies the default config if the config file does not exist
- all widgets now use Pango markup by default
- add an
fmt
option for all textbox widgets - new PulseVolume widget for controlling PulseAudio
- new QuickExit widget, mainly for the default config
- new non-graph CPU widget
- KeyboardLayout widget: new
options
parameter - CheckUpdates widget: support ArchLinux yay
- GroupBox widget: new
block_highlight_text_color
parameter - Mpd2 widget: new
color_progress
parameter - Maildir widget can now display the inbox grand total
- the Net widget can now use bits as unit
- Spacer widget: new
background_color
parameter - More consistent resize behavior in Columns layout
- various improvements of the default config
- large documentation update and improvements (e.g. widget dependencies)
Bug fixes¶
- qtile binary: don't fail if we can't set the locale
- don't print help if qtile-cmd function returns nothing
- Monad layout: fix margins when flipped
Qtile 0.14.2, released 2019-06-19¶
Bug fixes¶
- previous release still exhibited same issues with package data, really fix it this time
Qtile 0.14.1, released 2019-06-19¶
Bug fixes¶
- properly include png files in the package data to install included icons
Qtile 0.14.0, released 2019-06-19¶
Breaking changes (Python version support)¶
- Python 2 is no longer supported
- Python 3.4 and older is no longer supported
Breaking changes (configuration)¶
- Many internal things were renamed from camel case to snake case. If your config uses main(), or any lazy.function() invocations that interact directly with the qtile object, you may need to forward port them. Also note that we do not consider the qtile object to be a stable api, so you will need to continue forward porting these things for future refactorings (for wayland, etc.). A better approach may be to add an upstream API for what you want to do ;)
- Maildir's subFolder and maildirPath changed to maildir_path and sub_folder.
- the graph widget requires the psutil library to be installed
Features¶
- add custom
change_command
to backlight widget - add CommandSet extension to list available commands
- simplify battery monitoring widget interface and add freebsd compatible battery widget implementation
- track last known mouse coordinates on the qtile manager
- allow configuration of warping behavior in columns layout
Bug fixes¶
- with cursor warp enabled, the cursor is warped on screen change
- fix stepping groups to skip the scratch pad group
- fix stack layout to properly shuffle
- silence errors when unmapping windows
Qtile 0.13.0, released 2018-12-23¶
Deprecations¶
- wmii layout is deprecated in terms of columns layout, which has the same behavior with different defaults, see the wmii definition for more details
Features¶
- add svg handling for images
- allow addgroup command to set the layout
- add command to get current log level
- allow groupbox to hide unused groups
- add caps lock indicator widget
- add custom_command to check_update widget
Bug fixes¶
- better shutdown handling
- fix clientlist current client tracking
- fix typo in up command on ratiotile layout
- various fixes to check_update widget
- fix 0 case for resize screen
Qtile 0.12.0, released 2018-07-20¶
Breaking changes (configuration)¶
- Tile layout commands up/down/shuffle_up/shuffle_down changed to be more consistent with other layouts
- move qcmd to qtile-cmd because of conflict with renameutils, move dqcmd to dqtile-cmd for symmetry
Features¶
- add
add_after_last
option to Tile layout to add windows to the end of the list. - add new formatting options to TaskList
- allow Volume to open app on right click
Bug fixes¶
- fix floating of file transfer windows and java drop-downs
- fix exception when calling
cmd_next
andcmd_previous
on layout without windows - fix caps lock affected behaviour of key bindings
- re-create cache dir if it is deleted while qtile is running
- fix CheckUpdates widget color when no updates
- handle cases where BAT_DIR does not exist
- fix the wallpaper widget when using
wallpaper_command
- fix Tile layout order to not reverse on reset
- fix calling
focus_previous/next
with no windows - fix floating bug is BSP layout
Qtile 0.11.1, released 2018-03-01¶
Bug fixes¶
- fixed pip install of qtile
Qtile 0.11.0, released 2018-02-28¶
Breaking changes¶
- Completely changed extension configuration, see the documentation
extention
subpackage renamed toextension
extentions
configuration variable changed toextension_defaults
Features¶
- qshell improvements
- new MonadWide layout
- new Bsp layout
- new pomodoro widget
- new stock ticker widget
- new
client_name_updated
hook - new RunCommand and J4DmenuDesktop extension
- task list expands to fill space, configurable via
spacing
parameter - add group.focus_by_name() and group.info_by_name()
- add disk usage ratio to df widget
- allow displayed group name to differ from group name
- enable custom TaskList icon size
- add qcmd and dqcmd to extend functionality around qtile.command functionality
- add ScratchPad group that has configurable drop downs
Bug fixes¶
- fix race condition in Window.fullscreen
- fix for string formatting in qtile_top
- fix unicode literal in tasklist
- move mpris2 initialization out of constructor
- fix wlan widget variable naming and division
- normalize behavior of layouts on various commands
- add better fallback to default config
- update btc widget to use coinbase
- fix cursor warp when using default layout implementation
- don't crash when using widget with unmet dependencies
- fix floating window default location
Qtile 0.10.7, released 2017-02-14¶
Features¶
- new MPD widget, widget.MPD2, based on
mpd2
library - add option to ignore duplicates in prompt widget
- add additional margin options to GroupBox widget
- add option to ignore mouse wheel to GroupBox widget
- add
watts
formatting string option to Battery widgets - add volume commands to Volume widget
- add Window.focus command
Bug fixes¶
- place transient windows in the middle of their parents
- fix TreeTab layout
- fix CurrentLayoutIcon in Python 3
- fix xcb handling for xcffib 0.5.0
- fix bug in Screen.resize
- fix Qtile.display_kb command
Qtile 0.10.6, released 2016-05-24¶
Breaking changes¶
- qsh renamed to qshell: This avoids name collision with other packages
Features¶
- Test framework changed to pytest
- Add
startup_complete
hook
Bug fixes¶
- Restore dynamic groups on restart
- Correct placement of transient_for windows
- Major bug fixes with floating window handling
Changes¶
- File path changes (XDG Base Directory specification):
- the default log file path changed from ~/.qtile.log to ~/.local/share/qtile/qtile.log
- the cache directory changed from ~/.cache to ~/.cache/qtile
- the prompt widget's history file changed from ~/.qtile_history to ~/.cache/qtile/prompt_history
Qtile 0.10.5, released 2016-03-06¶
Breaking changes¶
- Python 3.2 support dropped
- GoogleCalendar widget dropped for KhalCalendar widget
- qtile-session script removed in favor of qtile script
Features¶
- new Columns layout, composed of dynamic and configurable columns of windows
- new iPython kernel for qsh, called iqsh, see docs for installing
- new qsh command
display_kb
to show current key binding - add json interface to IPC server
- add commands for resizing MonadTall main panel
- wlan widget shows when you are disconnected and uses a configurable format
Bug fixes¶
- fix path handling in PromptWidget
- fix KeyboardLayout widget cycling keyboard
- properly guard against setting screen to too large screen index
Qtile 0.10.4, released 2016-01-19¶
Breaking changes (configuration)¶
- positional arguments to Slice layout removed, now
side
andwidth
must be passed in as keyword arguments
Features¶
- add alt coin support to BitcoinTracker widget
Bug fixes¶
- don't use six.moves assignment (fix for >=setuptools-19.3)
- improved floating and fullscreen handling
- support empty or non-charging secondary battery in BatteryWidget
- fix GoogleCalendar widget crash
Qtile 0.10.3, released 2015-12-25¶
Features¶
- add wmii layout
- add BSD support to graph widgets
Bug fixes¶
- fix (some) fullscreen problems
- update google calendar widget to latest google api
- improve multiple keyboard layout support
- fix displaying Systray widget on secondary monitor
- fix spawn file descriptor handling in Python 3
- remove duplicate assert code in test_verticaltile.py
- allow padding_{x,y} and margin_{x,y} widget attrs to be set to 0
Qtile 0.10.2, released 2015-10-19¶
Breaking changes (configuration)¶
- layouts.VerticalTile
windows
is nowclients
- layouts.VerticalTile focus_next/focus_previous now take a single argument, similar to other layouts
Features¶
- add qtile-top memory monitoring
- GroupBox can set visible groups
- new GroupBox highlighting, line
- allow window state to be hidden on WindowName widget
- cmd_togroup can move to current group when None sent
- added MOC playback widget
- added memory usage widget
- log truncation, max log size, and number of log backups configurable
- add a command to change to specific layout index (lazy.to_layout_index(index))
Bug fixes¶
- fixed memory leak in dgroups
- margin fixes for MonalTall layout
- improved cursor warp
- remove deprecated imp for Python >= 3.3
- properly close file for NetGraph
- fix MondadTall layout grow/shrink secondary panes for Python 2
- Clock widget uses datetime.now() rather than .fromtimestamp()
- fix Python 3 compatibility of ThermalSensor widget
- various Systray fixes, including implementing XEMBED protocol
- print exception to log during loading config
- fixed xmonad layout margins between main and secondary panes
- clear last window name from group widgets when closed
- add toggleable window border to single xmonad layout
Qtile 0.10.1, released 2015-07-08¶
This release fixes a problem that made the PyPI package uninstallable, qtile will work with a pip install now
Qtile 0.10.0, released 2015-07-07¶
Breaking changes (configuration)¶
- various deprecated commands have been removed: Screen.cmd_nextgroup: use cmd_next_group Screen.cmd_prevgroup: use cmd_prev_group Qtile.cmd_nextlayout: use cmd_next_layout Qtile.cmd_prevlayout: use cmd_prev_layout Qtile.cmd_to_next_screen: use cmd_next_screen Qtile.cmd_to_prev_screen: use cmd_prev_screen
- Clock widget: remove fmt kwarg, use format kwarg
- GmailChecker widget: remove settings parameter
- Maildir widget: remove maildirPath, subFolders, and separator kwargs
Dependencies¶
- cffi>=1.1 is now required, along with xcffib>=0.3 and cairocffi>=0.7 (the cffi 1.0 compatible versions of each)
- Care must be taken that xcffib is installed before cairocffi
Features¶
- add support for themed cursors using xcb-cursor if available
- add CheckUpdate widget, for checking package updates, this deprecates the Pacman widget
- add KeyboardKbdd widget, for changing keyboard layouts
- add Cmus widget, for showing song playing in cmus
- add Wallpaper widget, for showing and cycling wallpaper
- add EzConfig classes allowing shortcuts to define key bindings
- allow GroupBox urgent highlighting through text
- Bar can be placed vertically on sides of screens (widgets must be adapted for vertical viewing)
- add recognizing brightness keys
Bug fixes¶
- deprecation warnings were not printing to logs, this has been fixed
- fix calculation of y property of Gap
- fix focus after closing floating windows and floating windows
- fix various Python 3 related int/float problems
- remember screen focus across restarts
- handle length 1 list passed to Drawer.set_source_rgb without raising divide by zero error
- properly close files opened in Graph widget
- handle _NET_WM_STATE_DEMANDS_ATTENTION as setting urgency
- fix get_wm_transient_for, request WINDOW, not ATOM
Qtile 0.9.1, released 2015-02-13¶
This is primarily a unicode bugfix release for 0.9.0; there were several nits related to the python2/3 unicode conversion that were simply wrong. This release also adds license headers to each file, which is necessary for distro maintainers to package Qtile.
Bug fixes¶
- fix python2's importing of gobject
- fix unicode handling in several places
Qtile 0.9.0, released 2015-01-20¶
Dependencies¶
New dependencies will need to be installed for Qtile to work
- drop xpyb for xcffib (XCB bindings)
- drop py2cairo for cairocffi (Cairo bindings)
- drop PyGTK for asyncio (event loop, pangocairo bindings managed internally)
- Qtile still depends on gobject if you want to use anything that uses dbus (e.g. the mpris widgets or the libnotify widget)
Features¶
- add Python 3 and pypy support (made possible by dependency changes)
- new layout for vertical monitors
- add startup_once hook, which is called exactly once per session (i.e. it is not called when qtile is restarted via lazy.restart()). This eliminates the need for the execute_once() function found in lots of user configs.
- add a command for showing/hiding the bar (lazy.hide_show_bar())
- warn when a widget's dependencies cannot be imported
- make qtile.log more useful via better warnings in general, including deprecation and various other warnings that were previously nonexistent
- new text-polling widget super classes, which enable easy implementation of various widgets that need to poll things outside the event loop.
- add man pages
- large documentation update, widget/layout documentation is now autogenerated from the docstrings
- new ImapWidget for checking imap mailboxes
Bug fixes¶
- change default wmname to "LG3D" (this prevents some java apps from not working out of the box)
- all code passes flake8
- default log level is now WARNING
- all widgets now use our config framework
- windows with the "About" role float by default
- got rid of a bunch of unnecessary bare except: clauses
Qtile 0.8.0, released 2014-08-18¶
Breaking changes (configuration)¶
- libqtile.layout.Stack's
stacks
parameter is nownum_stacks
Features¶
- massive widget/layout documentation update
- new widget debuginfo for use in Qtile development
- stack has new autosplit, fair options
- matrix, ratiotile, stack, xmonad, zoomy get 'margin' option
- new launchbar widget
- support for matching WM_CLASS and pid in Match
- add support for adding dgroups rules dynamically and via ipc
- Clock supports non-system timezones
- new mpris2 widget
- volume widget can use emoji instead of numbers
- add an 'eval' function to qsh at every object level
- bar gradients support more colors
- new Clipboard widget (very handy!)
Bug fixes¶
- bitcoin ticker widget switched from MtGox (dead) to btc-e
- all widgets now use Qtile's defaults system, so their defaults are settable globally, etc.
- fix behavior when screens are cloned
- all widgets use a unified polling framework
- "dialog" WM_TYPEs float by default
- respect xrandr --primary
- use a consistent font size in the default config
- default config supports mouse movements and floating
- fix a bug where the bar was not redrawn correctly in some multiscreen environments
- add travis-ci support and make tests vastly more robust
Qtile 0.7.0, released 2014-03-30¶
Breaking changes (configuration)¶
- Tile's shuffleMatch is renamed to resetMaster
Features¶
- new disk free percentage widget
- new widget to display static image
- per core CPU graphs
- add "screen affinity" in dynamic groups
- volume widget changes volume linear-ly instead of log-ly
- only draw bar when idle, vastly reducing the number of bar draws and speeding things up
- new Gmail widget
- Tile now supports automatically managing master windows via the
master_match
parameter. - include support for minimum height, width, size increment hints
Bug fixes¶
- don't crash on any exception in main loop
- don't crash on exceptions in hooks
- fix a ZeroDivisionError in CPU graph
- remove a lot of duplicate and unused code
- Steam windows are placed more correctly
- Fixed several crashes in qsh
- performance improvements for some layouts
- keyboard layout widget behaves better with multiple keyboard configurations
Qtile 0.6, released 2013-05-11¶
Breaking changes (configuration)¶
This release breaks your config file in several ways:
- The Textbox widget no longer takes a
name'' positional parameter, since it was redundant; you can use the
name'' kwarg to define it. - manager.Group (now _Group) is not used to configure groups any more; config.Group replaces it. For simple configurations (i.e. Group("a") type configs), this should be a drop in replacement. config.Group also provides many more options for showing and hiding groups, assigning windows to groups by default, etc.
- The Key, Screen, Drag, and Click objects have moved from the manager module to the config module.
- The Match object has moved from the dgroups module to the config module.
-
The addgroup hook now takes two parameters: the qtile object and the name of the group added:
@hook.subscribe def addgroup_hook(qtile, name): pass
-
The nextgroup and prevgroup commands are now on Screen instead of Group. For most people, you should be able to just:
sed -i -e 's/libqtile.manager/libqtile.config' config.py
... dgroups users will need to go to a bit more work, but hopefully configuration will be much simpler now for new users.
Features¶
- New widgets: task list,
- New layout: Matrix
- Added ability to drag and drop groups on GroupBox
- added "next urgent window" command
- added font shadowing on widgets
- maildir widget supports multiple folders
- new config option log_level to set logging level (any of logging.{DEBUG, INFO, WARNING, ERROR, CRITICAL})
- add option to battery widget to hide while level is above a certain amount
- vastly simplify configuration of dynamic groups
- MPD widget now supports lots of metadata options
Bug fixes¶
- don't crash on restart when the config has errors
- save layout and selected group state on restart
- varous EWMH properties implemented correctly
- fix non-black systray icon backgrounds
- drastically reduce the number of timeout_add calls in most widgets
- restart on RandR attach events to allow for new screens
- log level defaults to ERROR
- default config options are no longer initialized when users define their corresponding option (preventing duplicate widgets, etc.)
- don't try to load config in qsh (not used)
- fix font alignment across Textbox based widgets
Qtile 0.5, released 2012-11-11¶
(Note, this is not complete! Many, many changes have gone in to 0.5, by a large number of contributors. Thanks to everyone who reported a bug or fixed one!)
Features¶
- Test framework is now nose
- Documentation is now in sphinx
- Several install guides for various OSes
- New widgets: battery based icon, MPRIS1, canto, current layout, yahoo weather, sensors, screen brightness, notifiy, pacman, windowtabs, she, crashme, wifi.
- Several improvements to old widgets (e.g. battery widget displays low battery in red, GroupBox now has a better indication of which screen has focus in multi-screen setups, improvements to Prompt, etc.)
- Desktop notification service.
- More sane way to handle configuration files
- Promote dgroups to a first class entity in libqtile
-
Allow layouts to be named on an instance level, so you can:
layouts = [ # a layout just for gimp layout.Slice('left', 192, name='gimp', role='gimp-toolbox', fallback=layout.Slice('right', 256, role='gimp-dock', fallback=layout.Stack(stacks=1, **border_args))) ] ... dynamic_groups = { 'gimp': {'layout': 'gimp'} } Dgroups(..., dynamic_groups, ...)
-
New Layout: Zoomy
- Add a session manager to re-exec qtile if things go south
- Support for WM_TAKE_FOCUS protocol
- Basic .desktop file for support in login managers
- Qsh reconnects after qtile is restarted from within it
- Textbox supports pango markup
- Examples moved to qtile-examples repository.
Bug fixes¶
- Fix several classes of X races in a more sane way
- Minor typo fixes to most widgets
- Fix several crashes when drawing systray icons too early
- Create directories for qtile socket as necessary
- PEP8 formatting updates (though we're not totally there yet)
- All unit tests pass
- Lots of bugfixes to MonadTall
- Create IPC socket directory if necessary
- Better error if two widgets have STRETCH length
- Autofloat window classes can now be overridden
- xkeysyms updated