Files
MyGoNavi/internal/nativewindow/process.go
Syngnat fa9d21be8b feat(native-window): 支持标签页拖出为原生独立窗口
- 支持 SQL、数据和结果标签拖出到跨显示器原生窗口
- 通过受认证 loopback bridge 复用主进程后端与状态
- 支持子窗口继续拆窗、聚焦、关闭、还原与异常退出恢复
- 补充多窗口协议、状态同步和跨平台回归测试
2026-07-16 20:25:08 +08:00

60 lines
1.1 KiB
Go

package nativewindow
import (
"os"
"os/exec"
)
type processSpec struct {
Executable string
Env []string
}
type childProcess interface {
PID() int
Wait() error
Kill() error
}
type processStarter interface {
Start(processSpec) (childProcess, error)
}
type execProcessStarter struct{}
func (execProcessStarter) Start(spec processSpec) (childProcess, error) {
command := exec.Command(spec.Executable, DetachedWindowArgument)
command.Env = spec.Env
command.Stdout = os.Stdout
command.Stderr = os.Stderr
if err := command.Start(); err != nil {
return nil, err
}
return &execChildProcess{command: command}, nil
}
type execChildProcess struct {
command *exec.Cmd
}
func (p *execChildProcess) PID() int {
if p == nil || p.command == nil || p.command.Process == nil {
return 0
}
return p.command.Process.Pid
}
func (p *execChildProcess) Wait() error {
if p == nil || p.command == nil {
return nil
}
return p.command.Wait()
}
func (p *execChildProcess) Kill() error {
if p == nil || p.command == nil || p.command.Process == nil {
return nil
}
return p.command.Process.Kill()
}