desktop: prevent deadlock (#2785)

* desktop: prevent deadlock

* debug info
This commit is contained in:
Stanislav Dmitrenko 2023-07-27 17:59:06 +03:00 committed by GitHub
parent bb02f07370
commit d77980e50e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 9 deletions

View File

@ -56,7 +56,7 @@ object ChatModel {
val chatItems = mutableStateListOf<ChatItem>() val chatItems = mutableStateListOf<ChatItem>()
val groupMembers = mutableStateListOf<GroupMember>() val groupMembers = mutableStateListOf<GroupMember>()
val terminalItems = mutableStateListOf<TerminalItem>() val terminalItems = mutableStateOf(emptyList<TerminalItem>())
val userAddress = mutableStateOf<UserContactLinkRec?>(null) val userAddress = mutableStateOf<UserContactLinkRec?>(null)
// Allows to temporary save servers that are being edited on multiple screens // Allows to temporary save servers that are being edited on multiple screens
val userSMPServersUnsaved = mutableStateOf<(List<ServerCfg>)?>(null) val userSMPServersUnsaved = mutableStateOf<(List<ServerCfg>)?>(null)
@ -484,10 +484,11 @@ object ChatModel {
networkStatuses[contact.activeConn.agentConnId] ?: NetworkStatus.Unknown() networkStatuses[contact.activeConn.agentConnId] ?: NetworkStatus.Unknown()
fun addTerminalItem(item: TerminalItem) { fun addTerminalItem(item: TerminalItem) {
if (terminalItems.size >= 500) { if (terminalItems.value.size >= 500) {
terminalItems.removeAt(0) terminalItems.value = terminalItems.value.takeLast(499) + item
} else {
terminalItems.value += item
} }
terminalItems.add(item)
} }
} }

View File

@ -34,7 +34,7 @@ fun TerminalView(chatModel: ChatModel, close: () -> Unit) {
close() close()
}) })
TerminalLayout( TerminalLayout(
remember { chatModel.terminalItems }, chatModel.terminalItems,
composeState, composeState,
sendCommand = { sendCommand(chatModel, composeState) }, sendCommand = { sendCommand(chatModel, composeState) },
close close
@ -62,7 +62,7 @@ private fun sendCommand(chatModel: ChatModel, composeState: MutableState<Compose
@Composable @Composable
fun TerminalLayout( fun TerminalLayout(
terminalItems: List<TerminalItem>, terminalItems: MutableState<List<TerminalItem>>,
composeState: MutableState<ComposeState>, composeState: MutableState<ComposeState>,
sendCommand: () -> Unit, sendCommand: () -> Unit,
close: () -> Unit close: () -> Unit
@ -115,12 +115,12 @@ fun TerminalLayout(
private var lazyListState = 0 to 0 private var lazyListState = 0 to 0
@Composable @Composable
fun TerminalLog(terminalItems: List<TerminalItem>) { fun TerminalLog(terminalItems: MutableState<List<TerminalItem>>) {
val listState = rememberLazyListState(lazyListState.first, lazyListState.second) val listState = rememberLazyListState(lazyListState.first, lazyListState.second)
DisposableEffect(Unit) { DisposableEffect(Unit) {
onDispose { lazyListState = listState.firstVisibleItemIndex to listState.firstVisibleItemScrollOffset } onDispose { lazyListState = listState.firstVisibleItemIndex to listState.firstVisibleItemScrollOffset }
} }
val reversedTerminalItems by remember { derivedStateOf { terminalItems.reversed().toList() } } val reversedTerminalItems by remember { derivedStateOf { terminalItems.value.reversed().toList() } }
val clipboard = LocalClipboardManager.current val clipboard = LocalClipboardManager.current
LazyColumn(state = listState, reverseLayout = true) { LazyColumn(state = listState, reverseLayout = true) {
items(reversedTerminalItems) { item -> items(reversedTerminalItems) { item ->
@ -152,7 +152,7 @@ fun TerminalLog(terminalItems: List<TerminalItem>) {
fun PreviewTerminalLayout() { fun PreviewTerminalLayout() {
SimpleXTheme { SimpleXTheme {
TerminalLayout( TerminalLayout(
terminalItems = TerminalItem.sampleData, terminalItems = remember { mutableStateOf(TerminalItem.sampleData) },
composeState = remember { mutableStateOf(ComposeState(useLinkPreviews = false)) }, composeState = remember { mutableStateOf(ComposeState(useLinkPreviews = false)) },
sendCommand = {}, sendCommand = {},
close = {} close = {}

View File

@ -30,8 +30,16 @@ kotlin {
compose { compose {
desktop { desktop {
application { application {
// For debugging via VisualVM
/*jvmArgs += listOf(
"-Dcom.sun.management.jmxremote.port=8080",
"-Dcom.sun.management.jmxremote.ssl=false",
"-Dcom.sun.management.jmxremote.authenticate=false"
)*/
mainClass = "chat.simplex.desktop.MainKt" mainClass = "chat.simplex.desktop.MainKt"
nativeDistributions { nativeDistributions {
// For debugging via VisualVM
//modules("jdk.zipfs", "jdk.management.agent")
modules("jdk.zipfs") modules("jdk.zipfs")
//includeAllModules = true //includeAllModules = true
outputBaseDir.set(project.file("../release")) outputBaseDir.set(project.file("../release"))