mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-08-07 15:13:51 +08:00
- 支持全部工作台标签与 AI 对话在多显示器中原生独立展示 - 修复拖拽指针捕获,恢复关闭、右键菜单和跨窗口释放识别 - 拆分子窗启动入口并按需加载语言与工作台内容 - 内容与 Monaco 完成可见绘制后再提交迁移,消除白屏和加载闪烁 - 加固结果编辑、宿主同步及关闭、超时和焦点竞态
83 lines
1.7 KiB
Go
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()
|
|
}
|