diff --git a/mordant/build.gradle.kts b/mordant/build.gradle.kts index 3c0a83b4..6aaf5be7 100644 --- a/mordant/build.gradle.kts +++ b/mordant/build.gradle.kts @@ -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> { binaries { diff --git a/mordant/src/mingwX64Main/kotlin/com/github/ajalt/mordant/internal/tty.kt b/mordant/src/mingwX64Main/kotlin/com/github/ajalt/mordant/internal/tty.kt new file mode 100644 index 00000000..f6e5158a --- /dev/null +++ b/mordant/src/mingwX64Main/kotlin/com/github/ajalt/mordant/internal/tty.kt @@ -0,0 +1,6 @@ +package com.github.ajalt.mordant.internal + +// hideInput is not currently implemented +internal actual fun ttySetEcho(echo: Boolean) { + +} \ No newline at end of file diff --git a/mordant/src/nativeMain/kotlin/com/github/ajalt/mordant/internal/MppImpl.kt b/mordant/src/nativeMain/kotlin/com/github/ajalt/mordant/internal/MppImpl.kt index 751105ef..9aabd1e0 100644 --- a/mordant/src/nativeMain/kotlin/com/github/ajalt/mordant/internal/MppImpl.kt +++ b/mordant/src/nativeMain/kotlin/com/github/ajalt/mordant/internal/MppImpl.kt @@ -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) diff --git a/mordant/src/posixMain/kotlin/com/github/ajalt/mordant/internal/tty.kt b/mordant/src/posixMain/kotlin/com/github/ajalt/mordant/internal/tty.kt new file mode 100644 index 00000000..b8c4ea31 --- /dev/null +++ b/mordant/src/posixMain/kotlin/com/github/ajalt/mordant/internal/tty.kt @@ -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() + check(tcgetattr(0, termios.ptr) == 0) { + error("tcgetattr() error: $errno") + } + + block(termios) + + check(tcsetattr(0, TCSADRAIN, termios.ptr) == 0) { + error("tcsetattr() error: $errno") + } + } +} \ No newline at end of file