plugin/hypr: fix devices + better error handling

Also fix lock indicators
This commit is contained in:
2 * r + 2 * t 2025-09-25 18:24:52 +10:00
parent 10436cd6a3
commit d3fac6805f
5 changed files with 46 additions and 8 deletions

View file

@ -40,7 +40,7 @@ bool HyprKeyboard::main() const {
return m_lastIpcObject.value("main").toBool();
}
bool HyprKeyboard::updateLastIpcObject(const QJsonObject& object) {
bool HyprKeyboard::updateLastIpcObject(QJsonObject object) {
if (m_lastIpcObject == object) {
return false;
}
@ -89,7 +89,7 @@ QList<HyprKeyboard*> HyprDevices::keyboards() const {
return m_keyboards;
}
bool HyprDevices::updateLastIpcObject(const QJsonObject& object) {
bool HyprDevices::updateLastIpcObject(QJsonObject object) {
const auto val = object.value("keyboards").toArray();
bool dirty = false;

View file

@ -32,7 +32,7 @@ public:
[[nodiscard]] bool numLock() const;
[[nodiscard]] bool main() const;
bool updateLastIpcObject(const QJsonObject& object);
bool updateLastIpcObject(QJsonObject object);
signals:
void lastIpcObjectChanged();
@ -60,7 +60,7 @@ public:
[[nodiscard]] QList<HyprKeyboard*> keyboards() const;
bool updateLastIpcObject(const QJsonObject& object);
bool updateLastIpcObject(QJsonObject object);
signals:
void keyboardsChanged();

View file

@ -12,6 +12,7 @@ HyprExtras::HyprExtras(QObject* parent)
, m_requestSocket("")
, m_eventSocket("")
, m_socket(nullptr)
, m_socketValid(false)
, m_devices(new HyprDevices(this)) {
const auto his = qEnvironmentVariable("HYPRLAND_INSTANCE_SIGNATURE");
if (his.isEmpty()) {
@ -38,7 +39,11 @@ HyprExtras::HyprExtras(QObject* parent)
refreshDevices();
m_socket = new QLocalSocket(this);
QObject::connect(m_socket, &QLocalSocket::errorOccurred, this, &HyprExtras::socketError);
QObject::connect(m_socket, &QLocalSocket::stateChanged, this, &HyprExtras::socketStateChanged);
QObject::connect(m_socket, &QLocalSocket::readyRead, this, &HyprExtras::readEvent);
m_socket->connectToServer(m_eventSocket, QLocalSocket::ReadOnly);
}
@ -55,7 +60,10 @@ void HyprExtras::message(const QString& message) {
return;
}
makeRequest(message, [](bool, const QByteArray&) {
makeRequest(message, [](bool success, const QByteArray& res) {
if (!success) {
qWarning() << "HyprExtras::message: request error:" << QString::fromUtf8(res);
}
});
}
@ -64,7 +72,10 @@ void HyprExtras::batchMessage(const QStringList& messages) {
return;
}
makeRequest("[[BATCH]]" + messages.join(";"), [](bool, const QByteArray&) {
makeRequest("[[BATCH]]" + messages.join(";"), [](bool success, const QByteArray& res) {
if (!success) {
qWarning() << "HyprExtras::batchMessage: request error:" << QString::fromUtf8(res);
}
});
}
@ -78,9 +89,11 @@ void HyprExtras::applyOptions(const QVariantHash& options) {
request += QString("keyword %1 %2;").arg(it.key(), it.value().toString());
}
makeRequest(request, [this](bool success, const QByteArray&) {
makeRequest(request, [this](bool success, const QByteArray& res) {
if (success) {
refreshOptions();
} else {
qWarning() << "HyprExtras::applyOptions: request error" << QString::fromUtf8(res);
}
});
}
@ -128,6 +141,22 @@ void HyprExtras::refreshDevices() {
});
}
void HyprExtras::socketError(QLocalSocket::LocalSocketError error) const {
if (!m_socketValid) {
qWarning() << "HyprExtras::socketError: unable to connect to Hyprland event socket:" << error;
} else {
qWarning() << "HyprExtras::socketError: Hyprland event socket error:" << error;
}
}
void HyprExtras::socketStateChanged(QLocalSocket::LocalSocketState state) {
if (state == QLocalSocket::UnconnectedState && m_socketValid) {
qWarning() << "HyprExtras::socketStateChanged: Hyprland event socket disconnected.";
}
m_socketValid = state == QLocalSocket::ConnectedState;
}
void HyprExtras::readEvent() {
while (true) {
auto rawEvent = m_socket->readLine();

View file

@ -36,6 +36,7 @@ private:
QString m_requestSocket;
QString m_eventSocket;
QLocalSocket* m_socket;
bool m_socketValid;
QVariantHash m_options;
HyprDevices* const m_devices;
@ -43,6 +44,8 @@ private:
SocketPtr m_optionsRefresh;
SocketPtr m_devicesRefresh;
void socketError(QLocalSocket::LocalSocketError error) const;
void socketStateChanged(QLocalSocket::LocalSocketState state);
void readEvent();
void handleEvent(const QString& event);

View file

@ -43,6 +43,12 @@ Singleton {
return Hyprland.monitorFor(screen);
}
function reloadDynamicConfs(): void {
extras.batchMessage(["keyword bindln ,Caps_Lock,global,caelestia:refreshDevices", "keyword bindln ,Num_Lock,global,caelestia:refreshDevices"]);
}
Component.onCompleted: reloadDynamicConfs()
onCapsLockChanged: {
if (!Config.utilities.toasts.capsLockChanged)
return;
@ -73,7 +79,7 @@ Singleton {
if (n === "configreloaded") {
root.configReloaded();
extras.batchMessage(["keyword bindln ,Caps_Lock,global,caelestia:refreshDevices", "keyword bindln ,Num_Lock,global,caelestia:refreshDevices"]);
root.reloadDynamicConfs();
} else if (["workspace", "moveworkspace", "activespecial", "focusedmon"].includes(n)) {
Hyprland.refreshWorkspaces();
Hyprland.refreshMonitors();