|
|
@ -61,6 +61,7 @@ class TermScreen { |
|
|
|
bg: 0, |
|
|
|
bg: 0, |
|
|
|
attrs: 0, |
|
|
|
attrs: 0, |
|
|
|
blinkOn: false, |
|
|
|
blinkOn: false, |
|
|
|
|
|
|
|
blinking: true, |
|
|
|
visible: true, |
|
|
|
visible: true, |
|
|
|
hanging: false, |
|
|
|
hanging: false, |
|
|
|
style: 'block', |
|
|
|
style: 'block', |
|
|
@ -453,7 +454,9 @@ class TermScreen { |
|
|
|
this.cursor.blinkOn = true; |
|
|
|
this.cursor.blinkOn = true; |
|
|
|
clearInterval(this.cursor.blinkInterval); |
|
|
|
clearInterval(this.cursor.blinkInterval); |
|
|
|
this.cursor.blinkInterval = setInterval(() => { |
|
|
|
this.cursor.blinkInterval = setInterval(() => { |
|
|
|
this.cursor.blinkOn = !this.cursor.blinkOn; |
|
|
|
this.cursor.blinkOn = this.cursor.blinking |
|
|
|
|
|
|
|
? !this.cursor.blinkOn |
|
|
|
|
|
|
|
: true; |
|
|
|
this.scheduleDraw(); |
|
|
|
this.scheduleDraw(); |
|
|
|
}, 500); |
|
|
|
}, 500); |
|
|
|
} |
|
|
|
} |
|
|
@ -653,16 +656,17 @@ class TermScreen { |
|
|
|
bg = -2 |
|
|
|
bg = -2 |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
let cellDidChange = text !== this.drawnScreen[cell] || |
|
|
|
let needsUpdate = text !== this.drawnScreen[cell] || |
|
|
|
fg !== this.drawnScreenFG[cell] || |
|
|
|
fg !== this.drawnScreenFG[cell] || |
|
|
|
bg !== this.drawnScreenBG[cell] || |
|
|
|
bg !== this.drawnScreenBG[cell] || |
|
|
|
attrs !== this.drawnScreenAttrs[cell]; |
|
|
|
attrs !== this.drawnScreenAttrs[cell] || |
|
|
|
|
|
|
|
isCursor; |
|
|
|
|
|
|
|
|
|
|
|
let font = attrs & FONT_MASK; |
|
|
|
let font = attrs & FONT_MASK; |
|
|
|
if (!fontGroups.has(font)) fontGroups.set(font, []); |
|
|
|
if (!fontGroups.has(font)) fontGroups.set(font, []); |
|
|
|
|
|
|
|
|
|
|
|
fontGroups.get(font).push([cell, x, y, text, fg, bg, attrs, isCursor]); |
|
|
|
fontGroups.get(font).push([cell, x, y, text, fg, bg, attrs, isCursor]); |
|
|
|
updateMap.set(cell, cellDidChange); |
|
|
|
updateMap.set(cell, needsUpdate); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (let font of fontGroups.keys()) { |
|
|
|
for (let font of fontGroups.keys()) { |
|
|
@ -777,6 +781,30 @@ class TermScreen { |
|
|
|
let trackMouseClicks = !!(attributes & (1 << 5)); |
|
|
|
let trackMouseClicks = !!(attributes & (1 << 5)); |
|
|
|
let trackMouseMovement = !!(attributes & (1 << 6)); |
|
|
|
let trackMouseMovement = !!(attributes & (1 << 6)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let cursorShape = (attributes >> 9 & 0b111) |
|
|
|
|
|
|
|
if (cursorShape === 1) { |
|
|
|
|
|
|
|
this.cursor.style = 'block' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!this.cursor.blinking) { |
|
|
|
|
|
|
|
this.cursor.blinking = true; |
|
|
|
|
|
|
|
this.resetCursorBlink(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
if (cursorShape > 0) cursorShape-- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let cursorStyle = cursorShape >> 1 |
|
|
|
|
|
|
|
let cursorBlinking = !(cursorShape & 1) |
|
|
|
|
|
|
|
if (cursorStyle === 0) this.cursor.style = 'block' |
|
|
|
|
|
|
|
else if (cursorStyle === 1) this.cursor.style = 'line' |
|
|
|
|
|
|
|
else if (cursorStyle === 2) this.cursor.style = 'bar' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (this.cursor.blinking !== cursorBlinking) { |
|
|
|
|
|
|
|
this.cursor.blinking = cursorBlinking; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.resetCursorBlink(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Input.setMouseMode(trackMouseClicks, trackMouseMovement); |
|
|
|
Input.setMouseMode(trackMouseClicks, trackMouseMovement); |
|
|
|
this.selection.selectable = !trackMouseMovement; |
|
|
|
this.selection.selectable = !trackMouseMovement; |
|
|
|
$(this.canvas).toggleClass('selectable', !trackMouseMovement); |
|
|
|
$(this.canvas).toggleClass('selectable', !trackMouseMovement); |
|
|
|