X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=HomeScreen%2Fsrc%2Flayouthandler.cpp;fp=HomeScreen%2Fsrc%2Flayouthandler.cpp;h=a4d0f9155c4003345d6adfbd56bf0a2321847680;hb=cf8cd699e91df40c3f9070019f7c561432b4b4dd;hp=0000000000000000000000000000000000000000;hpb=0a468d9b5ae7b3e5ba106facf17698d89b1ce200;p=staging%2FHomeScreen.git diff --git a/HomeScreen/src/layouthandler.cpp b/HomeScreen/src/layouthandler.cpp new file mode 100644 index 0000000..a4d0f91 --- /dev/null +++ b/HomeScreen/src/layouthandler.cpp @@ -0,0 +1,180 @@ +#include "layouthandler.h" + +LayoutHandler::LayoutHandler(QObject *parent) : + QObject(parent), + mp_dBusWindowManagerProxy(0), + mp_dBusPopupProxy(0), + m_visibleApps(), + m_invisibleApps(), + m_requestsToBeVisibleApps() +{ + qDBusRegisterMetaType(); + qDBusRegisterMetaType >(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType >(); + + qDebug("D-Bus: connect to org.agl.windowmanager /windowmanager"); + mp_dBusWindowManagerProxy = new org::agl::windowmanager("org.agl.windowmanager", + "/windowmanager", + QDBusConnection::sessionBus(), + 0); + qDebug("D-Bus: connect to org.agl.homescreen /Popup"); + mp_dBusPopupProxy = new org::agl::popup("org.agl.homescreen", + "/Popup", + QDBusConnection::sessionBus(), + 0); +} + +LayoutHandler::~LayoutHandler() +{ + delete mp_dBusPopupProxy; + delete mp_dBusWindowManagerProxy; +} + +void LayoutHandler::setUpLayers() +{ + qDebug("setUpLayers"); + QList surfaceAreas; + SimpleRect surfaceArea; + + const int SCREEN_WIDTH = 1080; + const int SCREEN_HEIGHT = 1080; + + const int STATUSBAR_HEIGHT = 60; + const int STATUSBAR_WIDTH = SCREEN_WIDTH; + const int STATUSBAR_X = 0; + const int STATUSBAR_Y = 0; + const int CONTROLBAR_HEIGHT = 60; + const int CONTROLBAR_WIDTH = SCREEN_WIDTH; + const int CONTROLBAR_X = 0; + const int CONTROLBAR_Y = SCREEN_HEIGHT - CONTROLBAR_HEIGHT; + + + // layout 1: + // one app surface, statusbar, control bar + surfaceArea.x = 0; + surfaceArea.y = STATUSBAR_HEIGHT; + surfaceArea.width = SCREEN_WIDTH; + surfaceArea.height = SCREEN_HEIGHT - STATUSBAR_HEIGHT - CONTROLBAR_HEIGHT; + + surfaceAreas.append(surfaceArea); + + mp_dBusWindowManagerProxy->addLayout(1, "one app", surfaceAreas); + + + surfaceAreas.clear(); + + // layout 2: + // two app surfaces (one on top of the other), statusbar, control bar + + // top surface + surfaceArea.x = 0; + surfaceArea.y = STATUSBAR_HEIGHT; + surfaceArea.width = SCREEN_WIDTH; + surfaceArea.height = (SCREEN_HEIGHT - STATUSBAR_HEIGHT - CONTROLBAR_HEIGHT) / 2; + + surfaceAreas.append(surfaceArea); + + // bottom surface + surfaceArea.x = 0; + surfaceArea.y = STATUSBAR_HEIGHT / 2; + surfaceArea.width = SCREEN_WIDTH; + surfaceArea.height = (SCREEN_HEIGHT - STATUSBAR_HEIGHT - CONTROLBAR_HEIGHT) / 2; + + surfaceAreas.append(surfaceArea); + + mp_dBusWindowManagerProxy->addLayout(2, "top on bottom", surfaceAreas); + + + surfaceAreas.clear(); + + // layout 3: + // two app surfaces (one besides the other), statusbar, control bar + + // left surface + surfaceArea.x = 0; + surfaceArea.y = STATUSBAR_HEIGHT; + surfaceArea.width = SCREEN_WIDTH / 2; + surfaceArea.height = SCREEN_HEIGHT - STATUSBAR_HEIGHT - CONTROLBAR_HEIGHT; + + surfaceAreas.append(surfaceArea); + + // right surface + surfaceArea.x = SCREEN_WIDTH / 2; + surfaceArea.y = STATUSBAR_HEIGHT; + surfaceArea.width = SCREEN_WIDTH / 2; + surfaceArea.height = SCREEN_HEIGHT - STATUSBAR_HEIGHT - CONTROLBAR_HEIGHT; + + surfaceAreas.append(surfaceArea); + + mp_dBusWindowManagerProxy->addLayout(3, "side by side", surfaceAreas); + +} + +void LayoutHandler::makeMeVisible(int pid) +{ + qDebug("makeMeVisible %d", pid); + m_requestsToBeVisibleApps.append(pid); + + qDebug("m_visibleApps %d", m_visibleApps.size()); + qDebug("m_invisibleApps %d", m_invisibleApps.size()); + qDebug("m_requestsToBeVisibleApps %d", m_requestsToBeVisibleApps.size()); + + QList availableLayouts = mp_dBusWindowManagerProxy->getAvailableLayouts(m_visibleApps.size() + m_requestsToBeVisibleApps.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"); + + m_invisibleApps.append(m_visibleApps.last()); + m_visibleApps.removeLast(); + + for (int i = 0; i < m_visibleApps.size(); ++i) + { + mp_dBusWindowManagerProxy->setSurfaceToLayoutArea(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(); + + mp_dBusWindowManagerProxy->setLayoutById(availableLayouts.at(0)); + for (int i = 0; i < m_visibleApps.size(); ++i) + { + mp_dBusWindowManagerProxy->setSurfaceToLayoutArea(i, i); + } + } + if (1 < availableLayouts.size()) + { + // more than one layout possible! Ask user. + qDebug("more than one layout possible! Ask user."); + + QStringList choices; + for (int i = 0; i < availableLayouts.size(); ++i) + { + choices.append(mp_dBusWindowManagerProxy->getLayoutName(availableLayouts.at(i))); + } + + mp_dBusPopupProxy->showPopupComboBox("Select Layout", choices); + + } +} + +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(); + + mp_dBusWindowManagerProxy->setLayoutByName(layoutName); + for (int i = 0; i < m_visibleApps.size(); ++i) + { + mp_dBusWindowManagerProxy->setSurfaceToLayoutArea(i, i); + } +}