rxhanson / Rectangle

Move and resize windows on macOS with keyboard shortcuts and snap areas
https://rectangleapp.com
Other
25.1k stars 742 forks source link

Cycling direction inverted for thirds & fourths #1317

Open tscohen opened 6 months ago

tscohen commented 6 months ago

Setup: laptop + ultrawide external monitor. Option "repeated commands" is set to "move to adjacent display on left or right".

When using (for example) the "Left Half" action via keyboard shortcut, I get behaviour that makes sense: First, the app snaps to the left half, then upon repeating the shortcut, it moves to the right half of laptop screen then to the left of the laptop screen, then to the right of my main monitor, and finally back to the left of my main monitor.

When I do this with thirds or fourths the cycling direction is inverted relative to what I would expect, and the app stays on the external monitor. Using "Left Third" I get: first the app snaps to the left third (expected), then instead of going to the laptop screen it goes to the middle third (i.e. moves Right), then the right third, and finally to the left third again. It is very counterintuitive that snapping to the left repeatedly (using a shortcut involving the left arrow in my case) moves the app to the right (after initially snapping to the left). The app also does not go to the other display, despite the repeated commands setting mentioned above.

This is my first time using Rectangle, so if this is a misunderstanding on my part I apologize in advance.

Below are the logs for snapping to the left fourth repeatedly:

macOS version: 14.2.1 Rectangle version: 3.0.15 (156) Logs if applicable (In Rectangle menu, hold option, "View Logging..."): 2023-12-30T12:58:59+01:00: Rectangle Pro v3.0.15 (156) macOS: Version 14.2.1 (Build 23C71) Model: Mac15,7 [3] License activation: X 2023-12-30T12:59:13+01:00: AX sizing proposed: (1280.0, 1330.0), result: (1280.0, 1329.0) 2023-12-30T12:59:13+01:00: AX position proposed: (0.0, 25.0), result: (0.0, 25.0) 2023-12-30T12:59:13+01:00: AX sizing proposed: (1280.0, 1330.0), result: (1280.0, 1329.0) 2023-12-30T12:59:13+01:00: firstFourth | display: (0.0, 85.0, 5120.0, 1330.0), calculatedRect: (0.0, 25.0, 1280.0, 1330.0), resultRect: (0.0, 25.0, 1280.0, 1329.0), srcScreen: LS49A950U, destScreen: LS49A950U, resultScreen: LS49A950U 2023-12-30T12:59:15+01:00: AX sizing proposed: (1280.0, 1330.0), result: (1280.0, 1329.0) 2023-12-30T12:59:15+01:00: AX position proposed: (1280.0, 25.0), result: (1280.0, 25.0) 2023-12-30T12:59:15+01:00: AX sizing proposed: (1280.0, 1330.0), result: (1280.0, 1329.0) 2023-12-30T12:59:15+01:00: firstFourth | display: (0.0, 85.0, 5120.0, 1330.0), calculatedRect: (1280.0, 25.0, 1280.0, 1330.0), resultRect: (1280.0, 25.0, 1280.0, 1329.0), srcScreen: LS49A950U, destScreen: LS49A950U, resultScreen: LS49A950U 2023-12-30T12:59:16+01:00: AX sizing proposed: (1280.0, 1330.0), result: (1280.0, 1329.0) 2023-12-30T12:59:16+01:00: AX position proposed: (2560.0, 25.0), result: (2560.0, 25.0) 2023-12-30T12:59:16+01:00: AX sizing proposed: (1280.0, 1330.0), result: (1280.0, 1329.0) 2023-12-30T12:59:16+01:00: firstFourth | display: (0.0, 85.0, 5120.0, 1330.0), calculatedRect: (2560.0, 25.0, 1280.0, 1330.0), resultRect: (2560.0, 25.0, 1280.0, 1329.0), srcScreen: LS49A950U, destScreen: LS49A950U, resultScreen: LS49A950U 2023-12-30T12:59:17+01:00: AX sizing proposed: (1280.0, 1330.0), result: (1280.0, 1329.0) 2023-12-30T12:59:17+01:00: AX position proposed: (3840.0, 25.0), result: (3840.0, 25.0) 2023-12-30T12:59:17+01:00: AX sizing proposed: (1280.0, 1330.0), result: (1280.0, 1329.0) 2023-12-30T12:59:17+01:00: firstFourth | display: (0.0, 85.0, 5120.0, 1330.0), calculatedRect: (3840.0, 25.0, 1280.0, 1330.0), resultRect: (3840.0, 25.0, 1280.0, 1329.0), srcScreen: LS49A950U, destScreen: LS49A950U, resultScreen: LS49A950U 2023-12-30T12:59:18+01:00: AX sizing proposed: (1280.0, 1330.0), result: (1280.0, 1329.0) 2023-12-30T12:59:18+01:00: AX position proposed: (0.0, 25.0), result: (0.0, 25.0) 2023-12-30T12:59:18+01:00: AX sizing proposed: (1280.0, 1330.0), result: (1280.0, 1329.0) 2023-12-30T12:59:18+01:00: firstFourth | display: (0.0, 85.0, 5120.0, 1330.0), calculatedRect: (0.0, 25.0, 1280.0, 1330.0), resultRect: (0.0, 25.0, 1280.0, 1329.0), srcScreen: LS49A950U, destScreen: LS49A950U, resultScreen: LS49A950U 2023-12-30T12:59:20+01:00: AX sizing proposed: (1280.0, 1330.0), result: (1280.0, 1329.0) 2023-12-30T12:59:20+01:00: AX position proposed: (1280.0, 25.0), result: (1280.0, 25.0) 2023-12-30T12:59:20+01:00: AX sizing proposed: (1280.0, 1330.0), result: (1280.0, 1329.0) 2023-12-30T12:59:20+01:00: firstFourth | display: (0.0, 85.0, 5120.0, 1330.0), calculatedRect: (1280.0, 25.0, 1280.0, 1330.0), resultRect: (1280.0, 25.0, 1280.0, 1329.0), srcScreen: LS49A950U, destScreen: LS49A950U, resultScreen: LS49A950U

rxhanson commented 6 months ago

Thanks for reporting. I can see where this would be a confusing experience. There is a bit of history as to why this is the way it works, but I agree that it doesn't make sense provided the settings and will put a task in the queue to fix this.