diff options
author | José Bollo <jose.bollo@iot.bzh> | 2017-03-24 18:55:20 +0100 |
---|---|---|
committer | José Bollo <jose.bollo@iot.bzh> | 2017-03-24 18:55:20 +0100 |
commit | 4cb274ba6a22e925425e091c46d0b63f137e736d (patch) | |
tree | 95bc895358203f0c505a07aa53c0b0f929f61756 | |
parent | 0b4207a6183b1e5eccd697973116f1a60fc5c6c9 (diff) |
Allow to use process group or session instead of pid
This is needed to allow the new application framework
to display surfaces. The mechanism is as follows:
if the pid of the creator of a surface isn't registered,
the master of the process group it belongs to is used
instead or else the master of the session group.
Change-Id: I696e2519f919fb671e8a325615609e35a3c7ffe2
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
-rw-r--r-- | windowmanager/src/windowmanager.cpp | 68 | ||||
-rw-r--r-- | windowmanager/src/windowmanager.hpp | 5 |
2 files changed, 73 insertions, 0 deletions
diff --git a/windowmanager/src/windowmanager.cpp b/windowmanager/src/windowmanager.cpp index 1f5e4c9..2768816 100644 --- a/windowmanager/src/windowmanager.cpp +++ b/windowmanager/src/windowmanager.cpp @@ -205,6 +205,7 @@ t_ilm_layer WindowManager::getAppLayerID(pid_t pid) return layer_id; } + void WindowManager::addSurface(t_ilm_surface surfaceId) { struct ilmSurfaceProperties surfaceProperties; @@ -212,6 +213,9 @@ void WindowManager::addSurface(t_ilm_surface surfaceId) ilm_getPropertiesOfSurface(surfaceId, &surfaceProperties); pid = surfaceProperties.creatorPid; +#if !defined(NO_PROCESS_GROUP) || !defined(NO_PROCESS_SESSION) + pid = surfPid2AppPid(pid); +#endif QMap<pid_t, t_ilm_surface>::const_iterator i = m_appSurfaces.find(pid); if (i != m_appSurfaces.end() && i.value() == 0) { @@ -238,6 +242,9 @@ t_ilm_layer WindowManager::addSurfaceToAppLayer(pid_t pid, int surfaceId) if (pid < 0) return 0; +#if !defined(NO_PROCESS_GROUP) || !defined(NO_PROCESS_SESSION) + pid = surfPid2AppPid(pid); +#endif QMap<pid_t, t_ilm_layer>::const_iterator i = m_appLayers.find(pid); if (i == m_appLayers.end()) { qDebug("No layer found, create new for app(pid=%d)", pid); @@ -820,3 +827,64 @@ void WindowManager::showAppLayer(int pid) renderLayers(); #endif } + +#ifdef HAVE_IVI_LAYERMANAGEMENT_API + +#if !defined(NO_PROCESS_GROUP) || !defined(NO_PROCESS_SESSION) +bool WindowManager::otherPids(pid_t pid, pid_t &gpid, pid_t &spid) +{ + char buffer[60]; + int rc; + FILE *f; + + // get the filename + rc = snprintf(buffer, sizeof buffer, "/proc/%d/stat", (int)pid); + if (rc < 0 || rc >= (int)(sizeof buffer)) { + qDebug("internal unexpected error %d", rc); + return false; + } + // open the status file + f = fopen(buffer, "r"); + if (f == NULL) { + qDebug("failed to open %s: %m", buffer); + return false; + } + // read and parse the status file + rc = fscanf(f, "%*d %*s %*c %*d %d %d", &gpid, &spid); + fclose(f); + if (rc != 2) { + qDebug("failed to parse %s: %d", buffer, rc); + return false; + } + qDebug("retrieved for pid=%d gpid=%d spid=%d", (int)pid, (int)gpid, (int)spid); + return true; +} + +pid_t WindowManager::surfPid2AppPid(pid_t pid) +{ + pid_t gpid, spid; + QMap<pid_t, t_ilm_surface>::const_iterator i; + + i = m_appSurfaces.find(pid); + if (i == m_appSurfaces.end() && otherPids(pid, gpid, spid)) { +#if !defined(NO_PROCESS_GROUP) + i = m_appSurfaces.find(gpid); + if (i != m_appSurfaces.end()) { + qDebug("translate pid %d to Gpid %d", pid, gpid); + return gpid; + } +#endif +#if !defined(NO_PROCESS_SESSION) + i = m_appSurfaces.find(spid); + if (i != m_appSurfaces.end()) { + qDebug("translate pid %d to Spid %d", pid, spid); + return spid; + } +#endif + } + return pid; +} + +#endif + +#endif diff --git a/windowmanager/src/windowmanager.hpp b/windowmanager/src/windowmanager.hpp index 8b70349..7a9b297 100644 --- a/windowmanager/src/windowmanager.hpp +++ b/windowmanager/src/windowmanager.hpp @@ -67,6 +67,11 @@ private: void configureHomeScreenMainSurface(const t_ilm_surface surface, const t_ilm_int width, const t_ilm_int height); void configureAppSurface(const pid_t pid, const t_ilm_surface surface, const t_ilm_int width, const t_ilm_int height); void renderLayers(); + +#if !defined(NO_PROCESS_GROUP) || !defined(NO_PROCESS_SESSION) + bool otherPids(pid_t pid, pid_t &gpid, pid_t &spid); + pid_t surfPid2AppPid(pid_t pid); +#endif #endif void updateScreen(); |