Plasma
desktopcorona.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "desktopcorona.h"
00021
00022 #include <QApplication>
00023 #include <QDesktopWidget>
00024 #include <QDir>
00025 #include <QGraphicsLayout>
00026
00027 #include <KDebug>
00028 #include <KDialog>
00029 #include <KGlobalSettings>
00030 #include <KStandardDirs>
00031
00032 #include <plasma/containment.h>
00033 #include <plasma/dataenginemanager.h>
00034
00035 DesktopCorona::DesktopCorona(QObject *parent)
00036 : Plasma::Corona(parent)
00037 {
00038 init();
00039 }
00040
00041 void DesktopCorona::init()
00042 {
00043 QDesktopWidget *desktop = QApplication::desktop();
00044 m_numScreens = desktop->numScreens();
00045 QObject::connect(desktop, SIGNAL(resized(int)), this, SLOT(screenResized(int)));
00046 }
00047
00048 void DesktopCorona::checkScreens()
00049 {
00050
00051 int numScreens = QApplication::desktop()->numScreens();
00052 for (int i = 0; i < numScreens; ++i) {
00053 if (!containmentForScreen(i)) {
00054
00055 Plasma::Containment* c = addContainment("desktop");
00056 c->setScreen(i);
00057 c->setFormFactor(Plasma::Planar);
00058 c->flushPendingConstraintsEvents();
00059 } else if (i >= m_numScreens) {
00060
00061
00062
00063
00064
00065
00066
00067 kDebug() << "Notifying of new screen: " << i;
00068 emit containmentAdded(containmentForScreen(i));
00069 }
00070 }
00071
00072 m_numScreens = numScreens;
00073 }
00074
00075 void DesktopCorona::loadDefaultLayout()
00076 {
00077 QString defaultConfig = KStandardDirs::locate("appdata", "plasma-default-layoutrc");
00078 if (!defaultConfig.isEmpty()) {
00079 kDebug() << "attempting to load the default layout from:" << defaultConfig;
00080 loadLayout(defaultConfig);
00081 return;
00082 }
00083
00084 QDesktopWidget *desktop = QApplication::desktop();
00085 int numScreens = desktop->numScreens();
00086 kDebug() << "number of screens is" << numScreens;
00087 int topLeftScreen = 0;
00088 QPoint topLeftCorner = desktop->screenGeometry(0).topLeft();
00089
00090
00091 for (int i = 0; i < numScreens; ++i) {
00092 QRect g = desktop->screenGeometry(i);
00093 kDebug() << " screen " << i << "geometry is" << g;
00094
00095 if (g.x() <= topLeftCorner.x() && g.y() >= topLeftCorner.y()) {
00096 topLeftCorner = g.topLeft();
00097 topLeftScreen = i;
00098 }
00099 }
00100
00101
00102 KConfigGroup invalidConfig;
00103
00104
00105 for (int i = 0; i < numScreens; ++i) {
00106
00107
00108 Plasma::Containment* c = addContainmentDelayed(QString());
00109
00110 if (!c) {
00111 continue;
00112 }
00113
00114 c->init();
00115 c->setScreen(i);
00116 c->setFormFactor(Plasma::Planar);
00117 c->updateConstraints(Plasma::StartupCompletedConstraint);
00118 c->flushPendingConstraintsEvents();
00119 c->save(invalidConfig);
00120
00121
00122 if (i == topLeftScreen) {
00123 QDir desktopFolder(KGlobalSettings::desktopPath());
00124 if (desktopFolder.exists()) {
00125
00126 Plasma::Applet *folderView = Plasma::Applet::load("folderview", c->id() + 1);
00127 if (folderView) {
00128 c->addApplet(folderView, QPointF(KDialog::spacingHint(), KDialog::spacingHint()), true);
00129 KConfigGroup config = folderView->config();
00130 config.writeEntry("url", "desktop:/");
00131 folderView->init();
00132 folderView->flushPendingConstraintsEvents();
00133 }
00134 }
00135 }
00136
00137 emit containmentAdded(c);
00138 }
00139
00140
00141 Plasma::Containment* panel = addContainmentDelayed("panel");
00142
00143 if (!panel) {
00144 return;
00145 }
00146
00147 panel->init();
00148 panel->setScreen(topLeftScreen);
00149 panel->setLocation(Plasma::BottomEdge);
00150 panel->updateConstraints(Plasma::StartupCompletedConstraint);
00151 panel->flushPendingConstraintsEvents();
00152
00153
00154 Plasma::Applet *applet = loadDefaultApplet("launcher", panel);
00155 if (applet) {
00156 applet->setGlobalShortcut(KShortcut("Alt+F1"));
00157 }
00158
00159 loadDefaultApplet("notifier", panel);
00160 loadDefaultApplet("pager", panel);
00161 loadDefaultApplet("tasks", panel);
00162 loadDefaultApplet("systemtray", panel);
00163
00164 Plasma::DataEngineManager *engines = Plasma::DataEngineManager::self();
00165 Plasma::DataEngine *power = engines->loadEngine("powermanagement");
00166 if (power) {
00167 const QStringList &batteries = power->query("Battery")["sources"].toStringList();
00168 if (!batteries.isEmpty()) {
00169 loadDefaultApplet("battery", panel);
00170 }
00171 }
00172 engines->unloadEngine("powermanagement");
00173
00174 loadDefaultApplet("digital-clock", panel);
00175
00176 foreach (Plasma::Applet* applet, panel->applets()) {
00177 applet->init();
00178 applet->flushPendingConstraintsEvents();
00179 applet->save(invalidConfig);
00180 }
00181
00182 panel->save(invalidConfig);
00183 emit containmentAdded(panel);
00184
00185 requestConfigSync();
00186
00187
00188
00189
00190
00191
00192 }
00193
00194 Plasma::Applet *DesktopCorona::loadDefaultApplet(const QString &pluginName, Plasma::Containment *c)
00195 {
00196 QVariantList args;
00197 Plasma::Applet *applet = Plasma::Applet::load(pluginName, 0, args);
00198
00199 if (applet) {
00200 c->addApplet(applet);
00201 }
00202
00203 return applet;
00204 }
00205
00206 void DesktopCorona::screenResized(int screen)
00207 {
00208 int numScreens = QApplication::desktop()->numScreens();
00209 if (screen < numScreens) {
00210 foreach (Plasma::Containment *c, containments()) {
00211 if (c->screen() == screen) {
00212
00213 c->setScreen(screen);
00214 }
00215 }
00216
00217 checkScreens();
00218 } else {
00219 m_numScreens = numScreens;
00220 }
00221 }
00222
00223 #include "desktopcorona.moc"
00224