[LyX/2.5.x] Synchronise the return of GuiInputMethod::inputMethodQuery()

Koji Yokota <[email protected]> Sat, 04 Jul 2026 04:31:07 +0000
Newsgroups gmane.editors.lyx.cvs
Message-ID <[email protected]>
commit 1a09c517cc23cfb3f73e0d37736015f167d5a6ca
Author: Koji Yokota <[email protected]>
Date:   Fri May 8 09:17:07 2026 +0900

    Synchronise the return of GuiInputMethod::inputMethodQuery()
---
 src/frontends/qt/GuiInputMethod.cpp | 49 ++++++++++++++++++-------------------
 src/frontends/qt/GuiInputMethod.h   |  3 +--
 src/frontends/qt/GuiWorkArea.cpp    | 21 +---------------
 src/frontends/qt/GuiWorkArea.h      |  1 -
 4 files changed, 26 insertions(+), 48 deletions(-)

diff --git a/src/frontends/qt/GuiInputMethod.cpp b/src/frontends/qt/GuiInputMethod.cpp
index 7850876c73..27da8d6841 100644
--- a/src/frontends/qt/GuiInputMethod.cpp
+++ b/src/frontends/qt/GuiInputMethod.cpp
@@ -906,13 +906,12 @@ int GuiInputMethod::shiftFromCaretToSegmentHead()
 /* *
  * *        Input Method Query
  * */
-void GuiInputMethod::processQuery(Qt::InputMethodQuery query)
+QVariant GuiInputMethod::inputMethodQuery(Qt::InputMethodQuery query)
 {
 	// input method is not ready yet
 	if (d->buffer_view_->inputMethod() == nullptr) {
 		QVariant null_answer;
-		Q_EMIT queryProcessed(null_answer);
-		return;
+		return null_answer;
 	}
 
 	docstring msg = "Responded to query " +
@@ -924,8 +923,8 @@ void GuiInputMethod::processQuery(Qt::InputMethodQuery query)
 		if (d->im_state_.enabled_)
 			LYXERR(Debug::DEBUG, msg << "true");
 		else
-			LYXERR(Debug::DEBUG, msg << "false");
-		Q_EMIT queryProcessed(d->im_state_.enabled_);
+			LYXERR(Debug::KEY, msg << "\"false\"");
+		return d->im_state_.enabled_;
 		break;
 	}
 	// this is the CJK-specific composition window position and
@@ -945,12 +944,12 @@ void GuiInputMethod::processQuery(Qt::InputMethodQuery query)
 
 		LYXERR(Debug::DEBUG, msg << " x:" << rect->x() << " y:" << rect->y()
 		       << " w:" << rect->width() << " h:" << rect->height());
-		Q_EMIT queryProcessed(*rect);
+		return *rect;
 		break;
 	}
 	case Qt::ImCurrentSelection: {
-		LYXERR(Debug::DEBUG, msg << d->cur_->selectionAsString(false));
-		Q_EMIT queryProcessed(toqstr(d->cur_->selectionAsString(false)));
+		LYXERR(Debug::KEY, msg << d->cur_->selectionAsString(false));
+		return toqstr(d->cur_->selectionAsString(false));
 		break;
 	}
 	// plain text around the input area, for example the current paragraph
@@ -958,9 +957,9 @@ void GuiInputMethod::processQuery(Qt::InputMethodQuery query)
 		if (d->im_state_.surrounding_text_.empty())
 			LYXERR(Debug::DEBUG, msg << "\"\"");
 		else
-			LYXERR(Debug::DEBUG, msg <<
-			       d->im_state_.surrounding_text_.substr(0, 20) << "...");
-		Q_EMIT queryProcessed(toqstr(d->im_state_.surrounding_text_));
+			LYXERR(Debug::KEY, msg << "\"" <<
+			       d->im_state_.surrounding_text_.substr(0, 20) << "...\"");
+		return toqstr(d->im_state_.surrounding_text_);
 		break;
 	}
 	// logical position of the cursor within the entire document
@@ -968,8 +967,8 @@ void GuiInputMethod::processQuery(Qt::InputMethodQuery query)
 		// FIXME: position should be set only when there was a non-virtual
 		// change in the document
 		setAbsolutePosition(*d->cur_);
