/* * Copyright (C) 2013 Open Education Foundation * * Copyright (C) 2010-2013 Groupement d'Intérêt Public pour * l'Education Numérique en Afrique (GIP ENA) * * This file is part of OpenBoard. * * OpenBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3 of the License, * with a specific linking exception for the OpenSSL project's * "OpenSSL" library (or with modified versions of it that use the * same license as the "OpenSSL" library). * * OpenBoard is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenBoard. If not, see . */ #include "UBDisplayManager.h" #include "frameworks/UBPlatformUtils.h" #include "core/UBApplication.h" #include "core/UBApplicationController.h" #include "core/UBSettings.h" #include "board/UBBoardView.h" #include "board/UBBoardController.h" #include "gui/UBBlackoutWidget.h" #include "ui_blackoutWidget.h" #include "core/memcheck.h" #include "qdesktopwidget.h" UBDisplayManager::UBDisplayManager(QObject *parent) : QObject(parent) , mControlScreenIndex(-1) , mDisplayScreenIndex(-1) , mControlWidget(0) , mDisplayWidget(0) , mDesktopWidget(0) { mDesktop = qApp->desktop(); mUseMultiScreen = true; initScreenIndexes(); connect(mDesktop, &QDesktopWidget::resized, this, &UBDisplayManager::adjustScreens); connect(mDesktop, &QDesktopWidget::workAreaResized, this, &UBDisplayManager::adjustScreens); } void UBDisplayManager::initScreenIndexes() { int screenCount = numScreens(); mScreenIndexesRoles.clear(); if (screenCount > 0) { mControlScreenIndex = mDesktop->primaryScreen(); if (UBSettings::settings()->swapControlAndDisplayScreens->get().toBool()) { mControlScreenIndex = mControlScreenIndex^1; } mScreenIndexesRoles << Control; } else { mControlScreenIndex = -1; } if (screenCount > 1) { mDisplayScreenIndex = mControlScreenIndex != 0 ? 0 : 1; mScreenIndexesRoles << Display; } else { mDisplayScreenIndex = -1; } mPreviousScreenIndexes.clear(); if (screenCount > 2) { for(int i = 2; i < screenCount; i++) { if(mControlScreenIndex == i) mPreviousScreenIndexes.append(1); else mPreviousScreenIndexes.append(i); } } } UBDisplayManager::~UBDisplayManager() { // NOOP } int UBDisplayManager::numScreens() { if (mUseMultiScreen) { return mDesktop->numScreens(); } else { return 1; } } int UBDisplayManager::numPreviousViews() { return mPreviousScreenIndexes.size(); } void UBDisplayManager::setControlWidget(QWidget* pControlWidget) { if(hasControl() && pControlWidget && (pControlWidget != mControlWidget)) mControlWidget = pControlWidget; } void UBDisplayManager::setDesktopWidget(QWidget* pControlWidget ) { if(pControlWidget && (pControlWidget != mControlWidget)) mDesktopWidget = pControlWidget; } void UBDisplayManager::setDisplayWidget(QWidget* pDisplayWidget) { if(pDisplayWidget && (pDisplayWidget != mDisplayWidget)) { if (mDisplayWidget) { mDisplayWidget->hide(); pDisplayWidget->setGeometry(mDisplayWidget->geometry()); pDisplayWidget->setWindowFlags(mDisplayWidget->windowFlags()); } mDisplayWidget = pDisplayWidget; mDisplayWidget->setGeometry(mDesktop->screenGeometry(mDisplayScreenIndex)); if (UBSettings::settings()->appUseMultiscreen->get().toBool()) UBPlatformUtils::showFullScreen(mDisplayWidget); } } void UBDisplayManager::setPreviousDisplaysWidgets(QList pPreviousViews) { mPreviousDisplayWidgets = pPreviousViews; } QRect UBDisplayManager::controlGeometry() { return mDesktop->screenGeometry(mControlScreenIndex); } QRect UBDisplayManager::displayGeometry() { return mDesktop->screenGeometry(mDisplayScreenIndex); } void UBDisplayManager::reinitScreens(bool swap) { Q_UNUSED(swap); adjustScreens(-1); } void UBDisplayManager::adjustScreens(int screen) { Q_UNUSED(screen); initScreenIndexes(); positionScreens(); emit screenLayoutChanged(); } void UBDisplayManager::positionScreens() { if(mDesktopWidget && mControlScreenIndex > -1) { mDesktopWidget->hide(); mDesktopWidget->setGeometry(mDesktop->screenGeometry(mControlScreenIndex)); } if (mControlWidget && mControlScreenIndex > -1) { mControlWidget->hide(); mControlWidget->setGeometry(mDesktop->screenGeometry(mControlScreenIndex)); UBPlatformUtils::showFullScreen(mControlWidget); } if (mDisplayWidget && mDisplayScreenIndex > -1) { mDisplayWidget->hide(); mDisplayWidget->setGeometry(mDesktop->screenGeometry(mDisplayScreenIndex)); UBPlatformUtils::showFullScreen(mDisplayWidget); } else if(mDisplayWidget) { mDisplayWidget->hide(); } for (int wi = mPreviousScreenIndexes.size(); wi < mPreviousDisplayWidgets.size(); wi++) { mPreviousDisplayWidgets.at(wi)->hide(); } for (int psi = 0; psi < mPreviousScreenIndexes.size(); psi++) { if (mPreviousDisplayWidgets.size() > psi) { QWidget* previous = mPreviousDisplayWidgets.at(psi); previous->setGeometry(mDesktop->screenGeometry(mPreviousScreenIndexes.at(psi))); UBPlatformUtils::showFullScreen(previous); } } if (mControlWidget && mControlScreenIndex > -1) mControlWidget->activateWindow(); } void UBDisplayManager::blackout() { QList screenIndexes; if (mControlScreenIndex > -1) screenIndexes << mControlScreenIndex; if (mDisplayScreenIndex > -1) screenIndexes << mDisplayScreenIndex; screenIndexes << mPreviousScreenIndexes; for (int i = 0; i < screenIndexes.size(); i++) { int screenIndex = screenIndexes.at(i); UBBlackoutWidget *blackoutWidget = new UBBlackoutWidget(); //deleted in UBDisplayManager::unBlackout Ui::BlackoutWidget *blackoutUi = new Ui::BlackoutWidget(); blackoutUi->setupUi(blackoutWidget); connect(blackoutUi->iconButton, SIGNAL(pressed()), blackoutWidget, SLOT(doActivity())); connect(blackoutWidget, SIGNAL(activity()), this, SLOT(unBlackout())); // display Uniboard logo on main screen blackoutUi->iconButton->setVisible(screenIndex == mControlScreenIndex); blackoutUi->labelClickToReturn->setVisible(screenIndex == mControlScreenIndex); blackoutWidget->setGeometry(mDesktop->screenGeometry(screenIndex)); mBlackoutWidgets << blackoutWidget; } UBPlatformUtils::fadeDisplayOut(); foreach(UBBlackoutWidget *blackoutWidget, mBlackoutWidgets) { UBPlatformUtils::showFullScreen(blackoutWidget); } } void UBDisplayManager::unBlackout() { while (!mBlackoutWidgets.isEmpty()) { // the widget is also destroyed thanks to its Qt::WA_DeleteOnClose attribute mBlackoutWidgets.takeFirst()->close(); } UBPlatformUtils::fadeDisplayIn(); UBApplication::boardController->freezeW3CWidgets(false); } void UBDisplayManager::setRoleToScreen(DisplayRole role, int screenIndex) { Q_UNUSED(role); Q_UNUSED(screenIndex); } void UBDisplayManager::setUseMultiScreen(bool pUse) { mUseMultiScreen = pUse; }