1
1
#include < algorithm>
2
- #include < cstring>
3
2
#include < tuple>
4
3
4
+ #include < bit>
5
5
#include < qbytearray.h>
6
6
#include < qbytearrayview.h>
7
7
#include < qcontainerfwd.h>
25
25
#include " monitor.hpp"
26
26
#include " workspace.hpp"
27
27
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);
30
30
31
31
namespace qs ::i3::ipc {
32
32
@@ -38,7 +38,7 @@ QVector<Event> I3Ipc::makeRequest(const QByteArray& request) {
38
38
auto dataRaw = this ->commandSocket .readAll ();
39
39
return I3Ipc::parseResponse (dataRaw);
40
40
} else {
41
- qWarning (logi3Ipc ) << " Timeout while waiting for read for" << request;
41
+ qCWarning (logI3Ipc ) << " Timeout while waiting for read for" << request;
42
42
return {};
43
43
}
44
44
}
@@ -49,7 +49,7 @@ void I3Ipc::dispatch(const QString& payload) {
49
49
QVector<Event> res = this ->makeRequest (message);
50
50
51
51
if (res.isEmpty ()) {
52
- qWarning ( ) << " IPC did not reply, error while executing" << payload;
52
+ qCWarning (logI3Ipc ) << " IPC did not reply, error while executing" << payload;
53
53
}
54
54
55
55
auto [_, data] = res.first ();
@@ -59,35 +59,31 @@ void I3Ipc::dispatch(const QString& payload) {
59
59
const bool success = jsonMessage[" success" ].toBool ();
60
60
61
61
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" ];
64
64
}
65
65
}
66
66
}
67
67
68
68
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 ());
72
70
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 );
75
73
76
- QByteArray data = QByteArray (MAGIC.data ()) + lenBytes + typeBytes + payload;
77
-
78
- return data;
74
+ return MAGIC.data () + len + type + payload;
79
75
}
80
76
81
77
I3Ipc::I3Ipc () {
82
78
auto sock = qEnvironmentVariable (" I3SOCK" );
83
79
84
80
if (sock.isEmpty ()) {
85
- qWarning ( ) << " $I3SOCK is unset. Trying $SWAYSOCK Cannot connect to I3 ." ;
81
+ qCWarning (logI3Ipc ) << " $I3SOCK is unset. Trying $SWAYSOCK." ;
86
82
87
83
sock = qEnvironmentVariable (" SWAYSOCK" );
88
84
89
85
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." ;
91
87
return ;
92
88
}
93
89
}
@@ -154,7 +150,7 @@ QVector<Event> I3Ipc::parseResponse(QByteArray rawEvent) {
154
150
ds >> type;
155
151
156
152
if (I3IpcEvent::intToEvent (type) == EventCode::UNKNOWN) {
157
- qWarning (logi3Ipc ) << " Received unknown event" << rawEvent;
153
+ qCWarning (logI3Ipc ) << " Received unknown event" << rawEvent;
158
154
return events;
159
155
}
160
156
@@ -165,7 +161,7 @@ QVector<Event> I3Ipc::parseResponse(QByteArray rawEvent) {
165
161
auto data = QJsonDocument::fromJson (byteData, &e);
166
162
167
163
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;
169
165
} else {
170
166
events.push_back (std::tuple (I3IpcEvent::intToEvent (type), data));
171
167
}
@@ -178,18 +174,18 @@ QVector<Event> I3Ipc::parseResponse(QByteArray rawEvent) {
178
174
179
175
void I3Ipc::eventSocketError (QLocalSocket::LocalSocketError error) const {
180
176
if (!this ->valid ) {
181
- qWarning ( ) << " Unable to connect to I3 socket:" << error;
177
+ qCWarning (logI3Ipc ) << " Unable to connect to I3 socket:" << error;
182
178
} else {
183
- qWarning ( ) << " I3 socket error:" << error;
179
+ qCWarning (logI3Ipc ) << " I3 socket error:" << error;
184
180
}
185
181
}
186
182
187
183
void I3Ipc::eventSocketStateChanged (QLocalSocket::LocalSocketState state) {
188
184
if (state == QLocalSocket::ConnectedState) {
189
- qCInfo (logi3Ipc ) << " I3 event socket connected." ;
185
+ qCInfo (logI3Ipc ) << " I3 event socket connected." ;
190
186
emit this ->connected ();
191
187
} else if (state == QLocalSocket::UnconnectedState && this ->valid ) {
192
- qCWarning (logi3Ipc ) << " I3 event socket disconnected." ;
188
+ qCWarning (logI3Ipc ) << " I3 event socket disconnected." ;
193
189
}
194
190
195
191
this ->valid = state == QLocalSocket::ConnectedState;
@@ -255,7 +251,7 @@ void I3Ipc::refreshWorkspaces() {
255
251
auto res = this ->makeRequest (msg);
256
252
257
253
if (res.isEmpty ()) {
258
- qWarning (logi3Ipc ) << " Failed updating workspaces" ;
254
+ qCWarning (logI3Ipc ) << " Failed updating workspaces" ;
259
255
return ;
260
256
}
261
257
@@ -266,7 +262,7 @@ void I3Ipc::refreshWorkspaces() {
266
262
const auto & mList = this ->mWorkspaces .valueList ();
267
263
auto names = QVector<QString>();
268
264
269
- qInfo (logi3Ipc ) << " There are" << workspaces.toVariantList ().length () << " workspaces" ;
265
+ qCDebug (logI3Ipc ) << " There are" << workspaces.toVariantList ().length () << " workspaces" ;
270
266
for (auto entry: workspaces) {
271
267
auto object = entry.toObject ().toVariantMap ();
272
268
auto name = object[" name" ].toString ();
@@ -303,7 +299,7 @@ void I3Ipc::refreshWorkspaces() {
303
299
}
304
300
}
305
301
306
- qInfo (logi3Ipc ) << " Removing" << removedWorkspaces.length () << " deleted workspaces." ;
302
+ qCDebug (logI3Ipc ) << " Removing" << removedWorkspaces.length () << " deleted workspaces." ;
307
303
308
304
for (auto * workspace: removedWorkspaces) {
309
305
this ->mWorkspaces .removeObject (workspace);
@@ -316,7 +312,7 @@ void I3Ipc::refreshMonitors() {
316
312
auto res = this ->makeRequest (msg);
317
313
318
314
if (res.isEmpty ()) {
319
- qWarning (logi3Ipc ) << " Failed to update monitors" ;
315
+ qCWarning (logI3Ipc ) << " Failed to update monitors" ;
320
316
return ;
321
317
}
322
318
@@ -326,7 +322,7 @@ void I3Ipc::refreshMonitors() {
326
322
const auto & mList = this ->mMonitors .valueList ();
327
323
auto names = QVector<QString>();
328
324
329
- qInfo (logi3Ipc ) << " There are" << monitors.toVariantList ().length () << " monitors" ;
325
+ qCDebug (logI3Ipc ) << " There are" << monitors.toVariantList ().length () << " monitors" ;
330
326
331
327
for (auto elem: monitors) {
332
328
auto object = elem.toObject ().toVariantMap ();
@@ -364,7 +360,7 @@ void I3Ipc::refreshMonitors() {
364
360
}
365
361
}
366
362
367
- qInfo (logi3Ipc ) << " Removing" << removedMonitors.length () << " disconnected monitors." ;
363
+ qCDebug (logI3Ipc ) << " Removing" << removedMonitors.length () << " disconnected monitors." ;
368
364
369
365
for (auto * monitor: removedMonitors) {
370
366
this ->mMonitors .removeObject (monitor);
@@ -377,14 +373,14 @@ void I3Ipc::onEvent(I3IpcEvent* event) {
377
373
case EventCode::WORKSPACE: this ->handleWorkspaceEvent (event); return ;
378
374
case EventCode::OUTPUT:
379
375
// / 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..." ;
381
377
this ->refreshMonitors ();
382
378
return ;
383
- case EventCode::SUBSCRIBE: qInfo (logi3Ipc ) << " Connected to IPC" ; return ;
379
+ case EventCode::SUBSCRIBE: qCInfo (logI3Ipc ) << " Connected to IPC" ; return ;
384
380
case EventCode::UNKNOWN:
385
- qWarning (logi3Ipc ) << " Unknown event:" << event->type () << event->data ();
381
+ qCWarning (logI3Ipc ) << " Unknown event:" << event->type () << event->data ();
386
382
return ;
387
- default : qWarning (logi3Ipc ) << " Unhandled event:" << event->type ();
383
+ default : qCWarning (logI3Ipc ) << " Unhandled event:" << event->type ();
388
384
}
389
385
}
390
386
@@ -394,7 +390,7 @@ void I3Ipc::handleWorkspaceEvent(I3IpcEvent* event) {
394
390
auto change = event->mData [" change" ];
395
391
396
392
if (change == " init" ) {
397
- qCInfo (logi3IpcEvents ) << " New workspace has been created" ;
393
+ qCInfo (logI3IpcEvents ) << " New workspace has been created" ;
398
394
399
395
auto workspaceData = event->mData [" current" ];
400
396
@@ -405,13 +401,13 @@ void I3Ipc::handleWorkspaceEvent(I3IpcEvent* event) {
405
401
}
406
402
407
403
this ->mWorkspaces .insertObject (workspace);
408
- qCInfo (logi3Ipc ) << " Added workspace to list" ;
404
+ qCInfo (logI3Ipc ) << " Added workspace to list" ;
409
405
410
406
} else if (change == " focus" ) {
411
407
auto oldName = event->mData [" old" ][" name" ].toString ();
412
408
auto newName = event->mData [" current" ][" name" ].toString ();
413
409
414
- qCInfo (logi3IpcEvents ) << " Focus changed: " << oldName << " ->" << newName;
410
+ qCInfo (logI3IpcEvents ) << " Focus changed: " << oldName << " ->" << newName;
415
411
416
412
auto * oldWorkspace = this ->findWorkspaceByName (oldName);
417
413
auto * newWorkspace = this ->findWorkspaceByName (newName);
@@ -431,7 +427,7 @@ void I3Ipc::handleWorkspaceEvent(I3IpcEvent* event) {
431
427
auto * oldWorkspace = this ->findWorkspaceByName (name);
432
428
433
429
if (oldWorkspace != nullptr ) {
434
- qCInfo (logi3Ipc ) << " Deleting" << oldWorkspace->id () << name;
430
+ qCInfo (logI3Ipc ) << " Deleting" << oldWorkspace->id () << name;
435
431
436
432
if (this ->mFocusedWorkspace == oldWorkspace) {
437
433
this ->setFocusedWorkspace (nullptr );
@@ -441,7 +437,7 @@ void I3Ipc::handleWorkspaceEvent(I3IpcEvent* event) {
441
437
442
438
delete oldWorkspace;
443
439
} else {
444
- qCInfo (logi3Ipc ) << " Workspace" << name << " has already been deleted" ;
440
+ qCInfo (logI3Ipc ) << " Workspace" << name << " has already been deleted" ;
445
441
}
446
442
} else if (change == " move" || change == " rename" || change == " urgent" ) {
447
443
auto name = event->mData [" current" ][" name" ].toString ();
@@ -453,10 +449,10 @@ void I3Ipc::handleWorkspaceEvent(I3IpcEvent* event) {
453
449
454
450
workspace->updateFromObject (data);
455
451
} else {
456
- qWarning ( ) << " Workspace" << name << " doesn't exist" ;
452
+ qCWarning (logI3Ipc ) << " Workspace" << name << " doesn't exist" ;
457
453
}
458
454
} else if (change == " reload" ) {
459
- qInfo (logi3Ipc ) << " Refreshing Workspaces..." ;
455
+ qCInfo (logI3Ipc ) << " Refreshing Workspaces..." ;
460
456
this ->refreshWorkspaces ();
461
457
}
462
458
}
@@ -468,21 +464,21 @@ I3Monitor* I3Ipc::monitorFor(QuickshellScreenInfo* screen) {
468
464
}
469
465
470
466
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) {
473
469
return m->name () == name;
474
470
});
475
471
476
- return workspaceIter == mList .end () ? nullptr : *workspaceIter;
472
+ return workspaceIter == list .end () ? nullptr : *workspaceIter;
477
473
}
478
474
479
475
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) {
482
478
return m->name () == name;
483
479
});
484
480
485
- return monitorIter == mList .end () ? nullptr : *monitorIter;
481
+ return monitorIter == list .end () ? nullptr : *monitorIter;
486
482
}
487
483
488
484
ObjectModel<I3Monitor>* I3Ipc::monitors () { return &this ->mMonitors ; }
0 commit comments