func mkStyle(fg, bg Attribute) tcell.Style { st := tcell.StyleDefault f := int(fg) & 0x1ff b := int(bg) & 0x1ff switch outMode { case Output256: break case Output216: if f > 216 { f = int(ColorDefault) } else if f != int(ColorDefault) { f += 16 } if b > 216 { b = int(ColorDefault) } else if b != int(ColorDefault) { b += 16 } case OutputGrayscale: if f > 24 { f = int(ColorDefault) } else if f != int(ColorDefault) { f += 232 } if b > 24 { b = int(ColorDefault) } else if b != int(ColorDefault) { b += 232 } case OutputNormal: f &= 0xf b &= 0xf } st = st.Foreground(tcell.Color(f)) st = st.Background(tcell.Color(b)) if (fg&AttrBold != 0) || (bg&AttrBold != 0) { st = st.Bold(true) } if (fg&AttrUnderline != 0) || (bg&AttrUnderline != 0) { st = st.Underline(true) } if (fg&AttrReverse != 0) || (bg&AttrReverse != 0) { st = st.Reverse(true) } return st }
func makebox(s tcell.Screen) { w, h := s.Size() if w == 0 || h == 0 { return } glyphs := []rune{'@', '#', '&', '*', '=', '%', 'Z', 'A'} lx := rand.Int() % w ly := rand.Int() % h lw := rand.Int() % (w - lx) lh := rand.Int() % (h - ly) st := tcell.StyleDefault gl := ' ' if s.Colors() > 256 { rgb := tcell.NewHexColor(int32(rand.Int() & 0xffffff)) st = st.Background(rgb) } else if s.Colors() > 1 { st = st.Background(tcell.Color(rand.Int() % s.Colors())) } else { st = st.Reverse(rand.Int()%2 == 0) gl = glyphs[rand.Int()%len(glyphs)] } for row := 0; row < lh; row++ { for col := 0; col < lw; col++ { s.SetCell(lx+col, ly+row, st, gl) } } s.Show() }
func mkStyle(fg, bg Attribute) tcell.Style { st := tcell.StyleDefault f := tcell.Color(int(fg)&0x1ff) - 1 b := tcell.Color(int(bg)&0x1ff) - 1 f = fixColor(f) b = fixColor(b) st = st.Foreground(f).Background(b) if (fg|bg)&AttrBold != 0 { st = st.Bold(true) } if (fg|bg)&AttrUnderline != 0 { st = st.Underline(true) } if (fg|bg)&AttrReverse != 0 { st = st.Reverse(true) } return st }
func fixColor(c tcell.Color) tcell.Color { if c == tcell.ColorDefault { return c } switch outMode { case OutputNormal: c %= tcell.Color(16) case Output256: c %= tcell.Color(256) case Output216: c %= tcell.Color(216) c += tcell.Color(16) case OutputGrayscale: c %= tcell.Color(24) c += tcell.Color(232) default: c = tcell.ColorDefault } return c }
// This program just shows simple mouse and keyboard events. Press ESC twice to // exit. func main() { encoding.Register() s, e := tcell.NewScreen() if e != nil { fmt.Fprintf(os.Stderr, "%v\n", e) os.Exit(1) } if e := s.Init(); e != nil { fmt.Fprintf(os.Stderr, "%v\n", e) os.Exit(1) } defStyle = tcell.StyleDefault. Background(tcell.ColorBlack). Foreground(tcell.ColorWhite) s.SetStyle(defStyle) s.EnableMouse() s.Clear() posfmt := "Mouse: %d, %d " btnfmt := "Buttons: %s" keyfmt := "Keys: %s" white := tcell.StyleDefault. Foreground(tcell.ColorBrightWhite).Background(tcell.ColorRed) mx, my := -1, -1 ox, oy := -1, -1 bx, by := -1, -1 w, h := s.Size() lchar := '*' bstr := "" lks := "" ecnt := 0 for { drawBox(s, 1, 1, 42, 6, white, ' ') emitStr(s, 2, 2, white, "Press ESC twice to exit, C to clear.") emitStr(s, 2, 3, white, fmt.Sprintf(posfmt, mx, my)) emitStr(s, 2, 4, white, fmt.Sprintf(btnfmt, bstr)) emitStr(s, 2, 5, white, fmt.Sprintf(keyfmt, lks)) s.Show() bstr = "" ev := s.PollEvent() st := tcell.StyleDefault.Background(tcell.ColorBrightRed) up := tcell.StyleDefault. Background(tcell.ColorBrightBlue). Foreground(tcell.ColorBrightGreen) w, h = s.Size() // always clear any old selection box if ox >= 0 && oy >= 0 && bx >= 0 { drawSelect(s, ox, oy, bx, by, false) } switch ev := ev.(type) { case *tcell.EventResize: s.Sync() s.SetCell(w-1, h-1, st, 'R') case *tcell.EventKey: s.SetCell(w-2, h-2, st, ev.Rune()) s.SetCell(w-1, h-1, st, 'K') if ev.Key() == tcell.KeyEscape { ecnt++ if ecnt > 1 { s.Fini() os.Exit(0) } } else { ecnt = 0 if ev.Rune() == 'C' || ev.Rune() == 'c' { s.Clear() } } lks = ev.Name() case *tcell.EventMouse: x, y := ev.Position() button := ev.Buttons() for i := uint(0); i < 8; i++ { if int(button)&(1<<i) != 0 { bstr += fmt.Sprintf(" Button%d", i+1) } } if button&tcell.WheelUp != 0 { bstr += " WheelUp" } if button&tcell.WheelDown != 0 { bstr += " WheelDown" } if button&tcell.WheelLeft != 0 { bstr += " WheelLeft" } if button&tcell.WheelRight != 0 { bstr += " WheelRight" } // Only buttons, not wheel events button &= tcell.ButtonMask(0xff) ch := '*' if button != tcell.ButtonNone && ox < 0 { ox, oy = x, y } switch ev.Buttons() { case tcell.ButtonNone: if ox >= 0 { bg := tcell.Color((lchar-'0')*2 + 1) drawBox(s, ox, oy, x, y, up.Background(bg), lchar) ox, oy = -1, -1 bx, by = -1, -1 } case tcell.Button1: ch = '1' case tcell.Button2: ch = '2' case tcell.Button3: ch = '3' case tcell.Button4: ch = '4' case tcell.Button5: ch = '5' case tcell.Button6: ch = '6' case tcell.Button7: ch = '7' case tcell.Button8: ch = '8' default: ch = '*' } if button != tcell.ButtonNone { bx, by = x, y } lchar = ch s.SetCell(w-1, h-1, st, 'M') mx, my = x, y default: s.SetCell(w-1, h-1, st, 'X') } if ox >= 0 && bx >= 0 { drawSelect(s, ox, oy, bx, by, true) } } }