aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.cpp
diff options
context:
space:
mode:
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.cpp174
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();
+ }
+}
bgstack15