about summary refs log tree commit diff
path: root/Functions
diff options
context:
space:
mode:
Diffstat (limited to 'Functions')
-rw-r--r--Functions/Misc/xtermctl116
1 files changed, 116 insertions, 0 deletions
diff --git a/Functions/Misc/xtermctl b/Functions/Misc/xtermctl
new file mode 100644
index 000000000..04fcf3637
--- /dev/null
+++ b/Functions/Misc/xtermctl
@@ -0,0 +1,116 @@
+# Put standard xterm/dtterm window control codes in shell parameters for
+# easy use.  Note that some terminals do not support all combinations.
+
+# autoload -U xtermctl ; xtermctl
+# xtermctl --explain
+
+# Run once to set up; implements two functions:
+#     xterm-tell control [args]
+#     xterm-ask control
+# See xtermseq below for valid control names.  -ask returns values in
+# $reply except for label and title which are returned in $REPLY.
+
+# E.g. one way to maximize the window (see caveat below):
+#     xterm-ask screen_chars
+#     xterm-tell size_chars $reply
+
+# Might there be terminfo names for these controls?
+typeset -Ag xtermseq
+xtermseq=(
+  1      deiconify             2    iconify
+ '3;X;Y' position
+ '4;H;W' size_pixels
+  5      raise                 6    lower
+  7      refresh
+ '8;H;W' size_chars
+ '9;0'   unmaximize           '9;1' maximize
+ 11      get_iconify
+ 13      get_position
+ 14      get_size_pixels
+ 18      get_size_chars
+ 19      get_screen_chars
+ 20      get_label
+ 21      get_title
+)
+
+local k
+for k in ${(k)xtermseq}; do xtermseq[${xtermseq[$k]}]=$k; done
+
+# TODO (maybe): Populate hashes with completed control sequences similar
+# to the $fg and $bg mappings created by Functions/Misc/colors
+
+function xterm-tell {
+  local seq=${${${xtermseq[$1]:?no such control}/[HX]/$2}/[WY]/$3}
+  print -nr -- $'\e['"${seq}"t
+}
+
+function xterm-ask {
+  local esc
+  unset REPLY reply
+  1=get_${1#get_}
+  xterm-tell $1
+  case $1 in
+  (get_(label|title))
+      read -t 2 -rk 3 esc || return 1
+      read -rsd $'\e'
+      read -rk 1 esc
+      ;;
+  (get_*)
+      read -t 2 -rk 2 esc || return 1
+      IFS=';' read -Arsd t
+      (( $#reply > 2 )) && shift reply
+      ;;
+  esac
+  return 0
+}
+
+local documentation; read -rd $'\e' documentation <<'EOdoc' <<<$'\e'
+
+CSI = "control sequence introducer": ESC [
+OSC = "operating system command": ESC ]
+ST = "string terminator": ESC backslash
+Ps = "parameter string": (see list below)
+
+All control sequences described here begin with CSI and end with "t".
+Note that there are no spaces in control sequences or responses,
+except possibly for the text responses for label and title; spaces
+shown below are for readability.
+
+Window manipulation (from dtterm, as well as extensions). These
+controls may be disabled using the allowWindowOps resource. Valid
+values for the first (and any additional parameters) are:
+
+Ps = 1 -> De-iconify window.
+Ps = 2 -> Iconify window.
+Ps = 3 ; x ; y -> Move window to [x, y].
+Ps = 4 ; height ; width -> Resize the xterm window in pixels.
+Ps = 5 -> Raise the xterm window to the front of the stacking order.
+Ps = 6 -> Lower the xterm window to the bottom of the stacking order.
+Ps = 7 -> Refresh the xterm window.
+Ps = 8 ; height ; width -> Resize the text area in characters.
+Ps = 9 ; 0 -> Restore maximized window.
+Ps = 9 ; 1 -> Maximize window (i.e., resize to screen size).
+Ps = 1 1 -> Report xterm window state.
+             If the xterm window is open (non-iconified), returns CSI 1 t .
+             If the xterm window is iconified, returns CSI 2 t .
+Ps = 1 3 -> Report xterm window position as CSI 3 ; x; yt
+Ps = 1 4 -> Report xterm window in pixels as CSI 4 ; height ; width t
+Ps = 1 8 -> Report size of text area as CSI 8 ; height ; width t
+Ps = 1 9 -> Report size of screen in characters as CSI 9 ; height ; width t
+Ps = 2 0 -> Report xterm window's icon label as OSC L label ST
+Ps = 2 1 -> Report xterm window's title as OSC l title ST
+Ps >= 2 4 -> Resize to Ps lines (DECSLPP)
+
+The size of the screen in characters is often reported inaccurately.
+
+Gnome-terminal as of v2.16 responds to 13/14/18/19 but fails to insert
+the Ps digit 3/4/8/9 between the CSI and the reported dimensions, and
+does not appear to respond to any of Ps in 1-9.  Window managers may
+also affect behavior; the Gnome desktop allows xterm to resize or
+iconify itself but won't reliably let it reposition itself.
+
+EOdoc
+
+[[ -n "${(M)@:#--explain}" ]] && print "$documentation"
+
+return 0