9fans.net/go@v0.0.7/cmd/acme/internal/ui/scrl1.go (about) 1 // #include <u.h> 2 // #include <libc.h> 3 // #include <draw.h> 4 // #include <thread.h> 5 // #include <cursor.h> 6 // #include <mouse.h> 7 // #include <keyboard.h> 8 // #include <frame.h> 9 // #include <fcall.h> 10 // #include <plumb.h> 11 // #include <libsec.h> 12 // #include "dat.h" 13 // #include "fns.h" 14 15 package ui 16 17 import ( 18 "time" 19 20 "9fans.net/go/cmd/acme/internal/adraw" 21 "9fans.net/go/cmd/acme/internal/wind" 22 "9fans.net/go/draw" 23 ) 24 25 func scrsleep(dt time.Duration) { 26 timer := time.NewTimer(dt) 27 defer timer.Stop() 28 select { 29 case <-timer.C: 30 case Mousectl.Mouse = <-Mousectl.C: 31 } 32 } 33 34 func Textscroll(t *wind.Text, but int) { 35 s := t.ScrollR.Inset(1) 36 h := s.Max.Y - s.Min.Y 37 x := (s.Min.X + s.Max.X) / 2 38 oldp0 := ^0 39 first := true 40 for { 41 adraw.Display.Flush() 42 my := Mouse.Point.Y 43 if my < s.Min.Y { 44 my = s.Min.Y 45 } 46 if my >= s.Max.Y { 47 my = s.Max.Y 48 } 49 if !(Mouse.Point == draw.Pt(x, my)) { 50 adraw.Display.MoveCursor(draw.Pt(x, my)) 51 Mousectl.Read() // absorb event generated by moveto() 52 } 53 var p0 int 54 if but == 2 { 55 y := my 56 p0 = int(int64(t.Len()) * int64(y-s.Min.Y) / int64(h)) 57 if p0 >= t.Q1 { 58 p0 = wind.Textbacknl(t, p0, 2) 59 } 60 if oldp0 != p0 { 61 wind.Textsetorigin(t, p0, false) 62 } 63 oldp0 = p0 64 Mousectl.Read() 65 goto Continue 66 } 67 if but == 1 { 68 p0 = wind.Textbacknl(t, t.Org, (my-s.Min.Y)/t.Fr.Font.Height) 69 } else { 70 p0 = t.Org + t.Fr.CharOf(draw.Pt(s.Max.X, my)) 71 } 72 if oldp0 != p0 { 73 wind.Textsetorigin(t, p0, true) 74 } 75 oldp0 = p0 76 // debounce 77 if first { 78 adraw.Display.Flush() 79 time.Sleep(200 * time.Millisecond) 80 select { 81 default: 82 // non-blocking 83 case Mousectl.Mouse = <-Mousectl.C: 84 // ok 85 } 86 first = false 87 } 88 scrsleep(80 * time.Millisecond) 89 Continue: 90 if Mouse.Buttons&(1<<(but-1)) == 0 { 91 break 92 } 93 } 94 for Mouse.Buttons != 0 { 95 Mousectl.Read() 96 } 97 }