# tty.tcl - xterm as tty for the inferior
# Copyright (C) 1996, 2000 Red Hat, Inc
# Written by Tom Tromey <tromey@cygnus.com>
#
# Interface to the inferior's terminal.  This is very rough, and is
# guaranteed to only work on Unix machines (if even there).
#

namespace eval tty {
  namespace export create

  variable _xterm_fd {}

  proc create {} {
    global tcl_platform
    variable _xterm_fd

    if {$tcl_platform(platform) == "windows"} {
      # We actually don't use the value at all on Windows,
      # we just need to make inferior_io_terminal non-NULL
      gdb_cmd "tty /dev/tty"
      return
    }

    destroy

    # Tricky: we exec /bin/cat so that the xterm will exit whenever we
    # close the write end of the pipe.  Note that the stdin
    # redirection must come after tty is run; tty looks at its stdin.
    set shcmd {/bin/sh -c 'exec 1>&7; tty; exec /bin/cat 0<&6'}

    set fg [option get . foreground Foreground]
    if {$fg == ""} then {
      set fg black
    }

    set bg [. cget -background]
    if {$bg == ""} then {
      set bg [lindex [. configure -background] 3]
    }

    set xterm [list /bin/sh -c "exec xterm -T 'Gdb Child' -n Gdb -bg '$bg' -fg '$fg' -e $shcmd 6<&0 7>&1"]

    # Need both read and write access to xterm process.
    set _xterm_fd [open "| $xterm" w+]
    set tty [gets $_xterm_fd]

    # On failure we don't try the tty command.
    if {$tty != ""} {
      gdb_cmd "tty $tty"
    }
  }

  proc destroy {} {
    variable _xterm_fd

    if {$_xterm_fd != ""} then {
      # We don't care if this fails.
      catch {close $_xterm_fd}
    }
    set _xterm_fd {}
  }
}
