From 37dd411698bd6eae8365260dde39b8ae9c7cbd36 Mon Sep 17 00:00:00 2001 From: Peter Son Struschka Date: Sun, 30 Aug 2020 20:56:36 +0800 Subject: all: overhaul, move dotfile specifics to .local/share/dotfiles and more --- herbstluftwm/.local/bin/q3terminal.sh | 97 ++++++++++++++++++++++ herbstluftwm/.local/bin/scratchpad.sh | 70 ++++++++++++++++ .../.local/bin/statusbar/herbstluftwm_tag_list | 14 ++++ 3 files changed, 181 insertions(+) create mode 100755 herbstluftwm/.local/bin/q3terminal.sh create mode 100755 herbstluftwm/.local/bin/scratchpad.sh create mode 100755 herbstluftwm/.local/bin/statusbar/herbstluftwm_tag_list (limited to 'herbstluftwm/.local/bin') diff --git a/herbstluftwm/.local/bin/q3terminal.sh b/herbstluftwm/.local/bin/q3terminal.sh new file mode 100755 index 0000000..e69b5ee --- /dev/null +++ b/herbstluftwm/.local/bin/q3terminal.sh @@ -0,0 +1,97 @@ +#!/usr/bin/env bash + +# a q3-like (or yakuake-like) terminal for arbitrary applications. +# +# this lets a new monitor called "q3terminal" scroll in from the top into the +# current monitor. There the "scratchpad" will be shown (it will be created if +# it doesn't exist yet). If the monitor already exists it is scrolled out of +# the screen and removed again. +# +# Warning: this uses much resources because herbstclient is forked for each +# animation step. +# +# If a tag name is supplied, this is used instead of the scratchpad + +tag="${1:-scratchpad}" +hc() { "${herbstclient_command[@]:-herbstclient}" "$@" ;} + +termwidth_percent=${WIDTH_PERC:-100} +mrect=( $(hc monitor_rect -p "" ) ) +termwidth=$(( (${mrect[2]} * termwidth_percent) / 100 )) +termheight=${HEIGHT_PIXELS:-400} + +rect=( + $termwidth + $termheight + $(( ${mrect[0]} + (${mrect[2]} - termwidth) / 2 )) + $(( ${mrect[1]} - termheight )) +) + +y_line=${mrect[1]} + + +hc add "$tag" + + +monitor=dropdown + +exists=false +if ! hc add_monitor $(printf "%dx%d%+d%+d" "${rect[@]}") \ + "$tag" $monitor 2> /dev/null ; then + exists=true +else + # remember which monitor was focused previously + hc chain \ + , new_attr string monitors.by-name."$monitor".my_prev_focus \ + , substitute M monitors.focus.index \ + set_attr monitors.by-name."$monitor".my_prev_focus M +fi + +update_geom() { + local geom=$(printf "%dx%d%+d%+d" "${rect[@]}") + hc move_monitor "$monitor" $geom +} + +steps=${ANIMATION_STEPS:-1} +interval=${ANIMATION_INTERVAL:-0.01} + +animate() { + progress=( "$@" ) + for i in "${progress[@]}" ; do + rect[3]=$((y_line - (i * termheight) / steps)) + update_geom + sleep "$interval" + done +} + +show() { + hc lock + hc raise_monitor "$monitor" + hc focus_monitor "$monitor" + hc unlock + hc lock_tag "$monitor" + animate $(seq $steps -1 0) +} + +hide() { + rect=( $(hc monitor_rect "$monitor" ) ) + local tmp=${rect[0]} + rect[0]=${rect[2]} + rect[2]=${tmp} + local tmp=${rect[1]} + rect[1]=${rect[3]} + rect[3]=${tmp} + termheight=${rect[1]} + y_line=${rect[3]} # height of the upper screen border + + animate $(seq 0 +1 $steps) + # if q3terminal still is focused, then focus the previously focused monitor + # (that mon which was focused when starting q3terminal) + hc substitute M monitors.by-name."$monitor".my_prev_focus \ + and + compare monitors.focus.name = "$monitor" \ + + focus_monitor M + hc remove_monitor "$monitor" +} + +[ $exists = true ] && hide || show + diff --git a/herbstluftwm/.local/bin/scratchpad.sh b/herbstluftwm/.local/bin/scratchpad.sh new file mode 100755 index 0000000..d168ad7 --- /dev/null +++ b/herbstluftwm/.local/bin/scratchpad.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash + +# a i3-like scratchpad for arbitrary applications. +# +# this lets a new monitor called "scratchpad" appear in from the top into the +# current monitor. There the "scratchpad" will be shown (it will be created if +# it doesn't exist yet). If the monitor already exists it is scrolled out of +# the screen and removed again. +# +# Warning: this uses much resources because herbstclient is forked for each +# animation step. +# +# If a tag name is supplied, this is used instead of the scratchpad + +tag="${1:-scratchpad}" +hc() { "${herbstclient_command[@]:-herbstclient}" "$@" ;} +#scratchpad=(alacritty --title "$tag" --class "scratchpad") +scratchpad=(urxvt -title "$tag" -name "scratchpad") +#scratchpad=(xterm -title "$tag" -name "scratchpad") + +#mrect=( $(hc monitor_rect "") ) +read -r -a mrect < <(hc monitor_rect "") + +width=${mrect[2]} +height=${mrect[3]} + +rect=( + $((width/2)) + $((height/2)) + $((mrect[0]+(width/4))) + $((mrect[1]+(height/4))) +) + +hc add "$tag" + +monitor=scratchpad + +exists=false +if ! hc add_monitor $(printf "%dx%d%+d%+d" "${rect[@]}") \ + "$tag" $monitor 2> /dev/null ; then + exists=true +else + # remember which monitor was focused previously + hc chain \ + , new_attr string monitors.by-name."$monitor".my_prev_focus \ + , substitute M monitors.focus.index \ + set_attr monitors.by-name."$monitor".my_prev_focus M +fi + +show() { + [ "$(hc attr tags.by-name."$tag".client_count)" = "0" ] && hc spawn "${scratchpad[@]}" + hc lock + hc raise_monitor "$monitor" + hc focus_monitor "$monitor" + hc unlock + hc lock_tag "$monitor" +} + +hide() { + # if q3terminal still is focused, then focus the previously focused monitor + # (that mon which was focused when starting q3terminal) + hc substitute M monitors.by-name."$monitor".my_prev_focus \ + and + compare monitors.focus.name = "$monitor" \ + + focus_monitor M + hc remove_monitor "$monitor" +} + +# shellcheck disable=SC2015 +[ $exists = true ] && hide || show + diff --git a/herbstluftwm/.local/bin/statusbar/herbstluftwm_tag_list b/herbstluftwm/.local/bin/statusbar/herbstluftwm_tag_list new file mode 100755 index 0000000..41c3569 --- /dev/null +++ b/herbstluftwm/.local/bin/statusbar/herbstluftwm_tag_list @@ -0,0 +1,14 @@ +#!/bin/env bash + +hc() { "${herbstclient_command[@]:-herbstclient}" "$@" ;} +monitor=${1:-0} + +{ + hc --idle +} 2> /dev/null | { + IFS=$'\t' read -ra tags <<< "$(hc tag_status $monitor)" + while true ; do + for i in "${tags[@]}" ; do + case + + -- cgit v1.2.3