-		LYXERR(Debug::DEBUG, msg << std::dec << d->abs_pos_);
-		Q_EMIT queryProcessed((qlonglong)d->abs_pos_);
+		LYXERR(Debug::KEY, msg << std::dec << d->abs_pos_);
+		return (qlonglong)d->abs_pos_;
 		break;
 	}
 	// plain text before the cursor
@@ -980,7 +979,7 @@ void GuiInputMethod::processQuery(Qt::InputMethodQuery query)
 		else
 			LYXERR(Debug::DEBUG, msg << "…" << d->im_state_.text_before_);
 		QVariant str(toqstr(d->im_state_.text_before_));
-		Q_EMIT queryProcessed(str);
+		return str;
 		break;
 	}
 	// plain text after the cursor
@@ -991,21 +990,21 @@ void GuiInputMethod::processQuery(Qt::InputMethodQuery query)
 		else
 			LYXERR(Debug::DEBUG, msg << d->im_state_.text_after_);
 		QVariant str(toqstr(d->im_state_.text_after_));
-		Q_EMIT queryProcessed(str);
+		return str;
 		break;
 	}
 	// logical position of the cursor within the text surrounding the input area
 	case Qt::ImCursorPosition: {
 		updatePosAndSurroundingText();
-		LYXERR(Debug::DEBUG, msg << std::dec << d->cur_->pos());
-		Q_EMIT queryProcessed((qlonglong)d->cur_->pos());
+		LYXERR(Debug::KEY, msg << std::dec << d->cur_->pos());
+		return (qlonglong)d->cur_->pos();
 		break;
 	}
 	// position of the selection anchor
 	case Qt::ImAnchorPosition: {
 		updatePosAndSurroundingText();
-		LYXERR(Debug::DEBUG, msg << std::dec << (unsigned int)d->anchor_pos_);
-		Q_EMIT queryProcessed(QVariant((unsigned int)d->anchor_pos_));
+		LYXERR(Debug::KEY, msg << std::dec << (unsigned int)d->anchor_pos_);
+		return QVariant((unsigned int)d->anchor_pos_);
 		break;
 	}
 	case Qt::ImInputItemClipRectangle: {
@@ -1016,7 +1015,7 @@ void GuiInputMethod::processQuery(Qt::InputMethodQuery query)
 		LYXERR(Debug::DEBUG, msg << "(x,y,w,h) = " <<
 		       viewport.x() << ", " << viewport.y() << ", " <<
 		       viewport.width() << ", " << viewport.height() << ")");
-		Q_EMIT queryProcessed(viewport);
+		return viewport;
 		break;
 	}
 	// hints for input method on expected input
@@ -1024,15 +1023,15 @@ void GuiInputMethod::processQuery(Qt::InputMethodQuery query)
 		LYXERR(Debug::DEBUG, msg << "0x" << std::hex
 		                         << d->work_area_->inputMethodHints()
 		                         << std::dec);
-		Q_EMIT queryProcessed((qlonglong)d->work_area_->inputMethodHints());
+		return (qlonglong)d->work_area_->inputMethodHints();
 		break;
 	}
 	//
 	case Qt::ImPreferredLanguage: {
 		QLocale locale(toqstr(d->cur_->getFont().language()->code()));
 		QString lang = locale.languageToString(locale.language());
-		LYXERR(Debug::DEBUG, msg << lang);
-		Q_EMIT queryProcessed(lang);
+		LYXERR(Debug::KEY, msg << lang);
+		return lang;
 		break;
 	}
 	// Qt::ImAnchorRectangle holds the selection rectangle in preedit.
@@ -1043,14 +1042,14 @@ void GuiInputMethod::processQuery(Qt::InputMethodQuery query)
 		       << " y:" << d->im_state_.anchor_rect_.y()
 		       << " w:" << d->im_state_.anchor_rect_.width()
 		       << " h:" << d->im_state_.anchor_rect_.height());
