aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.config/qtile/config.py290
1 files changed, 290 insertions, 0 deletions
diff --git a/.config/qtile/config.py b/.config/qtile/config.py
new file mode 100644
index 0000000..5fa8e5f
--- /dev/null
+++ b/.config/qtile/config.py
@@ -0,0 +1,290 @@
+from libqtile.config import Key, Screen, Group, Drag, Click, Match
+from libqtile.command import lazy
+from libqtile import layout, bar, widget, hook
+from os.path import expanduser
+import re
+import subprocess
+
+mod = "mod4"
+alt = "mod1"
+
+home = expanduser("~")
+terminal = "termite"
+drun_launcher = "rofi -show drun"
+run_launcher = "rofi -show run"
+lock = home+"/bin/i3lock"
+brightness_up = "xbacklight -inc 10"
+brightness_down = "xbacklight -dec 10"
+
+volume_up = home+"/bin/set_volume increase"
+volume_down = home+"/bin/set_volume decrease"
+volume_toggle = home+"/bin/set_volume toggle"
+audio_prev = home+"/bin/notify_mpd prev"
+audio_next = home+"/bin/notify_mpd next"
+audio_toggle = home+"/bin/notify_mpd toggle"
+audio_stop = home+"/bin/notify_mpd stop"
+
+subprocess.call(['feh',
+ '--bg-fill',
+ home+'/ownCloud/photos/desktop/underwater_greenery.JPG'])
+
+colors = {
+ "grey": "#555555",
+ "red": "#DD1144",
+ "blue": "#445588",
+ "lgrey": "#b8b6b1",
+ "green": "#008080",
+}
+
+# kick a window to another screen (handy during presentations)
+def move_to_other_screen(qtile, direction=1):
+ other_scr_index = (qtile.screens.index(qtile.currentScreen) + direction) % len(qtile.screens)
+ othergroup = None
+ for group in qtile.cmd_groups().values():
+ if group['screen'] == other_scr_index:
+ othergroup = group['name']
+ break
+ if othergroup:
+ qtile.moveToGroup(othergroup)
+
+keys = [
+ # base commands
+ # restart qtile
+ Key([mod, "control"], "r", lazy.restart()),
+ # close qtile
+ Key([mod, "control"], "q", lazy.shutdown()),
+ # start run launcher
+ Key([mod], "r", lazy.spawn(run_launcher)),
+ # start drun launcher
+ Key([mod], "p", lazy.spawn(drun_launcher)),
+ # lock screen
+ Key([mod, "control"], "s", lazy.spawn(lock)),
+ # launch terminal
+ Key([mod], "Return", lazy.spawn(terminal)),
+
+ # brightness settings
+ Key([], "XF86MonBrightnessUp", lazy.spawn(brightness_up)),
+ Key([], "XF86MonBrightnessDown", lazy.spawn(brightness_down)),
+
+ # multimedia
+ Key([], "XF86AudioRaiseVolume", lazy.spawn(volume_up)),
+ Key([], "XF86AudioLowerVolume", lazy.spawn(volume_down)),
+ Key([], "XF86AudioMute", lazy.spawn(volume_toggle)),
+ Key([], "XF86AudioPrev", lazy.spawn(audio_prev)),
+ Key([], "XF86AudioNext", lazy.spawn(audio_next)),
+ Key([], "XF86AudioPlay", lazy.spawn(audio_toggle)),
+ Key([], "XF86AudioStop", lazy.spawn(audio_stop)),
+
+ # cycle to previous and next group
+ Key(["control", alt], "Left", lazy.screen.prev_group(skip_managed=True)),
+ Key(["control", alt], "Right", lazy.screen.next_group(skip_managed=True)),
+ Key(["control", mod, alt], "Left", lazy.screen.prev_group()),
+ Key(["control", mod, alt], "Right", lazy.screen.next_group()),
+
+ # Switch between windows in current stack pane
+ Key([mod], "comma", lazy.layout.up()),
+ Key([mod], "period", lazy.layout.down()),
+ Key([mod], "Tab", lazy.layout.previous()),
+ Key([mod, "shift"], "Tab", lazy.layout.next()),
+
+ # toggle between different layouts
+ Key([mod], "space", lazy.next_layout()),
+ # close window
+ Key([mod], "q", lazy.window.kill()),
+ # toggle fullscreen
+ Key([mod, "control"], "f", lazy.window.toggle_fullscreen()),
+ # toggle maximized
+ Key([mod], "m", lazy.window.toggle_maximize()),
+ # toggle floating
+ Key([mod], "f", lazy.window.toggle_floating()),
+ Key([mod, alt], "space", lazy.layout.rotate()), # flip sides
+
+ # Multihead magic
+ Key([mod, "control"], "comma", lazy.prev_screen()),
+ Key([mod, "control"], "period", lazy.next_screen()),
+ Key([mod], "o", lazy.function(move_to_other_screen)),
+
+ # columns layout
+ # move selection around in current group
+ Key([mod], "j", lazy.layout.down()),
+ Key([mod], "k", lazy.layout.up()),
+ Key([mod], "h", lazy.layout.left()),
+ Key([mod], "l", lazy.layout.right()),
+ # move current window around in the current layout
+ Key([mod, "shift"], "j", lazy.layout.shuffle_down()),
+ Key([mod, "shift"], "k", lazy.layout.shuffle_up()),
+ Key([mod, "shift"], "h", lazy.layout.shuffle_left()),
+ Key([mod, "shift"], "l", lazy.layout.shuffle_right()),
+ # grow current window into some direction
+ Key([mod, "control"], "j", lazy.layout.grow_down()),
+ Key([mod, "control"], "k", lazy.layout.grow_up()),
+ Key([mod, "control"], "h", lazy.layout.grow_left()),
+ Key([mod, "control"], "l", lazy.layout.grow_right()),
+ # toggle current window to be splitting current group in half
+ Key([mod], "s", lazy.layout.toggle_split()),
+ Key([mod], "n", lazy.layout.normalize()),
+]
+
+matchers = {
+ 'web': [
+ Match(wm_class=[
+ "Firefox",
+ "chromium",
+ ]),
+ ],
+ 'dev': [
+ Match(wm_class=[
+ "Pycharm",
+ "Rubymine",
+ ])
+ ],
+ 'games': [
+ Match(wm_class=[
+ re.compile('Minecraft'),
+ re.compile('Minetest'),
+ "pyrogenesis",
+ "spring",
+ "angband",
+ "scummvm",
+ "widelands",
+ ]),
+ Match(title=[
+ re.compile('ScummVM'),
+ re.compile('Widelands'),
+ re.compile('Minecraft'),
+ re.compile('Minetest'),
+ "OpenRA",
+ "0 A.D.",
+ "Angband",
+ "Alien Arena",
+ ]),
+ ],
+ 'audio': [
+ Match(wm_class=[
+ "Ardour",
+ ])
+ ],
+}
+
+workspaces = [
+ {"key": "1", "name": "shell"},
+ {"key": "2", "name": "web", "matches": matchers["web"]},
+ {"key": "3", "name": "dev", "matches": matchers["dev"]},
+ {"key": "4", "name": "games", "matches": matchers["games"]},
+ {"key": "5", "name": "audio", "matches": matchers["audio"]},
+ {"key": "6", "name": "6"},
+ {"key": "7", "name": "7"},
+ {"key": "8", "name": "8"},
+ {"key": "9", "name": "9"},
+ {"key": "0", "name": "0"},
+]
+
+groups = []
+for workspace in workspaces:
+ matches = workspace["matches"] if "matches" in workspace else None
+ groups.append(Group(workspace["name"], matches=matches))
+ keys.append(
+ Key([mod], workspace["key"], lazy.group[workspace["name"]].toscreen())
+ )
+ keys.append(Key(
+ [mod, alt], workspace["key"],
+ lazy.window.togroup(workspace["name"]),
+ ))
+
+layouts = [
+ layout.Columns(),
+ layout.VerticalTile(),
+ layout.Matrix(),
+ layout.Max(),
+ layout.TreeTab(),
+ layout.Zoomy(),
+]
+
+widget_defaults = dict(
+ font='Monospace',
+ fontsize=11,
+ padding=3,
+)
+
+screens = [
+ Screen(
+ top=bar.Bar([
+ widget.CurrentScreen(),
+ widget.Sep(),
+ widget.GroupBox(
+ highlight_method="block",
+ this_current_screen_border=colors["blue"]
+ ),
+ widget.Sep(),
+ widget.Notify(
+ foreground_low=colors["red"][1:],
+ foreground_urgent=colors["red"][1:]
+ ),
+ widget.Spacer(),
+ widget.CurrentLayout(),
+ widget.Sep(),
+ widget.HDDGraph(),
+ widget.MemoryGraph(),
+ widget.CPUGraph(),
+ widget.Battery(),
+ widget.Sep(),
+ widget.Systray(),
+ widget.Sep(),
+ widget.Clock(
+ timezone="Europe/Berlin",
+ format="%Y%m%d %a %H:%M:%S"
+ ),
+ ],
+ 20
+ ),
+ ),
+ Screen(
+ top=bar.Bar([
+ widget.CurrentScreen(),
+ widget.Sep(),
+ widget.GroupBox(
+ highlight_method="block",
+ this_current_screen_border=colors["blue"]
+ ),
+ widget.Sep(),
+ widget.Notify(
+ foreground_low=colors["red"][1:],
+ foreground_urgent=colors["red"][1:]
+ ),
+ widget.Spacer(),
+ widget.CurrentLayout(),
+ widget.Sep(),
+ widget.Clock(
+ timezone="Europe/Berlin",
+ format="%Y%m%d %a %H:%M:%S"
+ ),
+ ],
+ 20
+ ),
+ ),
+]
+
+# Drag floating layouts.
+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())
+]
+
+dgroups_key_binder = None
+dgroups_app_rules = []
+follow_mouse_focus = True
+bring_front_click = False
+cursor_warp = False
+floating_layout = layout.Floating()
+auto_fullscreen = True
+wmname = "LG3D"
+
+
+def main(qtile):
+ qtile.cmd_warning()
+
+
+@hook.subscribe.screen_change
+def restart_on_randr(qtile, ev):
+ qtile.cmd_restart()