about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Completion/X/_x_keysym20
-rw-r--r--Completion/X/_x_modifier7
-rw-r--r--Completion/X/_xmodmap93
3 files changed, 120 insertions, 0 deletions
diff --git a/Completion/X/_x_keysym b/Completion/X/_x_keysym
new file mode 100644
index 000000000..6b031014a
--- /dev/null
+++ b/Completion/X/_x_keysym
@@ -0,0 +1,20 @@
+#autoload
+
+local expl
+
+if (( ! $+_keysym_cache )); then
+  local file
+
+  file=( /usr/{include,{{X11R6,openwin},local{,/X11{,R6}}}/include}/X11/keysymdef.h(N) )
+
+  if (( $#file )); then
+    _keysym_cache=( "${(@)${(@)${(M@)${(@f)$(< $file[1])}:#\#define[ 	]##XK_*}#\#define[ 	]##XK_}%%[ 	]*}" )
+  else
+    _keysym_cache=( BackSpace Tab Linefeed Clear Return Pause Escape 
+                    Delete Left Right Up Down Space Home Begin End
+		    F{1,2,3,4,5,6,7,8,9,10,11,12} )
+  fi
+fi
+
+_description expl 'key symbol'
+compadd "$@" "$expl[@]" -M 'm:{a-z}={A-Z} r:|-=* r:|=*' - $_keysym_cache
diff --git a/Completion/X/_x_modifier b/Completion/X/_x_modifier
new file mode 100644
index 000000000..a9276ab71
--- /dev/null
+++ b/Completion/X/_x_modifier
@@ -0,0 +1,7 @@
+#autoload
+
+local expl
+
+_description expl modifier
+compadd "$@" "$expl[@]" -M 'm:{a-z}={A-Z}' - \
+        Shift Lock Control Mod1 Mod2 Mod3 Mod4 Mod5
diff --git a/Completion/X/_xmodmap b/Completion/X/_xmodmap
new file mode 100644
index 000000000..0f6514eb6
--- /dev/null
+++ b/Completion/X/_xmodmap
@@ -0,0 +1,93 @@
+#compdef xmodmap
+
+setopt localoptions extendedglob
+
+local state line ret=1
+typeset -A options
+
+_x_arguments \
+  -{help,grammar,verbose,quiet} \
+  '-n[only show what would be done]' \
+  '*-e[specify expression]:expression:->expr' \
+  '-pm[print modifier map]' \
+  '-pk[print keymap table]' \
+  '-pke[print keymap table as expressions]' \
+  '-pp[print pointer map]' \
+  ':X mapping file:_files' && ret=0
+
+if [[ -n "$state" ]]; then
+  local expl expr="${PREFIX##[ 	]#}" what suf
+
+  if compset -P '[^ 	]##[ 	]##'; then
+    case "$expr" in
+    keycode*)
+      if compset -P '*=[ 	]#'; then
+        compset -P '*[ 	]'
+        what=ksyms
+      elif [[ "$expr" = *[\ \	]##[^\ \	]##[\ \	] ]]; then
+        IPREFIX="${IPREFIX}${PREFIX}"
+	PREFIX=''
+	compadd -S ' ' '=' && ret=0
+      else
+        _message 'key code or `any'"'"
+      fi
+      ;;
+    keysym*)
+      if compset -P '*=[ 	]#'; then
+        compset -P '*[ 	]'
+        what=ksyms
+      elif [[ "$expr" = *[\ \	]##[^\ \	]##[\ \	] ]]; then
+        IPREFIX="${IPREFIX}${PREFIX}"
+	PREFIX=''
+	compadd -S ' ' '=' && ret=0
+      else
+        what=ksym-eq
+      fi
+      ;;
+    clear*)
+      what=mods
+      ;;
+    (add|remove)*)
+      if compset -P '*[ 	]##'; then
+        what=ksyms
+      else
+        what=mods-eq
+      fi
+      ;;
+    pointer*)
+      if compset -P '*=[ 	]#'; then
+        compset -P '*[ 	]'
+        _description expl 'button code'
+        compadd "$expl[@]" -qS ' ' 1 2 3 4 5 default
+        return
+      else
+        IPREFIX="${IPREFIX}${PREFIX}"
+	PREFIX=''
+	compadd -S ' ' '=' && ret=0
+      fi
+      ;;
+    esac
+
+    if [[ "$what" = *eq* ]]; then
+      suf=(-S ' = ')
+    elif [[ "$what" = *ksyms* ]]; then
+      if [[ -n "$compstate[quote]" ]]; then
+        suf=(-S "$compstate[quote] " -r "$compstate[quote] ")
+      else
+        suf=(-qS ' ')
+      fi
+    else
+      suf=()
+    fi
+
+    [[ "$what" = *mods* ]] && _x_modifier "$suf[@]" && ret=0
+    [[ "$what" = *ksym* ]] && _x_keysym "$suf[@]" && ret=0
+
+  else
+    _description expl command
+    compadd "$expl[@]" -S ' ' keycode keysym clear add remove && ret=0
+    compadd "$expl[@]" -S ' = ' pointer && ret=0
+  fi
+fi
+
+return ret