File 0001-Fix-bug-with-_object_widgets-weakset.patch of Package zim

From c264b8bf58c6780b69f6370ecc27a09b2ef538e6 Mon Sep 17 00:00:00 2001
From: Jaap Karssenberg <jaap.karssenberg@gmail.com>
Date: Thu, 26 Mar 2026 20:27:50 +0100
Subject: [PATCH 1/3] Fix bug with _object_widgets weakset

Fixes #2934
---
 tests/pageview.py            |  2 +-
 tests/sourceview.py          |  2 +-
 tests/tableeditor.py         |  2 +-
 zim/gui/pageview/__init__.py |  4 ++--
 zim/gui/pageview/textview.py | 13 ++++++-------
 5 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/tests/pageview.py b/tests/pageview.py
index 9ccc402a..41fbaa59 100644
--- a/tests/pageview.py
+++ b/tests/pageview.py
@@ -1919,7 +1919,7 @@ Foo 123
 			self.fail('No object in tree')
 
 		buffer.set_parsetree(tree)
-		self.assertEqual(len(list(view._object_widgets)), 1) # assert there is an object in the view
+		self.assertEqual(len(list(view.get_inserted_object_widgets())), 1) # assert there is an object in the view
 		self.assertParseTreeEqual(buffer, tree) # assert stable over roundtrip
 
 	def testPopup(self):
diff --git a/tests/sourceview.py b/tests/sourceview.py
index fb94adad..4f72ec61 100644
--- a/tests/sourceview.py
+++ b/tests/sourceview.py
@@ -45,7 +45,7 @@ def dump():
 
 '''	)
 		# test widget loaded
-		objects = list(pageview.textview._object_widgets) # XXX
+		objects = list(pageview.textview.get_inserted_object_widgets())
 		self.assertIsInstance(objects[0], SourceViewWidget)
 
 		# test modify
diff --git a/tests/tableeditor.py b/tests/tableeditor.py
index af3c9ae3..98e40414 100644
--- a/tests/tableeditor.py
+++ b/tests/tableeditor.py
@@ -162,7 +162,7 @@ class TestPageViewWithPlugin(TestPageViewNoPlugin):
 			text=TABLE_WIKI_TEXT,
 		)
 		# test widget loaded
-		objects = list(pageview.textview._object_widgets) # XXX
+		objects = list(pageview.textview.get_inserted_object_widgets())
 		self.assertIsInstance(objects[0], TableViewWidget)
 
 		# test modify
diff --git a/zim/gui/pageview/__init__.py b/zim/gui/pageview/__init__.py
index f1396fc6..705744be 100644
--- a/zim/gui/pageview/__init__.py
+++ b/zim/gui/pageview/__init__.py
@@ -1027,9 +1027,9 @@ class PageView(GSignalEmitterMixin, Gtk.VBox):
 		self._save_page_handler.wait_for_store_page_async()
 
 	def _hack_on_inserted_tree(self, *a):
-		if self.textview._object_widgets:
+		if self.textview.get_inserted_object_widgets():
 			# Force resize of the scroll window, forcing a redraw to fix
-			# glitch in allocation of embedded obejcts, see isse #642
+			# glitch in allocation of embedded obejcts, see issue #642
 			# Will add another timeout to rendering the page, increasing the
 			# priority breaks the hack though. Which shows the glitch is
 			# probably also happening in a drawing or resizing idle event
diff --git a/zim/gui/pageview/textview.py b/zim/gui/pageview/textview.py
index 3e0c0760..e7c867c4 100644
--- a/zim/gui/pageview/textview.py
+++ b/zim/gui/pageview/textview.py
@@ -156,7 +156,6 @@ class TextView(Gtk.TextView):
 		self.set_size_request(24, 24)
 		self._cursor = CURSOR_TEXT
 		self._cursor_link = None
-		self._object_widgets = weakref.WeakSet()
 		self.set_left_margin(10)
 		self.set_right_margin(5)
 		self.set_wrap_mode(Gtk.WrapMode.WORD)
@@ -172,10 +171,8 @@ class TextView(Gtk.TextView):
 
 	def set_buffer(self, buffer):
 		# Clear old widgets
-		for child in self.get_children():
-			if isinstance(child, InsertedObjectWidget):
-				self._object_widgets.remove(child)
-				self.remove(child)
+		for widget in self.get_inserted_object_widgets():
+			self.remove(widget)
 
 		# Set new buffer
 		Gtk.TextView.set_buffer(self, buffer)
@@ -186,6 +183,9 @@ class TextView(Gtk.TextView):
 
 		buffer.connect('insert-objectanchor', self.on_insert_object)
 
+	def get_inserted_object_widgets(self):
+		return [child for child in self.get_children() if isinstance(child, InsertedObjectWidget)]
+
 	def on_insert_object(self, buffer, anchor):
 		# Connect widget for this view to object
 		widget = anchor.create_widget()
@@ -210,14 +210,13 @@ class TextView(Gtk.TextView):
 			# TODO - compute indenting
 
 		self.add_child_at_anchor(widget, anchor)
-		self._object_widgets.add(widget)
 		widget.show_all()
 
 	def on_size_allocate(self, *a):
 		# Update size request for widgets
 		wrap_width = self._get_object_wrap_width()
 		if wrap_width != self._object_wrap_width:
-			for widget in self._object_widgets:
+			for widget in self.get_inserted_object_widgets():
 				widget.set_textview_wrap_width(wrap_width)
 					# TODO - compute indenting
 			self._object_wrap_width = wrap_width
-- 
2.53.0

openSUSE Build Service is sponsored by