--- /dev/null
+package display
+
+import (
+ "unicode/utf8"
+
+ "github.com/zyedidia/micro/internal/buffer"
+ "github.com/zyedidia/micro/internal/config"
+ "github.com/zyedidia/micro/internal/screen"
+ "github.com/zyedidia/micro/internal/shell"
+ "github.com/zyedidia/tcell"
+ "github.com/zyedidia/terminal"
+)
+
+type TermWindow struct {
+ *View
+ *shell.Terminal
+
+ active bool
+}
+
+func NewTermWindow(x, y, w, h int, term *shell.Terminal) *TermWindow {
+ tw := new(TermWindow)
+ tw.View = new(View)
+ tw.Terminal = term
+ tw.X, tw.Y = x, y
+ tw.Resize(w, h)
+ return tw
+}
+
+// Resize informs the terminal of a resize event
+func (w *TermWindow) Resize(width, height int) {
+ if config.GetGlobalOption("statusline").(bool) {
+ height--
+ }
+ w.Term.Resize(width, height)
+ w.Width, w.Height = width, height
+}
+
+func (w *TermWindow) SetActive(b bool) {
+ w.active = b
+}
+
+func (w *TermWindow) GetMouseLoc(vloc buffer.Loc) buffer.Loc {
+ return vloc
+}
+
+func (w *TermWindow) Clear() {
+ for y := 0; y < w.Height; y++ {
+ for x := 0; x < w.Width; x++ {
+ screen.Screen.SetContent(w.X+x, w.Y+y, ' ', nil, config.DefStyle)
+ }
+ }
+}
+
+func (w *TermWindow) Relocate() bool { return true }
+func (w *TermWindow) GetView() *View {
+ return w.View
+}
+func (w *TermWindow) SetView(v *View) {
+ w.View = v
+}
+
+// Display displays this terminal in a view
+func (w *TermWindow) Display() {
+ w.State.Lock()
+ defer w.State.Unlock()
+
+ var l buffer.Loc
+ for y := 0; y < w.Height; y++ {
+ for x := 0; x < w.Width; x++ {
+ l.X, l.Y = x, y
+ c, f, b := w.State.Cell(x, y)
+
+ fg, bg := int(f), int(b)
+ if f == terminal.DefaultFG {
+ fg = int(tcell.ColorDefault)
+ }
+ if b == terminal.DefaultBG {
+ bg = int(tcell.ColorDefault)
+ }
+ st := tcell.StyleDefault.Foreground(config.GetColor256(int(fg))).Background(config.GetColor256(int(bg)))
+
+ if l.LessThan(w.Selection[1]) && l.GreaterEqual(w.Selection[0]) || l.LessThan(w.Selection[0]) && l.GreaterEqual(w.Selection[1]) {
+ st = st.Reverse(true)
+ }
+
+ screen.Screen.SetContent(w.X+x, w.Y+y, c, nil, st)
+ }
+ }
+ if config.GetGlobalOption("statusline").(bool) {
+ statusLineStyle := config.DefStyle.Reverse(true)
+ if style, ok := config.Colorscheme["statusline"]; ok {
+ statusLineStyle = style
+ }
+
+ text := []byte(w.Name())
+ textLen := utf8.RuneCount(text)
+ for x := 0; x < w.Width; x++ {
+ if x < textLen {
+ r, size := utf8.DecodeRune(text)
+ text = text[size:]
+ screen.Screen.SetContent(w.X+x, w.Y+w.Height, r, nil, statusLineStyle)
+ } else {
+ screen.Screen.SetContent(w.X+x, w.Y+w.Height, ' ', nil, statusLineStyle)
+ }
+ }
+ }
+ if w.State.CursorVisible() && w.active {
+ curx, cury := w.State.Cursor()
+ screen.Screen.ShowCursor(curx+w.X, cury+w.Y)
+ }
+}