diff --git a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ServerMain.kt b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ServerMain.kt index 56aba7a..2380088 100644 --- a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ServerMain.kt +++ b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ServerMain.kt @@ -17,8 +17,8 @@ fun main(vararg args: String) = singleInstance(args) { ProcessManager.stop() }) } else { - } KeyboardManager.registerKeyboardHook() + } if (!ApplicationParams.isAutostart) { ProcessManager.start() diff --git a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/SettingsWindow.kt b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/SettingsWindow.kt index 644cc46..fe60f70 100644 --- a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/SettingsWindow.kt +++ b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/SettingsWindow.kt @@ -1,10 +1,12 @@ package app.cleanmeter.target.desktop.ui.settings import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.IntOffset @@ -16,6 +18,12 @@ import androidx.compose.ui.window.rememberWindowState import app.cleanmeter.target.desktop.data.PREFERENCE_START_MINIMIZED import app.cleanmeter.target.desktop.data.PreferencesRepository import com.github.kwhat.jnativehook.GlobalScreen +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import java.awt.GraphicsEnvironment +import java.awt.event.ComponentAdapter +import java.awt.event.ComponentEvent +import kotlin.math.min @Composable fun ApplicationScope.SettingsWindow( @@ -23,6 +31,8 @@ fun ApplicationScope.SettingsWindow( getOverlayPosition: () -> IntOffset, onApplicationExit: () -> Unit, ) { + val maximumWindowBounds = remember { GraphicsEnvironment.getLocalGraphicsEnvironment().maximumWindowBounds.height } + val minimumHeight = remember { min(800, maximumWindowBounds) } var isVisible by remember { mutableStateOf( PreferencesRepository.getPreferenceBooleanNullable( @@ -32,7 +42,7 @@ fun ApplicationScope.SettingsWindow( } val icon = painterResource("imgs/logo.png") val state = rememberWindowState().apply { - size = DpSize(650.dp, 650.dp) + size = DpSize(650.dp, minimumHeight.dp) } Window( @@ -41,10 +51,25 @@ fun ApplicationScope.SettingsWindow( icon = icon, visible = isVisible, title = "Clean Meter", - resizable = false, + resizable = true, undecorated = true, transparent = true, ) { + LaunchedEffect(state) { + snapshotFlow { state.size } + .onEach { + var size = it + if (it.width != 650.dp) { + size = it.copy(width = 650.dp) + } + if (it.height < minimumHeight.dp || it.height > maximumWindowBounds.dp ) { + size = it.copy(height = minimumHeight.dp) + } + state.size = size + } + .launchIn(this) + } + Settings( isDarkTheme = isDarkTheme, onCloseRequest = { isVisible = false },