diff options
Diffstat (limited to 'windowmanager/src/windowmanager.cpp')
-rw-r--r-- | windowmanager/src/windowmanager.cpp | 139 |
1 files changed, 111 insertions, 28 deletions
diff --git a/windowmanager/src/windowmanager.cpp b/windowmanager/src/windowmanager.cpp index ea5a279..588f7d4 100644 --- a/windowmanager/src/windowmanager.cpp +++ b/windowmanager/src/windowmanager.cpp @@ -54,10 +54,11 @@ WindowManager::WindowManager(int displayId, QObject *parent) : mp_layoutAreaToSurfaceIdAssignment(0), m_currentLayout(-1), m_screenId(displayId), - m_screenWidth(0), - m_screenHeight(0) + m_screen() #ifdef HAVE_IVI_LAYERMANAGEMENT_API , + m_layerSrc(0, 0, WINDOWMANAGER_HOMESCREEN_WIDTH, WINDOWMANAGER_HOMESCREEN_HEIGHT), + m_layerDest(), m_appSurfaces(), m_appLayers(), #if !defined(NO_PROCESS_GROUP) || !defined(NO_PROCESS_SESSION) @@ -99,7 +100,18 @@ void WindowManager::start() myThis = this; - ilm_getScreenResolution(m_screenId, &m_screenWidth, &m_screenHeight); + t_ilm_uint width, height; + ilm_getScreenResolution(m_screenId, &width, &height); + m_screen.setWidth(width); + m_screen.setHeight(height); + + const char *mode = secure_getenv("CONTENT_MODE"); + if (!mode) { + qDebug("CONTENT_MODE not specified. Falling back to aspect-fit"); + mode = "aspect-fit"; + } + + setRootGeometry(mode); createNewLayer(WINDOWMANAGER_LAYER_POPUP); createNewLayer(WINDOWMANAGER_LAYER_HOMESCREEN_OVERLAY); @@ -207,26 +219,101 @@ void WindowManager::createNewLayer(int layerId) qDebug(" layerId %d", layerId); t_ilm_layer newLayerId = layerId; + + // Currently the dimension of layer for apps inherits the root layer's. ilm_layerCreateWithDimension(&newLayerId, - WINDOWMANAGER_HOMESCREEN_WIDTH, - WINDOWMANAGER_HOMESCREEN_HEIGHT); + m_layerSrc.width(), + m_layerSrc.height()); ilm_commitChanges(); ilm_layerSetSourceRectangle(newLayerId, - 0, - 0, - WINDOWMANAGER_HOMESCREEN_WIDTH, - WINDOWMANAGER_HOMESCREEN_HEIGHT); + m_layerSrc.x(), + m_layerSrc.y(), + m_layerSrc.width(), + m_layerSrc.height()); + ilm_layerSetDestinationRectangle(newLayerId, - 0, - 0, - m_screenWidth, - m_screenHeight); + m_layerDest.x(), + m_layerDest.y(), + m_layerDest.width(), + m_layerDest.height()); ilm_commitChanges(); ilm_layerSetOpacity(newLayerId, 1.0); ilm_layerSetVisibility(newLayerId, ILM_TRUE); ilm_commitChanges(); } + +void WindowManager::setRootGeometry(const char *mode) +{ + // To calculate layer management parameters + + // Calcurate parameters based on the content mode id given + // May return false if parameter check, etc. fails (currently not done). + + if (!strcmp("scale-to-fill", mode)) { + // scale, ignore aspect ratio + m_layerDest.setRect(0, 0, m_screen.width(), m_screen.height()); + } + else if (!strcmp("aspect-fit", mode) || !strcmp("aspect-fill", mode)) { + // scale, keeping aspect ratio + QSize size = m_layerSrc.size(); + + if (!strcmp("aspect-fit", mode)) { + size.scale(m_screen, Qt::KeepAspectRatio); + } else { + size.scale(m_screen, Qt::KeepAspectRatioByExpanding); + } + + m_layerDest.setSize(size); + m_layerDest.moveCenter(QPoint(m_screen.width() / 2, m_screen.height() / 2)); + } + else { + // other modes without scaling + m_layerDest.setSize(m_layerSrc.size()); + + // At first, move to center, then move to proper position + m_layerDest.moveCenter(QPoint(m_screen.width() / 2, m_screen.height() / 2)); + + if (!strcmp("center", mode)) { + ; + } + else if (!strcmp("top", mode)) { + m_layerDest.moveTop(0); + } + else if (!strcmp("bottom", mode)) { + m_layerDest.moveBottom(m_screen.height()); + } + else if (!strcmp("left", mode)) { + m_layerDest.moveLeft(0); + } + else if (!strcmp("right", mode)) { + m_layerDest.moveRight(m_screen.width()); + } + else if (!strcmp("top-left", mode)) { + m_layerDest.moveTo(0,0); + } + else if (!strcmp("top-right", mode)) { + m_layerDest.moveTopRight(QPoint(m_screen.width(), 0)); + } + else if (!strcmp("bottom-left", mode)) { + m_layerDest.moveBottomLeft(QPoint(0, m_screen.height())); + } + else if (!strcmp("bottom-right", mode)) { + m_layerDest.moveBottomRight(QPoint(m_screen.width(), m_screen.height())); + } + else { + // fallback + qDebug("Mode \"%s\" not known, fallingback to aspect-fit", mode); + setRootGeometry("aspect-fit"); + return; + } + } + + qDebug("layer src=%dx%d dest=(%d,%d) %dx%d", + m_layerSrc.width(), m_layerSrc.height(), + m_layerDest.x(), m_layerDest.y(), m_layerDest.width(), m_layerDest.height()); +} + t_ilm_layer WindowManager::getAppLayerID(pid_t pid) { t_ilm_layer layer_id; @@ -264,9 +351,7 @@ void WindowManager::addSurface(t_ilm_surface surfaceId) t_ilm_layer WindowManager::addSurfaceToAppLayer(pid_t pid, int surfaceId) { - struct ilmSurfaceProperties surfaceProperties; t_ilm_layer layer_id; - int found = 0; qDebug("-=[addSurfaceToAppLayer]=-"); qDebug(" surfaceId %d", surfaceId); @@ -330,7 +415,7 @@ void WindowManager::addSurfaceToLayer(int surfaceId, int layerId) ilm_commitChanges(); } -void WindowManager::configureHomeScreenMainSurface(t_ilm_surface surface, t_ilm_int width, t_ilm_int height) +void WindowManager::configureHomeScreenMainSurface(t_ilm_surface surface, t_ilm_uint width, t_ilm_uint height) { // homescreen app always fullscreen in the back ilm_surfaceSetDestinationRectangle(surface, 0, 0, @@ -343,7 +428,7 @@ void WindowManager::configureHomeScreenMainSurface(t_ilm_surface surface, t_ilm_ ilm_commitChanges(); } -void WindowManager::configureAppSurface(pid_t pid, t_ilm_surface surface, t_ilm_int width, t_ilm_int height) +void WindowManager::configureAppSurface(t_ilm_surface surface, t_ilm_uint width, t_ilm_uint height) { /* Dirty hack! cut & paste from HomeScreen/src/layouthandler.cpp */ const int SCREEN_WIDTH = 1080; @@ -354,15 +439,15 @@ void WindowManager::configureAppSurface(pid_t pid, t_ilm_surface surface, t_ilm_ 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); + const t_ilm_int APPAREA_X = TOPAREA_X; + const t_ilm_int APPAREA_Y = TOPAREA_Y + TOPAREA_HEIGHT; + const t_ilm_uint APPAREA_WIDTH = TOPAREA_WIDTH; + const t_ilm_uint APPAREA_HEIGHT = MEDIAAREA_Y - APPAREA_Y; + + ilm_surfaceSetDestinationRectangle(surface, APPAREA_X, APPAREA_Y, + APPAREA_WIDTH, APPAREA_HEIGHT); ilm_surfaceSetSourceRectangle(surface, 0, 0, width, height); ilm_surfaceSetOpacity(surface, 1.0); ilm_surfaceSetVisibility(surface, ILM_TRUE); /* Hack to avoid blank screen when switch apps */ @@ -395,8 +480,6 @@ void WindowManager::notificationFunc_non_static(ilmObjectType object, qDebug("Notification from weston!"); if (ILM_SURFACE == object) { - struct ilmSurfaceProperties surfaceProperties; - if (created) { if (WINDOWMANAGER_HOMESCREEN_MAIN_SURFACE_ID == id) @@ -429,7 +512,7 @@ void WindowManager::notificationFunc_non_static(ilmObjectType object, void WindowManager::notificationFunc_static(ilmObjectType object, t_ilm_uint id, t_ilm_bool created, - void* user_data) + void*) { static_cast<WindowManager*>(WindowManager::myThis)->notificationFunc_non_static(object, id, created); } @@ -490,7 +573,7 @@ void WindowManager::surfaceCallbackFunction_non_static(t_ilm_surface surface, t_ilm_layer layer = addSurfaceToAppLayer(pid, surface); if (layer != 0) { - configureAppSurface(pid, surface, + configureAppSurface(surface, surfaceProperties->origSourceWidth, surfaceProperties->origSourceHeight); |