about summary refs log tree commit diff
path: root/Completion/X
diff options
context:
space:
mode:
authorOliver Kiddle <opk@users.sourceforge.net>2013-01-21 00:14:08 +0000
committerOliver Kiddle <opk@users.sourceforge.net>2013-01-21 00:14:08 +0000
commit27c5a0d7744ffeaf677b097adbe9a094a3a49025 (patch)
tree20e5279474f589177a6c4efc5105a5fbaf57e05b /Completion/X
parent0969fb91fa3dcf461a52f8dbda5313475c39f603 (diff)
downloadzsh-27c5a0d7744ffeaf677b097adbe9a094a3a49025.tar.gz
zsh-27c5a0d7744ffeaf677b097adbe9a094a3a49025.tar.xz
zsh-27c5a0d7744ffeaf677b097adbe9a094a3a49025.zip
30987: only call xrandr when necessary and use _call_program
Diffstat (limited to 'Completion/X')
-rw-r--r--Completion/X/Command/_xrandr50
1 files changed, 28 insertions, 22 deletions
diff --git a/Completion/X/Command/_xrandr b/Completion/X/Command/_xrandr
index 9058610b2..9d9323c69 100644
--- a/Completion/X/Command/_xrandr
+++ b/Completion/X/Command/_xrandr
@@ -1,13 +1,9 @@
 #compdef xrandr
-local context state line
-typeset -A opt_args
-local outputs modes expl
 
-# User configurable. TODO -- styles?
-outputs=($(xrandr|sed -ne 's/^\([^[[:space:]]\+]*\) connected .*$/\1/p'))
-modes=($(xrandr|sed -ne 's/^[[:space:]]\+\([[:digit:]]\+x[[:digit:]]\+\).*$/\1/p'|sort -nr|uniq))
+local curcontext="$curcontext" state line expl
+typeset -A opt_args
 
-_arguments \
+_arguments -C \
   '(-d -display)'{-d,-display}':X display:_x_display' \
   '-help[display help]' \
   '(-o --orientation)'{-o,--orientation}':rotation:(normal inverted left right 0 1 2 3)' \
@@ -25,18 +21,18 @@ _arguments \
   '--fb:size:' \
   '--fbmm:size:' \
   '--dpi:dpi:' \
-  "*--output:output to reconfigure:($outputs)" \
+  "*--output:output to reconfigure:->outputs" \
   '*--auto' \
-  "*--mode:mode:($modes)" \
+  "*--mode:mode:->modes" \
   '*--preferred' \
   '*--pos:position:' \
   '*--reflect:axes:(normal x y xy)' \
   '*--rotate:rotation:(normal inverted left right)' \
-  "*--left-of:relative position to:($outputs)" \
-  "*--right-of:relative position to:($outputs)" \
-  "*--above:relative position to:($outputs)" \
-  "*--below:relative position to:($outputs)" \
-  "*--same-as:relative position to:($outputs)" \
+  "*--left-of:relative position to:->outputs" \
+  "*--right-of:relative position to:->outputs" \
+  "*--above:relative position to:->outputs" \
+  "*--below:relative position to:->outputs" \
+  "*--same-as:relative position to:->outputs" \
   '*--set:property:(Backlight scaling\ mode):value:->value' \
   '*--scale:output scaling:' \
   '*--transform:transformation matrix:' \
@@ -48,15 +44,25 @@ _arguments \
   '--noprimary' \
   '*--newmode:name: :clock MHz: :hdisp: :hsync-start: :hsync-end: :htotal: :vdisp: :vsync-start: :vsync-end: :vtotal:' \
   '*--rmmode:Mode name:' \
-  "*--addmode:output:($outputs):name:" \
-  "*--delmode:output:($outputs):name:" \
+  "*--addmode:output:->outputs:name" \
+  "*--delmode:output:->outputs:name" \
   && return 0
 
-if [[ $state == value ]]; then
+case $state in
+  value)
     case $words[CURRENT-1] in
-	(scaling* mode)
-	    _description value expl "output property 'scaling mode'"
-	    compadd "$@" "$expl[@]" None Full Center Full\ aspect && return 0
-	    ;;
+      (scaling* mode)
+	_description value expl "output property 'scaling mode'"
+	compadd "$@" "$expl[@]" None Full Center Full\ aspect && return 0
+      ;;
     esac
-fi
+  ;;
+  outputs)
+    _wanted outputs expl output compadd \
+        ${(uo)${(M)${(f)"$(_call_program outputs xrandr)"}:#* connected*}%% *} && return 0
+  ;;
+  modes)
+    _wanted modes expl mode compadd \
+        ${(Mun)$(_call_program modes xrandr):#[0-9]##x[0-9]##} && return 0
+  ;;
+esac