diff --git a/app/internal/window/os_android.go b/app/internal/window/os_android.go index be90954a..15d3bc32 100644 --- a/app/internal/window/os_android.go +++ b/app/internal/window/os_android.go @@ -384,6 +384,7 @@ func (w *window) draw(sync bool) { ppdp := float32(w.dpi) * inchPrDp w.callbacks.Event(FrameEvent{ FrameEvent: system.FrameEvent{ + Now: time.Now(), Size: image.Point{ X: int(width), Y: int(height), @@ -392,7 +393,6 @@ func (w *window) draw(sync bool) { Config: &config{ pxPerDp: ppdp, pxPerSp: w.fontScale * ppdp, - now: time.Now(), }, }, Sync: sync, diff --git a/app/internal/window/os_ios.go b/app/internal/window/os_ios.go index fa710fa6..f63c24c4 100644 --- a/app/internal/window/os_ios.go +++ b/app/internal/window/os_ios.go @@ -108,6 +108,7 @@ func (w *window) draw(sync bool) { const inchPrDp = 1.0 / 163 w.w.Event(FrameEvent{ FrameEvent: system.FrameEvent{ + Now: time.Now(), Size: image.Point{ X: int(params.width + .5), Y: int(params.height + .5), @@ -121,7 +122,6 @@ func (w *window) draw(sync bool) { Config: &config{ pxPerDp: float32(params.dpi) * inchPrDp, pxPerSp: float32(params.sdpi) * inchPrDp, - now: time.Now(), }, }, Sync: sync, diff --git a/app/internal/window/os_js.go b/app/internal/window/os_js.go index a5bc5956..551a645f 100644 --- a/app/internal/window/os_js.go +++ b/app/internal/window/os_js.go @@ -413,9 +413,9 @@ func (w *window) draw(sync bool) { w.mu.Lock() w.scale = float32(scale) w.mu.Unlock() - cfg.now = time.Now() w.w.Event(FrameEvent{ FrameEvent: system.FrameEvent{ + Now: time.Now(), Size: image.Point{ X: width, Y: height, diff --git a/app/internal/window/os_macos.go b/app/internal/window/os_macos.go index 224bb972..fef2acda 100644 --- a/app/internal/window/os_macos.go +++ b/app/internal/window/os_macos.go @@ -228,10 +228,10 @@ func (w *window) draw() { width := int(wf*w.scale + .5) height := int(hf*w.scale + .5) cfg := configFor(w.scale) - cfg.now = time.Now() w.setStage(system.StageRunning) w.w.Event(FrameEvent{ FrameEvent: system.FrameEvent{ + Now: time.Now(), Size: image.Point{ X: width, Y: height, diff --git a/app/internal/window/os_wayland.go b/app/internal/window/os_wayland.go index 2a683666..87209bb6 100644 --- a/app/internal/window/os_wayland.go +++ b/app/internal/window/os_wayland.go @@ -1385,9 +1385,9 @@ func (w *window) draw(sync bool) { // Use the surface as listener data for gio_onFrameDone. C.wl_callback_add_listener(w.lastFrameCallback, &C.gio_callback_listener, unsafe.Pointer(w.surf)) } - cfg.now = time.Now() w.w.Event(FrameEvent{ FrameEvent: system.FrameEvent{ + Now: time.Now(), Size: image.Point{ X: width, Y: height, diff --git a/app/internal/window/os_windows.go b/app/internal/window/os_windows.go index 52dab973..41c0d079 100644 --- a/app/internal/window/os_windows.go +++ b/app/internal/window/os_windows.go @@ -370,9 +370,9 @@ func (w *window) draw(sync bool) { return } cfg := configForDC() - cfg.now = time.Now() w.w.Event(FrameEvent{ FrameEvent: system.FrameEvent{ + Now: time.Now(), Size: image.Point{ X: w.width, Y: w.height, diff --git a/app/internal/window/os_x11.go b/app/internal/window/os_x11.go index 3d0b27e6..81cd370a 100644 --- a/app/internal/window/os_x11.go +++ b/app/internal/window/os_x11.go @@ -184,9 +184,9 @@ loop: } if anim || syn { - w.cfg.now = time.Now() w.w.Event(FrameEvent{ FrameEvent: system.FrameEvent{ + Now: time.Now(), Size: image.Point{ X: w.width, Y: w.height, diff --git a/app/internal/window/window.go b/app/internal/window/window.go index b52ece19..d3b30129 100644 --- a/app/internal/window/window.go +++ b/app/internal/window/window.go @@ -7,7 +7,6 @@ package window import ( "errors" "math" - "time" "gioui.org/gpu/backend" "gioui.org/io/event" @@ -78,11 +77,6 @@ type config struct { pxPerDp float32 // Device pixels per sp. pxPerSp float32 - now time.Time -} - -func (c *config) Now() time.Time { - return c.now } func (c *config) Px(v unit.Value) int { diff --git a/io/system/system.go b/io/system/system.go index ac562633..4704789e 100644 --- a/io/system/system.go +++ b/io/system/system.go @@ -18,6 +18,9 @@ import ( // input. type FrameEvent struct { Config Config + // Now is the current animation. Use Now instead of time.Now to + // synchronize animation and to avoid the time.Now call overhead. + Now time.Time // Size is the dimensions of the window. Size image.Point // Insets is the insets to apply. @@ -51,9 +54,6 @@ type FrameEvent struct { // Config defines the essential properties of // the environment. type Config interface { - // Now returns the current animation time. - Now() time.Time - unit.Converter } diff --git a/layout/context.go b/layout/context.go index 2eda47a5..3c5c6393 100644 --- a/layout/context.go +++ b/layout/context.go @@ -24,6 +24,9 @@ type Context struct { // By convention, a nil Queue is a signal to widgets to draw themselves // in a disabled state. Queue event.Queue + // Now is the animation time. + Now time.Time + *op.Ops } @@ -31,6 +34,7 @@ type Context struct { // // Context{ // Ops: ops, +// Now: e.Now, // Queue: e.Queue, // Config: e.Config, // Constraints: Exact(e.Size), @@ -41,20 +45,13 @@ func NewContext(ops *op.Ops, e system.FrameEvent) Context { ops.Reset() return Context{ Ops: ops, + Now: e.Now, Queue: e.Queue, Config: e.Config, Constraints: Exact(e.Size), } } -// Now returns the configuration time or the zero time. -func (c Context) Now() time.Time { - if c.Config == nil { - return time.Time{} - } - return c.Config.Now() -} - // Px maps the value to pixels. If no configuration is set, // Px returns the rounded value of v. func (c Context) Px(v unit.Value) int { diff --git a/layout/list.go b/layout/list.go index 243948f6..689a80ad 100644 --- a/layout/list.go +++ b/layout/list.go @@ -121,7 +121,7 @@ func (l *List) Dragging() bool { } func (l *List) update() { - d := l.scroll.Scroll(l.ctx, l.ctx, l.ctx.Now(), gesture.Axis(l.Axis)) + d := l.scroll.Scroll(l.ctx, l.ctx, l.ctx.Now, gesture.Axis(l.Axis)) l.scrollDelta = d l.Position.Offset += d } diff --git a/widget/button.go b/widget/button.go index 591431df..f5349204 100644 --- a/widget/button.go +++ b/widget/button.go @@ -80,7 +80,7 @@ func (b *Clickable) Layout(gtx layout.Context) layout.Dimensions { stack.Pop() for len(b.history) > 0 { c := b.history[0] - if c.End.IsZero() || gtx.Now().Sub(c.End) < 1*time.Second { + if c.End.IsZero() || gtx.Now.Sub(c.End) < 1*time.Second { break } n := copy(b.history, b.history[1:]) @@ -104,19 +104,19 @@ func (b *Clickable) update(gtx layout.Context) { NumClicks: e.NumClicks, }) if l := len(b.history); l > 0 { - b.history[l-1].End = gtx.Now() + b.history[l-1].End = gtx.Now } case gesture.TypeCancel: for i := range b.history { b.history[i].Cancelled = true if b.history[i].End.IsZero() { - b.history[i].End = gtx.Now() + b.history[i].End = gtx.Now } } case gesture.TypePress: b.history = append(b.history, Press{ Position: e.Position, - Start: gtx.Now(), + Start: gtx.Now, }) } } diff --git a/widget/editor.go b/widget/editor.go index 27c5d640..91ac6eea 100644 --- a/widget/editor.go +++ b/widget/editor.go @@ -129,7 +129,7 @@ func (e *Editor) processPointer(gtx layout.Context) { axis = gesture.Vertical smin, smax = sbounds.Min.Y, sbounds.Max.Y } - sdist := e.scroller.Scroll(gtx, gtx, gtx.Now(), axis) + sdist := e.scroller.Scroll(gtx, gtx, gtx.Now, axis) var soff int if e.SingleLine { e.scrollRel(sdist, 0) @@ -142,7 +142,7 @@ func (e *Editor) processPointer(gtx layout.Context) { switch { case evt.Type == gesture.TypePress && evt.Source == pointer.Mouse, evt.Type == gesture.TypeClick && evt.Source == pointer.Touch: - e.blinkStart = gtx.Now() + e.blinkStart = gtx.Now e.moveCoord(gtx, image.Point{ X: int(math.Round(float64(evt.Position.X))), Y: int(math.Round(float64(evt.Position.Y))), @@ -163,7 +163,7 @@ func (e *Editor) processKey(gtx layout.Context) { e.events = append(e.events, ChangeEvent{}) } for _, ke := range gtx.Events(&e.eventKey) { - e.blinkStart = gtx.Now() + e.blinkStart = gtx.Now switch ke := ke.(type) { case key.FocusEvent: e.focused = ke.Focus @@ -309,7 +309,7 @@ func (e *Editor) layout(gtx layout.Context) layout.Dimensions { e.clicker.Add(gtx.Ops) e.caretOn = false if e.focused { - now := gtx.Now() + now := gtx.Now dt := now.Sub(e.blinkStart) blinking := dt < maxBlinkDuration const timePerBlink = time.Second / blinksPerSecond diff --git a/widget/material/button.go b/widget/material/button.go index aa16be8d..be9c96a4 100644 --- a/widget/material/button.go +++ b/widget/material/button.go @@ -198,7 +198,7 @@ func drawInk(gtx layout.Context, c widget.Press) { fadeDuration = float32(0.9) ) - now := gtx.Now() + now := gtx.Now t := float32(now.Sub(c.Start).Seconds())