Skip to content

Commit

Permalink
implement 'hideInput' on posix systems (#63)
Browse files Browse the repository at this point in the history
  • Loading branch information
martinbonnin committed Jul 23, 2022
1 parent d7026d5 commit 256f872
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 6 deletions.
8 changes: 4 additions & 4 deletions mordant/build.gradle.kts
Expand Up @@ -64,13 +64,13 @@ kotlin {
}

val nativeMain by creating { dependsOn(commonMain) }
val macosMain by creating { dependsOn(nativeMain) }
val mingwX64Main by getting { dependsOn(nativeMain) }
val posixMain by creating { dependsOn(nativeMain) }
val linuxX64Main by getting { dependsOn(posixMain) }
val macosMain by creating { dependsOn(posixMain) }
listOf("macosX64", "macosArm64").forEach { target ->
getByName(target + "Main").dependsOn(macosMain)
}
listOf("macos", "linuxX64", "mingwX64").forEach { target ->
getByName(target + "Main").dependsOn(nativeMain)
}

targets.withType<KotlinNativeTargetWithTests<*>> {
binaries {
Expand Down
@@ -0,0 +1,6 @@
package com.github.ajalt.mordant.internal

// hideInput is not currently implemented
internal actual fun ttySetEcho(echo: Boolean) {

}
Expand Up @@ -54,9 +54,19 @@ internal actual fun printStderr(message: String, newline: Boolean) {
fflush(stderr)
}

internal expect fun ttySetEcho(echo: Boolean)

// hideInput is not currently implemented
internal actual fun readLineOrNullMpp(hideInput: Boolean): String? = readlnOrNull()
internal actual fun readLineOrNullMpp(hideInput: Boolean): String? {
if (hideInput) {
ttySetEcho(false)
}
val lineOrNull = readlnOrNull()
if (hideInput) {
ttySetEcho(true)
}

return lineOrNull
}

internal actual fun makePrintingTerminalCursor(terminal: Terminal): TerminalCursor = NativeTerminalCursor(terminal)

Expand Down
@@ -0,0 +1,30 @@
package com.github.ajalt.mordant.internal

import kotlinx.cinterop.*
import platform.posix.*

@OptIn(UnsafeNumber::class)
internal actual fun ttySetEcho(echo: Boolean) {
updateTermios {
c_lflag = if (echo) {
c_lflag.or(ECHO.convert())
} else {
c_lflag.and(ECHO.inv().convert())
}
}
}

private fun updateTermios(block: termios.() -> Unit) {
memScoped {
val termios = alloc<termios>()
check(tcgetattr(0, termios.ptr) == 0) {
error("tcgetattr() error: $errno")
}

block(termios)

check(tcsetattr(0, TCSADRAIN, termios.ptr) == 0) {
error("tcsetattr() error: $errno")
}
}
}

0 comments on commit 256f872

Please sign in to comment.