From 5624a4410474e51c7fadec73baee5b702143ab56 Mon Sep 17 00:00:00 2001 From: hstyi Date: Sun, 20 Jul 2025 12:27:18 +0800 Subject: [PATCH] chore: vnc clipboard charset --- .../termora/plugins/vnc/VNCHostOptionsPane.kt | 26 ++++++++++++++++++- .../app/termora/plugins/vnc/VNCViewer.kt | 23 ++++++++-------- .../plugin/internal/BasicTerminalOption.kt | 2 +- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/plugins/vnc/src/main/kotlin/app/termora/plugins/vnc/VNCHostOptionsPane.kt b/plugins/vnc/src/main/kotlin/app/termora/plugins/vnc/VNCHostOptionsPane.kt index 955312d..174af86 100644 --- a/plugins/vnc/src/main/kotlin/app/termora/plugins/vnc/VNCHostOptionsPane.kt +++ b/plugins/vnc/src/main/kotlin/app/termora/plugins/vnc/VNCHostOptionsPane.kt @@ -2,11 +2,13 @@ package app.termora.plugins.vnc import app.termora.* import app.termora.plugin.internal.BasicProxyOption +import app.termora.plugin.internal.BasicTerminalOption import com.formdev.flatlaf.FlatClientProperties import com.formdev.flatlaf.extras.components.FlatComboBox import com.formdev.flatlaf.ui.FlatTextBorder import com.jgoodies.forms.builder.FormBuilder import com.jgoodies.forms.layout.FormLayout +import org.apache.commons.lang3.StringUtils import java.awt.BorderLayout import java.awt.Component import java.awt.KeyboardFocusManager @@ -19,12 +21,29 @@ import javax.swing.* internal open class VNCHostOptionsPane : OptionsPane() { protected val generalOption = GeneralOption() protected val proxyOption = BasicProxyOption(authenticationTypes = emptyList()) + private val terminalOption = object : BasicTerminalOption() { + override fun getTitle(): String { + return "VNC" + } + + override fun getIcon(isSelected: Boolean): Icon { + return VNCProtocolProvider.instance.getIcon() + } + }.apply { + showAltModifierComboBox = false + showCharsetComboBox = true + init() + + charsetComboBox.selectedItem = "ISO-8859-1" + + } + protected val owner: Window get() = SwingUtilities.getWindowAncestor(this) init { addOption(generalOption) addOption(proxyOption) - + addOption(terminalOption) } @@ -65,6 +84,9 @@ internal open class VNCHostOptionsPane : OptionsPane() { proxy = proxy, sort = System.currentTimeMillis(), remark = generalOption.remarkTextArea.text, + options = Options.Default.copy( + encoding = terminalOption.charsetComboBox.selectedItem?.toString() ?: "ISO-8859-1" + ) ) } @@ -78,6 +100,8 @@ internal open class VNCHostOptionsPane : OptionsPane() { generalOption.passwordTextField.text = host.authentication.password } + terminalOption.charsetComboBox.selectedItem = StringUtils.defaultIfBlank(host.options.encoding, "ISO-8859-1") + proxyOption.proxyTypeComboBox.selectedItem = host.proxy.type proxyOption.proxyHostTextField.text = host.proxy.host proxyOption.proxyPasswordTextField.text = host.proxy.password diff --git a/plugins/vnc/src/main/kotlin/app/termora/plugins/vnc/VNCViewer.kt b/plugins/vnc/src/main/kotlin/app/termora/plugins/vnc/VNCViewer.kt index d67b4ec..ab9f481 100644 --- a/plugins/vnc/src/main/kotlin/app/termora/plugins/vnc/VNCViewer.kt +++ b/plugins/vnc/src/main/kotlin/app/termora/plugins/vnc/VNCViewer.kt @@ -1,6 +1,7 @@ package app.termora.plugins.vnc import app.termora.* +import com.glavsoft.rfb.ClipboardController import com.glavsoft.rfb.client.KeyEventMessage import com.glavsoft.rfb.encoding.EncodingType import com.glavsoft.rfb.protocol.Protocol @@ -14,13 +15,13 @@ import com.glavsoft.viewer.swing.ClipboardControllerImpl import com.glavsoft.viewer.swing.Surface import kotlinx.coroutines.* import kotlinx.coroutines.swing.Swing +import org.apache.commons.lang3.StringUtils import org.apache.commons.lang3.exception.ExceptionUtils import java.awt.AWTEvent import java.awt.BorderLayout import java.awt.Graphics import java.awt.event.AWTEventListener import java.awt.event.ActionEvent -import java.awt.event.MouseAdapter import java.awt.event.MouseEvent import java.net.InetSocketAddress import java.net.Proxy @@ -35,6 +36,7 @@ class VNCViewer(private val host: Host) : JPanel(BorderLayout()), Disposable { private var surface: Surface? = null private var protocol: Protocol? = null private var uiSettings: UiSettings? = null + private var clipboardController: ClipboardController? = null private val layeredPane = LayeredPane() private val toolbar = MyToolbar() @@ -108,8 +110,13 @@ class VNCViewer(private val host: Host) : JPanel(BorderLayout()), Disposable { uiSettings.addListener(surface) protocolSettings.addListener(surface) + val encoding = StringUtils.defaultIfBlank(host.options.encoding, "ISO-8859-1") + val clipboardController = ClipboardControllerImpl(protocol, encoding).also { this.clipboardController = it } + protocol.handshake() - protocol.startNormalHandling({ disconnect() }, surface, ClipboardControllerImpl(protocol, "GBK")) + protocol.startNormalHandling({ disconnect() }, surface, clipboardController) + + executorService.execute(clipboardController) withContext(Dispatchers.Swing) { scrollPane.setViewportView(surface) @@ -118,7 +125,9 @@ class VNCViewer(private val host: Host) : JPanel(BorderLayout()), Disposable { private fun disconnect() { socket?.close() + clipboardController?.setEnabled(false) + clipboardController = null protocol = null surface = null socket = null @@ -200,16 +209,6 @@ class VNCViewer(private val host: Host) : JPanel(BorderLayout()), Disposable { } }) - addMouseListener(object : MouseAdapter() { - override fun mouseEntered(e: MouseEvent) { - println("Enter") - } - - override fun mouseExited(e: MouseEvent) { - println("Exit") - } - }) - } override fun eventDispatched(event: AWTEvent) { diff --git a/src/main/kotlin/app/termora/plugin/internal/BasicTerminalOption.kt b/src/main/kotlin/app/termora/plugin/internal/BasicTerminalOption.kt index d1d6114..09f3f0f 100644 --- a/src/main/kotlin/app/termora/plugin/internal/BasicTerminalOption.kt +++ b/src/main/kotlin/app/termora/plugin/internal/BasicTerminalOption.kt @@ -18,7 +18,7 @@ import java.awt.KeyboardFocusManager import java.nio.charset.Charset import javax.swing.* -class BasicTerminalOption() : JPanel(BorderLayout()), Option { +open class BasicTerminalOption() : JPanel(BorderLayout()), Option { var showCharsetComboBox: Boolean = false var showStartupCommandTextField: Boolean = false