detached 19dda7c

fix(drm): turn VRR off on time when a composed screen stops changing

commit
19dda7cecf62f7fdeb0d37311b0491baa5832ee5
author
brice · · 2026-09-25 18:03 UTC
parent
cdcafdb
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
1 file · +8 -4
M internal/adapters/drm/output.go +8 -4
@@ -293,9 +293,17 @@ func (o *Output) Run(ctx context.Context, newRenderer func(w, h int) (ports.Rend
293293 if o.unsent.Output != "" {
294294 retry = time.After(time.Millisecond)
295295 }
296+ // A composed screen that stopped changing still drops VRR on time.
297+ var vrrOff <-chan time.Time
298+ if o.vrrOn && !o.composedSince.IsZero() {
299+ vrrOff = time.After(max(0, vrrHold-time.Since(o.composedSince)))
300+ }
296301 select {
297302 case <-retry:
298303 continue
304+ case <-vrrOff:
305+ o.setVRR(false)
306+ continue
299307 case <-ctx.Done():
300308 return nil
301309 case on := <-active:
@@ -365,10 +373,6 @@ func (o *Output) Run(ctx context.Context, newRenderer func(w, h int) (ports.Rend
365373 dirty = dirty || scene.Shows(c.ID)
366374 case <-stats.C:
367375 o.dropClientFBs(time.Now(), false)
368- // A composed screen that stopped changing still drops VRR.
369- if !o.composedSince.IsZero() && time.Since(o.composedSince) > vrrHold {
370- o.setVRR(false)
371- }
372376 ev := o.log.Info().Int("frames", frame).Int("flips", o.flips)
373377 if o.cursor != nil {
374378 cs := o.cursor.TakeStats()
@@ -293,9 +293,17 @@ func (o *Output) Run(ctx context.Context, newRenderer func(w, h int) (ports.Rend
293 if o.unsent.Output != "" {293 if o.unsent.Output != "" {
294 retry = time.After(time.Millisecond)294 retry = time.After(time.Millisecond)
295 }295 }
296+ // A composed screen that stopped changing still drops VRR on time.
297+ var vrrOff <-chan time.Time
298+ if o.vrrOn && !o.composedSince.IsZero() {
299+ vrrOff = time.After(max(0, vrrHold-time.Since(o.composedSince)))
300+ }
296 select {301 select {
297 case <-retry:302 case <-retry:
298 continue303 continue
304+ case <-vrrOff:
305+ o.setVRR(false)
306+ continue
299 case <-ctx.Done():307 case <-ctx.Done():
300 return nil308 return nil
301 case on := <-active:309 case on := <-active:
@@ -365,10 +373,6 @@ func (o *Output) Run(ctx context.Context, newRenderer func(w, h int) (ports.Rend
365 dirty = dirty || scene.Shows(c.ID)373 dirty = dirty || scene.Shows(c.ID)
366 case <-stats.C:374 case <-stats.C:
367 o.dropClientFBs(time.Now(), false)375 o.dropClientFBs(time.Now(), false)
368- // A composed screen that stopped changing still drops VRR.
369- if !o.composedSince.IsZero() && time.Since(o.composedSince) > vrrHold {
370- o.setVRR(false)
371- }
372 ev := o.log.Info().Int("frames", frame).Int("flips", o.flips)376 ev := o.log.Info().Int("frames", frame).Int("flips", o.flips)
373 if o.cursor != nil {377 if o.cursor != nil {
374 cs := o.cursor.TakeStats()378 cs := o.cursor.TakeStats()

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 23

Tags 10

↑↓ moveenter openesc close