forked from quickshell/quickshell
		
	hyprland/ipc: convert to bindable properties
This commit is contained in:
		
							parent
							
								
									eabf79ebb6
								
							
						
					
					
						commit
						3b2d84caf0
					
				
					 5 changed files with 105 additions and 160 deletions
				
			
		| 
						 | 
				
			
			@ -243,8 +243,9 @@ void HyprlandIpc::onEvent(HyprlandIpcEvent* event) {
 | 
			
		|||
		const auto& mList = this->mMonitors.valueList();
 | 
			
		||||
		auto name = QString::fromUtf8(event->data);
 | 
			
		||||
 | 
			
		||||
		auto monitorIter =
 | 
			
		||||
		    std::ranges::find_if(mList, [name](const HyprlandMonitor* m) { return m->name() == name; });
 | 
			
		||||
		auto monitorIter = std::ranges::find_if(mList, [name](HyprlandMonitor* m) {
 | 
			
		||||
			return m->bindableName().value() == name;
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		if (monitorIter == mList.end()) {
 | 
			
		||||
			qCWarning(logHyprlandIpc) << "Got removal for monitor" << name
 | 
			
		||||
| 
						 | 
				
			
			@ -255,8 +256,8 @@ void HyprlandIpc::onEvent(HyprlandIpcEvent* event) {
 | 
			
		|||
		auto index = monitorIter - mList.begin();
 | 
			
		||||
		auto* monitor = *monitorIter;
 | 
			
		||||
 | 
			
		||||
		qCDebug(logHyprlandIpc) << "Monitor removed with id" << monitor->id() << "name"
 | 
			
		||||
		                        << monitor->name();
 | 
			
		||||
		qCDebug(logHyprlandIpc) << "Monitor removed with id" << monitor->bindableId().value() << "name"
 | 
			
		||||
		                        << monitor->bindableName().value();
 | 
			
		||||
		this->mMonitors.removeAt(index);
 | 
			
		||||
 | 
			
		||||
		// delete the monitor object in the next event loop cycle so it's likely to
 | 
			
		||||
| 
						 | 
				
			
			@ -293,8 +294,9 @@ void HyprlandIpc::onEvent(HyprlandIpcEvent* event) {
 | 
			
		|||
 | 
			
		||||
		const auto& mList = this->mWorkspaces.valueList();
 | 
			
		||||
 | 
			
		||||
		auto workspaceIter =
 | 
			
		||||
		    std::ranges::find_if(mList, [id](const HyprlandWorkspace* m) { return m->id() == id; });
 | 
			
		||||
		auto workspaceIter = std::ranges::find_if(mList, [id](HyprlandWorkspace* m) {
 | 
			
		||||
			return m->bindableId().value() == id;
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		if (workspaceIter == mList.end()) {
 | 
			
		||||
			qCWarning(logHyprlandIpc) << "Got removal for workspace id" << id << "name" << name
 | 
			
		||||
| 
						 | 
				
			
			@ -334,7 +336,7 @@ void HyprlandIpc::onEvent(HyprlandIpcEvent* event) {
 | 
			
		|||
		this->setFocusedMonitor(monitor);
 | 
			
		||||
		monitor->setActiveWorkspace(workspace);
 | 
			
		||||
		qCDebug(logHyprlandIpc) << "Monitor" << name << "focused with workspace"
 | 
			
		||||
		                        << (workspace ? workspace->id() : -1);
 | 
			
		||||
		                        << (workspace ? workspace->bindableId().value() : -1);
 | 
			
		||||
	} else if (event->name == "workspacev2") {
 | 
			
		||||
		auto args = event->parseView(2);
 | 
			
		||||
		auto id = args.at(0).toInt();
 | 
			
		||||
| 
						 | 
				
			
			@ -344,7 +346,7 @@ void HyprlandIpc::onEvent(HyprlandIpcEvent* event) {
 | 
			
		|||
			auto* workspace = this->findWorkspaceByName(name, true, id);
 | 
			
		||||
			this->mFocusedMonitor->setActiveWorkspace(workspace);
 | 
			
		||||
			qCDebug(logHyprlandIpc) << "Workspace" << id << "activated on"
 | 
			
		||||
			                        << this->mFocusedMonitor->name();
 | 
			
		||||
			                        << this->mFocusedMonitor->bindableName().value();
 | 
			
		||||
		}
 | 
			
		||||
	} else if (event->name == "moveworkspacev2") {
 | 
			
		||||
		auto args = event->parseView(3);
 | 
			
		||||
| 
						 | 
				
			
			@ -364,15 +366,16 @@ void HyprlandIpc::onEvent(HyprlandIpcEvent* event) {
 | 
			
		|||
 | 
			
		||||
		const auto& mList = this->mWorkspaces.valueList();
 | 
			
		||||
 | 
			
		||||
		auto workspaceIter =
 | 
			
		||||
		    std::ranges::find_if(mList, [id](const HyprlandWorkspace* m) { return m->id() == id; });
 | 
			
		||||
		auto workspaceIter = std::ranges::find_if(mList, [id](HyprlandWorkspace* m) {
 | 
			
		||||
			return m->bindableId().value() == id;
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		if (workspaceIter == mList.end()) return;
 | 
			
		||||
 | 
			
		||||
		qCDebug(logHyprlandIpc) << "Workspace with id" << id << "renamed from"
 | 
			
		||||
		                        << (*workspaceIter)->name() << "to" << name;
 | 
			
		||||
		                        << (*workspaceIter)->bindableName().value() << "to" << name;
 | 
			
		||||
 | 
			
		||||
		(*workspaceIter)->setName(name);
 | 
			
		||||
		(*workspaceIter)->bindableName().setValue(name);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -382,15 +385,17 @@ HyprlandIpc::findWorkspaceByName(const QString& name, bool createIfMissing, qint
 | 
			
		|||
	HyprlandWorkspace* workspace = nullptr;
 | 
			
		||||
 | 
			
		||||
	if (id != -1) {
 | 
			
		||||
		auto workspaceIter =
 | 
			
		||||
		    std::ranges::find_if(mList, [&](const HyprlandWorkspace* m) { return m->id() == id; });
 | 
			
		||||
		auto workspaceIter = std::ranges::find_if(mList, [&](HyprlandWorkspace* m) {
 | 
			
		||||
			return m->bindableId().value() == id;
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		workspace = workspaceIter == mList.end() ? nullptr : *workspaceIter;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!workspace) {
 | 
			
		||||
		auto workspaceIter =
 | 
			
		||||
		    std::ranges::find_if(mList, [&](const HyprlandWorkspace* m) { return m->name() == name; });
 | 
			
		||||
		auto workspaceIter = std::ranges::find_if(mList, [&](HyprlandWorkspace* m) {
 | 
			
		||||
			return m->bindableName().value() == name;
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		workspace = workspaceIter == mList.end() ? nullptr : *workspaceIter;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -429,16 +434,17 @@ void HyprlandIpc::refreshWorkspaces(bool canCreate) {
 | 
			
		|||
 | 
			
		||||
			auto id = object.value("id").toInt();
 | 
			
		||||
 | 
			
		||||
			auto workspaceIter =
 | 
			
		||||
			    std::ranges::find_if(mList, [&](const HyprlandWorkspace* m) { return m->id() == id; });
 | 
			
		||||
			auto workspaceIter = std::ranges::find_if(mList, [&](HyprlandWorkspace* m) {
 | 
			
		||||
				return m->bindableId().value() == id;
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			// Only fall back to name-based filtering as a last resort, for workspaces where
 | 
			
		||||
			// no ID has been determined yet.
 | 
			
		||||
			if (workspaceIter == mList.end()) {
 | 
			
		||||
				auto name = object.value("name").toString();
 | 
			
		||||
 | 
			
		||||
				workspaceIter = std::ranges::find_if(mList, [&](const HyprlandWorkspace* m) {
 | 
			
		||||
					return m->id() == -1 && m->name() == name;
 | 
			
		||||
				workspaceIter = std::ranges::find_if(mList, [&](HyprlandWorkspace* m) {
 | 
			
		||||
					return m->bindableId().value() == -1 && m->bindableName().value() == name;
 | 
			
		||||
				});
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -463,7 +469,7 @@ void HyprlandIpc::refreshWorkspaces(bool canCreate) {
 | 
			
		|||
			auto removedWorkspaces = QVector<HyprlandWorkspace*>();
 | 
			
		||||
 | 
			
		||||
			for (auto* workspace: mList) {
 | 
			
		||||
				if (!ids.contains(workspace->id())) {
 | 
			
		||||
				if (!ids.contains(workspace->bindableId().value())) {
 | 
			
		||||
					removedWorkspaces.push_back(workspace);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -480,8 +486,9 @@ HyprlandMonitor*
 | 
			
		|||
HyprlandIpc::findMonitorByName(const QString& name, bool createIfMissing, qint32 id) {
 | 
			
		||||
	const auto& mList = this->mMonitors.valueList();
 | 
			
		||||
 | 
			
		||||
	auto monitorIter =
 | 
			
		||||
	    std::ranges::find_if(mList, [name](const HyprlandMonitor* m) { return m->name() == name; });
 | 
			
		||||
	auto monitorIter = std::ranges::find_if(mList, [name](HyprlandMonitor* m) {
 | 
			
		||||
		return m->bindableName().value() == name;
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	if (monitorIter != mList.end()) {
 | 
			
		||||
		return *monitorIter;
 | 
			
		||||
| 
						 | 
				
			
			@ -549,8 +556,8 @@ void HyprlandIpc::refreshMonitors(bool canCreate) {
 | 
			
		|||
			auto object = entry.toObject().toVariantMap();
 | 
			
		||||
			auto name = object.value("name").toString();
 | 
			
		||||
 | 
			
		||||
			auto monitorIter = std::ranges::find_if(mList, [name](const HyprlandMonitor* m) {
 | 
			
		||||
				return m->name() == name;
 | 
			
		||||
			auto monitorIter = std::ranges::find_if(mList, [name](HyprlandMonitor* m) {
 | 
			
		||||
				return m->bindableName().value() == name;
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			auto* monitor = monitorIter == mList.end() ? nullptr : *monitorIter;
 | 
			
		||||
| 
						 | 
				
			
			@ -573,7 +580,7 @@ void HyprlandIpc::refreshMonitors(bool canCreate) {
 | 
			
		|||
		auto removedMonitors = QVector<HyprlandMonitor*>();
 | 
			
		||||
 | 
			
		||||
		for (auto* monitor: mList) {
 | 
			
		||||
			if (!names.contains(monitor->name())) {
 | 
			
		||||
			if (!names.contains(monitor->bindableName().value())) {
 | 
			
		||||
				removedMonitors.push_back(monitor);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,7 @@
 | 
			
		|||
 | 
			
		||||
#include <qcontainerfwd.h>
 | 
			
		||||
#include <qobject.h>
 | 
			
		||||
#include <qproperty.h>
 | 
			
		||||
#include <qtmetamacros.h>
 | 
			
		||||
#include <qtypes.h>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -10,88 +11,36 @@
 | 
			
		|||
 | 
			
		||||
namespace qs::hyprland::ipc {
 | 
			
		||||
 | 
			
		||||
qint32 HyprlandMonitor::id() const { return this->mId; }
 | 
			
		||||
QString HyprlandMonitor::name() const { return this->mName; }
 | 
			
		||||
QString HyprlandMonitor::description() const { return this->mDescription; }
 | 
			
		||||
qint32 HyprlandMonitor::x() const { return this->mX; }
 | 
			
		||||
qint32 HyprlandMonitor::y() const { return this->mY; }
 | 
			
		||||
qint32 HyprlandMonitor::width() const { return this->mWidth; }
 | 
			
		||||
qint32 HyprlandMonitor::height() const { return this->mHeight; }
 | 
			
		||||
qreal HyprlandMonitor::scale() const { return this->mScale; }
 | 
			
		||||
QVariantMap HyprlandMonitor::lastIpcObject() const { return this->mLastIpcObject; }
 | 
			
		||||
 | 
			
		||||
void HyprlandMonitor::updateInitial(qint32 id, QString name, QString description) {
 | 
			
		||||
	if (id != this->mId) {
 | 
			
		||||
		this->mId = id;
 | 
			
		||||
		emit this->idChanged();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (name != this->mName) {
 | 
			
		||||
		this->mName = std::move(name);
 | 
			
		||||
		emit this->nameChanged();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (description != this->mDescription) {
 | 
			
		||||
		this->mDescription = std::move(description);
 | 
			
		||||
		emit this->descriptionChanged();
 | 
			
		||||
	}
 | 
			
		||||
void HyprlandMonitor::updateInitial(qint32 id, const QString& name, const QString& description) {
 | 
			
		||||
	Qt::beginPropertyUpdateGroup();
 | 
			
		||||
	this->bId = id;
 | 
			
		||||
	this->bName = name;
 | 
			
		||||
	this->bDescription = description;
 | 
			
		||||
	Qt::endPropertyUpdateGroup();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HyprlandMonitor::updateFromObject(QVariantMap object) {
 | 
			
		||||
	auto id = object.value("id").value<qint32>();
 | 
			
		||||
	auto name = object.value("name").value<QString>();
 | 
			
		||||
	auto description = object.value("description").value<QString>();
 | 
			
		||||
	auto x = object.value("x").value<qint32>();
 | 
			
		||||
	auto y = object.value("y").value<qint32>();
 | 
			
		||||
	auto width = object.value("width").value<qint32>();
 | 
			
		||||
	auto height = object.value("height").value<qint32>();
 | 
			
		||||
	auto scale = object.value("height").value<qint32>();
 | 
			
		||||
	auto activeWorkspaceObj = object.value("activeWorkspace").value<QVariantMap>();
 | 
			
		||||
	auto activeWorkspaceId = activeWorkspaceObj.value("id").value<qint32>();
 | 
			
		||||
	auto activeWorkspaceName = activeWorkspaceObj.value("name").value<QString>();
 | 
			
		||||
	auto focused = object.value("focused").value<bool>();
 | 
			
		||||
 | 
			
		||||
	if (id != this->mId) {
 | 
			
		||||
		this->mId = id;
 | 
			
		||||
		emit this->idChanged();
 | 
			
		||||
	}
 | 
			
		||||
	Qt::beginPropertyUpdateGroup();
 | 
			
		||||
	this->bId = object.value("id").value<qint32>();
 | 
			
		||||
	this->bName = object.value("name").value<QString>();
 | 
			
		||||
	this->bDescription = object.value("description").value<QString>();
 | 
			
		||||
	this->bX = object.value("x").value<qint32>();
 | 
			
		||||
	this->bY = object.value("y").value<qint32>();
 | 
			
		||||
	this->bWidth = object.value("width").value<qint32>();
 | 
			
		||||
	this->bHeight = object.value("height").value<qint32>();
 | 
			
		||||
	this->bScale = object.value("scale").value<qreal>();
 | 
			
		||||
	Qt::endPropertyUpdateGroup();
 | 
			
		||||
 | 
			
		||||
	if (name != this->mName) {
 | 
			
		||||
		this->mName = std::move(name);
 | 
			
		||||
		emit this->nameChanged();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (description != this->mDescription) {
 | 
			
		||||
		this->mDescription = std::move(description);
 | 
			
		||||
		emit this->descriptionChanged();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (x != this->mX) {
 | 
			
		||||
		this->mX = x;
 | 
			
		||||
		emit this->xChanged();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (y != this->mY) {
 | 
			
		||||
		this->mY = y;
 | 
			
		||||
		emit this->yChanged();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (width != this->mWidth) {
 | 
			
		||||
		this->mWidth = width;
 | 
			
		||||
		emit this->widthChanged();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (height != this->mHeight) {
 | 
			
		||||
		this->mHeight = height;
 | 
			
		||||
		emit this->heightChanged();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (scale != this->mScale) {
 | 
			
		||||
		this->mScale = scale;
 | 
			
		||||
		emit this->scaleChanged();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (this->mActiveWorkspace == nullptr || this->mActiveWorkspace->name() != activeWorkspaceName) {
 | 
			
		||||
	if (this->mActiveWorkspace == nullptr
 | 
			
		||||
	    || this->mActiveWorkspace->bindableName().value() != activeWorkspaceName)
 | 
			
		||||
	{
 | 
			
		||||
		auto* workspace = this->ipc->findWorkspaceByName(activeWorkspaceName, true, activeWorkspaceId);
 | 
			
		||||
		workspace->setMonitor(this);
 | 
			
		||||
		this->setActiveWorkspace(workspace);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,7 @@
 | 
			
		|||
#include <qbytearrayview.h>
 | 
			
		||||
#include <qcontainerfwd.h>
 | 
			
		||||
#include <qobject.h>
 | 
			
		||||
#include <qproperty.h>
 | 
			
		||||
#include <qqmlintegration.h>
 | 
			
		||||
#include <qtmetamacros.h>
 | 
			
		||||
#include <qtypes.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -14,14 +15,14 @@ namespace qs::hyprland::ipc {
 | 
			
		|||
class HyprlandMonitor: public QObject {
 | 
			
		||||
	Q_OBJECT;
 | 
			
		||||
	// clang-format off
 | 
			
		||||
	Q_PROPERTY(qint32 id READ id NOTIFY idChanged);
 | 
			
		||||
	Q_PROPERTY(QString name READ name NOTIFY nameChanged);
 | 
			
		||||
	Q_PROPERTY(QString description READ description NOTIFY descriptionChanged);
 | 
			
		||||
	Q_PROPERTY(qint32 x READ x NOTIFY xChanged);
 | 
			
		||||
	Q_PROPERTY(qint32 y READ y NOTIFY yChanged);
 | 
			
		||||
	Q_PROPERTY(qint32 width READ width NOTIFY widthChanged);
 | 
			
		||||
	Q_PROPERTY(qint32 height READ height NOTIFY heightChanged);
 | 
			
		||||
	Q_PROPERTY(qreal scale READ scale NOTIFY scaleChanged);
 | 
			
		||||
	Q_PROPERTY(qint32 id READ default NOTIFY idChanged BINDABLE bindableId);
 | 
			
		||||
	Q_PROPERTY(QString name READ default NOTIFY nameChanged BINDABLE bindableName);
 | 
			
		||||
	Q_PROPERTY(QString description READ default NOTIFY descriptionChanged BINDABLE bindableDescription);
 | 
			
		||||
	Q_PROPERTY(qint32 x READ default NOTIFY xChanged BINDABLE bindableX);
 | 
			
		||||
	Q_PROPERTY(qint32 y READ default NOTIFY yChanged BINDABLE bindableY);
 | 
			
		||||
	Q_PROPERTY(qint32 width READ default NOTIFY widthChanged BINDABLE bindableWidth);
 | 
			
		||||
	Q_PROPERTY(qint32 height READ default NOTIFY heightChanged BINDABLE bindableHeight);
 | 
			
		||||
	Q_PROPERTY(qreal scale READ default NOTIFY scaleChanged BINDABLE bindableScale);
 | 
			
		||||
	/// Last json returned for this monitor, as a javascript object.
 | 
			
		||||
	///
 | 
			
		||||
	/// > [!WARNING] This is *not* updated unless the monitor object is fetched again from
 | 
			
		||||
| 
						 | 
				
			
			@ -37,17 +38,18 @@ class HyprlandMonitor: public QObject {
 | 
			
		|||
public:
 | 
			
		||||
	explicit HyprlandMonitor(HyprlandIpc* ipc): QObject(ipc), ipc(ipc) {}
 | 
			
		||||
 | 
			
		||||
	void updateInitial(qint32 id, QString name, QString description);
 | 
			
		||||
	void updateInitial(qint32 id, const QString& name, const QString& description);
 | 
			
		||||
	void updateFromObject(QVariantMap object);
 | 
			
		||||
 | 
			
		||||
	[[nodiscard]] qint32 id() const;
 | 
			
		||||
	[[nodiscard]] QString name() const;
 | 
			
		||||
	[[nodiscard]] QString description() const;
 | 
			
		||||
	[[nodiscard]] qint32 x() const;
 | 
			
		||||
	[[nodiscard]] qint32 y() const;
 | 
			
		||||
	[[nodiscard]] qint32 width() const;
 | 
			
		||||
	[[nodiscard]] qint32 height() const;
 | 
			
		||||
	[[nodiscard]] qreal scale() const;
 | 
			
		||||
	[[nodiscard]] QBindable<qint32> bindableId() { return &this->bId; }
 | 
			
		||||
	[[nodiscard]] QBindable<QString> bindableName() { return &this->bName; }
 | 
			
		||||
	[[nodiscard]] QBindable<QString> bindableDescription() { return &this->bDescription; }
 | 
			
		||||
	[[nodiscard]] QBindable<qint32> bindableX() { return &this->bX; }
 | 
			
		||||
	[[nodiscard]] QBindable<qint32> bindableY() { return &this->bY; }
 | 
			
		||||
	[[nodiscard]] QBindable<qint32> bindableWidth() { return &this->bWidth; }
 | 
			
		||||
	[[nodiscard]] QBindable<qint32> bindableHeight() { return &this->bHeight; }
 | 
			
		||||
	[[nodiscard]] QBindable<qreal> bindableScale() { return &this->bScale; }
 | 
			
		||||
 | 
			
		||||
	[[nodiscard]] QVariantMap lastIpcObject() const;
 | 
			
		||||
 | 
			
		||||
	void setActiveWorkspace(HyprlandWorkspace* workspace);
 | 
			
		||||
| 
						 | 
				
			
			@ -71,17 +73,19 @@ private slots:
 | 
			
		|||
private:
 | 
			
		||||
	HyprlandIpc* ipc;
 | 
			
		||||
 | 
			
		||||
	qint32 mId = -1;
 | 
			
		||||
	QString mName;
 | 
			
		||||
	QString mDescription;
 | 
			
		||||
	qint32 mX = 0;
 | 
			
		||||
	qint32 mY = 0;
 | 
			
		||||
	qint32 mWidth = 0;
 | 
			
		||||
	qint32 mHeight = 0;
 | 
			
		||||
	qreal mScale = 0;
 | 
			
		||||
	QVariantMap mLastIpcObject;
 | 
			
		||||
 | 
			
		||||
	HyprlandWorkspace* mActiveWorkspace = nullptr;
 | 
			
		||||
 | 
			
		||||
	// clang-format off
 | 
			
		||||
	Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(HyprlandMonitor, qint32, bId, -1, &HyprlandMonitor::idChanged);
 | 
			
		||||
	Q_OBJECT_BINDABLE_PROPERTY(HyprlandMonitor, QString, bName, &HyprlandMonitor::nameChanged);
 | 
			
		||||
	Q_OBJECT_BINDABLE_PROPERTY(HyprlandMonitor, QString, bDescription, &HyprlandMonitor::descriptionChanged);
 | 
			
		||||
	Q_OBJECT_BINDABLE_PROPERTY(HyprlandMonitor, qint32, bX, &HyprlandMonitor::xChanged);
 | 
			
		||||
	Q_OBJECT_BINDABLE_PROPERTY(HyprlandMonitor, qint32, bY, &HyprlandMonitor::yChanged);
 | 
			
		||||
	Q_OBJECT_BINDABLE_PROPERTY(HyprlandMonitor, qint32, bWidth, &HyprlandMonitor::widthChanged);
 | 
			
		||||
	Q_OBJECT_BINDABLE_PROPERTY(HyprlandMonitor, qint32, bHeight, &HyprlandMonitor::heightChanged);
 | 
			
		||||
	Q_OBJECT_BINDABLE_PROPERTY(HyprlandMonitor, qreal, bScale, &HyprlandMonitor::scaleChanged);
 | 
			
		||||
	// clang-format on
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace qs::hyprland::ipc
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,7 @@
 | 
			
		|||
 | 
			
		||||
#include <qcontainerfwd.h>
 | 
			
		||||
#include <qobject.h>
 | 
			
		||||
#include <qproperty.h>
 | 
			
		||||
#include <qtmetamacros.h>
 | 
			
		||||
#include <qtypes.h>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -10,52 +11,34 @@
 | 
			
		|||
 | 
			
		||||
namespace qs::hyprland::ipc {
 | 
			
		||||
 | 
			
		||||
qint32 HyprlandWorkspace::id() const { return this->mId; }
 | 
			
		||||
 | 
			
		||||
QString HyprlandWorkspace::name() const { return this->mName; }
 | 
			
		||||
 | 
			
		||||
void HyprlandWorkspace::setName(QString name) {
 | 
			
		||||
	if (name == this->mName) return;
 | 
			
		||||
	this->mName = std::move(name);
 | 
			
		||||
	emit this->nameChanged();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QVariantMap HyprlandWorkspace::lastIpcObject() const { return this->mLastIpcObject; }
 | 
			
		||||
 | 
			
		||||
void HyprlandWorkspace::updateInitial(qint32 id, QString name) {
 | 
			
		||||
	if (id != this->mId) {
 | 
			
		||||
		this->mId = id;
 | 
			
		||||
		emit this->idChanged();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (name != this->mName) {
 | 
			
		||||
		this->mName = std::move(name);
 | 
			
		||||
		emit this->nameChanged();
 | 
			
		||||
	}
 | 
			
		||||
void HyprlandWorkspace::updateInitial(qint32 id, const QString& name) {
 | 
			
		||||
	Qt::beginPropertyUpdateGroup();
 | 
			
		||||
	this->bId = id;
 | 
			
		||||
	this->bName = name;
 | 
			
		||||
	Qt::endPropertyUpdateGroup();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HyprlandWorkspace::updateFromObject(QVariantMap object) {
 | 
			
		||||
	auto name = object.value("name").value<QString>();
 | 
			
		||||
	auto monitorId = object.value("monitorID").value<qint32>();
 | 
			
		||||
	auto monitorName = object.value("monitor").value<QString>();
 | 
			
		||||
 | 
			
		||||
	auto initial = this->mId = -1;
 | 
			
		||||
	auto initial = this->bId == -1;
 | 
			
		||||
 | 
			
		||||
	// ID cannot be updated after creation
 | 
			
		||||
	if (initial) {
 | 
			
		||||
		this->mId = object.value("id").value<qint32>();
 | 
			
		||||
		emit this->idChanged();
 | 
			
		||||
		this->bId = object.value("id").value<qint32>();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// No events we currently handle give a workspace id but not a name,
 | 
			
		||||
	// so we shouldn't set this if it isn't an initial query
 | 
			
		||||
	if (initial && name != this->mName) {
 | 
			
		||||
		this->mName = name;
 | 
			
		||||
		emit this->nameChanged();
 | 
			
		||||
	if (initial) {
 | 
			
		||||
		this->bName = object.value("name").value<QString>();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!monitorName.isEmpty()
 | 
			
		||||
	    && (this->mMonitor == nullptr || this->mMonitor->name() != monitorName))
 | 
			
		||||
	    && (this->mMonitor == nullptr || this->mMonitor->bindableName().value() != monitorName))
 | 
			
		||||
	{
 | 
			
		||||
		auto* monitor = this->ipc->findMonitorByName(monitorName, true, monitorId);
 | 
			
		||||
		this->setMonitor(monitor);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,7 @@
 | 
			
		|||
#include <qbytearrayview.h>
 | 
			
		||||
#include <qjsonobject.h>
 | 
			
		||||
#include <qobject.h>
 | 
			
		||||
#include <qproperty.h>
 | 
			
		||||
#include <qqmlintegration.h>
 | 
			
		||||
#include <qtmetamacros.h>
 | 
			
		||||
#include <qtypes.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -13,8 +14,8 @@ namespace qs::hyprland::ipc {
 | 
			
		|||
 | 
			
		||||
class HyprlandWorkspace: public QObject {
 | 
			
		||||
	Q_OBJECT;
 | 
			
		||||
	Q_PROPERTY(qint32 id READ id NOTIFY idChanged);
 | 
			
		||||
	Q_PROPERTY(QString name READ name NOTIFY nameChanged);
 | 
			
		||||
	Q_PROPERTY(qint32 id READ default NOTIFY idChanged BINDABLE bindableId);
 | 
			
		||||
	Q_PROPERTY(QString name READ default NOTIFY nameChanged BINDABLE bindableName);
 | 
			
		||||
	/// Last json returned for this workspace, as a javascript object.
 | 
			
		||||
	///
 | 
			
		||||
	/// > [!WARNING] This is *not* updated unless the workspace object is fetched again from
 | 
			
		||||
| 
						 | 
				
			
			@ -28,13 +29,11 @@ class HyprlandWorkspace: public QObject {
 | 
			
		|||
public:
 | 
			
		||||
	explicit HyprlandWorkspace(HyprlandIpc* ipc): QObject(ipc), ipc(ipc) {}
 | 
			
		||||
 | 
			
		||||
	void updateInitial(qint32 id, QString name);
 | 
			
		||||
	void updateInitial(qint32 id, const QString& name);
 | 
			
		||||
	void updateFromObject(QVariantMap object);
 | 
			
		||||
 | 
			
		||||
	[[nodiscard]] qint32 id() const;
 | 
			
		||||
 | 
			
		||||
	[[nodiscard]] QString name() const;
 | 
			
		||||
	void setName(QString name);
 | 
			
		||||
	[[nodiscard]] QBindable<qint32> bindableId() { return &this->bId; }
 | 
			
		||||
	[[nodiscard]] QBindable<QString> bindableName() { return &this->bName; }
 | 
			
		||||
 | 
			
		||||
	[[nodiscard]] QVariantMap lastIpcObject() const;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -53,10 +52,13 @@ private slots:
 | 
			
		|||
private:
 | 
			
		||||
	HyprlandIpc* ipc;
 | 
			
		||||
 | 
			
		||||
	qint32 mId = -1;
 | 
			
		||||
	QString mName;
 | 
			
		||||
	QVariantMap mLastIpcObject;
 | 
			
		||||
	HyprlandMonitor* mMonitor = nullptr;
 | 
			
		||||
 | 
			
		||||
	// clang-format off
 | 
			
		||||
	Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(HyprlandWorkspace, qint32, bId, -1, &HyprlandWorkspace::idChanged);
 | 
			
		||||
	Q_OBJECT_BINDABLE_PROPERTY(HyprlandWorkspace, QString, bName, &HyprlandWorkspace::nameChanged);
 | 
			
		||||
	// clang-format on
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace qs::hyprland::ipc
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue