Terminal öffnet als aktives Fenster: Starter tritt Aktivierung per yieldActivationToApplicationWithBundleIdentifier ab, Terminal-Prozess aktiviert sich beim Ready-Event (kooperative Aktivierung seit macOS 14)
This commit is contained in:
@@ -17,13 +17,19 @@ pub struct Terminals(pub Mutex<HashMap<String, Session>>);
|
||||
|
||||
/// Öffnet ein Terminal für ein Projekt: startet das eigene Binary als
|
||||
/// Terminal-Prozess (`--terminal <projekt>`), damit jedes Terminal ein
|
||||
/// eigenes Dock-Icon bekommt.
|
||||
/// eigenes Dock-Icon bekommt. Vorher tritt der rufende Prozess die
|
||||
/// Aktivierung ab — Aktivierung ist seit macOS 14 kooperativ, sonst öffnet
|
||||
/// das Terminal-Fenster hinter der aktiven App.
|
||||
#[tauri::command]
|
||||
pub fn open_terminal(project: String) -> Result<(), String> {
|
||||
pub fn open_terminal(app: AppHandle, project: String) -> Result<(), String> {
|
||||
let dir = crate::project_dir(&crate::Paths::real(), &project)?;
|
||||
if !dir.is_dir() {
|
||||
return Err(format!("Projektordner fehlt: {}", dir.display()));
|
||||
}
|
||||
let bundle_id = app.config().identifier.clone();
|
||||
app
|
||||
.run_on_main_thread(move || yield_activation_to_bundle(&bundle_id))
|
||||
.map_err(|e| e.to_string())?;
|
||||
let exe = std::env::current_exe().map_err(|e| e.to_string())?;
|
||||
std::process::Command::new(exe)
|
||||
.args(["--terminal", &project])
|
||||
@@ -32,6 +38,30 @@ pub fn open_terminal(project: String) -> Result<(), String> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Tritt die Aktivierung an den nächsten startenden Prozess mit dieser
|
||||
/// Bundle-ID ab (der Terminal-Prozess läuft unter derselben).
|
||||
fn yield_activation_to_bundle(bundle_id: &str) {
|
||||
use objc2::MainThreadMarker;
|
||||
use objc2_app_kit::NSApplication;
|
||||
use objc2_foundation::NSString;
|
||||
let mtm =
|
||||
MainThreadMarker::new().expect("yield_activation_to_bundle läuft nicht auf dem Main-Thread");
|
||||
NSApplication::sharedApplication(mtm)
|
||||
.yieldActivationToApplicationWithBundleIdentifier(&NSString::from_str(bundle_id));
|
||||
}
|
||||
|
||||
/// Selbst-Aktivierung des frisch gestarteten Terminal-Prozesses (Ready-Event);
|
||||
/// die Gegenseite hat vorher per yield abgetreten.
|
||||
pub fn activate_self(app: &AppHandle) {
|
||||
use objc2::MainThreadMarker;
|
||||
use objc2_app_kit::NSApplication;
|
||||
let mtm = MainThreadMarker::new().expect("activate_self läuft nicht auf dem Main-Thread");
|
||||
NSApplication::sharedApplication(mtm).activate();
|
||||
if let Some(window) = app.webview_windows().values().next() {
|
||||
window.set_focus().expect("Terminal-Fenster nicht fokussierbar");
|
||||
}
|
||||
}
|
||||
|
||||
/// Fenster-Hintergrund je Theme — muss zu den Theme-Definitionen in
|
||||
/// terminal.ts passen, sonst blitzt beim Öffnen die falsche Farbe auf.
|
||||
fn theme_background(theme: &str) -> (u8, u8, u8) {
|
||||
|
||||
Reference in New Issue
Block a user