From b491df4af614d04b08eaae383e187d651dddf798 Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Sun, 13 Sep 2015 23:16:14 +0200 Subject: [PATCH] Update hrunorraise - Move implementation to scsh - Cycle through possible windows --- herbstluftwm/usr/bin/hrunorraise | 64 ++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 15 deletions(-) diff --git a/herbstluftwm/usr/bin/hrunorraise b/herbstluftwm/usr/bin/hrunorraise index ac449e4..6e91aa6 100755 --- a/herbstluftwm/usr/bin/hrunorraise +++ b/herbstluftwm/usr/bin/hrunorraise @@ -1,17 +1,51 @@ -#!/bin/bash -# 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. +#!/usr/local/bin/scsh \ +-o srfi-2 -s +!# -WINID=$(wmctrl -lx | grep "\.$1" | awk '{ print $1 }') +(define client-regexp + (rx " " (submatch "0x" (= 7 hex)))) -if [ -n "${WINID}" ]; then - herbstclient jumpto "${WINID}" -else - shift - exec "$@" -fi +(define current-client + (run/string (herbstclient -n attr clients.focus.winid))) + +(define (extract-client-id potential-client) + (and-let* ((matched (regexp-search client-regexp potential-client))) + (match:substring matched 1))) + +(define (compact lst) + "Filter #f values from LST." + (filter (lambda (x) x) lst)) + +(define clients + (compact (map extract-client-id + (run/strings (herbstclient attr clients))))) + +(define (client-class client-id) + (let ((path (string-append "clients." client-id ".class"))) + (run/string (herbstclient -n attr ,path)))) + +(define clients-with-class + (map (lambda (client) + (cons client (client-class client))) + clients)) + +(define classed-clients + (map car + (filter (lambda (client-and-class) + (string= (cdr client-and-class) + (car command-line-arguments))) + clients-with-class))) + +(define (next-client) + (and-let* ((tail (member current-client classed-clients))) + (cdr tail))) + +(define new-client + (let ((next (next-client))) + (if (or (not next) (null? next)) + (car (or (and (not (null? classed-clients)) classed-clients) '(#f))) + (car next)))) + +(if new-client + (run (herbstclient jumpto ,new-client)) + (exec-epf (,@(cdr command-line-arguments))))