Matching windows

Qtile's config provides a number of situations where the behaviour depends on whether the relevant window matches some specified criteria.

These situations include:

  • Defining which windows should be floated by default

  • Assigning windows to specific groups

  • Assigning window to a master section of a layout

In each instance, the criteria are defined via a Match object. The properties of the object will be compared to a Window to determine if its properties match. It can match by title, wm_class, role, wm_type, wm_instance_class, net_wm_pid, or wid. Additionally, a function may be passed, which takes in the Window to be compared against and returns a boolean.

A basic rule would therefore look something like:

Match(wm_class="mpv")

This would match against any window whose class was mpv.

Where a string is provided as an argument then the value must match exactly. More flexibility can be achieved by using regular expressions. For example:

import re

Match(wm_class=re.compile(r"mpv"))

This would still match a window whose class was mpv but it would also match any class starting with mpv e.g. mpvideo.

Note

When providing a regular expression, qtile applies the .match method. This matches from the start of the string so, if you want to match any substring, you will need to adapt the regular expression accordingly e.g.

import re

Match(wm_class=re.compile(r".*mpv"))

This would match any string containing mpv

Creating advanced rules

While the func parameter allows users to create more complex matches, this requires a knowledge of qtile's internal objects. An alternative is to combine Match objects using logical operators & (and), | (or), ~ (not) and ^ (xor).

For example, to create rule that matches all windows with a fixed aspect ratio except for mpv windows, you would provide the following:

Match(func=lambda c: c.has_fixed_ratio()) & ~Match(wm_class="mpv")

It is also possible to use wrappers for Match objects if you do not want to use the operators. The following wrappers are available:

  • MatchAll(Match(...), ...) equivalent to "and" test. All matches must match.

  • MatchAny(Match(...), ...) equivalent to "or" test. At least one match must match.

  • MatchOnlyOne(Match(...), Match(...)) equivalent to "xor". Only one match must match.

  • InvertMatch(Match(...)) equivalent to "not". Inverts the result of the match.

So, to recreate the above rule using the wrappers, you would write the following:

from libqtile.config import InvertMatch, Match, MatchAll

MatchAll(Match(func=lambda c: c.has_fixed_ratio()), InvertMatch(Match(wm_class="mpv")))