From 83b1b8df2237364774c784d90eb3b8eb6fb89bdc Mon Sep 17 00:00:00 2001 From: Anon1234 Date: Sat, 24 Oct 2015 01:15:21 +0300 Subject: [PATCH 1/4] Add focus_next_visible.py example --- examples/focus_next_visible.py | 59 ++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 examples/focus_next_visible.py diff --git a/examples/focus_next_visible.py b/examples/focus_next_visible.py new file mode 100644 index 0000000..06ab9a1 --- /dev/null +++ b/examples/focus_next_visible.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 + +""" +focus_next_visible.py - cycles input focus between visible windows on workspace + + - requires https://github.com/acrisci/i3ipc-python + + Usage: + + # focus next visible window + bindsym $mod+n exec --no-startup-id focus_next_visible.py + + # focus previous visible window + bindsym $mod+Shift+n exec --no-startup-id focus_next_visible.py reverse + + +https://faq.i3wm.org/question/6937/move-focus-from-tabbed-container-to-win... + +""" + +from sys import argv +from itertools import cycle +from subprocess import check_output + +import i3ipc + + +def get_windows_on_ws(conn): + return filter(lambda x: x.window, + conn.get_tree().find_focused().workspace().descendents()) + + +def find_visible_windows(windows_on_workspace): + visible_windows = [] + for w in windows_on_workspace: + xprop = check_output(['xprop', '-id', str(w.window)]).decode() + + if '_NET_WM_STATE_HIDDEN' not in xprop: + visible_windows.append(w) + + return visible_windows + + +if __name__ == '__main__': + + conn = i3ipc.Connection() + + visible_windows = find_visible_windows(get_windows_on_ws(conn)) + + if len(argv) > 1 and argv[1] == "reverse": + cycle_windows = cycle(reversed(visible_windows)) + else: + cycle_windows = cycle(visible_windows) + + for window in cycle_windows: + if window.focused: + focus_to = next(cycle_windows) + conn.command('[id="%d"] focus' % focus_to.window) + break From 66d92d3ed22c69986b1698a344c338c4e5d3e80e Mon Sep 17 00:00:00 2001 From: Anon1234 Date: Sun, 25 Oct 2015 22:42:09 +0200 Subject: [PATCH 2/4] Use dashes instead of underscores in focus_next_visible.py --- examples/{focus_next_visible.py => focus-next-visible.py} | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) rename examples/{focus_next_visible.py => focus-next-visible.py} (83%) diff --git a/examples/focus_next_visible.py b/examples/focus-next-visible.py similarity index 83% rename from examples/focus_next_visible.py rename to examples/focus-next-visible.py index 06ab9a1..6ae9a26 100644 --- a/examples/focus_next_visible.py +++ b/examples/focus-next-visible.py @@ -1,17 +1,15 @@ #!/usr/bin/env python3 """ -focus_next_visible.py - cycles input focus between visible windows on workspace - - - requires https://github.com/acrisci/i3ipc-python +focus-next-visible.py - cycles input focus between visible windows on workspace Usage: # focus next visible window - bindsym $mod+n exec --no-startup-id focus_next_visible.py + bindsym $mod+n exec --no-startup-id focus-next-visible.py # focus previous visible window - bindsym $mod+Shift+n exec --no-startup-id focus_next_visible.py reverse + bindsym $mod+Shift+n exec --no-startup-id focus-next-visible.py reverse https://faq.i3wm.org/question/6937/move-focus-from-tabbed-container-to-win... From 338d5a4dd1d6ca857844175d1444f989c221e72f Mon Sep 17 00:00:00 2001 From: Anon1234 Date: Mon, 26 Oct 2015 09:26:23 +0200 Subject: [PATCH 3/4] Fail nicely if xprop is not installed --- examples/focus-next-visible.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/focus-next-visible.py b/examples/focus-next-visible.py index 6ae9a26..89407a5 100644 --- a/examples/focus-next-visible.py +++ b/examples/focus-next-visible.py @@ -31,7 +31,12 @@ def get_windows_on_ws(conn): def find_visible_windows(windows_on_workspace): visible_windows = [] for w in windows_on_workspace: - xprop = check_output(['xprop', '-id', str(w.window)]).decode() + + try: + xprop = check_output(['xprop', '-id', str(w.window)]).decode() + except FileNotFoundError: + raise SystemExit("The `xprop` utility is not found!" + " Please install it and retry.") if '_NET_WM_STATE_HIDDEN' not in xprop: visible_windows.append(w) From d8440098cd2d3841a80b70a8f550f9ecf57eea07 Mon Sep 17 00:00:00 2001 From: Anon1234 Date: Mon, 26 Oct 2015 09:33:38 +0200 Subject: [PATCH 4/4] Add a requirement section --- examples/focus-next-visible.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/focus-next-visible.py b/examples/focus-next-visible.py index 89407a5..0450db1 100644 --- a/examples/focus-next-visible.py +++ b/examples/focus-next-visible.py @@ -3,6 +3,8 @@ """ focus-next-visible.py - cycles input focus between visible windows on workspace +- requires the `xprop` utility + Usage: # focus next visible window