summaryrefslogtreecommitdiff
path: root/xterm.go
diff options
context:
space:
mode:
Diffstat (limited to 'xterm.go')
-rw-r--r--xterm.go140
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)
+}