dotfiles/herbstluftwm/usr/bin/hlwm-run-or-raise
Tom Willemse 88b6ba1760 Update scsh file headers for shell scripts
Other file headers come with caveats:

- ‘#!/usr/bin/scsh -s’ :: Now that scsh is installed through Guix, this is not
  where this file lives.

- ‘#!/usr/bin/env -S scsh -s’ :: This doesn't work when we need to specify move
  arguments on the command line and need to use the meta-argument.
  ‘env -S scsh \’ doesn't work.
2022-03-03 01:17:04 -08:00

46 lines
1.4 KiB
Scheme
Executable file

#!/usr/bin/env sh
# # -*- mode: scheme; -*-
IFS=" "
exec scsh -s "$0" "$@"
!#
;; hlwm-run-or-raise --- 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)))
(and match (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 (hlwm-switch-to-window ,next-window)))
(exec-epf (,@(cdr command-line-arguments))))