Skip to content

Commit 84d6d97

Browse files
committed
i3/sway: fix review
1 parent d54fe49 commit 84d6d97

File tree

4 files changed

+55
-49
lines changed

4 files changed

+55
-49
lines changed

BUILD.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,13 +174,23 @@ To disable: `-DHYPRLAND_GLOBAL_SHORTCUTS=OFF`
174174
[hyprland-global-shortcuts-v1]: https://github.com/hyprwm/hyprland-protocols/blob/main/protocols/hyprland-global-shortcuts-v1.xml
175175

176176
#### Hyprland Focus Grab
177-
Enables windows to grab focus similarly to a context menu undr hyprland through the
177+
Enables windows to grab focus similarly to a context menu under hyprland through the
178178
[hyprland-focus-grab-v1] protocol. This feature has no extra dependencies.
179179

180180
To disable: `-DHYPRLAND_FOCUS_GRAB=OFF`
181181

182182
[hyprland-focus-grab-v1]: https://github.com/hyprwm/hyprland-protocols/blob/main/protocols/hyprland-focus-grab-v1.xml
183183

184+
### i3/Sway
185+
Enables i3 and Sway specific features, does not have any dependency on Wayland or x11.
186+
187+
To disable: `-DI3=OFF`
188+
189+
#### i3/Sway IPC
190+
Enables interfacing with i3 and Sway's IPC.
191+
192+
To disable: `-DI3_IPC=OFF`
193+
184194
## Building
185195
*For developers and prospective contributors: See [CONTRIBUTING.md](CONTRIBUTING.md).*
186196

