Skip to content

Commit 8e8a16d

Browse files
authored
Add commands for larger width & smaller width (#1504)
1 parent 5cd1db5 commit 8e8a16d

File tree

4 files changed

+76
-25
lines changed

4 files changed

+76
-25
lines changed

Rectangle/WindowAction.swift

+12-5
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,16 @@ enum WindowAction: Int, Codable {
9292
halveHeightUp = 76,
9393
halveHeightDown = 77,
9494
halveWidthLeft = 78,
95-
halveWidthRight = 79
95+
halveWidthRight = 79,
96+
largerWidth = 80,
97+
smallerWidth = 81
9698

9799
// Order matters here - it's used in the menu
98100
static let active = [leftHalf, rightHalf, centerHalf, topHalf, bottomHalf,
99101
topLeft, topRight, bottomLeft, bottomRight,
100102
firstThird, centerThird, lastThird, firstTwoThirds, lastTwoThirds,
101-
maximize, almostMaximize, maximizeHeight, smaller, larger, center, centerProminently, restore,
103+
maximize, almostMaximize, maximizeHeight, larger, smaller, largerWidth, smallerWidth,
104+
center, centerProminently, restore,
102105
nextDisplay, previousDisplay,
103106
moveLeft, moveRight, moveUp, moveDown,
104107
firstFourth, secondFourth, thirdFourth, lastFourth, firstThreeFourths, lastThreeFourths,
@@ -225,6 +228,8 @@ enum WindowAction: Int, Codable {
225228
case .rightTodo: return "rightTodo"
226229
case .cascadeActiveApp: return "cascadeActiveApp"
227230
case .centerProminently: return "centerProminently"
231+
case .largerWidth: return "largerWidth"
232+
case .smallerWidth: return "smallerWidth"
228233
}
229234
}
230235

@@ -361,7 +366,7 @@ enum WindowAction: Int, Codable {
361366
return nil
362367
case .specified, .reverseAll, .tileAll, .cascadeAll, .leftTodo, .rightTodo, .cascadeActiveApp:
363368
return nil
364-
case .centerProminently:
369+
case .centerProminently, .largerWidth, .smallerWidth:
365370
return nil
366371
}
367372

@@ -398,7 +403,7 @@ enum WindowAction: Int, Codable {
398403

399404
var isDragSnappable: Bool {
400405
switch self {
401-
case .restore, .previousDisplay, .nextDisplay, .moveUp, .moveDown, .moveLeft, .moveRight, .specified, .reverseAll, .tileAll, .cascadeAll, .smaller, .larger, .cascadeActiveApp,
406+
case .restore, .previousDisplay, .nextDisplay, .moveUp, .moveDown, .moveLeft, .moveRight, .specified, .reverseAll, .tileAll, .cascadeAll, .larger, .smaller, .largerWidth, .smallerWidth, .cascadeActiveApp,
402407
// Ninths
403408
.topLeftNinth, .topCenterNinth, .topRightNinth, .middleLeftNinth, .middleCenterNinth, .middleRightNinth, .bottomLeftNinth, .bottomCenterNinth, .bottomRightNinth,
404409
// Corner thirds
@@ -537,6 +542,8 @@ enum WindowAction: Int, Codable {
537542
case .rightTodo: return NSImage()
538543
case .cascadeActiveApp: return NSImage()
539544
case .centerProminently: return NSImage()
545+
case .largerWidth: return NSImage()
546+
case .smallerWidth: return NSImage()
540547
}
541548
}
542549

@@ -579,7 +586,7 @@ enum WindowAction: Int, Codable {
579586
return Defaults.applyGapsToMaximize.userDisabled ? .none : .both;
580587
case .maximizeHeight:
581588
return Defaults.applyGapsToMaximizeHeight.userDisabled ? .none : .vertical;
582-
case .almostMaximize, .previousDisplay, .nextDisplay, .larger, .smaller, .center, .centerProminently, .restore, .specified, .reverseAll, .tileAll, .cascadeAll, .cascadeActiveApp:
589+
case .almostMaximize, .previousDisplay, .nextDisplay, .larger, .smaller, .largerWidth, .smallerWidth, .center, .centerProminently, .restore, .specified, .reverseAll, .tileAll, .cascadeAll, .cascadeActiveApp:
583590
return .none
584591
}
585592
}

Rectangle/WindowCalculation/ChangeSizeCalculation.swift

+50-20
Original file line numberDiff line numberDiff line change
@@ -25,43 +25,73 @@ class ChangeSizeCalculation: WindowCalculation, ChangeWindowDimensionCalculation
2525
}
2626

2727
override func calculateRect(_ params: RectCalculationParameters) -> RectResult {
28-
let sizeOffset: CGFloat = params.action == .smaller ? -sizeOffsetAbs : sizeOffsetAbs
28+
29+
let sizeOffset: CGFloat
30+
switch params.action {
31+
case .larger, .largerWidth:
32+
sizeOffset = sizeOffsetAbs
33+
case .smaller, .smallerWidth:
34+
sizeOffset = -sizeOffsetAbs
35+
default:
36+
sizeOffset = 0
37+
}
2938

3039
let visibleFrameOfScreen = params.visibleFrameOfScreen
3140
let window = params.window
3241

42+
// Calculate Width
43+
3344
var resizedWindowRect = window.rect
34-
resizedWindowRect.size.width = resizedWindowRect.width + sizeOffset
35-
resizedWindowRect.origin.x = resizedWindowRect.minX - floor(sizeOffset / 2.0)
36-
37-
if curtainChangeSize {
38-
resizedWindowRect = againstLeftAndRightScreenEdges(originalWindowRect: window.rect, resizedWindowRect: resizedWindowRect, visibleFrameOfScreen: visibleFrameOfScreen)
39-
}
4045

41-
if resizedWindowRect.width >= visibleFrameOfScreen.width {
42-
resizedWindowRect.size.width = visibleFrameOfScreen.width
43-
}
44-
resizedWindowRect.size.height = resizedWindowRect.height + sizeOffset
45-
resizedWindowRect.origin.y = resizedWindowRect.minY - floor(sizeOffset / 2.0)
46-
47-
if curtainChangeSize {
48-
resizedWindowRect = againstTopAndBottomScreenEdges(originalWindowRect: window.rect, resizedWindowRect: resizedWindowRect, visibleFrameOfScreen: visibleFrameOfScreen)
46+
if [.larger, .smaller, .largerWidth, .smallerWidth].contains(params.action) {
47+
resizedWindowRect.size.width = resizedWindowRect.width + sizeOffset
48+
resizedWindowRect.origin.x = resizedWindowRect.minX - floor(sizeOffset / 2.0)
49+
50+
if curtainChangeSize {
51+
resizedWindowRect = againstLeftAndRightScreenEdges(
52+
originalWindowRect: window.rect,
53+
resizedWindowRect: resizedWindowRect,
54+
visibleFrameOfScreen: visibleFrameOfScreen
55+
)
56+
}
57+
58+
if resizedWindowRect.width >= visibleFrameOfScreen.width {
59+
resizedWindowRect.size.width = visibleFrameOfScreen.width
60+
}
4961
}
50-
51-
if resizedWindowRect.height >= visibleFrameOfScreen.height {
52-
resizedWindowRect.size.height = visibleFrameOfScreen.height
53-
resizedWindowRect.origin.y = params.window.rect.minY
62+
63+
// Calculate Height
64+
65+
if [.larger, .smaller].contains(params.action) {
66+
resizedWindowRect.size.height = resizedWindowRect.height + sizeOffset
67+
resizedWindowRect.origin.y = resizedWindowRect.minY - floor(sizeOffset / 2.0)
68+
69+
if curtainChangeSize {
70+
resizedWindowRect = againstTopAndBottomScreenEdges(
71+
originalWindowRect: window.rect,
72+
resizedWindowRect: resizedWindowRect,
73+
visibleFrameOfScreen: visibleFrameOfScreen
74+
)
75+
}
76+
77+
if resizedWindowRect.height >= visibleFrameOfScreen.height {
78+
resizedWindowRect.size.height = visibleFrameOfScreen.height
79+
resizedWindowRect.origin.y = params.window.rect.minY
80+
}
5481
}
82+
83+
5584
if againstAllScreenEdges(windowRect: window.rect, visibleFrameOfScreen: visibleFrameOfScreen) && (sizeOffset < 0) {
5685
resizedWindowRect.size.width = params.window.rect.width + sizeOffset
5786
resizedWindowRect.origin.x = params.window.rect.origin.x - floor(sizeOffset / 2.0)
5887
resizedWindowRect.size.height = params.window.rect.height + sizeOffset
5988
resizedWindowRect.origin.y = params.window.rect.origin.y - floor(sizeOffset / 2.0)
6089
}
6190

62-
if params.action == .smaller, resizedWindowRectIsTooSmall(windowRect: resizedWindowRect, visibleFrameOfScreen: visibleFrameOfScreen) {
91+
if [.smaller, .smallerWidth].contains(params.action), resizedWindowRectIsTooSmall(windowRect: resizedWindowRect, visibleFrameOfScreen: visibleFrameOfScreen) {
6392
resizedWindowRect = window.rect
6493
}
94+
6595
return RectResult(resizedWindowRect)
6696
}
6797

Rectangle/WindowCalculation/WindowCalculation.swift

+2
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ class WindowCalculationFactory {
193193
.nextDisplay: nextPrevDisplayCalculation,
194194
.larger: changeSizeCalculation,
195195
.smaller: changeSizeCalculation,
196+
.largerWidth: changeSizeCalculation,
197+
.smallerWidth: changeSizeCalculation,
196198
.bottomHalf: bottomHalfCalculation,
197199
.topHalf: topHalfCalculation,
198200
.center: centerCalculation,

TerminalCommands.md

+12
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ The preferences window is purposefully slim, but there's a lot that can be modif
2323
- [Make Smaller limits](#make-smaller-limits)
2424
- [Make Smaller/Make Larger size increments](#make-smallermake-larger-size-increments)
2525
- [Make Smaller/Make Larger "curtain resize" with gaps](#make-smallermake-larger-curtain-resize-with-gaps)
26+
- [Make Smaller/Make Larger width only](#make-smallermake-larger-width-only)
2627
- [Disabling window restore when moving windows](#disabling-window-restore-when-moving-windows)
2728
- [Changing the margin for the snap areas](#changing-the-margin-for-the-snap-areas)
2829
- [Setting gaps at the screen edges](#setting-gaps-at-the-screen-edges)
@@ -333,6 +334,17 @@ By default, windows touching the edge of the screen will keep those shared edges
333334
defaults write com.knollsoft.Rectangle curtainChangeSize -int 2
334335
```
335336

337+
## Make Smaller/Make Larger width only
338+
339+
By default, "Make Smaller" and "Make Larger" change both, the window height and the window width. If you only want to change the window width without changing window height, configure shortcuts for the _largerWidth_ and _smallerWidth_ commands.
340+
341+
For example, if you want to assign `ctrl option ]` to _largerWidth_ and `ctrl option [` to _smallerWidth_, the commands would be:
342+
343+
```bash
344+
defaults write com.knollsoft.Rectangle largerWidth -dict-add keyCode -float 30 modifierFlags -float 786432
345+
defaults write com.knollsoft.Rectangle smallerWidth -dict-add keyCode -float 33 modifierFlags -float 786432
346+
```
347+
336348
## Disabling window restore when moving windows
337349

338350
```bash

0 commit comments

Comments
 (0)