summaryrefslogtreecommitdiff
path: root/src/curses/curses.go
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2016-06-11 19:59:12 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2016-06-11 19:59:12 +0900
commit2bbc12063c475cb7c78c7633e2ffad41aa49d233 (patch)
tree804bc0745e929d5cc69c55ac96c43bf2a81867d0 /src/curses/curses.go
parentb8737b724bf5e7df15bb18fd1a33e57b4e4fe1ab (diff)
downloadfzf-2bbc12063c475cb7c78c7633e2ffad41aa49d233.tar.gz
Add --preview and --preview-window
Close #587
Diffstat (limited to 'src/curses/curses.go')
-rw-r--r--src/curses/curses.go100
1 files changed, 83 insertions, 17 deletions
diff --git a/src/curses/curses.go b/src/curses/curses.go
index ca10fc7d..7a9ccd4a 100644
--- a/src/curses/curses.go
+++ b/src/curses/curses.go
@@ -113,7 +113,8 @@ const (
ColCursor
ColSelected
ColHeader
- ColUser
+ ColBorder
+ ColUser // Should be the last entry
)
const (
@@ -136,6 +137,7 @@ type ColorTheme struct {
Cursor int16
Selected int16
Header int16
+ Border int16
}
type Event struct {
@@ -170,6 +172,31 @@ var (
DarkBG int
)
+type Window struct {
+ win *C.WINDOW
+ Top int
+ Left int
+ Width int
+ Height int
+}
+
+func NewWindow(top int, left int, width int, height int, border bool) *Window {
+ win := C.newwin(C.int(height), C.int(width), C.int(top), C.int(left))
+ if border {
+ attr := _color(ColBorder, false)
+ C.wattron(win, attr)
+ C.box(win, 0, 0)
+ C.wattroff(win, attr)
+ }
+ return &Window{
+ win: win,
+ Top: top,
+ Left: left,
+ Width: width,
+ Height: height,
+ }
+}
+
func EmptyTheme() *ColorTheme {
return &ColorTheme{
UseDefault: true,
@@ -184,7 +211,8 @@ func EmptyTheme() *ColorTheme {
Info: colUndefined,
Cursor: colUndefined,
Selected: colUndefined,
- Header: colUndefined}
+ Header: colUndefined,
+ Border: colUndefined}
}
func init() {
@@ -204,7 +232,8 @@ func init() {
Info: C.COLOR_WHITE,
Cursor: C.COLOR_RED,
Selected: C.COLOR_MAGENTA,
- Header: C.COLOR_CYAN}
+ Header: C.COLOR_CYAN,
+ Border: C.COLOR_BLACK}
Dark256 = &ColorTheme{
UseDefault: true,
Fg: 15,
@@ -218,7 +247,8 @@ func init() {
Info: 144,
Cursor: 161,
Selected: 168,
- Header: 109}
+ Header: 109,
+ Border: 59}
Light256 = &ColorTheme{
UseDefault: true,
Fg: 15,
@@ -232,7 +262,8 @@ func init() {
Info: 101,
Cursor: 161,
Selected: 168,
- Header: 31}
+ Header: 31,
+ Border: 145}
}
func attrColored(pair int, bold bool) C.int {
@@ -360,6 +391,7 @@ func initPairs(baseTheme *ColorTheme, theme *ColorTheme, black bool) {
C.init_pair(ColCursor, override(baseTheme.Cursor, theme.Cursor), darkBG)
C.init_pair(ColSelected, override(baseTheme.Selected, theme.Selected), darkBG)
C.init_pair(ColHeader, override(baseTheme.Header, theme.Header), bg)
+ C.init_pair(ColBorder, override(baseTheme.Border, theme.Border), bg)
}
func Close() {
@@ -415,7 +447,9 @@ func mouseSequence(sz *int) Event {
97, 101, 105, 113: // scroll-down / shift / cmd / ctrl
mod := _buf[3] >= 100
s := 1 - int(_buf[3]%2)*2
- return Event{Mouse, 0, &MouseEvent{0, 0, s, false, false, mod}}
+ x := int(_buf[4] - 33)
+ y := int(_buf[5] - 33)
+ return Event{Mouse, 0, &MouseEvent{y, x, s, false, false, mod}}
}
return Event{Invalid, 0, nil}
}
@@ -588,17 +622,25 @@ func GetChar() Event {
return Event{Rune, r, nil}
}
-func Move(y int, x int) {
- C.move(C.int(y), C.int(x))
+func (w *Window) Close() {
+ C.delwin(w.win)
+}
+
+func (w *Window) Enclose(y int, x int) bool {
+ return bool(C.wenclose(w.win, C.int(y), C.int(x)))
+}
+
+func (w *Window) Move(y int, x int) {
+ C.wmove(w.win, C.int(y), C.int(x))
}
-func MoveAndClear(y int, x int) {
- Move(y, x)
- C.clrtoeol()
+func (w *Window) MoveAndClear(y int, x int) {
+ w.Move(y, x)
+ C.wclrtoeol(w.win)
}
-func Print(text string) {
- C.addstr(C.CString(strings.Map(func(r rune) rune {
+func (w *Window) Print(text string) {
+ C.waddstr(w.win, C.CString(strings.Map(func(r rune) rune {
if r < 32 {
return -1
}
@@ -606,11 +648,11 @@ func Print(text string) {
}, text)))
}
-func CPrint(pair int, bold bool, text string) {
+func (w *Window) CPrint(pair int, bold bool, text string) {
attr := _color(pair, bold)
- C.attron(attr)
- Print(text)
- C.attroff(attr)
+ C.wattron(w.win, attr)
+ w.Print(text)
+ C.wattroff(w.win, attr)
}
func Clear() {
@@ -625,6 +667,30 @@ func Refresh() {
C.refresh()
}
+func (w *Window) Erase() {
+ C.werase(w.win)
+}
+
+func (w *Window) Fill(str string) bool {
+ return C.waddstr(w.win, C.CString(str)) == C.OK
+}
+
+func (w *Window) CFill(str string, fg int, bg int, bold bool) bool {
+ attr := _color(PairFor(fg, bg), bold)
+ C.wattron(w.win, attr)
+ ret := w.Fill(str)
+ C.wattroff(w.win, attr)
+ return ret
+}
+
+func (w *Window) Refresh() {
+ C.wnoutrefresh(w.win)
+}
+
+func DoUpdate() {
+ C.doupdate()
+}
+
func PairFor(fg int, bg int) int {
key := (fg << 8) + bg
if found, prs := _colorMap[key]; prs {