diff --git a/TablePro/Views/Editor/SQLEditorCoordinator.swift b/TablePro/Views/Editor/SQLEditorCoordinator.swift index e48062ad1..3032d156a 100644 --- a/TablePro/Views/Editor/SQLEditorCoordinator.swift +++ b/TablePro/Views/Editor/SQLEditorCoordinator.swift @@ -118,12 +118,18 @@ final class SQLEditorCoordinator: TextViewCoordinator, TextViewDelegate { EditorEventRouter.shared.register(self, textView: textView) if !self.isDestroyed, let window = textView.window { - if self.focusClaimPending { + let claimPending = self.focusClaimPending + let responderName = window.firstResponder.map { String(describing: type(of: $0)) } ?? "nil" + var made = false + if claimPending { self.focusClaimPending = false - window.makeFirstResponder(textView) + made = window.makeFirstResponder(textView) } else if window.firstResponder == nil || window.firstResponder === window { - window.makeFirstResponder(textView) + made = window.makeFirstResponder(textView) } + Self.logger.debug("Editor focus claim: pending=\(claimPending) isKey=\(window.isKeyWindow) responderBefore=\(responderName, privacy: .public) made=\(made)") + } else { + Self.logger.debug("Editor focus claim skipped: hasWindow=\(textView.window != nil) destroyed=\(self.isDestroyed) pending=\(self.focusClaimPending)") } if controller.cursorPositions.isEmpty { controller.setCursorPositions([CursorPosition(range: NSRange(location: 0, length: 0))]) diff --git a/TablePro/Views/Editor/SQLEditorView.swift b/TablePro/Views/Editor/SQLEditorView.swift index e32e21d31..35686f293 100644 --- a/TablePro/Views/Editor/SQLEditorView.swift +++ b/TablePro/Views/Editor/SQLEditorView.swift @@ -50,6 +50,9 @@ struct SQLEditorView: View { coordinator.databaseType = databaseType coordinator.tabID = tabID coordinator.connectionId = connectionId + if claimFocusOnAppear { + coordinator.scheduleEditorFocusClaim() + } return SourceEditor( $text, @@ -60,11 +63,6 @@ struct SQLEditorView: View { completionDelegate: completionAdapter ) .accessibilityLabel(String(localized: "SQL query editor")) - .onAppear { - if claimFocusOnAppear { - coordinator.scheduleEditorFocusClaim() - } - } .onChange(of: editorState.cursorPositions) { _, newValue in guard let positions = newValue else { return } // Skip cursor propagation when the editor doesn't have focus