detached bbca21d

fix(vulkan): draw the active position hint dot white and larger so the current band stands out

commit
bbca21d5be4d6242cba41ac7b9d92c67caad77f7
author
brice · · 2026-10-20 02:00 UTC
parent
a941335
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
2 files · +16 -11
M internal/adapters/vulkan/position_hint.go +10 -7
@@ -16,20 +16,23 @@ func (w *sceneWalk) positionHint() {
1616 alpha := w.alpha
1717 w.alpha = h.Opacity * 0.8
1818 w.hintRound(w.physRect(b.X, b.Y, b.W, b.H), w.phys(ports.PositionHintRadius), [3]uint8{30, 30, 38})
19- active := parseColor(w.s.Border.Active)
19+ // The active dot is white, opaque and larger, whatever border.active is:
20+ // a grey accent must not blend it into the other dots of its column.
2021 for col := range min(int(h.Columns), ports.PositionHintMaxColumns) {
2122 for row := range min(int(h.Counts[col]), ports.PositionHintMaxRows) {
22- color, opacity := [3]uint8{190, 190, 200}, float32(0.3)
23+ color, opacity, d := [3]uint8{190, 190, 200}, float32(0.2), ports.PositionHintDiameter
2324 if !h.Vertical && col == int(h.ActiveCol) {
24- opacity = 0.65
25+ opacity = 0.45
2526 }
2627 if col == int(h.ActiveCol) && row == int(h.ActiveRow) {
27- color, opacity = active, 1
28+ color, opacity, d = [3]uint8{255, 255, 255}, 1, ports.PositionHintActiveDiameter
2829 }
2930 w.alpha = h.Opacity * opacity
30- x := b.X + ports.PositionHintPadding + col*(ports.PositionHintDiameter+ports.PositionHintGap)
31- y := b.Y + ports.PositionHintPadding + row*(ports.PositionHintDiameter+ports.PositionHintGap)
32- w.hintRound(w.physRect(x, y, ports.PositionHintDiameter, ports.PositionHintDiameter), w.phys(ports.PositionHintDiameter)/2, color)
31+ // Every dot is centered in its PositionHintDiameter cell.
32+ inset := (ports.PositionHintDiameter - d) / 2
33+ x := b.X + ports.PositionHintPadding + col*(ports.PositionHintDiameter+ports.PositionHintGap) + inset
34+ y := b.Y + ports.PositionHintPadding + row*(ports.PositionHintDiameter+ports.PositionHintGap) + inset
35+ w.hintRound(w.physRect(x, y, d, d), w.phys(d)/2, color)
3336 }
3437 }
3538 w.alpha = alpha
@@ -16,20 +16,23 @@ func (w *sceneWalk) positionHint() {
16 alpha := w.alpha16 alpha := w.alpha
17 w.alpha = h.Opacity * 0.817 w.alpha = h.Opacity * 0.8
18 w.hintRound(w.physRect(b.X, b.Y, b.W, b.H), w.phys(ports.PositionHintRadius), [3]uint8{30, 30, 38})18 w.hintRound(w.physRect(b.X, b.Y, b.W, b.H), w.phys(ports.PositionHintRadius), [3]uint8{30, 30, 38})
19- active := parseColor(w.s.Border.Active)19+ // The active dot is white, opaque and larger, whatever border.active is:
20+ // a grey accent must not blend it into the other dots of its column.
20 for col := range min(int(h.Columns), ports.PositionHintMaxColumns) {21 for col := range min(int(h.Columns), ports.PositionHintMaxColumns) {
21 for row := range min(int(h.Counts[col]), ports.PositionHintMaxRows) {22 for row := range min(int(h.Counts[col]), ports.PositionHintMaxRows) {
22- color, opacity := [3]uint8{190, 190, 200}, float32(0.3)23+ color, opacity, d := [3]uint8{190, 190, 200}, float32(0.2), ports.PositionHintDiameter
23 if !h.Vertical && col == int(h.ActiveCol) {24 if !h.Vertical && col == int(h.ActiveCol) {
24- opacity = 0.6525+ opacity = 0.45
25 }26 }
26 if col == int(h.ActiveCol) && row == int(h.ActiveRow) {27 if col == int(h.ActiveCol) && row == int(h.ActiveRow) {
27- color, opacity = active, 128+ color, opacity, d = [3]uint8{255, 255, 255}, 1, ports.PositionHintActiveDiameter
28 }29 }
29 w.alpha = h.Opacity * opacity30 w.alpha = h.Opacity * opacity
30- x := b.X + ports.PositionHintPadding + col*(ports.PositionHintDiameter+ports.PositionHintGap)31+ // Every dot is centered in its PositionHintDiameter cell.
31- y := b.Y + ports.PositionHintPadding + row*(ports.PositionHintDiameter+ports.PositionHintGap)32+ inset := (ports.PositionHintDiameter - d) / 2
32- w.hintRound(w.physRect(x, y, ports.PositionHintDiameter, ports.PositionHintDiameter), w.phys(ports.PositionHintDiameter)/2, color)33+ x := b.X + ports.PositionHintPadding + col*(ports.PositionHintDiameter+ports.PositionHintGap) + inset
34+ y := b.Y + ports.PositionHintPadding + row*(ports.PositionHintDiameter+ports.PositionHintGap) + inset
35+ w.hintRound(w.physRect(x, y, d, d), w.phys(d)/2, color)
33 }36 }
34 }37 }
35 w.alpha = alpha38 w.alpha = alpha
M internal/ports/position_hint.go +6 -4
@@ -4,10 +4,12 @@ const (
44 PositionHintMaxColumns = 16
55 PositionHintMaxRows = 16
66 PositionHintDiameter = 8
7- PositionHintGap = 10
8- PositionHintPadding = 10
9- PositionHintBottom = 48
10- PositionHintRadius = 10
7+ // PositionHintActiveDiameter fits in the padding and gap around its cell.
8+ PositionHintActiveDiameter = 12
9+ PositionHintGap = 10
10+ PositionHintPadding = 10
11+ PositionHintBottom = 48
12+ PositionHintRadius = 10
1113 )
1214
1315 // PositionHint is a bounded, comparable snapshot. Scenes copy it by value;
@@ -4,10 +4,12 @@ const (
4 PositionHintMaxColumns = 164 PositionHintMaxColumns = 16
5 PositionHintMaxRows = 165 PositionHintMaxRows = 16
6 PositionHintDiameter = 86 PositionHintDiameter = 8
7- PositionHintGap = 107+ // PositionHintActiveDiameter fits in the padding and gap around its cell.
8- PositionHintPadding = 108+ PositionHintActiveDiameter = 12
9- PositionHintBottom = 489+ PositionHintGap = 10
10- PositionHintRadius = 1010+ PositionHintPadding = 10
11+ PositionHintBottom = 48
12+ PositionHintRadius = 10
11 )13 )
12 14
13 // PositionHint is a bounded, comparable snapshot. Scenes copy it by value;15 // PositionHint is a bounded, comparable snapshot. Scenes copy it by value;

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 25

Tags 10

↑↓ moveenter openesc close