fix: default to gpu rendering with optional user config override

This commit is contained in:
zaneschepke
2026-03-28 01:29:52 -04:00
parent d19db57265
commit cf4dd23b45
5 changed files with 86 additions and 4 deletions
@@ -109,7 +109,7 @@ val serviceModule = module {
} }
single<DaemonService> { UdsDaemonService(get(), get(), get()) } single<DaemonService> { UdsDaemonService(get(), get(), get()) }
single<TunnelService> { UdsTunnelService(get(), tunnelRepository = get()) } single<TunnelService> { UdsTunnelService(get(), tunnelRepository = get()) }
single<BackendService> { UdsBackendService(get(), get(), get(), get(), get()) } single<BackendService> { UdsBackendService(get(), get(), get(), get()) }
single<TunnelImportService> { DefaultTunnelImportService(get()) } single<TunnelImportService> { DefaultTunnelImportService(get()) }
} }
@@ -22,6 +22,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.application import androidx.compose.ui.window.application
import androidx.compose.ui.window.rememberWindowState import androidx.compose.ui.window.rememberWindowState
import co.touchlab.kermit.Logger
import com.dokar.sonner.ToastType import com.dokar.sonner.ToastType
import com.dokar.sonner.Toaster import com.dokar.sonner.Toaster
import com.dokar.sonner.rememberToasterState import com.dokar.sonner.rememberToasterState
@@ -44,6 +45,8 @@ import com.zaneschepke.wireguardautotunnel.desktop.ui.screens.tunnels.components
import com.zaneschepke.wireguardautotunnel.desktop.ui.state.TrayBadgeState import com.zaneschepke.wireguardautotunnel.desktop.ui.state.TrayBadgeState
import com.zaneschepke.wireguardautotunnel.desktop.ui.theme.ErrorRed import com.zaneschepke.wireguardautotunnel.desktop.ui.theme.ErrorRed
import com.zaneschepke.wireguardautotunnel.desktop.ui.theme.WGTunnelTheme import com.zaneschepke.wireguardautotunnel.desktop.ui.theme.WGTunnelTheme
import com.zaneschepke.wireguardautotunnel.desktop.util.FileUtils
import com.zaneschepke.wireguardautotunnel.desktop.util.RenderingMode
import com.zaneschepke.wireguardautotunnel.desktop.viewmodel.AppViewModel import com.zaneschepke.wireguardautotunnel.desktop.viewmodel.AppViewModel
import io.github.kdroidfilter.nucleus.energymanager.EnergyManager import io.github.kdroidfilter.nucleus.energymanager.EnergyManager
import io.github.kdroidfilter.nucleus.hidpi.getLinuxNativeScaleFactor import io.github.kdroidfilter.nucleus.hidpi.getLinuxNativeScaleFactor
@@ -62,8 +65,17 @@ import org.orbitmvi.orbit.compose.collectAsState
@OptIn(ExperimentalTrayAppApi::class) @OptIn(ExperimentalTrayAppApi::class)
fun main() { fun main() {
System.setProperty("skiko.renderApi", "SOFTWARE_FASTEST") val appConfig = FileUtils.loadAppConfig()
when (appConfig.renderingMode) {
RenderingMode.SOFTWARE -> {
System.setProperty("skiko.renderApi", "SOFTWARE_FASTEST")
Logger.i { "Running app with SOFTWARE rendering" }
}
RenderingMode.HARDWARE -> {
Logger.i { "Running app with default hardware acceleration" }
}
}
// HiDPI detection for Linux // HiDPI detection for Linux
if (System.getProperty("sun.java2d.uiScale") == null) { if (System.getProperty("sun.java2d.uiScale") == null) {
val scale = getLinuxNativeScaleFactor() val scale = getLinuxNativeScaleFactor()
@@ -0,0 +1,19 @@
package com.zaneschepke.wireguardautotunnel.desktop.util
import java.util.Properties
data class AppConfig(val renderingMode: RenderingMode = RenderingMode.HARDWARE) {
companion object {
fun fromProperties(props: Properties): AppConfig {
val rendering = props.getProperty("rendering", "hardware")
return AppConfig(renderingMode = RenderingMode.fromString(rendering))
}
}
fun toProperties(): Properties {
val props = Properties()
props.setProperty("rendering", renderingMode.name.lowercase())
return props
}
}
@@ -1,6 +1,9 @@
package com.zaneschepke.wireguardautotunnel.desktop.util package com.zaneschepke.wireguardautotunnel.desktop.util
import co.touchlab.kermit.Logger
import com.zaneschepke.wireguardautotunnel.core.helper.FilePathsHelper.getDatabaseDir
import java.io.* import java.io.*
import java.util.Properties
import java.util.zip.ZipEntry import java.util.zip.ZipEntry
import java.util.zip.ZipInputStream import java.util.zip.ZipInputStream
import java.util.zip.ZipOutputStream import java.util.zip.ZipOutputStream
@@ -59,7 +62,41 @@ object FileUtils {
return byteArrayOutputStream.toByteArray() return byteArrayOutputStream.toByteArray()
} }
fun getNameFromFileName(fileName: String): String { fun getConfigFile(): File {
return fileName.substringBeforeLast(".") val configDir = getDatabaseDir()
if (!configDir.exists()) configDir.mkdirs()
return File(configDir, "config.properties")
}
fun loadAppConfig(): AppConfig {
val configFile = getConfigFile()
if (!configFile.exists()) {
createDefaultConfigTemplate(configFile)
}
return try {
val props = Properties()
configFile.inputStream().use { props.load(it) }
AppConfig.fromProperties(props)
} catch (_: Exception) {
Logger.w { "Could not read config.properties, using defaults" }
AppConfig()
}
}
private fun createDefaultConfigTemplate(file: File) {
file.writeText(
"""
# WireGuard Auto Tunnel - Advanced Configuration
# Edit this file and restart the app for changes to apply.
#
# rendering=hardware (default, best performance, recommended)
# rendering=software (use only if you have issues rendering the app)
#
rendering=hardware
"""
.trimIndent()
)
} }
} }
@@ -0,0 +1,14 @@
package com.zaneschepke.wireguardautotunnel.desktop.util
enum class RenderingMode {
HARDWARE,
SOFTWARE;
companion object {
fun fromString(value: String?): RenderingMode =
when (value?.trim()?.lowercase()) {
"software" -> SOFTWARE
else -> HARDWARE
}
}
}