Skip to content

Commit 283c1a4

Browse files
authored
Merge pull request #621 from Kyle-Ye/bugfix/windows
Terminate Xcodes app after last window closed
2 parents cf85e2f + 59331bc commit 283c1a4

4 files changed

Lines changed: 266 additions & 1 deletion

File tree

Xcodes/Backend/AppState.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,12 @@ class AppState: ObservableObject {
130130
}
131131
}
132132

133+
@Published var terminateAfterLastWindowClosed = false {
134+
didSet {
135+
Current.defaults.set(terminateAfterLastWindowClosed, forKey: "terminateAfterLastWindowClosed")
136+
}
137+
}
138+
133139
// MARK: - Runtimes
134140

135141
@Published var downloadableRuntimes: [DownloadableRuntime] = []
@@ -199,6 +205,7 @@ class AppState: ObservableObject {
199205
onSelectActionType = SelectedActionType(rawValue: Current.defaults.string(forKey: "onSelectActionType") ?? "none") ?? .none
200206
installPath = Current.defaults.string(forKey: "installPath") ?? Path.defaultInstallDirectory.string
201207
showOpenInRosettaOption = Current.defaults.bool(forKey: "showOpenInRosettaOption") ?? false
208+
terminateAfterLastWindowClosed = Current.defaults.bool(forKey: "terminateAfterLastWindowClosed") ?? false
202209
}
203210

204211
// MARK: Timer

Xcodes/Frontend/Preferences/GeneralPreferencePane.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ struct GeneralPreferencePane: View {
2020
NotificationsView().environmentObject(appState)
2121
}
2222
.groupBoxStyle(PreferencesGroupBoxStyle())
23+
Divider()
24+
25+
GroupBox(label: Text("Misc")) {
26+
Toggle("TerminateAfterLastWindowClosed", isOn: $appState.terminateAfterLastWindowClosed)
27+
}
28+
.groupBoxStyle(PreferencesGroupBoxStyle())
2329
}
2430
}
2531
}

Xcodes/Resources/Localizable.xcstrings

