forked from quickshell/quickshell
		
	core/proxywindow: fix ProxiedWindow proxy pointer after reload
Previously was not updated after reload, causing QsWindowAttached to use the old window pointer after it had been freed.
This commit is contained in:
		
							parent
							
								
									59298f6507
								
							
						
					
					
						commit
						8882f7ca50
					
				
					 4 changed files with 32 additions and 0 deletions
				
			
		| 
						 | 
					@ -131,6 +131,8 @@ void ProxyWindowBase::connectWindow() {
 | 
				
			||||||
		generation->registerIncubationController(this->window->incubationController());
 | 
							generation->registerIncubationController(this->window->incubationController());
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this->window->setProxy(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// clang-format off
 | 
						// clang-format off
 | 
				
			||||||
	QObject::connect(this->window, &QWindow::visibilityChanged, this, &ProxyWindowBase::visibleChanged);
 | 
						QObject::connect(this->window, &QWindow::visibilityChanged, this, &ProxyWindowBase::visibleChanged);
 | 
				
			||||||
	QObject::connect(this->window, &QWindow::xChanged, this, &ProxyWindowBase::xChanged);
 | 
						QObject::connect(this->window, &QWindow::xChanged, this, &ProxyWindowBase::xChanged);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -168,6 +168,7 @@ public:
 | 
				
			||||||
	    , mProxy(proxy) {}
 | 
						    , mProxy(proxy) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	[[nodiscard]] ProxyWindowBase* proxy() const { return this->mProxy; }
 | 
						[[nodiscard]] ProxyWindowBase* proxy() const { return this->mProxy; }
 | 
				
			||||||
 | 
						void setProxy(ProxyWindowBase* proxy) { this->mProxy = proxy; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
signals:
 | 
					signals:
 | 
				
			||||||
	void exposed();
 | 
						void exposed();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <qobject.h>
 | 
					#include <qobject.h>
 | 
				
			||||||
#include <qquickitem.h>
 | 
					#include <qquickitem.h>
 | 
				
			||||||
 | 
					#include <qscopedpointer.h>
 | 
				
			||||||
#include <qsignalspy.h>
 | 
					#include <qsignalspy.h>
 | 
				
			||||||
#include <qtest.h>
 | 
					#include <qtest.h>
 | 
				
			||||||
#include <qtestcase.h>
 | 
					#include <qtestcase.h>
 | 
				
			||||||
| 
						 | 
					@ -36,6 +37,33 @@ void TestWindowAttachment::attachedBeforeReload() {
 | 
				
			||||||
	QCOMPARE(spy.length(), 1);
 | 
						QCOMPARE(spy.length(), 1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void TestWindowAttachment::earlyAttachReloaded() {
 | 
				
			||||||
 | 
						auto window1 = QScopedPointer(new ProxyWindowBase());
 | 
				
			||||||
 | 
						auto item1 = QScopedPointer(new QQuickItem());
 | 
				
			||||||
 | 
						item1->setParentItem(window1->contentItem());
 | 
				
			||||||
 | 
						window1->reload(nullptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						auto window2 = ProxyWindowBase();
 | 
				
			||||||
 | 
						auto item2 = QQuickItem();
 | 
				
			||||||
 | 
						item2.setParentItem(window2.contentItem());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						auto* attached = WindowInterface::qmlAttachedProperties(&item2);
 | 
				
			||||||
 | 
						QCOMPARE_NE(attached, nullptr);
 | 
				
			||||||
 | 
						QCOMPARE(attached->window(), nullptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						auto spy = QSignalSpy(attached, &QsWindowAttached::windowChanged);
 | 
				
			||||||
 | 
						window2.reload(window1.get());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						QCOMPARE(attached->window(), &window2);
 | 
				
			||||||
 | 
						QCOMPARE(spy.length(), 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						item1.reset();
 | 
				
			||||||
 | 
						window1.reset();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						QCOMPARE(attached->window(), &window2);
 | 
				
			||||||
 | 
						QCOMPARE(spy.length(), 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TestWindowAttachment::owningWindowChanged() {
 | 
					void TestWindowAttachment::owningWindowChanged() {
 | 
				
			||||||
	auto window1 = ProxyWindowBase();
 | 
						auto window1 = ProxyWindowBase();
 | 
				
			||||||
	auto window2 = ProxyWindowBase();
 | 
						auto window2 = ProxyWindowBase();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,6 +9,7 @@ class TestWindowAttachment: public QObject {
 | 
				
			||||||
private slots:
 | 
					private slots:
 | 
				
			||||||
	static void attachedAfterReload();
 | 
						static void attachedAfterReload();
 | 
				
			||||||
	static void attachedBeforeReload();
 | 
						static void attachedBeforeReload();
 | 
				
			||||||
 | 
						static void earlyAttachReloaded();
 | 
				
			||||||
	static void owningWindowChanged();
 | 
						static void owningWindowChanged();
 | 
				
			||||||
	static void nonItemParents();
 | 
						static void nonItemParents();
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue