Index: containments/desktop/plugins/folder/autotests/foldermodeltest.cpp =================================================================== --- containments/desktop/plugins/folder/autotests/foldermodeltest.cpp +++ containments/desktop/plugins/folder/autotests/foldermodeltest.cpp @@ -31,6 +31,11 @@ static const QLatin1String desktop(QLatin1String("Desktop")); +static QUrl stringToUrl(const QString &path) +{ + return QUrl::fromUserInput(path, {}, QUrl::AssumeLocalFile); +} + void FolderModelTest::createTestFolder(const QString &path) { QDir dir(m_folderDir->path()); @@ -268,36 +273,37 @@ void FolderModelTest::tst_multiScreen() { delete m_folderModel; - // Custom instance for this test to set screen mapper before marking component + // Custom instance for this test to set used by containment before marking component // as complete. m_folderModel = new FolderModel(this); m_folderModel->classBegin(); m_folderModel->setUrl(m_folderDir->path() + QDir::separator() + desktop ); - auto *screenMapper = ScreenMapper::instance(); m_folderModel->setUsedByContainment(true); m_folderModel->setScreen(0); m_folderModel->componentComplete(); + auto *screenMapper = ScreenMapper::instance(); + QSignalSpy s(m_folderModel, &FolderModel::listingCompleted); - s.wait(1000); + QVERIFY(s.wait(1000)); const auto count = m_folderModel->rowCount(); for (int i = 0; i < count; i++) { const auto index = m_folderModel->index(i, 0); - const auto name = index.data(FolderModel::UrlRole).toString(); + const auto name = index.data(FolderModel::UrlRole).toUrl(); // all items are on the first screen by default QCOMPARE(screenMapper->screenForItem(name), 0); } // move one file to a new screen - const auto movedItem = m_folderModel->index(0, 0).data(FolderModel::UrlRole).toString(); + const auto movedItem = m_folderModel->index(0, 0).data(FolderModel::UrlRole).toUrl(); FolderModel secondFolderModel; secondFolderModel.classBegin(); secondFolderModel.setUrl(m_folderDir->path() + QDir::separator() + desktop ); secondFolderModel.setUsedByContainment(true); secondFolderModel.setScreen(1); secondFolderModel.componentComplete(); QSignalSpy s2(&secondFolderModel, &FolderModel::listingCompleted); - s2.wait(1000); + QVERIFY(s2.wait(1000)); const auto count2 = secondFolderModel.rowCount(); QCOMPARE(count2, 0); @@ -309,23 +315,23 @@ // we have one less item QCOMPARE(m_folderModel->rowCount(), count - 1); QCOMPARE(secondFolderModel.rowCount(), 1); - QCOMPARE(secondFolderModel.index(0,0).data(FolderModel::UrlRole).toString(), movedItem); + QCOMPARE(secondFolderModel.index(0,0).data(FolderModel::UrlRole).toUrl(), movedItem); QCOMPARE(screenMapper->screenForItem(movedItem), 1); // remove extra screen, we have all items back - screenMapper->removeScreen(1, m_folderModel->url()); + screenMapper->removeScreen(1, stringToUrl(m_folderModel->url())); s.wait(500); QCOMPARE(m_folderModel->rowCount(), count); QCOMPARE(secondFolderModel.rowCount(), 0); QCOMPARE(screenMapper->screenForItem(movedItem), 0); // add back extra screen, the item is moved there - screenMapper->addScreen(1, m_folderModel->url()); + screenMapper->addScreen(1, stringToUrl(m_folderModel->url())); s.wait(500); s2.wait(500); QCOMPARE(m_folderModel->rowCount(), count - 1); QCOMPARE(secondFolderModel.rowCount(), 1); - QCOMPARE(secondFolderModel.index(0,0).data(FolderModel::UrlRole).toString(), movedItem); + QCOMPARE(secondFolderModel.index(0,0).data(FolderModel::UrlRole).toUrl(), movedItem); QCOMPARE(screenMapper->screenForItem(movedItem), 1); // create a new item, it appears on the first screen @@ -336,7 +342,7 @@ s.wait(1000); QCOMPARE(m_folderModel->rowCount(), count); QCOMPARE(secondFolderModel.rowCount(), 1); - QCOMPARE(screenMapper->screenForItem("file://" + dir.path()), 0); + QCOMPARE(screenMapper->screenForItem(stringToUrl("file://" + dir.path())), 0); } void FolderModelTest::tst_multiScreenDifferenPath() Index: containments/desktop/plugins/folder/autotests/positionertest.cpp =================================================================== --- containments/desktop/plugins/folder/autotests/positionertest.cpp +++ containments/desktop/plugins/folder/autotests/positionertest.cpp @@ -270,7 +270,7 @@ verifyMapping(secondPositioner.proxyToSourceMapping(), expectedProxy2SourceScreen1); verifyMapping(secondPositioner.sourceToProxyMapping(), expectedSource2ProxyScreen1); - const auto movedItem = m_folderModel->index(1, 0).data(FolderModel::UrlRole).toString(); + const auto movedItem = m_folderModel->index(1, 0).data(FolderModel::UrlRole).toUrl(); // move the item 1 from source (now in position 2) to the second screen screenMapper->addMapping(movedItem, 1); Index: containments/desktop/plugins/folder/autotests/screenmappertest.h =================================================================== --- containments/desktop/plugins/folder/autotests/screenmappertest.h +++ containments/desktop/plugins/folder/autotests/screenmappertest.h @@ -42,7 +42,7 @@ void tst_addRemoveScreenDifferentPaths(); private: - void addScreens(const QString &path); + void addScreens(const QUrl &path); ScreenMapper *m_screenMapper; }; Index: containments/desktop/plugins/folder/autotests/screenmappertest.cpp =================================================================== --- containments/desktop/plugins/folder/autotests/screenmappertest.cpp +++ containments/desktop/plugins/folder/autotests/screenmappertest.cpp @@ -28,6 +28,11 @@ QTEST_MAIN(ScreenMapperTest) +static QUrl stringToUrl(const QString &path) +{ + return QUrl::fromUserInput(path, {}, QUrl::AssumeLocalFile); +} + void ScreenMapperTest::initTestCase() { m_screenMapper = ScreenMapper::instance(); @@ -40,7 +45,7 @@ void ScreenMapperTest::tst_addScreens() { - const auto path = QStringLiteral("desktop:/"); + const auto path = stringToUrl(QStringLiteral("desktop:/")); QSignalSpy s(m_screenMapper, &ScreenMapper::screensChanged); m_screenMapper->addScreen(-1, path); QCOMPARE(s.count(), 0); @@ -55,7 +60,7 @@ void ScreenMapperTest::tst_removeScreens() { - const auto path = QStringLiteral("desktop:/"); + const auto path = stringToUrl(QStringLiteral("desktop:/")); addScreens(path); QSignalSpy s(m_screenMapper, &ScreenMapper::screensChanged); m_screenMapper->removeScreen(-1, path); @@ -74,41 +79,41 @@ void ScreenMapperTest::tst_addMapping() { - const auto path = QStringLiteral("desktop:/"); + const auto path = stringToUrl(QStringLiteral("desktop:/")); addScreens(path); QSignalSpy s(m_screenMapper, &ScreenMapper::screenMappingChanged); QString file("desktop:/foo%1.txt"); for (int i = 0 ; i < 3; i++) { - const QString name = file.arg(i); - m_screenMapper->addMapping(name, i); + const QUrl url = stringToUrl(file.arg(i)); + m_screenMapper->addMapping(url, i); QCOMPARE(s.count(), i + 1); - QCOMPARE(m_screenMapper->screenForItem(name), i); + QCOMPARE(m_screenMapper->screenForItem(url), i); } } void ScreenMapperTest::tst_addRemoveScreenWithItems() { - const auto path = QStringLiteral("desktop:/"); + const auto path = stringToUrl(QStringLiteral("desktop:/")); addScreens(path); QString file("desktop:/foo%1.txt"); for (int i = 0 ; i < 3; i++) { - const QString name = file.arg(i); - m_screenMapper->addMapping(name, i); + const QUrl url = stringToUrl(file.arg(i)); + m_screenMapper->addMapping(url, i); } // remove one screen m_screenMapper->removeScreen(1, path); - QCOMPARE(m_screenMapper->screenForItem(file.arg(0)), 0); - QCOMPARE(m_screenMapper->screenForItem(file.arg(1)), -1); - QCOMPARE(m_screenMapper->screenForItem(file.arg(2)), 2); + QCOMPARE(m_screenMapper->screenForItem(stringToUrl(file.arg(0))), 0); + QCOMPARE(m_screenMapper->screenForItem(stringToUrl(file.arg(1))), -1); + QCOMPARE(m_screenMapper->screenForItem(stringToUrl(file.arg(2))), 2); // add removed screen back, items screen is restored m_screenMapper->addScreen(1, path); - QCOMPARE(m_screenMapper->screenForItem(file.arg(0)), 0); - QCOMPARE(m_screenMapper->screenForItem(file.arg(1)), 1); - QCOMPARE(m_screenMapper->screenForItem(file.arg(2)), 2); + QCOMPARE(m_screenMapper->screenForItem(stringToUrl(file.arg(0))), 0); + QCOMPARE(m_screenMapper->screenForItem(stringToUrl(file.arg(1))), 1); + QCOMPARE(m_screenMapper->screenForItem(stringToUrl(file.arg(2))), 2); // remove all screens, firstAvailableScreen changes m_screenMapper->removeScreen(0, path); @@ -119,18 +124,18 @@ QCOMPARE(m_screenMapper->firstAvailableScreen(path), -1); - QCOMPARE(m_screenMapper->screenForItem(file.arg(0)), -1); - QCOMPARE(m_screenMapper->screenForItem(file.arg(1)), -1); - QCOMPARE(m_screenMapper->screenForItem(file.arg(2)), -1); + QCOMPARE(m_screenMapper->screenForItem(stringToUrl(file.arg(0))), -1); + QCOMPARE(m_screenMapper->screenForItem(stringToUrl(file.arg(1))), -1); + QCOMPARE(m_screenMapper->screenForItem(stringToUrl(file.arg(2))), -1); // add all screens back, all item's screen is restored addScreens(path); - QCOMPARE(m_screenMapper->screenForItem(file.arg(0)), 0); - QCOMPARE(m_screenMapper->screenForItem(file.arg(1)), 1); - QCOMPARE(m_screenMapper->screenForItem(file.arg(2)), 2); + QCOMPARE(m_screenMapper->screenForItem(stringToUrl(file.arg(0))), 0); + QCOMPARE(m_screenMapper->screenForItem(stringToUrl(file.arg(1))), 1); + QCOMPARE(m_screenMapper->screenForItem(stringToUrl(file.arg(2))), 2); // remove one screen and move its item - const QString movedItem = file.arg(1); + const QUrl movedItem = stringToUrl(file.arg(1)); m_screenMapper->removeScreen(1, path); QCOMPARE(m_screenMapper->screenForItem(movedItem), -1); m_screenMapper->addMapping(movedItem, 0); @@ -143,15 +148,15 @@ void ScreenMapperTest::tst_addRemoveScreenDifferentPaths() { - const auto path = QStringLiteral("desktop:/Foo"); - const auto path2 = QStringLiteral("desktop:/Foo2"); + const auto path = stringToUrl(QStringLiteral("desktop:/Foo")); + const auto path2 = stringToUrl(QStringLiteral("desktop:/Foo2")); m_screenMapper->addScreen(0, path); QCOMPARE(m_screenMapper->firstAvailableScreen(path), 0); QCOMPARE(m_screenMapper->firstAvailableScreen(path2), -1); } -void ScreenMapperTest::addScreens(const QString &path) +void ScreenMapperTest::addScreens(const QUrl &path) { m_screenMapper->addScreen(0, path); m_screenMapper->addScreen(1, path); Index: containments/desktop/plugins/folder/foldermodel.cpp =================================================================== --- containments/desktop/plugins/folder/foldermodel.cpp +++ containments/desktop/plugins/folder/foldermodel.cpp @@ -208,7 +208,7 @@ // disconnect so we don't handle signals from the screen mapper when // removeScreen is called m_screenMapper->disconnect(this); - m_screenMapper->removeScreen(m_screen, url()); + m_screenMapper->removeScreen(m_screen, QUrl::fromUserInput(url(), {}, QUrl::AssumeLocalFile)); } } @@ -267,7 +267,7 @@ void FolderModel::newFileMenuItemCreated(const QUrl &url) { if (m_usedByContainment) { - m_screenMapper->addMapping(url.toString(), m_screen, ScreenMapper::DelayedSignal); + m_screenMapper->addMapping(url, m_screen, ScreenMapper::DelayedSignal); m_dropTargetPositions.insert(url.fileName(), m_menuPosition); m_menuPosition = {}; m_dropTargetPositionsCleanup->start(); @@ -288,7 +288,7 @@ return; } - const auto oldUrl = m_url; + const auto oldUrl = QUrl::fromUserInput(m_url, {}, QUrl::AssumeLocalFile); beginResetModel(); m_url = url; @@ -324,7 +324,7 @@ if (m_usedByContainment) { m_screenMapper->removeScreen(m_screen, oldUrl); - m_screenMapper->addScreen(m_screen, url); + m_screenMapper->addScreen(m_screen, QUrl::fromUserInput(m_url, {}, QUrl::AssumeLocalFile)); } } @@ -630,7 +630,7 @@ m_screen = screen; if (m_usedByContainment) { - m_screenMapper->addScreen(screen, url()); + m_screenMapper->addScreen(screen, QUrl::fromUserInput(m_url, {}, QUrl::AssumeLocalFile)); } emit screenChanged(); } @@ -1059,16 +1059,16 @@ * use a fancy scheme like desktop:/ instead. Ensure we always use the latter to properly map URLs, * i.e. go from file:///home/user/Desktop/file to desktop:/file */ - auto mappableUrl = [this, dropTargetFolderUrl](const QUrl &url) -> QString { + auto mappableUrl = [this, dropTargetFolderUrl](const QUrl &url) -> QUrl { QString mappedUrl = url.toString(); if (dropTargetFolderUrl != m_dirModel->dirLister()->url()) { const auto local = dropTargetFolderUrl.toString(); const auto internal = m_dirModel->dirLister()->url().toString(); if (mappedUrl.startsWith(local)) { mappedUrl.replace(0, local.size(), internal); } } - return mappedUrl; + return QUrl::fromUserInput(mappedUrl, {}, QUrl::AssumeLocalFile); }; const int x = dropEvent->property("x").toInt(); @@ -1169,15 +1169,15 @@ QUrl url = QUrl::fromUserInput(m_url, {}, QUrl::AssumeLocalFile); // if the folderview's folder is a standard path, just use the targetUrl for mapping if (targetUrl.toString().startsWith(url.toString())) { - m_screenMapper->addMapping(targetUrl.toString(), m_screen, ScreenMapper::DelayedSignal); + m_screenMapper->addMapping(targetUrl, m_screen, ScreenMapper::DelayedSignal); } else if (targetUrl.toString().startsWith(dropTargetUrl.toString())) { // if the folderview's folder is a special path, like desktop:// , we need to convert // the targetUrl file:// path to a desktop:/ path for mapping auto destPath = dropTargetUrl.path(); auto filePath = targetUrl.path(); if (filePath.startsWith(destPath)) { url.setPath(filePath.remove(0, destPath.length())); - m_screenMapper->addMapping(url.toString(), m_screen, ScreenMapper::DelayedSignal); + m_screenMapper->addMapping(url, m_screen, ScreenMapper::DelayedSignal); } } } @@ -1372,7 +1372,7 @@ void FolderModel::evictFromIsDirCache(const KFileItemList& items) { foreach (const KFileItem &item, items) { - m_screenMapper->removeFromMap(item.url().toString()); + m_screenMapper->removeFromMap(item.url()); m_isDirCache.remove(item.url()); } } @@ -1498,16 +1498,17 @@ const KFileItem item = dirModel->itemForIndex(dirModel->index(sourceRow, KDirModel::Name, sourceParent)); if (m_usedByContainment) { - const QString name = item.url().toString(); - const int screen = m_screenMapper->screenForItem(name); + const QUrl url = item.url(); + const int screen = m_screenMapper->screenForItem(url); // don't do anything if the folderview is not associated with a screen if (m_screen != -1) { if (screen == -1) { // The item is not associated with a screen, probably because this is the first // time we see it or the folderview was previously used as a regular applet. // Associated with this folderview if the view is on the first available screen - if (m_screen == m_screenMapper->firstAvailableScreen(url())) { - m_screenMapper->addMapping(name, m_screen, ScreenMapper::DelayedSignal); + if (m_screen == m_screenMapper->firstAvailableScreen(QUrl::fromUserInput(m_url, + {}, QUrl::AssumeLocalFile))) { + m_screenMapper->addMapping(url, m_screen, ScreenMapper::DelayedSignal); } else { return false; } Index: containments/desktop/plugins/folder/screenmapper.h =================================================================== --- containments/desktop/plugins/folder/screenmapper.h +++ containments/desktop/plugins/folder/screenmapper.h @@ -50,15 +50,15 @@ QStringList screenMapping() const; void setScreenMapping(const QStringList &mapping); - int screenForItem(const QString &name) const; - void addMapping(const QString &name, int screen, MappingSignalBehavior behavior = ImmediateSignal); - void removeFromMap(const QString &name); + int screenForItem(const QUrl &url) const; + void addMapping(const QUrl &url, int screen, MappingSignalBehavior behavior = ImmediateSignal); + void removeFromMap(const QUrl &url); void setCorona(Plasma::Corona *corona); - void addScreen(int screenId, const QString &path); - void removeScreen(int screenId, const QString &path); - int firstAvailableScreen(const QString &path) const; - void removeItemFromDisabledScreen(const QString &name); + void addScreen(int screenId, const QUrl &screenUrl); + void removeScreen(int screenId, const QUrl &screenUrl); + int firstAvailableScreen(const QUrl &screenUrl) const; + void removeItemFromDisabledScreen(const QUrl &url); #ifdef BUILD_TESTING void cleanup(); @@ -71,10 +71,10 @@ private: ScreenMapper(QObject *parent = nullptr); - QHash m_screenItemMap; - QHash m_itemsOnDisabledScreensMap; - QHash m_firstScreenForPath; // first available screen for a path - QHash m_screensPerPath; // screen per registered path + QHash m_screenItemMap; + QHash > m_itemsOnDisabledScreensMap; + QHash m_firstScreenForPath; // first available screen for a path + QHash m_screensPerPath; // screen per registered path QVector m_availableScreens; Plasma::Corona *m_corona = nullptr; QTimer *m_screenMappingChangedTimer = nullptr; Index: containments/desktop/plugins/folder/screenmapper.cpp =================================================================== --- containments/desktop/plugins/folder/screenmapper.cpp +++ containments/desktop/plugins/folder/screenmapper.cpp @@ -46,34 +46,33 @@ m_screenMappingChangedTimer->setSingleShot(true); } -void ScreenMapper::removeScreen(int screenId, const QString &path) +void ScreenMapper::removeScreen(int screenId, const QUrl &screenUrl) { if (screenId < 0 || !m_availableScreens.contains(screenId)) return; - QUrl screenUrl = QUrl::fromUserInput(path, {}, QUrl::AssumeLocalFile); const auto screenPathWithScheme = screenUrl.url(); // store the original location for the items auto it = m_screenItemMap.constBegin(); while (it != m_screenItemMap.constEnd()) { const auto name = it.key(); - if (it.value() == screenId && name.startsWith(screenPathWithScheme)) { + if (it.value() == screenId && name.url().startsWith(screenPathWithScheme)) { m_itemsOnDisabledScreensMap[screenId].append(name); } ++it; } m_availableScreens.removeAll(screenId); const auto newFirstScreen = std::min_element(m_availableScreens.constBegin(), m_availableScreens.constEnd()); - auto pathIt = m_screensPerPath.find(path); + auto pathIt = m_screensPerPath.find(screenUrl); if (pathIt != m_screensPerPath.end() && pathIt.value() > 0) { - int firstScreen = m_firstScreenForPath.value(path, -1); + int firstScreen = m_firstScreenForPath.value(screenUrl, -1); if (firstScreen == screenId) { - m_firstScreenForPath[path] = (newFirstScreen == m_availableScreens.constEnd()) ? -1 : *newFirstScreen; + m_firstScreenForPath[screenUrl] = (newFirstScreen == m_availableScreens.constEnd()) ? -1 : *newFirstScreen; } *pathIt = pathIt.value() - 1; - } else if (path.isEmpty()) { + } else if (screenUrl.isEmpty()) { // The screen got completely removed, not only its path changed. // If the removed screen was the first screen for a desktop path, the first screen for that path // needs to be updated. @@ -93,22 +92,21 @@ emit screensChanged(); } -void ScreenMapper::addScreen(int screenId, const QString &path) +void ScreenMapper::addScreen(int screenId, const QUrl &screenUrl) { if (screenId < 0 || m_availableScreens.contains(screenId)) return; - QUrl screenUrl = QUrl::fromUserInput(path, {}, QUrl::AssumeLocalFile); const auto screenPathWithScheme = screenUrl.url(); - const bool isEmpty = (path.isEmpty() || screenUrl.path() == "/"); + const bool isEmpty = (screenUrl.isEmpty() || screenUrl.path() == "/"); // restore the stored locations auto it = m_itemsOnDisabledScreensMap.find(screenId); if (it != m_itemsOnDisabledScreensMap.end()) { auto items = it.value(); for (const auto &name: it.value()) { // add the items to the new screen, if they are on a disabled screen and their // location is below the new screen's path - if (isEmpty || name.startsWith(screenPathWithScheme)) { + if (isEmpty || name.url().startsWith(screenPathWithScheme)) { addMapping(name, screenId, DelayedSignal); items.removeAll(name); } @@ -123,49 +121,49 @@ m_availableScreens.append(screenId); // path is empty when a new screen appears that has no folderview base path associated with - if (!path.isEmpty()) { - auto it = m_screensPerPath.find(path); - int firstScreen = m_firstScreenForPath.value(path, -1); + if (!screenUrl.isEmpty()) { + auto it = m_screensPerPath.find(screenUrl); + int firstScreen = m_firstScreenForPath.value(screenUrl, -1); if (firstScreen == -1 || screenId < firstScreen) { - m_firstScreenForPath[path] = screenId; + m_firstScreenForPath[screenUrl] = screenId; } if (it == m_screensPerPath.end()) { - m_screensPerPath[path] = 1; + m_screensPerPath[screenUrl] = 1; } else { *it = it.value() + 1; } } emit screensChanged(); } -void ScreenMapper::addMapping(const QString &name, int screen, MappingSignalBehavior behavior) +void ScreenMapper::addMapping(const QUrl &url, int screen, MappingSignalBehavior behavior) { - m_screenItemMap[name] = screen; + m_screenItemMap[url] = screen; if (behavior == DelayedSignal) { m_screenMappingChangedTimer->start(); } else { emit screenMappingChanged(); } } -void ScreenMapper::removeFromMap(const QString &name) +void ScreenMapper::removeFromMap(const QUrl &url) { - m_screenItemMap.remove(name); + m_screenItemMap.remove(url); m_screenMappingChangedTimer->start(); } -int ScreenMapper::firstAvailableScreen(const QString &path) const +int ScreenMapper::firstAvailableScreen(const QUrl &screenUrl) const { - return m_firstScreenForPath.value(path, -1); + return m_firstScreenForPath.value(screenUrl, -1); } -void ScreenMapper::removeItemFromDisabledScreen(const QString &name) +void ScreenMapper::removeItemFromDisabledScreen(const QUrl &url) { for (auto it = m_itemsOnDisabledScreensMap.begin(); it != m_itemsOnDisabledScreensMap.end(); ++it) { - auto names = &(*it); - names->removeAll(name); + auto urls = &(*it); + urls->removeAll(url); } } @@ -203,7 +201,7 @@ result.reserve(m_screenItemMap.count() * 2); auto it = m_screenItemMap.constBegin(); while (it != m_screenItemMap.constEnd()) { - result.append(it.key()); + result.append(it.key().toString()); result.append(QString::number(it.value())); ++it; } @@ -213,12 +211,13 @@ void ScreenMapper::setScreenMapping(const QStringList &mapping) { - QHash newMap; + QHash newMap; const int count = mapping.count(); newMap.reserve(count / 2); for (int i = 0; i < count - 1; i += 2) { if (i + 1 < count) { - newMap[mapping[i]] = mapping[i + 1].toInt(); + const QUrl url = QUrl::fromUserInput(mapping[i], {}, QUrl::AssumeLocalFile); + newMap[url] = mapping[i + 1].toInt(); } } @@ -228,9 +227,9 @@ } } -int ScreenMapper::screenForItem(const QString &name) const +int ScreenMapper::screenForItem(const QUrl &url) const { - int screen = m_screenItemMap.value(name, -1); + int screen = m_screenItemMap.value(url, -1); if (!m_availableScreens.contains(screen)) screen = -1;