diff options
Diffstat (limited to 'xterm.go')
| -rw-r--r-- | xterm.go | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/xterm.go b/xterm.go new file mode 100644 index 0000000..d51cc96 --- /dev/null +++ b/xterm.go @@ -0,0 +1,140 @@ +package shell + +import ( + "fmt" + "os" + "strings" + + "go.wit.com/log" +) + +func scanToParent(pid int) (bool, string) { + ppid, err := GetPPID(pid) + if err != nil { + fmt.Println("Error getting PPID:", err) + return true, "" + } + + comm, err := GetComm(ppid) + if err != nil { + fmt.Println("Error getting comm:", err) + return true, "" + } + + log.Info("scanToParent() found:", comm) + + // if this is an xterm + switch comm { + case "xterm": + return true, "xterm" + case "mate-terminal": + return true, "mate-terminal" + case "bash": + // keep digging for the parent xterm + return scanToParent(ppid) + case "make": + // keep digging for the parent xterm + return scanToParent(ppid) + default: + return false, comm + } + if comm == "bash" { + } + + ok, better := scanToParent(ppid) + if ok { + return ok, better + } + if better == "" { + // if the parent was blank, at least return the something that we have + // since something is better than nothing + return false, comm + } + return ok, better +} + +// returns a string of the xterm the user is using +// for example, "xterm" or "mate-terminal" +func Terminal() string { + pid := os.Getpid() + _, comm := scanToParent(pid) + /* + ppid, err := GetPPID(pid) + if err != nil { + fmt.Println("Error getting PPID:", err) + return "" + } + + comm, err := GetComm(ppid) + if err != nil { + fmt.Println("Error getting comm:", err) + return "" + } + */ + + return comm +} + +// returns a string of the shell the user is using +func Shell() string { + envsh := os.Getenv("SHELL") + switch envsh { + case "/bin/bash": + return "bash" + default: + return envsh + } + return envsh +} + +func getXtermCmd(cmd []string) []string { + var term string + // doesn't work yet + // term = Terminal() + term = "xterm" + switch term { + case "mate-terminal": + newcmd := []string{"mate-terminal", "-e"} + newcmd = append(newcmd, cmd...) + return newcmd + default: + // unknown terminal. use xterm + newcmd := []string{"xterm", "-geometry", "140x32", "-e", "bash", "-c"} + // fix/shell escape sequence this for quote chars, etc + // tmp := "\"" + strings.Join(cmd, " ") + ";bash\"" + newcmd = append(newcmd, cmd...) + // newcmd = append(newcmd, cmd...) + return newcmd + } +} + +// spawns an xterm with something you can run at a command line +func XtermCmd(path string, cmd []string) { + go XtermCmdWait(path, cmd) +} + +// runs an xterm +// waits until xterm exits +func XtermCmdWait(path string, cmd []string) { + var argsXterm = getXtermCmd(cmd) + + log.Info("XtermCmd() path =", path, "cmd =", argsXterm) + + // keeps git diff from exiting on small diffs + os.Setenv("LESS", "-+F -+X -R") + + RunCmdRun(path, argsXterm) +} + +// spawns an xterm with something you can run at a command line +// then executes bash +func XtermCmdBash(path string, cmd []string) { + var tmp []string + var argsXterm = getXtermCmd(cmd) + bash := "\"-c '" + bash += strings.Join(cmd, " ") + bash += "'; bash\"" + tmp = append(argsXterm, "bash", bash) + log.Info("XtermCmd() path =", path, "cmd =", tmp) + go RunCmd(path, tmp) +} |
