7a49ed6ae61f780555e4ee6644d82b134599656defd465ef6d76ed4c00d51b4db825b535e249b293a7c8d149c240b0ae4e270fb3c2a476034e5c12a6c097aa 1.6 KB

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