From 9ca0a50d021a8d6e12cfb8f04671ba3dd389f92d Mon Sep 17 00:00:00 2001 From: "Bocklage, Jens" Date: Wed, 2 Nov 2016 16:23:58 +0100 Subject: [PATCH] New layer management in WindowManager. Three layers are created. One for the HomeScreen, one for apps, one for popups. Signed-off-by: Bocklage, Jens --- HomeScreen/src/layouthandler.cpp | 112 +++------ HomeScreen/src/layouthandler.h | 8 +- HomeScreen/src/main.cpp | 2 +- WindowManager/src/main.cpp | 8 +- WindowManager/src/windowmanager.cpp | 459 +++++++++++++++++++---------------- WindowManager/src/windowmanager.hpp | 53 ++-- interfaces/homescreen.xml | 2 +- interfaces/include/windowmanager.hpp | 36 ++- interfaces/src/windowmanager.cpp | 63 ++++- interfaces/windowmanager.xml | 186 ++++++++++---- test/commandlinetests.txt | 8 + 11 files changed, 552 insertions(+), 385 deletions(-) diff --git a/HomeScreen/src/layouthandler.cpp b/HomeScreen/src/layouthandler.cpp index 81bc106..3bfe533 100644 --- a/HomeScreen/src/layouthandler.cpp +++ b/HomeScreen/src/layouthandler.cpp @@ -4,14 +4,16 @@ LayoutHandler::LayoutHandler(QObject *parent) : QObject(parent), mp_dBusWindowManagerProxy(0), mp_dBusPopupProxy(0), - m_visibleApps(), - m_invisibleApps(), - m_requestsToBeVisibleApps() + m_visibleSurfaces(), + m_invisibleSurfaces(), + m_requestsToBeVisibleSurfaces() { qDBusRegisterMetaType(); qDBusRegisterMetaType >(); - qDBusRegisterMetaType(); - qDBusRegisterMetaType >(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType >(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType >(); qDebug("D-Bus: connect to org.agl.windowmanager /windowmanager"); mp_dBusWindowManagerProxy = new org::agl::windowmanager("org.agl.windowmanager", @@ -34,10 +36,8 @@ LayoutHandler::~LayoutHandler() void LayoutHandler::setUpLayouts() { qDebug("setUpLayouts"); - QList surfaceAreas; - SimpleRect surfaceArea; - bool isFullScreen; - int associatedFullScreenLayout; + QList surfaceAreas; + LayoutArea surfaceArea; const int SCREEN_WIDTH = 1080; const int SCREEN_HEIGHT = 1920; @@ -61,10 +61,7 @@ void LayoutHandler::setUpLayouts() surfaceAreas.append(surfaceArea); - isFullScreen = false; - associatedFullScreenLayout = 4; - - mp_dBusWindowManagerProxy->addLayout(1, "one app", isFullScreen, associatedFullScreenLayout, surfaceAreas); + mp_dBusWindowManagerProxy->addLayout(1, "one app", surfaceAreas); surfaceAreas.clear(); @@ -88,10 +85,7 @@ void LayoutHandler::setUpLayouts() surfaceAreas.append(surfaceArea); - isFullScreen = false; - associatedFullScreenLayout = -1; - - mp_dBusWindowManagerProxy->addLayout(2, "top on bottom", isFullScreen, associatedFullScreenLayout, surfaceAreas); + mp_dBusWindowManagerProxy->addLayout(2, "top on bottom", surfaceAreas); surfaceAreas.clear(); @@ -115,72 +109,48 @@ void LayoutHandler::setUpLayouts() surfaceAreas.append(surfaceArea); - isFullScreen = false; - associatedFullScreenLayout = -1; - - mp_dBusWindowManagerProxy->addLayout(3, "side by side", isFullScreen, associatedFullScreenLayout, surfaceAreas); - - - surfaceAreas.clear(); - - // layout 4: - // one app surface full screen, no statusbar, no control bar - surfaceArea.x = 0; - surfaceArea.y = 0; - surfaceArea.width = SCREEN_WIDTH; - surfaceArea.height = SCREEN_HEIGHT; - - surfaceAreas.append(surfaceArea); - - isFullScreen = true; - associatedFullScreenLayout = 1; - - mp_dBusWindowManagerProxy->addLayout(4, "one app full screen", isFullScreen, associatedFullScreenLayout, surfaceAreas); - - - surfaceAreas.clear(); - + mp_dBusWindowManagerProxy->addLayout(3, "side by side", surfaceAreas); } -void LayoutHandler::makeMeVisible(int pid) +void LayoutHandler::makeMeVisible(int surfaceId) { - qDebug("makeMeVisible %d", pid); - m_requestsToBeVisibleApps.append(pid); + qDebug("makeMeVisible %d", surfaceId); + m_requestsToBeVisibleSurfaces.append(surfaceId); - qDebug("m_visibleApps %d", m_visibleApps.size()); - qDebug("m_invisibleApps %d", m_invisibleApps.size()); - qDebug("m_requestsToBeVisibleApps %d", m_requestsToBeVisibleApps.size()); + qDebug("m_visibleSurfaces %d", m_visibleSurfaces.size()); + qDebug("m_invisibleSurfaces %d", m_invisibleSurfaces.size()); + qDebug("m_requestsToBeVisibleSurfaces %d", m_requestsToBeVisibleSurfaces.size()); - QList availableLayouts = mp_dBusWindowManagerProxy->getAvailableLayouts(m_visibleApps.size() + m_requestsToBeVisibleApps.size()); + QList availableLayouts = mp_dBusWindowManagerProxy->getAvailableLayouts(m_visibleSurfaces.size() + m_requestsToBeVisibleSurfaces.size()); if (0 == availableLayouts.size()) { // no layout fits the need! // replace the last app qDebug("no layout fits the need!"); - qDebug("replace the last app"); + qDebug("replace the last surface"); - m_invisibleApps.append(m_visibleApps.last()); - m_visibleApps.removeLast(); + m_invisibleSurfaces.append(m_visibleSurfaces.last()); + m_visibleSurfaces.removeLast(); - m_visibleApps.append(m_requestsToBeVisibleApps); - m_requestsToBeVisibleApps.clear(); + m_visibleSurfaces.append(m_requestsToBeVisibleSurfaces); + m_requestsToBeVisibleSurfaces.clear(); - for (int i = 0; i < m_visibleApps.size(); ++i) + for (int i = 0; i < m_visibleSurfaces.size(); ++i) { - mp_dBusWindowManagerProxy->setPidToLayoutArea(m_visibleApps.at(i), i); + mp_dBusWindowManagerProxy->setSurfaceToLayoutArea(m_visibleSurfaces.at(i), i); } } if (1 == availableLayouts.size()) { // switch to new layout qDebug("switch to new layout %d", availableLayouts.at(0)); - m_visibleApps.append(m_requestsToBeVisibleApps); - m_requestsToBeVisibleApps.clear(); + m_visibleSurfaces.append(m_requestsToBeVisibleSurfaces); + m_requestsToBeVisibleSurfaces.clear(); mp_dBusWindowManagerProxy->setLayoutById(availableLayouts.at(0)); - for (int i = 0; i < m_visibleApps.size(); ++i) + for (int i = 0; i < m_visibleSurfaces.size(); ++i) { - mp_dBusWindowManagerProxy->setPidToLayoutArea(m_visibleApps.at(i), i); + mp_dBusWindowManagerProxy->setSurfaceToLayoutArea(m_visibleSurfaces.at(i), i); } } if (1 < availableLayouts.size()) @@ -202,32 +172,18 @@ void LayoutHandler::makeMeVisible(int pid) void LayoutHandler::toggleFullscreen() { qDebug("toggleFullscreen"); - int currentLayout = mp_dBusWindowManagerProxy->getLayout(); - int associatedFullScreenLayout = mp_dBusWindowManagerProxy->getAssociatedFullScreenLayout(currentLayout); - if (-1 != associatedFullScreenLayout) - { - mp_dBusWindowManagerProxy->setLayoutById(associatedFullScreenLayout); - for (int i = 0; i < m_visibleApps.size(); ++i) - { - mp_dBusWindowManagerProxy->setPidToLayoutArea(m_visibleApps.at(i), i); - } - } - else - { - qDebug("no associatedFullScreenLayout. Cannot switch to full screen."); - } } void LayoutHandler::setLayoutByName(QString layoutName) { // switch to new layout qDebug("setLayout: switch to new layout %s", layoutName.toStdString().c_str()); - m_visibleApps.append(m_requestsToBeVisibleApps); - m_requestsToBeVisibleApps.clear(); + m_visibleSurfaces.append(m_requestsToBeVisibleSurfaces); + m_requestsToBeVisibleSurfaces.clear(); mp_dBusWindowManagerProxy->setLayoutByName(layoutName); - for (int i = 0; i < m_visibleApps.size(); ++i) + for (int i = 0; i < m_visibleSurfaces.size(); ++i) { - mp_dBusWindowManagerProxy->setPidToLayoutArea(i, i); + mp_dBusWindowManagerProxy->setSurfaceToLayoutArea(i, i); } } diff --git a/HomeScreen/src/layouthandler.h b/HomeScreen/src/layouthandler.h index c9ca1bf..5763d44 100644 --- a/HomeScreen/src/layouthandler.h +++ b/HomeScreen/src/layouthandler.h @@ -17,7 +17,7 @@ public: signals: public slots: - void makeMeVisible(int pid); + void makeMeVisible(int surfaceId); void toggleFullscreen(); void setLayoutByName(QString layoutName); @@ -25,9 +25,9 @@ private: org::agl::windowmanager *mp_dBusWindowManagerProxy; org::agl::popup *mp_dBusPopupProxy; - QList m_visibleApps; - QList m_invisibleApps; - QList m_requestsToBeVisibleApps; + QList m_visibleSurfaces; + QList m_invisibleSurfaces; + QList m_requestsToBeVisibleSurfaces; }; diff --git a/HomeScreen/src/main.cpp b/HomeScreen/src/main.cpp index 80a063d..a623fff 100644 --- a/HomeScreen/src/main.cpp +++ b/HomeScreen/src/main.cpp @@ -36,7 +36,7 @@ int main(int argc, char *argv[]) QCoreApplication::setOrganizationDomain("LinuxFoundation"); QCoreApplication::setOrganizationName("AutomotiveGradeLinux"); QCoreApplication::setApplicationName("HomeScreen"); - QCoreApplication::setApplicationVersion("0.3.3"); + QCoreApplication::setApplicationVersion("0.3.4"); qDebug("%s, v%s", QCoreApplication::applicationName().toStdString().c_str(), QCoreApplication::applicationVersion().toStdString().c_str()); diff --git a/WindowManager/src/main.cpp b/WindowManager/src/main.cpp index 9c6e791..455361c 100644 --- a/WindowManager/src/main.cpp +++ b/WindowManager/src/main.cpp @@ -25,14 +25,16 @@ int main(int argc, char *argv[]) QCoreApplication::setOrganizationDomain("LinuxFoundation"); QCoreApplication::setOrganizationName("AutomotiveGradeLinux"); QCoreApplication::setApplicationName("WindowManager"); - QCoreApplication::setApplicationVersion("0.3.0"); + QCoreApplication::setApplicationVersion("0.3.1"); qDebug("%s, v%s", QCoreApplication::applicationName().toStdString().c_str(), QCoreApplication::applicationVersion().toStdString().c_str()); qDBusRegisterMetaType(); qDBusRegisterMetaType >(); - qDBusRegisterMetaType(); - qDBusRegisterMetaType >(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType >(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType >(); WindowManager *windowManager = new WindowManager(); windowManager->start(); diff --git a/WindowManager/src/windowmanager.cpp b/WindowManager/src/windowmanager.cpp index ce59fa0..e4d5610 100644 --- a/WindowManager/src/windowmanager.cpp +++ b/WindowManager/src/windowmanager.cpp @@ -23,24 +23,27 @@ // DO NOT JUDGE THE SOURCE CODE :) ////////////////////////////////////////// +// three layers will be defined. The HomeScreen will be placed +// full screen in the background. +// On top all applications in one layer. +// On top of that, the popup layer. +#define WINDOWMANAGER_LAYER_POPUP 100 +#define WINDOWMANAGER_LAYER_APPLICATIONS 101 +#define WINDOWMANAGER_LAYER_HOMESCREEN 102 + +#define WINDOWMANAGER_LAYER_NUM 3 + void* WindowManager::myThis = 0; WindowManager::WindowManager(QObject *parent) : QObject(parent), m_layouts(), - m_layoutNames(), - m_layoutFullScreen(), - m_layoutFullScreenAssociated(), + m_surfaces(), + mp_layoutAreaToSurfaceIdAssignment(0), m_currentLayout(-1), - m_homeScreenPid(-1), -#ifdef __arm__ - mp_surfaces(0), - mp_processLayers(0), -#endif - mp_layoutAreaToPidAssignment(0) + m_homeScreenPid(-1) { qDebug("-=[WindowManager]=-"); - qDebug("WindowManager"); // publish windowmanager interface mp_windowManagerAdaptor = new WindowmanagerAdaptor((QObject*)this); @@ -52,11 +55,8 @@ WindowManager::WindowManager(QObject *parent) : void WindowManager::start() { qDebug("-=[start]=-"); - mp_layoutAreaToPidAssignment = new QMap; + mp_layoutAreaToSurfaceIdAssignment = new QMap; #ifdef __arm__ - mp_processLayers = new QList; - mp_surfaces = new QMap; - ilmErrorTypes err; err = ilm_init(); @@ -64,6 +64,10 @@ void WindowManager::start() myThis = this; err = ilm_registerNotification(WindowManager::notificationFunc_static, this); + + createNewLayer(WINDOWMANAGER_LAYER_POPUP); + createNewLayer(WINDOWMANAGER_LAYER_APPLICATIONS); + createNewLayer(WINDOWMANAGER_LAYER_HOMESCREEN); #endif } @@ -72,12 +76,9 @@ WindowManager::~WindowManager() qDebug("-=[~WindowManager]=-"); delete mp_windowManagerAdaptor; #ifdef __arm__ - delete mp_surfaces; - delete mp_processLayers; - ilm_destroy(); #endif - delete mp_layoutAreaToPidAssignment; + delete mp_layoutAreaToSurfaceIdAssignment; } void WindowManager::dumpScene() @@ -85,20 +86,19 @@ void WindowManager::dumpScene() qDebug("\n"); qDebug("current layout : %d", m_currentLayout); qDebug("available layouts: %d", m_layouts.size()); - QMap >::iterator i = m_layouts.begin(); + QList::const_iterator i = m_layouts.begin(); - QList result; while (i != m_layouts.constEnd()) { - qDebug("--[id: %d]--[%s]--", i.key(), m_layoutNames.find(i.key()).value().toStdString().c_str()); - qDebug(" %d surface areas", i.value().size()); - for (int j = 0; j < i.value().size(); ++j) + qDebug("--[id: %d]--[%s]--", i->id, i->name.toStdString().c_str()); + qDebug(" %d surface areas", i->layoutAreas.size()); + for (int j = 0; j < i->layoutAreas.size(); ++j) { qDebug(" -area %d", j); - qDebug(" -x : %d", i.value().at(j).x); - qDebug(" -y : %d", i.value().at(j).y); - qDebug(" -width : %d", i.value().at(j).width); - qDebug(" -height: %d", i.value().at(j).height); + qDebug(" -x : %d", i->layoutAreas.at(j).x); + qDebug(" -y : %d", i->layoutAreas.at(j).y); + qDebug(" -width : %d", i->layoutAreas.at(j).width); + qDebug(" -height: %d", i->layoutAreas.at(j).height); } ++i; @@ -111,21 +111,27 @@ void WindowManager::createNewLayer(int layerId) { qDebug("-=[createNewLayer]=-"); qDebug("layerId %d", layerId); - ilmErrorTypes err; t_ilm_uint screenID = 0; t_ilm_uint width; t_ilm_uint height; - err = ilm_getScreenResolution(screenID, &width, &height); + ilm_getScreenResolution(screenID, &width, &height); t_ilm_layer newLayerId = layerId; - err = ilm_layerCreateWithDimension(&newLayerId, width, height); - - t_ilm_float opacity = 0.0; - err = ilm_layerSetOpacity(newLayerId, opacity); - - ilm_layerSetVisibility(newLayerId, ILM_FALSE); + ilm_layerCreateWithDimension(&newLayerId, width, height); + ilm_layerSetOpacity(newLayerId, 1.0); + ilm_layerSetVisibility(newLayerId, ILM_TRUE); + ilm_layerSetSourceRectangle(newLayerId, + 0, + 0, + width, + height); + ilm_layerSetDestinationRectangle(newLayerId, + 0, + 0, + width, + height); ilm_commitChanges(); } @@ -135,130 +141,122 @@ void WindowManager::addSurfaceToLayer(int surfaceId, int layerId) qDebug("-=[addSurfaceToLayer]=-"); qDebug("surfaceId %d", surfaceId); qDebug("layerId %d", layerId); - t_ilm_int length; - t_ilm_layer* pArray; - ilm_getLayerIDs(&length, &pArray); - bool layerFound(false); - for (int i = 0; i < length; ++i) + if (layerId == WINDOWMANAGER_LAYER_HOMESCREEN) { - if (layerId == pArray[i]) - { - layerFound = true; - } + struct ilmSurfaceProperties surfaceProperties; + ilm_getPropertiesOfSurface(surfaceId, &surfaceProperties); + + // homescreen app always fullscreen in the back + t_ilm_uint screenID = 0; + t_ilm_uint width; + t_ilm_uint height; + + ilm_getScreenResolution(screenID, &width, &height); + + ilm_surfaceSetDestinationRectangle(surfaceId, 0, 0, width, height); + ilm_surfaceSetSourceRectangle(surfaceId, 0, 0, surfaceProperties.origSourceWidth, surfaceProperties.origSourceHeight); + ilm_surfaceSetOpacity(surfaceId, 1.0); + ilm_surfaceSetVisibility(surfaceId, ILM_TRUE); + + ilm_layerAddSurface(layerId, surfaceId); } - if (!layerFound) + if (layerId == WINDOWMANAGER_LAYER_APPLICATIONS) { - createNewLayer(layerId); + struct ilmSurfaceProperties surfaceProperties; + ilm_getPropertiesOfSurface(surfaceId, &surfaceProperties); + + ilm_surfaceSetDestinationRectangle(surfaceId, 0, 0, surfaceProperties.origSourceWidth, surfaceProperties.origSourceHeight); + ilm_surfaceSetSourceRectangle(surfaceId, 0, 0, surfaceProperties.origSourceWidth, surfaceProperties.origSourceHeight); + ilm_surfaceSetOpacity(surfaceId, 0.0); + ilm_surfaceSetVisibility(surfaceId, ILM_FALSE); + + ilm_layerAddSurface(layerId, surfaceId); } - struct ilmSurfaceProperties surfaceProperties; - ilm_getPropertiesOfSurface(surfaceId, &surfaceProperties); - //qDebug(" origSourceWidth : %d", surfaceProperties.origSourceWidth); - //qDebug(" origSourceHeight: %d", surfaceProperties.origSourceHeight); - - ilm_layerSetSourceRectangle(layerId, - 0, - 0, - surfaceProperties.origSourceWidth, - surfaceProperties.origSourceHeight); - ilm_commitChanges(); + if (layerId == WINDOWMANAGER_LAYER_POPUP) + { + struct ilmSurfaceProperties surfaceProperties; + ilm_getPropertiesOfSurface(surfaceId, &surfaceProperties); - ilm_surfaceSetDestinationRectangle(surfaceId, 0, 0, surfaceProperties.origSourceWidth, surfaceProperties.origSourceHeight); - ilm_surfaceSetSourceRectangle(surfaceId, 0, 0, surfaceProperties.origSourceWidth, surfaceProperties.origSourceHeight); - ilm_surfaceSetOpacity(surfaceId, 1.0); - ilm_surfaceSetVisibility(surfaceId, true); + ilm_surfaceSetDestinationRectangle(surfaceId, 0, 0, surfaceProperties.origSourceWidth, surfaceProperties.origSourceHeight); + ilm_surfaceSetSourceRectangle(surfaceId, 0, 0, surfaceProperties.origSourceWidth, surfaceProperties.origSourceHeight); + ilm_surfaceSetOpacity(surfaceId, 0.0); + ilm_surfaceSetVisibility(surfaceId, ILM_FALSE); - ilm_layerAddSurface(layerId, surfaceId); + ilm_layerAddSurface(layerId, surfaceId); + } ilm_commitChanges(); } +#endif + void WindowManager::updateScreen() { qDebug("-=[updateScreen]=-"); - int numberOfLayersToShow = 0; - - QMap >::iterator i = m_layouts.find(m_currentLayout); - if (m_layouts.end() != i) - { - numberOfLayersToShow += i.value().size(); - qDebug("the current layout provides %d render areas", i.value().size()); - } - else - { - qDebug("the current layout provides no render areas!"); - } - - t_ilm_layer renderOrder[numberOfLayersToShow]; - int renderOrderCounter = 0; - - qDebug("show home screen app"); - if (-1 != m_homeScreenPid) + if (-1 != m_currentLayout) { - renderOrder[renderOrderCounter] = m_homeScreenPid; - ++renderOrderCounter; +#ifdef __arm__ - ilm_layerSetVisibility(m_homeScreenPid, ILM_TRUE); - t_ilm_float opacity = 1.0; - ilm_layerSetOpacity(m_homeScreenPid, opacity); + t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM]; + renderOrder[0] = WINDOWMANAGER_LAYER_HOMESCREEN; + renderOrder[1] = WINDOWMANAGER_LAYER_APPLICATIONS; + renderOrder[2] = WINDOWMANAGER_LAYER_POPUP; - // homescreen app always fullscreen in the back - t_ilm_uint screenID = 0; - t_ilm_uint width; - t_ilm_uint height; + // hide all surfaces + for (int i = 0; i < m_surfaces.size(); ++i) + { + ilm_surfaceSetVisibility(m_surfaces.at(i), ILM_FALSE); + ilm_surfaceSetOpacity(m_surfaces.at(i), 0.0); + } - ilm_getScreenResolution(screenID, &width, &height); + // find the current used layout + QList::const_iterator ci = m_layouts.begin(); - ilm_layerSetDestinationRectangle(m_homeScreenPid, - 0, - 0, - width, - height); - } + Layout currentLayout; + while (ci != m_layouts.constEnd()) + { + if (ci->id == m_currentLayout) + { + currentLayout = *ci; + } + ++ci; + } - qDebug("show %d apps", numberOfLayersToShow); - for (int j = 0; j < numberOfLayersToShow; ++j) - { - int layerToShow = mp_layoutAreaToPidAssignment->find(j).value(); - if (layerToShow != m_homeScreenPid) + qDebug("show %d apps", mp_layoutAreaToSurfaceIdAssignment->size()); + for (int j = 0; j < mp_layoutAreaToSurfaceIdAssignment->size(); ++j) { - qDebug(" app no. %d: %d", j, layerToShow); - renderOrder[renderOrderCounter] = layerToShow; - ++renderOrderCounter; + int surfaceToShow = mp_layoutAreaToSurfaceIdAssignment->find(j).value(); + qDebug(" surface no. %d: %d", j, surfaceToShow); - ilm_layerSetVisibility(layerToShow, ILM_TRUE); - t_ilm_float opacity = 1.0; - ilm_layerSetOpacity(layerToShow, opacity); + ilm_surfaceSetVisibility(surfaceToShow, ILM_TRUE); + ilm_surfaceSetOpacity(surfaceToShow, 1.0); qDebug(" layout area %d", j); - qDebug(" x: %d", m_layouts.find(m_currentLayout).value()[j].x); - qDebug(" x: %d", m_layouts.find(m_currentLayout).value()[j].y); - qDebug(" w: %d", m_layouts.find(m_currentLayout).value()[j].width); - qDebug(" h: %d", m_layouts.find(m_currentLayout).value()[j].height); - - ilm_layerSetDestinationRectangle(layerToShow, - m_layouts.find(m_currentLayout).value()[j].x, - m_layouts.find(m_currentLayout).value()[j].y, - m_layouts.find(m_currentLayout).value()[j].width, - m_layouts.find(m_currentLayout).value()[j].height); + qDebug(" x: %d", currentLayout.layoutAreas[j].x); + qDebug(" y: %d", currentLayout.layoutAreas[j].y); + qDebug(" w: %d", currentLayout.layoutAreas[j].width); + qDebug(" h: %d", currentLayout.layoutAreas[j].height); + + ilm_surfaceSetDestinationRectangle(surfaceToShow, + currentLayout.layoutAreas[j].x, + currentLayout.layoutAreas[j].y, + currentLayout.layoutAreas[j].width, + currentLayout.layoutAreas[j].height); } - } - qDebug("renderOrder"); - for (int j = 0; j < renderOrderCounter; ++j) - { - qDebug(" %d: %d", j, renderOrder[j]); - } + ilm_displaySetRenderOrder(0, renderOrder, WINDOWMANAGER_LAYER_NUM); - ilm_displaySetRenderOrder(0, renderOrder, renderOrderCounter); - - ilm_commitChanges(); + ilm_commitChanges(); +#endif + } } +#ifdef __arm__ void WindowManager::notificationFunc_non_static(ilmObjectType object, t_ilm_uint id, t_ilm_bool created) @@ -272,42 +270,34 @@ void WindowManager::notificationFunc_non_static(ilmObjectType object, if (created) { qDebug("Surface created, ID: %d", id); - //qDebug("Surface created, ID: 0x%s", QString(QByteArray::number(id,16)).toStdString().c_str()); ilm_getPropertiesOfSurface(id, &surfaceProperties); qDebug(" origSourceWidth : %d", surfaceProperties.origSourceWidth); qDebug(" origSourceHeight: %d", surfaceProperties.origSourceHeight); - SurfaceInfo surfaceInfo; - surfaceInfo.pid = surfaceProperties.creatorPid; - QString procInfoFileName = QString("/proc/") + QString::number(surfaceInfo.pid) + QString("/comm"); - QFile procInfo(procInfoFileName); - if (procInfo.open(QIODevice::ReadOnly)) - { - QTextStream in(&procInfo); - surfaceInfo.processName = in.readLine(); - qDebug(" creator pid %d %s", surfaceInfo.pid, surfaceInfo.processName.toStdString().c_str()); - addSurfaceToLayer(id, surfaceProperties.creatorPid); - mp_surfaces->insert(id, surfaceInfo); - ilm_surfaceAddNotification(id, surfaceCallbackFunction_static); - - ilm_commitChanges(); - - if (0 == QString::compare("weston-fullscre", surfaceInfo.processName)) + if (m_homeScreenPid == surfaceProperties.creatorPid) + { + if (m_homeScreenSurfaceId != id) { qDebug("HomeScreen app detected"); - m_homeScreenPid = surfaceInfo.pid; + m_homeScreenSurfaceId = id; + addSurfaceToLayer(id, WINDOWMANAGER_LAYER_HOMESCREEN); updateScreen(); } } else { - qDebug("no creator pid found. Ignoring surface!"); + addSurfaceToLayer(id, WINDOWMANAGER_LAYER_APPLICATIONS); + + m_surfaces.append(id); } + ilm_surfaceAddNotification(id, surfaceCallbackFunction_static); + + ilm_commitChanges(); } else { qDebug("Surface destroyed, ID: %d", id); - mp_surfaces->erase(mp_surfaces->find(id)); + m_surfaces.removeAt(m_surfaces.indexOf(id)); ilm_surfaceRemoveNotification(id); ilm_commitChanges(); @@ -327,9 +317,6 @@ void WindowManager::notificationFunc_static(ilmObjectType object, static_cast(WindowManager::myThis)->notificationFunc_non_static(object, id, created); } - - - void WindowManager::surfaceCallbackFunction_non_static(t_ilm_surface surface, struct ilmSurfaceProperties* surfaceProperties, t_ilm_notification_mask mask) @@ -371,42 +358,101 @@ void WindowManager::surfaceCallbackFunction_static(t_ilm_surface surface, } #endif -int WindowManager::addLayout(int layoutId, const QString &layoutName, bool isFullScreen, int associatedFullScreenLayout, const QList &surfaceAreas) + +int WindowManager::homeScreenPid() const +{ + return m_homeScreenPid; +} + +void WindowManager::setHomeScreenPid(int value) +{ + m_homeScreenPid = value; +#ifdef __arm__ + // maybe the HomeSceen app has already provided its surface. + // if so, shift it to the correct layer + // find the current used layout + QList::iterator ci = m_surfaces.begin(); + + struct ilmSurfaceProperties surfaceProperties; + bool found = false; + while ((!found) && (ci != m_surfaces.constEnd())) + { + ilm_getPropertiesOfSurface(*ci, &surfaceProperties); + if (m_homeScreenPid == surfaceProperties.creatorPid) + { + qDebug("HomeScreen app detected"); + m_homeScreenSurfaceId = *ci; + addSurfaceToLayer(*ci, WINDOWMANAGER_LAYER_HOMESCREEN); + m_surfaces.erase(ci); + found = true; + updateScreen(); + } + + ++ci; + } +#endif + + updateScreen(); + dumpScene(); +} + +int WindowManager::layoutId() const +{ + return m_currentLayout; +} + +QString WindowManager::layoutName() const +{ + QList::const_iterator i = m_layouts.begin(); + + QString result = "not found"; + while (i != m_layouts.constEnd()) + { + if (i->id == m_currentLayout) + { + result = i->name; + } + + ++i; + } + + return result; +} + + +int WindowManager::addLayout(int layoutId, const QString &layoutName, const QList &surfaceAreas) { qDebug("-=[addLayout]=-"); - m_layouts.insert(layoutId, surfaceAreas); - m_layoutNames.insert(layoutId, layoutName); - m_layoutFullScreen.insert(layoutId, isFullScreen); - m_layoutFullScreenAssociated.insert(layoutId, associatedFullScreenLayout); - qDebug("addLayout %d %s %s, %d, size %d", + m_layouts.append(Layout(layoutId, layoutName, surfaceAreas)); + + qDebug("addLayout %d %s, size %d", layoutId, layoutName.toStdString().c_str(), - isFullScreen ? "true" : "false", - associatedFullScreenLayout, surfaceAreas.size()); dumpScene(); - return true; + return WINDOWMANAGER_NO_ERROR; } -int WindowManager::getAssociatedFullScreenLayout(int layoutId) +QList WindowManager::getAllLayouts() { - qDebug("-=[getAssociatedFullScreenLayout]=-"); - return m_layoutFullScreenAssociated.find(layoutId).value(); + qDebug("-=[getAllLayouts]=-"); + + return m_layouts; } QList WindowManager::getAvailableLayouts(int numberOfAppSurfaces) { qDebug("-=[getAvailableLayouts]=-"); - QMap >::iterator i = m_layouts.begin(); + QList::const_iterator i = m_layouts.begin(); QList result; while (i != m_layouts.constEnd()) { - if (i.value().size() == numberOfAppSurfaces) + if (i->layoutAreas.size() == numberOfAppSurfaces) { - result.append(i.key()); + result.append(i->id); } ++i; @@ -415,81 +461,82 @@ QList WindowManager::getAvailableLayouts(int numberOfAppSurfaces) return result; } -// maybe not needed anymore -QList WindowManager::getAvailableSurfaces() +QList WindowManager::getAvailableSurfaces() { qDebug("-=[getAvailableSurfaces]=-"); - QList points; - SimplePoint point; - point.x = 1; - point.y = 2; - points.append(point); - point.x = 11; - point.y = 22; - points.append(point); - point.x = 111; - point.y = 222; - points.append(point); - - return points; -} -int WindowManager::getLayout() -{ - qDebug("-=[getLayout]=-"); - return m_currentLayout; + return m_surfaces; } QString WindowManager::getLayoutName(int layoutId) { qDebug("-=[getLayoutName]=-"); - return m_layoutNames.find(layoutId).value(); -} + QList::const_iterator i = m_layouts.begin(); -bool WindowManager::isLayoutFullScreen(int layoutId) -{ - qDebug("-=[isLayoutFullScreen]=-"); - return m_layoutFullScreen.find(layoutId).value(); + QString result = "not found"; + while (i != m_layouts.constEnd()) + { + if (i->id == layoutId) + { + result = i->name; + } + + ++i; + } + + return result; } -void WindowManager::setLayoutById(int layoutId) + +int WindowManager::setLayoutById(int layoutId) { qDebug("-=[setLayoutById]=-"); + int result = WINDOWMANAGER_NO_ERROR; m_currentLayout = layoutId; - mp_layoutAreaToPidAssignment->clear(); + mp_layoutAreaToSurfaceIdAssignment->clear(); dumpScene(); + + return result; } -void WindowManager::setLayoutByName(const QString &layoutName) +int WindowManager::setLayoutByName(const QString &layoutName) { qDebug("-=[setLayoutByName]=-"); - QMap::iterator i = m_layoutNames.begin(); - while (i != m_layoutNames.constEnd()) + int result = WINDOWMANAGER_NO_ERROR; + + QList::const_iterator i = m_layouts.begin(); + + while (i != m_layouts.constEnd()) { - if (i.value() == layoutName) + if (i->name == layoutName) { - m_currentLayout = i.key(); + m_currentLayout = i->id; + + mp_layoutAreaToSurfaceIdAssignment->clear(); + + dumpScene(); } + ++i; } - mp_layoutAreaToPidAssignment->clear(); - - dumpScene(); + return result; } -void WindowManager::setPidToLayoutArea(int pid, int layoutAreaId) +int WindowManager::setSurfaceToLayoutArea(int surfaceId, int layoutAreaId) { - qDebug("-=[setPidToLayoutArea]=-"); - qDebug("pid %d", pid); + qDebug("-=[setSurfaceToLayoutArea]=-"); + int result = WINDOWMANAGER_NO_ERROR; + + qDebug("surfaceId %d", surfaceId); qDebug("layoutAreaId %d", layoutAreaId); - mp_layoutAreaToPidAssignment->insert(layoutAreaId, pid); + mp_layoutAreaToSurfaceIdAssignment->insert(layoutAreaId, surfaceId); -#ifdef __arm__ updateScreen(); -#endif dumpScene(); + + return result; } diff --git a/WindowManager/src/windowmanager.hpp b/WindowManager/src/windowmanager.hpp index ef19f4e..027344b 100644 --- a/WindowManager/src/windowmanager.hpp +++ b/WindowManager/src/windowmanager.hpp @@ -24,12 +24,6 @@ #include "windowmanager_adapter.h" -typedef struct -{ - int pid; - QString processName; -} SurfaceInfo; - #ifdef __arm__ extern "C" { #include "ilm/ilm_control.h" @@ -47,27 +41,22 @@ public: void start(); private: WindowmanagerAdaptor *mp_windowManagerAdaptor; - QMap > m_layouts; - QMap m_layoutNames; - QMap m_layoutFullScreen; - QMap m_layoutFullScreenAssociated; + QList m_layouts; + QList m_surfaces; + QMap *mp_layoutAreaToSurfaceIdAssignment; + int m_currentLayout; - void dumpScene(); int m_homeScreenPid; + int m_homeScreenSurfaceId; + + void dumpScene(); #ifdef __arm__ void createNewLayer(int layerId); void addSurfaceToLayer(int surfaceId, int layerId); - void updateScreen(); - - - QMap *mp_surfaces; - /* one layer per pid is created - where the surfaces are added that are created by the process */ - QList *mp_processLayers; #endif + void updateScreen(); - QMap *mp_layoutAreaToPidAssignment; public: static void* myThis; @@ -96,18 +85,26 @@ public slots: // from windowmanager_adapter.h +public: // PROPERTIES + Q_PROPERTY(int homeScreenPid READ homeScreenPid WRITE setHomeScreenPid) + int homeScreenPid() const; + void setHomeScreenPid(int value); + + Q_PROPERTY(int layoutId READ layoutId) + int layoutId() const; + + Q_PROPERTY(QString layoutName READ layoutName) + QString layoutName() const; + public Q_SLOTS: // METHODS - int addLayout(int layoutId, const QString &layoutName, bool isFullScreen, int associatedFullScreenLayout, const QList &surfaceAreas); - int getAssociatedFullScreenLayout(int layoutId); + int addLayout(int layoutId, const QString &layoutName, const QList &surfaceAreas); + QList getAllLayouts(); QList getAvailableLayouts(int numberOfAppSurfaces); - QList getAvailableSurfaces(); - int getLayout(); + QList getAvailableSurfaces(); QString getLayoutName(int layoutId); - bool isLayoutFullScreen(int layoutId); - void setLayoutById(int layoutId); - void setLayoutByName(const QString &layoutName); - void setPidToLayoutArea(int pid, int layoutAreaId); - + int setLayoutById(int layoutId); + int setLayoutByName(const QString &layoutName); + int setSurfaceToLayoutArea(int surfaceId, int layoutAreaId); }; diff --git a/interfaces/homescreen.xml b/interfaces/homescreen.xml index 023f54b..a405555 100644 --- a/interfaces/homescreen.xml +++ b/interfaces/homescreen.xml @@ -17,7 +17,7 @@ org.agl.homescreen: @short_description: A generic interface for the HomeScreen app. - This interface is a collection of methods from drifferent functional areas to control the HomeScreen app. + This interface is a collection of methods from different functional areas to control the HomeScreen app. --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/commandlinetests.txt b/test/commandlinetests.txt index 86a09cd..81c546e 100644 --- a/test/commandlinetests.txt +++ b/test/commandlinetests.txt @@ -194,6 +194,14 @@ $dbus-send --session --type=method_call --print-reply --dest=org.agl.homescreen Interface: org.agl.windowmanager + +dbus-send --session --type=method_call --print-reply --dest=org.agl.windowmanager /windowmanager org.freedesktop.DBus.Properties.GetAll string:"org.agl.windowmanager" + +dbus-send --session --type=method_call --print-reply --dest=org.agl.windowmanager /windowmanager org.freedesktop.DBus.Properties.Get string:"org.agl.windowmanager" string:"homeScreenPid" + +dbus-send --session --type=method_call --print-reply --dest=org.agl.windowmanager /windowmanager org.freedesktop.DBus.Properties.Set string:"org.agl.windowmanager" string:"homeScreenPid" variant:int32:1 + + Method: -- 2.16.6