diff --git a/xpra/client.go b/xpra/client.go new file mode 100644 index 0000000..dace512 --- /dev/null +++ b/xpra/client.go @@ -0,0 +1,69 @@ +package xpra +import ( + "github.com/subgraph/oz" + "fmt" + "os" + "github.com/op/go-logging" + "os/exec" + "syscall" +) + +var xpraClientDefaultArgs = []string{ + "--title=@title@", + "--compress=0", + //"--delay-tray", + //"--border=auto", + "--no-keyboard-sync", +} + +func NewClient(config *oz.XServerConf, display uint64, cred *syscall.Credential, workdir string, hostname string, log *logging.Logger) *Xpra { + x := new(Xpra) + x.Config = config + x.Display = display + x.WorkDir = workdir + x.xpraArgs = prepareClientArgs(config, display, workdir, log) + x.Process = exec.Command("/usr/bin/xpra", x.xpraArgs...) + x.Process.SysProcAttr = &syscall.SysProcAttr{ + Credential: cred, + } + x.Process.Env = append(os.Environ(), + fmt.Sprintf("TMPDIR=%s", workdir), + fmt.Sprintf("XPRA_SOCKET_HOSTNAME=%s", hostname), + ) + return x +} + +func prepareClientArgs(config *oz.XServerConf, display uint64, workdir string, log *logging.Logger) []string { + args := getDefaultArgs(config) + args = append(args, xpraClientDefaultArgs...) + if !config.EnableTray { + args = append(args, "--no-tray") + } + if exists(config.TrayIcon, "Tray icon", log) { + args = append(args, fmt.Sprintf("--tray-icon=%s", config.TrayIcon)) + } + if exists(config.WindowIcon, "Window icon", log) { + args = append(args, fmt.Sprintf("--window-icon=%s", config.WindowIcon)) + } + args = append(args, + fmt.Sprint("--socket-dir=%s", workdir), + "attach", + fmt.Sprintf(":%d", display), + ) + return args +} + +func exists(path,label string, log *logging.Logger) bool { + if path == "" { + return false + } + if _,err := os.Stat(path); err != nil { + if !os.IsNotExist(err) { + log.Notice("%s file missing at %s, ignored.", label, path) + } else { + log.Warning("Error reading file info for %s: %v", path, err) + } + return false + } + return true +} diff --git a/xpra/server.go b/xpra/server.go new file mode 100644 index 0000000..e7049f0 --- /dev/null +++ b/xpra/server.go @@ -0,0 +1,38 @@ +package xpra +import ( + "github.com/subgraph/oz" + "fmt" + "os" + "os/exec" +) + +var xpraServerDefaultArgs = []string{ + "--no-mdns", + //"--pulseaudio", + "--no-pulseaudio", + "--input-method=SCIM", +} + +func NewServer(config *oz.XServerConf, display uint64, workdir string) *Xpra { + x := new(Xpra) + x.Config = config + x.Display = display + x.WorkDir = workdir + x.xpraArgs = prepareServerArgs(config, display, workdir) + x.Process = exec.Command("/usr/bin/xpra", x.xpraArgs...) + x.Process.Env = append(os.Environ(), "TMPDIR="+workdir) + + return x +} + +func prepareServerArgs(config *oz.XServerConf, display uint64, workdir string) []string { + args := getDefaultArgs(config) + args = append(args, xpraServerDefaultArgs...) + args = append(args, + fmt.Sprintf("--socket-dir=%s", workdir), + "start", + fmt.Sprintf(":%d", display), + ) + return args +} + diff --git a/xpra/xpra.go b/xpra/xpra.go new file mode 100644 index 0000000..62fbd1c --- /dev/null +++ b/xpra/xpra.go @@ -0,0 +1,55 @@ +package xpra +import ( + "os/exec" + "github.com/subgraph/oz" +) + +type Xpra struct { + // Server working directory where unix socket is created + WorkDir string + + Config *oz.XServerConf + + // Running xpra process + Process *exec.Cmd + + // Display number + Display uint64 + + // Arguments passed to xpra command + xpraArgs []string + +} + +var xpraDefaultArgs = []string{ + "--no-daemon", + "--mmap", + "--no-sharing", + "--bell", + "--system-tray", + "--xsettings", + //"--no-xsettings", + "--notifications", + "--cursors", + "--encoding=rgb", + "--no-pulseaudio", +} + +func getDefaultArgs(config *oz.XServerConf) []string { + args := []string{} + args = append(args, xpraDefaultArgs...) + if config.DisableClipboard { + args = append(args, "--no-clipboard") + } else { + args = append(args, "--clipboard") + } + + if config.DisableAudio { + args = append(args, "--no-microphone", "--no-speaker") + } else { + args = append(args, "--microphone", "--speaker") + } + + return args +} +