package autoscroll import "github.com/gotk3/gotk3/gtk" type ScrolledWindow struct { gtk.ScrolledWindow vadj *gtk.Adjustment Bottomed bool // :floshed: } func NewScrolledWindow() *ScrolledWindow { gtksw, _ := gtk.ScrolledWindowNew(nil, nil) gtksw.SetProperty("propagate-natural-height", true) gtksw.SetProperty("window-placement", gtk.CORNER_BOTTOM_LEFT) sw := &ScrolledWindow{*gtksw, gtksw.GetVAdjustment(), true} // bottomed by default sw.Connect("size-allocate", func(_ *gtk.ScrolledWindow) { // We can't really trust Gtk to be competent. if sw.Bottomed { sw.ScrollToBottom() } }) sw.vadj.Connect("value-changed", func(adj *gtk.Adjustment) { // Manually check if we're anchored on scroll. sw.Bottomed = (adj.GetUpper() - adj.GetPageSize()) <= adj.GetValue() }) return sw } // GetVAdjustment overrides gtk.ScrolledWindow's. func (s *ScrolledWindow) GetVAdjustment() *gtk.Adjustment { return s.vadj } func (s *ScrolledWindow) ScrollToBottom() { s.vadj.SetValue(s.vadj.GetUpper()) }