Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 39 additions & 27 deletions Sources/SwiftTerm/Apple/AppleTerminalView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,12 @@ extension TerminalView {
colorsChanged ()
}

public func synchronizedOutputChanged (source: Terminal, active: Bool)
{
updateScroller()
queuePendingDisplay()
}

public func setBackgroundColor(source: Terminal, color: Color) {
// Can not implement this until I change the color to not be this struct
nativeBackgroundColor = TTColor.make (color: color)
Expand Down Expand Up @@ -628,6 +634,7 @@ extension TerminalView {
let lineDescent = CTFontGetDescent(fontSet.normal)
let lineLeading = CTFontGetLeading(fontSet.normal)
let yOffset = ceil(lineDescent+lineLeading)
let displayBuffer = terminal.displayBuffer

func calcLineOffset (forRow: Int) -> CGFloat {
cellDimension.height * CGFloat (forRow-bufferOffset+1)
Expand All @@ -642,18 +649,18 @@ extension TerminalView {
// On Mac, we are drawing the terminal buffer
let cellHeight = cellDimension.height
let boundsMaxY = bounds.maxY
let firstRow = terminal.buffer.yDisp+Int ((boundsMaxY-dirtyRect.maxY)/cellHeight)
let lastRow = terminal.buffer.yDisp+Int((boundsMaxY-dirtyRect.minY)/cellHeight)
let firstRow = displayBuffer.yDisp+Int ((boundsMaxY-dirtyRect.maxY)/cellHeight)
let lastRow = displayBuffer.yDisp+Int((boundsMaxY-dirtyRect.minY)/cellHeight)
#endif

for row in firstRow...lastRow {
if row < 0 {
continue
}
if row >= terminal.buffer.lines.count {
if row >= displayBuffer.lines.count {
continue
}
let renderMode = terminal.buffer.lines [row].renderMode
let renderMode = displayBuffer.lines [row].renderMode
let lineOffset = calcLineOffset(forRow: row)
let lineOrigin = CGPoint(x: 0, y: frame.height - lineOffset)

Expand Down Expand Up @@ -706,8 +713,8 @@ extension TerminalView {
continue
}
#endif
let line = terminal.buffer.lines [row]
let lineInfo = buildAttributedString(row: row, line: line, cols: terminal.cols)
let line = displayBuffer.lines [row]
let lineInfo = buildAttributedString(row: row, line: line, cols: displayBuffer.cols)

for segment in lineInfo.segments {
guard segment.attributedString.length > 0 else {
Expand Down Expand Up @@ -751,7 +758,7 @@ extension TerminalView {
height: cellDimension.height)

#if (lastLineExtends)
if (row-terminal.buffer.yDisp) >= terminal.rows - 1 {
if (row-displayBuffer.yDisp) >= displayBuffer.rows - 1 {
let missing = frame.height - (cellDimension.height + CGFloat(row) + 1)
rect.size.height += missing
rect.origin.y -= missing
Expand Down Expand Up @@ -918,7 +925,7 @@ extension TerminalView {
updateCursorPosition()
guard let (rowStart, rowEnd) = terminal.getUpdateRange () else {
if notifyUpdateChanges {
let buffer = terminal.buffer
let buffer = terminal.displayBuffer
let y = buffer.yDisp+buffer.y
terminalDelegate?.rangeChanged (source: self, startY: y, endY: y)
}
Expand Down Expand Up @@ -968,7 +975,7 @@ extension TerminalView {
guard let caretView else { return }
//let lineOrigin = CGPoint(x: 0, y: frame.height - (cellDimension.height * (CGFloat(terminal.buffer.y - terminal.buffer.yDisp + 1))))
//caretView.frame.origin = CGPoint(x: lineOrigin.x + (cellDimension.width * CGFloat(terminal.buffer.x)), y: lineOrigin.y)
let buffer = terminal.buffer
let buffer = terminal.displayBuffer
let vy = buffer.yBase + buffer.y

if vy >= buffer.yDisp + buffer.rows {
Expand Down Expand Up @@ -1057,13 +1064,14 @@ extension TerminalView {
*/
public var scrollThumbsize: CGFloat {
get {
if terminal.isCurrentBufferAlternate {
let displayBuffer = terminal.displayBuffer
if terminal.isDisplayBufferAlternate {
return 0
}

// the thumb size is the proportion of the visible content of the
// entire content but don't make it too small
return max (CGFloat (terminal.rows) / CGFloat (terminal.buffer.lines.count), 0.01)
return max (CGFloat (displayBuffer.rows) / CGFloat (displayBuffer.lines.count), 0.01)
}
}

Expand All @@ -1072,16 +1080,17 @@ extension TerminalView {
*/
public var scrollPosition: Double {
get {
if terminal.isCurrentBufferAlternate || terminal.buffer.yDisp <= 0 {
let displayBuffer = terminal.displayBuffer
if terminal.isDisplayBufferAlternate || displayBuffer.yDisp <= 0 {
return 0
}

let maxScrollback = terminal.buffer.lines.count - terminal.rows
if terminal.buffer.yDisp >= maxScrollback {
let maxScrollback = displayBuffer.lines.count - displayBuffer.rows
if displayBuffer.yDisp >= maxScrollback {
return 1
}

return Double (terminal.buffer.yDisp) / Double (maxScrollback)
return Double (displayBuffer.yDisp) / Double (maxScrollback)
}
}

Expand All @@ -1090,18 +1099,20 @@ extension TerminalView {
/// </summary>
public var canScroll: Bool {
get {
return !terminal.isCurrentBufferAlternate &&
terminal.buffer.hasScrollback &&
terminal.buffer.lines.count > terminal.rows
let displayBuffer = terminal.displayBuffer
return !terminal.isDisplayBufferAlternate &&
displayBuffer.hasScrollback &&
displayBuffer.lines.count > displayBuffer.rows
}
}

public func scroll (toPosition: Double)
{
userScrolling = true
let oldPosition = terminal.buffer.yDisp
let displayBuffer = terminal.displayBuffer
let oldPosition = displayBuffer.yDisp

let maxScrollback = terminal.buffer.lines.count - terminal.rows
let maxScrollback = displayBuffer.lines.count - displayBuffer.rows
var newScrollPosition = Int (Double (maxScrollback) * toPosition)

if newScrollPosition < 0 {
Expand All @@ -1119,9 +1130,9 @@ extension TerminalView {

func scrollTo (row: Int, notifyAccessibility: Bool = true)
{
if row != terminal.buffer.yDisp {
terminal.buffer.yDisp = row
let displayBuffer = terminal.displayBuffer
if row != displayBuffer.yDisp {
terminal.setViewYDisp (row)

// tell the terminal we want to refresh all the rows
terminal.refresh (startRow: 0, endRow: terminal.rows)
Expand All @@ -1138,7 +1149,7 @@ extension TerminalView {
/// Scrolls the content of the terminal one page up
public func pageUp()
{
if terminal.isCurrentBufferAlternate {
if terminal.isDisplayBufferAlternate {
send (EscapeSequences.cmdPageUp)
} else {
scrollUp (lines: terminal.rows)
Expand All @@ -1148,7 +1159,7 @@ extension TerminalView {
/// Scrolls the content of the terminal one page down
public func pageDown ()
{
if terminal.isCurrentBufferAlternate {
if terminal.isDisplayBufferAlternate {
send (EscapeSequences.cmdPageDown)
} else {
scrollDown (lines: terminal.rows)
Expand All @@ -1158,14 +1169,15 @@ extension TerminalView {
/// Scrolls up the content of the terminal the specified number of lines
public func scrollUp (lines: Int)
{
let newPosition = max (terminal.buffer.yDisp - lines, 0)
let newPosition = max (terminal.displayBuffer.yDisp - lines, 0)
scrollTo (row: newPosition)
}

/// Scrolls down the content of the terminal the specified number of lines
public func scrollDown (lines: Int)
{
let newPosition = max (0, min (terminal.buffer.yDisp + lines, terminal.buffer.lines.count - terminal.rows))
let displayBuffer = terminal.displayBuffer
let newPosition = max (0, min (displayBuffer.yDisp + lines, displayBuffer.lines.count - displayBuffer.rows))
scrollTo (row: newPosition)
}

Expand Down
2 changes: 2 additions & 0 deletions Sources/SwiftTerm/BufferLine.swift
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ public final class BufferLine: CustomDebugStringConvertible {
{
fillCharacter = other.fillCharacter
isWrapped = other.isWrapped
renderMode = other.renderMode
images = other.images
data = Array(other.data)
dataSize = other.dataSize
}
Expand Down
28 changes: 9 additions & 19 deletions Sources/SwiftTerm/Mac/MacTerminalView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -410,7 +410,7 @@ open class TerminalView: NSView, NSTextInputClient, NSUserInterfaceValidations,
guard let currentContext = getCurrentGraphicsContext() else {
return
}
drawTerminalContents (dirtyRect: dirtyRect, context: currentContext, bufferOffset: terminal.buffer.yDisp)
drawTerminalContents (dirtyRect: dirtyRect, context: currentContext, bufferOffset: terminal.displayBuffer.yDisp)
}

public override func cursorUpdate(with event: NSEvent)
Expand Down Expand Up @@ -762,8 +762,9 @@ open class TerminalView: NSView, NSTextInputClient, NSUserInterfaceValidations,
return NSRange.empty
}

var startLocation = (selection.start.row * terminal.buffer.rows) + selection.start.col
var endLocation = (selection.end.row * terminal.buffer.rows) + selection.end.col
let displayBuffer = terminal.displayBuffer
var startLocation = (selection.start.row * displayBuffer.rows) + selection.start.col
var endLocation = (selection.end.row * displayBuffer.rows) + selection.end.col
if startLocation > endLocation {
swap(&startLocation, &endLocation)
}
Expand Down Expand Up @@ -957,34 +958,22 @@ open class TerminalView: NSView, NSTextInputClient, NSUserInterfaceValidations,
}
}
case 2:
<<<<<<< Updated upstream
selection.selectWordOrExpression(at: Position(col: hit.col, row: hit.row + terminal.buffer.yDisp), in: terminal.buffer)
=======
let displayBuffer = terminal.displayBuffer
selection.selectWordOrExpression(at: Position(col: hit.col, row: hit.row), in: displayBuffer)
>>>>>>> Stashed changes

default:
// 3 and higher

<<<<<<< Updated upstream
selection.select(row: hit.row + terminal.buffer.yDisp)
=======
selection.select(row: hit.row)
>>>>>>> Stashed changes
}
setNeedsDisplay(bounds)
}

func getPayload (for event: NSEvent) -> Any?
{
let hit = calculateMouseHit(with: event).grid
<<<<<<< Updated upstream
let cd = terminal.buffer.lines [terminal.buffer.yDisp+hit.row][hit.col]
=======
let displayBuffer = terminal.displayBuffer
let cd = displayBuffer.lines [hit.row][hit.col]
>>>>>>> Stashed changes
return cd.getPayload()
}

Expand Down Expand Up @@ -1250,11 +1239,12 @@ open class TerminalView: NSView, NSTextInputClient, NSUserInterfaceValidations,

func ensureCaretIsVisible ()
{
let realCaret = terminal.buffer.y + terminal.buffer.yBase
let viewportEnd = terminal.buffer.yDisp + terminal.rows
let displayBuffer = terminal.displayBuffer
let realCaret = displayBuffer.y + displayBuffer.yBase
let viewportEnd = displayBuffer.yDisp + displayBuffer.rows

if realCaret >= viewportEnd || realCaret < terminal.buffer.yDisp {
scrollTo (row: terminal.buffer.yBase)
if realCaret >= viewportEnd || realCaret < displayBuffer.yDisp {
scrollTo (row: displayBuffer.yBase)
}
}

Expand Down
20 changes: 10 additions & 10 deletions Sources/SwiftTerm/SelectionService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ class SelectionService: CustomDebugStringConvertible {
* Sets the selection, this is validated against the
*/
public func setSelection (start: Position, end: Position) {
let buffer = terminal.buffer
let buffer = terminal.displayBuffer
let sclamped = clamp (buffer, start)
let eclamped = clamp (buffer, end)

Expand Down Expand Up @@ -132,7 +132,7 @@ class SelectionService: CustomDebugStringConvertible {
* The location is screen-relative
*/
public func setSoftStart (row: Int, col: Int) {
setSoftStart (bufferPosition: Position(col: col, row: row + terminal.buffer.yDisp))
setSoftStart (bufferPosition: Position(col: col, row: row + terminal.displayBuffer.yDisp))
}

/**
Expand All @@ -159,7 +159,7 @@ class SelectionService: CustomDebugStringConvertible {
*/
public func shiftExtend (row: Int, col: Int)
{
var newPos = Position (col: col, row: row + terminal.buffer.yDisp)
var newPos = Position (col: col, row: row + terminal.displayBuffer.yDisp)
if selectingRows {
if Position.compare(start, newPos) == .before {
newPos.col = terminal.cols - 1
Expand All @@ -185,7 +185,7 @@ class SelectionService: CustomDebugStringConvertible {
// If we're in word selection mode, extend to word boundaries
if selectionMode == .word {
let direction = Position.compare(newEnd, start) == .before ? -1 : 1
adjustedNewEnd = extendToWordBoundary(position: newEnd, in: terminal.buffer, direction: direction)
adjustedNewEnd = extendToWordBoundary(position: newEnd, in: terminal.displayBuffer, direction: direction)
}

var shouldSwapStart = false
Expand Down Expand Up @@ -216,7 +216,7 @@ class SelectionService: CustomDebugStringConvertible {
* The row is screen-relative, for buffer relative use the `pivotExtend(bufferPosition:)` overload
*/
public func pivotExtend (row: Int, col: Int) {
let newPoint = Position (col: col, row: row + terminal.buffer.yDisp)
let newPoint = Position (col: col, row: row + terminal.displayBuffer.yDisp)

return pivotExtend(bufferPosition: newPoint)
}
Expand All @@ -237,7 +237,7 @@ class SelectionService: CustomDebugStringConvertible {
// If we're in word selection mode, extend to word boundaries
if selectionMode == .word {
let direction = Position.compare(bufferPosition, pivot) == .before ? -1 : 1
adjustedPosition = extendToWordBoundary(position: bufferPosition, in: terminal.buffer, direction: direction)
adjustedPosition = extendToWordBoundary(position: bufferPosition, in: terminal.displayBuffer, direction: direction)
}

switch Position.compare (adjustedPosition, pivot) {
Expand All @@ -261,7 +261,7 @@ class SelectionService: CustomDebugStringConvertible {
*/
public func dragExtend (row: Int, col: Int)
{
dragExtend(bufferPosition: Position(col: col, row: row + terminal.buffer.yDisp))
dragExtend(bufferPosition: Position(col: col, row: row + terminal.displayBuffer.yDisp))
}

/**
Expand All @@ -274,7 +274,7 @@ class SelectionService: CustomDebugStringConvertible {
// If we're in word selection mode, extend to word boundaries
if selectionMode == .word {
let direction = Position.compare(bufferPosition, start) == .before ? -1 : 1
adjustedEnd = extendToWordBoundary(position: bufferPosition, in: terminal.buffer, direction: direction)
adjustedEnd = extendToWordBoundary(position: bufferPosition, in: terminal.displayBuffer, direction: direction)
}

end = adjustedEnd
Expand All @@ -287,7 +287,7 @@ class SelectionService: CustomDebugStringConvertible {
public func selectAll ()
{
start = Position(col: 0, row: 0)
end = Position(col: terminal.cols-1, row: terminal.buffer.lines.maxLength - 1)
end = Position(col: terminal.cols-1, row: terminal.displayBuffer.lines.maxLength - 1)
setActiveAndNotify()
}

Expand Down Expand Up @@ -532,7 +532,7 @@ class SelectionService: CustomDebugStringConvertible {
} else {
(end, start)
}
let r = terminal.getText(start: min, end: max)
let r = terminal.getDisplayText(start: min, end: max)
return r
}

Expand Down
Loading
Loading