diff --git a/multiscreen-compositor/compositor-messages.cpp b/multiscreen-compositor/compositor-messages.cpp index 3dee7462e37ce387deec3a19dcaaff9dd455a8b5..38ff1aa566f0f219827066a9ebf89fc541ebef26 100644 --- a/multiscreen-compositor/compositor-messages.cpp +++ b/multiscreen-compositor/compositor-messages.cpp @@ -1,6 +1,7 @@ #include "compositor-messages.h" #include <message-serverconnection.h> #include <QDebug> +#include <unistd.h> CompositorMessages::CompositorMessages(QObject *parent) : QObject{parent} @@ -12,15 +13,12 @@ void CompositorMessages::messageReceived(QString message, quint32 windowId, quin if(message == "moveWindowToScreen"){ emit moveWindowToScreen(windowId, screenId); - emit sendStatus(screenId); }else if(message == "hideWindow"){ emit hideWindow(windowId); - emit sendStatus(0); }else if(message == "showWindow"){ emit showWindow(windowId); - emit sendStatus(0); }else if(message == "logWindows"){ emit logWindows(); @@ -43,3 +41,20 @@ void CompositorMessages::screenInfoReceived(int screenId){ emit sendStatus(screenId); } + +bool CompositorMessages::isPidAlive(int pid) +{ + char path[PATH_MAX+1]; + memset(path, 0, PATH_MAX+1); + snprintf(path, PATH_MAX, "/proc/%d/cmdline", pid); + if (access(path, F_OK) == 0) + { + qDebug() << "Pid is alive: " << pid; + return true; + } + else + { + qDebug() << "Pid is dead: " << pid; + return false; + } +} diff --git a/multiscreen-compositor/compositor-messages.h b/multiscreen-compositor/compositor-messages.h index 288eb787c1ecc0f6d49a65d151a4927821931a5d..cb70d0a376dc6bcaef2494ef99df9698b720c9b7 100644 --- a/multiscreen-compositor/compositor-messages.h +++ b/multiscreen-compositor/compositor-messages.h @@ -9,6 +9,8 @@ class CompositorMessages : public QObject public: explicit CompositorMessages(QObject *parent = nullptr); + Q_INVOKABLE bool isPidAlive(int pid); + public slots: void messageReceived(QString, quint32 value0, quint32 value2); void screenInfoReceived(int screenId); diff --git a/multiscreen-compositor/main.cpp b/multiscreen-compositor/main.cpp index 555506f44dd638af3e55d852d4a73fc2fcefaea7..7916cd2a6c50eea3bc7195cf634083a74f42a5b9 100644 --- a/multiscreen-compositor/main.cpp +++ b/multiscreen-compositor/main.cpp @@ -98,6 +98,7 @@ int main(int argc, char *argv[]) QQmlApplicationEngine appEngine; appEngine.rootContext()->setContextProperty("config", config); appEngine.rootContext()->setContextProperty("commands", &commands); + appEngine.rootContext()->setContextProperty("server", &server); appEngine.load(QUrl("qrc:///qml/main.qml")); return app.exec(); diff --git a/multiscreen-compositor/message-server.cpp b/multiscreen-compositor/message-server.cpp index e75ab0c9c89b605127479324b9bda226c19c5897..1e3916f2379b27c671eae37ee78d54195541319d 100644 --- a/multiscreen-compositor/message-server.cpp +++ b/multiscreen-compositor/message-server.cpp @@ -53,6 +53,7 @@ void MessageServer::handleConnection() connect(c, &MessageServerConnection::disconnected, this, &MessageServer::connectionGone); connect(c, &MessageServerConnection::newMessage, this, &MessageServer::messageReceived); connect(this, &MessageServer::sendStatus, c, &MessageServerConnection::sendStatus); + connect(this, &MessageServer::sendMessage, c, &MessageServerConnection::sendMessage); connections.append(c); } @@ -73,3 +74,8 @@ void MessageServer::returnStatus(int status) qDebug() <<"returning Status " << status; emit sendStatus(status); } + +void MessageServer::broadcastMessage(QString msg, quint32 windowId, quint32 screenId) +{ + emit sendMessage(msg, windowId, screenId); +} diff --git a/multiscreen-compositor/message-server.h b/multiscreen-compositor/message-server.h index 46e97e0abaed25af48151dcbaf215ddc33568598..32874d930673b2a1c0fb099bbebf0fecfc11f076 100644 --- a/multiscreen-compositor/message-server.h +++ b/multiscreen-compositor/message-server.h @@ -11,6 +11,8 @@ public: explicit MessageServer(QObject *parent = nullptr); bool listen(); + Q_INVOKABLE void broadcastMessage(QString msg, quint32 windowId, quint32 screenId); + Q_INVOKABLE void returnStatus(int); public slots: void destroy(); @@ -18,12 +20,12 @@ public slots: signals: void newMessage(QString, quint32 value0, quint32 value2); void sendStatus(int); + void sendMessage(QString msg, quint32 windowId, quint32 screenId); private slots: void handleConnection(void); void connectionGone(MessageServerConnection *c); void messageReceived(QString, quint32, quint32); - void returnStatus(int); private: static const QString socketName; diff --git a/multiscreen-compositor/message-serverconnection.cpp b/multiscreen-compositor/message-serverconnection.cpp index d853fad6d77e29b8b2a5de5b27ea3ef3235042fa..e46714e9b119bc7c1bc254026d8fa3c2e4b9c58b 100644 --- a/multiscreen-compositor/message-serverconnection.cpp +++ b/multiscreen-compositor/message-serverconnection.cpp @@ -47,6 +47,22 @@ void MessageServerConnection::readData(void){ } } +int MessageServerConnection::sendMessage(QString msg, qint32 windowid, qint32 screenid){ + QByteArray data; + QDataStream out(&data, QIODevice::WriteOnly); + + if( ! socket->isValid()){ + qWarning() << "Can't send something. Socket not valid"; + return -1; + } + + out << quint32(COMPOSITOR_MESSAGE_START_SEQUENCE) << msg << windowid << screenid; + qDebug() << "Compositor Message:" << msg << windowid << screenid; + socket->write(data); + socket->flush(); + return 0; +} + void MessageServerConnection::sendStatus(int status) { QByteArray data; diff --git a/multiscreen-compositor/message-serverconnection.h b/multiscreen-compositor/message-serverconnection.h index 909303c17fa46d1c02a9d47caad84b27ba12f86e..580b7252636bc347d0912db0297051ad579346fc 100644 --- a/multiscreen-compositor/message-serverconnection.h +++ b/multiscreen-compositor/message-serverconnection.h @@ -11,6 +11,7 @@ class MessageServerConnection : public QObject public: explicit MessageServerConnection( QLocalSocket *socket, QObject *parent = nullptr); void sendStatus(int status); + int sendMessage(QString msg, qint32 windowid, qint32 screenid); signals: void disconnected(MessageServerConnection*); diff --git a/multiscreen-compositor/qml/main.qml b/multiscreen-compositor/qml/main.qml index bcef4baed9066a51025208b79c3abb2d92a6141e..b75fe94bf16fa5cf7493bc7f63fa6f206f613bfb 100644 --- a/multiscreen-compositor/qml/main.qml +++ b/multiscreen-compositor/qml/main.qml @@ -109,7 +109,6 @@ WaylandCompositor { IviApplication { onIviSurfaceCreated: handleIviSurfaceCreated(iviSurface) - //onIviSurfaceRequested: console.log("IVI surface requested: surface", surface, "iviId", iviId, "resource", resource); } // ============================================= @@ -124,12 +123,6 @@ WaylandCompositor { onSurfaceRequested: { console.log("Surface requested: client", client, "id", id, "version", version, "pid", client.processId); - /* - var surface = WaylandSurface; - surface.initialize(this, client, id, version); - console.log("created surface:", surface); - return surface; - */ } function createShellSurfaceItem(shellSurface, moveItem, output) { @@ -215,6 +208,7 @@ WaylandCompositor { // ============================================= function handleIviSurfaceCreated(iviSurface) { console.log("handleIviSurfaceCreated: surface", iviSurface, "id", iviSurface.iviId); + cleanUpApplist(); var item = {}; var screenId = 0; @@ -259,15 +253,18 @@ WaylandCompositor { { for (var k=0; k < frozenSurfaceIds.length; k++) { - if (item.iviId === frozenSurfaceIds[k].iviId) + if (!commands.isPidAlive(frozenSurfaceIds[k].pid)) { - //console.log("throwing out dead pid:", frozenSurfaceIds[k].pid, "iviId", frozenSurfaceIds[k].iviId); + console.log("throwing out dead pid:", frozenSurfaceIds[k].pid, "iviId", frozenSurfaceIds[k].iviId); frozenSurfaceIds = Array.from(frozenSurfaceIds).filter((e, idx) => idx !== k) } } frozenSurfaceIds.push({ 'iviId': item.iviId, 'pid': item.pid, 'screen': item.screen, 'master': item.master }); } + /* + commenting out this log line also reduced the crashiness quite a bit. console.log("Removed lost surface from applist and saving screen assignment! iviId:", item.iviId, "pid:", item.pid, "screen:", item.screen) + */ } } } @@ -373,33 +370,44 @@ WaylandCompositor { if( screenid > screens.count ){ console.log("Given screen ID is out of range"); + server.returnStatus(-1); return } var affectedSurfaces = getActiveSurfaces(getPidFromIviId(windowid)); - if (affectedSurfaces.length === 0) return; + //if (affectedSurfaces.length === 0) return; for (var i=0; i < affectedSurfaces.length; i++) { var surface = affectedSurfaces[i]; - if( !surface ) return; - - console.log("Move", surface, "to screen", screenid) - surface.parent = screens.objectAt(screenid).surfaceArea; - updateScreenAssignment(getPidFromIviId(windowid), screenid); + if( surface ) + { + console.log("Move", surface, "to screen", screenid) + surface.parent = screens.objectAt(screenid).surfaceArea; + updateScreenAssignment(getPidFromIviId(windowid), screenid); + } } + server.returnStatus(screenid); + server.sendMessage("Move", windowid, screenid); } function windowVisibility(windowid, show){ + var ret = 0; var affectedSurfaces = getActiveSurfaces(getPidFromIviId(windowid)); - if (affectedSurfaces.length === 0) return; + //if (affectedSurfaces.length === 0) return; for (var i=0; i < affectedSurfaces.length; i++) { var surface = affectedSurfaces[i]; - if( !surface ) return; + if( surface ) + { - console.log("Set visible to", show,"for", surface) - surface.visible = show + console.log("Set visible to", show,"for", surface) + surface.visible = show + ret++; + } } + + server.returnStatus(ret); + server.sendMessage(show ? "Show" : "Hide", windowid, null); } function onHideWindow(windowid){