feat: ⌘ + Q to exit prompt

This commit is contained in:
hstyi
2025-02-18 23:13:56 +08:00
committed by hstyi
parent 3cd9f92ea9
commit af1f979e31
2 changed files with 44 additions and 0 deletions

View File

@@ -4,6 +4,8 @@ import app.termora.actions.ActionManager
import app.termora.keymap.KeymapManager import app.termora.keymap.KeymapManager
import com.formdev.flatlaf.FlatClientProperties import com.formdev.flatlaf.FlatClientProperties
import com.formdev.flatlaf.FlatSystemProperties import com.formdev.flatlaf.FlatSystemProperties
import com.formdev.flatlaf.extras.FlatDesktop
import com.formdev.flatlaf.extras.FlatDesktop.QuitResponse
import com.formdev.flatlaf.extras.FlatInspector import com.formdev.flatlaf.extras.FlatInspector
import com.formdev.flatlaf.util.SystemInfo import com.formdev.flatlaf.util.SystemInfo
import com.jthemedetecor.OsThemeDetector import com.jthemedetecor.OsThemeDetector
@@ -20,12 +22,14 @@ import org.apache.commons.lang3.SystemUtils
import org.json.JSONObject import org.json.JSONObject
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.tinylog.configuration.Configuration import org.tinylog.configuration.Configuration
import java.awt.KeyboardFocusManager
import java.io.File import java.io.File
import java.nio.channels.FileChannel import java.nio.channels.FileChannel
import java.nio.channels.FileLock import java.nio.channels.FileLock
import java.nio.file.Paths import java.nio.file.Paths
import java.nio.file.StandardOpenOption import java.nio.file.StandardOpenOption
import java.util.* import java.util.*
import java.util.function.Consumer
import javax.swing.* import javax.swing.*
import kotlin.system.exitProcess import kotlin.system.exitProcess
import kotlin.system.measureTimeMillis import kotlin.system.measureTimeMillis
@@ -123,7 +127,37 @@ class ApplicationRunner {
} }
private fun startMainFrame() { private fun startMainFrame() {
TermoraFrameManager.getInstance().createWindow().isVisible = true TermoraFrameManager.getInstance().createWindow().isVisible = true
if (SystemUtils.IS_OS_MAC_OSX) {
SwingUtilities.invokeLater {
FlatDesktop.setQuitHandler(object : Consumer<QuitResponse> {
override fun accept(response: QuitResponse) {
quitHandler(response)
}
})
}
}
}
private fun quitHandler(response: QuitResponse) {
val keyboardFocusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager()
if (OptionPane.showConfirmDialog(
keyboardFocusManager.focusedWindow,
I18n.getString("termora.quit-confirm", Application.getName()),
optionType = JOptionPane.YES_NO_OPTION,
) != JOptionPane.YES_OPTION
) {
response.cancelQuit()
return
}
for (frame in TermoraFrameManager.getInstance().getWindows()) {
frame.dispose()
}
} }
private fun loadSettings() { private fun loadSettings() {

View File

@@ -19,6 +19,8 @@ class TermoraFrameManager {
} }
} }
private val frames = mutableListOf<TermoraFrame>()
fun createWindow(): TermoraFrame { fun createWindow(): TermoraFrame {
val frame = TermoraFrame() val frame = TermoraFrame()
registerCloseCallback(frame) registerCloseCallback(frame)
@@ -26,14 +28,22 @@ class TermoraFrameManager {
frame.defaultCloseOperation = DO_NOTHING_ON_CLOSE frame.defaultCloseOperation = DO_NOTHING_ON_CLOSE
frame.setSize(1280, 800) frame.setSize(1280, 800)
frame.setLocationRelativeTo(null) frame.setLocationRelativeTo(null)
frames.add(frame)
return frame return frame
} }
fun getWindows(): Array<TermoraFrame> {
return frames.toTypedArray()
}
private fun registerCloseCallback(window: TermoraFrame) { private fun registerCloseCallback(window: TermoraFrame) {
window.addWindowListener(object : WindowAdapter() { window.addWindowListener(object : WindowAdapter() {
override fun windowClosed(e: WindowEvent) { override fun windowClosed(e: WindowEvent) {
// 删除
frames.remove(window)
// dispose windowScope // dispose windowScope
Disposer.dispose(ApplicationScope.forWindowScope(e.window)) Disposer.dispose(ApplicationScope.forWindowScope(e.window))