-		Q_EMIT queryProcessed(d->im_state_.anchor_rect_);
+		return d->im_state_.anchor_rect_;
 		break;
 	}
 	default: {
 		QVariant null;
 		LYXERR(Debug::DEBUG, "Unsupported query by LyX came in: " <<
 		       inputMethodQueryFlagsAsString(query));
-		Q_EMIT queryProcessed(null);
+		return null;
 	}
 	}
 }
diff --git a/src/frontends/qt/GuiInputMethod.h b/src/frontends/qt/GuiInputMethod.h
index d052e82ed3..3868738adc 100644
--- a/src/frontends/qt/GuiInputMethod.h
+++ b/src/frontends/qt/GuiInputMethod.h
@@ -116,7 +116,6 @@ public:
 	bool canWrapAnywhere(pos_type const) override;
 Q_SIGNALS:
 	void preeditProcessed(QInputMethodEvent* ev);
-	void queryProcessed(QVariant response);
 	void inputMethodStateChanged(Qt::InputMethodQueries);
 	void cursorPositionChanged();
 
@@ -124,7 +123,7 @@ public Q_SLOTS:
 	/// Process incoming preedit string
 	void processPreedit(QInputMethodEvent* ev);
 	/// Process incoming input method query
-	void processQuery(Qt::InputMethodQuery query);
+	QVariant inputMethodQuery(Qt::InputMethodQuery query);
 	/// Turn off IM in math mode and command phase and turn it on otherwise
 	void toggleInputMethodAcceptance() override;
 	/// Enable the input method
diff --git a/src/frontends/qt/GuiWorkArea.cpp b/src/frontends/qt/GuiWorkArea.cpp
index 16edf513c2..0e0f194820 100644
--- a/src/frontends/qt/GuiWorkArea.cpp
+++ b/src/frontends/qt/GuiWorkArea.cpp
@@ -189,8 +189,6 @@ void GuiWorkArea::init()
 	        d->im_, &GuiInputMethod::processPreedit);
 	connect(d->im_, &GuiInputMethod::preeditProcessed,
 	        this, &GuiWorkArea::flagPreedit);
-	connect(d->im_, &GuiInputMethod::queryProcessed,
-	        this, &GuiWorkArea::receiveIMQueryResponse);
 	connect(guiApp, &GuiApplication::keyCommandStateSet,
 			this, &GuiWorkArea::onKeyCommandStateSet);
 	connect(this, &GuiWorkArea::keyCommandStateSet,
@@ -1352,18 +1350,7 @@ void GuiWorkArea::inputMethodEvent(QInputMethodEvent * ev)
 
 QVariant GuiWorkArea::inputMethodQuery(Qt::InputMethodQuery query) const
 {
-	// ask a query
-	d->im_->processQuery(query);
-
-	// wait for the response and return
-	clock_t start = clock();
-	while (!d->im_query_responded_) {
-		// time out in one second
-		if ((clock() - start)/CLOCKS_PER_SEC >= 1) break;
-	}
-	d->im_query_responded_ = false;
-
-	return d->im_query_response_;
+	return d->im_->inputMethodQuery(query);
 }
 
 
@@ -1412,12 +1399,6 @@ void GuiWorkArea::flagPreedit(QInputMethodEvent* ev)
 }
 
 
-void GuiWorkArea::receiveIMQueryResponse(QVariant response) {
-	d->im_query_response_ = response;
-	// notify the response
-	d->im_query_responded_ = true;
-}
-
 GuiCompleter & GuiWorkArea::completer()
 {
 	return *d->completer_;
diff --git a/src/frontends/qt/GuiWorkArea.h b/src/frontends/qt/GuiWorkArea.h
index 1ac5b07643..47271cc4b0 100644
--- a/src/frontends/qt/GuiWorkArea.h
+++ b/src/frontends/qt/GuiWorkArea.h
@@ -138,7 +138,6 @@ private Q_SLOTS:
 	void fixVerticalScrollBar();
 
 	void flagPreedit(QInputMethodEvent* ev);
-	void receiveIMQueryResponse(QVariant);
 
 private:
 	/// Update window titles of all users.
-- 
lyx-cvs mailing list
[email protected]
https://lists.lyx.org/mailman/listinfo/lyx-cvs