blob: a905c16fc2efe3607f3f29248bcae08877431eac (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
#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=( $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=( $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 "$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=( $state object )
else
if compset -S ',*'; then
set -- "$@" -S ''
else
set -- "$@" -S ,
fi
state=( $state application )
fi
;;
esac
shift state
done
return ret
|