Skip to content

Commit 476d377

Browse files
authored
Suppress ^C echo and trailing % on exit for live transcription commands (#23)
1 parent ea18cd0 commit 476d377

File tree

3 files changed

+48
-0
lines changed

3 files changed

+48
-0
lines changed

Sources/yap/Dictate.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,16 @@ struct Dictate: AsyncParsableCommand {
104104
let signalReadFD = signalPipe[0]
105105
dictateSignalWriteFD = signalPipe[1]
106106

107+
// Suppress ^C echo
108+
var originalTermios = termios()
109+
let hasTerminal = isatty(STDIN_FILENO) != 0
110+
if hasTerminal {
111+
tcgetattr(STDIN_FILENO, &originalTermios)
112+
var raw = originalTermios
113+
raw.c_lflag &= ~UInt(ECHOCTL)
114+
tcsetattr(STDIN_FILENO, TCSANOW, &raw)
115+
}
116+
107117
signal(SIGINT) { _ in
108118
_ = write(dictateSignalWriteFD, "x", 1)
109119
}
@@ -113,11 +123,16 @@ struct Dictate: AsyncParsableCommand {
113123
}
114124

115125
// Wait for SIGINT in background, then gracefully shut down
126+
nonisolated(unsafe) var savedTermios = originalTermios
127+
let restoreTerminal = hasTerminal
116128
Task.detached {
117129
var buf: UInt8 = 0
118130
_ = read(signalReadFD, &buf, 1)
119131
close(signalReadFD)
120132
close(dictateSignalWriteFD)
133+
if restoreTerminal {
134+
tcsetattr(STDIN_FILENO, TCSANOW, &savedTermios)
135+
}
121136
capture.stop()
122137
try? await analyzer.finalizeAndFinishThroughEndOfInput()
123138
}
@@ -130,6 +145,7 @@ struct Dictate: AsyncParsableCommand {
130145
fflush(stdout)
131146
}
132147
}
148+
print()
133149
}
134150
}
135151

Sources/yap/Listen.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,16 @@ struct Listen: AsyncParsableCommand {
135135
let signalReadFD = signalPipe[0]
136136
listenSignalWriteFD = signalPipe[1]
137137

138+
// Suppress ^C echo
139+
var originalTermios = termios()
140+
let hasTerminal = isatty(STDIN_FILENO) != 0
141+
if hasTerminal {
142+
tcgetattr(STDIN_FILENO, &originalTermios)
143+
var raw = originalTermios
144+
raw.c_lflag &= ~UInt(ECHOCTL)
145+
tcsetattr(STDIN_FILENO, TCSANOW, &raw)
146+
}
147+
138148
signal(SIGINT) { _ in
139149
_ = write(listenSignalWriteFD, "x", 1)
140150
}
@@ -145,11 +155,16 @@ struct Listen: AsyncParsableCommand {
145155

146156
// Wait for SIGINT in background, then gracefully shut down
147157
nonisolated(unsafe) let streamToStop = stream
158+
nonisolated(unsafe) var savedTermios = originalTermios
159+
let restoreTerminal = hasTerminal
148160
Task.detached {
149161
var buf: UInt8 = 0
150162
_ = read(signalReadFD, &buf, 1)
151163
close(signalReadFD)
152164
close(listenSignalWriteFD)
165+
if restoreTerminal {
166+
tcsetattr(STDIN_FILENO, TCSANOW, &savedTermios)
167+
}
153168
try? await streamToStop.stopCapture()
154169
inputContinuation.finish()
155170
try? await analyzer.finalizeAndFinishThroughEndOfInput()
@@ -163,6 +178,7 @@ struct Listen: AsyncParsableCommand {
163178
fflush(stdout)
164179
}
165180
}
181+
print()
166182
}
167183
}
168184

Sources/yap/ListenAndDictate.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,16 @@ struct ListenAndDictate: AsyncParsableCommand {
155155
let signalReadFD = signalPipe[0]
156156
listenAndDictateSignalWriteFD = signalPipe[1]
157157

158+
// Suppress ^C echo
159+
var originalTermios = termios()
160+
let hasTerminal = isatty(STDIN_FILENO) != 0
161+
if hasTerminal {
162+
tcgetattr(STDIN_FILENO, &originalTermios)
163+
var raw = originalTermios
164+
raw.c_lflag &= ~UInt(ECHOCTL)
165+
tcsetattr(STDIN_FILENO, TCSANOW, &raw)
166+
}
167+
158168
signal(SIGINT) { _ in
159169
_ = write(listenAndDictateSignalWriteFD, "x", 1)
160170
}
@@ -165,11 +175,16 @@ struct ListenAndDictate: AsyncParsableCommand {
165175

166176
// Wait for SIGINT in background, then gracefully shut down both pipelines
167177
nonisolated(unsafe) let streamToStop = stream
178+
nonisolated(unsafe) var savedTermios = originalTermios
179+
let restoreTerminal = hasTerminal
168180
Task.detached {
169181
var buf: UInt8 = 0
170182
_ = read(signalReadFD, &buf, 1)
171183
close(signalReadFD)
172184
close(listenAndDictateSignalWriteFD)
185+
if restoreTerminal {
186+
tcsetattr(STDIN_FILENO, TCSANOW, &savedTermios)
187+
}
173188
capture.stop()
174189
try? await streamToStop.stopCapture()
175190
sysInputContinuation.finish()
@@ -198,5 +213,6 @@ struct ListenAndDictate: AsyncParsableCommand {
198213
}
199214
}
200215
}
216+
print()
201217
}
202218
}

0 commit comments

Comments
 (0)