9fans.net/go@v0.0.7/cmd/acme/internal/wind/scrl.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 wind 16 17 import ( 18 "9fans.net/go/cmd/acme/internal/adraw" 19 "9fans.net/go/cmd/acme/internal/util" 20 "9fans.net/go/draw" 21 "9fans.net/go/draw/frame" 22 ) 23 24 var scrtmp *draw.Image 25 26 func scrpos(r draw.Rectangle, p0 int, p1 int, tot int) draw.Rectangle { 27 q := r 28 h := q.Max.Y - q.Min.Y 29 if tot == 0 { 30 return q 31 } 32 if tot > 1024*1024 { 33 tot >>= 10 34 p0 >>= 10 35 p1 >>= 10 36 } 37 if p0 > 0 { 38 q.Min.Y += h * p0 / tot 39 } 40 if p1 < tot { 41 q.Max.Y -= h * (tot - p1) / tot 42 } 43 if q.Max.Y < q.Min.Y+2 { 44 if q.Min.Y+2 <= r.Max.Y { 45 q.Max.Y = q.Min.Y + 2 46 } else { 47 q.Min.Y = q.Max.Y - 2 48 } 49 } 50 return q 51 } 52 53 func Scrlresize() { 54 scrtmp.Free() 55 var err error 56 scrtmp, err = adraw.Display.AllocImage(draw.Rect(0, 0, 32, adraw.Display.ScreenImage.R.Max.Y), adraw.Display.ScreenImage.Pix, false, draw.NoFill) 57 if err != nil { 58 util.Fatal("scroll alloc") 59 } 60 } 61 62 func Textscrdraw(t *Text) { 63 if t.W == nil || t != &t.W.Body { 64 return 65 } 66 if scrtmp == nil { 67 Scrlresize() 68 } 69 r := t.ScrollR 70 b := scrtmp 71 r1 := r 72 r1.Min.X = 0 73 r1.Max.X = r.Dx() 74 r2 := scrpos(r1, t.Org, t.Org+t.Fr.NumChars, t.Len()) 75 if !(r2 == t.lastsr) { 76 t.lastsr = r2 77 b.Draw(r1, t.Fr.Cols[frame.BORD], nil, draw.ZP) 78 b.Draw(r2, t.Fr.Cols[frame.BACK], nil, draw.ZP) 79 r2.Min.X = r2.Max.X - 1 80 b.Draw(r2, t.Fr.Cols[frame.BORD], nil, draw.ZP) 81 t.Fr.B.Draw(r, b, nil, draw.Pt(0, r1.Min.Y)) 82 //flushimage(display, 1); // BUG? 83 } 84 }