diff options
author | Andrew Cady <d@jerkface.net> | 2024-08-24 10:48:43 -0400 |
---|---|---|
committer | Andrew Cady <d@jerkface.net> | 2024-08-24 10:55:16 -0400 |
commit | 411b7d3ca5937e6728dc06cc48a827bd79a69564 (patch) | |
tree | 240e069800c0feb04a16c2b2ad6e86482bad1356 /src/read_chars.bash | |
parent | a0105a3c44b260f26f362a146c9188f28cf6220a (diff) |
read-tty simplification that fixes ALL bugs
Diffstat (limited to 'src/read_chars.bash')
-rw-r--r-- | src/read_chars.bash | 54 |
1 files changed, 18 insertions, 36 deletions
diff --git a/src/read_chars.bash b/src/read_chars.bash index 5856e92..557b972 100644 --- a/src/read_chars.bash +++ b/src/read_chars.bash | |||
@@ -42,7 +42,7 @@ x() | |||
42 | 42 | ||
43 | readchar_init() | 43 | readchar_init() |
44 | { | 44 | { |
45 | declare -g SOCAT= SOCAT_PID= | 45 | declare -g INIT_TTY=y |
46 | declare -g t | 46 | declare -g t |
47 | declare -g -a readchar_termopts | 47 | declare -g -a readchar_termopts |
48 | 48 | ||
@@ -53,11 +53,10 @@ readchar_init() | |||
53 | quit undef | 53 | quit undef |
54 | ) | 54 | ) |
55 | 55 | ||
56 | trap "i EXIT; kill $SOCAT_PID 2>/dev/null; kill -CONT $SOCAT_PID 2>/dev/null" EXIT | 56 | trap "i CONT; INIT_TTY=y" CONT |
57 | trap "i CONT; readchar_SIGCONT" CONT | ||
58 | for sig in TSTP TTIN TTOU | 57 | for sig in TSTP TTIN TTOU |
59 | do | 58 | do |
60 | trap "i $sig; x kill -STOP \$BASHPID \$SOCAT_PID 2>/dev/null" $sig | 59 | trap "i $sig; stop_self" $sig |
61 | done | 60 | done |
62 | for sig in INT TERM | 61 | for sig in INT TERM |
63 | do | 62 | do |
@@ -65,18 +64,10 @@ readchar_init() | |||
65 | done | 64 | done |
66 | } | 65 | } |
67 | 66 | ||
68 | readchar_SIGCONT() | 67 | stop_self() |
69 | { | 68 | { |
70 | if check_foreground | 69 | INIT_TTY=y |
71 | then | 70 | kill -STOP $$ $BASHPID |
72 | if [ -t 0 ] | ||
73 | then | ||
74 | x cfmakeraw "${readchar_termopts[@]}" | ||
75 | fi | ||
76 | x kill -CONT $SOCAT_PID 2>/dev/null | ||
77 | else | ||
78 | x kill -STOP $BASHPID $SOCAT_PID 2>/dev/null | ||
79 | fi | ||
80 | } | 71 | } |
81 | 72 | ||
82 | check_foreground() | 73 | check_foreground() |
@@ -85,40 +76,26 @@ check_foreground() | |||
85 | [ "$tpgid" = "$pgrp" ] | 76 | [ "$tpgid" = "$pgrp" ] |
86 | } | 77 | } |
87 | 78 | ||
88 | SOCAT() | ||
89 | { | ||
90 | #BASH_ARGV0=socat-tty-sleeper | ||
91 | #echo -n "$0" >/proc/$BASHPID/comm | ||
92 | #trap 'sleep .25' SIGTSTP | ||
93 | #trap 'kill -INT $BASHPID 0' SIGTTIN SIGTTOU | ||
94 | exec -a user-ended-connection socat - - | ||
95 | } | ||
96 | |||
97 | readchar() | 79 | readchar() |
98 | { | 80 | { |
99 | declare -n REPLY="${1:-CHARACTER}" | 81 | declare -n REPLY="${1:-CHARACTER}" |
100 | 82 | ||
101 | if [ -t 0 ] | 83 | if [ -t 0 ] |
102 | then | 84 | then |
103 | if check_foreground | 85 | if ! check_foreground |
104 | then | 86 | then |
105 | if ! [ "$SOCAT_PID" ] | 87 | stop_self |
106 | then | ||
107 | x cfmakeraw "${readchar_termopts[@]}" | ||
108 | fi | ||
109 | else | ||
110 | sleep .25 | ||
111 | return | 88 | return |
112 | fi | 89 | fi |
113 | fi | 90 | fi |
114 | 91 | ||
115 | if ! [ "$SOCAT_PID" ] | 92 | if [ "$INIT_TTY" ] |
116 | then | 93 | then |
117 | exec {SOCAT}< <(SOCAT) | 94 | x cfmakeraw "${readchar_termopts[@]}" |
118 | SOCAT_PID=$! | 95 | INIT_TTY= |
119 | fi | 96 | fi |
120 | 97 | ||
121 | if POSIXLY_CORRECT=y read -n 1 -d '' -r -s -u "$SOCAT" | 98 | if POSIXLY_CORRECT=y read -n 1 -d '' -r -s |
122 | then | 99 | then |
123 | if [ "$t" ] | 100 | if [ "$t" ] |
124 | then | 101 | then |
@@ -140,7 +117,12 @@ readchar() | |||
140 | fi | 117 | fi |
141 | fi | 118 | fi |
142 | else | 119 | else |
143 | [ $? -gt 128 ] | 120 | r=$? |
121 | if [ "$r" = 148 ] | ||
122 | then | ||
123 | INIT_TTY=y | ||
124 | fi | ||
125 | [ $r -gt 128 ] | ||
144 | fi | 126 | fi |
145 | } | 127 | } |
146 | 128 | ||