Lines changed: 248 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14954,6 +14954,130 @@
1495414954
}
1495514955
}
1495614956
},
14957+
"Misc" : {
14958+
"localizations" : {
14959+
"ar" : {
14960+
"stringUnit" : {
14961+
"state" : "translated",
14962+
"value" : "Misc"
14963+
}
14964+
},
14965+
"ca" : {
14966+
"stringUnit" : {
14967+
"state" : "translated",
14968+
"value" : "Misc"
14969+
}
14970+
},
14971+
"de" : {
14972+
"stringUnit" : {
14973+
"state" : "translated",
14974+
"value" : "Misc"
14975+
}
14976+
},
14977+
"el" : {
14978+
"stringUnit" : {
14979+
"state" : "translated",
14980+
"value" : "Misc"
14981+
}
14982+
},
14983+
"en" : {
14984+
"stringUnit" : {
14985+
"state" : "translated",
14986+
"value" : "Misc"
14987+
}
14988+
},
14989+
"es" : {
14990+
"stringUnit" : {
14991+
"state" : "translated",
14992+
"value" : "Misc"
14993+
}
14994+
},
14995+
"fi" : {
14996+
"stringUnit" : {
14997+
"state" : "translated",
14998+
"value" : "Misc"
14999+
}
15000+
},
15001+
"fr" : {
15002+
"stringUnit" : {
15003+
"state" : "translated",
15004+
"value" : "Misc"
15005+
}
15006+
},
15007+
"hi" : {
15008+
"stringUnit" : {
15009+
"state" : "translated",
15010+
"value" : "Misc"
15011+
}
15012+
},
15013+
"it" : {
15014+
"stringUnit" : {
15015+
"state" : "translated",
15016+
"value" : "Misc"
15017+
}
15018+
},
15019+
"ja" : {
15020+
"stringUnit" : {
15021+
"state" : "translated",
15022+
"value" : "Misc"
15023+
}
15024+
},
15025+
"ko" : {
15026+
"stringUnit" : {
15027+
"state" : "translated",
15028+
"value" : "Misc"
15029+
}
15030+
},
15031+
"nl" : {
15032+
"stringUnit" : {
15033+
"state" : "translated",
15034+
"value" : "Misc"
15035+
}
15036+
},
15037+
"pl" : {
15038+
"stringUnit" : {
15039+
"state" : "translated",
15040+
"value" : "Misc"
15041+
}
15042+
},
15043+
"pt-BR" : {
15044+
"stringUnit" : {
15045+
"state" : "translated",
15046+
"value" : "Misc"
15047+
}
15048+
},
15049+
"ru" : {
15050+
"stringUnit" : {
15051+
"state" : "translated",
15052+
"value" : "Misc"
15053+
}
15054+
},
15055+
"tr" : {
15056+
"stringUnit" : {
15057+
"state" : "translated",
15058+
"value" : "Misc"
15059+
}
15060+
},
15061+
"uk" : {
15062+
"stringUnit" : {
15063+
"state" : "translated",
15064+
"value" : "Misc"
15065+
}
15066+
},
15067+
"zh-Hans" : {
15068+
"stringUnit" : {
15069+
"state" : "translated",
15070+
"value" : "杂项"
15071+
}
15072+
},
15073+
"zh-Hant" : {
15074+
"stringUnit" : {
15075+
"state" : "translated",
15076+
"value" : "雜項"
15077+
}
15078+
}
15079+
}
15080+
},
1495715081
"Moving" : {
1495815082
"extractionState" : "manual",
1495915083
"localizations" : {
@@ -21220,6 +21344,130 @@
2122021344
}
2122121345
}
2122221346
},
21347+
"TerminateAfterLastWindowClosed" : {
21348+
"localizations" : {
21349+
"ar" : {
21350+
"stringUnit" : {
21351+
"state" : "translated",
21352+
"value" : "Terminate App after last window is closed"
21353+
}
21354+
},
21355+
"ca" : {
21356+
"stringUnit" : {
21357+
"state" : "translated",
21358+
"value" : "Terminate App after last window is closed"
21359+
}
21360+
},
21361+
"de" : {
21362+
"stringUnit" : {
21363+
"state" : "translated",
21364+
"value" : "Terminate App after last window is closed"
21365+
}
21366+
},
21367+
"el" : {
21368+
"stringUnit" : {
21369+
"state" : "translated",
21370+
"value" : "Terminate App after last window is closed"
21371+
}
21372+
},
21373+
"en" : {
21374+
"stringUnit" : {
21375+
"state" : "translated",
21376+
"value" : "Terminate App after last window is closed"
21377+
}
21378+
},
21379+
"es" : {
21380+
"stringUnit" : {
21381+
"state" : "translated",
21382+
"value" : "Terminate App after last window is closed"
21383+
}
21384+
},
21385+
"fi" : {
21386+
"stringUnit" : {
21387+
"state" : "translated",
21388+
"value" : "Terminate App after last window is closed"
21389+
}
21390+
},
21391+
"fr" : {
21392+
"stringUnit" : {
21393+
"state" : "translated",
21394+
"value" : "Terminate App after last window is closed"
21395+
}
21396+
},
21397+
"hi" : {
21398+
"stringUnit" : {
21399+
"state" : "translated",
21400+
"value" : "Terminate App after last window is closed"
21401+
}
21402+
},
21403+
"it" : {
21404+
"stringUnit" : {
21405+
"state" : "translated",
21406+
"value" : "Terminate App after last window is closed"
21407+
}
21408+
},
21409+
"ja" : {
21410+
"stringUnit" : {
21411+
"state" : "translated",
21412+
"value" : "Terminate App after last window is closed"
21413+
}
21414+
},
21415+
"ko" : {
21416+
"stringUnit" : {
21417+
"state" : "translated",
21418+
"value" : "Terminate App after last window is closed"
21419+
}
21420+
},
21421+
"nl" : {
21422+
"stringUnit" : {
21423+
"state" : "translated",
21424+
"value" : "Terminate App after last window is closed"
21425+
}
21426+
},
21427+
"pl" : {
21428+
"stringUnit" : {
21429+
"state" : "translated",
21430+
"value" : "Terminate App after last window is closed"
21431+
}
21432+
},
21433+
"pt-BR" : {
21434+
"stringUnit" : {
21435+
"state" : "translated",
21436+
"value" : "Terminate App after last window is closed"
21437+
}
21438+
},
21439+
"ru" : {
21440+
"stringUnit" : {
21441+
"state" : "translated",
21442+
"value" : "Terminate App after last window is closed"
21443+
}
21444+
},
21445+
"tr" : {
21446+
"stringUnit" : {
21447+
"state" : "translated",
21448+
"value" : "Terminate App after last window is closed"
21449+
}
21450+
},
21451+
"uk" : {
21452+
"stringUnit" : {
21453+
"state" : "translated",
21454+
"value" : "Terminate App after last window is closed"
21455+
}
21456+
},
21457+
"zh-Hans" : {
21458+
"stringUnit" : {
21459+
"state" : "translated",
21460+
"value" : "在最后一个窗口关闭后终止App"
21461+
}
21462+
},
21463+
"zh-Hant" : {
21464+
"stringUnit" : {
21465+
"state" : "translated",
21466+
"value" : "在最後一個窗口關閉後終止 App"
21467+
}
21468+
}
21469+
}
21470+
},
2122321471
"TrashingArchive" : {
2122421472
"extractionState" : "manual",
2122521473
"localizations" : {

Xcodes/XcodesApp.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ struct XcodesApp: App {
1111
@StateObject private var updater = ObservableUpdater()
1212

1313
var body: some Scene {
14-
WindowGroup("Xcodes") {
14+
Window("Xcodes", id: "main") {
1515
MainWindow()
1616
.environmentObject(appState)
1717
.environmentObject(updater)
@@ -166,6 +166,10 @@ class AppDelegate: NSObject, NSApplicationDelegate {
166166
}
167167

168168
func applicationDidFinishLaunching(_: Notification) {}
169+
170+
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
171+
return Current.defaults.bool(forKey: "terminateAfterLastWindowClosed") ?? false
172+
}
169173
}
170174

171175
func localizeString(_ key: String, comment: String = "") -> String {

0 commit comments

Comments
 (0)