tile

A full-featured, hackable tiling window manager written and configured in Python

screenshot

  1. from libqtile import bar, hook, layout, widget
  2. from libqtile.command import lazy
  3. from libqtile.config import Click, Drag, Group, Key, Screen
  4. wmname = 'qtile'
  5. mod = 'mod4'
  6. # Key bindings
  7. keys = [
  8. # Window manager controls
  9. Key([mod, 'control'], 'r', lazy.restart()),
  10. Key([mod, 'control'], 'q', lazy.shutdown()),
  11. Key([mod], 'r', lazy.spawncmd()),
  12. Key([mod], 'Return', lazy.spawn('xterm')),
  13. Key([mod], 'w', lazy.window.kill()),
  14. Key([mod], 'Tab', lazy.layout.next()),
  15. Key([mod], 'Left', lazy.screen.prevgroup()),
  16. Key([mod], 'Right', lazy.screen.nextgroup()),
  17. # Layout modification
  18. Key([mod, 'control'], 'space', lazy.window.toggle_floating()),
  19. # Switch between windows in current stack pane
  20. Key([mod], 'k', lazy.layout.down()),
  21. Key([mod], 'j', lazy.layout.up()),
  22. # Move windows up or down in current stack
  23. Key([mod, 'control'], 'k', lazy.layout.shuffle_down()),
  24. Key([mod, 'control'], 'j', lazy.layout.shuffle_up()),
  25. # Switch window focus to other pane(s) of stack
  26. Key([mod], 'space', lazy.layout.next()),
  27. # Toggle between different layouts as defined below
  28. Key([mod], 'Tab', lazy.nextlayout()),
  29. ]
  30. # Mouse bindings and options
  31. mouse = (
  32. Drag([mod], 'Button1', lazy.window.set_position_floating(),
  33. start=lazy.window.get_position()),
  34. Drag([mod], 'Button3', lazy.window.set_size_floating(),
  35. start=lazy.window.get_size()),
  36. )
  37. bring_front_click = True
  38. cursor_warp = False
  39. follow_mouse_focus = True
  40. # Groups
  41. groups = [
  42. Group('a'),
  43. Group('s'),
  44. Group('d'),
  45. Group('f'),
  46. Group('u'),
  47. Group('i'),
  48. Group('o'),
  49. Group('p'),
  50. ]
  51. for i in groups:
  52. # mod + letter of group = switch to group
  53. keys.append(Key([mod], i.name, lazy.group[i.name].toscreen()))
  54. # mod + shift + letter of group = switch to & move focused window to group
  55. keys.append(Key([mod, 'shift'], i.name, lazy.window.togroup(i.name)))
  56. dgroups_key_binder = None
  57. dgroups_app_rules = []
  58. # Layouts
  59. layouts = [
  60. layout.Max(),
  61. layout.Stack(num_stacks=2),
  62. layout.Tile(),
  63. layout.RatioTile(),
  64. layout.Matrix(),
  65. ]
  66. floating_layout = layout.Floating()
  67. # Screens and widget options
  68. screens = [
  69. Screen(
  70. bottom=bar.Bar(
  71. widgets=[
  72. widget.GroupBox(
  73. highlight_method='block',
  74. inactive='999999'
  75. ),
  76. widget.Prompt(),
  77. widget.WindowName(),
  78. widget.Systray(),
  79. widget.Clock(format='%a %d %b %I:%M %p'),
  80. ],
  81. size=30,
  82. background=['222222', '111111'],
  83. ),
  84. ),
  85. ]
  86. widget_defaults = dict(
  87. font='Arial',
  88. fontsize=15,
  89. )
  90. auto_fullscreen = True
  91. def main(qtile):
  92. ''' This function is called when Qtile starts. '''
  93. pass

View more configuration examples on Github

Benefits of using a tiling window manager

Optimize your workflow by configuring your environment to fit how you work.

Efficiently use screen real-estate by automatically arranging windows with minimal visual cruft.

Save your wrists from RSI by ditching the mouse and driving with the keyboard.

Why Qtile?

Qtile is simple, small, and extensible. It's easy to write your own layouts, widgets, and built-in commands.

Qtile is written and configured entirely in Python, which means you can leverage the full power and flexibility of the language to make it fit your needs.

The Qtile community is active and growing, so there's always someone to lend a hand when you need help.

Qtile is free and open-source software, distributed under the permissive MIT license.

The Qtile Community

Getting Involved