Files
MyGoNavi/internal/nativewindow/process.go
Syngnat 3f4b247faa feat(native-window): 完善原生独立窗口与跨屏拖拽
- 支持全部工作台标签与 AI 对话在多显示器中原生独立展示
- 修复拖拽指针捕获,恢复关闭、右键菜单和跨窗口释放识别
- 拆分子窗启动入口并按需加载语言与工作台内容
- 内容与 Monaco 完成可见绘制后再提交迁移,消除白屏和加载闪烁
- 加固结果编辑、宿主同步及关闭、超时和焦点竞态
2026-07-17 16:06:24 +08:00

83 lines
1.7 KiB
Go

package nativewindow
import (
"os"
"os/exec"
"strings"
)
var detachedChildFilteredEnvironment = map[string]struct{}{
"assetdir": {},
"devserver": {},
"frontenddevserverurl": {},
}
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, detachedWindowProcessArgument())
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
}
func detachedWindowProcessArgument() string {
return strings.TrimLeft(DetachedWindowArgument, "-")
}
func filterDetachedChildEnvironment(environment []string) []string {
filtered := make([]string, 0, len(environment))
for _, item := range environment {
name, _, _ := strings.Cut(item, "=")
if _, blocked := detachedChildFilteredEnvironment[strings.ToLower(strings.TrimSpace(name))]; blocked {
continue
}
filtered = append(filtered, item)
}
return filtered
}
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()
}