summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--Completion/X/Command/.distfiles2
-rw-r--r--Completion/X/Command/_dcop119
3 files changed, 124 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 6c03616f4..2d71760ac 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2003-04-15 Oliver Kiddle <opk@zsh.org>
+
+ * 18443: Completion/X/Command/_dcop: new completion for dcop
+
2003-04-14 Peter Stephenson <pws@csr.com>
* unposted: Doc/Zsh/compsys.yo: large-scale but unfinished
diff --git a/Completion/X/Command/.distfiles b/Completion/X/Command/.distfiles
index 51bef861a..4ed8751bc 100644
--- a/Completion/X/Command/.distfiles
+++ b/Completion/X/Command/.distfiles
@@ -2,5 +2,5 @@ DISTFILES_SRC='
.distfiles
_gv _netscape _xauth _xfig _mozilla _xterm _xwit
_nedit _vnc _x_utils _xdvi _xmodmap _xset _xv
-_xloadimage
+_dcop _xloadimage
'
diff --git a/Completion/X/Command/_dcop b/Completion/X/Command/_dcop
new file mode 100644
index 000000000..a0329e110
--- /dev/null
+++ b/Completion/X/Command/_dcop
@@ -0,0 +1,119 @@
+#compdef dcop dcopstart dcopfind dcopref dcopclient dcopobject
+
+local curcontext="$curcontext" desc vals arg base max=0 ret=1
+local app obj fun
+local -a state line expl
+
+case $service in
+ dcop(client|object))
+ state=( dcopref )
+ max=2
+ ;;
+ dcopref) max=3 ;;
+ dcopstart)
+ if (( CURRENT > 2 )); then
+ _urls && return
+ fi
+ ;;
+ dcopfind)
+ local cmd=$words[1]
+ _arguments -C \
+ '-a[print application id instead of DCOPRef]' \
+ '-l[if object not found, run dcopstart and retry]' \
+ '*::args:->args' && ret=0
+ unset state
+ words=( $cmd $words )
+ (( CURRENT++ ))
+ ;;
+esac
+
+if (( max && CURRENT > max )); then
+ _message 'no more arguments'
+ return 1
+fi
+
+if [[ -z "$state" ]]; then
+ state=(application object function)
+ [[ $words[2] = DCOPRef* && CURRENT -ne 2 ]]
+ base=$?
+ state=( ${state[CURRENT-base]:-arg} )
+
+ [[ $state[1] = application && $service = dcop(|find) ]] && state+=( dcopref )
+fi
+
+while (( $#state )); do
+ unset app obj fun
+
+ if [[ $words[2] = (#b)DCOPRef*\(([^,]#)((#e)|,)([^\\\)]#)(*) ]]; then
+ if [[ -n $match[2] ]]; then
+ app=$match[1]
+ if [[ -n $match[4] ]]; then
+ obj=$match[3]
+ [[ -n $words[3] && CURRENT -gt 3 ]] && fun=$words[3]
+ fi
+ fi
+ else
+ case $CURRENT in
+ <5->) fun="$words[4]" ;&
+ 4) obj="$words[3]" ;&
+ 3) app="$words[2]" ;;
+ esac
+ fi
+ vals=( ${(f)"$(_call_program dcop-$state[1]s ${(M)words[1]##*/}dcop $app $obj 2>/dev/null)"} )
+
+ case "$state[1]" in
+ application|object)
+ [[ -n ${(M)vals:#*\(default\)} ]] && vals+=( default )
+ _wanted dcop-$state[1]s expl $state[1] compadd "$@" - ${vals% \(default\)} && ret=0
+ ;;
+
+ function)
+ [[ $service = dcopfind ]] && vals=( ${(M)vals:#bool *} )
+ _wanted dcop-$state[1]s expl $state[1] compadd "$@" - ${${vals#* }%\(*} && ret=0
+ ;;
+
+ arg)
+ arg=${${${(M)vals:#*$fun\(*}#*\(}%\)*},
+ arg=${${(s.,.)arg}[CURRENT-base-3]}
+ if [[ -n $arg ]]; then
+ if [[ $arg = (Q(|C)String|*int )* || $arg != *\ * ]]; then
+ # don't mention the argument's type
+ desc="${arg##* }"
+ else
+ desc="${arg##* } (${arg% *})"
+ fi
+ case $arg in
+ bool*) _wanted argument expl "$desc" compadd true false && return ;;
+ (#i)*(file|path|dir)*) _wanted argument expl "$desc" _files && return ;;
+ (#i)*url*) _wanted argument expl "$desc" _urls && return ;;
+ *) _message -e argument "$desc" ;;
+ esac
+ else
+ _message 'no more arguments'
+ fi
+ ;;
+
+ dcopref)
+ if ! compset -P '*\('; then
+ _wanted dcoprefs expl 'dcop ref' compadd -S '' 'DCOPRef(' && ret=0
+ elif compset -P '*,'; then
+ if compset -S '(|\\)\)*'; then
+ set -- -S '' "$@"
+ else
+ set -- "$@" -S"${${QIPREFIX:+)}:-\)}$compstate[quote] "
+ fi
+ state+=( object )
+ else
+ if compset -S ',*'; then
+ set -- "$@" -S ''
+ else
+ set -- "$@" -S ,
+ fi
+ state+=( application )
+ fi
+ ;;
+ esac
+ shift state
+done
+
+return ret