diff --git a/edit.js b/edit.js index d884fd44..d587cd09 100644 --- a/edit.js +++ b/edit.js @@ -310,8 +310,16 @@ function setupCodeMirror(textarea, index) { cm.on("blur", function(cm) { editors.lastActive = cm; hotkeyRerouter.setState(true); + setTimeout(function() { + var cm = editors.lastActive; + var childFocused = cm.display.wrapper.contains(document.activeElement); + cm.display.wrapper.classList.toggle("CodeMirror-active", childFocused); + }, 0); + }); + cm.on("focus", function() { + hotkeyRerouter.setState(false); + cm.display.wrapper.classList.add("CodeMirror-active"); }); - cm.on("focus", hotkeyRerouter.setState.bind(null, false)); var resizeGrip = cm.display.wrapper.appendChild(document.createElement("div")); resizeGrip.className = "resize-grip"; @@ -600,6 +608,7 @@ function setupGlobalSearch() { originalOpenDialog.call(cm, template.innerHTML, callback.bind(cb), opt); }; setTimeout(function() { cm.openDialog = originalOpenDialog; }, 0); + refocusMinidialog(cm); } function focusClosestCM(activeCM) { @@ -786,6 +795,7 @@ function setupGlobalSearch() { function jumpToLine(cm) { var cur = cm.getCursor(); + refocusMinidialog(cm); cm.openDialog(template.jumpToLine.innerHTML, function(str) { var m = str.match(/^\s*(\d+)(?:\s*:\s*(\d+))?\s*$/); if (m) { @@ -794,6 +804,19 @@ function jumpToLine(cm) { }, {value: cur.line+1}); } +function refocusMinidialog(cm) { + var section = getSectionForCodeMirror(cm); + if (!section.querySelector(".CodeMirror-dialog")) { + return; + } + // close the currently opened minidialog + cm.focus(); + // make sure to focus the input in newly opened minidialog + setTimeout(function() { + section.querySelector(".CodeMirror-dialog").focus(); + }, 0); +} + function nextPrevEditor(cm, direction) { cm = editors[(editors.indexOf(cm) + direction + editors.length) % editors.length]; makeSectionVisible(cm);