An (outdated) collection of plugins for Qtile.
git clone https://github.com/m-col/qtools
Files | Refs | Readme

Commit 378c91408fe31379d5e46f077a6dbd8394256063
Parent: 99a6caf3a0af41c704111c6618e475c4a9629f71
Author: mcol <mcol@posteo.net>
Date: 2020-06-03 15:09:29 +0100
Committer: mcol <mcol@posteo.net>
Committed: 2020-06-03 15:09:29 +0100

add geometry focus functions

qtools/focus/focus.py Added

@@ -0,0 +1,71 @@
+"""
+This plugin exposes four functions - up, down, left and right - that when called will
+move window focus to the first window in that general direction. Focussing is based
+entirely on position and geometry, so is independent of screens, layouts and whether
+windows are floating or tiled.
+
+Example usage: binding a key to lazy.function(qtools.focus.right)
+"""
+
+
+def up(qtile):
+    _focus_window(qtile, -1, 'y')
+
+
+def down(qtile):
+    _focus_window(qtile, 1, 'y')
+
+
+def left(qtile):
+    _focus_window(qtile, -1, 'x')
+
+
+def right(qtile):
+    _focus_window(qtile, 1, 'x')
+
+
+def _focus_window(qtile, dir, axis):
+    win = None
+    win_wide = None
+    dist = 10000
+    dist_wide = 10000
+
+    if axis == 'x':
+        dim = 'width'
+        band_axis = 'y'
+        band_dim = 'height'
+        cur_pos, band_min, _, band_max = qtile.current_window.edges
+    else:
+        dim = 'height'
+        band_axis = 'x'
+        band_dim = 'width'
+        band_min, cur_pos, band_max, _ = qtile.current_window.edges
+
+    cur_pos += getattr(qtile.current_window, dim) / 2
+
+    windows = [w for g in qtile.groups if g.screen for w in g.windows]
+
+    if qtile.current_window in windows:
+        windows.remove(qtile.current_window)
+
+    for w in windows:
+        if not w.minimized:
+            pos = getattr(w, axis) + getattr(w, dim) / 2
+            gap = dir * (pos - cur_pos)
+            if gap > 0:
+                band_pos = getattr(w, band_axis) + getattr(w, band_dim) / 2
+                if band_min < band_pos < band_max:
+                    if gap < dist:
+                        dist = gap
+                        win = w
+                else:
+                    if gap < dist_wide:
+                        dist_wide = gap
+                        win_wide = w
+
+    if not win:
+        win = win_wide
+    if win:
+        qtile.focus_screen(win.group.screen.index)
+        win.group.focus(win, True)
+        win.focus(False)

qtools/focus/__init__.py Added

@@ -0,0 +1,2 @@
+from .focus import up, down, left, right
+__all__ = ('up', 'down', 'left', 'right')