diff .cms/lib/codemirror/src/edit/global_events.js @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.cms/lib/codemirror/src/edit/global_events.js	Fri Oct 11 22:40:23 2024 +0000
@@ -0,0 +1,45 @@
+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()
+}