From f0102b6f13b0e0646ebdab9a5cfa0208603a5b7c Mon Sep 17 00:00:00 2001 From: hstyi Date: Thu, 10 Jul 2025 16:13:50 +0800 Subject: [PATCH] fix: windows tray icon size --- .../kotlin/app/termora/ApplicationRunner.kt | 66 ++++++++++++++++--- src/main/resources/i18n/messages.properties | 1 + .../resources/i18n/messages_ru_RU.properties | 1 + .../resources/i18n/messages_zh_CN.properties | 1 + .../resources/i18n/messages_zh_TW.properties | 1 + 5 files changed, 61 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/app/termora/ApplicationRunner.kt b/src/main/kotlin/app/termora/ApplicationRunner.kt index 68d83d7..c7a639b 100644 --- a/src/main/kotlin/app/termora/ApplicationRunner.kt +++ b/src/main/kotlin/app/termora/ApplicationRunner.kt @@ -24,12 +24,13 @@ import java.awt.* import java.awt.desktop.AppReopenedEvent import java.awt.desktop.AppReopenedListener import java.awt.desktop.SystemEventListener -import java.awt.event.ActionEvent -import java.awt.event.WindowEvent +import java.awt.event.* import java.util.* import java.util.concurrent.CountDownLatch import javax.imageio.ImageIO import javax.swing.* +import javax.swing.event.PopupMenuEvent +import javax.swing.event.PopupMenuListener import kotlin.system.exitProcess class ApplicationRunner { @@ -112,16 +113,63 @@ class ApplicationRunner { if (!SystemInfo.isWindows || !SystemTray.isSupported()) return val tray = SystemTray.getSystemTray() - val image = ImageIO.read(TermoraFrame::class.java.getResourceAsStream("/icons/termora_16x16.png")) + val image = ImageIO.read(TermoraFrame::class.java.getResourceAsStream("/icons/termora_32x32.png")) val trayIcon = TrayIcon(image) - val popupMenu = PopupMenu() - trayIcon.popupMenu = popupMenu + val dialog = JDialog() + val trayPopup = JPopupMenu() + + dialog.isUndecorated = true + dialog.isModal = false + dialog.size = Dimension(0, 0) + + trayIcon.isImageAutoSize = true trayIcon.toolTip = Application.getName() - // PopupMenu 不支持中文 - val exitMenu = MenuItem("Exit") - exitMenu.addActionListener { SwingUtilities.invokeLater { quitHandler() } } - popupMenu.add(exitMenu) + trayPopup.add(I18n.getString("termora.exit")).addActionListener { quitHandler() } + trayPopup.addPopupMenuListener(object : PopupMenuListener { + override fun popupMenuWillBecomeVisible(e: PopupMenuEvent?) { + + } + + override fun popupMenuWillBecomeInvisible(e: PopupMenuEvent?) { + SwingUtilities.invokeLater { + if (dialog.isVisible) { + dialog.isVisible = false + } + } + } + + override fun popupMenuCanceled(e: PopupMenuEvent?) { + popupMenuWillBecomeInvisible(e) + } + + }) + + trayIcon.addMouseListener(object : MouseAdapter() { + override fun mouseReleased(e: MouseEvent) { + maybeShowPopup(e) + } + + override fun mousePressed(e: MouseEvent) { + maybeShowPopup(e) + } + + private fun maybeShowPopup(e: MouseEvent) { + if (e.isPopupTrigger) { + val mouseLocation = MouseInfo.getPointerInfo().location + trayPopup.setLocation(mouseLocation.x, mouseLocation.y) + trayPopup.setInvoker(dialog) + dialog.isVisible = true + trayPopup.isVisible = true + } + } + }) + + dialog.addWindowFocusListener(object : WindowAdapter() { + override fun windowLostFocus(e: WindowEvent) { + dialog.isVisible = false + } + }) // double click trayIcon.addActionListener(object : AbstractAction() { diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties index 4e4d26e..dd31351 100644 --- a/src/main/resources/i18n/messages.properties +++ b/src/main/resources/i18n/messages.properties @@ -1,5 +1,6 @@ termora.title=Termora termora.confirm=OK +termora.exit=退出 termora.cancel=Cancel termora.copy=Copy termora.apply=Apply diff --git a/src/main/resources/i18n/messages_ru_RU.properties b/src/main/resources/i18n/messages_ru_RU.properties index 2494f9d..f44de88 100644 --- a/src/main/resources/i18n/messages_ru_RU.properties +++ b/src/main/resources/i18n/messages_ru_RU.properties @@ -1,5 +1,6 @@ termora.title=Termora termora.confirm=Ок +termora.exit=покидать termora.cancel=Отмена termora.copy=Копировать termora.apply=Применить diff --git a/src/main/resources/i18n/messages_zh_CN.properties b/src/main/resources/i18n/messages_zh_CN.properties index d75760d..ed58d7d 100644 --- a/src/main/resources/i18n/messages_zh_CN.properties +++ b/src/main/resources/i18n/messages_zh_CN.properties @@ -1,4 +1,5 @@ termora.confirm=确认 +termora.exit=退出 termora.cancel=取消 termora.copy=复制 termora.apply=应用 diff --git a/src/main/resources/i18n/messages_zh_TW.properties b/src/main/resources/i18n/messages_zh_TW.properties index 47d626d..9819421 100644 --- a/src/main/resources/i18n/messages_zh_TW.properties +++ b/src/main/resources/i18n/messages_zh_TW.properties @@ -1,4 +1,5 @@ termora.confirm=確定 +termora.exit=Exit termora.cancel=取消 termora.apply=应用 termora.save=儲存