diff options
Diffstat (limited to 'src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.cpp')
-rw-r--r-- | src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.cpp | 174 |
1 files changed, 167 insertions, 7 deletions
diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.cpp index 5750ac2d..d9a81f54 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.cpp @@ -8,12 +8,16 @@ #include <QQmlEngine> #include <QApplication> #include <QScreen> - +#include <global-objects.h> #include <QDebug> // === PUBLIC === RootDesktopObject::RootDesktopObject(QObject *parent) : QObject(parent){ + last_window_up = 0; updateScreens(); //make sure the internal list is updated right away + connect(this, SIGNAL(changePanels(QStringList)), this, SLOT(setPanels(QStringList)) ); + currentTimeTimer = new QTimer(this); + connect(currentTimeTimer, SIGNAL(timeout()), this, SLOT(updateCurrentTime()) ); } RootDesktopObject::~RootDesktopObject(){ @@ -27,6 +31,8 @@ void RootDesktopObject::RegisterType(){ qmlRegisterType<RootDesktopObject>("Lumina.Backend.RootDesktopObject", 2, 0, "RootDesktopObject"); //Also register any types that are needed by this class ScreenObject::RegisterType(); + NativeWindowObject::RegisterType(); + OSInterface::RegisterType(); } RootDesktopObject* RootDesktopObject::instance(){ @@ -36,14 +42,14 @@ RootDesktopObject* RootDesktopObject::instance(){ //QML Read Functions QStringList RootDesktopObject::screens(){ - qDebug() << "Request Screens:" << s_objects.length(); + //qDebug() << "Request Screens:" << s_objects.length(); QStringList names; for(int i=0; i<s_objects.length(); i++){ names << s_objects[i]->name(); } return names; } ScreenObject* RootDesktopObject::screen(QString id){ - qDebug() << "Got Screen Request:" << id; + //qDebug() << "Got Screen Request:" << id; for(int i=0; i<s_objects.length(); i++){ if(s_objects[i]->name()==id){ return s_objects[i]; } } @@ -72,7 +78,7 @@ QStringList RootDesktopObject::windows(){ return names; } -NativeWindow* RootDesktopObject::window(QString id){ +NativeWindowObject* RootDesktopObject::window(QString id){ //qDebug() << "Got Panel Request:" << id; WId chk = id.toInt(); //numerical ID's in this case for(int i=0; i<window_objects.length(); i++){ @@ -81,26 +87,159 @@ NativeWindow* RootDesktopObject::window(QString id){ return 0; } +QStringList RootDesktopObject::trayWindows(){ + //qDebug() << "Request Panels:" << panel_objects.length(); + QStringList names; + for(int i=0; i<tray_window_objects.length(); i++){ names << QString::number(tray_window_objects[i]->id()); } + return names; +} + +NativeWindowObject* RootDesktopObject::trayWindow(QString id){ + //qDebug() << "Got Panel Request:" << id; + WId chk = id.toInt(); //numerical ID's in this case + for(int i=0; i<tray_window_objects.length(); i++){ + if(tray_window_objects[i]->id()==chk){ return tray_window_objects[i]; } + } + return 0; +} + +bool RootDesktopObject::hasTrayWindows(){ + return !tray_window_objects.isEmpty(); +} + +QString RootDesktopObject::currentTime(){ + return currentTimeString; +} + +QDateTime RootDesktopObject::currentDateTime(){ + return currentDateTimeStruct; +} + +OSInterface* RootDesktopObject::os_interface(){ + return OSInterface::instance(); +} + void RootDesktopObject::setPanels(QList<PanelObject*> list){ panel_objects = list; emit panelsChanged(); } -void RootDesktopObject::setWindows(QList<NativeWindow*> list){ +void RootDesktopObject::setPanels(QStringList ids){ + //Make this thread-safe for object creation + if(this->thread() != QThread::currentThread()){ + //use internal signal/slot combo to change threads + this->emit changePanels(ids); + return; + } + //qDebug() << "GOT PANEL CHANGE:" << ids; + //Get the current bounding rectangle for the session + QRect total; + bool change = false; + for(int i=0; i<=s_objects.length(); i++){ + QRect geom; + QString prefix; + if(i==s_objects.length()){ + geom = total; //session geometry + prefix="session/"; + }else{ + geom = s_objects[i]->geometry(); + total = total.united(geom); + prefix=s_objects[i]->name()+"/"; + } + QStringList newids = ids.filter(prefix); + //qDebug() << " Check Panel IDs:" << prefix << newids << ids; + //First update/remove any current panel objects + for(int i=0; i<panel_objects.length(); i++){ + if(newids.contains(panel_objects[i]->name()) ){ + //qDebug() << " - Update Existing Panel:" << panel_objects[i]->name(); + newids.removeAll(panel_objects[i]->name()); //already handled + panel_objects[i]->syncWithSettings(geom); + }else if(panel_objects[i]->name().startsWith(prefix) ){ + //qDebug() << " - Remove Existing Panel:" << panel_objects[i]->name(); + panel_objects.takeAt(i)->deleteLater(); + i--; + change = true; //list changed + } + } + //Now create any new panel objects as needed + for(int i=0; i<newids.length(); i++){ + //qDebug() << " - Create Panel:" << newids[i]; + PanelObject *tmp = new PanelObject(newids[i], this); + tmp->syncWithSettings(geom); + panel_objects << tmp; + change = true; //list changed + } + } //end loop over screens+session + if(change){ emit panelsChanged(); } +} + +void RootDesktopObject::setWindows(QList<NativeWindowObject*> list){ window_objects = list; emit windowsChanged(); + mousePositionChanged(true); +} + +void RootDesktopObject::setTrayWindows(QList<NativeWindowObject*> list){ + tray_window_objects = list; + emit trayWindowsChanged(); + mousePositionChanged(true); +} + +void RootDesktopObject::updateCurrentTimeFormat(QString fmt){ + //sanitize the time format as needed + if(fmt.contains("z")){ fmt.replace("z",""); } //do not allow millisecond updates - too fast for the desktop + fmt = fmt.simplified(); + //Verify that anything has changed first + if(currentTimeFormat == fmt && currentTimeTimer->isActive()){ return; } //nothing changed + if(currentTimeTimer->isActive()){ currentTimeTimer->stop(); } //make sure this does not trigger during the changeover + currentTimeFormat = fmt; + int interval = 1000; //default to 1 second intervals + //Adjust the refresh time for the clock based on the smallest unit requested + if(fmt.contains("s")){ interval=500; } //1/2 second pings for 1-second displays + else if(fmt.contains("m") || currentTimeFormat.isEmpty()){ interval = 5000; } //5 second pings for 1-minute displays + else if(fmt.contains("h")){ interval = 30000; } //30 second pings for 1-hour displays + currentTimeTimer->setInterval(interval); + updateCurrentTime(); //refresh the currently-available time + QTimer::singleShot(0,currentTimeTimer, SLOT(start()) );//start the update timer } void RootDesktopObject::logout(){ - emit startLogout(); + //Emit the logout signal in a few ms (let the display close/sync first) + QTimer::singleShot(50, this, SIGNAL(startLogout())); } void RootDesktopObject::lockscreen(){ emit lockScreen(); } -void RootDesktopObject::mousePositionChanged(){ +void RootDesktopObject::mousePositionChanged(bool lowerall){ emit mouseMoved(); + // Go through the transparent windows (in order of high->low in stack) + // and raise/lower the transparent overlays as needed + QPoint pos = QCursor::pos(); + for(int i=window_objects.length()-1; i>=0; i--){ + if(window_objects[i]->geometry().contains(pos) ){ + if(last_window_up!= window_objects[i]){ + if(last_window_up!=0){ Lumina::NWS->lowerWindow(last_window_up); } + Lumina::NWS->raiseWindow(window_objects[i]); + last_window_up = window_objects[i]; + } + if(!lowerall){ return; } //found the currently-hovered window + }else if(lowerall){ + Lumina::NWS->lowerWindow(window_objects[i]); + } + } + //failover for when no window has the mouse over it (lower all of them) + if(last_window_up!=0 && !lowerall){ Lumina::NWS->lowerWindow(last_window_up); } +} + +void RootDesktopObject::launchApp(QString appOrPath){ + emit launchApplication(appOrPath); +} + +//C++ Access Functions (simplifications for the QML ones) +QList<NativeWindowObject*> RootDesktopObject::windowObjects(){ + return window_objects; } // === PUBLIC SLOTS === @@ -129,5 +268,26 @@ void RootDesktopObject::ChangeWallpaper(QString screen, QString value){ } } +QString RootDesktopObject::CurrentWallpaper(QString screen){ + for(int i=0; i<s_objects.length(); i++){ + if(s_objects[i]->name()==screen){ return s_objects[i]->background();} + } + return ""; //unknown +} + + // === PRIVATE === + +// === PRIVATE SLOTS === +void RootDesktopObject::updateCurrentTime(){ + QDateTime DT = QDateTime::currentDateTime(); + QString tmp; + if(currentTimeFormat.isEmpty()){ tmp = DT.toString(Qt::DefaultLocaleShortDate); } + else{ tmp = DT.toString(currentTimeFormat); } + if(tmp!=currentTimeString){ //prevent sending signals to update the interface if nothing changed + currentDateTimeStruct = DT; + currentTimeString = tmp; + emit currentTimeChanged(); + } +} |