From b8647ded0c9e4dee105650399cf1466cb6c5edf2 Mon Sep 17 00:00:00 2001 From: a Date: Sun, 25 Dec 2022 20:27:23 -0600 Subject: [PATCH] Attempt --- Makefile | 66 ++++++ contrib/bash_completion | 29 +++ contrib/fish_completion | 14 ++ contrib/freedesktop/bspwm.desktop | 5 + contrib/zsh_completion | 375 ++++++++++++++++++++++++++++++ 5 files changed, 489 insertions(+) create mode 100644 contrib/bash_completion create mode 100644 contrib/fish_completion create mode 100644 contrib/freedesktop/bspwm.desktop create mode 100644 contrib/zsh_completion diff --git a/Makefile b/Makefile index 8596972..ca2de46 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,71 @@ WINDOWSIZE=1024:768 +VERCMD ?= git describe --tags 2> /dev/null +VERSION := $(shell $(VERCMD) || cat VERSION) + +PREFIX ?= /usr/local +BINPREFIX ?= $(PREFIX)/bin +MANPREFIX ?= $(PREFIX)/share/man +DOCPREFIX ?= $(PREFIX)/share/doc/bspwm +BASHCPL ?= $(PREFIX)/share/bash-completion/completions +FISHCPL ?= $(PREFIX)/share/fish/vendor_completions.d +ZSHCPL ?= $(PREFIX)/share/zsh/site-functions + +MD_DOCS = README.md doc/CHANGELOG.md doc/CONTRIBUTING.md doc/INSTALL.md doc/MISC.md doc/TODO.md +XSESSIONS ?= $(PREFIX)/share/xsessions + +all: bspwm bspc + +VPATH=src + +include Sourcedeps + +$(WM_OBJ) $(CLI_OBJ): Makefile + +#bspwm: $(WM_OBJ) + +bspc: cmd/bspc src + go build ./cmd/bspc -o bspc + xephyr: Xephyr -br ac -noreset ${WINDOWSIZE} :1 + +install: + mkdir -p "$(DESTDIR)$(BINPREFIX)" +# cp -pf bspwm "$(DESTDIR)$(BINPREFIX)" + cp -pf bspc "$(DESTDIR)$(BINPREFIX)" + mkdir -p "$(DESTDIR)$(MANPREFIX)"/man1 +# cp -p doc/bspwm.1 "$(DESTDIR)$(MANPREFIX)"/man1 + cp -Pp doc/bspc.1 "$(DESTDIR)$(MANPREFIX)"/man1 + mkdir -p "$(DESTDIR)$(BASHCPL)" + cp -p contrib/bash_completion "$(DESTDIR)$(BASHCPL)"/bspc + mkdir -p "$(DESTDIR)$(FISHCPL)" + cp -p contrib/fish_completion "$(DESTDIR)$(FISHCPL)"/bspc.fish + mkdir -p "$(DESTDIR)$(ZSHCPL)" + cp -p contrib/zsh_completion "$(DESTDIR)$(ZSHCPL)"/_bspc + mkdir -p "$(DESTDIR)$(DOCPREFIX)" + cp -p $(MD_DOCS) "$(DESTDIR)$(DOCPREFIX)" + mkdir -p "$(DESTDIR)$(DOCPREFIX)"/examples + cp -pr examples/* "$(DESTDIR)$(DOCPREFIX)"/examples + mkdir -p "$(DESTDIR)$(XSESSIONS)" +# cp -p contrib/freedesktop/bspwm.desktop "$(DESTDIR)$(XSESSIONS)" + +uninstall: + rm -f "$(DESTDIR)$(BINPREFIX)"/bspwm + rm -f "$(DESTDIR)$(BINPREFIX)"/bspc + rm -f "$(DESTDIR)$(MANPREFIX)"/man1/bspwm.1 + rm -f "$(DESTDIR)$(MANPREFIX)"/man1/bspc.1 + rm -f "$(DESTDIR)$(BASHCPL)"/bspc + rm -f "$(DESTDIR)$(FISHCPL)"/bspc.fish + rm -f "$(DESTDIR)$(ZSHCPL)"/_bspc + rm -rf "$(DESTDIR)$(DOCPREFIX)" + rm -f "$(DESTDIR)$(XSESSIONS)"/bspwm.desktop + +doc: + a2x -v -d manpage -f manpage -a revnumber=$(VERSION) doc/bspwm.1.asciidoc + +clean: + rm -f $(WM_OBJ) $(CLI_OBJ) bspwm bspc + +.PHONY: all install uninstall doc clean diff --git a/contrib/bash_completion b/contrib/bash_completion new file mode 100644 index 0000000..6ab1e12 --- /dev/null +++ b/contrib/bash_completion @@ -0,0 +1,29 @@ +_bspc() { + local commands='node desktop monitor query rule wm subscribe config quit' + + local settings='external_rules_command status_prefix normal_border_color active_border_color focused_border_color presel_feedback_color border_width window_gap top_padding right_padding bottom_padding left_padding top_monocle_padding right_monocle_padding bottom_monocle_padding left_monocle_padding split_ratio automatic_scheme removal_adjustment initial_polarity directional_focus_tightness presel_feedback borderless_monocle gapless_monocle single_monocle borderless_singleton pointer_motion_interval pointer_modifier pointer_action1 pointer_action2 pointer_action3 click_to_focus swallow_first_click focus_follows_pointer pointer_follows_focus pointer_follows_monitor mapping_events_count ignore_ewmh_focus ignore_ewmh_fullscreen ignore_ewmh_struts center_pseudo_tiled honor_size_hints remove_disabled_monitors remove_unplugged_monitors merge_overlapping_monitors' + + COMPREPLY=() + + if [[ $COMP_CWORD -ge 1 ]] ; then + local current_word="${COMP_WORDS[COMP_CWORD]}" + if [[ $COMP_CWORD -eq 1 ]] ; then + COMPREPLY=( $(compgen -W "$commands" -- "$current_word") ) + return 0 + else + local second_word=${COMP_WORDS[1]} + case $second_word in + config) + if [[ $COMP_CWORD -eq 2 ]] ; then + COMPREPLY=( $(compgen -W "$settings" -- "$current_word") ) + return 0 + fi + ;; + esac + fi + fi +} + +complete -F _bspc bspc + +# vim: set ft=sh: diff --git a/contrib/fish_completion b/contrib/fish_completion new file mode 100644 index 0000000..3cd6f4d --- /dev/null +++ b/contrib/fish_completion @@ -0,0 +1,14 @@ +function __fish_bspc_needs_command + set cmd (commandline -opc) + [ (count $cmd) -eq 1 -a $cmd[1] = 'bspc' ]; and return 0 + return 1 +end + +function __fish_bspc_using_command + set cmd (commandline -opc) + [ (count $cmd) -gt 1 ]; and [ $argv[1] = $cmd[2] ]; and return 0 + return 1 +end + +complete -f -c bspc -n '__fish_bspc_needs_command' -a 'node desktop monitor query rule wm subscribe config quit' +complete -f -c bspc -n '__fish_bspc_using_command config' -a 'external_rules_command status_prefix normal_border_color active_border_color focused_border_color presel_feedback_color border_width window_gap top_padding right_padding bottom_padding left_padding top_monocle_padding right_monocle_padding bottom_monocle_padding left_monocle_padding split_ratio automatic_scheme removal_adjustment initial_polarity directional_focus_tightness presel_feedback borderless_monocle gapless_monocle single_monocle borderless_singleton pointer_motion_interval pointer_modifier pointer_action1 pointer_action2 pointer_action3 click_to_focus swallow_first_click focus_follows_pointer pointer_follows_focus pointer_follows_monitor mapping_events_count ignore_ewmh_focus ignore_ewmh_fullscreen ignore_ewmh_struts center_pseudo_tiled honor_size_hints remove_disabled_monitors remove_unplugged_monitors merge_overlapping_monitors' diff --git a/contrib/freedesktop/bspwm.desktop b/contrib/freedesktop/bspwm.desktop new file mode 100644 index 0000000..2d3de88 --- /dev/null +++ b/contrib/freedesktop/bspwm.desktop @@ -0,0 +1,5 @@ +[Desktop Entry] +Name=bspwm +Comment=Binary space partitioning window manager +Exec=bspwm +Type=Application diff --git a/contrib/zsh_completion b/contrib/zsh_completion new file mode 100644 index 0000000..106997f --- /dev/null +++ b/contrib/zsh_completion @@ -0,0 +1,375 @@ +#compdef bspc + +_bspc_selector() { + [[ ${@[(r)--]} = '--' ]] && shift ${@[(i)--]} + local -a completions=() completions_display=() + local index=0 name id sel_type="$1" + shift 1 + case $sel_type in + (node) compset -P '*[#.:/@]' ;; + (desktop) compset -P '*[#.:]' ;; + (monitor) compset -P '*[#.]' ;; + (*) return 1 ;; + esac + case "$sel_type $IPREFIX" in + (desktop*:) + local ipfx=${${IPREFIX##*@}%:} + while do + if completions=("${(@f)$(bspc query --names -D -m ${ipfx} 2> /dev/null)}") ;then + until ((++index > $#completions)) do + completions[index]="^${index}:${completions[index]}" + done + completions+='focused' + _describe "${sel_type} selector" completions $@ -S '' -J ${sel_type} + break + else + completions=() + [ -n "$ipfx[(r)#]" ] && + ipfx="${ipfx#*#}" || + break + fi + done + ;| + (node*[^@/:.]) + bspc query -N -n .window 2> /dev/null | + while read id ;do + id=${id//:/\\:} + if which xdotool &> /dev/null ;then + name=$(xdotool getwindowname $id 2> /dev/null) + elif which xprop &> /dev/null ;then + name=$(xprop -id $id -notype WM_NAME 2> /dev/null) && + [[ "$name" = 'WM_NAME ='* ]] && + name="${${name#*\"}%\"*}" || + name="" + else + name="install xdotool or xprop to see window titles here" + fi + completions+="$id:$name" + done + ;| + ((desktop|monitor)*[^:.]) + local max_name_len=0 max_index_len i + local -a snames names ids + bspc query -${(U)sel_type[1]} 2> /dev/null | + while read id ;do + ((index++)) + name=$(bspc query --names -${(U)sel_type[1]} -${sel_type[1]} $id 2> /dev/null) + [[ "$name" == *[:.!]* ]] && + sel_name="%${name//:/\\:}" || + sel_name="$name" + ((max_name_len = $#sel_name > max_name_len ? $#sel_name : max_name_len)) + ids+="${id}" + snames+="${sel_name}" + names+="${name}" + done + max_index_len=$(($#index + 1)) + ((max_name_len >= max_name_len)) && ((max_name_len=max_name_len + 1)) + for ((i = 1 ; i <= $#ids ; i++)) ;do + (($#ids[i] <= max_name_len)) && + completions_display+="${(r($max_name_len+1))ids[i]}:${names[i]}" || + completions_display+="${ids[i]}:${names[i]}" + completions+="${ids[i]}:${names[i]}" + done + for ((i = 1 ; i <= $#ids ; i++)) ;do + completions+="${snames[i]}:${names[i]}" + completions_display+="${(r($max_name_len))snames[i]}:${names[i]}" + done + for ((i = 1 ; i <= $#ids ; i++)) ;do + completions+="^${i}:${names[i]}" + completions_display+="^${i}:${names[i]}" + done + ;| + (node*('@'(*':'|*'/'|))) + _describe 'node path' jump -S '/' -r "#. ${quote}" -J nodes + ;| + (node*'/') + ;; + (*'.') + _bspc_prefix '!' "${sel_type} modifiers" ${sel_type}_mod $@ -J ${sel_type}_mod + ;| + ((desktop|monitor)*@) + ;& + (*[^:.@/]) + if (( $#completions_display)) ;then + _describe "${sel_type} selector" ${sel_type}_desc $@ -S '.' -r ". \n:#${quote}\-" -J ${sel_type} \ + -- completions_display completions $@ -S '.' -r ". \n:#${quote}\-" -J ${sel_type} + else + _describe "${sel_type} selector" ${sel_type}_desc $@ -S '.' -r ". \n:#${quote}\-" -J ${sel_type} \ + -- completions $@ -S '.' -r ". \n:#${quote}\-" -J ${sel_type} + fi + ;| + (node*@*'#'*) + ;; + (node*@*) + _bspc_selector desktop -S ':' -qr ".#\-\n ${quote}" + ;; + (desktop*) + _bspc_selector monitor -S ':' -r ".#\-\n ${quote}" + ;; + esac +} + +_bspc_prefix(){ + [[ ${@[(r)--]} = '--' ]] && shift ${@[(i)--]} + [[ "$PREFIX[1]" == "$1" ]] && + local a="-n" b || + local b="-n" a + _describe $@[2,-1] $a -- $@[3,-1] $b -p "$1" +} + +_bspc_query_names() { + [[ ${@[(r)--]} = '--' ]] && shift ${@[(i)--]} + local -a items=("${(@f)$(bspc query $2 --names 2> /dev/null)}") || + return + local c + for c in '\' ':' '[' '(' '*' + items=("${(@)items//$c/\\$c}") + _values -w "$1" "${items[@]}" +} + +_bspc() { + local -a commands=(node desktop monitor query rule wm subscribe config quit) \ + resize_handle=(top bottom top_left top_right bottom_left bottom_right left right) \ + node_state=(tiled pseudo_tiled floating fullscreen) \ + flag=(hidden sticky private locked marked urgent) \ + layer=(below normal above) \ + dir=(north west south east) \ + cycle_dir=(next prev) + local -a jump=($dir first second brother parent 1 2) \ + node_desc=($dir $cycle_dir any last newest older newer focused pointed biggest smallest) \ + node_mod=($node_state $flag $layer focused automatic local \ + active leaf window same_class descendant_of ancestor_of) \ + desktop_desc=($cycle_dir any last newest older newer focused) \ + desktop_mod=(focused occupied local urgent) \ + monitor_desc=($dir $cycle_dir any last newest older newer focused pointed primary) \ + monitor_mod=(focused occupied) \ + presel_dir=($dir cancel) + local quote="${compstate[quote]}" context state state_descr line + typeset -A opt_args + + compset -n 2 + compset -S "${quote}" + + if ((CURRENT==1)) ;then + _describe 'command or domain' commands + return + fi + + case $words[1] in + (node) + ((CURRENT==2)) && _bspc_selector node + ((CURRENT>2)) && [[ "$words[2]" != '-'* ]] && compset -n 2 + ((CURRENT>2)) && [[ "$words[CURRENT-2]" =~ "^-(m|d|n|s|-to-(monitor|desktop|node)|-swap)$" ]] && + _values 'option' '--follow[If passed, the focused node will stay focused]' + _arguments -C \ + '*'{-a,--activate}'[Activate the selected or given node]::node selector:_bspc_selector -- node'\ + '*'{-B,--balance}'[Adjust the split ratios of the tree rooted at the selected node so that all windows occupy the same area]'\ + '*'{-C,--circulate}'[Circulate the windows of the tree rooted at the selected node]:direction:(forward backward)'\ + '*'{-c,--close}'[Close the windows rooted at the selected node]'\ + '*'{-d,--to-desktop}'[Send the selected node to the given desktop]:desktop selector:_bspc_selector -- desktop'\ + '*'{-E,--equalize}'[Reset the split ratios of the tree rooted at the selected node to their default value]'\ + '*'{-F,--flip}'[Flip the the tree rooted at selected node]: :(horizontal vertical)'\ + '*'{-f,--focus}'[Focus the selected or given node]::node selector:_bspc_selector -- node'\ + '*'{-g,--flag}'[Set or toggle the given flag for the selected node]: :-> flag'\ + '*'{-i,--insert-receptacle}'[Insert a receptacle node at the selected node]'\ + '*'{-k,--kill}'[Kill the windows rooted at the selected node]'\ + '*'{-l,--layer}"[Set the stacking layer of the selected window]:stacking layer:($layer)"\ + '*'{-m,--to-monitor}'[Send the selected node to the given monitor]:monitor selector:_bspc_selector -- monitor'\ + '*'{-n,--to-node}'[Transplant the selected node to the given node]:node selector:_bspc_selector -- node'\ + '*'{-o,--presel-ratio}'[Set the splitting ratio of the preselection area]:preselect ratio: ( )'\ + '*'{-p,--presel-dir}'[Preselect the splitting area of the selected node or cancel the preselection]: :_bspc_prefix -- "~" preselect presel_dir'\ + '*'{-y,--type}'[Set the splitting type of the selected node]: :(horizontal vertical)'\ + '*'{-r,--ratio}'[Set the splitting ratio of the selected node (0 < ratio < 1)]: :( )'\ + '*'{-R,--rotate}'[Rotate the tree rooted at the selected node]:angle:(90 270 180)'\ + '*'{-s,--swap}'[Swap the selected node with the given node]:node selector:_bspc_selector -- node'\ + '*'{-t,--state}'[Set the state of the selected window]: :_bspc_prefix -- "~" "node state" node_state '\ + '*'{-v,--move}'[Move the selected window by dx pixels horizontally and dy pixels vertically]:dx:( ):dy:( )'\ + '*'{-z,--resize}"[Resize the selected window by moving the given handle by dx pixels horizontally and dy pixels vertically]:handle:($resize_handle):dx:( ):dy:( )" + [ "$state" = flag ] && _values 'flag' "${flag[@]:#urgent}::set flag:(on off)" + ;; + (desktop) + ((CURRENT==2)) && _bspc_selector desktop + ((CURRENT>2)) && [[ "$words[2]" != '-'* ]] && compset -n 2 + ((CURRENT>2)) && [[ "$words[CURRENT-2]" =~ "^-m|-s|--monitor|--swap$" ]] && + _values 'option' '--follow[If passed, the focused desktop will stay focused]' + _arguments \ + '*'{-a,--activate}'[Activate the selected or given desktop]:: :_bspc_selector -- desktop'\ + '*'{-b,--bubble}"[Bubble the selected desktop in the given direction]:direction:($cycle_dir)"\ + '*'{-f,--focus}'[Focus the selected or given desktop]:: :_bspc_selector -- desktop'\ + '*'{-l,--layout}"[Set or cycle the layout of the selected desktop]:desktop layout:($cycle_dir monocle tiled)"\ + '*'{-m,--to-monitor}'[Send the selected desktop to the given monitor]: :_bspc_selector -- monitor'\ + '*'{-n,--rename}'[Rename the selected desktop]:desktop name:( )'\ + '*'{-r,--remove}'[Remove the selected desktop]'\ + '*'{-s,--swap}'[Swap the selected desktop with the given desktop]: :_bspc_selector -- desktop' + ;; + (monitor) + ((CURRENT==2)) && _bspc_selector monitor + ((CURRENT>2)) && [[ "$words[2]" != '-'* ]] && compset -n 2 + _arguments \ + '*'{-a,--add-desktops}'[Create desktops with the given names in the selected monitor]:*:add desktops:( )'\ + '*'{-d,--reset-desktops}'[Rename, add or remove desktops]:*: :->desktops'\ + '*'{-f,--focus}'[Focus the selected or given monitor]:: :_bspc_selector -- monitor'\ + '*'{-g,--rectangle}'[Set the rectangle of the selected monitor]:WxH+X+Y:( )'\ + '*'{-n,--rename}'[Rename the selected monitor]: :( )'\ + '*'{-o,--reorder-desktops}'[Reorder the desktops of the selected monitor]:*:reorder desktops:_bspc_query_names -- desktops -D'\ + '*'{-r,--remove}'[Remove the selected monitor]'\ + '*'{-s,--swap}'[Swap the selected monitor with the given monitor]: :_bspc_selector -- monitor' + ;; + (query) + local -a cmds_no_names=('-T' '--tree' '-N' '--nodes') + local -a cmds=($cmds_no_names '-D' '--desktops' '-M' '--monitors') + _arguments \ + '*'{-d,--desktop}'[Constrain matches to the selected desktop]: :_bspc_selector -- desktop'\ + '*'{-m,--monitor}'[Constrain matches to the selected monitor]: :_bspc_selector -- monitor'\ + '*'{-n,--node}'[Constrain matches to the selected node]: :_bspc_selector -- node'\ + "($cmds_no_names --names)--names[Print names instead of IDs. Can only be used with -M and -D]"\ + "($cmds --names)"{-N,--nodes}'[List the IDs of the matching nodes]'\ + "($cmds --names)"{-T,--tree}'[Print a JSON representation of the matching item]'\ + "($cmds)"{-D,--desktops}'[List the IDs (or names) of the matching desktops]'\ + "($cmds)"{-M,--monitors}'[List the IDs (or names) of the matching monitors]' + ;; + (wm) + _arguments \ + '*'{-d,--dump-state}'[Dump the current world state on standard output]'\ + '*'{-l,--load-state}'[Load a world state from the given file]:load state from file:_files'\ + '*'{-a,--add-monitor}'[Add a monitor for the given name and rectangle]:add monitor:( )'\ + '*'{-O,--reorder-monitors}'[Reorder the list of monitors to match the given order]:*: :_bspc_query_names -- monitors -M'\ + '*'{-o,--adopt-orphans}'[Manage all the unmanaged windows remaining from a previous session]'\ + '*'{-h,--record-history}'[Enable or disable the recording of node focus history]:history:(on off)'\ + '*'{-g,--get-status}'[Print the current status information]'\ + '*'{-r,--restart}'[Restart the window manager]' + ;; + (subscribe) + if [[ "$words[CURRENT-1]" != (-c|--count) ]] ;then + _values -w "options" \ + '(-f --fifo)'{-f,--fifo}'[Print a path to a FIFO from which events can be read and return]'\ + '(-c --count)'{-c,--count}'[Stop the corresponding bspc process after having received specified count of events]' + _values -w -S "_" events all report pointer_action \ + "monitor:: :(add rename remove swap focus geometry)"\ + "desktop:: :(add rename remove swap transfer focus activate layout)"\ + "node:: :(add remove swap transfer focus activate presel stack geometry state flag layer)" + fi + ;; + (rule) + local -a completions by_index + local index=0 target settings class id instance json + _arguments -C \ + {-a,--add}'[Create a new rule]:*: :->add'\ + {-r,--remove}'[Remove the given rules]:*: :->remove'\ + '(-l --list)'{-l,--list}'[List the rules]' + compset -N "-([ar]|-add|-remove)" + case $state$CURRENT in + (add1) + compset -P '*:' + bspc query -N -n '.window' 2> /dev/null | + while read id ; do + json=$(bspc query -T -n $id 2>/dev/null) || continue + [[ "$json[1]" = '{' ]] || continue + class=${${json##*\"className\":\"}%%\",\"*} + instance=${${json##*\"instanceName\":\"}%%\",\"*} + [[ "$class[1]" != '{' && "$instance[1]" != '{' ]] || continue + if [ -n "$IPREFIX" ] ;then + [[ "$IPREFIX" == ("${class}:"|('\'|)'*:') ]] && + completions[(r)$instance]=$instance + else + class=${class%%:/\\:} + completions[(r)$class]="$class" + fi + done + ;; + (add*) + _values -w 'add rule' {border,focus,follow,manage,center}': :(on off)'\ + '(--one-shot)-o'\ + '(-o)--one-shot'\ + 'monitor: :_bspc_selector -- monitor'\ + 'desktop: :_bspc_selector -- desktop'\ + 'node: :_bspc_selector -- node'\ + 'rectangle: :( )'\ + 'split_ratio:split ratio:( )'\ + "split_dir:split direction:(${dir})"\ + "state:state:(${node_state})"\ + "${flag[@]:#urgent}:set flag:(on off)"\ + "layer:layer:(${layer})" + return + ;; + (remove*) + compset -P '*:' + bspc rule -l 2> /dev/null | + while IFS=" " read target settings ;do + by_index+="^$((++index)):${target} ${settings}" + if [ -n "$IPREFIX" ] ;then + completions+="${target#*:}" + else + completions+="${target%:*}" + fi + done + [[ -z "$IPREFIX" ]] && + _describe 'remove rule by position' '(head tail)' -J by_index -- by_index -J by_index + ;; + (*) + return + ;; + esac + completions[(r)\*]=* + [ -n "$IPREFIX" ] && + _describe 'match window instance' completions || + _describe 'match window class' completions -q -S ':' + ;; + (config) + local -a {look,behaviour,input}{_bool,} + look_bool=(presel_feedback borderless_monocle gapless_monocle borderless_singleton) + look=({normal,active,focused}_border_color {top,right,bottom,left}_padding {top,right,bottom,left}_monocle_padding presel_feedback_color border_width window_gap) + behaviour_bool=(single_monocle removal_adjustment ignore_ewmh_focus ignore_ewmh_struts center_pseudo_tiled honor_size_hints remove_disabled_monitors remove_unplugged_monitors merge_overlapping_monitors) + behaviour=(mapping_events_count ignore_ewmh_fullscreen external_rules_command split_ratio automatic_scheme initial_polarity directional_focus_tightness status_prefix) + input_bool=(swallow_first_click focus_follows_pointer pointer_follows_{focus,monitor}) + input=(click_to_focus pointer_motion_interval pointer_modifier pointer_action{1,2,3}) + if [[ "$CURRENT" == (2|3) ]];then + _arguments \ + '-d[Set settings for the selected desktop]: :_bspc_selector -- desktop'\ + '-m[Set settings for the selected monitor]: :_bspc_selector -- monitor'\ + '-n[Set settings for the selected node]: :_bspc_selector -- node' + fi + if [[ "${words[2]}" == -* ]] ;then + (( CURRENT == 3 )) && return + if (( CURRENT > 3 )) ;then + compset -n 3 + fi + fi + if ((CURRENT==2)) ;then + _describe 'look' look -J look -- look_bool -J look + _describe 'input' input -J input -- input_bool -J input + _describe 'behaviour' behaviour -J behaviour -- behaviour_bool -J behaviour + elif ((CURRENT==3)) ;then + setting=$words[2] + case $setting in + (ignore_ewmh_fullscreen) + _values -S "," "set $setting" all none "enter:: :(exit)" "exit:: :(enter)" + ;; + (initial_polarity) + _values "set $setting" first_child second_child + ;; + (pointer_action(1|2|3)) + _values "set $setting" move resize_side resize_corner focus none + ;; + (pointer_modifier) + _values "set $setting" shift control lock mod1 mod2 mod3 mod4 mod5 + ;; + (directional_focus_tightness) + _values "set $setting" low high + ;; + (click_to_focus) + _values "set $setting" any button1 button2 button3 none + ;; + (*) + [[ -n $look_bool[(r)$setting] ]] || + [[ -n $behaviour_bool[(r)$setting] ]] || + [[ -n $input_bool[(r)$setting] ]] && + _values "set $setting" true false + ;; + esac + fi + ;; + esac +} + +_bspc "$@"