nt

A sensible note-taking program
git clone git://git.laack.co/nt.git
Log | Files | Refs | README

tty.go (2836B)


      1 // Copyright 2021 The TCell Authors
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use file except in compliance with the License.
      5 // You may obtain a copy of the license at
      6 //
      7 //    http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 package tcell
     16 
     17 import "io"
     18 
     19 // Tty is an abstraction of a tty (traditionally "teletype").  This allows applications to
     20 // provide for alternate backends, as there are situations where the traditional /dev/tty
     21 // does not work, or where more flexible handling is required.  This interface is for use
     22 // with the terminfo-style based API.  It extends the io.ReadWriter API.  It is reasonable
     23 // that the implementation might choose to use different underlying files for the Reader
     24 // and Writer sides of this API, as part of it's internal implementation.
     25 type Tty interface {
     26 	// Start is used to activate the Tty for use.  Upon return the terminal should be
     27 	// in raw mode, non-blocking, etc.  The implementation should take care of saving
     28 	// any state that is required so that it may be restored when Stop is called.
     29 	Start() error
     30 
     31 	// Stop is used to stop using this Tty instance.  This may be a suspend, so that other
     32 	// terminal based applications can run in the foreground.  Implementations should
     33 	// restore any state collected at Start(), and return to ordinary blocking mode, etc.
     34 	// Drain is called first to drain the input.  Once this is called, no more Read
     35 	// or Write calls will be made until Start is called again.
     36 	Stop() error
     37 
     38 	// Drain is called before Stop, and ensures that the reader will wake up appropriately
     39 	// if it was blocked.  This workaround is required for /dev/tty on certain UNIX systems
     40 	// to ensure that Read() does not block forever.  This typically arranges for the tty driver
     41 	// to send data immediately (e.g. VMIN and VTIME both set zero) and sets a deadline on input.
     42 	// Implementations may reasonably make this a no-op.  There will still be control sequences
     43 	// emitted between the time this is called, and when Stop is called.
     44 	Drain() error
     45 
     46 	// NotifyResize is used register a callback when the tty thinks the dimensions have
     47 	// changed.  The standard UNIX implementation links this to a handler for SIGWINCH.
     48 	// If the supplied callback is nil, then any handler should be unregistered.
     49 	NotifyResize(cb func())
     50 
     51 	// WindowSize is called to determine the terminal dimensions.  This might be determined
     52 	// by an ioctl or other means.
     53 	WindowSize() (WindowSize, error)
     54 
     55 	io.ReadWriteCloser
     56 }