0
|
1 import { restartBlink } from "./selection.js"
|
|
2 import { webkit } from "../util/browser.js"
|
|
3 import { addClass, rmClass } from "../util/dom.js"
|
|
4 import { signal } from "../util/event.js"
|
|
5
|
|
6 export function ensureFocus(cm) {
|
|
7 if (!cm.hasFocus()) {
|
|
8 cm.display.input.focus()
|
|
9 if (!cm.state.focused) onFocus(cm)
|
|
10 }
|
|
11 }
|
|
12
|
|
13 export function delayBlurEvent(cm) {
|
|
14 cm.state.delayingBlurEvent = true
|
|
15 setTimeout(() => { if (cm.state.delayingBlurEvent) {
|
|
16 cm.state.delayingBlurEvent = false
|
|
17 if (cm.state.focused) onBlur(cm)
|
|
18 } }, 100)
|
|
19 }
|
|
20
|
|
21 export function onFocus(cm, e) {
|
|
22 if (cm.state.delayingBlurEvent && !cm.state.draggingText) cm.state.delayingBlurEvent = false
|
|
23
|
|
24 if (cm.options.readOnly == "nocursor") return
|
|
25 if (!cm.state.focused) {
|
|
26 signal(cm, "focus", cm, e)
|
|
27 cm.state.focused = true
|
|
28 addClass(cm.display.wrapper, "CodeMirror-focused")
|
|
29 // This test prevents this from firing when a context
|
|
30 // menu is closed (since the input reset would kill the
|
|
31 // select-all detection hack)
|
|
32 if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {
|
|
33 cm.display.input.reset()
|
|
34 if (webkit) setTimeout(() => cm.display.input.reset(true), 20) // Issue #1730
|
|
35 }
|
|
36 cm.display.input.receivedFocus()
|
|
37 }
|
|
38 restartBlink(cm)
|
|
39 }
|
|
40 export function onBlur(cm, e) {
|
|
41 if (cm.state.delayingBlurEvent) return
|
|
42
|
|
43 if (cm.state.focused) {
|
|
44 signal(cm, "blur", cm, e)
|
|
45 cm.state.focused = false
|
|
46 rmClass(cm.display.wrapper, "CodeMirror-focused")
|
|
47 }
|
|
48 clearInterval(cm.display.blinker)
|
|
49 setTimeout(() => { if (!cm.state.focused) cm.display.shift = false }, 150)
|
|
50 }
|