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  }