src/x11/i3/ipc/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ qt_add_library(quickshell-i3-ipc STATIC
88
qt_add_qml_module(quickshell-i3-ipc
99
URI Quickshell.I3._Ipc
1010
VERSION 0.1
11-
DEPENDENCIES QtQml Quickshell
11+
DEPENDENCIES QtQml
1212
)
1313

1414
qs_add_module_deps_light(quickshell-i3-ipc Quickshell)

src/x11/i3/ipc/connection.cpp

Lines changed: 42 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include <algorithm>
2-
#include <cstring>
32
#include <tuple>
43

4+
#include <bit>
55
#include <qbytearray.h>
66
#include <qbytearrayview.h>
77
#include <qcontainerfwd.h>
@@ -25,8 +25,8 @@
2525
#include "monitor.hpp"
2626
#include "workspace.hpp"
2727

28-
Q_LOGGING_CATEGORY(logi3Ipc, "quickshell.I3.ipc", QtWarningMsg);
29-
Q_LOGGING_CATEGORY(logi3IpcEvents, "quickshell.I3.ipc.events", QtWarningMsg);
28+
Q_LOGGING_CATEGORY(logI3Ipc, "quickshell.I3.ipc", QtWarningMsg);
29+
Q_LOGGING_CATEGORY(logI3IpcEvents, "quickshell.I3.ipc.events", QtWarningMsg);
3030

3131
namespace qs::i3::ipc {
3232

@@ -38,7 +38,7 @@ QVector<Event> I3Ipc::makeRequest(const QByteArray& request) {
3838
auto dataRaw = this->commandSocket.readAll();
3939
return I3Ipc::parseResponse(dataRaw);
4040
} else {
41-
qWarning(logi3Ipc) << "Timeout while waiting for read for" << request;
41+
qCWarning(logI3Ipc) << "Timeout while waiting for read for" << request;
4242
return {};
4343
}
4444
}
@@ -49,7 +49,7 @@ void I3Ipc::dispatch(const QString& payload) {
4949
QVector<Event> res = this->makeRequest(message);
5050

5151
if (res.isEmpty()) {
52-
qWarning() << "IPC did not reply, error while executing" << payload;
52+
qCWarning(logI3Ipc) << "IPC did not reply, error while executing" << payload;
5353
}
5454

5555
auto [_, data] = res.first();
@@ -59,35 +59,31 @@ void I3Ipc::dispatch(const QString& payload) {
5959
const bool success = jsonMessage["success"].toBool();
6060

6161
if (!success) {
62-
qWarning() << "Error while executing dispatch of" << payload << ":\n\t"
63-
<< jsonMessage["error"];
62+
qCWarning(logI3Ipc) << "Error while executing dispatch of" << payload << ":\n\t"
63+
<< jsonMessage["error"];
6464
}
6565
}
6666
}
6767

6868
QByteArray I3Ipc::buildRequestMessage(EventCode cmd, const QByteArray& payload) {
69-
int len = static_cast<int>(payload.length());
70-
QByteArray lenBytes = QByteArray(4, Qt::Initialization::Uninitialized);
71-
QByteArray typeBytes = QByteArray(4, Qt::Initialization::Uninitialized);
69+
auto payloadLength = static_cast<quint32>(payload.length());
7270

73-
std::memcpy(lenBytes.data(), &len, 4);
74-
std::memcpy(typeBytes.data(), &cmd, 4);
71+
auto type = QByteArray(std::bit_cast<std::array<char, 4>>(cmd).data(), 4);
72+
auto len = QByteArray(std::bit_cast<std::array<char, 4>>(payloadLength).data(), 4);
7573

76-
QByteArray data = QByteArray(MAGIC.data()) + lenBytes + typeBytes + payload;
77-
78-
return data;
74+
return MAGIC.data() + len + type + payload;
7975
}
8076

8177
I3Ipc::I3Ipc() {
8278
auto sock = qEnvironmentVariable("I3SOCK");
8379

8480
if (sock.isEmpty()) {
85-
qWarning() << "$I3SOCK is unset. Trying $SWAYSOCK Cannot connect to I3.";
81+
qCWarning(logI3Ipc) << "$I3SOCK is unset. Trying $SWAYSOCK.";
8682

8783
sock = qEnvironmentVariable("SWAYSOCK");
8884

8985
if (sock.isEmpty()) {
90-
qWarning() << "$SWAYSOCK and I3SOCK are unset. Cannot connect to socket.";
86+
qCWarning(logI3Ipc) << "$SWAYSOCK and I3SOCK are unset. Cannot connect to socket.";
9187
return;
9288
}
9389
}
@@ -154,7 +150,7 @@ QVector<Event> I3Ipc::parseResponse(QByteArray rawEvent) {
154150
ds >> type;
155151

156152
if (I3IpcEvent::intToEvent(type) == EventCode::UNKNOWN) {
157-
qWarning(logi3Ipc) << "Received unknown event" << rawEvent;
153+
qCWarning(logI3Ipc) << "Received unknown event" << rawEvent;
158154
return events;
159155
}
160156

@@ -165,7 +161,7 @@ QVector<Event> I3Ipc::parseResponse(QByteArray rawEvent) {
165161
auto data = QJsonDocument::fromJson(byteData, &e);
166162

167163
if (e.error != QJsonParseError::NoError) {
168-
qWarning(logi3Ipc) << "Invalid JSON value:" << e.errorString() << "\n\t" << byteData;
164+
qCWarning(logI3Ipc) << "Invalid JSON value:" << e.errorString() << "\n\t" << byteData;
169165
} else {
170166
events.push_back(std::tuple(I3IpcEvent::intToEvent(type), data));
171167
}
@@ -178,18 +174,18 @@ QVector<Event> I3Ipc::parseResponse(QByteArray rawEvent) {
178174

179175
void I3Ipc::eventSocketError(QLocalSocket::LocalSocketError error) const {
180176
if (!this->valid) {
181-
qWarning() << "Unable to connect to I3 socket:" << error;
177+
qCWarning(logI3Ipc) << "Unable to connect to I3 socket:" << error;
182178
} else {
183-
qWarning() << "I3 socket error:" << error;
179+
qCWarning(logI3Ipc) << "I3 socket error:" << error;
184180
}
185181
}
186182

187183
void I3Ipc::eventSocketStateChanged(QLocalSocket::LocalSocketState state) {
188184
if (state == QLocalSocket::ConnectedState) {
189-
qCInfo(logi3Ipc) << "I3 event socket connected.";
185+
qCInfo(logI3Ipc) << "I3 event socket connected.";
190186
emit this->connected();
191187
} else if (state == QLocalSocket::UnconnectedState && this->valid) {
192-
qCWarning(logi3Ipc) << "I3 event socket disconnected.";
188+
qCWarning(logI3Ipc) << "I3 event socket disconnected.";
193189
}
194190

195191
this->valid = state == QLocalSocket::ConnectedState;
@@ -255,7 +251,7 @@ void I3Ipc::refreshWorkspaces() {
255251
auto res = this->makeRequest(msg);
256252

257253
if (res.isEmpty()) {
258-
qWarning(logi3Ipc) << "Failed updating workspaces";
254+
qCWarning(logI3Ipc) << "Failed updating workspaces";
259255
return;
260256
}
261257

@@ -266,7 +262,7 @@ void I3Ipc::refreshWorkspaces() {
266262
const auto& mList = this->mWorkspaces.valueList();
267263
auto names = QVector<QString>();
268264

269-
qInfo(logi3Ipc) << "There are" << workspaces.toVariantList().length() << "workspaces";
265+
qCDebug(logI3Ipc) << "There are" << workspaces.toVariantList().length() << "workspaces";
270266
for (auto entry: workspaces) {
271267
auto object = entry.toObject().toVariantMap();
272268
auto name = object["name"].toString();
@@ -303,7 +299,7 @@ void I3Ipc::refreshWorkspaces() {
303299
}
304300
}
305301

306-
qInfo(logi3Ipc) << "Removing" << removedWorkspaces.length() << "deleted workspaces.";
302+
qCDebug(logI3Ipc) << "Removing" << removedWorkspaces.length() << "deleted workspaces.";
307303

308304
for (auto* workspace: removedWorkspaces) {
309305
this->mWorkspaces.removeObject(workspace);
@@ -316,7 +312,7 @@ void I3Ipc::refreshMonitors() {
316312
auto res = this->makeRequest(msg);
317313

318314
if (res.isEmpty()) {
319-
qWarning(logi3Ipc) << "Failed to update monitors";
315+
qCWarning(logI3Ipc) << "Failed to update monitors";
320316
return;
321317
}
322318

@@ -326,7 +322,7 @@ void I3Ipc::refreshMonitors() {
326322
const auto& mList = this->mMonitors.valueList();
327323
auto names = QVector<QString>();
328324

329-
qInfo(logi3Ipc) << "There are" << monitors.toVariantList().length() << "monitors";
325+
qCDebug(logI3Ipc) << "There are" << monitors.toVariantList().length() << "monitors";
330326

331327
for (auto elem: monitors) {
332328
auto object = elem.toObject().toVariantMap();
@@ -364,7 +360,7 @@ void I3Ipc::refreshMonitors() {
364360
}
365361
}
366362

367-
qInfo(logi3Ipc) << "Removing" << removedMonitors.length() << "disconnected monitors.";
363+
qCDebug(logI3Ipc) << "Removing" << removedMonitors.length() << "disconnected monitors.";
368364

369365
for (auto* monitor: removedMonitors) {
370366
this->mMonitors.removeObject(monitor);
@@ -377,14 +373,14 @@ void I3Ipc::onEvent(I3IpcEvent* event) {
377373
case EventCode::WORKSPACE: this->handleWorkspaceEvent(event); return;
378374
case EventCode::OUTPUT:
379375
/// I3 only sends an "unspecified" event, so we have to query the data changes ourselves
380-
qInfo(logi3Ipc) << "Refreshing Monitors...";
376+
qCInfo(logI3Ipc) << "Refreshing Monitors...";
381377
this->refreshMonitors();
382378
return;
383-
case EventCode::SUBSCRIBE: qInfo(logi3Ipc) << "Connected to IPC"; return;
379+
case EventCode::SUBSCRIBE: qCInfo(logI3Ipc) << "Connected to IPC"; return;
384380
case EventCode::UNKNOWN:
385-
qWarning(logi3Ipc) << "Unknown event:" << event->type() << event->data();
381+
qCWarning(logI3Ipc) << "Unknown event:" << event->type() << event->data();
386382
return;
387-
default: qWarning(logi3Ipc) << "Unhandled event:" << event->type();
383+
default: qCWarning(logI3Ipc) << "Unhandled event:" << event->type();
388384
}
389385
}
390386

@@ -394,7 +390,7 @@ void I3Ipc::handleWorkspaceEvent(I3IpcEvent* event) {
394390
auto change = event->mData["change"];
395391

396392
if (change == "init") {
397-
qCInfo(logi3IpcEvents) << "New workspace has been created";
393+
qCInfo(logI3IpcEvents) << "New workspace has been created";
398394

399395
auto workspaceData = event->mData["current"];
400396

@@ -405,13 +401,13 @@ void I3Ipc::handleWorkspaceEvent(I3IpcEvent* event) {
405401
}
406402

407403
this->mWorkspaces.insertObject(workspace);
408-
qCInfo(logi3Ipc) << "Added workspace to list";
404+
qCInfo(logI3Ipc) << "Added workspace to list";
409405

410406
} else if (change == "focus") {
411407
auto oldName = event->mData["old"]["name"].toString();
412408
auto newName = event->mData["current"]["name"].toString();
413409

414-
qCInfo(logi3IpcEvents) << "Focus changed: " << oldName << "->" << newName;
410+
qCInfo(logI3IpcEvents) << "Focus changed: " << oldName << "->" << newName;
415411

416412
auto* oldWorkspace = this->findWorkspaceByName(oldName);
417413
auto* newWorkspace = this->findWorkspaceByName(newName);
@@ -431,7 +427,7 @@ void I3Ipc::handleWorkspaceEvent(I3IpcEvent* event) {
431427
auto* oldWorkspace = this->findWorkspaceByName(name);
432428

433429
if (oldWorkspace != nullptr) {
434-
qCInfo(logi3Ipc) << "Deleting" << oldWorkspace->id() << name;
430+
qCInfo(logI3Ipc) << "Deleting" << oldWorkspace->id() << name;
435431

436432
if (this->mFocusedWorkspace == oldWorkspace) {
437433
this->setFocusedWorkspace(nullptr);
@@ -441,7 +437,7 @@ void I3Ipc::handleWorkspaceEvent(I3IpcEvent* event) {
441437

442438
delete oldWorkspace;
443439
} else {
444-
qCInfo(logi3Ipc) << "Workspace" << name << "has already been deleted";
440+
qCInfo(logI3Ipc) << "Workspace" << name << "has already been deleted";
445441
}
446442
} else if (change == "move" || change == "rename" || change == "urgent") {
447443
auto name = event->mData["current"]["name"].toString();
@@ -453,10 +449,10 @@ void I3Ipc::handleWorkspaceEvent(I3IpcEvent* event) {
453449

454450
workspace->updateFromObject(data);
455451
} else {
456-
qWarning() << "Workspace" << name << "doesn't exist";
452+
qCWarning(logI3Ipc) << "Workspace" << name << "doesn't exist";
457453
}
458454
} else if (change == "reload") {
459-
qInfo(logi3Ipc) << "Refreshing Workspaces...";
455+
qCInfo(logI3Ipc) << "Refreshing Workspaces...";
460456
this->refreshWorkspaces();
461457
}
462458
}
@@ -468,21 +464,21 @@ I3Monitor* I3Ipc::monitorFor(QuickshellScreenInfo* screen) {
468464
}
469465

470466
I3Workspace* I3Ipc::findWorkspaceByName(const QString& name) {
471-
auto mList = this->mWorkspaces.valueList();
472-
auto workspaceIter = std::find_if(mList.begin(), mList.end(), [name](const I3Workspace* m) {
467+
auto list = this->mWorkspaces.valueList();
468+
auto workspaceIter = std::find_if(list.begin(), list.end(), [name](const I3Workspace* m) {
473469
return m->name() == name;
474470
});
475471

476-
return workspaceIter == mList.end() ? nullptr : *workspaceIter;
472+
return workspaceIter == list.end() ? nullptr : *workspaceIter;
477473
}
478474

479475
I3Monitor* I3Ipc::findMonitorByName(const QString& name) {
480-
auto mList = this->mMonitors.valueList();
481-
auto monitorIter = std::find_if(mList.begin(), mList.end(), [name](const I3Monitor* m) {
476+
auto list = this->mMonitors.valueList();
477+
auto monitorIter = std::find_if(list.begin(), list.end(), [name](const I3Monitor* m) {
482478
return m->name() == name;
483479
});
484480

485-
return monitorIter == mList.end() ? nullptr : *monitorIter;
481+
return monitorIter == list.end() ? nullptr : *monitorIter;
486482
}
487483

488484
ObjectModel<I3Monitor>* I3Ipc::monitors() { return &this->mMonitors; }

src/x11/i3/ipc/qml.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class I3IpcQml: public QObject {
3030
public:
3131
explicit I3IpcQml();
3232

33-
/// Execute an I3/Sway command [man 5 sway](https://man.archlinux.org/man/sway.5.en#COMMANDS)
33+
/// Execute an [I3/Sway command](https://i3wm.org/docs/userguide.html#list_of_commands)
3434
Q_INVOKABLE static void dispatch(const QString& request);
3535

3636
/// Refresh monitor information.

0 commit comments

Comments
 (0)