Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 14 additions & 2 deletions _examples/size.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ func main() {
defer g.Close()

g.SetManagerFunc(layout)
g.SetResizeFunc(onresize)

if err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil {
log.Panicln(err)
Expand All @@ -31,12 +32,23 @@ func main() {

func layout(g *gocui.Gui) error {
maxX, maxY := g.Size()
v, err := g.SetView("size", maxX/2-7, maxY/2, maxX/2+7, maxY/2+2)
_, err := g.SetView("size", maxX/2-7, maxY/2, maxX/2+7, maxY/2+2)
if err != nil && err != gocui.ErrUnknownView {
return err
}
return nil
}

func onresize(g *gocui.Gui, x, y int) error {
v, err := g.View("size")
if err != nil {
if err != gocui.ErrUnknownView {
return err
}
return nil
}
v.Clear()
fmt.Fprintf(v, "%d, %d", maxX, maxY)
fmt.Fprintf(v, "%d, %d", x, y)
return nil
}

Expand Down
33 changes: 25 additions & 8 deletions gui.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,15 @@ const (
// Gui represents the whole User Interface, including the views, layouts
// and keybindings.
type Gui struct {
tbEvents chan termbox.Event
userEvents chan userEvent
views []*View
currentView *View
managers []Manager
keybindings []*keybinding
maxX, maxY int
outputMode OutputMode
tbEvents chan termbox.Event
userEvents chan userEvent
views []*View
currentView *View
managers []Manager
resizeHandler func(g *Gui, x, y int) error
keybindings []*keybinding
maxX, maxY int
outputMode OutputMode

// BgColor and FgColor allow to configure the background and foreground
// colors of the GUI.
Expand Down Expand Up @@ -346,6 +347,11 @@ func (g *Gui) SetManagerFunc(manager func(*Gui) error) {
g.SetManager(ManagerFunc(manager))
}

// SetResizeFunc sets a handler that will be called on resize events.
func (g *Gui) SetResizeFunc(handler func(g *Gui, x, y int) error) {
g.resizeHandler = handler
}

// MainLoop runs the main loop until an error is returned. A successful
// finish should return ErrQuit.
func (g *Gui) MainLoop() error {
Expand Down Expand Up @@ -411,6 +417,8 @@ func (g *Gui) handleEvent(ev *termbox.Event) error {
switch ev.Type {
case termbox.EventKey, termbox.EventMouse:
return g.onKey(ev)
case termbox.EventResize:
return g.onResize(ev)
case termbox.EventError:
return ev.Err
default:
Expand Down Expand Up @@ -634,3 +642,12 @@ func (g *Gui) execKeybindings(v *View, ev *termbox.Event) (matched bool, err err
}
return matched, nil
}

// onResize manages resize events. It executes the resize handler if it's set.
func (g *Gui) onResize(ev *termbox.Event) error {
if g.resizeHandler != nil {
maxX, maxY := g.Size()
return g.resizeHandler(g, maxX, maxY)
}
return nil
}