Move panels and containments to the relevant screen on screen add/remove

This commit is contained in:
David Edmundson 2013-12-17 16:43:52 +01:00
parent 68d36e4e8c
commit 6fface8cd0

View File

@ -291,11 +291,29 @@ PanelView *ShellCorona::panelView(Plasma::Containment *containment) const
void ShellCorona::screenAdded(QScreen *screen)
{
DesktopView *view = new DesktopView(this, screen);
d->views << view;
view->show();
const QString currentActivity = d->activityController->currentActivity();
if (!d->views.isEmpty() && screen == QGuiApplication::primaryScreen()) {
DesktopView* oldPrimaryView = d->views.first();
QScreen* oldPrimaryScreen = oldPrimaryView->screen();
//move any panels that were preivously on the old primary screen to the new primary screen
foreach (PanelView *panelView, d->panelViews) {
if (oldPrimaryScreen==panelView->screen())
panelView->setScreen(screen);
}
Plasma::Containment* primaryContainment = oldPrimaryView->containment();
oldPrimaryView->setContainment(0);
view->setContainment(primaryContainment);
d->views.prepend(view);
view = oldPrimaryView;
} else {
d->views.append(view);
}
int screenNum = d->views.count()-1;
QString currentActivity = d->activityController->currentActivity();
Plasma::Containment *containment = d->desktopContainments[currentActivity][screenNum];
if(!containment) {
containment = createContainmentForActivity(currentActivity, screenNum);
@ -303,8 +321,10 @@ void ShellCorona::screenAdded(QScreen *screen)
view->setContainment(containment);
connect(screen, SIGNAL(destroyed(QObject*)), SLOT(screenRemoved(QObject*)));
view->show();
}
Plasma::Containment* ShellCorona::createContainmentForActivity(const QString& activity, int screenNum)
{
Plasma::Containment* containment = createContainment(d->desktopDefaultsConfig.readEntry("Containment", "org.kde.desktopcontainment"));
@ -315,6 +335,9 @@ Plasma::Containment* ShellCorona::createContainmentForActivity(const QString& ac
void ShellCorona::screenRemoved(QObject *screen)
{
qDebug() << "screen removed " << qobject_cast<QScreen*>(screen)->name();
//desktop containments
for (auto i = d->views.begin(); i != d->views.end() ; i++) {
if ((*i)->screen() == screen) {
(*i)->deleteLater();
@ -323,6 +346,11 @@ void ShellCorona::screenRemoved(QObject *screen)
break;
}
}
//move all panels on a deleted screen to the primary screen
foreach (PanelView *view, d->panelViews) {
view->setScreen(QGuiApplication::primaryScreen());
}
}
void ShellCorona::createWaitingPanels()