Skip to content

Commit 1073aad

Browse files
committed
fix: narrow sidebar overlap and resync terminal width
1 parent 1590194 commit 1073aad

5 files changed

Lines changed: 46 additions & 15 deletions

File tree

Sources/BrowserWindowPortal.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -732,8 +732,8 @@ final class WindowBrowserHostView: NSView {
732732
return false
733733
}
734734

735-
let regionMinX = dividerX - SidebarResizeInteraction.hitWidthPerSide
736-
let regionMaxX = dividerX + SidebarResizeInteraction.hitWidthPerSide
735+
let regionMinX = dividerX - SidebarResizeInteraction.sidebarSideHitWidth
736+
let regionMaxX = dividerX + SidebarResizeInteraction.contentSideHitWidth
737737
return point.x >= regionMinX && point.x <= regionMaxX
738738
}
739739

Sources/ContentView.swift

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -336,11 +336,13 @@ final class SidebarState: ObservableObject {
336336
}
337337

338338
enum SidebarResizeInteraction {
339-
static let handleWidth: CGFloat = 6
340-
static let hitInset: CGFloat = 3
339+
// Keep a generous drag target inside the sidebar itself, but make the
340+
// terminal-side overlap very small so column-0 text selection still wins.
341+
static let sidebarSideHitWidth: CGFloat = 6
342+
static let contentSideHitWidth: CGFloat = 2
341343

342-
static var hitWidthPerSide: CGFloat {
343-
hitInset + (handleWidth / 2)
344+
static var totalHitWidth: CGFloat {
345+
sidebarSideHitWidth + contentSideHitWidth
344346
}
345347
}
346348

@@ -1788,8 +1790,12 @@ struct ContentView: View {
17881790
case divider
17891791
}
17901792

1791-
private var sidebarResizerHitWidthPerSide: CGFloat {
1792-
SidebarResizeInteraction.hitWidthPerSide
1793+
private var sidebarResizerSidebarHitWidth: CGFloat {
1794+
SidebarResizeInteraction.sidebarSideHitWidth
1795+
}
1796+
1797+
private var sidebarResizerContentHitWidth: CGFloat {
1798+
SidebarResizeInteraction.contentSideHitWidth
17931799
}
17941800

17951801
private func maxSidebarWidth(availableWidth: CGFloat? = nil) -> CGFloat {
@@ -1865,8 +1871,8 @@ struct ContentView: View {
18651871

18661872
private func dividerBandContains(pointInContent point: NSPoint, contentBounds: NSRect) -> Bool {
18671873
guard point.y >= contentBounds.minY, point.y <= contentBounds.maxY else { return false }
1868-
let minX = sidebarWidth - sidebarResizerHitWidthPerSide
1869-
let maxX = sidebarWidth + sidebarResizerHitWidthPerSide
1874+
let minX = sidebarWidth - sidebarResizerSidebarHitWidth
1875+
let maxX = sidebarWidth + sidebarResizerContentHitWidth
18701876
return point.x >= minX && point.x <= maxX
18711877
}
18721878

@@ -2046,7 +2052,7 @@ struct ContentView: View {
20462052
GeometryReader { proxy in
20472053
let totalWidth = max(0, proxy.size.width)
20482054
let dividerX = min(max(sidebarWidth, 0), totalWidth)
2049-
let leadingWidth = max(0, dividerX - sidebarResizerHitWidthPerSide)
2055+
let leadingWidth = max(0, dividerX - sidebarResizerSidebarHitWidth)
20502056

20512057
HStack(spacing: 0) {
20522058
Color.clear
@@ -2055,7 +2061,7 @@ struct ContentView: View {
20552061

20562062
sidebarResizerHandleOverlay(
20572063
.divider,
2058-
width: sidebarResizerHitWidthPerSide * 2,
2064+
width: SidebarResizeInteraction.totalHitWidth,
20592065
availableWidth: totalWidth,
20602066
accessibilityIdentifier: "SidebarResizer"
20612067
)

Sources/GhosttyTerminalView.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7005,6 +7005,16 @@ final class GhosttySurfaceScrollView: NSView {
70057005
self?.synchronizeScrollView()
70067006
})
70077007

7008+
observers.append(NotificationCenter.default.addObserver(
7009+
forName: NSScroller.preferredScrollerStyleDidChangeNotification,
7010+
object: nil,
7011+
// Match AppKit's geometry change immediately so the terminal width
7012+
// does not stay stuck behind a legacy scrollbar gutter.
7013+
queue: nil
7014+
) { [weak self] _ in
7015+
self?.handlePreferredScrollerStyleChange()
7016+
})
7017+
70087018
}
70097019

70107020
required init?(coder: NSCoder) {
@@ -9040,6 +9050,21 @@ final class GhosttySurfaceScrollView: NSView {
90409050
synchronizeScrollView()
90419051
}
90429052

9053+
private func handlePreferredScrollerStyleChange() {
9054+
guard Thread.isMainThread else {
9055+
DispatchQueue.main.async { [weak self] in
9056+
self?.handlePreferredScrollerStyleChange()
9057+
}
9058+
return
9059+
}
9060+
9061+
// Retile just the scroll view so contentSize reflects the current
9062+
// scrollbar mode without perturbing viewport origin or hosted view
9063+
// geometry; the broader reconcile path caused visible content glitches.
9064+
scrollView.tile()
9065+
_ = synchronizeCoreSurface()
9066+
}
9067+
90439068
private func documentHeight() -> CGFloat {
90449069
let contentHeight = scrollView.contentSize.height
90459070
let cellHeight = surfaceView.cellSize.height

Sources/Panels/BrowserPanelView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5270,7 +5270,7 @@ struct WebViewRepresentable: NSViewRepresentable {
52705270
// Pass through a narrow leading-edge band so the shared sidebar divider
52715271
// handle can receive hover/click even when WKWebView is attached here.
52725272
// Keeping this deterministic avoids flicker from dynamic left-edge scans.
5273-
guard point.x >= 0, point.x <= SidebarResizeInteraction.hitWidthPerSide else {
5273+
guard point.x >= 0, point.x <= SidebarResizeInteraction.contentSideHitWidth else {
52745274
return false
52755275
}
52765276
guard let window, let contentView = window.contentView else {

Sources/TerminalWindowPortal.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,8 @@ final class WindowTerminalHostView: NSView {
243243
return false
244244
}
245245

246-
let regionMinX = dividerX - SidebarResizeInteraction.hitWidthPerSide
247-
let regionMaxX = dividerX + SidebarResizeInteraction.hitWidthPerSide
246+
let regionMinX = dividerX - SidebarResizeInteraction.sidebarSideHitWidth
247+
let regionMaxX = dividerX + SidebarResizeInteraction.contentSideHitWidth
248248
return point.x >= regionMinX && point.x <= regionMaxX
249249
}
250250

0 commit comments

Comments
 (0)