1package core_test
2
3import (
4 "testing"
5
6 "github.com/bnema/neferwl/internal/ports"
7)
8
9func windowIn(set []ports.Scene, output string, id ports.WindowID) (ports.SceneWindow, bool) {
10 for _, s := range set {
11 if s.Output != output {
12 continue
13 }
14 for _, w := range s.Windows {
15 if w.ID == id && !w.Hidden {
16 return w, true
17 }
18 }
19 }
20 return ports.SceneWindow{}, false
21}
22
23func TestFreeFloatKeepsPlaceAcrossMonitors(t *testing.T) {
24 both(t, func(t *testing.T, animated bool) {
25 r := startLanding(t, animated, func(c *ports.Config) { c.Layout.Gaps = 0 }, left, right)
26 r.mapLanded(t, 1)
27 r.mapLanded(t, 2)
28 r.keyLanded(t, "space", ports.ModAlt|ports.ModShift)
29 // Nudge left twice: 100 px left of centre on a 200 px output stops at
30 // the edge.
31 r.keyLanded(t, "Left", ports.ModAlt|ports.ModShift)
32 set := r.keyLanded(t, "Left", ports.ModAlt|ports.ModShift)
33 before, ok := windowIn(set, "DP-1", 2)
34 if !ok || !before.Floating || before.Rect.X != 0 {
35 t.Fatalf("%+v", before)
36 }
37 // The workspace moves to the 400x200 output: the centre keeps its
38 // fractions of the usable area (1/4, 1/2), the size stays.
39 set = r.keyLanded(t, "Right", ports.ModAlt|ports.ModCtrl|ports.ModShift)
40 after, ok := windowIn(set, "DP-2", 2)
41 if !ok || after.Rect.W != before.Rect.W || after.Rect.X+after.Rect.W/2 != 100 || after.Rect.Y+after.Rect.H/2 != 100 {
42 t.Fatalf("%+v", after)
43 }
44 })
45}