mirror of
https://github.com/vim/vim.git
synced 2025-07-04 23:07:33 -04:00
patch 9.0.0903: key code checker doesn't check modifyOtherKeys resource
Problem: Key code checker doesn't check modifyOtherKeys resource. Solution: Request the modifyOtherKeys resource value. Drop resource DCS responses.
This commit is contained in:
parent
696d0a8625
commit
236dffab43
16
src/term.c
16
src/term.c
@ -5244,6 +5244,9 @@ handle_osc(char_u *tp, char_u *argp, int len, char_u *key_name, int *slen)
|
||||
* {flag} can be '0' or '1'
|
||||
* {tail} can be Esc>\ or STERM
|
||||
*
|
||||
* Check for resource response from xterm (and drop it):
|
||||
* {lead}{flag}+R<hex bytes>=<value>{tail}
|
||||
*
|
||||
* Check for cursor shape response from xterm:
|
||||
* {lead}1$r<digit> q{tail}
|
||||
*
|
||||
@ -5260,7 +5263,8 @@ handle_dcs(char_u *tp, char_u *argp, int len, char_u *key_name, int *slen)
|
||||
j = 1 + (tp[0] == ESC);
|
||||
if (len < j + 3)
|
||||
i = len; // need more chars
|
||||
else if ((argp[1] != '+' && argp[1] != '$') || argp[2] != 'r')
|
||||
else if ((argp[1] != '+' && argp[1] != '$')
|
||||
|| (argp[2] != 'r' && argp[2] != 'R'))
|
||||
i = 0; // no match
|
||||
else if (argp[1] == '+')
|
||||
// key code response
|
||||
@ -5269,7 +5273,8 @@ handle_dcs(char_u *tp, char_u *argp, int len, char_u *key_name, int *slen)
|
||||
if ((tp[i] == ESC && i + 1 < len && tp[i + 1] == '\\')
|
||||
|| tp[i] == STERM)
|
||||
{
|
||||
if (i - j >= 3)
|
||||
// handle a key code response, drop a resource response
|
||||
if (i - j >= 3 && argp[2] == 'r')
|
||||
got_code_from_term(tp + j, i);
|
||||
key_name[0] = (int)KS_EXTRA;
|
||||
key_name[1] = (int)KE_IGNORE;
|
||||
@ -5674,9 +5679,10 @@ check_termcode(
|
||||
|
||||
// Check for key code response from xterm,
|
||||
// starting with <Esc>P or DCS
|
||||
else if ((check_for_codes || rcs_status.tr_progress == STATUS_SENT)
|
||||
&& ((tp[0] == ESC && len >= 2 && tp[1] == 'P')
|
||||
|| tp[0] == DCS))
|
||||
// It would only be needed with this condition:
|
||||
// (check_for_codes || rcs_status.tr_progress == STATUS_SENT)
|
||||
// Now this is always done so that DCS codes don't mess up things.
|
||||
else if ((tp[0] == ESC && len >= 2 && tp[1] == 'P') || tp[0] == DCS)
|
||||
{
|
||||
if (handle_dcs(tp, argp, len, key_name, &slen) == FAIL)
|
||||
return -1;
|
||||
|
@ -134,7 +134,7 @@ def ActionList()
|
||||
endif
|
||||
sort(terms)
|
||||
|
||||
var items = ['protocol', 'version', 'status']
|
||||
var items = ['protocol', 'version', 'status', 'resource']
|
||||
+ key_entries->copy()->map((_, v) => v[1])
|
||||
|
||||
# For each terminal compute the needed width, add two.
|
||||
@ -198,8 +198,9 @@ def DoTerm(name: string)
|
||||
if proto == 1
|
||||
&t_TI = ""
|
||||
elseif proto == 2
|
||||
# Enable modifyOtherKeys level 2 - no status is reported
|
||||
&t_TI = "\<Esc>[>4;2m"
|
||||
# Enable modifyOtherKeys level 2
|
||||
# Request the resource value: DCS + Q modifyOtherKeys ST
|
||||
&t_TI = "\<Esc>[>4;2m" .. "\<Esc>P+Q6d6f646966794f746865724b657973\<Esc>\\"
|
||||
proto_name = 'mok2'
|
||||
elseif proto == 3
|
||||
# Enable Kitty keyboard protocol and request the status
|
||||
@ -217,9 +218,14 @@ def DoTerm(name: string)
|
||||
# Pattern that matches the line with the version response.
|
||||
const version_pattern = "\<Esc>\\[>\\d\\+;\\d\\+;\\d*c"
|
||||
|
||||
# Pattern that matches the resource value response:
|
||||
# DCS 1 + R Pt ST valid
|
||||
# DCS 0 + R Pt ST invalid
|
||||
const resource_pattern = "\<Esc>P[01]+R.*\<Esc>\\\\"
|
||||
|
||||
# Pattern that matches the line with the status. Currently what terminals
|
||||
# return for the Kitty keyboard protocol.
|
||||
const status_pattern = "\<Esc>\\[?\\d\\+u"
|
||||
const kitty_status_pattern = "\<Esc>\\[?\\d\\+u"
|
||||
|
||||
ch_logfile('keylog', 'w')
|
||||
|
||||
@ -244,6 +250,7 @@ def DoTerm(name: string)
|
||||
endfor
|
||||
endif
|
||||
if reltime(startTime)->reltimefloat() > 3
|
||||
# break out after three seconds
|
||||
break
|
||||
endif
|
||||
endwhile
|
||||
@ -257,18 +264,39 @@ def DoTerm(name: string)
|
||||
keycodes[name]['protocol'] = proto_name
|
||||
keycodes[name]['version'] = ''
|
||||
keycodes[name]['status'] = ''
|
||||
keycodes[name]['resource'] = ''
|
||||
|
||||
# Check the log file for a status and the version response
|
||||
ch_logfile('', '')
|
||||
var log = readfile('keylog')
|
||||
delete('keylog')
|
||||
|
||||
for line in log
|
||||
if line =~ 'raw key input'
|
||||
var code = substitute(line, '.*raw key input: "\([^"]*\).*', '\1', '')
|
||||
|
||||
# Check for resource value response
|
||||
if code =~ resource_pattern
|
||||
var resource = substitute(code, '.*\(' .. resource_pattern .. '\).*', '\1', '')
|
||||
# use the value as the resource, "=30" means zero
|
||||
resource = substitute(resource, '.*\(=\p\+\).*', '\1', '')
|
||||
|
||||
if keycodes[name]['resource'] != ''
|
||||
echomsg 'Another resource found after ' .. keycodes[name]['resource']
|
||||
endif
|
||||
keycodes[name]['resource'] = resource
|
||||
endif
|
||||
|
||||
# Check for kitty keyboard protocol status
|
||||
if code =~ status_pattern
|
||||
var status = substitute(code, '.*\(' .. status_pattern .. '\).*', '\1', '')
|
||||
keycodes[name]['status'] = Literal2hex(status)
|
||||
if code =~ kitty_status_pattern
|
||||
var status = substitute(code, '.*\(' .. kitty_status_pattern .. '\).*', '\1', '')
|
||||
# use the response itself as the status
|
||||
status = Literal2hex(status)
|
||||
|
||||
if keycodes[name]['status'] != ''
|
||||
echomsg 'Another status found after ' .. keycodes[name]['status']
|
||||
endif
|
||||
keycodes[name]['status'] = status
|
||||
endif
|
||||
|
||||
if code =~ version_pattern
|
||||
@ -282,13 +310,23 @@ def DoTerm(name: string)
|
||||
echo "For Alt to work you may need to press the Windows/Super key as well"
|
||||
echo "When a key press doesn't get to Vim (e.g. when using Alt) press x"
|
||||
|
||||
# The log of ignored typeahead is left around for debugging, start with an
|
||||
# empty file here.
|
||||
delete('keylog-ignore')
|
||||
|
||||
for entry in key_entries
|
||||
# Consume any typeahead. Wait a bit for any responses to arrive.
|
||||
sleep 100m
|
||||
while getchar(1)
|
||||
getchar()
|
||||
ch_logfile('keylog-ignore', 'a')
|
||||
while 1
|
||||
sleep 100m
|
||||
if !getchar(1)
|
||||
break
|
||||
endif
|
||||
while getchar(1)
|
||||
getchar()
|
||||
endwhile
|
||||
endwhile
|
||||
ch_logfile('', '')
|
||||
|
||||
ch_logfile('keylog', 'w')
|
||||
echo $'Press the {entry[0]} key (q to quit):'
|
||||
@ -297,13 +335,9 @@ def DoTerm(name: string)
|
||||
if r == 'q'
|
||||
break
|
||||
endif
|
||||
|
||||
log = readfile('keylog')
|
||||
if entry[1] == 'Tab'
|
||||
# keep a copy
|
||||
rename('keylog', 'keylog-tab')
|
||||
else
|
||||
delete('keylog')
|
||||
endif
|
||||
delete('keylog')
|
||||
if len(log) < 2
|
||||
echoerr 'failed to read result'
|
||||
return
|
||||
@ -321,7 +355,7 @@ rename('keylog', 'keylog-tab')
|
||||
code = substitute(code, cappat, '', 'g')
|
||||
|
||||
# Remove any kitty status reply
|
||||
code = substitute(code, status_pattern, '', 'g')
|
||||
code = substitute(code, kitty_status_pattern, '', 'g')
|
||||
if code == ''
|
||||
continue
|
||||
endif
|
||||
|
@ -695,6 +695,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
903,
|
||||
/**/
|
||||
902,
|
||||
/**/
|
||||
|
Loading…
x
Reference in New Issue
Block a user