aboutsummaryrefslogtreecommitdiffstats
path: root/WindowManager
diff options
context:
space:
mode:
Diffstat (limited to 'WindowManager')
-rw-r--r--WindowManager/src/main.cpp1
-rw-r--r--WindowManager/src/windowmanager.cpp220
-rw-r--r--WindowManager/src/windowmanager.hpp11
3 files changed, 171 insertions, 61 deletions
diff --git a/WindowManager/src/main.cpp b/WindowManager/src/main.cpp
index 333d864..f3f5a71 100644
--- a/WindowManager/src/main.cpp
+++ b/WindowManager/src/main.cpp
@@ -33,6 +33,7 @@ int main(int argc, char *argv[])
qDBusRegisterMetaType<QList<SimpleRect> >();
WindowManager *windowManager = new WindowManager();
+ windowManager->start();
#ifdef __arm__
qDebug("Running on ARM architecture");
diff --git a/WindowManager/src/windowmanager.cpp b/WindowManager/src/windowmanager.cpp
index d35db9b..dea17a1 100644
--- a/WindowManager/src/windowmanager.cpp
+++ b/WindowManager/src/windowmanager.cpp
@@ -29,8 +29,15 @@ WindowManager::WindowManager(QObject *parent) :
QObject(parent),
m_layouts(),
m_layoutNames(),
- m_currentLayout(-1)
+ m_currentLayout(-1),
+ m_homeScreenPid(-1),
+#ifdef __arm__
+ mp_surfaces(0),
+ mp_processLayers(0),
+#endif
+ mp_layoutAreaToPidAssignment(0)
{
+ qDebug("-=[WindowManager]=-");
qDebug("WindowManager");
// publish windowmanager interface
mp_windowManagerAdaptor = new WindowmanagerAdaptor((QObject*)this);
@@ -38,7 +45,12 @@ WindowManager::WindowManager(QObject *parent) :
QDBusConnection dbus = QDBusConnection::sessionBus();
dbus.registerObject("/windowmanager", this);
dbus.registerService("org.agl.windowmanager");
+}
+void WindowManager::start()
+{
+ qDebug("-=[start]=-");
+ mp_layoutAreaToPidAssignment = new QMap<int, unsigned int>;
#ifdef __arm__
mp_processLayers = new QList<int>;
mp_surfaces = new QMap<t_ilm_uint, SurfaceInfo>;
@@ -50,19 +62,20 @@ WindowManager::WindowManager(QObject *parent) :
myThis = this;
err = ilm_registerNotification(WindowManager::notificationFunc_static, this);
-
-
#endif
}
WindowManager::~WindowManager()
{
+ qDebug("-=[~WindowManager]=-");
delete mp_windowManagerAdaptor;
#ifdef __arm__
delete mp_surfaces;
+ delete mp_processLayers;
ilm_destroy();
#endif
+ delete mp_layoutAreaToPidAssignment;
}
void WindowManager::dumpScene()
@@ -88,13 +101,14 @@ void WindowManager::dumpScene()
++i;
}
-
}
#ifdef __arm__
void WindowManager::createNewLayer(int layerId)
{
+ qDebug("-=[createNewLayer]=-");
+ qDebug("layerId %d", layerId);
ilmErrorTypes err;
t_ilm_uint screenID = 0;
@@ -105,26 +119,26 @@ void WindowManager::createNewLayer(int layerId)
t_ilm_layer newLayerId = layerId;
err = ilm_layerCreateWithDimension(&newLayerId, width, height);
- qDebug("ilm_layerCreateWithDimension = %d", err);
- qDebug("layerIdWallpaper = %d", newLayerId);
- err = ilm_layerSetVisibility(newLayerId, true);
- qDebug("ilm_layerSetVisibility = %d", err);
-
- t_ilm_float opacity = 1.0;
+ t_ilm_float opacity = 0.0;
err = ilm_layerSetOpacity(newLayerId, opacity);
+ ilm_layerSetVisibility(newLayerId, ILM_FALSE);
+
ilm_commitChanges();
}
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)
+ for (int i = 0; i < length; ++i)
{
if (layerId == pArray[i])
{
@@ -139,8 +153,15 @@ void WindowManager::addSurfaceToLayer(int surfaceId, int layerId)
struct ilmSurfaceProperties surfaceProperties;
ilm_getPropertiesOfSurface(surfaceId, &surfaceProperties);
- qDebug(" origSourceWidth : %d", surfaceProperties.origSourceWidth);
- qDebug(" origSourceHeight: %d", surfaceProperties.origSourceHeight);
+ //qDebug(" origSourceWidth : %d", surfaceProperties.origSourceWidth);
+ //qDebug(" origSourceHeight: %d", surfaceProperties.origSourceHeight);
+
+ ilm_layerSetSourceRectangle(layerId,
+ 0,
+ 0,
+ surfaceProperties.origSourceWidth,
+ surfaceProperties.origSourceHeight);
+ ilm_commitChanges();
ilm_surfaceSetDestinationRectangle(surfaceId, 0, 0, surfaceProperties.origSourceWidth, surfaceProperties.origSourceHeight);
ilm_surfaceSetSourceRectangle(surfaceId, 0, 0, surfaceProperties.origSourceWidth, surfaceProperties.origSourceHeight);
@@ -152,10 +173,96 @@ void WindowManager::addSurfaceToLayer(int surfaceId, int layerId)
ilm_commitChanges();
}
+void WindowManager::updateScreen()
+{
+ qDebug("-=[updateScreen]=-");
+ int numberOfLayersToShow = 0;
+
+ QMap<int, QList<SimpleRect> >::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)
+ {
+ renderOrder[renderOrderCounter] = m_homeScreenPid;
+ ++renderOrderCounter;
+
+ ilm_layerSetVisibility(m_homeScreenPid, ILM_TRUE);
+ t_ilm_float opacity = 1.0;
+ ilm_layerSetOpacity(m_homeScreenPid, opacity);
+
+ // 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_layerSetDestinationRectangle(m_homeScreenPid,
+ 0,
+ 0,
+ width,
+ height);
+ }
+
+
+ qDebug("show %d apps", numberOfLayersToShow);
+ for (int j = 0; j < numberOfLayersToShow; ++j)
+ {
+ int layerToShow = mp_layoutAreaToPidAssignment->find(j).value();
+ if (layerToShow != m_homeScreenPid)
+ {
+ qDebug(" app no. %d: %d", j, layerToShow);
+ renderOrder[renderOrderCounter] = layerToShow;
+ ++renderOrderCounter;
+
+ ilm_layerSetVisibility(layerToShow, ILM_TRUE);
+ t_ilm_float opacity = 1.0;
+ ilm_layerSetOpacity(layerToShow, opacity);
+
+ 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("renderOrder");
+ for (int j = 0; j < renderOrderCounter; ++j)
+ {
+ qDebug(" %d: %d", j, renderOrder[j]);
+ }
+
+ ilm_displaySetRenderOrder(0, renderOrder, renderOrderCounter);
+
+ ilm_commitChanges();
+}
+
void WindowManager::notificationFunc_non_static(ilmObjectType object,
t_ilm_uint id,
t_ilm_bool created)
{
+ qDebug("-=[notificationFunc_non_static]=-");
+ qDebug("Notification from weston!");
if (ILM_SURFACE == object)
{
struct ilmSurfaceProperties surfaceProperties;
@@ -163,19 +270,10 @@ 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);
-
- addSurfaceToLayer(id, surfaceProperties.creatorPid);
-
- t_ilm_int length;
- t_ilm_surface* pArray;
- ilm_getSurfaceIDs(&length, &pArray);
- ilm_layerSetRenderOrder(42, pArray, length);
-
- ilm_commitChanges();
-
SurfaceInfo surfaceInfo;
surfaceInfo.pid = surfaceProperties.creatorPid;
QString procInfoFileName = QString("/proc/") + QString::number(surfaceInfo.pid) + QString("/comm");
@@ -184,49 +282,34 @@ void WindowManager::notificationFunc_non_static(ilmObjectType object,
{
QTextStream in(&procInfo);
surfaceInfo.processName = in.readLine();
- qDebug("surface id %d, pid %d: %s", id, surfaceInfo.pid, surfaceInfo.processName.toStdString().c_str());
- }
+ 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);
- mp_surfaces->insert(id, surfaceInfo);
- ilm_surfaceAddNotification(id, surfaceCallbackFunction_static);
+ ilm_commitChanges();
+
+ if (0 == QString::compare("weston-fullscre", surfaceInfo.processName))
+ {
+ qDebug("HomeScreen app detected");
+ m_homeScreenPid = surfaceInfo.pid;
+ updateScreen();
+ }
+ }
+ else
+ {
+ qDebug("no creator pid found. Ignoring surface!");
+ }
}
else
{
qDebug("Surface destroyed, ID: %d", id);
mp_surfaces->erase(mp_surfaces->find(id));
ilm_surfaceRemoveNotification(id);
- }
- // rearrange surfaces on screen
- t_ilm_uint screenID = 0;
- t_ilm_uint width;
- t_ilm_uint height;
- ilm_getScreenResolution(screenID, &width, &height);
-
- qDebug("%d surfaces to show", mp_surfaces->count());
-
- QMap<t_ilm_uint, SurfaceInfo>::const_iterator i = mp_surfaces->constBegin();
- int counter(0);
- while (i != mp_surfaces->constEnd())
- {
- qDebug("place surface %d at x: %f, y: %d, width: %f, height: %d",
- i.key(),
- counter * (width / (1.0 * mp_surfaces->count())),
- 0,
- width / (1.0 * mp_surfaces->count()),
- height);
- ilm_surfaceSetDestinationRectangle(i.key(),
- counter * (width / (1.0 * mp_surfaces->count())),
- 0,
- width / (1.0 * mp_surfaces->count()),
- height);
-
- ++i;
- ++counter;
+ ilm_commitChanges();
}
-
-
- ilm_commitChanges();
}
if (ILM_LAYER == object)
{
@@ -249,6 +332,7 @@ void WindowManager::surfaceCallbackFunction_non_static(t_ilm_surface surface,
struct ilmSurfaceProperties* surfaceProperties,
t_ilm_notification_mask mask)
{
+ qDebug("-=[surfaceCallbackFunction_non_static]=-");
qDebug("surfaceCallbackFunction_non_static changes for surface %d", surface);
if (ILM_NOTIFICATION_VISIBILITY & mask)
{
@@ -287,6 +371,7 @@ void WindowManager::surfaceCallbackFunction_static(t_ilm_surface surface,
int WindowManager::addLayout(int layoutId, const QString &layoutName, const QList<SimpleRect> &surfaceAreas)
{
+ qDebug("-=[addLayout]=-");
m_layouts.insert(layoutId, surfaceAreas);
m_layoutNames.insert(layoutId, layoutName);
qDebug("addLayout %d %s, size %d", layoutId, layoutName.toStdString().c_str(), surfaceAreas.size());
@@ -298,6 +383,7 @@ int WindowManager::addLayout(int layoutId, const QString &layoutName, const QLis
QList<int> WindowManager::getAvailableLayouts(int numberOfAppSurfaces)
{
+ qDebug("-=[getAvailableLayouts]=-");
QMap<int, QList<SimpleRect> >::iterator i = m_layouts.begin();
QList<int> result;
@@ -317,6 +403,7 @@ QList<int> WindowManager::getAvailableLayouts(int numberOfAppSurfaces)
// maybe not needed anymore
QList<SimplePoint> WindowManager::getAvailableSurfaces()
{
+ qDebug("-=[getAvailableSurfaces]=-");
QList<SimplePoint> points;
SimplePoint point;
point.x = 1;
@@ -334,23 +421,29 @@ QList<SimplePoint> WindowManager::getAvailableSurfaces()
int WindowManager::getLayout()
{
+ qDebug("-=[getLayout]=-");
return m_currentLayout;
}
QString WindowManager::getLayoutName(int layoutId)
{
+ qDebug("-=[getLayoutName]=-");
return m_layoutNames.find(layoutId).value();
}
void WindowManager::setLayoutById(int layoutId)
{
+ qDebug("-=[setLayoutById]=-");
m_currentLayout = layoutId;
+ mp_layoutAreaToPidAssignment->clear();
+
dumpScene();
}
void WindowManager::setLayoutByName(const QString &layoutName)
{
+ qDebug("-=[setLayoutByName]=-");
QMap<int, QString>::iterator i = m_layoutNames.begin();
while (i != m_layoutNames.constEnd())
{
@@ -361,10 +454,21 @@ void WindowManager::setLayoutByName(const QString &layoutName)
++i;
}
+ mp_layoutAreaToPidAssignment->clear();
+
dumpScene();
}
-void WindowManager::setSurfaceToLayoutArea(int surfaceId, int layoutAreaId)
+void WindowManager::setPidToLayoutArea(int pid, int layoutAreaId)
{
+ qDebug("-=[setPidToLayoutArea]=-");
+ qDebug("pid %d", pid);
+ qDebug("layoutAreaId %d", layoutAreaId);
+ mp_layoutAreaToPidAssignment->insert(layoutAreaId, pid);
+
+#ifdef __arm__
+ updateScreen();
+#endif
+
dumpScene();
}
diff --git a/WindowManager/src/windowmanager.hpp b/WindowManager/src/windowmanager.hpp
index 8fb716d..2a76a32 100644
--- a/WindowManager/src/windowmanager.hpp
+++ b/WindowManager/src/windowmanager.hpp
@@ -42,19 +42,22 @@ class WindowManager : public QObject
public:
explicit WindowManager(QObject *parent = 0);
- QMutex callbackMutex;
-
~WindowManager();
+
+ void start();
private:
WindowmanagerAdaptor *mp_windowManagerAdaptor;
QMap<int, QList<SimpleRect> > m_layouts;
QMap<int, QString> m_layoutNames;
int m_currentLayout;
void dumpScene();
+ int m_homeScreenPid;
#ifdef __arm__
void createNewLayer(int layerId);
void addSurfaceToLayer(int surfaceId, int layerId);
+ void updateScreen();
+
QMap<t_ilm_uint, SurfaceInfo> *mp_surfaces;
/* one layer per pid is created
@@ -62,6 +65,8 @@ private:
QList<int> *mp_processLayers;
#endif
+ QMap<int, unsigned int> *mp_layoutAreaToPidAssignment;
+
public:
static void* myThis;
@@ -97,7 +102,7 @@ public Q_SLOTS: // METHODS
QString getLayoutName(int layoutId);
void setLayoutById(int layoutId);
void setLayoutByName(const QString &layoutName);
- void setSurfaceToLayoutArea(int surfaceId, int layoutAreaId);
+ void setPidToLayoutArea(int pid, int layoutAreaId);
};