mirror of
https://github.com/cirruslabs/tart.git
synced 2026-10-18 21:47:08 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a05684157e | ||
|
|
e62e921eec | ||
|
|
e1bb565c3b |
@@ -1,17 +0,0 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
|
||||||
<configuration default="false" name="sign debug" type="ShConfigurationType">
|
|
||||||
<option name="SCRIPT_TEXT" value="codesign --sign - --entitlements Resources/tart-dev.entitlements --force .build/debug/tart" />
|
|
||||||
<option name="INDEPENDENT_SCRIPT_PATH" value="true" />
|
|
||||||
<option name="SCRIPT_PATH" value="$PROJECT_DIR$/scripts/sign.sh" />
|
|
||||||
<option name="SCRIPT_OPTIONS" value="" />
|
|
||||||
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="true" />
|
|
||||||
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
|
||||||
<option name="INDEPENDENT_INTERPRETER_PATH" value="true" />
|
|
||||||
<option name="INTERPRETER_PATH" value="/bin/zsh" />
|
|
||||||
<option name="INTERPRETER_OPTIONS" value="" />
|
|
||||||
<option name="EXECUTE_IN_TERMINAL" value="true" />
|
|
||||||
<option name="EXECUTE_SCRIPT_FILE" value="false" />
|
|
||||||
<envs />
|
|
||||||
<method v="2" />
|
|
||||||
</configuration>
|
|
||||||
</component>
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
|
||||||
<configuration default="false" name="tart create" type="SwiftPackageManagerRunConfiguration" factoryName="Swift Package Run" PROGRAM_PARAMS="create latest --from-ipsw=latest" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="tart" TARGET_NAME="tart" CONFIG_NAME="tart" RUN_TARGET_PROJECT_NAME="tart" RUN_TARGET_NAME="tart" WAS_MODIFIED="">
|
|
||||||
<method v="2">
|
|
||||||
<option name="SPM.BUILD_TASK_PROVIDER" enabled="true" />
|
|
||||||
<option name="RunConfigurationTask" enabled="true" run_configuration_name="sign debug" run_configuration_type="ShConfigurationType" />
|
|
||||||
</method>
|
|
||||||
</configuration>
|
|
||||||
</component>
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
|
||||||
<configuration default="false" name="tart run" type="SwiftPackageManagerRunConfiguration" factoryName="Swift Package Run" PROGRAM_PARAMS="run latest" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="tart" TARGET_NAME="tart" CONFIG_NAME="tart" RUN_TARGET_PROJECT_NAME="tart" RUN_TARGET_NAME="tart" WAS_MODIFIED="">
|
|
||||||
<method v="2">
|
|
||||||
<option name="SPM.BUILD_TASK_PROVIDER" enabled="true" />
|
|
||||||
<option name="RunConfigurationTask" enabled="true" run_configuration_name="sign debug" run_configuration_type="ShConfigurationType" />
|
|
||||||
</method>
|
|
||||||
</configuration>
|
|
||||||
</component>
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import ArgumentParser
|
import ArgumentParser
|
||||||
|
import Cocoa
|
||||||
import Dispatch
|
import Dispatch
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
import Virtualization
|
import Virtualization
|
||||||
@@ -391,6 +392,8 @@ struct Run: AsyncParsableCommand {
|
|||||||
nsApp.applicationIconImage = NSImage(data: AppIconData)
|
nsApp.applicationIconImage = NSImage(data: AppIconData)
|
||||||
|
|
||||||
struct MainApp: App {
|
struct MainApp: App {
|
||||||
|
@NSApplicationDelegateAdaptor private var appDelegate: MinimalMenuAppDelegate
|
||||||
|
|
||||||
var body: some Scene {
|
var body: some Scene {
|
||||||
WindowGroup(vm!.name) {
|
WindowGroup(vm!.name) {
|
||||||
Group {
|
Group {
|
||||||
@@ -415,7 +418,18 @@ struct Run: AsyncParsableCommand {
|
|||||||
CommandGroup(replacing: .undoRedo, addition: {})
|
CommandGroup(replacing: .undoRedo, addition: {})
|
||||||
CommandGroup(replacing: .windowSize, addition: {})
|
CommandGroup(replacing: .windowSize, addition: {})
|
||||||
// Replace some standard menu options
|
// Replace some standard menu options
|
||||||
CommandGroup(replacing: .appInfo) { AboutTart() }
|
CommandGroup(replacing: .appInfo) { AboutTart(config: vm!.config) }
|
||||||
|
CommandMenu("Control") {
|
||||||
|
Button("Start") {
|
||||||
|
Task { try await vm!.virtualMachine.start() }
|
||||||
|
}
|
||||||
|
Button("Stop") {
|
||||||
|
Task { try await vm!.virtualMachine.stop() }
|
||||||
|
}
|
||||||
|
Button("Request Stop") {
|
||||||
|
Task { try await vm!.virtualMachine.requestStop() }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -424,14 +438,42 @@ struct Run: AsyncParsableCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The only way to fully remove Edit menu item.
|
||||||
|
class MinimalMenuAppDelegate: NSObject, NSApplicationDelegate, ObservableObject {
|
||||||
|
let indexOfEditMenu = 2
|
||||||
|
|
||||||
|
func applicationDidFinishLaunching(_ : Notification) {
|
||||||
|
NSApplication.shared.mainMenu?.removeItem(at: indexOfEditMenu)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct AboutTart: View {
|
struct AboutTart: View {
|
||||||
|
var credits: NSAttributedString
|
||||||
|
|
||||||
|
init(config: VMConfig) {
|
||||||
|
let mutableAttrStr = NSMutableAttributedString()
|
||||||
|
let style = NSMutableParagraphStyle()
|
||||||
|
style.alignment = NSTextAlignment.center
|
||||||
|
let attrCenter: [NSAttributedString.Key : Any] = [
|
||||||
|
.paragraphStyle: style,
|
||||||
|
]
|
||||||
|
mutableAttrStr.append(NSAttributedString(string: "CPU: \(config.cpuCount) cores\n", attributes: attrCenter))
|
||||||
|
mutableAttrStr.append(NSAttributedString(string: "Memory: \(config.memorySize / 1024 / 1024) MB\n", attributes: attrCenter))
|
||||||
|
mutableAttrStr.append(NSAttributedString(string: "Display: \(config.display.description)\n", attributes: attrCenter))
|
||||||
|
mutableAttrStr.append(NSAttributedString(string: "https://github.com/cirruslabs/tart", attributes: [
|
||||||
|
.paragraphStyle: style,
|
||||||
|
.link : "https://github.com/cirruslabs/tart"
|
||||||
|
]))
|
||||||
|
credits = mutableAttrStr
|
||||||
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
Button("About Tart") {
|
Button("About Tart") {
|
||||||
NSApplication.shared.orderFrontStandardAboutPanel(options: [
|
NSApplication.shared.orderFrontStandardAboutPanel(options: [
|
||||||
NSApplication.AboutPanelOptionKey.applicationIcon: NSApplication.shared.applicationIconImage as Any,
|
NSApplication.AboutPanelOptionKey.applicationIcon: NSApplication.shared.applicationIconImage as Any,
|
||||||
NSApplication.AboutPanelOptionKey.applicationName: "Tart",
|
NSApplication.AboutPanelOptionKey.applicationName: "Tart",
|
||||||
NSApplication.AboutPanelOptionKey.applicationVersion: CI.version,
|
NSApplication.AboutPanelOptionKey.applicationVersion: CI.version,
|
||||||
NSApplication.AboutPanelOptionKey.credits: try! NSAttributedString(markdown: "https://github.com/cirruslabs/tart"),
|
NSApplication.AboutPanelOptionKey.credits: credits,
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -444,7 +486,8 @@ struct VMView: NSViewRepresentable {
|
|||||||
|
|
||||||
func makeNSView(context: Context) -> NSViewType {
|
func makeNSView(context: Context) -> NSViewType {
|
||||||
let machineView = VZVirtualMachineView()
|
let machineView = VZVirtualMachineView()
|
||||||
machineView.capturesSystemKeys = true
|
// so keys like take a windows screenshot (cmd+shift+4+space) works on the host and not guest
|
||||||
|
machineView.capturesSystemKeys = false
|
||||||
return machineView
|
return machineView
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Executable
+11
@@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# helper script to build and run a signed tart binary
|
||||||
|
# usage: ./scripts/run-signed.sh run ventura-base
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
swift build --product tart
|
||||||
|
codesign --sign - --entitlements Resources/tart-dev.entitlements --force .build/debug/tart
|
||||||
|
|
||||||
|
.build/debug/tart "$@"
|
||||||
Reference in New Issue
Block a user