X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=WindowManager%2Fsrc%2Fwindowmanager.cpp;h=101f5b39c1b141c85e476ecb95116ac7b88ffa3f;hb=36f4818cb31b406715ec0d52a2075611ec6fcdff;hp=edcbf9e06b3ebb0f6d175c22ae4222036e918640;hpb=da604bd27fd3a7b6838b57b8b4c79647ca12722a;p=staging%2FHomeScreen.git diff --git a/WindowManager/src/windowmanager.cpp b/WindowManager/src/windowmanager.cpp index edcbf9e..101f5b3 100644 --- a/WindowManager/src/windowmanager.cpp +++ b/WindowManager/src/windowmanager.cpp @@ -33,22 +33,37 @@ #define WINDOWMANAGER_LAYER_NUM 4 +#define WINDOWMANAGER_LAYER_ID_SHIFT 22 + // the HomeScreen app has to have the surface id 1000 #define WINDOWMANAGER_HOMESCREEN_MAIN_SURFACE_ID 1000 - void* WindowManager::myThis = 0; WindowManager::WindowManager(QObject *parent) : QObject(parent), m_layouts(), - m_appSurfaces(), + // m_appSurfaces(), mp_layoutAreaToSurfaceIdAssignment(0), m_currentLayout(-1), m_screenId(0), // use screen "0" m_screenWidth(0), m_screenHeight(0) +#ifdef HAVE_IVI_LAYERMANAGEMENT_API + , + m_appLayers(), + m_pending_to_show(-1) +#endif { +#ifdef HAVE_IVI_LAYERMANAGEMENT_API + m_showLayers = new t_ilm_layer[WINDOWMANAGER_LAYER_NUM]; + + m_showLayers[0] = 0; /* POPUP is not shown by default */ + m_showLayers[1] = 0; /* HOMESCREEN_OVERLAY is not shown by default */ + m_showLayers[2] = 0; /* APPLICATIONS is not shown by default */ + m_showLayers[3] = WINDOWMANAGER_LAYER_HOMESCREEN; /* HOMESCREEN is shwon by default */ + +#endif qDebug("-=[WindowManager]=-"); } @@ -73,7 +88,7 @@ void WindowManager::start() createNewLayer(WINDOWMANAGER_LAYER_POPUP); createNewLayer(WINDOWMANAGER_LAYER_HOMESCREEN_OVERLAY); - createNewLayer(WINDOWMANAGER_LAYER_APPLICATIONS); +// createNewLayer(WINDOWMANAGER_LAYER_APPLICATIONS); createNewLayer(WINDOWMANAGER_LAYER_HOMESCREEN); ilm_registerNotification(WindowManager::notificationFunc_static, this); @@ -97,6 +112,21 @@ WindowManager::~WindowManager() delete mp_layoutAreaToSurfaceIdAssignment; } +#ifdef HAVE_IVI_LAYERMANAGEMENT_API +int WindowManager::getLayerRenderOrder(t_ilm_layer id_array[]) +{ + int i, j; + + for (i = WINDOWMANAGER_LAYER_NUM - 1, j = 0; i >= 0; i--, j++) { + if (m_showLayers[i] != 0) { + id_array[j] = m_showLayers[i]; + } + } + + return j; +} +#endif + void WindowManager::dumpScene() { qDebug("\n"); @@ -146,6 +176,47 @@ void WindowManager::createNewLayer(int layerId) ilm_commitChanges(); } +t_ilm_layer WindowManager::getAppLayerID(pid_t pid) +{ + t_ilm_layer layer_id; + +// layer_id = pid + (WINDOWMANAGER_LAYER_APPLICATIONS << WINDOWMANAGER_LAYER_ID_SHIFT); + layer_id = pid + (WINDOWMANAGER_LAYER_APPLICATIONS * 100000); /* for debug */ + + return layer_id; +} + +void WindowManager::addSurfaceToAppLayer(int surfaceId) +{ + struct ilmSurfaceProperties surfaceProperties; + t_ilm_layer layer_id; + int found = 0; + pid_t pid; + + qDebug("-=[addSurfaceToAppLayer]=-"); + qDebug(" surfaceId %d", surfaceId); + + ilm_getPropertiesOfSurface(surfaceId, &surfaceProperties); + pid = surfaceProperties.creatorPid; + + if (pid < 0) { + /* No process */ + qDebug("addSurfaceToAppLayer(%d) got pid == -1", surfaceId); + return; + } + + QMap::const_iterator i = m_appLayers.find(pid); + if (i == m_appLayers.end()) { + qDebug("No layer found, create new for app(pid=%d)", pid); + + /* not found, create new one */ + t_ilm_layer layer_id = getAppLayerID(pid); + + createNewLayer(layer_id); + m_appLayers.insert(pid, layer_id); + } +} + void WindowManager::addSurfaceToLayer(int surfaceId, int layerId) { qDebug("-=[addSurfaceToLayer]=-"); @@ -165,7 +236,7 @@ void WindowManager::addSurfaceToLayer(int surfaceId, int layerId) ilm_layerAddSurface(layerId, surfaceId); } - +#if 0 if (layerId == WINDOWMANAGER_LAYER_APPLICATIONS) { struct ilmSurfaceProperties surfaceProperties; @@ -178,7 +249,7 @@ void WindowManager::addSurfaceToLayer(int surfaceId, int layerId) ilm_layerAddSurface(layerId, surfaceId); } - +#endif if (layerId == WINDOWMANAGER_LAYER_HOMESCREEN_OVERLAY) { struct ilmSurfaceProperties surfaceProperties; @@ -214,7 +285,8 @@ void WindowManager::updateScreen() { qDebug("-=[updateScreen]=-"); -#ifdef HAVE_IVI_LAYERMANAGEMENT_API +#if 0 +//#ifdef HAVE_IVI_LAYERMANAGEMENT_API if (-1 != m_currentLayout) { // hide all surfaces @@ -281,16 +353,17 @@ void WindowManager::updateScreen() ilm_getSurfaceIDsOnLayer(WINDOWMANAGER_LAYER_POPUP, &length, &pArray); ilm_layerSetRenderOrder(WINDOWMANAGER_LAYER_POPUP, pArray, length); ilm_commitChanges(); - - // display layer render order - t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM]; - renderOrder[0] = WINDOWMANAGER_LAYER_HOMESCREEN; - renderOrder[1] = WINDOWMANAGER_LAYER_APPLICATIONS; - renderOrder[2] = WINDOWMANAGER_LAYER_HOMESCREEN_OVERLAY; - renderOrder[3] = WINDOWMANAGER_LAYER_POPUP; - ilm_displaySetRenderOrder(0, renderOrder, WINDOWMANAGER_LAYER_NUM); - ilm_displaySetRenderOrder(1, renderOrder, WINDOWMANAGER_LAYER_NUM); - ilm_commitChanges(); +#endif +#ifdef HAVE_IVI_LAYERMANAGEMENT_API + if (m_pending_to_show != -1) { + showAppLayer(m_pending_to_show); + } else { + // display layer render order + t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM]; + int num_layers = getLayerRenderOrder(renderOrder); + ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers); + ilm_commitChanges(); + } #endif } @@ -320,9 +393,9 @@ void WindowManager::notificationFunc_non_static(ilmObjectType object, } else { + addSurfaceToAppLayer(id); //addSurfaceToLayer(id, WINDOWMANAGER_LAYER_APPLICATIONS); - - m_appSurfaces.append(id); + //m_appSurfaces.append(id); } ilm_surfaceAddNotification(id, surfaceCallbackFunction_static); @@ -331,10 +404,12 @@ void WindowManager::notificationFunc_non_static(ilmObjectType object, else { qDebug("Surface destroyed, ID: %d", id); +#if 0 m_appSurfaces.removeAt(m_appSurfaces.indexOf(id)); ilm_surfaceRemoveNotification(id); ilm_commitChanges(); +#endif } } if (ILM_LAYER == object) @@ -381,11 +456,53 @@ void WindowManager::surfaceCallbackFunction_non_static(t_ilm_surface surface, if (ILM_NOTIFICATION_CONTENT_AVAILABLE & mask) { qDebug("ILM_NOTIFICATION_CONTENT_AVAILABLE"); - //updateScreen(); + /* add surface to layer for the application */ + + ilmErrorTypes result; + pid_t pid = surfaceProperties->creatorPid; + + QMap::const_iterator i = m_appLayers.find(pid); + if (i != m_appLayers.end()) { + t_ilm_layer layer_id = m_appLayers.value(pid); + + result = ilm_layerAddSurface(layer_id, surface); + + if (result != ILM_SUCCESS) { + qDebug("ilm_layerAddSurface(%d,%d) failed.", layer_id, surface); + } + + /* Dirty hack! cut & paste from HomeScreen/src/layouthandler.cpp */ + const int SCREEN_WIDTH = 1080; + const int SCREEN_HEIGHT = 1920; + + const int TOPAREA_HEIGHT = 218; + const int TOPAREA_WIDTH = SCREEN_WIDTH; + const int TOPAREA_X = 0; + const int TOPAREA_Y = 0; + const int MEDIAAREA_HEIGHT = 215; + const int MEDIAAREA_WIDTH = SCREEN_WIDTH; + const int MEDIAAREA_X = 0; + const int MEDIAAREA_Y = SCREEN_HEIGHT - MEDIAAREA_HEIGHT; + + ilm_surfaceSetDestinationRectangle(surface, + 0, + TOPAREA_HEIGHT, + SCREEN_WIDTH, + SCREEN_HEIGHT - TOPAREA_HEIGHT - MEDIAAREA_HEIGHT); + + ilm_commitChanges(); + } else { + qDebug("No layer for application(pid=%d)", surfaceProperties->creatorPid); + } } if (ILM_NOTIFICATION_CONTENT_REMOVED & mask) { qDebug("ILM_NOTIFICATION_CONTENT_REMOVED"); + + /* application being down */ + m_appLayers.remove(surfaceProperties->creatorPid); + + updateScreen(); } if (ILM_NOTIFICATION_CONFIGURED & mask) { @@ -400,7 +517,8 @@ void WindowManager::surfaceCallbackFunction_non_static(t_ilm_surface surface, surfaceProperties->origSourceWidth, surfaceProperties->origSourceHeight); - ilm_commitChanges(); + ilm_surfaceSetVisibility(surface, ILM_TRUE); + updateScreen(); } } @@ -491,6 +609,7 @@ QList WindowManager::getAllLayouts() return m_layouts; } +#if 0 QList WindowManager::getAllSurfacesOfProcess(int pid) { QList result; @@ -508,6 +627,7 @@ QList WindowManager::getAllSurfacesOfProcess(int pid) #endif return result; } +#endif QList WindowManager::getAvailableLayouts(int numberOfAppSurfaces) { @@ -528,12 +648,14 @@ QList WindowManager::getAvailableLayouts(int numberOfAppSurfaces) return result; } +#if 0 QList WindowManager::getAvailableSurfaces() { qDebug("-=[getAvailableSurfaces]=-"); return m_appSurfaces; } +#endif QString WindowManager::getLayoutName(int layoutId) { @@ -560,23 +682,25 @@ void WindowManager::hideLayer(int layer) qDebug("layer %d", layer); #ifdef HAVE_IVI_LAYERMANAGEMENT_API - if (0 == layer) - { - ilm_layerSetVisibility(WINDOWMANAGER_LAYER_POPUP, ILM_FALSE); - } - if (1 == layer) - { - ilm_layerSetVisibility(WINDOWMANAGER_LAYER_HOMESCREEN_OVERLAY, ILM_FALSE); - } - if (2 == layer) - { - ilm_layerSetVisibility(WINDOWMANAGER_LAYER_APPLICATIONS, ILM_FALSE); - } - if (3 == layer) - { - ilm_layerSetVisibility(WINDOWMANAGER_LAYER_HOMESCREEN, ILM_FALSE); + // POPUP=0, HOMESCREEN_OVERLAY=1, APPS=2, HOMESCREEN=3 + if (layer >= 0 && layer < WINDOWMANAGER_LAYER_NUM) { + /* hide target layer */ + m_showLayers[layer] = 0; + + if (layer == WINDOWMANAGER_LAYER_APPLICATIONS) { + /* clear pending flag */ + m_pending_to_show = -1; + } else if (m_pending_to_show != -1) { + /* there is a pending application to show */ + showAppLayer(m_pending_to_show); + return; + } + + t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM]; + int num_layers = getLayerRenderOrder(renderOrder); + ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers); + ilm_commitChanges(); } - ilm_commitChanges(); #endif } @@ -639,22 +763,57 @@ void WindowManager::showLayer(int layer) qDebug("layer %d", layer); #ifdef HAVE_IVI_LAYERMANAGEMENT_API - if (0 == layer) - { - ilm_layerSetVisibility(WINDOWMANAGER_LAYER_POPUP, ILM_TRUE); - } - if (1 == layer) - { - ilm_layerSetVisibility(WINDOWMANAGER_LAYER_HOMESCREEN_OVERLAY, ILM_TRUE); + // POPUP=0, HOMESCREEN_OVERLAY=1, APPS=2, HOMESCREEN=3 + if (layer >= 0 && layer < WINDOWMANAGER_LAYER_NUM) { + static const int layer_id_array[] = { + WINDOWMANAGER_LAYER_POPUP, + WINDOWMANAGER_LAYER_HOMESCREEN_OVERLAY, + WINDOWMANAGER_LAYER_APPLICATIONS, + WINDOWMANAGER_LAYER_HOMESCREEN, + }; + + m_showLayers[layer] = layer_id_array[layer]; + + t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM]; + int num_layers = getLayerRenderOrder(renderOrder); + ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers); + ilm_commitChanges(); } - if (2 == layer) - { - ilm_layerSetVisibility(WINDOWMANAGER_LAYER_APPLICATIONS, ILM_TRUE); +#endif +} + +void WindowManager::showAppLayer(int pid) +{ + qDebug("-=[showAppLayer]=-"); + qDebug("pid %d", pid); + + if (pid == -1) { + /* nothing to show */ + return; } - if (3 == layer) - { - ilm_layerSetVisibility(WINDOWMANAGER_LAYER_HOMESCREEN, ILM_TRUE); +#ifdef HAVE_IVI_LAYERMANAGEMENT_API + + /* clear pending flag */ + m_pending_to_show = -1; + + /* search layer id for application to show */ + QMap::const_iterator i = m_appLayers.find(pid); + + if (i != m_appLayers.end()) { + m_showLayers[2] = m_appLayers.value(pid); + qDebug("Found layer(%d) to show for app(pid=%d)", m_showLayers[2], pid); + } else { + /* Probably app layer hasn't been made yet */ + m_pending_to_show = pid; + /* hide current app once, back to default screen */ + m_showLayers[2] = 0; + + qDebug("No layer to show for app(pid=%d)", pid); } + t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM]; + + int num_layers = getLayerRenderOrder(renderOrder); + ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers); ilm_commitChanges(); #endif }