46 lines
1.4 KiB
JavaScript
Executable File
46 lines
1.4 KiB
JavaScript
Executable File
import { onBlur } from "../display/focus.js"
|
|
import { on } from "../util/event.js"
|
|
|
|
// These must be handled carefully, because naively registering a
|
|
// handler for each editor will cause the editors to never be
|
|
// garbage collected.
|
|
|
|
function forEachCodeMirror(f) {
|
|
if (!document.getElementsByClassName) return
|
|
let byClass = document.getElementsByClassName("CodeMirror"), editors = []
|
|
for (let i = 0; i < byClass.length; i++) {
|
|
let cm = byClass[i].CodeMirror
|
|
if (cm) editors.push(cm)
|
|
}
|
|
if (editors.length) editors[0].operation(() => {
|
|
for (let i = 0; i < editors.length; i++) f(editors[i])
|
|
})
|
|
}
|
|
|
|
let globalsRegistered = false
|
|
export function ensureGlobalHandlers() {
|
|
if (globalsRegistered) return
|
|
registerGlobalHandlers()
|
|
globalsRegistered = true
|
|
}
|
|
function registerGlobalHandlers() {
|
|
// When the window resizes, we need to refresh active editors.
|
|
let resizeTimer
|
|
on(window, "resize", () => {
|
|
if (resizeTimer == null) resizeTimer = setTimeout(() => {
|
|
resizeTimer = null
|
|
forEachCodeMirror(onResize)
|
|
}, 100)
|
|
})
|
|
// When the window loses focus, we want to show the editor as blurred
|
|
on(window, "blur", () => forEachCodeMirror(onBlur))
|
|
}
|
|
// Called when the window resizes
|
|
function onResize(cm) {
|
|
let d = cm.display
|
|
// Might be a text scaling operation, clear size caches.
|
|
d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null
|
|
d.scrollbarsClipped = false
|
|
cm.setSize()
|
|
}
|