From 1ed5e164def05a16dda12eb74d4d934dee79d1d6 Mon Sep 17 00:00:00 2001 From: hstyi Date: Fri, 8 Aug 2025 16:35:57 +0800 Subject: [PATCH] feat: linux window opacity --- src/main/kotlin/app/termora/SettingsOptionsPane.kt | 4 +++- src/main/kotlin/app/termora/TermoraFrameManager.kt | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/app/termora/SettingsOptionsPane.kt b/src/main/kotlin/app/termora/SettingsOptionsPane.kt index 0f43f77..14f4f17 100644 --- a/src/main/kotlin/app/termora/SettingsOptionsPane.kt +++ b/src/main/kotlin/app/termora/SettingsOptionsPane.kt @@ -21,6 +21,7 @@ import com.jgoodies.forms.layout.FormLayout import com.jthemedetecor.OsThemeDetector import com.sun.jna.LastErrorException import com.sun.jna.Native +import com.sun.jna.platform.WindowUtils import com.sun.jna.platform.win32.Shell32 import com.sun.jna.platform.win32.ShlObj import com.sun.jna.platform.win32.WinDef @@ -169,7 +170,8 @@ class SettingsOptionsPane : OptionsPane() { backgroundComBoBox.isEnabled = SystemInfo.isWindows || SystemInfo.isMacOS - opacitySpinner.isEnabled = SystemInfo.isMacOS || SystemInfo.isWindows + opacitySpinner.isEnabled = (SystemInfo.isMacOS || SystemInfo.isWindows) + || (SystemInfo.isLinux && WindowUtils.isWindowAlphaSupported()) opacitySpinner.model = object : SpinnerNumberModel(appearance.opacity, 0.1, 1.0, 0.1) { override fun getNextValue(): Any { return super.getNextValue() ?: maximum diff --git a/src/main/kotlin/app/termora/TermoraFrameManager.kt b/src/main/kotlin/app/termora/TermoraFrameManager.kt index 4c654fb..144e7bb 100644 --- a/src/main/kotlin/app/termora/TermoraFrameManager.kt +++ b/src/main/kotlin/app/termora/TermoraFrameManager.kt @@ -5,6 +5,7 @@ import app.termora.plugin.ExtensionManager import com.formdev.flatlaf.ui.FlatNativeWindowsLibrary import com.formdev.flatlaf.util.SystemInfo import com.sun.jna.Pointer +import com.sun.jna.platform.WindowUtils import com.sun.jna.platform.win32.User32 import com.sun.jna.platform.win32.WinDef import com.sun.jna.platform.win32.WinUser.* @@ -206,7 +207,7 @@ class TermoraFrameManager : Disposable { } fun setOpacity(opacity: Double) { - if (opacity < 0 || opacity > 1 || SystemInfo.isLinux) return + if (opacity < 0 || opacity > 1) return for (window in getWindows()) { setOpacity(window, opacity) } @@ -227,6 +228,8 @@ class TermoraFrameManager : Disposable { User32.INSTANCE.SetWindowLong(hwnd, GWL_EXSTYLE, exStyle or WS_EX_LAYERED) } User32.INSTANCE.SetLayeredWindowAttributes(hwnd, 0, alpha, LWA_ALPHA) + } else if (SystemInfo.isLinux && WindowUtils.isWindowAlphaSupported()) { + WindowUtils.setWindowAlpha(window, opacity.toFloat()) } }