[LyX/master] Add a safegurard for GuiInputMethod::setCaretRectangle()

Koji Yokota <[email protected]> Thu, 25 Jun 2026 00:59:27 +0000
Newsgroups gmane.editors.lyx.cvs
Message-ID <[email protected]>
commit 7f132ea40c8f1b5534974131614ea1556166e6ce
Author: Koji Yokota <[email protected]>
Date:   Wed Jun 24 08:51:28 2026 +0900

    Add a safegurard for GuiInputMethod::setCaretRectangle()
    
    When IM is turned on after entering the math mode, inconsistency between
    this function and clearCaretRectangle() can happen.
---
 src/frontends/InputMethod.h         | 3 +++
 src/frontends/qt/GuiInputMethod.cpp | 5 +++++
 src/frontends/qt/GuiInputMethod.h   | 1 +
 src/frontends/qt/GuiWorkArea.cpp    | 3 ++-
 4 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/frontends/InputMethod.h b/src/frontends/InputMethod.h
index bb4a56da63..cd5e1845a0 100644
--- a/src/frontends/InputMethod.h
+++ b/src/frontends/InputMethod.h
@@ -14,6 +14,7 @@
 
 #include "support/docstring.h"
 #include "support/types.h"
+#include <vector>
 
 namespace lyx {
 
@@ -87,6 +88,8 @@ public:
 	virtual void setElemsCoordinates(int x, int y) = 0;
 	///
 	virtual void clearElemsCoordinates() = 0;
+	///
+	virtual std::vector<std::array<int,2>> elemsCoordinates() = 0;
 #ifdef Q_DEBUG
 	///
 	virtual void setHint(Hint) = 0;
diff --git a/src/frontends/qt/GuiInputMethod.cpp b/src/frontends/qt/GuiInputMethod.cpp
index e2f40946b8..79fea2e7ae 100644
--- a/src/frontends/qt/GuiInputMethod.cpp
+++ b/src/frontends/qt/GuiInputMethod.cpp
@@ -891,6 +891,11 @@ void GuiInputMethod::setElemsCoordinates(int x, int y)
 	d->elems_coords_.push_back({x,y});
 }
 
+std::vector<std::array<int, 2> > GuiInputMethod::elemsCoordinates()
+{
+	return d->elems_coords_;
+}
+
 
 void GuiInputMethod::clearElemsCoordinates()
 {
diff --git a/src/frontends/qt/GuiInputMethod.h b/src/frontends/qt/GuiInputMethod.h
index e843701170..8c02673af4 100644
--- a/src/frontends/qt/GuiInputMethod.h
+++ b/src/frontends/qt/GuiInputMethod.h
@@ -123,6 +123,7 @@ public:
 	/// Whether the segment contains language that allows wrapping anywhere
 	bool canWrapAnywhere(pos_type const) override;
 	void setElemsCoordinates(int x, int y) override;
+	std::vector<std::array<int,2>> elemsCoordinates() override;
 	void clearElemsCoordinates() override;
 Q_SIGNALS:
 	void preeditProcessed(QInputMethodEvent* ev);
diff --git a/src/frontends/qt/GuiWorkArea.cpp b/src/frontends/qt/GuiWorkArea.cpp
index 5a067ef9aa..3fb3f26e79 100644
--- a/src/frontends/qt/GuiWorkArea.cpp
+++ b/src/frontends/qt/GuiWorkArea.cpp
@@ -1405,7 +1405,8 @@ void GuiWorkArea::paintEvent(QPaintEvent * ev)
 		d->updateCaretGeometry();
 	if (d->im_->preeditString().empty() && d->caret_visible_) {
 		d->drawCaret(pain, d->buffer_view_->horizScrollOffset());
-	} else if (!d->im_->preeditString().empty()) {
+	} else if (!d->im_->preeditString().empty() &&
+	           !d->im_->elemsCoordinates().empty()) {
 		d->im_->setCaretRectangle();
 		if (d->im_->isCaretVisible())
 			d->drawPreeditCaret(pain);
-- 
lyx-cvs mailing list
[email protected]
https://lists.lyx.org/mailman/listinfo/lyx-cvs