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

View file

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

View file

@ -12,6 +12,7 @@ HyprExtras::HyprExtras(QObject* parent)
, m_requestSocket("") , m_requestSocket("")
, m_eventSocket("") , m_eventSocket("")
, m_socket(nullptr) , m_socket(nullptr)
, m_socketValid(false)
, m_devices(new HyprDevices(this)) { , m_devices(new HyprDevices(this)) {
const auto his = qEnvironmentVariable("HYPRLAND_INSTANCE_SIGNATURE"); const auto his = qEnvironmentVariable("HYPRLAND_INSTANCE_SIGNATURE");
if (his.isEmpty()) { if (his.isEmpty()) {
@ -38,7 +39,11 @@ HyprExtras::HyprExtras(QObject* parent)
refreshDevices(); refreshDevices();
m_socket = new QLocalSocket(this); 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); QObject::connect(m_socket, &QLocalSocket::readyRead, this, &HyprExtras::readEvent);
m_socket->connectToServer(m_eventSocket, QLocalSocket::ReadOnly); m_socket->connectToServer(m_eventSocket, QLocalSocket::ReadOnly);
} }
@ -55,7 +60,10 @@ void HyprExtras::message(const QString& message) {
return; 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; 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()); 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) { if (success) {
refreshOptions(); 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() { void HyprExtras::readEvent() {
while (true) { while (true) {
auto rawEvent = m_socket->readLine(); auto rawEvent = m_socket->readLine();

View file

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

View file

@ -43,6 +43,12 @@ Singleton {
return Hyprland.monitorFor(screen); 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: { onCapsLockChanged: {
if (!Config.utilities.toasts.capsLockChanged) if (!Config.utilities.toasts.capsLockChanged)
return; return;
@ -73,7 +79,7 @@ Singleton {
if (n === "configreloaded") { if (n === "configreloaded") {
root.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)) { } else if (["workspace", "moveworkspace", "activespecial", "focusedmon"].includes(n)) {
Hyprland.refreshWorkspaces(); Hyprland.refreshWorkspaces();
Hyprland.refreshMonitors(); Hyprland.refreshMonitors();