From f97c9d117c873809600e5f3cf0f4df950ca1613c Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Mon, 25 Jul 2016 22:33:33 +0200 Subject: [PATCH] Add run-or-raise function for herbstluftwm --- herbstluftwm/.config/herbstluftwm/autostart | 8 ++-- herbstluftwm/usr/bin/hlwm-run-or-raise | 43 +++++++++++++++++++++ 2 files changed, 47 insertions(+), 4 deletions(-) create mode 100755 herbstluftwm/usr/bin/hlwm-run-or-raise diff --git a/herbstluftwm/.config/herbstluftwm/autostart b/herbstluftwm/.config/herbstluftwm/autostart index f84b9a3..5491d6d 100755 --- a/herbstluftwm/.config/herbstluftwm/autostart +++ b/herbstluftwm/.config/herbstluftwm/autostart @@ -65,9 +65,10 @@ hc keybind $Mod-Shift-k remove # These are my most-used programs, having specific keybindings for # them is a big productivity boost. -hc keybind $Mod-Return spawn ${TERMINAL:-urxvt} -hc keybind $Mod-t spawn ${EDITOR:-emacs} -hc keybind $Mod-b spawn ${BROWSER:-conkeror} +hc keybind $Mod-Return spawn urxvt +hc keybind $Mod-c spawn hlwm-run-or-raise URxvt urxvt +hc keybind $Mod-t spawn hlwm-run-or-raise Emacs emacs +hc keybind $Mod-b spawn hlwm-run-or-raise Conkeror conkeror # Since I use the colemak keyboard layout, hjkl doesn't make much # sense. I use neio instead since that is almost in the same place @@ -126,7 +127,6 @@ hc mousebind $Mod-Button3 resize hc keybind $Mod-BackSpace cycle_monitor hc keybind $Mod-Tab cycle_all +1 hc keybind $Mod-Shift-Tab cycle_all -1 -hc keybind $Mod-c cycle # Use u because i is already used by by navigation commands. hc keybind $Mod-u jumpto urgent diff --git a/herbstluftwm/usr/bin/hlwm-run-or-raise b/herbstluftwm/usr/bin/hlwm-run-or-raise new file mode 100755 index 0000000..a06da24 --- /dev/null +++ b/herbstluftwm/usr/bin/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))))