Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
cs24-19fa
git_rec_nano
Commits
19dfd20a
Commit
19dfd20a
authored
8 years ago
by
Benno Schulenberg
Browse files
Options
Download
Email Patches
Plain Diff
tweaks: add a variable, in preparation for making returning easier
parent
d12fdda1
master
feature/match-parens
refactor/readbility
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/winio.c
+36
-35
src/winio.c
with
36 additions
and
35 deletions
+36
-35
src/winio.c
View file @
19dfd20a
...
...
@@ -333,7 +333,7 @@ int parse_kbinput(WINDOW *win)
{
static
int
escapes
=
0
,
byte_digits
=
0
;
static
bool
double_esc
=
FALSE
;
int
*
kbinput
,
retval
=
ERR
;
int
*
kbinput
,
keycode
,
retval
=
ERR
;
meta_key
=
FALSE
;
func_key
=
FALSE
;
...
...
@@ -347,38 +347,41 @@ int parse_kbinput(WINDOW *win)
while
(
kbinput
==
NULL
)
kbinput
=
get_input
(
win
,
1
);
if
(
*
kbinput
==
NANO_CONTROL_3
)
{
keycode
=
*
kbinput
;
free
(
kbinput
);
if
(
keycode
==
NANO_CONTROL_3
)
{
/* Increment the escape counter. */
escapes
++
;
/* If there are four consecutive escapes, discard three of them. */
if
(
escapes
>
3
)
escapes
=
1
;
solitary
=
(
escapes
==
1
&&
get_key_buffer_len
()
==
0
);
}
else
if
(
*
kbinput
!=
ERR
)
{
}
else
if
(
keycode
!=
ERR
)
{
switch
(
escapes
)
{
case
0
:
/* One non-escape: normal input mode. */
retval
=
*
kbinput
;
retval
=
keycode
;
break
;
case
1
:
/* Reset the escape counter. */
escapes
=
0
;
if
((
*
kbinput
!=
'O'
&&
*
kbinput
!=
'o'
&&
*
kbinput
!=
'['
)
||
if
((
keycode
!=
'O'
&&
keycode
!=
'o'
&&
keycode
!=
'['
)
||
get_key_buffer_len
()
==
0
||
*
key_buffer
==
0x1B
)
{
/* One escape followed by a single non-escape:
* meta key sequence mode. */
if
(
!
solitary
||
(
*
kbinput
>=
0x20
&&
*
kbinput
<
0x7F
))
if
(
!
solitary
||
(
keycode
>=
0x20
&&
keycode
<
0x7F
))
meta_key
=
TRUE
;
retval
=
tolower
(
*
kbinput
);
retval
=
tolower
(
keycode
);
}
else
/* One escape followed by a non-escape, and there
* are more codes waiting: escape sequence mode. */
retval
=
parse_escape_sequence
(
win
,
*
kbinput
);
retval
=
parse_escape_sequence
(
win
,
keycode
);
break
;
case
2
:
if
(
double_esc
)
{
/* An "ESC ESC [ X" sequence from Option+arrow. */
switch
(
*
kbinput
)
{
switch
(
keycode
)
{
case
'A'
:
retval
=
KEY_HOME
;
break
;
...
...
@@ -397,9 +400,9 @@ int parse_kbinput(WINDOW *win)
double_esc
=
FALSE
;
escapes
=
0
;
}
else
if
(
get_key_buffer_len
()
==
0
)
{
if
((
'0'
<=
*
kbinput
&&
*
kbinput
<=
'2'
&&
byte_digits
==
0
)
||
(
'0'
<=
*
kbinput
&&
*
kbinput
<=
'9'
&&
byte_digits
>
0
))
{
if
((
'0'
<=
keycode
&&
keycode
<=
'2'
&&
byte_digits
==
0
)
||
(
'0'
<=
keycode
&&
keycode
<=
'9'
&&
byte_digits
>
0
))
{
/* Two escapes followed by one or more decimal
* digits, and there aren't any other codes
* waiting: byte sequence mode. If the range
...
...
@@ -409,7 +412,7 @@ int parse_kbinput(WINDOW *win)
int
byte
;
byte_digits
++
;
byte
=
get_byte_kbinput
(
*
kbinput
);
byte
=
get_byte_kbinput
(
keycode
);
/* If we've read in a complete byte sequence,
* reset the escape counter and the byte sequence
...
...
@@ -447,16 +450,16 @@ int parse_kbinput(WINDOW *win)
* create a byte sequence greater than 2XX)
* and there aren't any other codes waiting:
* control character sequence mode. */
retval
=
get_control_kbinput
(
*
kbinput
);
retval
=
get_control_kbinput
(
keycode
);
else
{
/* An invalid digit in the middle of a byte
* sequence: reset the byte sequence counter
* and save the code we got as the result. */
byte_digits
=
0
;
retval
=
*
kbinput
;
retval
=
keycode
;
}
}
}
else
if
(
*
kbinput
==
'['
&&
key_buffer_len
>
0
&&
}
else
if
(
keycode
==
'['
&&
key_buffer_len
>
0
&&
'A'
<=
*
key_buffer
&&
*
key_buffer
<=
'D'
)
{
/* This is an iTerm2 sequence: ^[ ^[ [ X. */
double_esc
=
TRUE
;
...
...
@@ -466,7 +469,7 @@ int parse_kbinput(WINDOW *win)
* sequence mode. */
escapes
=
0
;
meta_key
=
TRUE
;
retval
=
parse_escape_sequence
(
win
,
*
kbinput
);
retval
=
parse_escape_sequence
(
win
,
keycode
);
}
break
;
case
3
:
...
...
@@ -475,14 +478,14 @@ int parse_kbinput(WINDOW *win)
if
(
get_key_buffer_len
()
==
0
)
/* Three escapes followed by a non-escape, and no
* other codes are waiting: normal input mode. */
retval
=
*
kbinput
;
retval
=
keycode
;
else
/* Three escapes followed by a non-escape, and more
* codes are waiting: combined control character and
* escape sequence mode. First interpret the escape
* sequence, then the result as a control sequence. */
retval
=
get_control_kbinput
(
parse_escape_sequence
(
win
,
*
kbinput
));
parse_escape_sequence
(
win
,
keycode
));
break
;
}
}
...
...
@@ -494,28 +497,28 @@ int parse_kbinput(WINDOW *win)
case
KEY_SLEFT
:
#endif
case
KEY_LEFT
:
retval
=
sc_seq_or
(
do_left
,
*
kbinput
);
retval
=
sc_seq_or
(
do_left
,
keycode
);
break
;
#ifdef KEY_SRIGHT
/* Slang doesn't support KEY_SRIGHT. */
case
KEY_SRIGHT
:
#endif
case
KEY_RIGHT
:
retval
=
sc_seq_or
(
do_right
,
*
kbinput
);
retval
=
sc_seq_or
(
do_right
,
keycode
);
break
;
#ifdef KEY_SUP
/* ncurses and Slang don't support KEY_SUP. */
case
KEY_SUP
:
#endif
case
KEY_UP
:
retval
=
sc_seq_or
(
do_up_void
,
*
kbinput
);
retval
=
sc_seq_or
(
do_up_void
,
keycode
);
break
;
#ifdef KEY_SDOWN
/* ncurses and Slang don't support KEY_SDOWN. */
case
KEY_SDOWN
:
#endif
case
KEY_DOWN
:
retval
=
sc_seq_or
(
do_down_void
,
*
kbinput
);
retval
=
sc_seq_or
(
do_down_void
,
keycode
);
break
;
#ifdef KEY_SHOME
/* HP-UX 10-11 and Slang don't support KEY_SHOME. */
...
...
@@ -525,7 +528,7 @@ int parse_kbinput(WINDOW *win)
case
KEY_HOME
:
#endif
case
KEY_A1
:
/* Home (7) on keypad with NumLock off. */
retval
=
sc_seq_or
(
do_home
,
*
kbinput
);
retval
=
sc_seq_or
(
do_home
,
keycode
);
break
;
#ifdef KEY_SEND
/* HP-UX 10-11 and Slang don't support KEY_SEND. */
...
...
@@ -535,22 +538,22 @@ int parse_kbinput(WINDOW *win)
case
KEY_END
:
#endif
case
KEY_C1
:
/* End (1) on keypad with NumLock off. */
retval
=
sc_seq_or
(
do_end
,
*
kbinput
);
retval
=
sc_seq_or
(
do_end
,
keycode
);
break
;
case
KEY_PPAGE
:
case
KEY_A3
:
/* PageUp (9) on keypad with NumLock off. */
retval
=
sc_seq_or
(
do_page_up
,
*
kbinput
);
retval
=
sc_seq_or
(
do_page_up
,
keycode
);
break
;
case
KEY_NPAGE
:
case
KEY_C3
:
/* PageDown (3) on keypad with NumLock off. */
retval
=
sc_seq_or
(
do_page_down
,
*
kbinput
);
retval
=
sc_seq_or
(
do_page_down
,
keycode
);
break
;
case
KEY_ENTER
:
retval
=
sc_seq_or
(
do_enter
,
*
kbinput
);
retval
=
sc_seq_or
(
do_enter
,
keycode
);
break
;
case
KEY_BACKSPACE
:
retval
=
sc_seq_or
(
do_backspace
,
*
kbinput
);
retval
=
sc_seq_or
(
do_backspace
,
keycode
);
break
;
#ifdef KEY_SDC
/* Slang doesn't support KEY_SDC. */
...
...
@@ -558,14 +561,14 @@ int parse_kbinput(WINDOW *win)
#endif
case
NANO_CONTROL_8
:
if
(
ISSET
(
REBIND_DELETE
))
retval
=
sc_seq_or
(
do_delete
,
*
kbinput
);
retval
=
sc_seq_or
(
do_delete
,
keycode
);
else
retval
=
sc_seq_or
(
do_backspace
,
*
kbinput
);
retval
=
sc_seq_or
(
do_backspace
,
keycode
);
break
;
#ifdef KEY_SIC
/* Slang doesn't support KEY_SIC. */
case
KEY_SIC
:
retval
=
sc_seq_or
(
do_insertfile_void
,
*
kbinput
);
retval
=
sc_seq_or
(
do_insertfile_void
,
keycode
);
break
;
#endif
#ifdef KEY_SBEG
...
...
@@ -638,11 +641,9 @@ int parse_kbinput(WINDOW *win)
}
#ifdef DEBUG
fprintf
(
stderr
,
"parse_kbinput(): kbinput = %d, meta_key = %s, func_key = %s, escapes = %d, byte_digits = %d, retval = %d
\n
"
,
*
kbinput
,
meta_key
?
"TRUE"
:
"FALSE"
,
func_key
?
"TRUE"
:
"FALSE"
,
escapes
,
byte_digits
,
retval
);
fprintf
(
stderr
,
"parse_kbinput(): kbinput = %d, meta_key = %s, func_key = %s, escapes = %d, byte_digits = %d, retval = %d
\n
"
,
keycode
,
meta_key
?
"TRUE"
:
"FALSE"
,
func_key
?
"TRUE"
:
"FALSE"
,
escapes
,
byte_digits
,
retval
);
#endif
free
(
kbinput
);
/* Return the result. */
return
retval
;
}
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Projects
Groups
Snippets
Help