forked from quickshell/quickshell
i3/ipc: fix workspace and monitor focus being unset on launch
This commit is contained in:
parent
2028766e61
commit
14aa1793df
5 changed files with 26 additions and 9 deletions
|
@ -99,6 +99,8 @@ void I3Ipc::subscribe() {
|
||||||
|
|
||||||
this->makeRequest(message);
|
this->makeRequest(message);
|
||||||
|
|
||||||
|
// Workspaces must be refreshed before monitors or no focus will be
|
||||||
|
// detected on launch.
|
||||||
this->refreshWorkspaces();
|
this->refreshWorkspaces();
|
||||||
this->refreshMonitors();
|
this->refreshMonitors();
|
||||||
}
|
}
|
||||||
|
@ -250,6 +252,10 @@ void I3Ipc::handleGetWorkspacesEvent(I3IpcEvent* event) {
|
||||||
this->mWorkspaces.insertObjectSorted(workspace, &I3Ipc::compareWorkspaces);
|
this->mWorkspaces.insertObjectSorted(workspace, &I3Ipc::compareWorkspaces);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!this->bFocusedWorkspace && object.value("focused").value<bool>()) {
|
||||||
|
this->bFocusedMonitor = workspace->bindableMonitor().value();
|
||||||
|
}
|
||||||
|
|
||||||
names.push_back(name);
|
names.push_back(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -466,13 +472,23 @@ I3Workspace* I3Ipc::findWorkspaceByName(const QString& name) {
|
||||||
return workspaceIter == list.end() ? nullptr : *workspaceIter;
|
return workspaceIter == list.end() ? nullptr : *workspaceIter;
|
||||||
}
|
}
|
||||||
|
|
||||||
I3Monitor* I3Ipc::findMonitorByName(const QString& name) {
|
I3Monitor* I3Ipc::findMonitorByName(const QString& name, bool createIfMissing) {
|
||||||
auto list = this->mMonitors.valueList();
|
auto list = this->mMonitors.valueList();
|
||||||
auto monitorIter = std::ranges::find_if(list, [name](I3Monitor* m) {
|
auto monitorIter = std::ranges::find_if(list, [name](I3Monitor* m) {
|
||||||
return m->bindableName().value() == name;
|
return m->bindableName().value() == name;
|
||||||
});
|
});
|
||||||
|
|
||||||
return monitorIter == list.end() ? nullptr : *monitorIter;
|
if (monitorIter != list.end()) {
|
||||||
|
return *monitorIter;
|
||||||
|
} else if (createIfMissing) {
|
||||||
|
qCDebug(logI3Ipc) << "Monitor" << name << "requested before creation, performing early init";
|
||||||
|
auto* monitor = new I3Monitor(this);
|
||||||
|
monitor->updateInitial(name);
|
||||||
|
this->mMonitors.insertObject(monitor);
|
||||||
|
return monitor;
|
||||||
|
} else {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjectModel<I3Monitor>* I3Ipc::monitors() { return &this->mMonitors; }
|
ObjectModel<I3Monitor>* I3Ipc::monitors() { return &this->mMonitors; }
|
||||||
|
|
|
@ -89,7 +89,7 @@ public:
|
||||||
static QByteArray buildRequestMessage(EventCode cmd, const QByteArray& payload = QByteArray());
|
static QByteArray buildRequestMessage(EventCode cmd, const QByteArray& payload = QByteArray());
|
||||||
|
|
||||||
I3Workspace* findWorkspaceByName(const QString& name);
|
I3Workspace* findWorkspaceByName(const QString& name);
|
||||||
I3Monitor* findMonitorByName(const QString& name);
|
I3Monitor* findMonitorByName(const QString& name, bool createIfMissing = false);
|
||||||
I3Workspace* findWorkspaceByID(qint32 id);
|
I3Workspace* findWorkspaceByID(qint32 id);
|
||||||
|
|
||||||
void setFocusedMonitor(I3Monitor* monitor);
|
void setFocusedMonitor(I3Monitor* monitor);
|
||||||
|
|
|
@ -43,17 +43,18 @@ void I3Monitor::updateFromObject(const QVariantMap& obj) {
|
||||||
if (!this->bActiveWorkspace
|
if (!this->bActiveWorkspace
|
||||||
|| activeWorkspaceName != this->bActiveWorkspace->bindableName().value())
|
|| activeWorkspaceName != this->bActiveWorkspace->bindableName().value())
|
||||||
{
|
{
|
||||||
auto* workspace = this->ipc->findWorkspaceByName(activeWorkspaceName);
|
if (activeWorkspaceName.isEmpty()) {
|
||||||
if (activeWorkspaceName.isEmpty() || workspace == nullptr) { // is null when output is disabled
|
|
||||||
this->bActiveWorkspace = nullptr;
|
this->bActiveWorkspace = nullptr;
|
||||||
} else {
|
} else {
|
||||||
this->bActiveWorkspace = workspace;
|
this->bActiveWorkspace = this->ipc->findWorkspaceByName(activeWorkspaceName);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Qt::endPropertyUpdateGroup();
|
Qt::endPropertyUpdateGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void I3Monitor::updateInitial(const QString& name) { this->bName = name; }
|
||||||
|
|
||||||
void I3Monitor::setFocusedWorkspace(I3Workspace* workspace) { this->bActiveWorkspace = workspace; };
|
void I3Monitor::setFocusedWorkspace(I3Workspace* workspace) { this->bActiveWorkspace = workspace; };
|
||||||
|
|
||||||
} // namespace qs::i3::ipc
|
} // namespace qs::i3::ipc
|
||||||
|
|
|
@ -61,6 +61,7 @@ public:
|
||||||
[[nodiscard]] QVariantMap lastIpcObject() const;
|
[[nodiscard]] QVariantMap lastIpcObject() const;
|
||||||
|
|
||||||
void updateFromObject(const QVariantMap& obj);
|
void updateFromObject(const QVariantMap& obj);
|
||||||
|
void updateInitial(const QString& name);
|
||||||
|
|
||||||
void setFocusedWorkspace(I3Workspace* workspace);
|
void setFocusedWorkspace(I3Workspace* workspace);
|
||||||
|
|
||||||
|
|
|
@ -44,11 +44,10 @@ void I3Workspace::updateFromObject(const QVariantMap& obj) {
|
||||||
auto monitorName = obj.value("output").value<QString>();
|
auto monitorName = obj.value("output").value<QString>();
|
||||||
|
|
||||||
if (!this->bMonitor || monitorName != this->bMonitor->bindableName().value()) {
|
if (!this->bMonitor || monitorName != this->bMonitor->bindableName().value()) {
|
||||||
auto* monitor = this->ipc->findMonitorByName(monitorName);
|
if (monitorName.isEmpty()) {
|
||||||
if (monitorName.isEmpty() || monitor == nullptr) { // is null when output is disabled
|
|
||||||
this->bMonitor = nullptr;
|
this->bMonitor = nullptr;
|
||||||
} else {
|
} else {
|
||||||
this->bMonitor = monitor;
|
this->bMonitor = this->ipc->findMonitorByName(monitorName, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue