1
0
mirror of https://github.com/taigrr/wtf synced 2025-01-18 04:03:14 -08:00
wtf/vendor/github.com/gdamore/tcell/tscreen_posix.go
Sergio Rubio d2a3e504cf Vendor dependencies using golang/dep
Output from 'dep status':

PROJECT                               CONSTRAINT     VERSION        REVISION  LATEST   PKGS USED
cloud.google.com/go                   v0.23.0        v0.23.0        0fd7230   v0.23.0  1
github.com/briandowns/openweathermap  ^0.11.0        0.11           1b87579   0.11     1
github.com/gdamore/encoding           branch master  branch master  b23993c   b23993c  1
github.com/gdamore/tcell              ^1.0.0         v1.0.0         061d51a   v1.0.0   2
github.com/go-test/deep               ^1.0.1         v1.0.1         6592d9c   v1.0.1   1
github.com/golang/protobuf            v1.1.0         v1.1.0         b4deda0   v1.1.0   1
github.com/google/go-github           branch master  branch master  2ae5df7   2ae5df7  1
github.com/google/go-querystring      branch master  branch master  53e6ce1   53e6ce1  1
github.com/jessevdk/go-flags          ^1.4.0         v1.4.0         c6ca198   v1.4.0   1
github.com/lucasb-eyer/go-colorful    v1.0           v1.0           345fbb3   v1.0     1
github.com/mattn/go-runewidth         v0.0.2         v0.0.2         9e777a8   v0.0.2   1
github.com/olebedev/config            branch master  branch master  9a10d05   9a10d05  1
github.com/radovskyb/watcher          ^1.0.2         v1.0.2         6145e14   v1.0.2   1
github.com/rivo/tview                 branch master  branch master  71ecf1f   71ecf1f  1
github.com/yfronto/newrelic           branch master  branch master  f7fa0c6   f7fa0c6  1
golang.org/x/net                      branch master  branch master  1e49130   1e49130  2
golang.org/x/oauth2                   branch master  branch master  1e0a3fa   1e0a3fa  5
golang.org/x/text                     v0.3.0         v0.3.0         f21a4df   v0.3.0   5
google.golang.org/api                 branch master  branch master  00e3bb8   00e3bb8  4
google.golang.org/appengine           v1.0.0         v1.0.0         150dc57   v1.0.0   10
gopkg.in/yaml.v2                      ^2.2.1         v2.2.1         5420a8b   v2.2.1   1

See https://golang.github.io/dep/docs/daily-dep.html
2018-06-06 18:29:46 +02:00

207 lines
4.2 KiB
Go

// +build solaris
// Copyright 2017 The TCell Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use file except in compliance with the License.
// You may obtain a copy of the license at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package tcell
import (
"os"
"os/signal"
"syscall"
)
// #include <termios.h>
// #include <sys/ioctl.h>
//
// int getwinsize(int fd, int *cols, int *rows) {
// #if defined TIOCGWINSZ
// struct winsize w;
// if (ioctl(fd, TIOCGWINSZ, &w) < 0) {
// return (-1);
// }
// *cols = w.ws_col;
// *rows = w.ws_row;
// return (0);
// #else
// return (-1);
// #endif
// }
//
// int getbaud(struct termios *tios) {
// switch (cfgetospeed(tios)) {
// #ifdef B0
// case B0: return (0);
// #endif
// #ifdef B50
// case B50: return (50);
// #endif
// #ifdef B75
// case B75: return (75);
// #endif
// #ifdef B110
// case B110: return (110);
// #endif
// #ifdef B134
// case B134: return (134);
// #endif
// #ifdef B150
// case B150: return (150);
// #endif
// #ifdef B200
// case B200: return (200);
// #endif
// #ifdef B300
// case B300: return (300);
// #endif
// #ifdef B600
// case B600: return (600);
// #endif
// #ifdef B1200
// case B1200: return (1200);
// #endif
// #ifdef B1800
// case B1800: return (1800);
// #endif
// #ifdef B2400
// case B2400: return (2400);
// #endif
// #ifdef B4800
// case B4800: return (4800);
// #endif
// #ifdef B9600
// case B9600: return (9600);
// #endif
// #ifdef B19200
// case B19200: return (19200);
// #endif
// #ifdef B38400
// case B38400: return (38400);
// #endif
// #ifdef B57600
// case B57600: return (57600);
// #endif
// #ifdef B76800
// case B76800: return (76800);
// #endif
// #ifdef B115200
// case B115200: return (115200);
// #endif
// #ifdef B153600
// case B153600: return (153600);
// #endif
// #ifdef B230400
// case B230400: return (230400);
// #endif
// #ifdef B307200
// case B307200: return (307200);
// #endif
// #ifdef B460800
// case B460800: return (460800);
// #endif
// #ifdef B921600
// case B921600: return (921600);
// #endif
// }
// return (0);
// }
import "C"
type termiosPrivate struct {
tios C.struct_termios
}
func (t *tScreen) termioInit() error {
var e error
var rv C.int
var newtios C.struct_termios
var fd C.int
if t.in, e = os.OpenFile("/dev/tty", os.O_RDONLY, 0); e != nil {
goto failed
}
if t.out, e = os.OpenFile("/dev/tty", os.O_WRONLY, 0); e != nil {
goto failed
}
t.tiosp = &termiosPrivate{}
fd = C.int(t.out.Fd())
if rv, e = C.tcgetattr(fd, &t.tiosp.tios); rv != 0 {
goto failed
}
t.baud = int(C.getbaud(&t.tiosp.tios))
newtios = t.tiosp.tios
newtios.c_iflag &^= C.IGNBRK | C.BRKINT | C.PARMRK |
C.ISTRIP | C.INLCR | C.IGNCR |
C.ICRNL | C.IXON
newtios.c_oflag &^= C.OPOST
newtios.c_lflag &^= C.ECHO | C.ECHONL | C.ICANON |
C.ISIG | C.IEXTEN
newtios.c_cflag &^= C.CSIZE | C.PARENB
newtios.c_cflag |= C.CS8
// This is setup for blocking reads. In the past we attempted to
// use non-blocking reads, but now a separate input loop and timer
// copes with the problems we had on some systems (BSD/Darwin)
// where close hung forever.
newtios.Cc[syscall.VMIN] = 1
newtios.Cc[syscall.VTIME] = 0
if rv, e = C.tcsetattr(fd, C.TCSANOW|C.TCSAFLUSH, &newtios); rv != 0 {
goto failed
}
signal.Notify(t.sigwinch, syscall.SIGWINCH)
if w, h, e := t.getWinSize(); e == nil && w != 0 && h != 0 {
t.cells.Resize(w, h)
}
return nil
failed:
if t.in != nil {
t.in.Close()
}
if t.out != nil {
t.out.Close()
}
return e
}
func (t *tScreen) termioFini() {
signal.Stop(t.sigwinch)
<-t.indoneq
if t.out != nil {
fd := C.int(t.out.Fd())
C.tcsetattr(fd, C.TCSANOW|C.TCSAFLUSH, &t.tiosp.tios)
t.out.Close()
}
if t.in != nil {
t.in.Close()
}
}
func (t *tScreen) getWinSize() (int, int, error) {
var cx, cy C.int
if r, e := C.getwinsize(C.int(t.out.Fd()), &cx, &cy); r != 0 {
return 0, 0, e
}
return int(cx), int(cy), nil
}