48 lines
1.5 KiB
JavaScript
48 lines
1.5 KiB
JavaScript
|
import { restartBlink } from "./selection.js"
|
||
|
import { webkit } from "../util/browser.js"
|
||
|
import { addClass, rmClass } from "../util/dom.js"
|
||
|
import { signal } from "../util/event.js"
|
||
|
|
||
|
export function ensureFocus(cm) {
|
||
|
if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm) }
|
||
|
}
|
||
|
|
||
|
export function delayBlurEvent(cm) {
|
||
|
cm.state.delayingBlurEvent = true
|
||
|
setTimeout(() => { if (cm.state.delayingBlurEvent) {
|
||
|
cm.state.delayingBlurEvent = false
|
||
|
onBlur(cm)
|
||
|
} }, 100)
|
||
|
}
|
||
|
|
||
|
export function onFocus(cm, e) {
|
||
|
if (cm.state.delayingBlurEvent) cm.state.delayingBlurEvent = false
|
||
|
|
||
|
if (cm.options.readOnly == "nocursor") return
|
||
|
if (!cm.state.focused) {
|
||
|
signal(cm, "focus", cm, e)
|
||
|
cm.state.focused = true
|
||
|
addClass(cm.display.wrapper, "CodeMirror-focused")
|
||
|
// This test prevents this from firing when a context
|
||
|
// menu is closed (since the input reset would kill the
|
||
|
// select-all detection hack)
|
||
|
if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {
|
||
|
cm.display.input.reset()
|
||
|
if (webkit) setTimeout(() => cm.display.input.reset(true), 20) // Issue #1730
|
||
|
}
|
||
|
cm.display.input.receivedFocus()
|
||
|
}
|
||
|
restartBlink(cm)
|
||
|
}
|
||
|
export function onBlur(cm, e) {
|
||
|
if (cm.state.delayingBlurEvent) return
|
||
|
|
||
|
if (cm.state.focused) {
|
||
|
signal(cm, "blur", cm, e)
|
||
|
cm.state.focused = false
|
||
|
rmClass(cm.display.wrapper, "CodeMirror-focused")
|
||
|
}
|
||
|
clearInterval(cm.display.blinker)
|
||
|
setTimeout(() => { if (!cm.state.focused) cm.display.shift = false }, 150)
|
||
|
}
|