summaryrefslogtreecommitdiff
path: root/src/read_chars.bash
diff options
context:
space:
mode:
Diffstat (limited to 'src/read_chars.bash')
-rw-r--r--src/read_chars.bash54
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
43readchar_init() 43readchar_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
68readchar_SIGCONT() 67stop_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
82check_foreground() 73check_foreground()
@@ -85,40 +76,26 @@ check_foreground()
85 [ "$tpgid" = "$pgrp" ] 76 [ "$tpgid" = "$pgrp" ]
86} 77}
87 78
88SOCAT()
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
97readchar() 79readchar()
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