mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-22 16:20:23 +02:00
users/12453: X11 window control for xterm-compatible emulators
This commit is contained in:
parent
40fec5bb24
commit
b44aef2754
2 changed files with 121 additions and 0 deletions
116
Functions/Misc/xtermctl
Normal file
116
Functions/Misc/xtermctl
Normal file
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue