mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-08-02 14:57:31 +03:00
macos: only show confirm quit on focused window
This commit is contained in:
@ -21,6 +21,7 @@
|
|||||||
A5CEAFFF29C2410700646FDA /* Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CEAFFE29C2410700646FDA /* Backport.swift */; };
|
A5CEAFFF29C2410700646FDA /* Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CEAFFE29C2410700646FDA /* Backport.swift */; };
|
||||||
A5D495A2299BEC7E00DD1313 /* GhosttyKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A5D495A1299BEC7E00DD1313 /* GhosttyKit.xcframework */; };
|
A5D495A2299BEC7E00DD1313 /* GhosttyKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A5D495A1299BEC7E00DD1313 /* GhosttyKit.xcframework */; };
|
||||||
A5FECBD729D1FC3900022361 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5FECBD629D1FC3900022361 /* ContentView.swift */; };
|
A5FECBD729D1FC3900022361 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5FECBD629D1FC3900022361 /* ContentView.swift */; };
|
||||||
|
A5FECBD929D2010400022361 /* WindowAccessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5FECBD829D2010400022361 /* WindowAccessor.swift */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
@ -40,6 +41,7 @@
|
|||||||
A5CEAFFE29C2410700646FDA /* Backport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Backport.swift; sourceTree = "<group>"; };
|
A5CEAFFE29C2410700646FDA /* Backport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Backport.swift; sourceTree = "<group>"; };
|
||||||
A5D495A1299BEC7E00DD1313 /* GhosttyKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = GhosttyKit.xcframework; sourceTree = "<group>"; };
|
A5D495A1299BEC7E00DD1313 /* GhosttyKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = GhosttyKit.xcframework; sourceTree = "<group>"; };
|
||||||
A5FECBD629D1FC3900022361 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
A5FECBD629D1FC3900022361 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
||||||
|
A5FECBD829D2010400022361 /* WindowAccessor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowAccessor.swift; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
@ -66,6 +68,7 @@
|
|||||||
A59444F629A2ED5200725BBA /* SettingsView.swift */,
|
A59444F629A2ED5200725BBA /* SettingsView.swift */,
|
||||||
A5CEAFFE29C2410700646FDA /* Backport.swift */,
|
A5CEAFFE29C2410700646FDA /* Backport.swift */,
|
||||||
A5FECBD629D1FC3900022361 /* ContentView.swift */,
|
A5FECBD629D1FC3900022361 /* ContentView.swift */,
|
||||||
|
A5FECBD829D2010400022361 /* WindowAccessor.swift */,
|
||||||
);
|
);
|
||||||
path = Sources;
|
path = Sources;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -201,6 +204,7 @@
|
|||||||
A55B7BB629B6F47F0055DE60 /* AppState.swift in Sources */,
|
A55B7BB629B6F47F0055DE60 /* AppState.swift in Sources */,
|
||||||
A5CEAFDC29B8009000646FDA /* SplitView.swift in Sources */,
|
A5CEAFDC29B8009000646FDA /* SplitView.swift in Sources */,
|
||||||
A55685E029A03A9F004303CE /* AppError.swift in Sources */,
|
A55685E029A03A9F004303CE /* AppError.swift in Sources */,
|
||||||
|
A5FECBD929D2010400022361 /* WindowAccessor.swift in Sources */,
|
||||||
A535B9DA299C569B0017E2E4 /* ErrorView.swift in Sources */,
|
A535B9DA299C569B0017E2E4 /* ErrorView.swift in Sources */,
|
||||||
A5B30535299BEAAA0047F10C /* GhosttyApp.swift in Sources */,
|
A5B30535299BEAAA0047F10C /* GhosttyApp.swift in Sources */,
|
||||||
A5CEAFFF29C2410700646FDA /* Backport.swift in Sources */,
|
A5CEAFFF29C2410700646FDA /* Backport.swift in Sources */,
|
||||||
|
@ -4,8 +4,13 @@ import GhosttyKit
|
|||||||
struct ContentView: View {
|
struct ContentView: View {
|
||||||
let ghostty: Ghostty.AppState
|
let ghostty: Ghostty.AppState
|
||||||
|
|
||||||
|
// We need access to our app delegate to know if we're quitting or not.
|
||||||
@EnvironmentObject private var appDelegate: AppDelegate
|
@EnvironmentObject private var appDelegate: AppDelegate
|
||||||
|
|
||||||
|
// We need access to our window to know if we're the key window to determine
|
||||||
|
// if we show the quit confirmation or not.
|
||||||
|
@State private var window: NSWindow?
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
switch ghostty.readiness {
|
switch ghostty.readiness {
|
||||||
case .loading:
|
case .loading:
|
||||||
@ -21,11 +26,18 @@ struct ContentView: View {
|
|||||||
NSApplication.shared.reply(toApplicationShouldTerminate: true)
|
NSApplication.shared.reply(toApplicationShouldTerminate: true)
|
||||||
}
|
}
|
||||||
case .ready:
|
case .ready:
|
||||||
|
let confirmQuitting = Binding<Bool>(get: {
|
||||||
|
self.appDelegate.confirmQuit && (self.window?.isKeyWindow ?? false)
|
||||||
|
}, set: {
|
||||||
|
self.appDelegate.confirmQuit = $0
|
||||||
|
})
|
||||||
|
|
||||||
Ghostty.TerminalSplit(onClose: Self.closeWindow)
|
Ghostty.TerminalSplit(onClose: Self.closeWindow)
|
||||||
.ghosttyApp(ghostty.app!)
|
.ghosttyApp(ghostty.app!)
|
||||||
|
.background(WindowAccessor(window: $window))
|
||||||
.confirmationDialog(
|
.confirmationDialog(
|
||||||
"Quit Ghostty?",
|
"Quit Ghostty?",
|
||||||
isPresented: $appDelegate.confirmQuit) {
|
isPresented: confirmQuitting) {
|
||||||
Button("Close Ghostty", role: .destructive) {
|
Button("Close Ghostty", role: .destructive) {
|
||||||
NSApplication.shared.reply(toApplicationShouldTerminate: true)
|
NSApplication.shared.reply(toApplicationShouldTerminate: true)
|
||||||
}
|
}
|
||||||
|
16
macos/Sources/WindowAccessor.swift
Normal file
16
macos/Sources/WindowAccessor.swift
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
/// Allows accessing the window that this view is a part of.
|
||||||
|
struct WindowAccessor: NSViewRepresentable {
|
||||||
|
@Binding var window: NSWindow?
|
||||||
|
|
||||||
|
func makeNSView(context: Context) -> NSView {
|
||||||
|
let view = NSView()
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.window = view.window
|
||||||
|
}
|
||||||
|
return view
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateNSView(_ nsView: NSView, context: Context) {}
|
||||||
|
}
|
Reference in New Issue
Block a user