diff options
| author | 2016-07-25 22:33:33 +0200 | |
|---|---|---|
| committer | 2016-07-25 22:33:33 +0200 | |
| commit | 1a983b2bc32b53f6cd5a9037db6f82e83073bb10 (patch) | |
| tree | 5ba05ba6a9e915b0376aed7ae6f1a00bb966a824 | |
| download | hlwm-run-or-raise-1a983b2bc32b53f6cd5a9037db6f82e83073bb10.tar.gz hlwm-run-or-raise-1a983b2bc32b53f6cd5a9037db6f82e83073bb10.zip | |
Add run-or-raise function for herbstluftwm
| -rwxr-xr-x | hlwm-run-or-raise | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/hlwm-run-or-raise b/hlwm-run-or-raise new file mode 100755 index 0000000..a06da24 --- /dev/null +++ b/hlwm-run-or-raise @@ -0,0 +1,43 @@ +#!/usr/local/bin/scsh -s +!# +;; hrunorraise --- Raise a window or start a new process +;; +;; Tries to find a window ID for a window with a given class value. If +;; no such window can be found treat the rest of the command line as +;; the command to start. +;; +;; This script depends on both herbstluftwm and wmctrl. + +(define (get-current-window-id) + (let* ((output (run/string (wmctrl -v -a ":ACTIVE:") (= 2 1))) + (re (rx "Using window: " + (submatch "0x" (+ hex-digit)) + "\n")) + (match (regexp-search re output))) + (match:substring match 1))) + +(define (pull-element-to-front elt collection) + (if (string= (car collection) elt) + collection + (pull-element-to-front elt (rotate collection)))) + +(define (rotate lst) + (append (cdr lst) (list (car lst)))) + +(define current-window-id + (get-current-window-id)) + +(define window-ids + (run/strings + (pipe (wmctrl -lx) + (awk "{ print $1, $3 }") + (grep ,(string-append "\\." (car command-line-arguments))) + (awk "{ print $1 }")))) + +(if (not (null? window-ids)) + (let ((next-window + (if (member current-window-id window-ids) + (cadr (pull-element-to-front current-window-id window-ids)) + (car window-ids)))) + (run (herbstclient jumpto ,next-window))) + (exec-epf (,@(cdr command-line-arguments)))) |
