From 6cbd6541d5536f59973ba625b267eb8ad64d747b Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Tue, 2 Jan 2018 15:57:56 -0500 Subject: Add the new "DesktopManager" class into lumina2 sources. This is the class that watches for settings file changes and/or converts settings into interface object values. --- src-qt5/core/lumina-desktop-unified/LSession.cpp | 17 ++- .../core/lumina-desktop-unified/global-objects.h | 9 +- src-qt5/core/lumina-desktop-unified/main.cpp | 6 +- .../src-desktop/DesktopManager.cpp | 139 +++++++++++++++++++++ .../src-desktop/DesktopManager.h | 44 +++++++ .../lumina-desktop-unified/src-desktop/desktop.pri | 6 +- .../src-desktop/src-cpp/RootDesktopObject.cpp | 8 ++ .../src-desktop/src-cpp/RootDesktopObject.h | 1 + 8 files changed, 215 insertions(+), 15 deletions(-) create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.h (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/LSession.cpp b/src-qt5/core/lumina-desktop-unified/LSession.cpp index e1251c01..ed4d644b 100644 --- a/src-qt5/core/lumina-desktop-unified/LSession.cpp +++ b/src-qt5/core/lumina-desktop-unified/LSession.cpp @@ -22,6 +22,7 @@ QThread* Lumina::EVThread = 0; RootWindow* Lumina::ROOTWIN = 0; XDGDesktopList* Lumina::APPLIST = 0; LShortcutEvents* Lumina::SHORTCUTS = 0; +DesktopManager* Lumina::DESKMAN = 0; LSession::LSession(int &argc, char ** argv) : LSingleApplication(argc, argv, "lumina-desktop-unified"){ //Initialize the global objects to null pointers @@ -49,10 +50,11 @@ LSession::LSession(int &argc, char ** argv) : LSingleApplication(argc, argv, "lu Lumina::NEF = new NativeEventFilter(); Lumina::NWS = new NativeWindowSystem(); Lumina::SS = new LScreenSaver(); + Lumina::DESKMAN = new DesktopManager(); //Now put the Native Window System into it's own thread to keep things snappy Lumina::EVThread = new QThread(); - //Lumina::NWS->moveToThread(Lumina::EVThread); - //Lumina::EVThread->start(); + Lumina::DESKMAN->moveToThread(Lumina::EVThread); + Lumina::EVThread->start(); Lumina::APPLIST = XDGDesktopList::instance(); Lumina::ROOTWIN = new RootWindow(); Lumina::SHORTCUTS = new LShortcutEvents(); //this can be moved to it's own thread eventually as well @@ -73,6 +75,7 @@ LSession::~LSession(){ if(DesktopSettings::instance()!=0){ DesktopSettings::instance()->deleteLater(); } if(Lumina::ROOTWIN!=0){ Lumina::ROOTWIN->deleteLater(); } if(Lumina::APPLIST!=0){ Lumina::APPLIST->deleteLater(); } + if(Lumina::DESKMAN!=0){ Lumina::DESKMAN->deleteLater(); } } void LSession::setupSession(){ @@ -104,6 +107,10 @@ void LSession::setupSession(){ splash.showScreen("user"); if(DEBUG){ qDebug() << " - Init User Files:" << timer->elapsed();} //checkUserFiles(); //adds these files to the watcher as well + Lumina::NWS->setRoot_numberOfWorkspaces(QStringList() << "one" << "two"); + Lumina::NWS->setRoot_currentWorkspace(0); + + Lumina::DESKMAN->start(); Lumina::ROOTWIN->start(); //Initialize the internal variables //DESKTOPS.clear(); @@ -124,14 +131,12 @@ void LSession::setupSession(){ //Initialize the desktops splash.showScreen("desktop"); - if(DEBUG){ qDebug() << " - Init Desktops:" << timer->elapsed(); } + /*if(DEBUG){ qDebug() << " - Init Desktops:" << timer->elapsed(); } QList scrns= QApplication::screens(); for(int i=0; iname(); RootDesktopObject::instance()->ChangeWallpaper(scrns[i]->name(),QUrl::fromLocalFile(LOS::LuminaShare()+"desktop-background.jpg").toString() ); - } - Lumina::NWS->setRoot_numberOfWorkspaces(QStringList() << "one" << "two"); - Lumina::NWS->setRoot_currentWorkspace(0); + }*/ if(DEBUG){ qDebug() << " - Create Desktop Context Menu"; } diff --git a/src-qt5/core/lumina-desktop-unified/global-objects.h b/src-qt5/core/lumina-desktop-unified/global-objects.h index c204587f..4cea60c2 100644 --- a/src-qt5/core/lumina-desktop-unified/global-objects.h +++ b/src-qt5/core/lumina-desktop-unified/global-objects.h @@ -22,9 +22,10 @@ //#include "src-events/LXcbEventFilter.h" //#endif #include "src-events/LShortcutEvents.h" - +#include "src-desktop/DesktopManager.h" #include "src-screensaver/LScreenSaver.h" //#include "src-WM/LWindowManager.h" + #include #include "LSession.h" @@ -43,13 +44,13 @@ namespace Lumina{ //extern EventFilter *EFILTER; //Native Event Watcher extern LShortcutEvents *SHORTCUTS; //Keyboard/mouse shortcut events - //extern DesktopSettings *SETTINGS; //All Settings files + //ScreenSaver extern LScreenSaver *SS; //Root Window extern RootWindow *ROOTWIN; - //Window Manager - //LWindowManager *WM; + //Desktop Manager + extern DesktopManager *DESKMAN; //Application List extern XDGDesktopList *APPLIST; diff --git a/src-qt5/core/lumina-desktop-unified/main.cpp b/src-qt5/core/lumina-desktop-unified/main.cpp index ed2b9b4c..3cf35e50 100644 --- a/src-qt5/core/lumina-desktop-unified/main.cpp +++ b/src-qt5/core/lumina-desktop-unified/main.cpp @@ -39,11 +39,11 @@ int main(int argc, char ** argv) QTime *timer=0; if(DEBUG){ timer = new QTime(); timer->start(); } if(DEBUG){ qDebug() << "Theme Init:" << timer->elapsed(); } - LuminaThemeEngine theme(&a); - QObject::connect(&theme, SIGNAL(updateIcons()), &a, SLOT(reloadIconTheme()) ); + /*LuminaThemeEngine theme(&a); + QObject::connect(&theme, SIGNAL(updateIcons()), &a, SLOT(reloadIconTheme()) );*/ if(DEBUG){ qDebug() << "Session Setup:" << timer->elapsed(); } QTimer::singleShot(0, &a, SLOT(setupSession()) ); - theme.refresh(); + //theme.refresh(); if(DEBUG){ qDebug() << "Exec Time:" << timer->elapsed(); delete timer;} int retCode = a.exec(); qDebug() << "Finished Closing Down Unified Lumina"; diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp new file mode 100644 index 00000000..d6d06be9 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp @@ -0,0 +1,139 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2017-2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "DesktopManager.h" + +#include "global-objects.h" + +// === PUBLIC === +DesktopManager::DesktopManager(){ + +} + +DesktopManager::~DesktopManager(){ + +} + +void DesktopManager::start(){ + connect(DesktopSettings::instance(), SIGNAL(FileModified(DesktopSettings::File)), this, SLOT(settingsChanged(DesktopSettings::File)) ); + //Perform the initial load of the settings files + QTimer::singleShot(0, this, SLOT(updateDesktopSettings()) ); + QTimer::singleShot(0, this, SLOT(updatePanelSettings()) ); + QTimer::singleShot(0, this, SLOT(updatePluginSettings()) ); + QTimer::singleShot(0, this, SLOT(updateMenuSettings()) ); + QTimer::singleShot(0, this, SLOT(updateAnimationSettings()) ); +} + +void DesktopManager::stop(){ + disconnect(DesktopSettings::instance(), SIGNAL(FileModified(DesktopSettings::File)), this, SLOT(settingsChanged(DesktopSettings::File)) ); +} + +// === PRIVATE === +void DesktopManager::updateWallpaper(QString screen_id, int wkspace){ + QString current = RootDesktopObject::instance()->CurrentWallpaper(screen_id); + if(!current.isEmpty()){ current = QUrl(current).toLocalFile(); } //convert it back to the normal file syntax + //First find the list of options from the settings + //First look for a list that matches this exact screen/workspace combo + QStringList wpaperList = DesktopSettings::instance()->value(DesktopSettings::Desktop, "wallpapers/"+screen_id+"_wk_"+QString::number(wkspace), QStringList()).toStringList(); + //Next look for a list that matches this exact workspace + if(wpaperList.isEmpty()){ wpaperList= DesktopSettings::instance()->value(DesktopSettings::Desktop, "wallpapers/default_wk_"+QString::number(wkspace), QStringList()).toStringList(); } + //Next look for a list that matches this exact screen + if(wpaperList.isEmpty()){ wpaperList= DesktopSettings::instance()->value(DesktopSettings::Desktop, "wallpapers/"+screen_id, QStringList()).toStringList(); } + //Now look for a list that matches any screen/workspace + if(wpaperList.isEmpty()){ wpaperList= DesktopSettings::instance()->value(DesktopSettings::Desktop, "wallpapers/default", QStringList()).toStringList(); } + //Now use the failover wallpaper directory + if(wpaperList.isEmpty()){ wpaperList << LOS::LuminaShare()+"../wallpapers/lumina-nature"; } + //Wallpaper selection/randomization + if(wpaperList.count()==1 && wpaperList.first()==current){ return; } //nothing to do - just the same image + QString wpaper; + QStringList bgL = wpaperList; //need a copy at the moment - could change the entire list in a second (opening a dir for instance) + while(wpaper.isEmpty() || QFileInfo(wpaper).isDir()){ + QString prefix; + if(!wpaper.isEmpty()){ + //Got a directory - update the list of files and re-randomize the selection + QStringList imgs = LUtils::imageExtensions(true); + QDir tdir(wpaper); + prefix=wpaper+"/"; + bgL = tdir.entryList(imgs, QDir::Files | QDir::NoDotAndDotDot, QDir::Name); + //If directory no longer has any valid images - remove it from list and try again + if(bgL.isEmpty()){ + wpaperList.removeAll(wpaper); //invalid directory - remove it from the list for the moment + bgL = wpaperList; //reset the list back to the original list (not within a directory) + } + } + //Verify that there are files in the list - otherwise use the default + if(bgL.isEmpty()){ wpaper="default"; break; } + int index = ( qrand() % bgL.length() ); + if(index== bgL.indexOf(current)){ //if the current wallpaper was selected by the randomization again + //Go to the next in the list + if(index < 0 || index >= bgL.length()-1){ index = 0; } //if invalid or last item in the list - go to first + else{ index++; } //go to next + } + wpaper = prefix+bgL[index]; + } + //Now go ahead and set the wallpaper in the screen object + if(wpaper.isEmpty() || wpaper=="default"){ wpaper = LOS::LuminaShare()+"desktop-background.jpg"; } //failover image + qDebug() << "Updating Wallpaper:" << screen_id << wpaper; + RootDesktopObject::instance()->ChangeWallpaper(screen_id,QUrl::fromLocalFile(wpaper).toString() ); +} + +void DesktopManager::updatePanels(QString panel_id){ + +} + +void DesktopManager::updatePlugins(QString plugin_id){ + +} + +// === PUBLIC SLOTS === +void DesktopManager::workspaceChanged(int wknum){ + qDebug() << "Got Workspace Changed:" << wknum; + +} + +void DesktopManager::settingsChanged(DesktopSettings::File type){ + switch(type){ + case DesktopSettings::Desktop: + QTimer::singleShot(0, this, SLOT(updateDesktopSettings()) ); + case DesktopSettings::Panels: + QTimer::singleShot(0, this, SLOT(updatePanelSettings()) ); + case DesktopSettings::Plugins: + QTimer::singleShot(0, this, SLOT(updatePluginSettings()) ); + case DesktopSettings::ContextMenu: + QTimer::singleShot(0, this, SLOT(updateMenuSettings()) ); + case DesktopSettings::Animation: + QTimer::singleShot(0, this, SLOT(updateAnimationSettings()) ); + default: + break; + //Do nothing - not a settings change we care about here + } +} + +// === PRIVATE SLOTS === +void DesktopManager::updateDesktopSettings(){ + qDebug() << "Update Desktop Settings..."; + QList scrns= QApplication::screens(); + int wkspace = Lumina::NWS->currentWorkspace(); + for(int i=0; iname(), wkspace); } + +} + +void DesktopManager::updatePanelSettings(){ + +} + +void DesktopManager::updatePluginSettings(){ + +} + +void DesktopManager::updateMenuSettings(){ + +} + +void DesktopManager::updateAnimationSettings(){ + +} + diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.h b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.h new file mode 100644 index 00000000..df681afa --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.h @@ -0,0 +1,44 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2017-2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +// This is the main class that updates the interface objects +// on-demand as settings files and other stuff changes +//=========================================== +#ifndef _LUMINA_DESKTOP_OBJECT_MANAGER_H +#define _LUMINA_DESKTOP_OBJECT_MANAGER_H + +#include + +class DesktopManager : public QObject { + Q_OBJECT +public: + DesktopManager(); + ~DesktopManager(); + + void start(); + void stop(); + +private: + void updateWallpaper(QString screen_id, int wkspace); + void updatePanels(QString panel_id); + void updatePlugins(QString plugin_id); + +public slots: + void workspaceChanged(int); + void settingsChanged(DesktopSettings::File); + +private slots: + void updateDesktopSettings(); + void updatePanelSettings(); + void updatePluginSettings(); + void updateMenuSettings(); + void updateAnimationSettings(); + +signals: + void PanelLocationsChanged(); //reserved screen space changed +}; + +#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/desktop.pri b/src-qt5/core/lumina-desktop-unified/src-desktop/desktop.pri index e4c4faeb..f4a6882d 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/desktop.pri +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/desktop.pri @@ -1,8 +1,10 @@ QT *= gui widgets qml quick -SOURCES *= $${PWD}/RootWindow.cpp +SOURCES *= $${PWD}/RootWindow.cpp \ + $${PWD}/Desktopmanager.cpp -HEADERS *= $${PWD}/RootWindow.h +HEADERS *= $${PWD}/RootWindow.h \ + $${PWD}/DesktopManager.h #update the includepath so we can just #include as needed without paths INCLUDEPATH *= $${PWD} 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..4b01fa0d 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 @@ -129,5 +129,13 @@ void RootDesktopObject::ChangeWallpaper(QString screen, QString value){ } } +QString RootDesktopObject::CurrentWallpaper(QString screen){ + for(int i=0; iname()==screen){ return s_objects[i]->background();} + } + return ""; //unknown +} + + // === PRIVATE === diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h index 838b5f7d..7d5182c4 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h @@ -55,6 +55,7 @@ private: public slots: void updateScreens(); //rescan/update screen objects void ChangeWallpaper(QString screen, QString); + QString CurrentWallpaper(QString screen); private slots: -- cgit From 5021bcc0a779f0f7847eaa7079949b766289da6e Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Wed, 3 Jan 2018 12:02:04 -0500 Subject: Get the DesktopSettings class automatically providing notifications about file changes. --- src-qt5/core/libLumina/DesktopSettings.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src-qt5/core') diff --git a/src-qt5/core/libLumina/DesktopSettings.cpp b/src-qt5/core/libLumina/DesktopSettings.cpp index f1c74bc5..509afa83 100644 --- a/src-qt5/core/libLumina/DesktopSettings.cpp +++ b/src-qt5/core/libLumina/DesktopSettings.cpp @@ -17,6 +17,7 @@ // === PUBLIC === DesktopSettings::DesktopSettings(QObject *parent) : QObject(parent){ + qRegisterMetaType< DesktopSettings::File >("DesktopSettings::File"); watcher = 0; runmode = DesktopSettings::UserFull; } @@ -275,6 +276,7 @@ QString DesktopSettings::rel_path(DesktopSettings::File file){ //=== PRIVATE SLOTS === void DesktopSettings::fileChanged(QString file){ + //qDebug() << "Got File Changed:" << file; //QFileSystemWatcher change detected if(!watcher->files().contains(file)){ //Make sure this file stays watched for changes @@ -287,6 +289,7 @@ void DesktopSettings::fileChanged(QString file){ QList< DesktopSettings::File > types = files.keys(); for(int i=0; i Date: Wed, 3 Jan 2018 15:42:49 -0500 Subject: Add the new-ish NativeWindowObject class to Lumina2 This is a copy of the old QtWidgets class (NativeWindow) but converted over to allow QML to access/use it as well. --- .../src-desktop/src-cpp/NativeWindowObject.cpp | 175 +++++++++++++++++++++ .../src-desktop/src-cpp/NativeWindowObject.h | 136 ++++++++++++++++ .../src-desktop/src-cpp/src-cpp.pri | 6 +- 3 files changed, 315 insertions(+), 2 deletions(-) create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp new file mode 100644 index 00000000..796dd5bc --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp @@ -0,0 +1,175 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2017-2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "NativeWindowObject.h" +#include +#include + +// == QML Type Registration == +void NativeWindowObject::RegisterType(){ + static bool done = false; + if(done){ return; } + done=true; + qmlRegisterType("Lumina.Backend.NativeWindowObject",2,0, "NativeWindowObject"); +} + +// === PUBLIC === +NativeWindowObject::NativeWindowObject(WId id) : QObject(){ + winid = id; + frameid = 0; + dmgID = 0; +} + +NativeWindowObject::~NativeWindowObject(){ + hash.clear(); +} + +void NativeWindowObject::addFrameWinID(WId fid){ + frameid = fid; +} + +void NativeWindowObject::addDamageID(unsigned int dmg){ + dmgID = dmg; +} + +bool NativeWindowObject::isRelatedTo(WId tmp){ + return (relatedTo.contains(tmp) || winid == tmp || frameid == tmp); +} + +WId NativeWindowObject::id(){ + return winid; +} + +WId NativeWindowObject::frameId(){ + return frameid; +} + +unsigned int NativeWindowObject::damageId(){ + return dmgID; +} + +QVariant NativeWindowObject::property(NativeWindowObject::Property prop){ + if(hash.contains(prop)){ return hash.value(prop); } + else if(prop == NativeWindowObject::RelatedWindows){ return QVariant::fromValue(relatedTo); } + return QVariant(); //null variant +} + +void NativeWindowObject::setProperty(NativeWindowObject::Property prop, QVariant val, bool force){ + if(prop == NativeWindowObject::RelatedWindows){ relatedTo = val.value< QList >(); } + else if(prop == NativeWindowObject::None || (!force && hash.value(prop)==val)){ return; } + else{ hash.insert(prop, val); } + emitSinglePropChanged(prop); + emit PropertiesChanged(QList() << prop, QList() << val); +} + +void NativeWindowObject::setProperties(QList props, QList vals, bool force){ + for(int i=0; i=vals.length()){ props.removeAt(i); i--; continue; } //no corresponding value for this property + if(props[i] == NativeWindowObject::None || (!force && (hash.value(props[i]) == vals[i])) ){ props.removeAt(i); vals.removeAt(i); i--; continue; } //Invalid property or identical value + hash.insert(props[i], vals[i]); + emitSinglePropChanged(props[i]); + } + emit PropertiesChanged(props, vals); +} + +void NativeWindowObject::requestProperty(NativeWindowObject::Property prop, QVariant val, bool force){ + if(prop == NativeWindowObject::None || prop == NativeWindowObject::RelatedWindows || (!force && hash.value(prop)==val) ){ return; } + emit RequestPropertiesChange(winid, QList() << prop, QList() << val); +} + +void NativeWindowObject::requestProperties(QList props, QList vals, bool force){ + //Verify/adjust inputs as needed + for(int i=0; i=vals.length()){ props.removeAt(i); i--; continue; } //no corresponding value for this property + if(props[i] == NativeWindowObject::None || props[i] == NativeWindowObject::RelatedWindows || (!force && hash.value(props[i])==vals[i]) ){ props.removeAt(i); vals.removeAt(i); i--; continue; } //Invalid property or identical value + /*if( (props[i] == NativeWindowObject::Visible || props[i] == NativeWindowObject::Active) && frameid !=0){ + //These particular properties needs to change the frame - not the window itself + emit RequestPropertiesChange(frameid, QList() << props[i], QList() << vals[i]); + props.removeAt(i); vals.removeAt(i); i--; + }*/ + } + emit RequestPropertiesChange(winid, props, vals); +} + +QRect NativeWindowObject::geometry(){ + //Calculate the "full" geometry of the window + frame (if any) + //Check that the size is between the min/max limitations + QSize size = hash.value(NativeWindowObject::Size).toSize(); + QSize min = hash.value(NativeWindowObject::MinSize).toSize(); + QSize max = hash.value(NativeWindowObject::MaxSize).toSize(); + if(min.isValid() && min.width() > size.width() ){ size.setWidth(min.width()); } + if(min.isValid() && min.height() > size.height()){ size.setHeight(min.height()); } + if(max.isValid() && max.width() < size.width() && max.width()>min.width()){ size.setWidth(max.width()); } + if(max.isValid() && max.height() < size.height() && max.height()>min.height()){ size.setHeight(max.height()); } + //Assemble the full geometry + QRect geom( hash.value(NativeWindowObject::GlobalPos).toPoint(), size ); + //Now adjust the window geom by the frame margins + QList frame = hash.value(NativeWindowObject::FrameExtents).value< QList >(); //Left,Right,Top,Bottom + //qDebug() << "Calculate Geometry:" << geom << frame; + if(frame.length()==4){ + geom = geom.adjusted( -frame[0], -frame[2], frame[1], frame[3] ); + } + //qDebug() << " - Total:" << geom; + return geom; +} + +// QML ACCESS FUNCTIONS (shortcuts for particular properties in a format QML can use) +QString NativeWindowObject::name(){ + return this->property(NativeWindowObject::Name).toString(); +} + +QString NativeWindowObject::title(){ + return this->property(NativeWindowObject::Title).toString(); +} + +QString NativeWindowObject::shortTitle(){ + return this->property(NativeWindowObject::ShortTitle).toString(); +} + +QIcon NativeWindowObject::icon(){ + return this->property(NativeWindowObject::Name).value(); +} + +bool NativeWindowObject::isSticky(){ + return (this->property(NativeWindowObject::Workspace).toInt()<0 || this->property(NativeWindowObject::States).value >().contains(NativeWindowObject::S_STICKY) ); +} + +// ==== PUBLIC SLOTS === +void NativeWindowObject::toggleVisibility(){ + setProperty(NativeWindowObject::Visible, !property(NativeWindowObject::Visible).toBool() ); +} + +void NativeWindowObject::requestClose(){ + emit RequestClose(winid); +} + +void NativeWindowObject::requestKill(){ + emit RequestKill(winid); +} + +void NativeWindowObject::requestPing(){ + emit RequestPing(winid); +} + +// ==== PRIVATE ==== +void NativeWindowObject::emitSinglePropChanged(NativeWindowObject::Property prop){ + //Simple switch to emit the QML-usable signals as properties are changed + switch(prop){ + case NativeWindowObject::Name: + emit nameChanged(); break; + case NativeWindowObject::Title: + emit titleChanged(); break; + case NativeWindowObject::ShortTitle: + emit shortTitleChanged(); break; + case NativeWindowObject::Icon: + emit iconChanged(); break; + case NativeWindowObject::Workspace: + case NativeWindowObject::States: + emit stickyChanged(); break; + default: + break; //do nothing otherwise + } +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h new file mode 100644 index 00000000..fa1bf4de --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h @@ -0,0 +1,136 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2017-2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +// This is a container object for setting/announcing changes +// in a native window's properties. +// The WM will usually run the "setProperty" function on this object, +// and any other classes/widgets which watch this window can act appropriatly after-the-fact +// Non-WM classes should use the "Request" signals to ask the WM to do something, and listen for changes later +//=========================================== +#ifndef _LUMINA_SOURCES_NATIVE_WINDOW_OBJECT_H +#define _LUMINA_SOURCES_NATIVE_WINDOW_OBJECT_H +#include "global-includes.h" + +class NativeWindowObject : public QObject{ + Q_OBJECT + // QML-ACCESSIBLE PROPERTIES + Q_PROPERTY( QString name READ name NOTIFY nameChanged) + Q_PROPERTY( QString title READ title NOTIFY titleChanged) + Q_PROPERTY( QString shortTitle READ shortTitle NOTIFY shortTitleChanged) + Q_PROPERTY( QIcon icon READ icon NOTIFY iconChanged) + Q_PROPERTY( bool sticky READ isSticky NOTIFY stickyChanged) + +public: + enum State{ S_MODAL, S_STICKY, S_MAX_VERT, S_MAX_HORZ, S_SHADED, S_SKIP_TASKBAR, S_SKIP_PAGER, S_HIDDEN, S_FULLSCREEN, S_ABOVE, S_BELOW, S_ATTENTION }; + enum Type{T_DESKTOP, T_DOCK, T_TOOLBAR, T_MENU, T_UTILITY, T_SPLASH, T_DIALOG, T_DROPDOWN_MENU, T_POPUP_MENU, T_TOOLTIP, T_NOTIFICATION, T_COMBO, T_DND, T_NORMAL }; + enum Action {A_MOVE, A_RESIZE, A_MINIMIZE, A_SHADE, A_STICK, A_MAX_VERT, A_MAX_HORZ, A_FULLSCREEN, A_CHANGE_DESKTOP, A_CLOSE, A_ABOVE, A_BELOW}; + + enum Property{ /*QVariant Type*/ + None=0, /*null*/ + MinSize=1, /*QSize*/ + MaxSize=2, /*QSize*/ + Size=3, /*QSize*/ + GlobalPos=4, /*QPoint*/ + Title=5, /*QString*/ + ShortTitle=6, /*QString*/ + Icon=7, /*QIcon*/ + Name=8, /*QString*/ + Workspace=9, /*int*/ + States=10, /*QList : Current state of the window */ + WinTypes=11, /*QList : Current type of window (typically does not change)*/ + WinActions=12, /*QList : Current actions that the window allows (Managed/set by the WM)*/ + FrameExtents=13, /*QList : [Left, Right, Top, Bottom] in pixels */ + RelatedWindows=14, /* QList - better to use the "isRelatedTo(WId)" function instead of reading this directly*/ + Active=15, /*bool*/ + Visible=16 /*bool*/ + }; + + static QList allProperties(){ + //Return all the available properties (excluding "None" and "FrameExtents" (WM control only) ) + QList props; + props << MinSize << MaxSize << Size << GlobalPos << Title << ShortTitle << Icon << Name << Workspace \ + << States << WinTypes << WinActions << RelatedWindows << Active << Visible; + return props; + }; + + static void RegisterType(); + + NativeWindowObject(WId id = 0); + ~NativeWindowObject(); + + void addFrameWinID(WId); + void addDamageID(unsigned int); + bool isRelatedTo(WId); + + WId id(); + WId frameId(); + unsigned int damageId(); + + //QWindow* window(); + + QVariant property(NativeWindowObject::Property); + void setProperty(NativeWindowObject::Property, QVariant, bool force = false); + void setProperties(QList, QList, bool force = false); + void requestProperty(NativeWindowObject::Property, QVariant, bool force = false); + void requestProperties(QList, QList, bool force = false); + + QRect geometry(); //this returns the "full" geometry of the window (window + frame) + + // QML ACCESS FUNCTIONS (shortcuts for particular properties in a format QML can use) + Q_INVOKABLE QString name(); + Q_INVOKABLE QString title(); + Q_INVOKABLE QString shortTitle(); + Q_INVOKABLE QIcon icon(); + Q_INVOKABLE bool isSticky(); + +public slots: + Q_INVOKABLE void toggleVisibility(); + Q_INVOKABLE void requestClose(); //ask the app to close the window (may/not depending on activity) + Q_INVOKABLE void requestKill(); //ask the WM to kill the app associated with this window (harsh - only use if not responding) + Q_INVOKABLE void requestPing(); //ask the app if it is still active (a WindowNotResponding signal will get sent out if there is no reply); + +private: + QHash hash; + //QWindow *WIN; + WId winid, frameid; + QList relatedTo; + unsigned int dmgID; + + void emitSinglePropChanged(NativeWindowObject::Property); + +signals: + //General Notifications + void PropertiesChanged(QList, QList); + void RequestPropertiesChange(WId, QList, QList); + void WindowClosed(WId); + void WindowNotResponding(WId); //will be sent out if a window does not respond to a ping request + void VisualChanged(); + + //Action Requests (not automatically emitted - typically used to ask the WM to do something) + //Note: "WId" should be the NativeWindowObject id() + void RequestClose(WId); //Close the window + void RequestKill(WId); //Kill the window/app (usually from being unresponsive) + void RequestPing(WId); //Verify that the window is still active (such as not closing after a request + void RequestReparent(WId, WId, QPoint); //client window, frame window, relative origin point in frame + // System Tray Icon Embed/Unembed Requests + //void RequestEmbed(WId, QWidget*); + //void RequestUnEmbed(WId, QWidget*); + + // QML update signals + void nameChanged(); + void titleChanged(); + void shortTitleChanged(); + void iconChanged(); + void stickyChanged(); +}; + +// Declare the enumerations as Qt MetaTypes +Q_DECLARE_METATYPE(NativeWindowObject::Type); +Q_DECLARE_METATYPE(NativeWindowObject::Action); +Q_DECLARE_METATYPE(NativeWindowObject::State); +Q_DECLARE_METATYPE(NativeWindowObject::Property); + +#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/src-cpp.pri b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/src-cpp.pri index 899f4968..25bdc019 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/src-cpp.pri +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/src-cpp.pri @@ -1,9 +1,11 @@ SOURCES *= $${PWD}/RootDesktopObject.cpp \ $${PWD}/ScreenObject.cpp \ - $${PWD}/PanelObject.cpp + $${PWD}/PanelObject.cpp \ + $${PWD}/NativeWindowObject.cpp HEADERS *= $${PWD}/RootDesktopObject.h \ $${PWD}/ScreenObject.h \ - $${PWD}/PanelObject.h + $${PWD}/PanelObject.h \ + $${PWD}/NativeWindowObject.h INCLUDEPATH *= $${PWD} -- cgit From 7afe3c0ca066498c5e9cd30d47bde066b330cae0 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Thu, 4 Jan 2018 16:15:44 -0500 Subject: Get a lot more of the NativeWindowObject QML-ified. --- .../src-desktop/src-cpp/NativeWindowObject.cpp | 92 ++++++++++++++++++++++ .../src-desktop/src-cpp/NativeWindowObject.h | 32 +++++++- 2 files changed, 122 insertions(+), 2 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp index 796dd5bc..a1b8dbbb 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp @@ -117,6 +117,10 @@ QRect NativeWindowObject::geometry(){ } // QML ACCESS FUNCTIONS (shortcuts for particular properties in a format QML can use) +QImage NativeWindowObject::winImage(){ + return this->property(NativeWindowObject::WinImage).value(); +} + QString NativeWindowObject::name(){ return this->property(NativeWindowObject::Name).toString(); } @@ -133,10 +137,94 @@ QIcon NativeWindowObject::icon(){ return this->property(NativeWindowObject::Name).value(); } +//QML Button states +bool NativeWindowObject::showCloseButton(){ + QList types = this->property(NativeWindowObject::WinTypes).value >(); + QList badtypes; + badtypes << NativeWindowObject::T_DESKTOP << NativeWindowObject::T_TOOLBAR << NativeWindowObject::T_MENU \ + << NativeWindowObject::T_SPLASH << NativeWindowObject::T_DROPDOWN_MENU << NativeWindowObject::T_POPUP_MENU \ + << NativeWindowObject::T_NOTIFICATION << NativeWindowObject::T_COMBO << NativeWindowObject::T_DND; + for(int i=0; i types = this->property(NativeWindowObject::WinTypes).value >(); + QList badtypes; + badtypes << NativeWindowObject::T_DESKTOP << NativeWindowObject::T_TOOLBAR << NativeWindowObject::T_MENU \ + << NativeWindowObject::T_SPLASH << NativeWindowObject::T_DROPDOWN_MENU << NativeWindowObject::T_POPUP_MENU \ + << NativeWindowObject::T_NOTIFICATION << NativeWindowObject::T_COMBO << NativeWindowObject::T_DND; + for(int i=0; i types = this->property(NativeWindowObject::WinTypes).value >(); + QList badtypes; + badtypes << NativeWindowObject::T_DESKTOP << NativeWindowObject::T_TOOLBAR << NativeWindowObject::T_MENU \ + << NativeWindowObject::T_SPLASH << NativeWindowObject::T_DROPDOWN_MENU << NativeWindowObject::T_POPUP_MENU \ + << NativeWindowObject::T_NOTIFICATION << NativeWindowObject::T_COMBO << NativeWindowObject::T_DND << NativeWindowObject::T_DIALOG; + for(int i=0; i types = this->property(NativeWindowObject::WinTypes).value >(); + QList badtypes; + badtypes << NativeWindowObject::T_DESKTOP << NativeWindowObject::T_TOOLBAR << NativeWindowObject::T_MENU \ + << NativeWindowObject::T_SPLASH << NativeWindowObject::T_DROPDOWN_MENU << NativeWindowObject::T_POPUP_MENU \ + << NativeWindowObject::T_NOTIFICATION << NativeWindowObject::T_COMBO << NativeWindowObject::T_DND; + for(int i=0; i types = this->property(NativeWindowObject::WinTypes).value >(); + QList badtypes; + badtypes << NativeWindowObject::T_DESKTOP << NativeWindowObject::T_TOOLBAR << NativeWindowObject::T_MENU \ + << NativeWindowObject::T_SPLASH << NativeWindowObject::T_DROPDOWN_MENU << NativeWindowObject::T_POPUP_MENU \ + << NativeWindowObject::T_NOTIFICATION << NativeWindowObject::T_COMBO << NativeWindowObject::T_DND; + for(int i=0; i types = this->property(NativeWindowObject::WinTypes).value >(); + QList badtypes; + badtypes << NativeWindowObject::T_DESKTOP << NativeWindowObject::T_TOOLBAR << NativeWindowObject::T_MENU \ + << NativeWindowObject::T_SPLASH << NativeWindowObject::T_DROPDOWN_MENU << NativeWindowObject::T_POPUP_MENU \ + << NativeWindowObject::T_NOTIFICATION << NativeWindowObject::T_COMBO << NativeWindowObject::T_DND; + for(int i=0; iproperty(NativeWindowObject::Workspace).toInt()<0 || this->property(NativeWindowObject::States).value >().contains(NativeWindowObject::S_STICKY) ); } +//QML Geometry reporting +QRect NativeWindowObject::frameGeometry(){ + return geometry(); +} + +QRect NativeWindowObject::imageGeometry(){ + QRect geom( this->property(NativeWindowObject::GlobalPos).toPoint(), this->property(NativeWindowObject::Size).toSize() ); + return geom; +} + // ==== PUBLIC SLOTS === void NativeWindowObject::toggleVisibility(){ setProperty(NativeWindowObject::Visible, !property(NativeWindowObject::Visible).toBool() ); @@ -169,6 +257,10 @@ void NativeWindowObject::emitSinglePropChanged(NativeWindowObject::Property prop case NativeWindowObject::Workspace: case NativeWindowObject::States: emit stickyChanged(); break; + case NativeWindowObject::WinImage: + emit winImageChanged(); break; + case NativeWindowObject::WinTypes: + emit winTypeChanged(); break; default: break; //do nothing otherwise } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h index fa1bf4de..8a8504aa 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h @@ -17,11 +17,22 @@ class NativeWindowObject : public QObject{ Q_OBJECT // QML-ACCESSIBLE PROPERTIES + Q_PROPERTY( QImage winImage READ winImage NOTIFY winImageChanged) Q_PROPERTY( QString name READ name NOTIFY nameChanged) Q_PROPERTY( QString title READ title NOTIFY titleChanged) Q_PROPERTY( QString shortTitle READ shortTitle NOTIFY shortTitleChanged) Q_PROPERTY( QIcon icon READ icon NOTIFY iconChanged) Q_PROPERTY( bool sticky READ isSticky NOTIFY stickyChanged) + //Button/Titlebar visibility + Q_PROPERTY( bool showCloseButton READ showCloseButton NOTIFY winTypeChanged) + Q_PROPERTY( bool showMinButton READ showMinButton NOTIFY winTypeChanged) + Q_PROPERTY( bool showMaxButton READ showMaxButton NOTIFY winTypeChanged) + Q_PROPERTY( bool showTitlebar READ showTitlebar NOTIFY winTypeChanged) + Q_PROPERTY( bool showGenericButton READ showGenericButton NOTIFY winTypeChanged) + Q_PROPERTY( bool showWindowFrame READ showWindowFrame NOTIFY winTypeChanged) + //Geometry information + Q_PROPERTY( QRect frameGeometry READ frameGeometry NOTIFY geomChanged) + Q_PROPERTY( QRect imageGeometry READ imageGeometry NOTIFY geomChanged) public: enum State{ S_MODAL, S_STICKY, S_MAX_VERT, S_MAX_HORZ, S_SHADED, S_SKIP_TASKBAR, S_SKIP_PAGER, S_HIDDEN, S_FULLSCREEN, S_ABOVE, S_BELOW, S_ATTENTION }; @@ -45,7 +56,8 @@ public: FrameExtents=13, /*QList : [Left, Right, Top, Bottom] in pixels */ RelatedWindows=14, /* QList - better to use the "isRelatedTo(WId)" function instead of reading this directly*/ Active=15, /*bool*/ - Visible=16 /*bool*/ + Visible=16, /*bool*/ + WinImage=17 /*QImage*/ }; static QList allProperties(){ @@ -77,15 +89,28 @@ public: void requestProperty(NativeWindowObject::Property, QVariant, bool force = false); void requestProperties(QList, QList, bool force = false); - QRect geometry(); //this returns the "full" geometry of the window (window + frame) + Q_INVOKABLE QRect geometry(); //this returns the "full" geometry of the window (window + frame) // QML ACCESS FUNCTIONS (shortcuts for particular properties in a format QML can use) + Q_INVOKABLE QImage winImage(); Q_INVOKABLE QString name(); Q_INVOKABLE QString title(); Q_INVOKABLE QString shortTitle(); Q_INVOKABLE QIcon icon(); + //QML Button states + Q_INVOKABLE bool showCloseButton(); + Q_INVOKABLE bool showMaxButton(); + Q_INVOKABLE bool showMinButton(); + Q_INVOKABLE bool showTitlebar(); + Q_INVOKABLE bool showGenericButton(); + Q_INVOKABLE bool showWindowFrame(); + //QML Window States Q_INVOKABLE bool isSticky(); + //QML Geometry reporting + Q_INVOKABLE QRect frameGeometry(); + Q_INVOKABLE QRect imageGeometry(); + public slots: Q_INVOKABLE void toggleVisibility(); Q_INVOKABLE void requestClose(); //ask the app to close the window (may/not depending on activity) @@ -120,11 +145,14 @@ signals: //void RequestUnEmbed(WId, QWidget*); // QML update signals + void winImageChanged(); void nameChanged(); void titleChanged(); void shortTitleChanged(); void iconChanged(); void stickyChanged(); + void winTypeChanged(); + void geomChanged(); }; // Declare the enumerations as Qt MetaTypes -- cgit From 82c65e8edcbb5a06734e8ac70ae93d13e58f8ad4 Mon Sep 17 00:00:00 2001 From: ZackaryWelch Date: Thu, 4 Jan 2018 19:28:56 -0500 Subject: Added Matrix screensaver --- .../extrafiles/screensavers/Matrix.json | 25 ++++++++ .../extrafiles/screensavers/qml_scripts/Matrix.qml | 74 ++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 src-qt5/core/lumina-desktop-unified/extrafiles/screensavers/Matrix.json create mode 100644 src-qt5/core/lumina-desktop-unified/extrafiles/screensavers/qml_scripts/Matrix.qml (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/extrafiles/screensavers/Matrix.json b/src-qt5/core/lumina-desktop-unified/extrafiles/screensavers/Matrix.json new file mode 100644 index 00000000..52cd16ee --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/extrafiles/screensavers/Matrix.json @@ -0,0 +1,25 @@ +{ + "name" : { + "default" : "Matrix" + }, + "description" : { + "default" : "Erratic falling columns of various characters with a set color" + }, + "author" : { + "name" : "Zackary Welch", + "email" : "zwelch@ixsystems.com", + "website" : "https://github.com/ZackaryWelch", + "company" : "iXsystems", + "company_website" : "http://ixsystems.com" + }, + "meta" : { + "license" : "3-clause BSD", + "license_url" : "https://github.com/trueos/lumina/blob/master/LICENSE", + "copyright" : "Copyright (c) 2017, Ken Moore (ken@ixsystems.com)", + "date_created" : "20180103", + "version" : "1.0" + }, + "qml" : { + "exec" : "qml_scripts/Matrix.qml" + } +} diff --git a/src-qt5/core/lumina-desktop-unified/extrafiles/screensavers/qml_scripts/Matrix.qml b/src-qt5/core/lumina-desktop-unified/extrafiles/screensavers/qml_scripts/Matrix.qml new file mode 100644 index 00000000..1ab4b96c --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/extrafiles/screensavers/qml_scripts/Matrix.qml @@ -0,0 +1,74 @@ +// vi: ft=qml +import QtQuick 2.0 +import QtMultimedia 5.7 +import QtQuick.Window 2.2 + +Rectangle { + width: Window.width + height: Window.height + color: "black" + + Row{ + id: masterRow + anchors.left: parent.left + anchors.horizontalCenter: parent.horizontalCenter + width: parent.width + spacing: 5 + Repeater { + id: cR + model: Window.width / 15 + 1 + Column { + id: masterColumn + width: 10 + Text { + id: column + color: "red" + font.pixelSize: 10 + transform: Rotation { origin.x: 0; origin.y: 0; angle: 90 } + Timer { + //interval: Math.random() * ((cR.index % 2) ? 50 : 20) + ((cR.index % 2) ? 90 : 70) + interval: 50 + repeat: true + running: true + onTriggered: { + if(Math.random() < 0.95) { + var bottom = column.text.charAt(column.text.length-1) + var newString = bottom+column.text.substring(0, column.text.length-1) + column.text = newString + //interval = Math.random() * ((cR.index % 2) ? 50 : 20) + ((cR.index % 2) ? 90 : 70) + interval = 50 + }else{ + interval = 1000 + } + } + } + Component.onCompleted: { + var str = " " + var numberChar = Math.random() * 100 + (Window.height * 0.1); + if(Math.random() < 0.80) { + while(str.length < numberChar) { + if(Math.random() < 0.5) { + var charCount = Math.random() * 8 + 10 + var segStr = "" + while(segStr.length < charCount) { + var randChar = String.fromCharCode(0x30A0 + Math.random() * (0x30FF-0x30A0+1)); + segStr += randChar + } + str += segStr + }else{ + var charCount = Math.random() * 6 + 14 + var segStr = "" + while(segStr.length < charCount) { + segStr += " " + } + str += segStr + } + } + } + column.text = str + } + } + } + } + } +} -- cgit From 95dc4ba456e2f4c06f126863734ee673c7f887dc Mon Sep 17 00:00:00 2001 From: ZackaryWelch Date: Fri, 5 Jan 2018 16:11:13 -0500 Subject: Added WindowFrame for qml --- .../src-desktop/src-qml/WindowFrame.qml | 172 +++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/WindowFrame.qml (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/WindowFrame.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/WindowFrame.qml new file mode 100644 index 00000000..b1765001 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/WindowFrame.qml @@ -0,0 +1,172 @@ +// vi: ft=qml +import QtQuick 2.0 +import QtQuick.Window 2.2 +import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.3 + +Rectangle { + id: background + color: "grey" + + Rectangle { + id: windowFrame + border.width: 5 + border.color: "black" + color: "white" + width: 400 + height: 300 + + MouseArea { + id: resizeArea + anchors.fill: parent + property int positionX: 0 + property int positionY: 0 + property int newWidth: 0 + property int newHeight: 0 + + onPositionChanged: { + var globalP = windowFrame.mapToItem(background, mouse.x, mouse.y) + if(positionY < windowFrame.y + 15 ) { + /*if(positionX < windowFrame.x + 15) { + console.log("Top Left"); + //Top Left + newWidth = windowFrame.width + (windowFrame.x - mouse.x) + newHeight = windowFrame.height + (windowFrame.y - mouse.y) + windowFrame.x = mouse.x + windowFrame.y = mouse.y + }else if(positionX > windowFrame.x + windowFrame.width - 15) { + console.log("Top Right"); + //Top Right + newX = positionX - mouse.x + newY = positionY - mouse.y + newWidth = windowFrame.width - (positionX - mouse.x) + newHeight = windowFrame.height + (windowFrame.y - mouse.y) + windowFrame.y = mouse.y + }else{*/ + //Top + console.log("oldHeight: ", windowFrame.height); + windowFrame.height -= 1 + console.log("newHeight: ", windowFrame.height); + windowFrame.y = globalP.y + // } + } +/*else if(mouse.x < windowFrame.x + 15) { + if(mouse.y > windowFrame.y + windowFrame.height - 15) { + //Bottom Left + newX = positionX - mouse.x + newWidth = windowFrame.width - newX + newHeight = windowFrame.height - newY + }else{ + //Left + } + }else if(mouse.y > windowFrame.y + windowFrame.height - 15) { + if(mouse.x > windowFrame.x + windowFrame.width - 15) { + //Bottom Right + }else{ + //Bottom + } + }else if(mouse.x > windowFrame.x + windowFrame.width - 15) { + //Right + } else { + console.log("Cursor error"); + }*/ + } + } + + MouseArea { + id: dragArea + anchors.fill: titleBar + drag.target: windowFrame + drag.axis: Drag.XAndYAxis + onClicked: { console.log("dragArea"); } + //released: { function(); } + } + + states: [ + State { + when: resizeArea.drag.held + PropertyChanges { target: canvas; color:"red" } + }, + State { + when: dragArea.drag.held + AnchorChanges { target: windowFrame; anchors.verticalCenter: undefined; anchors.horizontalCenter: undefined } + } + + ] + + + Rectangle { + id: titleBar + border.width: 2 + color: "black" + height: 25 + anchors.top: windowFrame.top + anchors.right: windowFrame.right + anchors.left: windowFrame.left + anchors.margins: windowFrame.border.width + width: parent.width + + RowLayout { + anchors.right: parent.right + spacing: 0 + + Button { + iconName: "window-minimize" + //action: + } + + Button { + iconName: "window-maximize" + //action: + } + + Button { + iconName: "document-close" + //action: + } + + } + + Button { + iconName: "emblem-synchronized" + anchors.left: parent.left + } + + Text { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + color: "white" + text: "zwelch@trueos~8905:~/lumina/src-qt5/src-qml/test" + font.pixelSize: 10 + } + + MouseArea { + acceptedButtons: Qt.RightButton + anchors.fill: parent + //onClicked: contextMenu.open() + } + } + + Image { + id: frameContents +// source: "balloon.png" + anchors.top: titleBar.bottom + anchors.bottom: parent.bottom + anchors.left: windowFrame.left + anchors.right: windowFrame.right + anchors.leftMargin: windowFrame.border.width + anchors.rightMargin: windowFrame.border.width + anchors.bottomMargin: windowFrame.border.width + width: parent.width + height: parent.height + + MouseArea { + width: parent.width; + height: parent.height; + anchors.fill: frameContents; + onClicked: { console.log(parent.mapToGlobal(mouse.x, mouse.y)); } + + } + } + } +} -- cgit From 08be43cdb27d5179bca9567aed802c91664e44bf Mon Sep 17 00:00:00 2001 From: ZackaryWelch Date: Fri, 5 Jan 2018 16:12:15 -0500 Subject: Changed color and removed comments from Matrix screensaver --- .../extrafiles/screensavers/qml_scripts/Matrix.qml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/extrafiles/screensavers/qml_scripts/Matrix.qml b/src-qt5/core/lumina-desktop-unified/extrafiles/screensavers/qml_scripts/Matrix.qml index 1ab4b96c..d4031201 100644 --- a/src-qt5/core/lumina-desktop-unified/extrafiles/screensavers/qml_scripts/Matrix.qml +++ b/src-qt5/core/lumina-desktop-unified/extrafiles/screensavers/qml_scripts/Matrix.qml @@ -1,4 +1,3 @@ -// vi: ft=qml import QtQuick 2.0 import QtMultimedia 5.7 import QtQuick.Window 2.2 @@ -22,11 +21,10 @@ Rectangle { width: 10 Text { id: column - color: "red" + color: "#ff4d4d" font.pixelSize: 10 transform: Rotation { origin.x: 0; origin.y: 0; angle: 90 } Timer { - //interval: Math.random() * ((cR.index % 2) ? 50 : 20) + ((cR.index % 2) ? 90 : 70) interval: 50 repeat: true running: true @@ -35,7 +33,6 @@ Rectangle { var bottom = column.text.charAt(column.text.length-1) var newString = bottom+column.text.substring(0, column.text.length-1) column.text = newString - //interval = Math.random() * ((cR.index % 2) ? 50 : 20) + ((cR.index % 2) ? 90 : 70) interval = 50 }else{ interval = 1000 -- cgit From 9fe1845f0e2d75dc8a6d3d49fac6780b394b0067 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Mon, 8 Jan 2018 14:19:58 -0500 Subject: Another large update to Lumina 2: Starting to hook up the new QML window frame with the C++ backend. --- src-qt5/core/lumina-desktop-unified/LSession.cpp | 66 +- .../core/lumina-desktop-unified/global-includes.h | 5 +- .../core/lumina-desktop-unified/global-objects.h | 6 +- .../core/lumina-desktop-unified/lumina-desktop.pro | 15 +- .../src-desktop/ContextMenu.cpp | 189 ---- .../src-desktop/ContextMenu.h | 48 - .../src-desktop/DesktopManager.cpp | 34 +- .../src-desktop/DesktopManager.h | 6 + .../src-desktop/OldContextMenu.cpp | 189 ++++ .../src-desktop/OldContextMenu.h | 48 + .../src-desktop/RootWindow.h | 1 + .../src-desktop/src-cpp/NativeWindowObject.cpp | 40 +- .../src-desktop/src-cpp/NativeWindowObject.h | 5 +- .../src-desktop/src-cpp/RootDesktopObject.cpp | 13 +- .../src-desktop/src-cpp/RootDesktopObject.h | 18 +- .../src-desktop/src-cpp/ScreenObject.cpp | 2 +- .../src-desktop/src-qml/ContextMenu.qml | 15 + .../src-desktop/src-qml/NativeWindow.qml | 184 ++++ .../src-desktop/src-qml/RootDesktop.qml | 11 + .../src-desktop/src-qml/WindowFrame.qml | 172 ---- .../src-desktop/src-qml/src-qml.pri | 3 +- .../src-desktop/src-qml/src-qml.qrc | 1 + .../src-events/LShortcutEvents.h | 3 +- .../src-events/NativeEventFilter.cpp | 303 +++++++ .../src-events/NativeEventFilter.h | 71 ++ .../src-events/NativeKeyToQt.cpp | 528 +++++++++++ .../src-events/NativeWindowSystem.cpp | 980 +++++++++++++++++++++ .../src-events/NativeWindowSystem.h | 143 +++ .../lumina-desktop-unified/src-events/events.pri | 18 +- 29 files changed, 2612 insertions(+), 505 deletions(-) delete mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.cpp delete mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.h create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/OldContextMenu.cpp create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/OldContextMenu.h create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml delete mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/WindowFrame.qml create mode 100644 src-qt5/core/lumina-desktop-unified/src-events/NativeEventFilter.cpp create mode 100644 src-qt5/core/lumina-desktop-unified/src-events/NativeEventFilter.h create mode 100644 src-qt5/core/lumina-desktop-unified/src-events/NativeKeyToQt.cpp create mode 100644 src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp create mode 100644 src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/LSession.cpp b/src-qt5/core/lumina-desktop-unified/LSession.cpp index ed4d644b..69c42c73 100644 --- a/src-qt5/core/lumina-desktop-unified/LSession.cpp +++ b/src-qt5/core/lumina-desktop-unified/LSession.cpp @@ -7,9 +7,8 @@ #include "LSession.h" #include "global-objects.h" -#include "src-desktop/ContextMenu.h" - #include "BootSplash.h" + #ifndef DEBUG #define DEBUG 1 #endif @@ -27,8 +26,8 @@ DesktopManager* Lumina::DESKMAN = 0; LSession::LSession(int &argc, char ** argv) : LSingleApplication(argc, argv, "lumina-desktop-unified"){ //Initialize the global objects to null pointers qRegisterMetaType< Qt::Key >("Qt::Key"); - qRegisterMetaType< NativeWindow::Property >("NativeWindow::Property"); - qRegisterMetaType< QList< NativeWindow::Property > >("QList"); + qRegisterMetaType< NativeWindowObject::Property >("NativeWindowObject::Property"); + qRegisterMetaType< QList< NativeWindowObject::Property > >("QList"); qRegisterMetaType< NativeWindowSystem::MouseButton >("NativeWindowSystem::MouseButton"); mediaObj = 0; //private object used for playing login/logout chimes @@ -113,7 +112,7 @@ void LSession::setupSession(){ Lumina::DESKMAN->start(); Lumina::ROOTWIN->start(); //Initialize the internal variables - //DESKTOPS.clear(); + //Start the background system tray splash.showScreen("systray"); @@ -122,50 +121,18 @@ void LSession::setupSession(){ splash.showScreen("apps"); if(DEBUG){ qDebug() << " - Populate App List:" << timer->elapsed();} Lumina::APPLIST->updateList(); - //appmenu = new AppMenu(); + splash.showScreen("menus"); - //if(DEBUG){ qDebug() << " - Init SettingsMenu:" << timer->elapsed();} - //settingsmenu = new SettingsMenu(); - //if(DEBUG){ qDebug() << " - Init SystemWindow:" << timer->elapsed();} - //sysWindow = new SystemWindow(); + //Initialize the desktops splash.showScreen("desktop"); - /*if(DEBUG){ qDebug() << " - Init Desktops:" << timer->elapsed(); } - QList scrns= QApplication::screens(); - for(int i=0; iname(); - RootDesktopObject::instance()->ChangeWallpaper(scrns[i]->name(),QUrl::fromLocalFile(LOS::LuminaShare()+"desktop-background.jpg").toString() ); - }*/ - - if(DEBUG){ qDebug() << " - Create Desktop Context Menu"; } - - /*DesktopContextMenu *cmenu = new DesktopContextMenu(Lumina::ROOTWIN); - connect(cmenu, SIGNAL(showLeaveDialog()), this, SLOT(StartLogout()) ); - cmenu->start();*/ - //desktopFiles = QDir(QDir::homePath()+"/Desktop").entryInfoList(QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs, QDir::Name | QDir::IgnoreCase | QDir::DirsFirst); - //updateDesktops(); //for(int i=0; i<6; i++){ LSession::processEvents(); } //Run through this a few times so the interface systems get up and running //Now setup the system watcher for changes splash.showScreen("final"); - //if(DEBUG){ qDebug() << " - Init QFileSystemWatcher:" << timer->elapsed();} - /*watcher = new QFileSystemWatcher(this); - QString confdir = sessionsettings->fileName().section("/",0,-2); - watcherChange(sessionsettings->fileName() ); - watcherChange( confdir+"/desktopsettings.conf" ); - watcherChange( confdir+"/fluxbox-init" ); - watcherChange( confdir+"/fluxbox-keys" ); - watcherChange( confdir+"/favorites.list" ); - //Try to watch the localized desktop folder too - if(QFile::exists(QDir::homePath()+"/"+tr("Desktop"))){ watcherChange( QDir::homePath()+"/"+tr("Desktop") ); } - watcherChange( QDir::homePath()+"/Desktop" );*/ - - //connect internal signals/slots - //connect(watcher, SIGNAL(directoryChanged(QString)), this, SLOT(watcherChange(QString)) ); - //connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT(watcherChange(QString)) ); - //connect(this, SIGNAL(aboutToQuit()), this, SLOT(SessionEnding()) ); + if(DEBUG){ qDebug() << " - Start Screen Saver:" << timer->elapsed();} Lumina::SS->start(); @@ -236,16 +203,17 @@ void LSession::setupGlobalConnections(){ connect(RootDesktopObject::instance(), SIGNAL(mouseMoved()), Lumina::SS, SLOT(newInputEvent()) ); connect(RootDesktopObject::instance(), SIGNAL(startLogout()), this, SLOT(StartLogout()) ); connect(RootDesktopObject::instance(), SIGNAL(lockScreen()), Lumina::SS, SLOT(LockScreenNow()) ); + connect(RootDesktopObject::instance(), SIGNAL(launchApplication(QString)), this, SLOT(LaunchStandardApplication(QString)) ); //Native Window Class connections connect(Lumina::NEF, SIGNAL(WindowCreated(WId)), Lumina::NWS, SLOT(NewWindowDetected(WId))); connect(Lumina::NEF, SIGNAL(WindowDestroyed(WId)), Lumina::NWS, SLOT(WindowCloseDetected(WId))); - connect(Lumina::NEF, SIGNAL(WindowPropertyChanged(WId, NativeWindow::Property)), Lumina::NWS, SLOT(WindowPropertyChanged(WId, NativeWindow::Property))); - connect(Lumina::NEF, SIGNAL(WindowPropertiesChanged(WId, QList)), Lumina::NWS, SLOT(WindowPropertiesChanged(WId, QList)) ); - connect(Lumina::NEF, SIGNAL(WindowPropertyChanged(WId, NativeWindow::Property, QVariant)), Lumina::NWS, SLOT(WindowPropertyChanged(WId, NativeWindow::Property, QVariant))); - connect(Lumina::NEF, SIGNAL(WindowPropertiesChanged(WId, QList, QList)), Lumina::NWS, SLOT(WindowPropertiesChanged(WId, QList, QList)) ); - connect(Lumina::NEF, SIGNAL(RequestWindowPropertyChange(WId, NativeWindow::Property, QVariant)), Lumina::NWS, SLOT(RequestPropertyChange(WId, NativeWindow::Property, QVariant))); - connect(Lumina::NEF, SIGNAL(RequestWindowPropertiesChange(WId, QList, QList)), Lumina::NWS, SLOT(RequestPropertiesChange(WId, QList, QList))); + connect(Lumina::NEF, SIGNAL(WindowPropertyChanged(WId, NativeWindowObject::Property)), Lumina::NWS, SLOT(WindowPropertyChanged(WId, NativeWindowObject::Property))); + connect(Lumina::NEF, SIGNAL(WindowPropertiesChanged(WId, QList)), Lumina::NWS, SLOT(WindowPropertiesChanged(WId, QList)) ); + connect(Lumina::NEF, SIGNAL(WindowPropertyChanged(WId, NativeWindowObject::Property, QVariant)), Lumina::NWS, SLOT(WindowPropertyChanged(WId, NativeWindowObject::Property, QVariant))); + connect(Lumina::NEF, SIGNAL(WindowPropertiesChanged(WId, QList, QList)), Lumina::NWS, SLOT(WindowPropertiesChanged(WId, QList, QList)) ); + connect(Lumina::NEF, SIGNAL(RequestWindowPropertyChange(WId, NativeWindowObject::Property, QVariant)), Lumina::NWS, SLOT(RequestPropertyChange(WId, NativeWindowObject::Property, QVariant))); + connect(Lumina::NEF, SIGNAL(RequestWindowPropertiesChange(WId, QList, QList)), Lumina::NWS, SLOT(RequestPropertiesChange(WId, QList, QList))); connect(Lumina::NEF, SIGNAL(TrayWindowCreated(WId)), Lumina::NWS, SLOT(NewTrayWindowDetected(WId))); connect(Lumina::NEF, SIGNAL(TrayWindowDestroyed(WId)), Lumina::NWS, SLOT(WindowCloseDetected(WId))); connect(Lumina::NEF, SIGNAL(PossibleDamageEvent(WId)), Lumina::NWS, SLOT(CheckDamageID(WId))); @@ -273,7 +241,11 @@ void LSession::setupGlobalConnections(){ connect(Lumina::NWS, SIGNAL(MouseReleaseDetected(WId, NativeWindowSystem::MouseButton)), Lumina::SHORTCUTS, SLOT(MouseRelease(WId, NativeWindowSystem::MouseButton)) ); //NWS Events to the window system - connect(Lumina::NWS, SIGNAL(NewWindowAvailable(NativeWindow*)), Lumina::ROOTWIN, SLOT(NewWindow(NativeWindow*)) ); + connect(Lumina::NWS, SIGNAL(NewWindowAvailable(NativeWindowObject*)), Lumina::DESKMAN, SLOT(NewWindowAvailable(NativeWindowObject*)) ); + connect(Lumina::NWS, SIGNAL(WindowClosed()), Lumina::DESKMAN, SLOT(syncWindowList()) ); + connect(Lumina::NWS, SIGNAL(NewTrayWindowAvailable(NativeWindowObject*)), Lumina::DESKMAN, SLOT(NewTrayWindowAvailable(NativeWindowObject*)) ); + connect(Lumina::NWS, SIGNAL(TrayWindowClosed()), Lumina::DESKMAN, SLOT(syncTrayWindowList()) ); + } //================= diff --git a/src-qt5/core/lumina-desktop-unified/global-includes.h b/src-qt5/core/lumina-desktop-unified/global-includes.h index fbc3c4f7..2ca8af15 100644 --- a/src-qt5/core/lumina-desktop-unified/global-includes.h +++ b/src-qt5/core/lumina-desktop-unified/global-includes.h @@ -69,15 +69,12 @@ #include #include #include -#include -#include -#include #include #include #include // C++ Backend classes for QML interface -#include +#include #include //Setup any global defines (no classes or global objects: use "global-objects.h" for that) diff --git a/src-qt5/core/lumina-desktop-unified/global-objects.h b/src-qt5/core/lumina-desktop-unified/global-objects.h index 4cea60c2..bba55b84 100644 --- a/src-qt5/core/lumina-desktop-unified/global-objects.h +++ b/src-qt5/core/lumina-desktop-unified/global-objects.h @@ -21,10 +21,14 @@ //#ifndef USE_WAYLAND //#include "src-events/LXcbEventFilter.h" //#endif + +#include "src-events/NativeWindowSystem.h" +#include "src-events/NativeEventFilter.h" +#include "src-desktop/src-cpp/RootDesktopObject.h" + #include "src-events/LShortcutEvents.h" #include "src-desktop/DesktopManager.h" #include "src-screensaver/LScreenSaver.h" -//#include "src-WM/LWindowManager.h" #include #include "LSession.h" diff --git a/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro b/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro index bb987e25..07781770 100644 --- a/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro +++ b/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro @@ -1,11 +1,11 @@ include($${PWD}/../../OS-detect.pri) lessThan(QT_MAJOR_VERSION, 5) { - message("[ERROR] Qt 5.4+ is required to use the Lumina Desktop!") + message("[ERROR] Qt 5.7+ is required to use the Lumina Desktop!") exit } -lessThan(QT_MINOR_VERSION, 4){ - message("[ERROR] Qt 5.4+ is required to use the Lumina Desktop!") +lessThan(QT_MINOR_VERSION, 7){ + message("[ERROR] Qt 5.7+ is required to use the Lumina Desktop!") exit } @@ -21,14 +21,13 @@ include(../libLumina/LuminaXDG.pri) include(../libLumina/LuminaSingleApplication.pri) include(../libLumina/DesktopSettings.pri) include(../libLumina/ExternalProcess.pri) -include(../../src-cpp/NativeWindow.pri) include(../libLumina/XDGMime.pri) include(../../src-cpp/plugins-base.pri) #include all the main individual source groups -include(src-screensaver/screensaver.pri) include(src-events/events.pri) +include(src-screensaver/screensaver.pri) include(src-desktop/desktop.pri) TEMPLATE = app @@ -44,12 +43,6 @@ HEADERS += global-includes.h \ FORMS += BootSplash.ui - - -#Now include all the files for the various plugins -#include(panel-plugins/panel-plugins.pri) -#include(desktop-plugins/desktop-plugins.pri) - # Install all the various files for the desktop itself desktop.path = $${L_SESSDIR} desktop.files = lumina-desktop.desktop diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.cpp deleted file mode 100644 index 47f0e3d7..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.cpp +++ /dev/null @@ -1,189 +0,0 @@ -//=========================================== -// Lumina-desktop source code -// Copyright (c) 2012-2017, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "ContextMenu.h" -#include -#include - -void DesktopContextMenu::SettingsChanged(DesktopSettings::File file){ - if(file == DesktopSettings::ContextMenu){ UpdateMenu(false); } -} - -void DesktopContextMenu::UpdateMenu(bool fast){ - //Put a label at the top - unsigned int num = Lumina::NWS->currentWorkspace(); - workspaceLabel->setText( ""+QString(tr("Workspace %1")).arg(QString::number(num+1))+""); - if(fast && usewinmenu){ updateWinMenu(); } - if(fast){ return; } //already done - this->clear(); //clear it for refresh - this->addAction(wkspaceact); - this->addSeparator(); - //Now load the user's menu setup and fill the menu - QStringList items = DesktopSettings::instance()->value(DesktopSettings::ContextMenu, "itemlist", QStringList()<< "terminal" << "filemanager" << "line" << "applications" << "windowlist" << "settings" << "lockdesktop").toStringList(); - usewinmenu=false; - for(int i=0; iaddAction( tr("Terminal")); - LIconCache::instance()->loadIcon(act, "utilities-terminal"); - act->setWhatsThis("--terminal"); - } - else if(items[i]=="lockdesktop"){ - QAction *act = this->addAction( tr("Lock Session"), this, SIGNAL(LockSession()) ); - LIconCache::instance()->loadIcon(act, "system-lock-screen"); - } - else if(items[i]=="filemanager"){ - QAction *act = this->addAction( tr("Browse Files")); - LIconCache::instance()->loadIcon(act, "user-home"); - act->setWhatsThis(QDir::homePath()); - } - else if(items[i]=="applications"){ - if(appMenu==0){ updateAppMenu(); } - this->addMenu( appMenu ); - } - else if(items[i]=="line"){ this->addSeparator(); } - //else if(items[i]=="settings"){ this->addMenu( LSession::handle()->settingsMenu() ); } - else if(items[i]=="windowlist"){ - if(winMenu==0){ updateWinMenu(); } - this->addMenu( winMenu); - usewinmenu=true; - }else if(items[i].startsWith("app::::") && items[i].endsWith(".desktop")){ - //Custom *.desktop application - QString file = items[i].section("::::",1,1).simplified(); - //Try to use the pre-loaded app entry for this - XDGDesktop *xdg = XDGDesktopList::instance()->findAppFile(file); - if(xdg!=0){ xdg->addToMenu(this); } - else{ - XDGDesktop xdgf(file);// = LXDG::loadDesktopFile(file, ok); - if(xdgf.type!=XDGDesktop::BAD){ xdgf.addToMenu(this); } - } - }else if(items[i].startsWith("jsonmenu::::")){ - //Custom JSON menu system (populated on demand via external scripts/tools - QStringList info = items[i].split("::::"); //FORMAT:[ "jsonmenu",exec,name, icon(optional)] - if(info.length()>=3){ - //qDebug() << "Custom JSON Menu Loaded:" << info; - JsonMenu *tmp = new JsonMenu(info[1], this); - tmp->setTitle(info[2]); - connect(tmp, SIGNAL(triggered(QAction*)), this, SLOT(SystemApplication(QAction*)) ); - if(info.length()>=4){ tmp->setIcon( LXDG::findIcon(info[3],"") ); } - this->addMenu(tmp); - } - } - } - //Now add the system quit options - this->addSeparator(); - this->addAction(LXDG::findIcon("system-log-out",""), tr("Leave"), this, SIGNAL(showLeaveDialog()) ); -} - -// === PRIVATE === -void DesktopContextMenu::AddWindowToMenu(NativeWindow *win){ - QString label = win->property(NativeWindow::ShortTitle).toString(); - if(label.isEmpty()){ label = win->property(NativeWindow::Title).toString(); } - if(label.isEmpty()){ label = win->property(NativeWindow::Name).toString(); } - QAction *tmp = winMenu->addAction( win->property(NativeWindow::Icon).value(), label, win, SLOT(toggleVisibility()) ); - //Need to change the visual somehow to indicate whether it is visible or not - //bool visible = win->property(NativeWindow::Visible).toBool(); - // TODO -} - -// === PUBLIC === -DesktopContextMenu::DesktopContextMenu(QWidget *parent) : QMenu(parent){ - if(parent!=0){ - parent->setContextMenuPolicy(Qt::CustomContextMenu); - connect(parent, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showMenu(const QPoint&)) ); - } - appMenu = 0; - winMenu = 0; - usewinmenu = false; - workspaceLabel = new QLabel(0); - workspaceLabel->setAlignment(Qt::AlignCenter); - wkspaceact = new QWidgetAction(0); - wkspaceact->setDefaultWidget(workspaceLabel); - connect(this, SIGNAL(triggered(QAction*)), this, SLOT(LaunchAction(QAction*)) ); - //Connect to a couple global objects - connect(this, SIGNAL(aboutToShow()), this, SLOT(UpdateMenu()) ); //this will do a "fast" update - qDebug() << "Done Creating Context Menu"; -} - -DesktopContextMenu::~DesktopContextMenu(){ - //nothing special - //workspaceLabel->deleteLater(); //The QWidgetAction takes ownership of the label when inserted - do not manually delete - wkspaceact->deleteLater(); -} - -void DesktopContextMenu::start(){ - connect(DesktopSettings::instance(), SIGNAL(FileModified(DesktopSettings::File)), this, SLOT(SettingsChanged(DesktopSettings::File)) ); - connect(this, SIGNAL(LockSession()), Lumina::SS, SLOT(LockScreenNow()) ); - connect(XDGDesktopList::instance(), SIGNAL(appsUpdated()), this, SLOT(updateAppMenu()) ); - UpdateMenu(false); - //Still need to connect to some "workspaceChanged(int)" signal -} - -// === PRIVATE SLOTS === -void DesktopContextMenu::LaunchAction(QAction *act){ - //qDebug() << "Launch Action Triggered:" << act->whatsThis(); - if(act->whatsThis().isEmpty() || act->parent()!=this ){ return; } - qDebug() << "Launch Menu Action:" << act->whatsThis(); - QString cmd = act->whatsThis(); - if(cmd.startsWith("-action ")){ - LaunchApp(act); //forward this to the XDGDesktop parser - }else if(cmd.startsWith("--") || cmd.endsWith(".desktop")){ - LSession::instance()->LaunchStandardApplication(cmd); - }else if(QFile::exists(cmd)){ - QString mime = XDGMime::fromFileName(cmd); - LSession::instance()->LaunchStandardApplication(mime, QStringList() << cmd); - } -} - -void DesktopContextMenu::LaunchApp(QAction *act){ - - // The "whatsThis() field is set by the XDGDesktop object/format - if(act->whatsThis().isEmpty()){ return; } - QString action, file; - QString wt = act->whatsThis(); - if(wt.startsWith("-action")){ - action = wt.section(" ",1,1); action=action.remove("\""); - file = wt.section(" ",2,-1); file=file.remove("\""); - } - else{ file = wt; } - LSession::instance()->LaunchDesktopApplication(file, action); - -} - -void DesktopContextMenu::showMenu(const QPoint &pt){ - this->popup(pt); -} - -void DesktopContextMenu::updateAppMenu(){ - //qDebug() << "Update App Menu"; - if(appMenu==0){ - appMenu = new QMenu(this); - appMenu->setTitle( tr("Applications")); - LIconCache::instance()->loadIcon( appMenu, "system-run"); - connect(appMenu, SIGNAL(triggered(QAction*)), this, SLOT(LaunchApp(QAction*)) ); - } - //qDebug() << "Populate App Menu"; - XDGDesktopList::instance()->populateMenu(appMenu); -} - -void DesktopContextMenu::updateWinMenu(){ - //qDebug() << "Update Win Menu"; - if(winMenu==0){ - winMenu = new QMenu(this); - winMenu->setTitle( tr("Task Manager") ); - LIconCache::instance()->loadIcon( winMenu, "preferences-system-windows"); - } - winMenu->clear(); - QList wins = Lumina::NWS->currentWindows(); - unsigned int wkspace = Lumina::NWS->currentWorkspace(); - for(int i=0; iproperty(NativeWindow::Workspace).toUInt() != wkspace - && wins.at(i)->property(NativeWindow::States).value< QList >().contains(NativeWindow::S_STICKY) ){ - continue; - } - AddWindowToMenu(wins.at(i)); - } -} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.h b/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.h deleted file mode 100644 index 78756e8c..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.h +++ /dev/null @@ -1,48 +0,0 @@ -//=========================================== -// Lumina-desktop source code -// Copyright (c) 2012-2017, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#ifndef _LUMINA_DESKTOP_CONTEXT_MENU_H -#define _LUMINA_DESKTOP_CONTEXT_MENU_H - -#include - -class DesktopContextMenu : public QMenu{ - Q_OBJECT -public slots: - void SettingsChanged(DesktopSettings::File); - void UpdateMenu(bool fast = true); //re-create the menu - -private: - QLabel *workspaceLabel; - QWidgetAction *wkspaceact; - QMenu *appMenu, *winMenu; - bool usewinmenu; - - void AddWindowToMenu(NativeWindow*); - -public: - DesktopContextMenu(QWidget *parent = 0); - ~DesktopContextMenu(); - - void start(); //setup connections to global objects - -private slots: - void LaunchAction(QAction *act); - void LaunchApp(QAction *act); - - void showMenu(const QPoint&); - - void updateAppMenu(); - void updateWinMenu(); - -signals: - void LockSession(); - void showLeaveDialog(); - void LaunchStandardApplication(QString); - void LaunchApplication(QString); -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp index d6d06be9..b9ea3078 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp @@ -76,7 +76,7 @@ void DesktopManager::updateWallpaper(QString screen_id, int wkspace){ } //Now go ahead and set the wallpaper in the screen object if(wpaper.isEmpty() || wpaper=="default"){ wpaper = LOS::LuminaShare()+"desktop-background.jpg"; } //failover image - qDebug() << "Updating Wallpaper:" << screen_id << wpaper; + //qDebug() << "Updating Wallpaper:" << screen_id << wpaper; RootDesktopObject::instance()->ChangeWallpaper(screen_id,QUrl::fromLocalFile(wpaper).toString() ); } @@ -91,7 +91,7 @@ void DesktopManager::updatePlugins(QString plugin_id){ // === PUBLIC SLOTS === void DesktopManager::workspaceChanged(int wknum){ qDebug() << "Got Workspace Changed:" << wknum; - + syncWindowList(); } void DesktopManager::settingsChanged(DesktopSettings::File type){ @@ -112,6 +112,35 @@ void DesktopManager::settingsChanged(DesktopSettings::File type){ } } +void DesktopManager::NewWindowAvailable(NativeWindowObject* win){ + //connect(win, SIGNAL(WindowClosed(WId)), this, SLOT(syncWindowList()) ); + syncWindowList(); +} + +void DesktopManager::NewTrayWindowAvailable(NativeWindowObject* win){ + //connect(win, SIGNAL(WindowClosed(WId)), this, SLOT(syncTrayWindowList()) ); + syncTrayWindowList(); +} + +void DesktopManager::syncWindowList(){ + QList allWins = Lumina::NWS->currentWindows(); + //Filter out all the windows not in the current workspace + QList current; + QList currentStacked; + int wkspace = Lumina::NWS->currentWorkspace(); + for(int i=0; iisSticky() || (allWins[i]->workspace() == wkspace)){ + current << allWins[i]; + } + } + //qDebug() << "Synced Window List:" << current.length(); + RootDesktopObject::instance()->setWindows(current); +} + +void DesktopManager::syncTrayWindowList(){ + +} + // === PRIVATE SLOTS === void DesktopManager::updateDesktopSettings(){ qDebug() << "Update Desktop Settings..."; @@ -136,4 +165,3 @@ void DesktopManager::updateMenuSettings(){ void DesktopManager::updateAnimationSettings(){ } - diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.h b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.h index df681afa..d4a0cf79 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.h @@ -30,6 +30,12 @@ public slots: void workspaceChanged(int); void settingsChanged(DesktopSettings::File); + void NewWindowAvailable(NativeWindowObject*); + void NewTrayWindowAvailable(NativeWindowObject*); + + void syncWindowList(); + void syncTrayWindowList(); + private slots: void updateDesktopSettings(); void updatePanelSettings(); diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/OldContextMenu.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/OldContextMenu.cpp new file mode 100644 index 00000000..47f0e3d7 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/OldContextMenu.cpp @@ -0,0 +1,189 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2012-2017, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "ContextMenu.h" +#include +#include + +void DesktopContextMenu::SettingsChanged(DesktopSettings::File file){ + if(file == DesktopSettings::ContextMenu){ UpdateMenu(false); } +} + +void DesktopContextMenu::UpdateMenu(bool fast){ + //Put a label at the top + unsigned int num = Lumina::NWS->currentWorkspace(); + workspaceLabel->setText( ""+QString(tr("Workspace %1")).arg(QString::number(num+1))+""); + if(fast && usewinmenu){ updateWinMenu(); } + if(fast){ return; } //already done + this->clear(); //clear it for refresh + this->addAction(wkspaceact); + this->addSeparator(); + //Now load the user's menu setup and fill the menu + QStringList items = DesktopSettings::instance()->value(DesktopSettings::ContextMenu, "itemlist", QStringList()<< "terminal" << "filemanager" << "line" << "applications" << "windowlist" << "settings" << "lockdesktop").toStringList(); + usewinmenu=false; + for(int i=0; iaddAction( tr("Terminal")); + LIconCache::instance()->loadIcon(act, "utilities-terminal"); + act->setWhatsThis("--terminal"); + } + else if(items[i]=="lockdesktop"){ + QAction *act = this->addAction( tr("Lock Session"), this, SIGNAL(LockSession()) ); + LIconCache::instance()->loadIcon(act, "system-lock-screen"); + } + else if(items[i]=="filemanager"){ + QAction *act = this->addAction( tr("Browse Files")); + LIconCache::instance()->loadIcon(act, "user-home"); + act->setWhatsThis(QDir::homePath()); + } + else if(items[i]=="applications"){ + if(appMenu==0){ updateAppMenu(); } + this->addMenu( appMenu ); + } + else if(items[i]=="line"){ this->addSeparator(); } + //else if(items[i]=="settings"){ this->addMenu( LSession::handle()->settingsMenu() ); } + else if(items[i]=="windowlist"){ + if(winMenu==0){ updateWinMenu(); } + this->addMenu( winMenu); + usewinmenu=true; + }else if(items[i].startsWith("app::::") && items[i].endsWith(".desktop")){ + //Custom *.desktop application + QString file = items[i].section("::::",1,1).simplified(); + //Try to use the pre-loaded app entry for this + XDGDesktop *xdg = XDGDesktopList::instance()->findAppFile(file); + if(xdg!=0){ xdg->addToMenu(this); } + else{ + XDGDesktop xdgf(file);// = LXDG::loadDesktopFile(file, ok); + if(xdgf.type!=XDGDesktop::BAD){ xdgf.addToMenu(this); } + } + }else if(items[i].startsWith("jsonmenu::::")){ + //Custom JSON menu system (populated on demand via external scripts/tools + QStringList info = items[i].split("::::"); //FORMAT:[ "jsonmenu",exec,name, icon(optional)] + if(info.length()>=3){ + //qDebug() << "Custom JSON Menu Loaded:" << info; + JsonMenu *tmp = new JsonMenu(info[1], this); + tmp->setTitle(info[2]); + connect(tmp, SIGNAL(triggered(QAction*)), this, SLOT(SystemApplication(QAction*)) ); + if(info.length()>=4){ tmp->setIcon( LXDG::findIcon(info[3],"") ); } + this->addMenu(tmp); + } + } + } + //Now add the system quit options + this->addSeparator(); + this->addAction(LXDG::findIcon("system-log-out",""), tr("Leave"), this, SIGNAL(showLeaveDialog()) ); +} + +// === PRIVATE === +void DesktopContextMenu::AddWindowToMenu(NativeWindow *win){ + QString label = win->property(NativeWindow::ShortTitle).toString(); + if(label.isEmpty()){ label = win->property(NativeWindow::Title).toString(); } + if(label.isEmpty()){ label = win->property(NativeWindow::Name).toString(); } + QAction *tmp = winMenu->addAction( win->property(NativeWindow::Icon).value(), label, win, SLOT(toggleVisibility()) ); + //Need to change the visual somehow to indicate whether it is visible or not + //bool visible = win->property(NativeWindow::Visible).toBool(); + // TODO +} + +// === PUBLIC === +DesktopContextMenu::DesktopContextMenu(QWidget *parent) : QMenu(parent){ + if(parent!=0){ + parent->setContextMenuPolicy(Qt::CustomContextMenu); + connect(parent, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showMenu(const QPoint&)) ); + } + appMenu = 0; + winMenu = 0; + usewinmenu = false; + workspaceLabel = new QLabel(0); + workspaceLabel->setAlignment(Qt::AlignCenter); + wkspaceact = new QWidgetAction(0); + wkspaceact->setDefaultWidget(workspaceLabel); + connect(this, SIGNAL(triggered(QAction*)), this, SLOT(LaunchAction(QAction*)) ); + //Connect to a couple global objects + connect(this, SIGNAL(aboutToShow()), this, SLOT(UpdateMenu()) ); //this will do a "fast" update + qDebug() << "Done Creating Context Menu"; +} + +DesktopContextMenu::~DesktopContextMenu(){ + //nothing special + //workspaceLabel->deleteLater(); //The QWidgetAction takes ownership of the label when inserted - do not manually delete + wkspaceact->deleteLater(); +} + +void DesktopContextMenu::start(){ + connect(DesktopSettings::instance(), SIGNAL(FileModified(DesktopSettings::File)), this, SLOT(SettingsChanged(DesktopSettings::File)) ); + connect(this, SIGNAL(LockSession()), Lumina::SS, SLOT(LockScreenNow()) ); + connect(XDGDesktopList::instance(), SIGNAL(appsUpdated()), this, SLOT(updateAppMenu()) ); + UpdateMenu(false); + //Still need to connect to some "workspaceChanged(int)" signal +} + +// === PRIVATE SLOTS === +void DesktopContextMenu::LaunchAction(QAction *act){ + //qDebug() << "Launch Action Triggered:" << act->whatsThis(); + if(act->whatsThis().isEmpty() || act->parent()!=this ){ return; } + qDebug() << "Launch Menu Action:" << act->whatsThis(); + QString cmd = act->whatsThis(); + if(cmd.startsWith("-action ")){ + LaunchApp(act); //forward this to the XDGDesktop parser + }else if(cmd.startsWith("--") || cmd.endsWith(".desktop")){ + LSession::instance()->LaunchStandardApplication(cmd); + }else if(QFile::exists(cmd)){ + QString mime = XDGMime::fromFileName(cmd); + LSession::instance()->LaunchStandardApplication(mime, QStringList() << cmd); + } +} + +void DesktopContextMenu::LaunchApp(QAction *act){ + + // The "whatsThis() field is set by the XDGDesktop object/format + if(act->whatsThis().isEmpty()){ return; } + QString action, file; + QString wt = act->whatsThis(); + if(wt.startsWith("-action")){ + action = wt.section(" ",1,1); action=action.remove("\""); + file = wt.section(" ",2,-1); file=file.remove("\""); + } + else{ file = wt; } + LSession::instance()->LaunchDesktopApplication(file, action); + +} + +void DesktopContextMenu::showMenu(const QPoint &pt){ + this->popup(pt); +} + +void DesktopContextMenu::updateAppMenu(){ + //qDebug() << "Update App Menu"; + if(appMenu==0){ + appMenu = new QMenu(this); + appMenu->setTitle( tr("Applications")); + LIconCache::instance()->loadIcon( appMenu, "system-run"); + connect(appMenu, SIGNAL(triggered(QAction*)), this, SLOT(LaunchApp(QAction*)) ); + } + //qDebug() << "Populate App Menu"; + XDGDesktopList::instance()->populateMenu(appMenu); +} + +void DesktopContextMenu::updateWinMenu(){ + //qDebug() << "Update Win Menu"; + if(winMenu==0){ + winMenu = new QMenu(this); + winMenu->setTitle( tr("Task Manager") ); + LIconCache::instance()->loadIcon( winMenu, "preferences-system-windows"); + } + winMenu->clear(); + QList wins = Lumina::NWS->currentWindows(); + unsigned int wkspace = Lumina::NWS->currentWorkspace(); + for(int i=0; iproperty(NativeWindow::Workspace).toUInt() != wkspace + && wins.at(i)->property(NativeWindow::States).value< QList >().contains(NativeWindow::S_STICKY) ){ + continue; + } + AddWindowToMenu(wins.at(i)); + } +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/OldContextMenu.h b/src-qt5/core/lumina-desktop-unified/src-desktop/OldContextMenu.h new file mode 100644 index 00000000..78756e8c --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/OldContextMenu.h @@ -0,0 +1,48 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2012-2017, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_DESKTOP_CONTEXT_MENU_H +#define _LUMINA_DESKTOP_CONTEXT_MENU_H + +#include + +class DesktopContextMenu : public QMenu{ + Q_OBJECT +public slots: + void SettingsChanged(DesktopSettings::File); + void UpdateMenu(bool fast = true); //re-create the menu + +private: + QLabel *workspaceLabel; + QWidgetAction *wkspaceact; + QMenu *appMenu, *winMenu; + bool usewinmenu; + + void AddWindowToMenu(NativeWindow*); + +public: + DesktopContextMenu(QWidget *parent = 0); + ~DesktopContextMenu(); + + void start(); //setup connections to global objects + +private slots: + void LaunchAction(QAction *act); + void LaunchApp(QAction *act); + + void showMenu(const QPoint&); + + void updateAppMenu(); + void updateWinMenu(); + +signals: + void LockSession(); + void showLeaveDialog(); + void LaunchStandardApplication(QString); + void LaunchApplication(QString); +}; + +#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h index ba489465..9cf42f3c 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h @@ -7,6 +7,7 @@ #ifndef _LUMINA_DESKTOP_ROOT_WINDOW_H #define _LUMINA_DESKTOP_ROOT_WINDOW_H #include +#include "src-cpp/RootDesktopObject.h" class RootWindow : public QObject{ Q_OBJECT diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp index a1b8dbbb..dcfd23b0 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp @@ -7,6 +7,7 @@ #include "NativeWindowObject.h" #include #include +#include // == QML Type Registration == void NativeWindowObject::RegisterType(){ @@ -60,6 +61,16 @@ QVariant NativeWindowObject::property(NativeWindowObject::Property prop){ void NativeWindowObject::setProperty(NativeWindowObject::Property prop, QVariant val, bool force){ if(prop == NativeWindowObject::RelatedWindows){ relatedTo = val.value< QList >(); } else if(prop == NativeWindowObject::None || (!force && hash.value(prop)==val)){ return; } + else if(prop == NativeWindowObject::WinImage){ + //special case - QImage is passed in, but QString is passed out (needed for QML) + QByteArray ba; + QBuffer buffer(&ba); + buffer.open(QIODevice::WriteOnly); + val.value().save(&buffer, "PNG"); + QString img("data:image/png:base64,"); + img.append(QString::fromLatin1(ba.toBase64().data())); + hash.insert(prop, img); //save the string instead + } else{ hash.insert(prop, val); } emitSinglePropChanged(prop); emit PropertiesChanged(QList() << prop, QList() << val); @@ -68,8 +79,20 @@ void NativeWindowObject::setProperty(NativeWindowObject::Property prop, QVariant void NativeWindowObject::setProperties(QList props, QList vals, bool force){ for(int i=0; i=vals.length()){ props.removeAt(i); i--; continue; } //no corresponding value for this property - if(props[i] == NativeWindowObject::None || (!force && (hash.value(props[i]) == vals[i])) ){ props.removeAt(i); vals.removeAt(i); i--; continue; } //Invalid property or identical value - hash.insert(props[i], vals[i]); + if(props[i] == NativeWindowObject::None || (!force && (hash.value(props[i]) == vals[i])) ){ + props.removeAt(i); vals.removeAt(i); i--; continue; //Invalid property or identical value + }else if(props[i] == NativeWindowObject::WinImage){ + //special case - QImage is passed in, but QString is passed out (needed for QML) + QByteArray ba; + QBuffer buffer(&ba); + buffer.open(QIODevice::WriteOnly); + vals[i].value().save(&buffer, "PNG"); + QString img("data:image/png:base64,"); + img.append(QString::fromLatin1(ba.toBase64().data())); + hash.insert(props[i], img); //save the string instead + }else{ + hash.insert(props[i], vals[i]); + } emitSinglePropChanged(props[i]); } emit PropertiesChanged(props, vals); @@ -117,8 +140,8 @@ QRect NativeWindowObject::geometry(){ } // QML ACCESS FUNCTIONS (shortcuts for particular properties in a format QML can use) -QImage NativeWindowObject::winImage(){ - return this->property(NativeWindowObject::WinImage).value(); +QString NativeWindowObject::winImage(){ + return this->property(NativeWindowObject::WinImage).toString(); } QString NativeWindowObject::name(){ @@ -130,7 +153,10 @@ QString NativeWindowObject::title(){ } QString NativeWindowObject::shortTitle(){ - return this->property(NativeWindowObject::ShortTitle).toString(); + QString tmp = this->property(NativeWindowObject::ShortTitle).toString(); + if(tmp.isEmpty()){ tmp = title(); } + if(tmp.isEmpty()){ tmp = name(); } + return tmp; } QIcon NativeWindowObject::icon(){ @@ -215,6 +241,10 @@ bool NativeWindowObject::isSticky(){ return (this->property(NativeWindowObject::Workspace).toInt()<0 || this->property(NativeWindowObject::States).value >().contains(NativeWindowObject::S_STICKY) ); } +int NativeWindowObject::workspace(){ + return this->property(NativeWindowObject::Workspace).toInt(); +} + //QML Geometry reporting QRect NativeWindowObject::frameGeometry(){ return geometry(); diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h index 8a8504aa..e4f9d41e 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h @@ -17,7 +17,7 @@ class NativeWindowObject : public QObject{ Q_OBJECT // QML-ACCESSIBLE PROPERTIES - Q_PROPERTY( QImage winImage READ winImage NOTIFY winImageChanged) + Q_PROPERTY( QString winImage READ winImage NOTIFY winImageChanged) Q_PROPERTY( QString name READ name NOTIFY nameChanged) Q_PROPERTY( QString title READ title NOTIFY titleChanged) Q_PROPERTY( QString shortTitle READ shortTitle NOTIFY shortTitleChanged) @@ -92,7 +92,7 @@ public: Q_INVOKABLE QRect geometry(); //this returns the "full" geometry of the window (window + frame) // QML ACCESS FUNCTIONS (shortcuts for particular properties in a format QML can use) - Q_INVOKABLE QImage winImage(); + Q_INVOKABLE QString winImage(); Q_INVOKABLE QString name(); Q_INVOKABLE QString title(); Q_INVOKABLE QString shortTitle(); @@ -106,6 +106,7 @@ public: Q_INVOKABLE bool showWindowFrame(); //QML Window States Q_INVOKABLE bool isSticky(); + Q_INVOKABLE int workspace(); //QML Geometry reporting Q_INVOKABLE QRect frameGeometry(); 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 4b01fa0d..39dc30c1 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 @@ -27,6 +27,7 @@ void RootDesktopObject::RegisterType(){ qmlRegisterType("Lumina.Backend.RootDesktopObject", 2, 0, "RootDesktopObject"); //Also register any types that are needed by this class ScreenObject::RegisterType(); + NativeWindowObject::RegisterType(); } RootDesktopObject* RootDesktopObject::instance(){ @@ -36,14 +37,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; iname(); } return names; } ScreenObject* RootDesktopObject::screen(QString id){ - qDebug() << "Got Screen Request:" << id; + //qDebug() << "Got Screen Request:" << id; for(int i=0; iname()==id){ return s_objects[i]; } } @@ -72,7 +73,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 list){ emit panelsChanged(); } -void RootDesktopObject::setWindows(QList list){ +void RootDesktopObject::setWindows(QList list){ window_objects = list; emit windowsChanged(); } @@ -103,6 +104,10 @@ void RootDesktopObject::mousePositionChanged(){ emit mouseMoved(); } +void RootDesktopObject::launchApp(QString appOrPath){ + emit launchApplication(appOrPath); +} + // === PUBLIC SLOTS === void RootDesktopObject::updateScreens(){ QList scrns = QApplication::screens(); diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h index 7d5182c4..a4236596 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h @@ -8,11 +8,8 @@ //=========================================== #ifndef _LUMINA_DESKTOP_QML_BACKEND_ROOT_DESKTOP_OBJECT_H #define _LUMINA_DESKTOP_QML_BACKEND_ROOT_DESKTOP_OBJECT_H -#include -#include #include - -#include "ScreenObject.h" +#include class RootDesktopObject : public QObject{ Q_OBJECT @@ -37,26 +34,27 @@ public: Q_INVOKABLE QStringList panels(); Q_INVOKABLE PanelObject* panel(QString id); Q_INVOKABLE QStringList windows(); - Q_INVOKABLE NativeWindow* window(QString id); - - void setPanels(QList list); - void setWindows(QList list); + Q_INVOKABLE NativeWindowObject* window(QString id); //QML Access Functions Q_INVOKABLE void logout(); Q_INVOKABLE void lockscreen(); Q_INVOKABLE void mousePositionChanged(); + Q_INVOKABLE void launchApp(QString appOrPath); private: QList s_objects; QList panel_objects; - QList window_objects; + QList window_objects; public slots: void updateScreens(); //rescan/update screen objects void ChangeWallpaper(QString screen, QString); QString CurrentWallpaper(QString screen); + void setPanels(QList list); + void setWindows(QList list); + private slots: signals: @@ -67,6 +65,6 @@ signals: void startLogout(); void mouseMoved(); void lockScreen(); - + void launchApplication(QString); }; #endif diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/ScreenObject.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/ScreenObject.cpp index 82622403..1b22c450 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/ScreenObject.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/ScreenObject.cpp @@ -22,7 +22,7 @@ void ScreenObject::RegisterType(){ } QString ScreenObject::name(){ return bg_screen->name(); } -QString ScreenObject::background(){ qDebug() << "Got Background:" << bg_screen->name() << bg << bg_screen->geometry(); return bg; } +QString ScreenObject::background(){ return bg; } int ScreenObject::x(){ return bg_screen->geometry().x(); } int ScreenObject::y(){ return bg_screen->geometry().y(); } int ScreenObject::width(){ return bg_screen->geometry().width(); } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/ContextMenu.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/ContextMenu.qml index 4ab8e156..778d7568 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/ContextMenu.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/ContextMenu.qml @@ -12,6 +12,21 @@ import Lumina.Backend.RootDesktopObject 2.0 Menu { id: contextMenu + MenuItem { + text: "Launch Terminal" + iconName: "utilities-terminal" + onTriggered: { + RootObject.launchApp("application/terminal") + } + } + MenuItem { + text: "Launch File Browser" + iconName: "user-home" + onTriggered: { + RootObject.launchApp("inode/directory") + } + } + MenuItem { text: "Lock Screen" iconName: "system-lock-screen" diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml new file mode 100644 index 00000000..90818ca8 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml @@ -0,0 +1,184 @@ +// vi: ft=qml +import QtQuick 2.0 +import QtQuick.Window 2.2 +import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.3 + +import Lumina.Backend.NativeWindowObject 2.0 + + Rectangle { + property NativeWindowObject object + property string window_id + + id: windowFrame + border.width: 5 + border.color: palette.window + color: palette.window + x: object.frameGeometry.x + y: object.frameGeometry.y + width: object.frameGeometry.width + height: object.frameGeometry.height + + MouseArea { + id: resizeArea + anchors.fill: parent + property int positionX: 0 + property int positionY: 0 + property int newWidth: 0 + property int newHeight: 0 + + onPositionChanged: { + var globalP = windowFrame.mapToItem(background, mouse.x, mouse.y) + if(positionY < windowFrame.y + 15 ) { + /*if(positionX < windowFrame.x + 15) { + console.log("Top Left"); + //Top Left + newWidth = windowFrame.width + (windowFrame.x - mouse.x) + newHeight = windowFrame.height + (windowFrame.y - mouse.y) + windowFrame.x = mouse.x + windowFrame.y = mouse.y + }else if(positionX > windowFrame.x + windowFrame.width - 15) { + console.log("Top Right"); + //Top Right + newX = positionX - mouse.x + newY = positionY - mouse.y + newWidth = windowFrame.width - (positionX - mouse.x) + newHeight = windowFrame.height + (windowFrame.y - mouse.y) + windowFrame.y = mouse.y + }else{*/ + //Top + console.log("oldHeight: ", windowFrame.height); + windowFrame.height -= 1 + console.log("newHeight: ", windowFrame.height); + windowFrame.y = globalP.y + // } + } +/*else if(mouse.x < windowFrame.x + 15) { + if(mouse.y > windowFrame.y + windowFrame.height - 15) { + //Bottom Left + newX = positionX - mouse.x + newWidth = windowFrame.width - newX + newHeight = windowFrame.height - newY + }else{ + //Left + } + }else if(mouse.y > windowFrame.y + windowFrame.height - 15) { + if(mouse.x > windowFrame.x + windowFrame.width - 15) { + //Bottom Right + }else{ + //Bottom + } + }else if(mouse.x > windowFrame.x + windowFrame.width - 15) { + //Right + } else { + console.log("Cursor error"); + }*/ + } + } + + MouseArea { + id: dragArea + anchors.fill: titleBar + drag.target: windowFrame + drag.axis: Drag.XAndYAxis + onClicked: { console.log("dragArea"); } + //released: { function(); } + } + + states: [ + State { + when: resizeArea.drag.held + PropertyChanges { target: canvas; color:"red" } + }, + State { + when: dragArea.drag.held + AnchorChanges { target: windowFrame; anchors.verticalCenter: undefined; anchors.horizontalCenter: undefined } + } + + ] + + + Rectangle { + id: titleBar + border.width: 2 + color: palette.window + height: 25 + anchors.top: windowFrame.top + anchors.right: windowFrame.right + anchors.left: windowFrame.left + anchors.margins: windowFrame.border.width + width: parent.width + + RowLayout { + anchors.fill: titleBar + spacing: 0 + + Button { + id: otherButton + anchors.left: parent.left + Layout.fillHeight: true + iconSource: windowFrame.object.icon + + } + Text { + Layout.fillWidth: true + Layout.fillHeight: true + Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + color: palette.windowText + text: windowFrame.object.shortTitle + + MouseArea { + acceptedButtons: Qt.RightButton + anchors.fill: parent + //onClicked: contextMenu.open() + } + } + + Button { + id: minButton + Layout.fillHeight: true + iconName: "window-minimize" + onClicked: { windowFrame.object.toggleVisibility() } + } + + Button { + id: maxButton + Layout.fillHeight: true + iconName: "window-maximize" + //onClicked: { windowFrame.object.toggleMaximize() } + } + + Button { + id: closeButton + Layout.fillHeight: true + iconName: "document-close" + onClicked: { windowFrame.object.requestClose() } + } + + } + } + + Image { + id: frameContents + source: windowFrame.object.winImage + anchors.top: titleBar.bottom + anchors.bottom: parent.bottom + anchors.left: windowFrame.left + anchors.right: windowFrame.right + anchors.leftMargin: windowFrame.border.width + anchors.rightMargin: windowFrame.border.width + anchors.bottomMargin: windowFrame.border.width + width: parent.width + height: parent.height + + MouseArea { + width: parent.width; + height: parent.height + anchors.fill: frameContents + onClicked: { console.log(parent.mapToGlobal(mouse.x, mouse.y)); } + + } + } + } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/RootDesktop.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/RootDesktop.qml index c564ee42..9122ce5b 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/RootDesktop.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/RootDesktop.qml @@ -23,6 +23,7 @@ import "." as QML import Lumina.Backend.RootDesktopObject 2.0 import Lumina.Backend.ScreenObject 2.0 +import Lumina.Backend.NativeWindowObject 2.0 Rectangle { id: rootCanvas @@ -55,4 +56,14 @@ Rectangle { z: 0+index } } + + //Setup the windows + Repeater{ + model: RootObject.windows + QML.NativeWindow{ + window_id: modelData + object: RootObject.window(modelData) + z: 100+index + } + } } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/WindowFrame.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/WindowFrame.qml deleted file mode 100644 index b1765001..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/WindowFrame.qml +++ /dev/null @@ -1,172 +0,0 @@ -// vi: ft=qml -import QtQuick 2.0 -import QtQuick.Window 2.2 -import QtQuick.Controls 1.4 -import QtQuick.Layouts 1.3 - -Rectangle { - id: background - color: "grey" - - Rectangle { - id: windowFrame - border.width: 5 - border.color: "black" - color: "white" - width: 400 - height: 300 - - MouseArea { - id: resizeArea - anchors.fill: parent - property int positionX: 0 - property int positionY: 0 - property int newWidth: 0 - property int newHeight: 0 - - onPositionChanged: { - var globalP = windowFrame.mapToItem(background, mouse.x, mouse.y) - if(positionY < windowFrame.y + 15 ) { - /*if(positionX < windowFrame.x + 15) { - console.log("Top Left"); - //Top Left - newWidth = windowFrame.width + (windowFrame.x - mouse.x) - newHeight = windowFrame.height + (windowFrame.y - mouse.y) - windowFrame.x = mouse.x - windowFrame.y = mouse.y - }else if(positionX > windowFrame.x + windowFrame.width - 15) { - console.log("Top Right"); - //Top Right - newX = positionX - mouse.x - newY = positionY - mouse.y - newWidth = windowFrame.width - (positionX - mouse.x) - newHeight = windowFrame.height + (windowFrame.y - mouse.y) - windowFrame.y = mouse.y - }else{*/ - //Top - console.log("oldHeight: ", windowFrame.height); - windowFrame.height -= 1 - console.log("newHeight: ", windowFrame.height); - windowFrame.y = globalP.y - // } - } -/*else if(mouse.x < windowFrame.x + 15) { - if(mouse.y > windowFrame.y + windowFrame.height - 15) { - //Bottom Left - newX = positionX - mouse.x - newWidth = windowFrame.width - newX - newHeight = windowFrame.height - newY - }else{ - //Left - } - }else if(mouse.y > windowFrame.y + windowFrame.height - 15) { - if(mouse.x > windowFrame.x + windowFrame.width - 15) { - //Bottom Right - }else{ - //Bottom - } - }else if(mouse.x > windowFrame.x + windowFrame.width - 15) { - //Right - } else { - console.log("Cursor error"); - }*/ - } - } - - MouseArea { - id: dragArea - anchors.fill: titleBar - drag.target: windowFrame - drag.axis: Drag.XAndYAxis - onClicked: { console.log("dragArea"); } - //released: { function(); } - } - - states: [ - State { - when: resizeArea.drag.held - PropertyChanges { target: canvas; color:"red" } - }, - State { - when: dragArea.drag.held - AnchorChanges { target: windowFrame; anchors.verticalCenter: undefined; anchors.horizontalCenter: undefined } - } - - ] - - - Rectangle { - id: titleBar - border.width: 2 - color: "black" - height: 25 - anchors.top: windowFrame.top - anchors.right: windowFrame.right - anchors.left: windowFrame.left - anchors.margins: windowFrame.border.width - width: parent.width - - RowLayout { - anchors.right: parent.right - spacing: 0 - - Button { - iconName: "window-minimize" - //action: - } - - Button { - iconName: "window-maximize" - //action: - } - - Button { - iconName: "document-close" - //action: - } - - } - - Button { - iconName: "emblem-synchronized" - anchors.left: parent.left - } - - Text { - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - color: "white" - text: "zwelch@trueos~8905:~/lumina/src-qt5/src-qml/test" - font.pixelSize: 10 - } - - MouseArea { - acceptedButtons: Qt.RightButton - anchors.fill: parent - //onClicked: contextMenu.open() - } - } - - Image { - id: frameContents -// source: "balloon.png" - anchors.top: titleBar.bottom - anchors.bottom: parent.bottom - anchors.left: windowFrame.left - anchors.right: windowFrame.right - anchors.leftMargin: windowFrame.border.width - anchors.rightMargin: windowFrame.border.width - anchors.bottomMargin: windowFrame.border.width - width: parent.width - height: parent.height - - MouseArea { - width: parent.width; - height: parent.height; - anchors.fill: frameContents; - onClicked: { console.log(parent.mapToGlobal(mouse.x, mouse.y)); } - - } - } - } -} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.pri b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.pri index ad07902a..79941b82 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.pri +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.pri @@ -3,7 +3,8 @@ lupdate_only{ SOURCES *= $${PWD}/RootDesktop.qml \ $${PWD}/ContextMenu.qml \ $${PWD}/Screen.qml \ - $${PWD}/Panel.qml + $${PWD}/Panel.qml \ + $${PWD}/NativeWindow.qml } RESOURCES *= $${PWD}/src-qml.qrc diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc index b0c66e20..a4dc414f 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc @@ -4,5 +4,6 @@ ContextMenu.qml Screen.qml Panel.qml + NativeWindow.qml diff --git a/src-qt5/core/lumina-desktop-unified/src-events/LShortcutEvents.h b/src-qt5/core/lumina-desktop-unified/src-events/LShortcutEvents.h index 4560cb1f..8017060f 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/LShortcutEvents.h +++ b/src-qt5/core/lumina-desktop-unified/src-events/LShortcutEvents.h @@ -10,7 +10,8 @@ #ifndef _LUMINA_KEY_SEQUENCE_DETECTION_H #define _LUMINA_KEY_SEQUENCE_DETECTION_H -#include "../global-includes.h" +#include +#include "NativeWindowSystem.h" class LShortcutEvents : public QObject{ Q_OBJECT diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeEventFilter.cpp b/src-qt5/core/lumina-desktop-unified/src-events/NativeEventFilter.cpp new file mode 100644 index 00000000..507bcb9a --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeEventFilter.cpp @@ -0,0 +1,303 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2015-2017, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "NativeEventFilter.h" +#include +#include + +//#include +//#include + +//================================================== +// NOTE: All the XCB interactions and atoms are accessed via: +// obj->XCB->EWMH.(atom name) +// obj->XCB->(do something) +//================================================== + +/* +List of XCB response types (since almost impossible to find good docs on XCB) +switch (xcb_generic_event_t*->response_type & ~0x80) +case values: +XCB_KEY_[PRESS | RELEASE] +XCB_BUTTON_[PRESS | RELEASE] +XCB_MOTION_NOTIFY +XCB_ENTER_NOTIFY +XCB_LEAVE_NOTIFY +XCB_FOCUS_[IN | OUT] +XCB_KEYMAP_NOTIFY +XCB_EXPOSE +XCB_GRAPHICS_EXPOSURE +XCB_VISIBILITY_NOTIFY +XCB_CREATE_NOTIFY +XCB_DESTROY_NOTIFY +XCB_UNMAP_NOTIFY +XCB_MAP_[NOTIFY | REQUEST] +XCB_REPARENT_NOTIFY +XCB_CONFIGURE_[NOTIFY | REQUEST] +XCB_GRAVITY_NOTIFY +XCB_RESIZE_REQUEST +XCB_CIRCULATE_[NOTIFY | REQUEST] +XCB_PROPERTY_NOTIFY +XCB_SELECTION_[CLEAR | REQUEST | NOTIFY] +XCB_COLORMAP_NOTIFY +XCB_CLIENT_MESSAGE +*/ + +//SYSTEM TRAY STANDARD DEFINITIONS +#define SYSTEM_TRAY_REQUEST_DOCK 0 +#define SYSTEM_TRAY_BEGIN_MESSAGE 1 +#define SYSTEM_TRAY_CANCEL_MESSAGE 2 + +//#include +#include +#include +#include +#include + +#define DEBUG 0 + +//Special objects/variables for XCB parsing +static xcb_ewmh_connection_t EWMH; +//static LXCB *XCB = 0; +static xcb_atom_t _NET_SYSTEM_TRAY_OPCODE = 0; + +inline void ParsePropertyEvent(xcb_property_notify_event_t *ev, NativeEventFilter *obj){ + //qDebug() << "Got Property Event:" << ev->window << ev->atom; + NativeWindowObject::Property prop = NativeWindowObject::None; + //Now determine which properties are getting changed, and update the native window as appropriate + if(ev->atom == EWMH._NET_WM_NAME){ prop = NativeWindowObject::Title; } + else if(ev->atom == EWMH._NET_WM_ICON){ prop = NativeWindowObject::Icon; } + else if(ev->atom == EWMH._NET_WM_ICON_NAME){ prop = NativeWindowObject::ShortTitle; } + else if(ev->atom == EWMH._NET_WM_DESKTOP){ prop = NativeWindowObject::Workspace; } + else if(ev->atom == EWMH._NET_WM_WINDOW_TYPE ){ prop = NativeWindowObject::WinTypes; } + else if( ev->atom == EWMH._NET_WM_STATE){ prop = NativeWindowObject::States; } + //Send out the signal if necessary + if(prop!=NativeWindowObject::None){ + //if(DEBUG){ + //qDebug() << "Detected Property Change:" << ev->window << prop; + //} + obj->emit WindowPropertyChanged(ev->window, prop); + }else{ + //Quick re-check of the simple properties (nothing like the icon or other graphics) + obj->emit WindowPropertiesChanged(ev->window, QList() << NativeWindowObject::Title + << NativeWindowObject::ShortTitle << NativeWindowObject::Workspace ); + //qDebug() << "Unknown Property Change:" << ev->window << ev->atom; + } +} + +inline void ParseClientMessageEvent(xcb_client_message_event_t *ev, NativeEventFilter *obj){ + NativeWindowObject::Property prop = NativeWindowObject::None; + QVariant val; + if(ev->type==EWMH._NET_WM_NAME){ prop = NativeWindowObject::Title; } + else if(ev->type==EWMH._NET_WM_ICON){ prop = NativeWindowObject::Icon; } + else if(ev->type==EWMH._NET_WM_ICON_NAME){ prop = NativeWindowObject::ShortTitle; } + else if(ev->type==EWMH._NET_WM_DESKTOP){ + prop = NativeWindowObject::Workspace; + val = QVariant( (int) ev->data.data32[0] ); + }else if(ev->type==EWMH._NET_WM_WINDOW_TYPE){ prop = NativeWindowObject::WinTypes; } + else if(ev->type==EWMH._NET_WM_STATE){ prop = NativeWindowObject::States; } + + if(prop!=NativeWindowObject::None){ + if(DEBUG){ qDebug() << "Detected Property Change Request:" << ev->window << prop << val; } + if(val.isNull()){ obj->emit WindowPropertyChanged(ev->window, prop); } + else{ obj->emit RequestWindowPropertyChange(ev->window, prop, val); } + }else{ + //Quick re-check of the simple properties (nothing like the icon or other graphics) + obj->emit WindowPropertiesChanged(ev->window, QList() << NativeWindowObject::Title + << NativeWindowObject::ShortTitle << NativeWindowObject::Workspace ); + } + +} + + +//Constructor for the Event Filter wrapper +NativeEventFilter::NativeEventFilter() : QObject(){ + EF = new EventFilter(this); + if(EWMH.nb_screens <=0){ + xcb_intern_atom_cookie_t *cookie = xcb_ewmh_init_atoms(QX11Info::connection(), &EWMH); + if(!xcb_ewmh_init_atoms_replies(&EWMH, cookie, NULL) ){ + qDebug() << "Error with XCB atom initializations"; + } + } + if(_NET_SYSTEM_TRAY_OPCODE==0){ + //_NET_SYSTEM_TRAY_OPCODE + xcb_intern_atom_cookie_t cookie = xcb_intern_atom(QX11Info::connection(), 0, 23,"_NET_SYSTEM_TRAY_OPCODE"); + xcb_intern_atom_reply_t *r = xcb_intern_atom_reply(QX11Info::connection(), cookie, NULL); + if(r){ + _NET_SYSTEM_TRAY_OPCODE = r->atom; + free(r); + } + } +} + +void NativeEventFilter::start(){ + if(DEBUG){ qDebug() << " - Install event filter..."; } + QCoreApplication::instance()->installNativeEventFilter(EF); + if(DEBUG){ qDebug() << " - Run request check..."; } + +} + +void NativeEventFilter::stop(){ + QCoreApplication::instance()->installNativeEventFilter(0); +} + +//============================= +// EventFilter Class +//============================= + +//Constructor for the XCB event filter +EventFilter::EventFilter(NativeEventFilter *parent) : QAbstractNativeEventFilter(){ + obj = parent; +} + +//This function format taken directly from the Qt5.3 documentation +bool EventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *){ + //qDebug() << "New Event"; + if(eventType=="xcb_generic_event_t"){ + //Convert to known event type (for X11 systems) + xcb_generic_event_t *ev = static_cast(message); + //Now parse the event and emit signals as necessary + switch( ev->response_type & ~0x80){ +//============================== +// INTERACTIVITY EVENTS +//============================== + case XCB_KEY_PRESS: + //This is a keyboard key press + //qDebug() << "Key Press Event" + obj->emit KeyPressed( ((xcb_key_press_event_t *) ev)->detail, ((xcb_key_press_event_t *) ev)->root ); + break; + case XCB_KEY_RELEASE: + //This is a keyboard key release + //qDebug() << "Key Release Event"; + obj->emit KeyReleased( ((xcb_key_release_event_t *) ev)->detail, ((xcb_key_release_event_t *) ev)->root ); + break; + case XCB_BUTTON_PRESS: + //This is a mouse button press + //qDebug() << "Button Press Event"; + obj->emit MousePressed( ((xcb_button_press_event_t *) ev)->detail, ((xcb_button_press_event_t *) ev)->root ); + break; + case XCB_BUTTON_RELEASE: + //This is a mouse button release + //qDebug() << "Button Release Event"; + obj->emit MouseReleased( ((xcb_button_release_event_t *) ev)->detail, ((xcb_button_release_event_t *) ev)->root ); + break; + case XCB_MOTION_NOTIFY: + //This is a mouse movement event + if(DEBUG){ qDebug() << "Motion Notify Event"; } + obj->emit MouseMovement(); + break; + case XCB_ENTER_NOTIFY: + //This is a mouse movement event when mouse goes over a new window + //qDebug() << "Enter Notify Event"; + obj->emit MouseEnterWindow( ((xcb_enter_notify_event_t *) ev)->root ); + break; + case XCB_LEAVE_NOTIFY: + //This is a mouse movement event when mouse goes leaves a window + //qDebug() << "Leave Notify Event"; + obj->emit MouseLeaveWindow( ((xcb_leave_notify_event_t *) ev)->root ); + break; +//============================== + case XCB_EXPOSE: + //qDebug() << "Expose Notify Event:"; + //qDebug() << " - Given Window:" << ((xcb_property_notify_event_t*)ev)->window; + break; +//============================== + case XCB_MAP_NOTIFY: + //qDebug() << "Window Map Event:" << ((xcb_map_notify_event_t *)ev)->window; + obj->emit WindowPropertyChanged( ((xcb_map_notify_event_t *)ev)->window, NativeWindowObject::Visible, true); + break; //This is just a notification that a window was mapped - nothing needs to change here + case XCB_MAP_REQUEST: + //qDebug() << "Window Map Request Event"; + obj->emit WindowCreated( ((xcb_map_request_event_t *) ev)->window ); + break; +//============================== + case XCB_CREATE_NOTIFY: + //qDebug() << "Window Create Event"; + break; +//============================== + case XCB_UNMAP_NOTIFY: + //qDebug() << "Window Unmap Event:" << ((xcb_unmap_notify_event_t *)ev)->window; + obj->emit WindowPropertyChanged( ((xcb_map_notify_event_t *)ev)->window, NativeWindowObject::Visible, false); + break; +//============================== + case XCB_DESTROY_NOTIFY: + //qDebug() << "Window Closed Event:" << ((xcb_destroy_notify_event_t *)ev)->window; + obj->emit WindowDestroyed( ((xcb_destroy_notify_event_t *) ev)->window ); + break; +//============================== + case XCB_FOCUS_IN: + //qDebug() << "Focus In Event:"; + break; +//============================== + case XCB_FOCUS_OUT: + //qDebug() << "Focus Out Event:"; + break; +//============================== + case XCB_PROPERTY_NOTIFY: + //qDebug() << "Property Notify Event:"; + ParsePropertyEvent((xcb_property_notify_event_t*)ev, obj); + break; +//============================== + case XCB_CLIENT_MESSAGE: + //qDebug() << "Client Message Event"; + //qDebug() << " - Given Window:" << ((xcb_client_message_event_t*)ev)->window; + if( ((xcb_client_message_event_t*)ev)->type == _NET_SYSTEM_TRAY_OPCODE && ((xcb_client_message_event_t*)ev)->format == 32){ + //data32[0] is timestamp, [1] is opcode, [2] is window handle + if(SYSTEM_TRAY_REQUEST_DOCK == ((xcb_client_message_event_t*)ev)->data.data32[1]){ + obj->emit TrayWindowCreated( ((xcb_client_message_event_t*)ev)->data.data32[2] ); + //addTrayApp( ((xcb_client_message_event_t*)ev)->data.data32[2] ); + } + //Ignore the System Tray messages at the moment + }else if(((xcb_client_message_event_t*)ev)->window != QX11Info::appRootWindow()){ + ParseClientMessageEvent((xcb_client_message_event_t*)ev, obj); + } + break; +//============================== + case XCB_CONFIGURE_NOTIFY: + //qDebug() << "Configure Notify Event"; + /*obj->emit WindowPropertiesChanged( ((xcb_configure_notify_event_t*)ev)->window, + QList() << NativeWindowObject::GlobalPos << NativeWindowObject::Size, + QList() << QPoint(((xcb_configure_notify_event_t*)ev)->x, ((xcb_configure_notify_event_t*)ev)->y) << + QSize(((xcb_configure_notify_event_t*)ev)->width, ((xcb_configure_notify_event_t*)ev)->height) );*/ + obj->emit WindowPropertyChanged( ((xcb_configure_notify_event_t*)ev)->window, NativeWindowObject::Size, + QSize(((xcb_configure_notify_event_t*)ev)->width, ((xcb_configure_notify_event_t*)ev)->height) ); + break; +//============================== + case XCB_CONFIGURE_REQUEST: + //qDebug() << "Configure Request Event"; + obj->emit RequestWindowPropertiesChange( ((xcb_configure_request_event_t*)ev)->window, + QList() << NativeWindowObject::GlobalPos << NativeWindowObject::Size, + QList() << QPoint(((xcb_configure_request_event_t*)ev)->x, ((xcb_configure_request_event_t*)ev)->y) << + QSize(((xcb_configure_request_event_t*)ev)->width, ((xcb_configure_request_event_t*)ev)->height) ); + break; +//============================== + case XCB_RESIZE_REQUEST: + //qDebug() << "Resize Request Event"; + obj->emit RequestWindowPropertyChange( ((xcb_resize_request_event_t*)ev)->window, + NativeWindowObject::Size, QSize(((xcb_resize_request_event_t*)ev)->width, ((xcb_resize_request_event_t*)ev)->height) ); + break; +//============================== + case XCB_SELECTION_CLEAR: + //qDebug() << "Selection Clear Event"; + break; +//============================== + case 85: //not sure what event this is - but it seems to come up very often (just hide the notice) + case 0: + case XCB_GE_GENERIC: + break; //generic event - don't do anything special + default: + //if( (ev->response_type & ~0x80)==TrayDmgID){ + obj->emit PossibleDamageEvent( ((xcb_damage_notify_event_t*)ev)->drawable ); + //checkDamageID( ((xcb_damage_notify_event_t*)ev)->drawable ); + //}else{ + //qDebug() << "Default Event:" << (ev->response_type & ~0x80); + //} +//============================== + } + } + return false; + //never stop event handling (this will not impact the X events themselves - just the internal Qt application) +} diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeEventFilter.h b/src-qt5/core/lumina-desktop-unified/src-events/NativeEventFilter.h new file mode 100644 index 00000000..e4500cac --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeEventFilter.h @@ -0,0 +1,71 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2012-2017, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +// This class provides the XCB event handling/registrations that are needed +//=========================================== +#ifndef _LUMINA_DESKTOP_NATIVE_EVENT_FILTER_H +#define _LUMINA_DESKTOP_NATIVE_EVENT_FILTER_H + +#include +#include +#include + +#include + + +class NativeEventFilter : public QObject{ + Q_OBJECT +private: + QAbstractNativeEventFilter* EF; + WId WMFlag; //used to flag a running WM process + +public: + NativeEventFilter(); + ~NativeEventFilter(){} + + void start(); + void stop(); + +signals: + //Window Signals + void WindowCreated(WId); + void WindowDestroyed(WId); + void WindowPropertyChanged(WId, NativeWindowObject::Property); + void WindowPropertiesChanged(WId, QList); + void WindowPropertyChanged(WId, NativeWindowObject::Property, QVariant); + void WindowPropertiesChanged(WId, QList, QList); + void RequestWindowPropertyChange(WId, NativeWindowObject::Property, QVariant); + void RequestWindowPropertiesChange(WId, QList, QList); + + //System Tray Signals + void TrayWindowCreated(WId); + void TrayWindowDestroyed(WId); + + //Miscellaneos Signals + void PossibleDamageEvent(WId); + + //Input Event Signals + void KeyPressed(int, WId); + void KeyReleased(int, WId); + void MousePressed(int, WId); + void MouseReleased(int, WId); + void MouseMovement(); + void MouseEnterWindow(WId); + void MouseLeaveWindow(WId); +}; + +class EventFilter : public QAbstractNativeEventFilter{ +public: + EventFilter(NativeEventFilter *parent); + ~EventFilter(){} + + virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *); + +private: + NativeEventFilter *obj; +}; + +#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeKeyToQt.cpp b/src-qt5/core/lumina-desktop-unified/src-events/NativeKeyToQt.cpp new file mode 100644 index 00000000..9b639496 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeKeyToQt.cpp @@ -0,0 +1,528 @@ + +#include "NativeWindowSystem.h" + +#include +#include + +// XCB/X11 Includes +#define XK_MISCELLANY +#define XK_XKB_KEYS +#define XK_LATIN1 +#define XK_LATIN2 +#define XK_LATIN3 +#define XK_LATIN4 +#define XK_LATIN8 +#define XK_LATIN9 +//NOTE: Look at the keysymdef.h file for additional define/characters which we may need later +#include +#include + + +//Small simplification functions +Qt::Key NativeWindowSystem::KeycodeToQt(int keycode){ + static xcb_key_symbols_t *SYM = 0; + if(SYM==0){ SYM = xcb_key_symbols_alloc(QX11Info::connection()); } + xcb_keysym_t symbol = xcb_key_symbols_get_keysym(SYM, keycode,0); + //not sure about the "column" input - we want raw keys though so ignore the "modified" key states (columns) for now + //qDebug() << "Try to convert keycode to Qt::Key:" << keycode << symbol; + //Now map this symbol to the appropriate Qt::Key enumeration + switch(symbol){ + //FUNCTION KEYS + case XK_F1: return Qt::Key_F1; + case XK_F2: return Qt::Key_F2; + case XK_F3: return Qt::Key_F3; + case XK_F4: return Qt::Key_F4; + case XK_F5: return Qt::Key_F5; + case XK_F6: return Qt::Key_F6; + case XK_F7: return Qt::Key_F7; + case XK_F8: return Qt::Key_F8; + case XK_F9: return Qt::Key_F9; + case XK_F10: return Qt::Key_F10; + case XK_F11: return Qt::Key_F11; + case XK_F12: return Qt::Key_F12; + case XK_F13: return Qt::Key_F13; + case XK_F14: return Qt::Key_F14; + case XK_F15: return Qt::Key_F15; + case XK_F16: return Qt::Key_F16; + case XK_F17: return Qt::Key_F17; + case XK_F18: return Qt::Key_F18; + case XK_F19: return Qt::Key_F19; + case XK_F20: return Qt::Key_F20; + case XK_F21: return Qt::Key_F21; + case XK_F22: return Qt::Key_F22; + case XK_F23: return Qt::Key_F23; + case XK_F24: return Qt::Key_F24; + case XK_F25: return Qt::Key_F25; + case XK_F26: return Qt::Key_F26; + case XK_F27: return Qt::Key_F27; + case XK_F28: return Qt::Key_F28; + case XK_F29: return Qt::Key_F29; + case XK_F30: return Qt::Key_F30; + case XK_F31: return Qt::Key_F31; + case XK_F32: return Qt::Key_F32; + case XK_F33: return Qt::Key_F33; + case XK_F34: return Qt::Key_F34; + case XK_F35: return Qt::Key_F35; + //Miscellaneous Keys + case XK_BackSpace: return Qt::Key_Backspace; + case XK_Delete: return Qt::Key_Delete; + //case XK_LineFeed: return Qt::Key_Backspace; + case XK_Clear: return Qt::Key_Clear; + case XK_Return: return Qt::Key_Return; + case XK_Pause: return Qt::Key_Pause; + case XK_Scroll_Lock: return Qt::Key_ScrollLock; + case XK_Sys_Req: return Qt::Key_SysReq; + case XK_Escape: return Qt::Key_Escape; + case XK_Select: return Qt::Key_Select; + case XK_Print: return Qt::Key_Print; + //case XK_Execute: return Qt::Key_Execute; + case XK_Insert: return Qt::Key_Insert; + case XK_Undo: return Qt::Key_Undo; + case XK_Redo: return Qt::Key_Redo; + case XK_Menu: return Qt::Key_Menu; + case XK_Find: return Qt::Key_Find; + case XK_Cancel: return Qt::Key_Cancel; + case XK_Help: return Qt::Key_Help; + //case XK_Break: return Qt::Key_Break; + //case XK_Mode_switch: return Qt::Key_Backspace; + //case XK_script_switch: return Qt::Key_Backspace; + case XK_Num_Lock: return Qt::Key_NumLock; + //Cursor Controls + case XK_Home: return Qt::Key_Home; + case XK_Left: return Qt::Key_Left; + case XK_Up: return Qt::Key_Up; + case XK_Right: return Qt::Key_Right; + case XK_Down: return Qt::Key_Down; + //case XK_Prior: return Qt::Key_Backspace; + case XK_Page_Up: return Qt::Key_PageUp; + case XK_Page_Down: return Qt::Key_PageDown; + //case XK_Next: return Qt::Key_Backspace; + case XK_End: return Qt::Key_End; + //case XK_Begin: return Qt::Key_Backspace; + // Keypad Functions and numbers + case XK_KP_Space: return Qt::Key_Space; + case XK_KP_Tab: return Qt::Key_Tab; + case XK_KP_Enter: return Qt::Key_Enter; + case XK_KP_F1: return Qt::Key_F1; + case XK_KP_F2: return Qt::Key_F2; + case XK_KP_F3: return Qt::Key_F3; + case XK_KP_F4: return Qt::Key_F4; + case XK_KP_Home: return Qt::Key_Home; + case XK_KP_Left: return Qt::Key_Left; + case XK_KP_Up: return Qt::Key_Up; + case XK_KP_Right: return Qt::Key_Right; + case XK_KP_Down: return Qt::Key_Down; + //case XK_KP_Prior: return Qt::Key_ + case XK_KP_Page_Up: return Qt::Key_PageUp; + //case XK_KP_Next: return Qt::Key_ + case XK_KP_Page_Down: return Qt::Key_PageDown; + case XK_KP_End: return Qt::Key_End; + //case XK_KP_Begin: return Qt::Key_ + case XK_KP_Insert: return Qt::Key_Insert; + case XK_KP_Delete: return Qt::Key_Delete; + case XK_KP_Equal: return Qt::Key_Equal; + case XK_KP_Multiply: return Qt::Key_Asterisk; + case XK_KP_Add: return Qt::Key_Plus; + case XK_KP_Separator: return Qt::Key_Comma; //X11 definitions say this is often comma + case XK_KP_Subtract: return Qt::Key_Minus; + case XK_KP_Decimal: return Qt::Key_Period; + case XK_KP_Divide: return Qt::Key_Slash; + case XK_KP_0: return Qt::Key_0; + case XK_KP_1: return Qt::Key_1; + case XK_KP_2: return Qt::Key_2; + case XK_KP_3: return Qt::Key_3; + case XK_KP_4: return Qt::Key_4; + case XK_KP_5: return Qt::Key_5; + case XK_KP_6: return Qt::Key_6; + case XK_KP_7: return Qt::Key_7; + case XK_KP_8: return Qt::Key_8; + case XK_KP_9: return Qt::Key_9; + // Modifier Keys + case XK_Shift_L: return Qt::Key_Shift; + case XK_Shift_R: return Qt::Key_Shift; + case XK_Control_L: return Qt::Key_Control; + case XK_Control_R: return Qt::Key_Control; + case XK_Caps_Lock: return Qt::Key_CapsLock; + //case XK_Shift_Lock: return Qt::Key_ShiftLock; + case XK_Meta_L: return Qt::Key_Meta; + case XK_Meta_R: return Qt::Key_Meta; + case XK_Alt_L: return Qt::Key_Alt; + case XK_Alt_R: return Qt::Key_Alt; + case XK_Super_L: return Qt::Key_Super_L; + case XK_Super_R: return Qt::Key_Super_R; + case XK_Hyper_L: return Qt::Key_Hyper_L; + case XK_Hyper_R: return Qt::Key_Hyper_R; + case XK_space: return Qt::Key_Space; + case XK_exclam: return Qt::Key_Exclam; + case XK_quotedbl: return Qt::Key_QuoteDbl; + case XK_numbersign: return Qt::Key_NumberSign; + case XK_dollar: return Qt::Key_Dollar; + case XK_percent: return Qt::Key_Percent; + case XK_ampersand: return Qt::Key_Ampersand; + case XK_apostrophe: return Qt::Key_Apostrophe; + case XK_parenleft: return Qt::Key_ParenLeft; + case XK_parenright: return Qt::Key_ParenRight; + case XK_asterisk: return Qt::Key_Asterisk; + case XK_plus: return Qt::Key_Plus; + case XK_comma: return Qt::Key_Comma; + case XK_minus: return Qt::Key_Minus; + case XK_period: return Qt::Key_Period; + case XK_slash: return Qt::Key_Slash; + case XK_0: return Qt::Key_0; + case XK_1: return Qt::Key_1; + case XK_2: return Qt::Key_2; + case XK_3: return Qt::Key_3; + case XK_4: return Qt::Key_4; + case XK_5: return Qt::Key_5; + case XK_6: return Qt::Key_6; + case XK_7: return Qt::Key_7; + case XK_8: return Qt::Key_8; + case XK_9: return Qt::Key_9; + case XK_colon: return Qt::Key_Colon; + case XK_semicolon: return Qt::Key_Semicolon; + case XK_less: return Qt::Key_Less; + case XK_equal: return Qt::Key_Equal; + case XK_greater: return Qt::Key_Greater; + case XK_question: return Qt::Key_Question; + case XK_at: return Qt::Key_At; + case XK_A: return Qt::Key_A; + case XK_B: return Qt::Key_B; + case XK_C: return Qt::Key_C; + case XK_D: return Qt::Key_D; + case XK_E: return Qt::Key_E; + case XK_F: return Qt::Key_F; + case XK_G: return Qt::Key_G; + case XK_H: return Qt::Key_H; + case XK_I: return Qt::Key_I; + case XK_J: return Qt::Key_J; + case XK_K: return Qt::Key_K; + case XK_L: return Qt::Key_L; + case XK_M: return Qt::Key_M; + case XK_N: return Qt::Key_N; + case XK_O: return Qt::Key_O; + case XK_P: return Qt::Key_P; + case XK_Q: return Qt::Key_Q; + case XK_R: return Qt::Key_R; + case XK_S: return Qt::Key_S; + case XK_T: return Qt::Key_T; + case XK_U: return Qt::Key_U; + case XK_V: return Qt::Key_V; + case XK_W: return Qt::Key_W; + case XK_X: return Qt::Key_X; + case XK_Y : return Qt::Key_Y; + case XK_Z: return Qt::Key_Z; + case XK_bracketleft: return Qt::Key_BracketLeft; + case XK_backslash: return Qt::Key_Backslash; + case XK_bracketright: return Qt::Key_BracketRight; + case XK_asciicircum: return Qt::Key_AsciiCircum; + case XK_underscore: return Qt::Key_Underscore; + case XK_grave: return Qt::Key_Agrave; + case XK_a: return Qt::Key_A; + case XK_b: return Qt::Key_B; + case XK_c: return Qt::Key_C; + case XK_d: return Qt::Key_D; + case XK_e: return Qt::Key_E; + case XK_f : return Qt::Key_F; + case XK_g: return Qt::Key_G; + case XK_h: return Qt::Key_H; + case XK_i: return Qt::Key_I; + case XK_j: return Qt::Key_J; + case XK_k: return Qt::Key_K; + case XK_l: return Qt::Key_L; + case XK_m: return Qt::Key_M; + case XK_n: return Qt::Key_N; + case XK_o: return Qt::Key_O; + case XK_p: return Qt::Key_P; + case XK_q: return Qt::Key_Q; + case XK_r: return Qt::Key_R; + case XK_s: return Qt::Key_S; + case XK_t : return Qt::Key_T; + case XK_u: return Qt::Key_U; + case XK_v: return Qt::Key_V; + case XK_w: return Qt::Key_W; + case XK_x: return Qt::Key_X; + case XK_y: return Qt::Key_Y; + case XK_z: return Qt::Key_Z; + case XK_braceleft: return Qt::Key_BraceLeft; + case XK_bar: return Qt::Key_Bar; + case XK_braceright: return Qt::Key_BraceRight; + case XK_asciitilde: return Qt::Key_AsciiTilde; + + case XK_nobreakspace: return Qt::Key_nobreakspace; + case XK_exclamdown: return Qt::Key_exclamdown; + case XK_cent: return Qt::Key_cent; + case XK_sterling: return Qt::Key_sterling; + case XK_currency: return Qt::Key_currency; + case XK_yen: return Qt::Key_yen; + case XK_brokenbar: return Qt::Key_brokenbar; + case XK_section: return Qt::Key_section; + case XK_diaeresis: return Qt::Key_diaeresis; + case XK_copyright: return Qt::Key_copyright; + case XK_ordfeminine: return Qt::Key_ordfeminine; + case XK_guillemotleft: return Qt::Key_guillemotleft; + case XK_notsign: return Qt::Key_notsign; + case XK_hyphen: return Qt::Key_hyphen; + case XK_registered: return Qt::Key_registered; + case XK_macron: return Qt::Key_macron; + case XK_degree: return Qt::Key_degree; + case XK_plusminus: return Qt::Key_plusminus; + case XK_twosuperior: return Qt::Key_twosuperior; + case XK_threesuperior: return Qt::Key_threesuperior; + case XK_acute: return Qt::Key_acute; + case XK_mu: return Qt::Key_mu; + case XK_paragraph: return Qt::Key_paragraph; + case XK_periodcentered: return Qt::Key_periodcentered; + case XK_cedilla: return Qt::Key_cedilla; + case XK_onesuperior: return Qt::Key_onesuperior; + case XK_masculine: return Qt::Key_masculine; + case XK_guillemotright: return Qt::Key_guillemotright; + case XK_onequarter: return Qt::Key_onequarter; + case XK_onehalf: return Qt::Key_onehalf; + case XK_threequarters: return Qt::Key_threequarters; + case XK_questiondown: return Qt::Key_questiondown; + case XK_Agrave: return Qt::Key_Agrave; + case XK_Aacute: return Qt::Key_Aacute; + case XK_Acircumflex: return Qt::Key_Acircumflex; + case XK_Atilde: return Qt::Key_Atilde; + case XK_Adiaeresis: return Qt::Key_Adiaeresis; + case XK_Aring: return Qt::Key_Aring; + case XK_AE: return Qt::Key_AE; + case XK_Ccedilla: return Qt::Key_Ccedilla; + case XK_Egrave: return Qt::Key_Egrave; + case XK_Eacute: return Qt::Key_Eacute; + case XK_Ecircumflex: return Qt::Key_Ecircumflex; + case XK_Ediaeresis: return Qt::Key_Ediaeresis; + case XK_Igrave: return Qt::Key_Igrave; + case XK_Iacute: return Qt::Key_Iacute; + case XK_Icircumflex: return Qt::Key_Icircumflex; + case XK_Idiaeresis: return Qt::Key_Idiaeresis; + case XK_ETH: return Qt::Key_ETH; + //case XK_Eth: return Qt::Key_Eth; + case XK_Ntilde: return Qt::Key_Ntilde; + case XK_Ograve: return Qt::Key_Ograve; + case XK_Oacute: return Qt::Key_Oacute; + case XK_Ocircumflex: return Qt::Key_Ocircumflex; + case XK_Otilde: return Qt::Key_Otilde; + case XK_Odiaeresis: return Qt::Key_Odiaeresis; + case XK_multiply: return Qt::Key_multiply; + //case XK_Oslash: return Qt::Key_AsciiTilde; + case XK_Ooblique: return Qt::Key_Ooblique; + case XK_Ugrave: return Qt::Key_Ugrave; + case XK_Uacute: return Qt::Key_Uacute; + case XK_Ucircumflex: return Qt::Key_Ucircumflex; + case XK_Udiaeresis: return Qt::Key_Udiaeresis; + case XK_Yacute: return Qt::Key_Yacute; + case XK_THORN: return Qt::Key_THORN; + //case XK_Thorn: return Qt::Key_AsciiTilde; + case XK_ssharp: return Qt::Key_ssharp; + /*case XK_agrave: return Qt::Key_AsciiTilde; + case XK_aacute: return Qt::Key_AsciiTilde; + case XK_acircumflex: return Qt::Key_AsciiTilde; + case XK_atilde: return Qt::Key_AsciiTilde; + case XK_adiaeresis: return Qt::Key_AsciiTilde; + case XK_aring: return Qt::Key_AsciiTilde; + case XK_ae: return Qt::Key_AsciiTilde; + case XK_ccedilla: return Qt::Key_AsciiTilde; + case XK_egrave: return Qt::Key_AsciiTilde; + case XK_eacute: return Qt::Key_AsciiTilde; + case XK_ecircumflex: return Qt::Key_AsciiTilde; + case XK_ediaeresis: return Qt::Key_AsciiTilde; + case XK_igrave: return Qt::Key_AsciiTilde; + case XK_iacute: return Qt::Key_AsciiTilde; + case XK_icircumflex: return Qt::Key_AsciiTilde; + case XK_idiaeresis: return Qt::Key_AsciiTilde; + case XK_eth: return Qt::Key_AsciiTilde; + case XK_ntilde: return Qt::Key_AsciiTilde; + case XK_ograve: return Qt::Key_AsciiTilde; + case XK_oacute: return Qt::Key_AsciiTilde; + case XK_ocircumflex: return Qt::Key_AsciiTilde; + case XK_otilde: return Qt::Key_AsciiTilde; + case XK_odiaeresis: return Qt::Key_AsciiTilde; + case XK_division: return Qt::Key_AsciiTilde; + case XK_oslash: return Qt::Key_AsciiTilde; + case XK_ooblique: return Qt::Key_AsciiTilde; + case XK_ugrave: return Qt::Key_AsciiTilde; + case XK_uacute: return Qt::Key_AsciiTilde; + case XK_ucircumflex: return Qt::Key_AsciiTilde; + case XK_udiaeresis: return Qt::Key_AsciiTilde; + case XK_yacute: return Qt::Key_AsciiTilde; + case XK_thorn: return Qt::Key_AsciiTilde; + case XK_ydiaeresis: return Qt::Key_AsciiTilde; + + case: XK_Agonek: return Qt::Key_AsciiTilde; + case XK_breve: return Qt::Key_AsciiTilde; + case XK_Lstroke: return Qt::Key_AsciiTilde; + case XK_Lcaron: return Qt::Key_AsciiTilde; + case XK_Sacute: return Qt::Key_AsciiTilde; + case XK_Scaron: return Qt::Key_AsciiTilde; + case XK_Scedilla: return Qt::Key_AsciiTilde; + case XK_Tcaron: return Qt::Key_AsciiTilde; + case XK_Zacute: return Qt::Key_AsciiTilde; + case XK_Zcaron: return Qt::Key_AsciiTilde; + case XK_Zabovedot: return Qt::Key_AsciiTilde; + case XK_aogonek: return Qt::Key_AsciiTilde; + case XK_ogonek: return Qt::Key_AsciiTilde; + case XK_lstroke: return Qt::Key_AsciiTilde; + case XK_lcaron: return Qt::Key_AsciiTilde; + case XK_sacute: return Qt::Key_AsciiTilde; + case XK_caron: return Qt::Key_AsciiTilde; + case XK_scaron: return Qt::Key_AsciiTilde; + case XK_scedilla: return Qt::Key_AsciiTilde; + case XK_tcaron: return Qt::Key_AsciiTilde; + case XK_zacute: return Qt::Key_AsciiTilde; + case XK_doubleacute: return Qt::Key_AsciiTilde; + case XK_zcaron: return Qt::Key_AsciiTilde; + case XK_zabovedot: return Qt::Key_AsciiTilde; + case XK_Racute: return Qt::Key_AsciiTilde; + case XK_Abreve: return Qt::Key_AsciiTilde; + case XK_Lacute: return Qt::Key_AsciiTilde; + case XK_Cacute: return Qt::Key_AsciiTilde; + case XK_Ccaron: return Qt::Key_AsciiTilde; + case XK_Eogonek: return Qt::Key_AsciiTilde; + case XK_Ecaron: return Qt::Key_AsciiTilde; + case XK_Dcaron: return Qt::Key_AsciiTilde; + case XK_Dstroke: return Qt::Key_AsciiTilde; + case XK_Nacute: return Qt::Key_AsciiTilde; + case XK_Ncaron: return Qt::Key_AsciiTilde; + case XK_Odoubleacute: return Qt::Key_AsciiTilde; + case XK_Rcaron: return Qt::Key_AsciiTilde; + case XK_Uring: return Qt::Key_AsciiTilde; + case XK_Udoubleacute: return Qt::Key_AsciiTilde; + case XK_Tcedilla: return Qt::Key_AsciiTilde; + case XK_racute: return Qt::Key_AsciiTilde; + case XK_abreve: return Qt::Key_AsciiTilde; + case XK_lacute: return Qt::Key_AsciiTilde; + case XK_cacute: return Qt::Key_AsciiTilde; + case XK_ccaron: return Qt::Key_AsciiTilde; + case XK_eogonek: return Qt::Key_AsciiTilde; + case XK_ecaron: return Qt::Key_AsciiTilde; + case XK_dcaron: return Qt::Key_AsciiTilde; + case XK_dstroke: return Qt::Key_AsciiTilde; + case XK_nacute: return Qt::Key_AsciiTilde; + case XK_ncaron: return Qt::Key_AsciiTilde; + case XK_odoubleacute: return Qt::Key_AsciiTilde; + case XK_rcaron: return Qt::Key_AsciiTilde; + case XK_uring: return Qt::Key_AsciiTilde; + case XK_udoubleacute: return Qt::Key_AsciiTilde; + case XK_tcedilla: return Qt::Key_AsciiTilde; + case XK_abovedot: return Qt::Key_AsciiTilde; + case XK_Hstroke: return Qt::Key_AsciiTilde; + case XK_Hcircumflex: return Qt::Key_AsciiTilde; + case XK_Iabovedot: return Qt::Key_AsciiTilde; + case XK_Gbreve: return Qt::Key_AsciiTilde; + case XK_Jcircumflex: return Qt::Key_AsciiTilde; + case XK_hstroke: return Qt::Key_AsciiTilde; + case XK_hcircumflex: return Qt::Key_AsciiTilde; + case XK_idotless: return Qt::Key_AsciiTilde; + case XK_gbreve: return Qt::Key_AsciiTilde; + case XK_jcircumflex: return Qt::Key_AsciiTilde; + case XK_Cabovedot: return Qt::Key_AsciiTilde; + case XK_Ccircumflex: return Qt::Key_AsciiTilde; + case XK_Gabovedot: return Qt::Key_AsciiTilde; + case XK_Gcircumflex: return Qt::Key_AsciiTilde; + case XK_Ubreve: return Qt::Key_AsciiTilde; + case XK_Scircumflex: return Qt::Key_AsciiTilde; + case XK_cabovedot: return Qt::Key_AsciiTilde; + case XK_ccircumflex: return Qt::Key_AsciiTilde; + case XK_gabovedot: return Qt::Key_AsciiTilde; + case XK_gcircumflex: return Qt::Key_AsciiTilde; + case XK_ubreve: return Qt::Key_AsciiTilde; + case XK_scircumflex: return Qt::Key_AsciiTilde; + case XK_kra: return Qt::Key_AsciiTilde; + case XK_kappa: return Qt::Key_AsciiTilde; + case XK_Rcedilla: return Qt::Key_AsciiTilde; + case XK_Itilde: return Qt::Key_AsciiTilde; + case XK_Lcedilla: return Qt::Key_AsciiTilde; + case XK_Emacron: return Qt::Key_AsciiTilde; + case XK_Gcedilla: return Qt::Key_AsciiTilde; + case XK_Tslash: return Qt::Key_AsciiTilde; + case XK_rcedilla: return Qt::Key_AsciiTilde; + case XK_itilde: return Qt::Key_AsciiTilde; + case XK_lcedilla: return Qt::Key_AsciiTilde; + case XK_emacron: return Qt::Key_AsciiTilde; + case XK_gcedilla: return Qt::Key_AsciiTilde; + case XK_tslash: return Qt::Key_AsciiTilde; + case XK_ENG: return Qt::Key_AsciiTilde; + case XK_eng: return Qt::Key_AsciiTilde; + case XK_Amacron: return Qt::Key_AsciiTilde; + case XK_Iogonek: return Qt::Key_AsciiTilde; + case XK_Eabovedot: return Qt::Key_AsciiTilde; + case XK_Imacron: return Qt::Key_AsciiTilde; + case XK_Ncedilla: return Qt::Key_AsciiTilde; + case XK_Omacron: return Qt::Key_AsciiTilde; + case XK_Kcedilla: return Qt::Key_AsciiTilde; + case XK_Uogonek: return Qt::Key_AsciiTilde; + case XK_Utilde: return Qt::Key_AsciiTilde; + case XK_Umacron: return Qt::Key_AsciiTilde; + case XK_amacron: return Qt::Key_AsciiTilde; + case XK_iogonek: return Qt::Key_AsciiTilde; + case XK_eabovedot: return Qt::Key_AsciiTilde; + case XK_imacron: return Qt::Key_AsciiTilde; + case XK_ncedilla: return Qt::Key_AsciiTilde; + case XK_omacron: return Qt::Key_AsciiTilde; + case XK_kcedilla: return Qt::Key_AsciiTilde; + case XK_uogonek: return Qt::Key_AsciiTilde; + case XK_utilde: return Qt::Key_AsciiTilde; + case XK_umacron: return Qt::Key_AsciiTilde; + case XK_Wcircumflex: return Qt::Key_AsciiTilde; + case XK_wcircumflex: return Qt::Key_AsciiTilde; + case XK_Ycircumflex: return Qt::Key_AsciiTilde; + case XK_ycircumflex: return Qt::Key_AsciiTilde; + case XK_Babovedot: return Qt::Key_AsciiTilde; + case XK_babovedot: return Qt::Key_AsciiTilde; + case XK_Dabovedot: return Qt::Key_AsciiTilde; + case XK_dabovedot: return Qt::Key_AsciiTilde; + case XK_Fabovedot: return Qt::Key_AsciiTilde; + case XK_fabovedot: return Qt::Key_AsciiTilde; + case XK_Mabovedot: return Qt::Key_AsciiTilde; + case XK_mabovedot: return Qt::Key_AsciiTilde; + case XK_Pabovedot: return Qt::Key_AsciiTilde; + case XK_pabovedot: return Qt::Key_AsciiTilde; + case XK_Sabovedot: return Qt::Key_AsciiTilde; + case XK_sabovedot: return Qt::Key_AsciiTilde; + case XK_Tabovedot: return Qt::Key_AsciiTilde; + case XK_tabovedot: return Qt::Key_AsciiTilde; + case XK_Wgrave: return Qt::Key_AsciiTilde; + case XK_wgrave: return Qt::Key_AsciiTilde; + case XK_Wacute: return Qt::Key_AsciiTilde; + case XK_wacute: return Qt::Key_AsciiTilde; + case XK_Wdiaeresis: return Qt::Key_AsciiTilde; + case XK_wdiaeresis: return Qt::Key_AsciiTilde; + case XK_Ygrave: return Qt::Key_AsciiTilde; + case XK_ygrave: return Qt::Key_AsciiTilde; + case XK_OE: return Qt::Key_AsciiTilde; + case XK_oe: return Qt::Key_AsciiTilde; + case XK_Ydiaeresis: return Qt::Key_AsciiTilde;*/ + default: + qDebug() << "Unknown Key"; + } + qDebug() << " -- Simple Qt Map:" << (Qt::Key)(symbol); + qDebug() << " -- Key Sequence Map:" << QKeySequence(symbol); + qDebug() << " - Not implemented yet"; + return Qt::Key_unknown; +} + +NativeWindowSystem::MouseButton NativeWindowSystem::MouseToQt(int keycode){ + switch(keycode){ + case 1: + return NativeWindowSystem::LeftButton; + case 3: + return NativeWindowSystem::RightButton; + case 2: + return NativeWindowSystem::MidButton; + case 4: + return NativeWindowSystem::WheelUp; + case 5: + return NativeWindowSystem::WheelDown; + case 6: + return NativeWindowSystem::WheelLeft; + case 7: + return NativeWindowSystem::WheelRight; + case 8: + return NativeWindowSystem::BackButton; //Not sure if this is correct yet (1/27/17) + case 9: + return NativeWindowSystem::ForwardButton; //Not sure if this is correct yet (1/27/17) + default: + return NativeWindowSystem::NoButton; + } +} diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp new file mode 100644 index 00000000..4b56f2a9 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp @@ -0,0 +1,980 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2017, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +// This is the XCB version of the NativeWindowSystem class, +// used for interacting with the X11 display system on BSD/Linux/Unix systems +//=========================================== +#include "NativeWindowSystem.h" +#include + + +//XCB Library includes +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//XLib includes (XCB Damage lib does not appear to register for damage events properly) +#include + +//SYSTEM TRAY STANDARD DEFINITIONS +#define _NET_SYSTEM_TRAY_ORIENTATION_HORZ 0 +#define _NET_SYSTEM_TRAY_ORIENTATION_VERT 1 +#define SYSTEM_TRAY_REQUEST_DOCK 0 +#define SYSTEM_TRAY_BEGIN_MESSAGE 1 +#define SYSTEM_TRAY_CANCEL_MESSAGE 2 + +#define URGENCYHINT (1L << 8) //For window urgency detection + +#define ROOT_WIN_EVENT_MASK (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | \ + XCB_EVENT_MASK_BUTTON_PRESS | \ + XCB_EVENT_MASK_STRUCTURE_NOTIFY | \ + XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | \ + XCB_EVENT_MASK_POINTER_MOTION | \ + XCB_EVENT_MASK_PROPERTY_CHANGE | \ + XCB_EVENT_MASK_FOCUS_CHANGE | \ + XCB_EVENT_MASK_ENTER_WINDOW) + +#define NORMAL_WIN_EVENT_MASK (XCB_EVENT_MASK_BUTTON_PRESS | \ + XCB_EVENT_MASK_BUTTON_RELEASE | \ + XCB_EVENT_MASK_POINTER_MOTION | \ + XCB_EVENT_MASK_BUTTON_MOTION | \ + XCB_EVENT_MASK_EXPOSURE | \ + XCB_EVENT_MASK_STRUCTURE_NOTIFY | \ + XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | \ + XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | \ + XCB_EVENT_MASK_ENTER_WINDOW | \ + XCB_EVENT_MASK_PROPERTY_CHANGE | \ + XCB_EVENT_MASK_FOCUS_CHANGE) + +#define CLIENT_EVENT_MASK (XCB_EVENT_MASK_PROPERTY_CHANGE | \ + XCB_EVENT_MASK_STRUCTURE_NOTIFY | \ + XCB_EVENT_MASK_FOCUS_CHANGE | \ + XCB_EVENT_MASK_POINTER_MOTION) + +#define FRAME_EVENT_MASK (XCB_EVENT_MASK_BUTTON_PRESS | \ + XCB_EVENT_MASK_BUTTON_RELEASE | \ + XCB_EVENT_MASK_POINTER_MOTION | \ + XCB_EVENT_MASK_EXPOSURE | \ + XCB_EVENT_MASK_STRUCTURE_NOTIFY | \ + XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | \ + XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | \ + XCB_EVENT_MASK_ENTER_WINDOW) + +inline void registerClientEvents(WId id, bool client = true){ + uint32_t values[] = {XCB_NONE}; + values[0] = client ? CLIENT_EVENT_MASK : FRAME_EVENT_MASK ; + /*{ (XCB_EVENT_MASK_PROPERTY_CHANGE + | XCB_EVENT_MASK_BUTTON_PRESS + | XCB_EVENT_MASK_BUTTON_RELEASE + | XCB_EVENT_MASK_POINTER_MOTION + | XCB_EVENT_MASK_BUTTON_MOTION + | XCB_EVENT_MASK_EXPOSURE + | XCB_EVENT_MASK_STRUCTURE_NOTIFY + | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT + | XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY + | XCB_EVENT_MASK_ENTER_WINDOW) + };*/ + xcb_change_window_attributes(QX11Info::connection(), id, XCB_CW_EVENT_MASK, values); +} + +/*inline void registerClientEvents(WId id){ + uint32_t value_list[1] = {NORMAL_WIN_EVENT_MASK}; + xcb_change_window_attributes(QX11Info::connection(), id, XCB_CW_EVENT_MASK, value_list); +}*/ + +//Internal XCB private objects class +class NativeWindowSystem::p_objects{ +public: + xcb_ewmh_connection_t EWMH; //This is where all the screen info and atoms are located + QHash ATOMS; + xcb_screen_t *root_screen; + xcb_window_t root_window, wm_window, tray_window; + + //Functions for setting up these objects as needed + bool init_ATOMS(){ + xcb_intern_atom_cookie_t *cookie = xcb_ewmh_init_atoms(QX11Info::connection(), &EWMH); + if(!xcb_ewmh_init_atoms_replies(&EWMH, cookie, NULL) ){ + qDebug() << "Error with XCB atom initializations"; + return false; + } + + QStringList atoms; + atoms << "WM_TAKE_FOCUS" << "WM_DELETE_WINDOW" << "WM_PROTOCOLS" << "_NET_WM_WINDOW_OPACITY" + << "WM_CHANGE_STATE" << "_NET_SYSTEM_TRAY_OPCODE" << "_NET_SYSTEM_TRAY_ORIENTATION" << "_XEMBED" + << "_NET_SYSTEM_TRAY_VISUAL" << QString("_NET_SYSTEM_TRAY_S%1").arg(QString::number(QX11Info::appScreen())); + //Create all the requests for the atoms + QList reply; + for(int i=0; iatom); + free(reply[i]); //done with this reply + }else{ + //Invalid atom - could not be created + qDebug() << "Could not initialize XCB atom:" << atoms[i]; + } + } //loop over reply + return (ATOMS.keys().length() == atoms.length()); + } + + WId getTransientFor(WId win){ + xcb_get_property_cookie_t cookie = xcb_icccm_get_wm_transient_for_unchecked(QX11Info::connection(), win); + xcb_window_t trans; + if(1!= xcb_icccm_get_wm_transient_for_reply(QX11Info::connection(), cookie, &trans, NULL) ){ + return win; //error in fetching transient window ID (or none found) + }else{ + return trans; + } +} + + bool register_wm(){ + uint32_t value_list[1] = {ROOT_WIN_EVENT_MASK}; + xcb_generic_error_t *status = xcb_request_check( QX11Info::connection(), xcb_change_window_attributes_checked(QX11Info::connection(), root_window, XCB_CW_EVENT_MASK, value_list)); + if(status!=0){ return false; } + uint32_t params[] = {1}; + wm_window = xcb_generate_id(QX11Info::connection()); //need a new ID + xcb_create_window(QX11Info::connection(), root_screen->root_depth, \ + wm_window, root_window, -1, -1, 1, 1, 0, \ + XCB_WINDOW_CLASS_INPUT_OUTPUT, root_screen->root_visual, \ + XCB_CW_OVERRIDE_REDIRECT, params); + if(wm_window==0){ return false; } + //Set the _NET_SUPPORTING_WM property on the root window first + xcb_ewmh_set_supporting_wm_check(&EWMH, root_window, wm_window); + //Also set this property on the child window (pointing to itself) + xcb_ewmh_set_supporting_wm_check(&EWMH, wm_window, wm_window); + //Now also setup the root event mask on the wm_window + status = xcb_request_check( QX11Info::connection(), xcb_change_window_attributes_checked(QX11Info::connection(), wm_window, XCB_CW_EVENT_MASK, value_list)); + if(status!=0){ return false; } + return true; + } + + bool start_system_tray(){ + xcb_atom_t _NET_SYSTEM_TRAY_S = ATOMS.value( QString("_NET_SYSTEM_TRAY_S%1").arg(QString::number(QX11Info::appScreen())) ); + //Make sure that there is no other system tray running + xcb_get_selection_owner_reply_t *ownreply = xcb_get_selection_owner_reply(QX11Info::connection(), \ + xcb_get_selection_owner_unchecked(QX11Info::connection(), _NET_SYSTEM_TRAY_S), NULL); + if(ownreply == 0){ + qWarning() << " - Could not get owner selection reply"; + return false; + }else if(ownreply->owner != 0){ + free(ownreply); + qWarning() << " - An alternate system tray is currently in use"; + return false; + } + free(ownreply); + //Now create the window to use (just offscreen) + tray_window = xcb_generate_id(QX11Info::connection()); //need a new ID + uint32_t params[] = {1}; + xcb_create_window(QX11Info::connection(), root_screen->root_depth, \ + tray_window, root_screen->root, -1, -1, 1, 1, 0, \ + XCB_WINDOW_CLASS_INPUT_OUTPUT, root_screen->root_visual, \ + XCB_CW_OVERRIDE_REDIRECT, params); + //Now register this widget as the system tray + xcb_set_selection_owner(QX11Info::connection(), tray_window, _NET_SYSTEM_TRAY_S, XCB_CURRENT_TIME); + //Make sure that it was registered properly + ownreply = xcb_get_selection_owner_reply(QX11Info::connection(), \ + xcb_get_selection_owner_unchecked(QX11Info::connection(), _NET_SYSTEM_TRAY_S), NULL); + if(ownreply==0 || ownreply->owner != tray_window){ + if(ownreply!=0){ free(ownreply); } + qWarning() << " - Could not register the system tray"; + xcb_destroy_window(QX11Info::connection(), tray_window); + return false; + } + free(ownreply); //done with structure + //Now register the orientation of the system tray + uint32_t orient = _NET_SYSTEM_TRAY_ORIENTATION_HORZ; + xcb_change_property(QX11Info::connection(), XCB_PROP_MODE_REPLACE, tray_window, \ + ATOMS.value("_NET_SYSTEM_TRAY_ORIENTATION"), XCB_ATOM_CARDINAL, 32, 1, &orient); + + //Now set the visual ID for the system tray (same as the root window, but TrueColor) + xcb_visualtype_t *type = xcb_aux_find_visual_by_attrs(root_screen, XCB_VISUAL_CLASS_TRUE_COLOR, 32); + if(type!=0){ + xcb_change_property(QX11Info::connection(), XCB_PROP_MODE_REPLACE, tray_window, \ + ATOMS.value("_NET_SYSTEM_TRAY_VISUAL"), XCB_ATOM_VISUALID, 32, 1, &type->visual_id); + }else{ + qWarning() << " - Could not set TrueColor visual for system tray"; + } + + //Finally, send out an X event letting others know that the system tray is up and running + xcb_client_message_event_t event; + event.response_type = XCB_CLIENT_MESSAGE; + event.format = 32; + event.window = root_screen->root; + event.type = EWMH.MANAGER; //MANAGER atom + event.data.data32[0] = XCB_TIME_CURRENT_TIME; //CurrentTime; + event.data.data32[1] = _NET_SYSTEM_TRAY_S; //_NET_SYSTEM_TRAY_S atom + event.data.data32[2] = tray_window; + event.data.data32[3] = 0; + event.data.data32[4] = 0; + + xcb_send_event(QX11Info::connection(), 0, root_screen->root, XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *) &event); + return true; + } + +}; //end private objects class + + +//inline functions for setting up the internal objects + + +// === PUBLIC === +NativeWindowSystem::NativeWindowSystem() : QObject(){ + obj = 0; + pingTimer = 0; + screenLocked = false; +} + +NativeWindowSystem::~NativeWindowSystem(){ + xcb_ewmh_connection_wipe(&(obj->EWMH)); + free(obj); +} + +//Overarching start/stop functions +bool NativeWindowSystem::start(){ + //Initialize the XCB/EWMH objects + if(obj==0){ + obj = new p_objects(); //instantiate the private objects + obj->wm_window = 0; + obj->tray_window = 0; + xcb_intern_atom_cookie_t *cookie = xcb_ewmh_init_atoms(QX11Info::connection(), &obj->EWMH); + if(!xcb_ewmh_init_atoms_replies(&obj->EWMH, cookie, NULL) ){ + qDebug() << "Error with XCB atom initializations"; + return false; + } + obj->root_screen = xcb_aux_get_screen(QX11Info::connection(), QX11Info::appScreen()); + obj->root_window = obj->root_screen->root; //simplification for later - minor duplication of memory (unsigned int) + //Initialize all the extra atoms that the EWMH object does not have + if( !obj->init_ATOMS() ){ return false; } + } //Done with private object init + bool ok = obj->register_wm(); + if(ok){ + setRoot_supportedActions(); + ok = obj->start_system_tray(); + }else{ + qWarning() << "Could not register the WM"; + } + return ok; +} + +void NativeWindowSystem::stop(){ + +} + +// === PRIVATE === +NativeWindowObject* NativeWindowSystem::findWindow(WId id, bool checkRelated){ + //qDebug() << "Find Window:" << id; + for(int i=0; iid() ){ return NWindows[i]; } + else if(id==NWindows[i]->frameId() ){ return NWindows[i]; } + //if(checkRelated && NWindows[i]->isRelatedTo(id)){ return NWindows[i]; } + //else if(!checkRelated && id==NWindows[i]->id()){ return NWindows[i]; } + } + //Check to see if this is a transient for some other window + if(checkRelated){ + //WId tid = obj->getTransientFor(id); + //if(tid!=id){ return findWindow(tid, checkRelated); } //call it recursively as needed + //qDebug() << " -- Could not find Window!"; + } + return 0; +} + +NativeWindowObject* NativeWindowSystem::findTrayWindow(WId id){ + for(int i=0; iisRelatedTo(id)){ return TWindows[i]; } + } + return 0; +} + +void NativeWindowSystem::UpdateWindowProperties(NativeWindowObject* win, QList< NativeWindowObject::Property > props){ + //Put the properties in logical groups as appropriate (some XCB calls return multiple properties) + if(props.contains(NativeWindowObject::Title)){ + //Try the EWMH standards first + // _NET_WM_NAME + QString name; + xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_name_unchecked(&obj->EWMH, win->id()); + if(cookie.sequence != 0){ + xcb_ewmh_get_utf8_strings_reply_t data; + if( 1 == xcb_ewmh_get_wm_name_reply(&obj->EWMH, cookie, &data, NULL) ){ + name = QString::fromUtf8(data.strings, data.strings_len); + } + } + if(name.isEmpty()){ + //_NET_WM_VISIBLE_NAME + xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_visible_name_unchecked(&obj->EWMH, win->id()); + if(cookie.sequence != 0){ + xcb_ewmh_get_utf8_strings_reply_t data; + if( 1 == xcb_ewmh_get_wm_visible_name_reply(&obj->EWMH, cookie, &data, NULL) ){ + name = QString::fromUtf8(data.strings, data.strings_len); + } + } + } + if(name.isEmpty()){ + //Now try the ICCCM standard + xcb_get_property_cookie_t cookie = xcb_icccm_get_wm_name_unchecked(QX11Info::connection(), win->id()); + xcb_icccm_get_text_property_reply_t reply; + if(1 == xcb_icccm_get_wm_name_reply(QX11Info::connection(), cookie, &reply, NULL) ){ + name = QString::fromLocal8Bit(reply.name, reply.name_len); + xcb_icccm_get_text_property_reply_wipe(&reply); + } + } + win->setProperty(NativeWindowObject::Title, name); + } //end TITLE property + + if(props.contains(NativeWindowObject::ShortTitle)){ + //Try the EWMH standards first + // _NET_WM_ICON_NAME + QString name; + xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_icon_name_unchecked(&obj->EWMH, win->id()); + if(cookie.sequence != 0){ + xcb_ewmh_get_utf8_strings_reply_t data; + if( 1 == xcb_ewmh_get_wm_icon_name_reply(&obj->EWMH, cookie, &data, NULL) ){ + name = QString::fromUtf8(data.strings, data.strings_len); + } + } + if(name.isEmpty()){ + //_NET_WM_VISIBLE_ICON_NAME + xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_visible_icon_name_unchecked(&obj->EWMH, win->id()); + if(cookie.sequence != 0){ + xcb_ewmh_get_utf8_strings_reply_t data; + if( 1 == xcb_ewmh_get_wm_visible_icon_name_reply(&obj->EWMH, cookie, &data, NULL) ){ + name = QString::fromUtf8(data.strings, data.strings_len); + } + } + } + if(name.isEmpty()){ + //Now try the ICCCM standard + xcb_get_property_cookie_t cookie = xcb_icccm_get_wm_icon_name_unchecked(QX11Info::connection(), win->id()); + xcb_icccm_get_text_property_reply_t reply; + if(1 == xcb_icccm_get_wm_icon_name_reply(QX11Info::connection(), cookie, &reply, NULL) ){ + name = QString::fromLocal8Bit(reply.name, reply.name_len); + xcb_icccm_get_text_property_reply_wipe(&reply); + } + } + win->setProperty(NativeWindowObject::ShortTitle, name); + } //end SHORTTITLE property + + if(props.contains(NativeWindowObject::Icon)){ + //See if this is a tray icon first (different routine - entire app window is the icon) + QIcon icon; + if(win == findTrayWindow(win->id())){ + //Tray Icon Window + QPixmap pix; + //Get the current QScreen (for XCB->Qt conversion) + QList scrnlist = QApplication::screens(); + //Try to grab the given window directly with Qt + for(int i=0; igrabWindow(win->id()); + } + icon.addPixmap(pix); + }else{ + //Standard window + //Fetch the _NET_WM_ICON for the window and return it as a QIcon + xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_icon_unchecked(&obj->EWMH, win->id()); + xcb_ewmh_get_wm_icon_reply_t reply; + if(1 == xcb_ewmh_get_wm_icon_reply(&obj->EWMH, cookie, &reply, NULL)){ + xcb_ewmh_wm_icon_iterator_t iter = xcb_ewmh_get_wm_icon_iterator(&reply); + //Just use the first + bool done =false; + while(!done){ + //Now convert the current data into a Qt image + // - first 2 elements are width and height (removed via XCB functions) + // - data in rows from left to right and top to bottom + QImage image(iter.width, iter.height, QImage::Format_ARGB32); //initial setup + uint* dat = iter.data; + //dat+=2; //remember the first 2 element offset + for(int i=0; isetProperty(NativeWindowObject::Icon, icon); + } //end ICON property + + if(props.contains(NativeWindowObject::MinSize) || props.contains(NativeWindowObject::MaxSize) + || props.contains(NativeWindowObject::Size) || props.contains(NativeWindowObject::GlobalPos) ){ + //Try the ICCCM "Normal Hints" structure first (newer spec?) + xcb_get_property_cookie_t cookie = xcb_icccm_get_wm_normal_hints_unchecked(QX11Info::connection(), win->id()); + xcb_size_hints_t reply; + bool ok = false; + if(1==xcb_icccm_get_wm_normal_hints_reply(QX11Info::connection(), cookie, &reply, NULL) ){ ok = true; } + else{ + //Could not find normal hints, try the older "size hints" instead + cookie = xcb_icccm_get_wm_size_hints_unchecked(QX11Info::connection(), win->id(), XCB_ATOM_WM_SIZE_HINTS); + if(1==xcb_icccm_get_wm_size_hints_reply(QX11Info::connection(), cookie, &reply, NULL) ){ ok = true; } + } + if(ok){ + bool initsize = win->property(NativeWindowObject::Size).isNull(); //initial window size + if( (reply.flags&XCB_ICCCM_SIZE_HINT_US_POSITION)==XCB_ICCCM_SIZE_HINT_US_POSITION ){ win->setProperty(NativeWindowObject::GlobalPos, QPoint(reply.x,reply.y)); } + if( (reply.flags&XCB_ICCCM_SIZE_HINT_US_SIZE)==XCB_ICCCM_SIZE_HINT_US_SIZE ){ win->setProperty(NativeWindowObject::Size, QSize(reply.width, reply.height)); } + if( (reply.flags&XCB_ICCCM_SIZE_HINT_P_POSITION)==XCB_ICCCM_SIZE_HINT_P_POSITION ){ win->setProperty(NativeWindowObject::GlobalPos, QPoint(reply.x,reply.y)); } + if( (reply.flags&XCB_ICCCM_SIZE_HINT_P_SIZE)==XCB_ICCCM_SIZE_HINT_P_SIZE ){ win->setProperty(NativeWindowObject::Size, QSize(reply.width, reply.height)); } + if( (reply.flags&XCB_ICCCM_SIZE_HINT_P_MIN_SIZE)==XCB_ICCCM_SIZE_HINT_P_MIN_SIZE ){ win->setProperty(NativeWindowObject::MinSize, QSize(reply.min_width, reply.min_height)); } + if( (reply.flags&XCB_ICCCM_SIZE_HINT_P_MAX_SIZE)==XCB_ICCCM_SIZE_HINT_P_MAX_SIZE ){ win->setProperty(NativeWindowObject::MaxSize, QSize(reply.max_width, reply.max_height)); } + if( (reply.flags&XCB_ICCCM_SIZE_HINT_BASE_SIZE)==XCB_ICCCM_SIZE_HINT_BASE_SIZE && initsize ){ win->setProperty(NativeWindowObject::Size, QSize(reply.base_width, reply.base_height)); } + //if( (reply.flags&XCB_ICCCM_SIZE_HINT_P_RESIZE_INC)==XCB_ICCCM_SIZE_HINT_P_RESIZE_INC ){ hints.width_inc=reply.width_inc; hints.height_inc=reply.height_inc; } + //if( (reply.flags&XCB_ICCCM_SIZE_HINT_P_ASPECT)==XCB_ICCCM_SIZE_HINT_P_ASPECT ){ hints.min_aspect_num=reply.min_aspect_num; hints.min_aspect_den=reply.min_aspect_den; hints.max_aspect_num=reply.max_aspect_num; hints.max_aspect_den=reply.max_aspect_den;} + //if( (reply.flags&XCB_ICCCM_SIZE_HINT_P_WIN_GRAVITY)==XCB_ICCCM_SIZE_HINT_P_WIN_GRAVITY ){ hints.win_gravity=reply.win_gravity; } + } + } //end of geometry properties + + if(props.contains(NativeWindowObject::Name)){ + //Put the app/class name here (much more static than the "Title" properties + xcb_get_property_cookie_t cookie = xcb_icccm_get_wm_class_unchecked(QX11Info::connection(), win->id()); + xcb_icccm_get_wm_class_reply_t reply; + if(1 == xcb_icccm_get_wm_class_reply(QX11Info::connection(), cookie, &reply, NULL) ){ + //Returns: "::::" + win->setProperty(NativeWindowObject::Name, ( QString::fromLocal8Bit(reply.instance_name)+"::::"+QString::fromLocal8Bit(reply.class_name) )); + xcb_icccm_get_wm_class_reply_wipe(&reply); + } + } //end NAME property + + if(props.contains(NativeWindowObject::Workspace)){ + xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_desktop_unchecked(&obj->EWMH, win->id()); + uint32_t num = 0; + int wkspace = -1; + if(1==xcb_ewmh_get_wm_desktop_reply(&obj->EWMH, cookie, &num, NULL) ){ + if(num!=0xFFFFFFFF){ wkspace = num; } + }/*else{ + //Error in fetching property (not set?) + // - put it on the current screen + out = WM_Get_Current_Desktop(); + }*/ + win->setProperty(NativeWindowObject::Workspace, wkspace); + } + if(props.contains(NativeWindowObject::FrameExtents)){ + //Just assign default values to this - need to automate it later + //win->setProperty(NativeWindowObject::FrameExtents, QVariant::fromValue >(QList() << 5 << 5 << 5+QFontMetrics(QFont()).height() << 5) ); + } + if(props.contains(NativeWindowObject::RelatedWindows)){ + WId orig = win->id(); + WId tid = obj->getTransientFor(orig); + QList list; + while(tid != orig){ + list << tid; + orig = tid; + tid = obj->getTransientFor(orig); + } + win->setProperty(NativeWindowObject::RelatedWindows, QVariant::fromValue(list)); + } + if(props.contains(NativeWindowObject::Visible)){ + xcb_get_window_attributes_reply_t *attr = xcb_get_window_attributes_reply(QX11Info::connection(), xcb_get_window_attributes(QX11Info::connection(), win->id()) , NULL); + if(attr != 0){ + win->setProperty(NativeWindowObject::Visible, attr->map_state == XCB_MAP_STATE_VIEWABLE); + free(attr); + } + } + if(props.contains(NativeWindowObject::WinTypes)){ + QList< NativeWindowObject::Type> types; + xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_window_type_unchecked(&obj->EWMH, win->id()); + xcb_ewmh_get_atoms_reply_t reply; + if(1==xcb_ewmh_get_wm_window_type_reply(&obj->EWMH, cookie, &reply, NULL) ){ + for(unsigned int i=0; iEWMH._NET_WM_WINDOW_TYPE_DESKTOP){ types << NativeWindowObject::T_DESKTOP; } + else if(reply.atoms[i]==obj->EWMH._NET_WM_WINDOW_TYPE_DOCK){ types << NativeWindowObject::T_DOCK; } + else if(reply.atoms[i]==obj->EWMH._NET_WM_WINDOW_TYPE_TOOLBAR){ types << NativeWindowObject::T_TOOLBAR; } + else if(reply.atoms[i]==obj->EWMH._NET_WM_WINDOW_TYPE_MENU){ types << NativeWindowObject::T_MENU; } + else if(reply.atoms[i]==obj->EWMH._NET_WM_WINDOW_TYPE_UTILITY){ types << NativeWindowObject::T_UTILITY; } + else if(reply.atoms[i]==obj->EWMH._NET_WM_WINDOW_TYPE_SPLASH){ types << NativeWindowObject::T_SPLASH; } + else if(reply.atoms[i]==obj->EWMH._NET_WM_WINDOW_TYPE_DIALOG){ types << NativeWindowObject::T_DIALOG; } + else if(reply.atoms[i]==obj->EWMH._NET_WM_WINDOW_TYPE_DROPDOWN_MENU){ types << NativeWindowObject::T_DROPDOWN_MENU; } + else if(reply.atoms[i]==obj->EWMH._NET_WM_WINDOW_TYPE_POPUP_MENU){ types << NativeWindowObject::T_POPUP_MENU; } + else if(reply.atoms[i]==obj->EWMH._NET_WM_WINDOW_TYPE_TOOLTIP){ types << NativeWindowObject::T_TOOLTIP; } + else if(reply.atoms[i]==obj->EWMH._NET_WM_WINDOW_TYPE_NOTIFICATION){ types << NativeWindowObject::T_NOTIFICATION; } + else if(reply.atoms[i]==obj->EWMH._NET_WM_WINDOW_TYPE_COMBO){ types << NativeWindowObject::T_COMBO; } + else if(reply.atoms[i]==obj->EWMH._NET_WM_WINDOW_TYPE_DND){ types << NativeWindowObject::T_DND; } + else if(reply.atoms[i]==obj->EWMH._NET_WM_WINDOW_TYPE_NORMAL){ types << NativeWindowObject::T_NORMAL; } + } + } + if(types.isEmpty()){ types << NativeWindowObject::T_NORMAL; } + win->setProperty(NativeWindowObject::WinTypes, QVariant::fromValue< QList >(types) ); + } +} + +void NativeWindowSystem::ChangeWindowProperties(NativeWindowObject* win, QList< NativeWindowObject::Property > props, QList vals){ + if(props.length() == 0 || vals.length()!=props.length() || win ==0 ){ return; } + //qDebug() << "Change Window Properties:" << props << vals; + if(props.contains(NativeWindowObject::Title)){ + + } + if(props.contains(NativeWindowObject::ShortTitle)){ + + } + if(props.contains(NativeWindowObject::Icon)){ + + } + if(props.contains(NativeWindowObject::Size) || props.contains(NativeWindowObject::GlobalPos) ){ + /*xcb_configure_window_value_list_t valList; + //valList.x = 0; //Note that this is the relative position - should always be 0,0 relative to the embed widget + //valList.y = 0; + QSize sz = win->property(NativeWindowObject::Size).toSize(); + if(props.contains(NativeWindowObject::Size)){ + sz = vals[ props.indexOf(NativeWindowObject::Size) ] .toSize(); + } + valList.width = sz.width(); + valList.height = sz.height(); + if(props.contains(NativeWindowObject::GlobalPos)){ + QPoint pt = vals[ props.indexOf(NativeWindowObject::GlobalPos) ] .toPoint(); + valList.x = pt.x(); + valList.y = pt.y(); + }else{ + valList.x = win->property(NativeWindowObject::GlobalPos).toPoint().x(); + valList.y = win->property(NativeWindowObject::GlobalPos).toPoint().y(); + } + uint16_t mask = 0; + mask = mask | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT | XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y; + //qDebug() << "Configure window Geometry:" << sz; + xcb_configure_window_aux(QX11Info::connection(), win->id(), mask, &valList);*/ + } + if(props.contains(NativeWindowObject::Name)){ + + } + if(props.contains(NativeWindowObject::Workspace)){ + int num = vals[ props.indexOf(NativeWindowObject::Workspace) ].toInt(); + xcb_ewmh_set_wm_desktop(&obj->EWMH, win->id(), (num<0 ? 0xFFFFFFFF : qAbs(num) ) ); + } + if(props.contains(NativeWindowObject::RelatedWindows)){ + + } + if(props.contains(NativeWindowObject::Visible)){ + //qDebug() << "Check Window Visibility:" << vals[ props.indexOf(NativeWindowObject::Visible) ]; + if( vals[ props.indexOf(NativeWindowObject::Visible) ].toBool() ){ + //qDebug() << " - Map it!"; + xcb_map_window(QX11Info::connection(), win->id()); + }else{ + //qDebug() << " - Unmap it!"; + xcb_unmap_window(QX11Info::connection(), win->id()); + } + } + if(props.contains(NativeWindowObject::Active)){ + //Only one window can be "Active" at a time - so only do anything if this window wants to be active + if(vals[props.indexOf(NativeWindowObject::Active)].toBool() ){ + //Lower the currently active window (invisible window) to the bottom of the stack + xcb_window_t cactive; + if( 1 == xcb_ewmh_get_active_window_reply( &obj->EWMH, + xcb_ewmh_get_active_window_unchecked(&obj->EWMH, QX11Info::appScreen()), + &cactive, NULL) ){ + uint32_t val = XCB_STACK_MODE_BELOW; + xcb_configure_window(QX11Info::connection(), cactive, XCB_CONFIG_WINDOW_STACK_MODE, &val); + } + + xcb_ewmh_set_active_window(&obj->EWMH, QX11Info::appScreen(), win->id() ); + //Also send the active window a message to take input focus + xcb_set_input_focus(QX11Info::connection(), XCB_INPUT_FOCUS_PARENT, win->id(), XCB_CURRENT_TIME); + //Send the window a WM_TAKE_FOCUS message +/* xcb_client_message_event_t event; + event.response_type = XCB_CLIENT_MESSAGE; + event.format = 32; + event.window = win->id(); + event.type = obj->ATOMS["WM_PROTOCOLS"]; + event.data.data32[0] = obj->ATOMS["WM_TAKE_FOCUS"]; + event.data.data32[1] = XCB_TIME_CURRENT_TIME; //CurrentTime; + event.data.data32[2] = 0; + event.data.data32[3] = 0; + event.data.data32[4] = 0; + + xcb_send_event(QX11Info::connection(), 0, win->id(), XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *) &event); + xcb_flush(QX11Info::connection()); +*/ + } + } + +} + +// === PUBLIC SLOTS === +//These are the slots which are typically only used by the desktop system itself or the NativeEventFilter +void NativeWindowSystem::RegisterVirtualRoot(WId id){ + //Convert to XCB array + xcb_window_t array[1]; + array[0] = id; + //Set the property + xcb_ewmh_set_virtual_roots(&obj->EWMH, QX11Info::appScreen(), 1, array); + //Now also enable automatic compositing for children of this window + //xcb_composite_redirect_window(QX11Info::connection(), id, XCB_COMPOSITE_REDIRECT_AUTOMATIC); + //xcb_composite_redirect_subwindows(QX11Info::connection(), id, XCB_COMPOSITE_REDIRECT_AUTOMATIC); +} + +void NativeWindowSystem::setRoot_supportedActions(){ +//NET_WM standards (ICCCM implied - no standard way to list those) + xcb_atom_t list[] = {obj->EWMH._NET_WM_NAME, + obj->EWMH._NET_WM_ICON, + obj->EWMH._NET_WM_ICON_NAME, + obj->EWMH._NET_WM_DESKTOP, + /*obj->ATOMS["_NET_WM_WINDOW_OPACITY"],*/ + /*_NET_WINDOW_TYPE (and all the various types - 15 in total*/ + obj->EWMH._NET_WM_WINDOW_TYPE, obj->EWMH._NET_WM_WINDOW_TYPE_DESKTOP, obj->EWMH._NET_WM_WINDOW_TYPE_DOCK, + obj->EWMH._NET_WM_WINDOW_TYPE_TOOLBAR, obj->EWMH._NET_WM_WINDOW_TYPE_MENU, obj->EWMH._NET_WM_WINDOW_TYPE_UTILITY, + obj->EWMH._NET_WM_WINDOW_TYPE_SPLASH, obj->EWMH._NET_WM_WINDOW_TYPE_DIALOG, obj->EWMH._NET_WM_WINDOW_TYPE_NORMAL, + obj->EWMH._NET_WM_WINDOW_TYPE_DROPDOWN_MENU, obj->EWMH._NET_WM_WINDOW_TYPE_POPUP_MENU, obj->EWMH._NET_WM_WINDOW_TYPE_TOOLTIP, + obj->EWMH._NET_WM_WINDOW_TYPE_NOTIFICATION, obj->EWMH._NET_WM_WINDOW_TYPE_COMBO, obj->EWMH._NET_WM_WINDOW_TYPE_DND, + }; + xcb_ewmh_set_supported(&obj->EWMH, QX11Info::appScreen(), 20,list); +} + +void NativeWindowSystem::setRoot_numberOfWorkspaces(QStringList names){ + if(names.isEmpty()){ names << "one"; } + //First set the overall number of workspaces + xcb_ewmh_set_number_of_desktops(&obj->EWMH, QX11Info::appScreen(), names.length()); + //Now set the names for the workspaces + //EWMH LIBRARY BROKEN - appears to be a mismatch in the function header (looking for a single char array, instead of a list of char arrays) + // Ken Moore - 6/27/17 + /* + char *array[ names.length() ]; + for(int i=0; iEWMH, QX11Info::appScreen(), names.length(), array); + */ +} + +void NativeWindowSystem::setRoot_currentWorkspace(int num){ + xcb_ewmh_set_current_desktop(&obj->EWMH, QX11Info::appScreen(), num); +} + +void NativeWindowSystem::setRoot_clientList(QList list, bool stackorder){ + //convert the QList into a generic array + xcb_window_t array[list.length()]; + for(int i=0; iEWMH, QX11Info::appScreen(), list.length(), array); + }else{ + xcb_ewmh_set_client_list(&obj->EWMH, QX11Info::appScreen(), list.length(), array); + } +} + +void NativeWindowSystem::setRoot_desktopGeometry(QRect geom){ + //This one is a combo function + // This will set the "DESKTOP_VIEWPORT" property (point) + // as well as the "DESKTOP_GEOMETRY" property (size) + //Turn the QList into xcb_ewmh_coordinates_t* + xcb_ewmh_coordinates_t array[1]; + array[0].x=geom.x(); array[0].y=geom.y(); + //Now set the property + xcb_ewmh_set_desktop_viewport(&obj->EWMH, QX11Info::appScreen(), 1, array); + xcb_ewmh_set_desktop_geometry(&obj->EWMH, QX11Info::appScreen(), geom.width(), geom.height()); +} + +void NativeWindowSystem::setRoot_desktopWorkarea(QList list){ + //Convert to the XCB/EWMH data structures + xcb_ewmh_geometry_t array[list.length()]; + for(int i=0; iEWMH, QX11Info::appScreen(), list.length(), array); +} + +void NativeWindowSystem::setRoot_activeWindow(WId win){ + /*xcb_ewmh_set_active_window(&obj->EWMH, QX11Info::appScreen(), win); + //Also send the active window a message to take input focus + //Send the window a WM_TAKE_FOCUS message + xcb_client_message_event_t event; + event.response_type = XCB_CLIENT_MESSAGE; + event.format = 32; + event.window = win; + event.type = obj->ATOMS["WM_PROTOCOLS"]; + event.data.data32[0] = obj->ATOMS["WM_TAKE_FOCUS"]; + event.data.data32[1] = XCB_TIME_CURRENT_TIME; //CurrentTime; + event.data.data32[2] = 0; + event.data.data32[3] = 0; + event.data.data32[4] = 0; + + xcb_send_event(QX11Info::connection(), 0, win, XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *) &event); + xcb_flush(QX11Info::connection());*/ +} + +int NativeWindowSystem::currentWorkspace(){ + xcb_get_property_cookie_t cookie = xcb_ewmh_get_current_desktop_unchecked(&obj->EWMH, QX11Info::appScreen()); + uint32_t num = 0; + if(1==xcb_ewmh_get_current_desktop_reply(&obj->EWMH, cookie, &num, NULL) ){ + return num; + }else{ + return 0; + } +} + +//NativeWindowEventFilter interactions +void NativeWindowSystem::NewWindowDetected(WId id){ + //Make sure this can be managed first + if(findWindow(id, false) != 0){ findWindow(id,false)->setProperty(NativeWindowObject::Visible, true, true); return; } //already managed + xcb_get_window_attributes_cookie_t cookie = xcb_get_window_attributes(QX11Info::connection(), id); + xcb_get_window_attributes_reply_t *attr = xcb_get_window_attributes_reply(QX11Info::connection(), cookie, NULL); + if(attr == 0){ return; } //could not get attributes of window + if(attr->override_redirect){ free(attr); return; } //window has override redirect set (do not manage) + free(attr); + //Now go ahead and create/populate the container for this window + NativeWindowObject *win = new NativeWindowObject(id); + //Register for events from this window + registerClientEvents(win->id()); + NWindows << win; + UpdateWindowProperties(win, NativeWindowObject::allProperties()); + qDebug() << "New Window [& associated ID's]:" << win->id() << win->property(NativeWindowObject::Name).toString(); + //Now setup the connections with this window + connect(win, SIGNAL(RequestClose(WId)), this, SLOT(RequestClose(WId)) ); + connect(win, SIGNAL(RequestKill(WId)), this, SLOT(RequestKill(WId)) ); + connect(win, SIGNAL(RequestPing(WId)), this, SLOT(RequestPing(WId)) ); + connect(win, SIGNAL(RequestReparent(WId, WId, QPoint)), this, SLOT(RequestReparent(WId, WId, QPoint)) ); + connect(win, SIGNAL(RequestPropertiesChange(WId, QList, QList)), this, SLOT(RequestPropertiesChange(WId, QList, QList)) ); + emit NewWindowAvailable(win); +} + +void NativeWindowSystem::NewTrayWindowDetected(WId id){ + //Make sure this can be managed first + if(findTrayWindow(id) != 0){ return; } //already managed + xcb_get_window_attributes_cookie_t cookie = xcb_get_window_attributes(QX11Info::connection(), id); + xcb_get_window_attributes_reply_t *attr = xcb_get_window_attributes_reply(QX11Info::connection(), cookie, NULL); + if(attr == 0){ return; } //could not get attributes of window + if(attr->override_redirect){ free(attr); return; } //window has override redirect set (do not manage) + free(attr); + //Register for events from this window + #define TRAY_WIN_EVENT_MASK (XCB_EVENT_MASK_BUTTON_PRESS | \ + XCB_EVENT_MASK_BUTTON_RELEASE | \ + XCB_EVENT_MASK_POINTER_MOTION | \ + XCB_EVENT_MASK_BUTTON_MOTION | \ + XCB_EVENT_MASK_EXPOSURE | \ + XCB_EVENT_MASK_STRUCTURE_NOTIFY | \ + XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | \ + XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | \ + XCB_EVENT_MASK_ENTER_WINDOW) + + uint32_t value_list[1] = {TRAY_WIN_EVENT_MASK}; + xcb_change_window_attributes(QX11Info::connection(), id, XCB_CW_EVENT_MASK, value_list); + //Now go ahead and create/populate the container for this window + NativeWindowObject *win = new NativeWindowObject(id); + TWindows << win; + UpdateWindowProperties(win, NativeWindowObject::allProperties()); + emit NewTrayWindowAvailable(win); +} + +void NativeWindowSystem::WindowCloseDetected(WId id){ + NativeWindowObject *win = findWindow(id, false); + //qDebug() << "Got Window Closed" << id << win; + //qDebug() << "Old Window List:" << NWindows.length(); + if(win!=0){ + NWindows.removeAll(win); + //RequestReparent(id, QX11Info::appRootWindow(), QPoint(0,0)); + win->emit WindowClosed(id); + //qDebug() << "Visible Window Closed!!!"; + //win->deleteLater(); + emit WindowClosed(); + }else{ + win = findTrayWindow(id); + if(win!=0){ + TWindows.removeAll(win); + win->emit WindowClosed(id); + win->deleteLater(); + emit TrayWindowClosed(); + } + } + //qDebug() << " - Now:" << NWindows.length(); +} + +void NativeWindowSystem::WindowPropertyChanged(WId id, NativeWindowObject::Property prop){ + //NOTE: This is triggered by the NativeEventFilter - not by changes to the NativeWindow objects themselves + NativeWindowObject *win = findWindow(id, prop!=NativeWindowObject::Visible); + if(win==0){ win = findTrayWindow(id); } + if(win!=0){ + UpdateWindowProperties(win, QList() << prop); + }else if(prop != 0){ + //Could not find the window for a specific property with an undefined value + // - update this property for all the windows just in case + for(int i=0; i() << prop); + } + } +} + +void NativeWindowSystem::WindowPropertiesChanged(WId id, QList props){ + //NOTE: This is triggered by the NativeEventFilter - not by changes to the NativeWindow objects themselves + NativeWindowObject *win = findWindow(id); + if(win==0){ win = findTrayWindow(id); } + if(win!=0){ + UpdateWindowProperties(win, props); + }else{ + //Could not find the window for a specific property with an undefined value + // - update this property for all the windows just in case + for(int i=0; isetProperty(prop, val); + } +} + +void NativeWindowSystem::WindowPropertiesChanged(WId id, QList props, QList vals){ + NativeWindowObject *win = findWindow(id); + if(win==0){ win = findTrayWindow(id); } + if(win!=0){ + for(int i=0; isetProperty(props[i], vals[i]); } + } +} + +void NativeWindowSystem::RequestPropertyChange(WId id, NativeWindowObject::Property prop, QVariant val){ + //This is just a simplified version of the multiple-property function + RequestPropertiesChange(id, QList() << prop, QList() << val); +} + +void NativeWindowSystem::RequestPropertiesChange(WId win, QList props, QList vals){ + //Find the window object associated with this id + bool istraywin = false; //just in case we care later if it is a tray window or a regular window + NativeWindowObject *WIN = findWindow(win); + if(WIN==0){ istraywin = true; WIN = findTrayWindow(win); } + if(WIN==0){ return; } //invalid window ID - no longer available + //Now make any changes as needed + ChangeWindowProperties(WIN, props, vals); +} + +void NativeWindowSystem::GotPong(WId id){ + if(waitingForPong.contains(id)){ + waitingForPong.remove(id); + } + if(waitingForPong.isEmpty() && pingTimer!=0){ pingTimer->stop(); } +} + +void NativeWindowSystem::NewKeyPress(int keycode, WId win){ + emit NewInputEvent(); + if(screenLocked){ return; } + Qt::Key key = KeycodeToQt(keycode); + if(key!=Qt::Key_unknown){ emit KeyPressDetected(win, key); } +} + +void NativeWindowSystem::NewKeyRelease(int keycode, WId win){ + emit NewInputEvent(); + if(screenLocked){ return; } + Qt::Key key = KeycodeToQt(keycode); + if(key!=Qt::Key_unknown){ emit KeyReleaseDetected(win, key); } +} + +void NativeWindowSystem::NewMousePress(int buttoncode, WId win){ + emit NewInputEvent(); + if(screenLocked){ return; } + emit MousePressDetected(win, MouseToQt(buttoncode)); +} + +void NativeWindowSystem::NewMouseRelease(int buttoncode, WId win){ + emit NewInputEvent(); + if(screenLocked){ return; } + emit MouseReleaseDetected(win, MouseToQt(buttoncode)); +} + +void NativeWindowSystem::CheckDamageID(WId win){ + for(int i=0; idamageId() == win || NWindows[i]->id() == win || NWindows[i]->frameId()==win){ + NWindows[i]->emit VisualChanged(); + //qDebug() << "Got DAMAGE Event"; + return; + } + } + NativeWindowObject *WIN = findTrayWindow(win); + if(WIN!=0){ + UpdateWindowProperties(WIN, QList() << NativeWindowObject::Icon); + } +} + +// === PRIVATE SLOTS === +//These are the slots which are built-in and automatically connected when a new NativeWindow is created + +void NativeWindowSystem::RequestClose(WId win){ + //Send the window a WM_DELETE_WINDOW message + xcb_client_message_event_t event; + event.response_type = XCB_CLIENT_MESSAGE; + event.format = 32; + event.window = win; + event.type = obj->ATOMS.value("WM_PROTOCOLS"); + event.data.data32[0] = obj->ATOMS.value("WM_DELETE_WINDOW"); + event.data.data32[1] = XCB_TIME_CURRENT_TIME; //CurrentTime; + event.data.data32[2] = 0; + event.data.data32[3] = 0; + event.data.data32[4] = 0; + + xcb_send_event(QX11Info::connection(), 0, win, XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *) &event); + xcb_flush(QX11Info::connection()); +} + +void NativeWindowSystem::RequestKill(WId win){ + xcb_kill_client(QX11Info::connection(), win); +} + +void NativeWindowSystem::RequestPing(WId win){ + waitingForPong.insert(win, QDateTime::currentDateTime().addSecs(5) ); + xcb_ewmh_send_wm_ping(&obj->EWMH, win, XCB_CURRENT_TIME); + if(pingTimer==0){ + pingTimer = new QTimer(this); + pingTimer->setInterval(2000); //2seconds + connect(pingTimer, SIGNAL(timeout()), this, SLOT(checkPings()) ); + } + pingTimer->start(); +} + +void NativeWindowSystem::RequestReparent(WId win, WId container, QPoint relorigin){ + NativeWindowObject *WIN = findWindow(win); + if(WIN==0){ return; } //could not find corresponding window structure +//Reparent the window into the container + xcb_reparent_window(QX11Info::connection(), win, container, relorigin.x(), relorigin.y()); + //xcb_map_window(QX11Info::connection(), win); + + //Now send the embed event to the app + //qDebug() << " - send _XEMBED event"; + xcb_client_message_event_t event; + event.response_type = XCB_CLIENT_MESSAGE; + event.format = 32; + event.window = win; + event.type = obj->ATOMS["_XEMBED"]; //_XEMBED + event.data.data32[0] = XCB_TIME_CURRENT_TIME; //CurrentTime; + event.data.data32[1] = 0; //XEMBED_EMBEDDED_NOTIFY + event.data.data32[2] = 0; + event.data.data32[3] = container; //WID of the container + event.data.data32[4] = 0; + + xcb_send_event(QX11Info::connection(), 0, win, XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *) &event); + + //Now setup any redirects and return + //this->SelectInput(win, true); //Notify of structure changes + registerClientEvents(win); + //xcb_composite_redirect_window(QX11Info::connection(), win, XCB_COMPOSITE_REDIRECT_MANUAL); //XCB_COMPOSITE_REDIRECT_[MANUAL/AUTOMATIC]); + + //Now map the window (will be a transparent child of the container) + xcb_map_window(QX11Info::connection(), win); + xcb_map_window(QX11Info::connection(), container); + //Now create/register the damage handler + // -- XCB (Note: The XCB damage registration is completely broken at the moment - 9/15/15, Ken Moore) + // -- Retested 6/29/17 (no change) Ken Moore + //xcb_damage_damage_t dmgID = xcb_generate_id(QX11Info::connection()); //This is a typedef for a 32-bit unsigned integer + //xcb_damage_create(QX11Info::connection(), dmgID, win, XCB_DAMAGE_REPORT_LEVEL_RAW_RECTANGLES); + // -- XLib (Note: This is only used because the XCB routine above does not work - needs to be fixed upstream in XCB itself). + Damage dmgID = XDamageCreate(QX11Info::display(), win, XDamageReportRawRectangles); + WIN->addDamageID( (uint) dmgID); //save this for later + //qDebug() << " - Done"; + //return ( (uint) dmgID ); +} +/* + xcb_reparent_window(QX11Info::connection(), client, parent, relorigin.x(), relorigin.y()); + + //Now ensure that we still get event for these windows + registerClientEvents(client); //make sure we re-do this after reparenting + registerClientEvents(parent); + xcb_map_window(QX11Info::connection(), parent); +}*/ diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h new file mode 100644 index 00000000..e1614b75 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h @@ -0,0 +1,143 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2017-2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +// This is a Qt5/Lumina wrapper around native graphics system calls +// It is primarily designed around the creation/modification of instances of +// the "NativeWindowObject" class for passing information around +//=========================================== +#ifndef _LUMINA_DESKTOP_NATIVE_WINDOW_SYSTEM_H +#define _LUMINA_DESKTOP_NATIVE_WINDOW_SYSTEM_H + +#include +#include +#include +#include + + +class NativeWindowSystem : public QObject{ + Q_OBJECT +private: + QList NWindows; + QList TWindows; + + //Simplifications to find an already-created window object + NativeWindowObject* findWindow(WId id, bool checkRelated = true); + + NativeWindowObject* findTrayWindow(WId id); + + //Now define a simple private_objects class so that each implementation + // has a storage container for defining/placing private objects as needed + class p_objects; + p_objects* obj; + + //Internal timers/variables for managing pings + QTimer *pingTimer; + QHash waitingForPong; + + void checkPings(){ + QDateTime cur = QDateTime::currentDateTime(); + QList waiting = waitingForPong.keys(); + for(int i=0; istop(); } + NativeWindowObject *win = findWindow(waiting[i]); + if(win==0){ win = findTrayWindow(waiting[i]); } + if(win!=0){ win->emit WindowNotResponding(waiting[i]); } + } + } + } + + // Since some properties may be easier to update in bulk + // let the native system interaction do them in whatever logical groups are best + void UpdateWindowProperties(NativeWindowObject* win, QList< NativeWindowObject::Property > props); + void ChangeWindowProperties(NativeWindowObject* win, QList< NativeWindowObject::Property > props, QList vals); + + //Generic private variables + bool screenLocked; + +public: + //enum Property{ None, CurrentWorkspace, Workspaces, VirtualRoots, WorkAreas }; + enum MouseButton{NoButton, LeftButton, RightButton, MidButton, BackButton, ForwardButton, TaskButton, WheelUp, WheelDown, WheelLeft, WheelRight}; + + NativeWindowSystem(); + ~NativeWindowSystem(); + + //Overarching start/stop functions + bool start(); + void stop(); + + //General-purpose listing functions + QList currentWindows(){ return NWindows; } + QList currentTrayWindows(){ return TWindows; } + + //Small simplification functions + static Qt::Key KeycodeToQt(int keycode); + static NativeWindowSystem::MouseButton MouseToQt(int button); + +public slots: + //These are the slots which are typically only used by the desktop system itself or the NativeWindowEventFilter + + //This is called by the lock screen to keep the NWS aware of the current status + // it is **NOT** the function to call for the user to actually lock the session (that is in the screensaver/lockscreen class) + void ScreenLockChanged(bool lock){ + screenLocked = lock; + } + + //Root Window property registrations + void RegisterVirtualRoot(WId); + void setRoot_supportedActions(); + void setRoot_numberOfWorkspaces(QStringList names); + void setRoot_currentWorkspace(int); + void setRoot_clientList(QList, bool stackorder = false); + void setRoot_desktopGeometry(QRect); + void setRoot_desktopWorkarea(QList); + void setRoot_activeWindow(WId); + + // - Workspaces + int currentWorkspace(); + //void GoToWorkspace(int); + + + //NativeWindowEventFilter interactions + void NewWindowDetected(WId); //will automatically create the new NativeWindow object + void NewTrayWindowDetected(WId); //will automatically create the new NativeWindow object + void WindowCloseDetected(WId); //will update the lists and make changes if needed + void WindowPropertyChanged(WId, NativeWindowObject::Property); //will rescan the window and update the object as needed + void WindowPropertiesChanged(WId, QList); + void WindowPropertyChanged(WId, NativeWindowObject::Property, QVariant); //will save that property/value to the right object + void WindowPropertiesChanged(WId, QList, QList); + void RequestPropertyChange(WId, NativeWindowObject::Property, QVariant); + void RequestPropertiesChange(WId, QList, QList); + void GotPong(WId); + + void NewKeyPress(int keycode, WId win = 0); + void NewKeyRelease(int keycode, WId win = 0); + void NewMousePress(int buttoncode, WId win = 0); + void NewMouseRelease(int buttoncode, WId win = 0); + void CheckDamageID(WId); + +private slots: + //These are the slots which are built-in and automatically connected when a new NativeWindow is created + void RequestClose(WId); + void RequestKill(WId); + void RequestPing(WId); + void RequestReparent(WId, WId, QPoint); //client, parent, relative origin point in parent + +signals: + void NewWindowAvailable(NativeWindowObject*); + void WindowClosed(); + void NewTrayWindowAvailable(NativeWindowObject*); + void TrayWindowClosed(); + void NewInputEvent(); //a mouse or keypress was detected (lock-state independent); + void KeyPressDetected(WId, Qt::Key); //only emitted if lockstate = false + void KeyReleaseDetected(WId, Qt::Key); //only emitted if lockstate = false + void MousePressDetected(WId, NativeWindowSystem::MouseButton); //only emitted if lockstate = false + void MouseReleaseDetected(WId, NativeWindowSystem::MouseButton); //only emitted if lockstate = false + +}; + +#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-events/events.pri b/src-qt5/core/lumina-desktop-unified/src-events/events.pri index 48d500ed..3f89fdf2 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/events.pri +++ b/src-qt5/core/lumina-desktop-unified/src-events/events.pri @@ -1,10 +1,16 @@ -#SOURCES *= $${PWD}/LXcbEventFilter.cpp +# Files +QT *= x11extras +LIBS *= -lc -lxcb -lxcb-ewmh -lxcb-icccm -lxcb-image -lxcb-composite -lxcb-damage -lxcb-util -lxcb-keysyms -lXdamage -#HEADERS *= $${PWD}/LXcbEventFilter.h +SOURCES *= $${PWD}/LShortcutEvents.cpp \ + $${PWD}/NativeEventFilter.cpp \ + $${PWD}/NativeKeyToQt.cpp \ + $${PWD}/NativeWindowSystem.cpp -#Shortcut event files -SOURCES *= $${PWD}/LShortcutEvents.cpp -HEADERS *= $${PWD}/LShortcutEvents.h -#update the includepath so we can just (#include ) as needed without paths +HEADERS *= $${PWD}/LShortcutEvents.h \ + $${PWD}/NativeEventFilter.h \ + $${PWD}/NativeWindowSystem.h + +#update the includepath so we can just (#include ) as needed without paths INCLUDEPATH *= ${PWD} -- cgit From 87bb84506c2a58ff2ebb2babb76e0915c2484110 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Mon, 8 Jan 2018 15:02:30 -0500 Subject: Fix up the wallpaper failover routine. --- .../core/lumina-desktop-unified/src-desktop/DesktopManager.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp index b9ea3078..eefe6d7e 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp @@ -45,7 +45,11 @@ void DesktopManager::updateWallpaper(QString screen_id, int wkspace){ //Now look for a list that matches any screen/workspace if(wpaperList.isEmpty()){ wpaperList= DesktopSettings::instance()->value(DesktopSettings::Desktop, "wallpapers/default", QStringList()).toStringList(); } //Now use the failover wallpaper directory - if(wpaperList.isEmpty()){ wpaperList << LOS::LuminaShare()+"../wallpapers/lumina-nature"; } + if(wpaperList.isEmpty()){ + QString def = LOS::LuminaShare().section("/",0,-3)+"/wallpapers/lumina-nature"; //Note: LuminaShare() ends with an extra "/" + //qDebug() << "Default Wallpaper:" << def; + if(QFile::exists(def)){ wpaperList << def; } + } //Wallpaper selection/randomization if(wpaperList.count()==1 && wpaperList.first()==current){ return; } //nothing to do - just the same image QString wpaper; @@ -65,7 +69,7 @@ void DesktopManager::updateWallpaper(QString screen_id, int wkspace){ } } //Verify that there are files in the list - otherwise use the default - if(bgL.isEmpty()){ wpaper="default"; break; } + if(bgL.isEmpty()){ wpaper.clear(); break; } int index = ( qrand() % bgL.length() ); if(index== bgL.indexOf(current)){ //if the current wallpaper was selected by the randomization again //Go to the next in the list @@ -75,7 +79,7 @@ void DesktopManager::updateWallpaper(QString screen_id, int wkspace){ wpaper = prefix+bgL[index]; } //Now go ahead and set the wallpaper in the screen object - if(wpaper.isEmpty() || wpaper=="default"){ wpaper = LOS::LuminaShare()+"desktop-background.jpg"; } //failover image + if(wpaper.isEmpty() || wpaper=="default"){ wpaper = LOS::LuminaShare()+"/desktop-background.jpg"; } //failover image //qDebug() << "Updating Wallpaper:" << screen_id << wpaper; RootDesktopObject::instance()->ChangeWallpaper(screen_id,QUrl::fromLocalFile(wpaper).toString() ); } -- cgit From a299c5f0ad9fb5e9760100f9f4d03499e70a6a8d Mon Sep 17 00:00:00 2001 From: ZackaryWelch Date: Mon, 8 Jan 2018 15:45:34 -0500 Subject: Changes to NativeWindow frame QML --- .../src-desktop/src-qml/NativeWindow.qml | 287 ++++++++++----------- 1 file changed, 143 insertions(+), 144 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml index 90818ca8..92263689 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml @@ -1,130 +1,130 @@ // vi: ft=qml import QtQuick 2.0 import QtQuick.Window 2.2 -import QtQuick.Controls 1.4 +import QtQuick.Controls 1.4 import QtQuick.Layouts 1.3 import Lumina.Backend.NativeWindowObject 2.0 - Rectangle { - property NativeWindowObject object - property string window_id - - id: windowFrame - border.width: 5 - border.color: palette.window - color: palette.window - x: object.frameGeometry.x - y: object.frameGeometry.y - width: object.frameGeometry.width - height: object.frameGeometry.height - - MouseArea { - id: resizeArea - anchors.fill: parent - property int positionX: 0 - property int positionY: 0 - property int newWidth: 0 - property int newHeight: 0 - - onPositionChanged: { - var globalP = windowFrame.mapToItem(background, mouse.x, mouse.y) - if(positionY < windowFrame.y + 15 ) { - /*if(positionX < windowFrame.x + 15) { - console.log("Top Left"); - //Top Left - newWidth = windowFrame.width + (windowFrame.x - mouse.x) - newHeight = windowFrame.height + (windowFrame.y - mouse.y) - windowFrame.x = mouse.x - windowFrame.y = mouse.y - }else if(positionX > windowFrame.x + windowFrame.width - 15) { - console.log("Top Right"); - //Top Right - newX = positionX - mouse.x - newY = positionY - mouse.y - newWidth = windowFrame.width - (positionX - mouse.x) - newHeight = windowFrame.height + (windowFrame.y - mouse.y) - windowFrame.y = mouse.y - }else{*/ - //Top - console.log("oldHeight: ", windowFrame.height); - windowFrame.height -= 1 - console.log("newHeight: ", windowFrame.height); - windowFrame.y = globalP.y - // } - } -/*else if(mouse.x < windowFrame.x + 15) { - if(mouse.y > windowFrame.y + windowFrame.height - 15) { - //Bottom Left - newX = positionX - mouse.x - newWidth = windowFrame.width - newX - newHeight = windowFrame.height - newY - }else{ - //Left - } - }else if(mouse.y > windowFrame.y + windowFrame.height - 15) { - if(mouse.x > windowFrame.x + windowFrame.width - 15) { - //Bottom Right - }else{ - //Bottom - } - }else if(mouse.x > windowFrame.x + windowFrame.width - 15) { - //Right - } else { - console.log("Cursor error"); - }*/ +Rectangle { + property NativeWindowObject object + property string window_id + + SystemPalette { id:palette } + + id: windowFrame + border.width: 5 + //border.color: palette.window + color: palette.window + x: object.frameGeometry.x + y: object.frameGeometry.y + width: object.frameGeometry.width + height: object.frameGeometry.height + + MouseArea { + id: resizeArea + anchors.fill: parent + property int positionX: 0 + property int positionY: 0 + property int newWidth: 0 + property int newHeight: 0 + + onPositionChanged: { + var globalP = windowFrame.mapToGlobal(mouse.x, mouse.y) + if(positionY < windowFrame.y + 15 ) { + /*if(positionX < windowFrame.x + 15) { + console.log("Top Left"); + //Top Left + newWidth = windowFrame.width + (windowFrame.x - mouse.x) + newHeight = windowFrame.height + (windowFrame.y - mouse.y) + windowFrame.x = mouse.x + windowFrame.y = mouse.y + }else if(positionX > windowFrame.x + windowFrame.width - 15) { + console.log("Top Right"); + //Top Right + newX = positionX - mouse.x + newY = positionY - mouse.y + newWidth = windowFrame.width - (positionX - mouse.x) + newHeight = windowFrame.height + (windowFrame.y - mouse.y) + windowFrame.y = mouse.y + }else{*/ + //Top + windowFrame.height -= 1 + windowFrame.y = globalP.y + // } } +/*else if(mouse.x < windowFrame.x + 15) { + if(mouse.y > windowFrame.y + windowFrame.height - 15) { + //Bottom Left + newX = positionX - mouse.x + newWidth = windowFrame.width - newX + newHeight = windowFrame.height - newY + }else{ + //Left + } + }else if(mouse.y > windowFrame.y + windowFrame.height - 15) { + if(mouse.x > windowFrame.x + windowFrame.width - 15) { + //Bottom Right + }else{ + //Bottom + } + }else if(mouse.x > windowFrame.x + windowFrame.width - 15) { + //Right + } else { + console.log("Cursor error"); + }*/ } + } - MouseArea { - id: dragArea - anchors.fill: titleBar - drag.target: windowFrame - drag.axis: Drag.XAndYAxis - onClicked: { console.log("dragArea"); } - //released: { function(); } - } - - states: [ - State { - when: resizeArea.drag.held - PropertyChanges { target: canvas; color:"red" } - }, - State { - when: dragArea.drag.held - AnchorChanges { target: windowFrame; anchors.verticalCenter: undefined; anchors.horizontalCenter: undefined } - } + MouseArea { + id: dragArea + anchors.fill: titleBar + drag.target: windowFrame + drag.axis: Drag.XAndYAxis + onClicked: { console.log("dragArea"); } + //released: { function(); } + } - ] + states: [ + State { + when: resizeArea.drag.held + PropertyChanges { target: Window; color:"red" } + }, + State { + when: dragArea.drag.held + AnchorChanges { target: windowFrame; anchors.verticalCenter: undefined; anchors.horizontalCenter: undefined } + } + ] - Rectangle { - id: titleBar - border.width: 2 - color: palette.window - height: 25 - anchors.top: windowFrame.top - anchors.right: windowFrame.right - anchors.left: windowFrame.left - anchors.margins: windowFrame.border.width - width: parent.width - RowLayout { - anchors.fill: titleBar - spacing: 0 + Rectangle { + id: titleBar + border.width: 2 + color: palette.window + height: 25 + anchors.top: windowFrame.top + anchors.right: windowFrame.right + anchors.left: windowFrame.left + anchors.margins: windowFrame.border.width + width: parent.width + + RowLayout { + anchors.fill: titleBar + spacing: 0 Button { - id: otherButton + id: otherButton anchors.left: parent.left - Layout.fillHeight: true + Layout.fillHeight: true iconSource: windowFrame.object.icon - } + Text { - Layout.fillWidth: true - Layout.fillHeight: true - Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter - anchors.horizontalCenter: parent.horizontalCenter + Layout.fillWidth: true + Layout.fillHeight: true + Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter + anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter color: palette.windowText text: windowFrame.object.shortTitle @@ -136,49 +136,48 @@ import Lumina.Backend.NativeWindowObject 2.0 } } - Button { - id: minButton - Layout.fillHeight: true - iconName: "window-minimize" - onClicked: { windowFrame.object.toggleVisibility() } - } - - Button { - id: maxButton - Layout.fillHeight: true - iconName: "window-maximize" - //onClicked: { windowFrame.object.toggleMaximize() } - } + Button { + id: minButton + Layout.fillHeight: true + iconName: "window-minimize" + onClicked: { windowFrame.object.toggleVisibility() } + } - Button { - id: closeButton - Layout.fillHeight: true - iconName: "document-close" - onClicked: { windowFrame.object.requestClose() } - } + Button { + id: maxButton + Layout.fillHeight: true + iconName: "window-maximize" + //onClicked: { windowFrame.object.toggleMaximize() } + } + Button { + id: closeButton + Layout.fillHeight: true + iconName: "document-close" + onClicked: { windowFrame.object.requestClose() } } } + } - Image { - id: frameContents - source: windowFrame.object.winImage - anchors.top: titleBar.bottom - anchors.bottom: parent.bottom - anchors.left: windowFrame.left - anchors.right: windowFrame.right - anchors.leftMargin: windowFrame.border.width - anchors.rightMargin: windowFrame.border.width - anchors.bottomMargin: windowFrame.border.width - width: parent.width + Image { + id: frameContents + source: windowFrame.object.winImage + anchors.top: titleBar.bottom + anchors.bottom: parent.bottom + anchors.left: windowFrame.left + anchors.right: windowFrame.right + anchors.leftMargin: windowFrame.border.width + anchors.rightMargin: windowFrame.border.width + anchors.bottomMargin: windowFrame.border.width + width: parent.width + height: parent.height + + MouseArea { + width: parent.width; height: parent.height + anchors.fill: frameContents + onClicked: { console.log(parent.mapToGlobal(mouse.x, mouse.y)); } - MouseArea { - width: parent.width; - height: parent.height - anchors.fill: frameContents - onClicked: { console.log(parent.mapToGlobal(mouse.x, mouse.y)); } - - } } } +} -- cgit From 51ec6aec3200cee6ee28e273b587ac55dbf594a6 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Mon, 8 Jan 2018 15:45:43 -0500 Subject: Some more work on the NativeWindowSystem. Merging in the embed/compositing stuff from the old NativeEmbedWidget class, trying to get the window images detected/rendering. --- .../src-events/NativeWindowSystem.cpp | 60 ++++++++++++++++++++++ .../src-events/NativeWindowSystem.h | 3 ++ 2 files changed, 63 insertions(+) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp index 4b56f2a9..b384fa43 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp @@ -10,6 +10,7 @@ #include "NativeWindowSystem.h" #include +#define DISABLE_COMPOSITING 0 //XCB Library includes #include @@ -599,6 +600,63 @@ void NativeWindowSystem::ChangeWindowProperties(NativeWindowObject* win, QList< } +void NativeWindowSystem::SetupNewWindow(NativeWindowObject *win){ + if(!DISABLE_COMPOSITING){ + xcb_composite_redirect_window(QX11Info::connection(), win->id(), XCB_COMPOSITE_REDIRECT_MANUAL); //XCB_COMPOSITE_REDIRECT_[MANUAL/AUTOMATIC]); + xcb_composite_redirect_subwindows(QX11Info::connection(), win->id(), XCB_COMPOSITE_REDIRECT_MANUAL); //AUTOMATIC); //XCB_COMPOSITE_REDIRECT_[MANUAL/AUTOMATIC]); + + //Now create/register the damage handler + // -- XCB (Note: The XCB damage registration is completely broken at the moment - 9/15/15, Ken Moore) + // -- Retested 6/29/17 (no change) Ken Moore + //xcb_damage_damage_t dmgID = xcb_generate_id(QX11Info::connection()); //This is a typedef for a 32-bit unsigned integer + //xcb_damage_create(QX11Info::connection(), dmgID, win->id(), XCB_DAMAGE_REPORT_LEVEL_RAW_RECTANGLES); + // -- XLib (Note: This is only used because the XCB routine above does not work - needs to be fixed upstream in XCB itself). + Damage dmgID = XDamageCreate(QX11Info::display(), win->id(), XDamageReportRawRectangles); + + win->addDamageID( (uint) dmgID); //save this for later + }else{ + //xcb_reparent_window(QX11Info::connection(), win->id(), this->winId(), 0, 0); + //Also use a partial-composite here - make sure the window pixmap is available even when the window is obscured + xcb_composite_redirect_window(QX11Info::connection(), win->id(), XCB_COMPOSITE_REDIRECT_AUTOMATIC); + //xcb_composite_redirect_subwindows(QX11Info::connection(), win->id(), XCB_COMPOSITE_REDIRECT_MANUAL); + //Also alert us when the window visual changes + Damage dmgID = XDamageCreate(QX11Info::display(), win->id(), XDamageReportRawRectangles); + + win->addDamageID( (uint) dmgID); //save this for later + } + //win->addFrameWinID(this->winId()); + registerClientEvents(win->id()); +} + +void NativeWindowSystem::UpdateWindowImage(NativeWindowObject* win){ + QImage img; + qDebug() << "Update Window Image:" << win->name(); + QRect geom(QPoint(0,0), win->property(NativeWindowObject::Size).toSize()); + if(DISABLE_COMPOSITING){ + QList screens = static_cast( QApplication::instance() )->screens(); + if(!screens.isEmpty()){ + img = screens[0]->grabWindow(win->id(), geom.x(), geom.y(), geom.width(), geom.height()).toImage(); + } + }else{ + //Pull the XCB pixmap out of the compositing layer + xcb_pixmap_t pix = xcb_generate_id(QX11Info::connection()); + xcb_composite_name_window_pixmap(QX11Info::connection(), win->id(), pix); + if(pix==0){ qDebug() << "Got blank pixmap!"; return; } + + //Convert this pixmap into a QImage + //xcb_image_t *ximg = xcb_image_get(QX11Info::connection(), pix, 0, 0, this->width(), this->height(), ~0, XCB_IMAGE_FORMAT_Z_PIXMAP); + xcb_image_t *ximg = xcb_image_get(QX11Info::connection(), pix, geom.x(), geom.y(), geom.width(), geom.height(), ~0, XCB_IMAGE_FORMAT_Z_PIXMAP); + if(ximg == 0){ qDebug() << "Got blank image!"; return; } + QImage tmp(ximg->data, ximg->width, ximg->height, ximg->stride, QImage::Format_ARGB32_Premultiplied); + img = tmp.copy(); //detach this image from the XCB data structures before we clean them up, otherwise the QImage will try to clean it up a second time on window close and crash + xcb_image_destroy(ximg); + + //Cleanup the XCB data structures + xcb_free_pixmap(QX11Info::connection(), pix); + } + win->setProperty(NativeWindowObject::WinImage, QVariant::fromValue(img) ); +} + // === PUBLIC SLOTS === //These are the slots which are typically only used by the desktop system itself or the NativeEventFilter void NativeWindowSystem::RegisterVirtualRoot(WId id){ @@ -726,6 +784,7 @@ void NativeWindowSystem::NewWindowDetected(WId id){ NWindows << win; UpdateWindowProperties(win, NativeWindowObject::allProperties()); qDebug() << "New Window [& associated ID's]:" << win->id() << win->property(NativeWindowObject::Name).toString(); + SetupNewWindow(win); //Now setup the connections with this window connect(win, SIGNAL(RequestClose(WId)), this, SLOT(RequestClose(WId)) ); connect(win, SIGNAL(RequestKill(WId)), this, SLOT(RequestKill(WId)) ); @@ -883,6 +942,7 @@ void NativeWindowSystem::NewMouseRelease(int buttoncode, WId win){ void NativeWindowSystem::CheckDamageID(WId win){ for(int i=0; idamageId() == win || NWindows[i]->id() == win || NWindows[i]->frameId()==win){ + UpdateWindowImage(NWindows[i]); NWindows[i]->emit VisualChanged(); //qDebug() << "Got DAMAGE Event"; return; diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h index e1614b75..c50babff 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h @@ -56,6 +56,9 @@ private: void UpdateWindowProperties(NativeWindowObject* win, QList< NativeWindowObject::Property > props); void ChangeWindowProperties(NativeWindowObject* win, QList< NativeWindowObject::Property > props, QList vals); + void SetupNewWindow(NativeWindowObject *win); + void UpdateWindowImage(NativeWindowObject *win); + //Generic private variables bool screenLocked; -- cgit From 9d762d405e158910671a3bed8e5bf0ff00862609 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Mon, 8 Jan 2018 16:08:32 -0500 Subject: Get the window appearing now (compositing disabled at the moment) --- .../src-events/NativeWindowSystem.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp index b384fa43..30a6a47d 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp @@ -10,7 +10,7 @@ #include "NativeWindowSystem.h" #include -#define DISABLE_COMPOSITING 0 +#define DISABLE_COMPOSITING 1 //XCB Library includes #include @@ -556,12 +556,12 @@ void NativeWindowSystem::ChangeWindowProperties(NativeWindowObject* win, QList< } if(props.contains(NativeWindowObject::Visible)){ - //qDebug() << "Check Window Visibility:" << vals[ props.indexOf(NativeWindowObject::Visible) ]; + qDebug() << "Check Window Visibility:" << vals[ props.indexOf(NativeWindowObject::Visible) ]; if( vals[ props.indexOf(NativeWindowObject::Visible) ].toBool() ){ - //qDebug() << " - Map it!"; + qDebug() << " - Map it!"; xcb_map_window(QX11Info::connection(), win->id()); }else{ - //qDebug() << " - Unmap it!"; + qDebug() << " - Unmap it!"; xcb_unmap_window(QX11Info::connection(), win->id()); } } @@ -783,6 +783,7 @@ void NativeWindowSystem::NewWindowDetected(WId id){ registerClientEvents(win->id()); NWindows << win; UpdateWindowProperties(win, NativeWindowObject::allProperties()); + win->setProperty(NativeWindowObject::FrameExtents, QVariant::fromValue >( QList() << 5 << 5 << 30 << 5 )); qDebug() << "New Window [& associated ID's]:" << win->id() << win->property(NativeWindowObject::Name).toString(); SetupNewWindow(win); //Now setup the connections with this window @@ -791,6 +792,7 @@ void NativeWindowSystem::NewWindowDetected(WId id){ connect(win, SIGNAL(RequestPing(WId)), this, SLOT(RequestPing(WId)) ); connect(win, SIGNAL(RequestReparent(WId, WId, QPoint)), this, SLOT(RequestReparent(WId, WId, QPoint)) ); connect(win, SIGNAL(RequestPropertiesChange(WId, QList, QList)), this, SLOT(RequestPropertiesChange(WId, QList, QList)) ); + xcb_map_window(QX11Info::connection(), win->id()); emit NewWindowAvailable(win); } @@ -940,11 +942,12 @@ void NativeWindowSystem::NewMouseRelease(int buttoncode, WId win){ } void NativeWindowSystem::CheckDamageID(WId win){ + qDebug() << "Got Damage Event:" << win; for(int i=0; idamageId() == win || NWindows[i]->id() == win || NWindows[i]->frameId()==win){ + qDebug() << " - Found window"; UpdateWindowImage(NWindows[i]); NWindows[i]->emit VisualChanged(); - //qDebug() << "Got DAMAGE Event"; return; } } -- cgit From 767299a7f0da138ab1a097b05de6d9afe2827cf7 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Tue, 9 Jan 2018 11:36:46 -0500 Subject: Get the QML reading the raw QImage data using the HTML data format (base64). This results in a usable image, but it flickers quite badly when the image changes. Might need to look into a QImageProvider that allows QML to read/use the raw image data rather than base64 as the transport medium. --- .../src-desktop/src-cpp/NativeWindowObject.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp index dcfd23b0..e9049cdd 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp @@ -67,8 +67,9 @@ void NativeWindowObject::setProperty(NativeWindowObject::Property prop, QVariant QBuffer buffer(&ba); buffer.open(QIODevice::WriteOnly); val.value().save(&buffer, "PNG"); - QString img("data:image/png:base64,"); + QString img("data:image/png;base64,"); img.append(QString::fromLatin1(ba.toBase64().data())); + qDebug() << "Image Data Header:" << img.section(",",0,0); hash.insert(prop, img); //save the string instead } else{ hash.insert(prop, val); } @@ -87,8 +88,9 @@ void NativeWindowObject::setProperties(QList props QBuffer buffer(&ba); buffer.open(QIODevice::WriteOnly); vals[i].value().save(&buffer, "PNG"); - QString img("data:image/png:base64,"); + QString img("data:image/png;base64,"); img.append(QString::fromLatin1(ba.toBase64().data())); + qDebug() << "Image Data Header:" << img.section(",",0,0); hash.insert(props[i], img); //save the string instead }else{ hash.insert(props[i], vals[i]); -- cgit From 6f7d5cab5c01aa7ef9011a0a947511362cc1de13 Mon Sep 17 00:00:00 2001 From: ZackaryWelch Date: Tue, 9 Jan 2018 15:43:24 -0500 Subject: Completed resizing on the QML Window Frame, cosmetic improvements, and setting a minimum width/height --- .../core/lumina-desktop-unified/lumina-desktop.pro | 2 +- .../src-desktop/src-cpp/NativeWindowObject.h | 2 + .../src-desktop/src-qml/NativeWindow.qml | 200 +++++++++++---------- 3 files changed, 108 insertions(+), 96 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro b/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro index 07781770..f28b96c2 100644 --- a/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro +++ b/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro @@ -10,7 +10,7 @@ lessThan(QT_MINOR_VERSION, 7){ } QT *= core gui network widgets x11extras multimedia multimediawidgets concurrent svg quick qml - +CONFIG += c++11 TARGET = lumina-desktop-unified target.path = $${L_BINDIR} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h index e4f9d41e..fc4a7101 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h @@ -38,6 +38,8 @@ public: enum State{ S_MODAL, S_STICKY, S_MAX_VERT, S_MAX_HORZ, S_SHADED, S_SKIP_TASKBAR, S_SKIP_PAGER, S_HIDDEN, S_FULLSCREEN, S_ABOVE, S_BELOW, S_ATTENTION }; enum Type{T_DESKTOP, T_DOCK, T_TOOLBAR, T_MENU, T_UTILITY, T_SPLASH, T_DIALOG, T_DROPDOWN_MENU, T_POPUP_MENU, T_TOOLTIP, T_NOTIFICATION, T_COMBO, T_DND, T_NORMAL }; enum Action {A_MOVE, A_RESIZE, A_MINIMIZE, A_SHADE, A_STICK, A_MAX_VERT, A_MAX_HORZ, A_FULLSCREEN, A_CHANGE_DESKTOP, A_CLOSE, A_ABOVE, A_BELOW}; + enum Location { TOP_LEFT, TOP, TOP_RIGHT, RIGHT, BOTTOM_RIGHT, BOTTOM, BOTTOM_LEFT, LEFT }; + Q_ENUM(Location) enum Property{ /*QVariant Type*/ None=0, /*null*/ diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml index 92263689..36853cc5 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml @@ -5,6 +5,7 @@ import QtQuick.Controls 1.4 import QtQuick.Layouts 1.3 import Lumina.Backend.NativeWindowObject 2.0 +import Lumina.Backend.RootDesktopObject 2.0 Rectangle { property NativeWindowObject object @@ -24,80 +25,93 @@ Rectangle { MouseArea { id: resizeArea anchors.fill: parent - property int positionX: 0 - property int positionY: 0 - property int newWidth: 0 - property int newHeight: 0 + drag.target: undefined + property int resizeDirection: NativeWindowObject.TOP_LEFT + property int positionX: -1 + property int positionY: -1 + + onPressed: { + var globalP = windowFrame.mapToItem(rootCanvas, mouse.x, mouse.y) + positionX = globalP.x + positionY = globalP.y + if(positionY <= windowFrame.y + 10 ) { + if(positionX <= windowFrame.x + 10) + resizeDirection = NativeWindowObject.TOP_LEFT + else if(positionX >= windowFrame.x + windowFrame.width - 10) + resizeDirection = NativeWindowObject.TOP_RIGHT + else + resizeDirection = NativeWindowObject.TOP + }else if(positionY >= windowFrame.y + windowFrame.height - 10) { + if(positionX <= windowFrame.x + 10) + resizeDirection = NativeWindowObject.BOTTOM_LEFT + else if(positionX >= windowFrame.x + windowFrame.width - 10) + resizeDirection = NativeWindowObject.BOTTOM_RIGHT + else + resizeDirection = NativeWindowObject.BOTTOM + }else if(positionX <= windowFrame.x + 10) { + resizeDirection = NativeWindowObject.LEFT + }else if(positionX >= windowFrame.x + windowFrame.width - 10) { + resizeDirection = NativeWindowObject.RIGHT + } + //console.log("Initial X: ", positionX, "Initial Y: ", positionY); + //console.log("Initial X Frame: ", windowFrame.x, "Initial Y Frame: ", windowFrame.y); + } + + onReleased: { + positionX = -1 + positionY = -1 + } onPositionChanged: { - var globalP = windowFrame.mapToGlobal(mouse.x, mouse.y) - if(positionY < windowFrame.y + 15 ) { - /*if(positionX < windowFrame.x + 15) { - console.log("Top Left"); - //Top Left - newWidth = windowFrame.width + (windowFrame.x - mouse.x) - newHeight = windowFrame.height + (windowFrame.y - mouse.y) - windowFrame.x = mouse.x - windowFrame.y = mouse.y - }else if(positionX > windowFrame.x + windowFrame.width - 15) { - console.log("Top Right"); - //Top Right - newX = positionX - mouse.x - newY = positionY - mouse.y - newWidth = windowFrame.width - (positionX - mouse.x) - newHeight = windowFrame.height + (windowFrame.y - mouse.y) - windowFrame.y = mouse.y - }else{*/ - //Top - windowFrame.height -= 1 + if(positionX != -1 && positionY != -1) { + var globalP = windowFrame.mapToItem(rootCanvas, mouse.x, mouse.y) + /*console.log("Global P: ", globalP); + console.log("Position X: ", positionX, "Position Y: ", positionY) + console.log("Old Position : ", windowFrame.x, " , ", windowFrame.y) + console.log(resizeDirection);*/ + if(resizeDirection == NativeWindowObject.TOP_LEFT) { + windowFrame.height -= globalP.y - positionY + windowFrame.width -= globalP.x - positionX windowFrame.y = globalP.y - // } - } -/*else if(mouse.x < windowFrame.x + 15) { - if(mouse.y > windowFrame.y + windowFrame.height - 15) { - //Bottom Left - newX = positionX - mouse.x - newWidth = windowFrame.width - newX - newHeight = windowFrame.height - newY - }else{ - //Left + windowFrame.x = globalP.x + }else if(resizeDirection == NativeWindowObject.TOP_RIGHT) { + //console.log("TOP RIGHT Old Height: ", windowFrame.height, "Old Width: ", windowFrame.width) + windowFrame.height -= globalP.y - positionY + windowFrame.width += globalP.x - positionX + //console.log("New Height: ", windowFrame.height, "New Width: ", windowFrame.width) + windowFrame.y = globalP.y + //console.log("New Position : ", windowFrame.x, " , ", windowFrame.y) + }else if(resizeDirection == NativeWindowObject.TOP) { + windowFrame.height -= globalP.y - positionY + windowFrame.y = globalP.y + } else if(resizeDirection == NativeWindowObject.RIGHT) { + windowFrame.width += globalP.x - positionX + } else if(resizeDirection == NativeWindowObject.BOTTOM_RIGHT) { + windowFrame.height += globalP.y - positionY + windowFrame.width += globalP.x - positionX + } else if(resizeDirection == NativeWindowObject.BOTTOM) { + windowFrame.height += globalP.y - positionY + } else if(resizeDirection == NativeWindowObject.BOTTOM_LEFT) { + windowFrame.width -= globalP.x - positionX + windowFrame.height += globalP.y - positionY + windowFrame.x = globalP.x + } else if(resizeDirection == NativeWindowObject.LEFT) { + windowFrame.width -= globalP.x - positionX + windowFrame.x = globalP.x } - }else if(mouse.y > windowFrame.y + windowFrame.height - 15) { - if(mouse.x > windowFrame.x + windowFrame.width - 15) { - //Bottom Right - }else{ - //Bottom + //Set a miniumum width and height as 80x50 + if(windowFrame.width < 80) { + windowFrame.width = 80 } - }else if(mouse.x > windowFrame.x + windowFrame.width - 15) { - //Right - } else { - console.log("Cursor error"); - }*/ + if(windowFrame.height < 50) { + windowFrame.height = 50 + } + positionY = globalP.y + positionX = globalP.x + } } } - MouseArea { - id: dragArea - anchors.fill: titleBar - drag.target: windowFrame - drag.axis: Drag.XAndYAxis - onClicked: { console.log("dragArea"); } - //released: { function(); } - } - - states: [ - State { - when: resizeArea.drag.held - PropertyChanges { target: Window; color:"red" } - }, - State { - when: dragArea.drag.held - AnchorChanges { target: windowFrame; anchors.verticalCenter: undefined; anchors.horizontalCenter: undefined } - } - - ] - - Rectangle { id: titleBar border.width: 2 @@ -109,50 +123,47 @@ Rectangle { anchors.margins: windowFrame.border.width width: parent.width - RowLayout { - anchors.fill: titleBar - spacing: 0 + MouseArea { + id: dragArea + anchors.fill: parent + drag.target: windowFrame + drag.axis: Drag.XAndYAxis + //acceptedButtons: Qt.RightButton + //onClicked: contextMenu.open() + //released: { function(); } + } - Button { - id: otherButton - anchors.left: parent.left - Layout.fillHeight: true - iconSource: windowFrame.object.icon - } + Button { + id: otherButton + anchors.left: parent.left + iconSource: windowFrame.object.icon + } - Text { - Layout.fillWidth: true - Layout.fillHeight: true - Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: parent.verticalCenter - color: palette.windowText - text: windowFrame.object.shortTitle - - MouseArea { - acceptedButtons: Qt.RightButton - anchors.fill: parent - //onClicked: contextMenu.open() - } - } + Text { + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + color: palette.windowText + text: windowFrame.object.shortTitle + fontSizeMode: Text.Fit + } + RowLayout { + spacing: 0 + anchors.right: parent.right Button { id: minButton - Layout.fillHeight: true iconName: "window-minimize" onClicked: { windowFrame.object.toggleVisibility() } } Button { id: maxButton - Layout.fillHeight: true iconName: "window-maximize" //onClicked: { windowFrame.object.toggleMaximize() } } Button { id: closeButton - Layout.fillHeight: true iconName: "document-close" onClicked: { windowFrame.object.requestClose() } } @@ -173,11 +184,10 @@ Rectangle { height: parent.height MouseArea { - width: parent.width; + width: parent.width height: parent.height anchors.fill: frameContents onClicked: { console.log(parent.mapToGlobal(mouse.x, mouse.y)); } - } } } -- cgit From 27f1a7177b54f6ec4177ddb11804025740b745a7 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Wed, 10 Jan 2018 23:50:06 -0500 Subject: Get the window compositing/painting routine finished up with a seamless image provider system. --- .../src-desktop/QMLImageProvider.cpp | 46 ++++++++++++++++++++++ .../src-desktop/QMLImageProvider.h | 26 ++++++++++++ .../src-desktop/RootWindow.cpp | 2 + .../lumina-desktop-unified/src-desktop/desktop.pri | 6 ++- .../src-desktop/src-cpp/NativeWindowObject.cpp | 7 +++- .../src-desktop/src-cpp/NativeWindowObject.h | 3 +- .../src-desktop/src-qml/NativeWindow.qml | 1 + .../src-events/NativeWindowSystem.cpp | 19 ++++----- .../src-events/NativeWindowSystem.h | 25 ++++++------ 9 files changed, 107 insertions(+), 28 deletions(-) create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.cpp create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.h (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.cpp new file mode 100644 index 00000000..0899337c --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.cpp @@ -0,0 +1,46 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include +#include "QMLImageProvider.h" + +QMLImageProvider::QMLImageProvider() : QQuickImageProvider(QQmlImageProviderBase::Image, 0){ + +} + +QMLImageProvider::~QMLImageProvider(){ + +} + +/*QMLImageProvider* QMLImageProvider::instance(){ + static QMLImageProvider *_prov = 0; + if(_prov==0){ _prov = new QMLImageProvider(); } + return _prov; +}*/ + +QImage QMLImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize){ + NativeWindowObject *win = Lumina::NWS->findWindow( id.section(":",1,1).toInt(), false); + qDebug() << "Request Image:" << id << win << requestedSize; + QImage img(requestedSize,QImage::Format_RGB32); + if(win==0){ img.fill("black"); } //invalid window ID (should never happen) + else if(id.startsWith("image:")){ img = Lumina::NWS->GetWindowImage(win); } + //else if(id.startsWith("icon:")){ img = Lumina::NWS->GetWindowIcon(win); } + qDebug() << "Got Window Image:" << img.size(); + if(img.size().isNull()){ + if(requestedSize.isValid()){ img = QImage(requestedSize,QImage::Format_RGB32); } + else{ img = QImage(QSize(64,64), QImage::Format_RGB32); } + img.fill("black"); + } + qDebug() << "Final Window Image:" << img.size(); + if(size!=0){ + size->setHeight(img.height()); + size->setWidth( img.width() ); + } + if(requestedSize.isValid() && !requestedSize.isNull() && img.size()!=requestedSize){ + img = img.scaled(requestedSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + } + return img; +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.h b/src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.h new file mode 100644 index 00000000..d0ab74ff --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.h @@ -0,0 +1,26 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_DESKTOP_QML_IMAGE_PROVIDER_H +#define _LUMINA_DESKTOP_QML_IMAGE_PROVIDER_H + +#include +#include +#include +#include + +class QMLImageProvider : public QQuickImageProvider{ +public: + QMLImageProvider(); + ~QMLImageProvider(); + + //static QMLImageProvider* instance(); + + virtual QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize); + +}; + +#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp index 0cfa4e6b..5a9b8e09 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp @@ -5,6 +5,7 @@ // See the LICENSE file for full details //=========================================== #include "RootWindow.h" +#include "QMLImageProvider.h" RootWindow::RootWindow() : QObject(){ root_win = QWindow::fromWinId( QX11Info::appRootWindow() ); // @@ -16,6 +17,7 @@ RootWindow::RootWindow() : QObject(){ //Now setup the QQuickView root_view->setResizeMode(QQuickView::SizeRootObjectToView); root_view->engine()->rootContext()->setContextProperty("RootObject", root_obj); + root_view->engine()->addImageProvider("native_window", new QMLImageProvider() ); RootDesktopObject::RegisterType(); //make sure object classes are registered with the QML subsystems } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/desktop.pri b/src-qt5/core/lumina-desktop-unified/src-desktop/desktop.pri index f4a6882d..ee5ada62 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/desktop.pri +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/desktop.pri @@ -1,10 +1,12 @@ QT *= gui widgets qml quick SOURCES *= $${PWD}/RootWindow.cpp \ - $${PWD}/Desktopmanager.cpp + $${PWD}/Desktopmanager.cpp \ + $${PWD}/QMLImageProvider.cpp HEADERS *= $${PWD}/RootWindow.h \ - $${PWD}/DesktopManager.h + $${PWD}/DesktopManager.h \ + $${PWD}/QMLImageProvider.h #update the includepath so we can just #include as needed without paths INCLUDEPATH *= $${PWD} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp index e9049cdd..8ea00cc1 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp @@ -21,7 +21,7 @@ void NativeWindowObject::RegisterType(){ NativeWindowObject::NativeWindowObject(WId id) : QObject(){ winid = id; frameid = 0; - dmgID = 0; + dmgID = dmg = 0; } NativeWindowObject::~NativeWindowObject(){ @@ -143,7 +143,10 @@ QRect NativeWindowObject::geometry(){ // QML ACCESS FUNCTIONS (shortcuts for particular properties in a format QML can use) QString NativeWindowObject::winImage(){ - return this->property(NativeWindowObject::WinImage).toString(); + //Need to alternate something on the end to ensure that QML knows to fetch the new image (non-cached only) + if(dmg==0){ dmg = 1; } + else{ dmg = 0; } + return "image://native_window/image:"+QString::number(winid)+":"+QString::number(dmg); } QString NativeWindowObject::name(){ diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h index fc4a7101..0030d27c 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h @@ -125,7 +125,7 @@ private: //QWindow *WIN; WId winid, frameid; QList relatedTo; - unsigned int dmgID; + unsigned int dmgID, dmg; void emitSinglePropChanged(NativeWindowObject::Property); @@ -135,7 +135,6 @@ signals: void RequestPropertiesChange(WId, QList, QList); void WindowClosed(WId); void WindowNotResponding(WId); //will be sent out if a window does not respond to a ping request - void VisualChanged(); //Action Requests (not automatically emitted - typically used to ask the WM to do something) //Note: "WId" should be the NativeWindowObject id() diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml index 36853cc5..74c3f025 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml @@ -172,6 +172,7 @@ Rectangle { Image { id: frameContents + cache: false source: windowFrame.object.winImage anchors.top: titleBar.bottom anchors.bottom: parent.bottom diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp index 30a6a47d..15c79099 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp @@ -10,7 +10,7 @@ #include "NativeWindowSystem.h" #include -#define DISABLE_COMPOSITING 1 +#define DISABLE_COMPOSITING 0 //XCB Library includes #include @@ -628,7 +628,7 @@ void NativeWindowSystem::SetupNewWindow(NativeWindowObject *win){ registerClientEvents(win->id()); } -void NativeWindowSystem::UpdateWindowImage(NativeWindowObject* win){ +QImage NativeWindowSystem::GetWindowImage(NativeWindowObject* win){ QImage img; qDebug() << "Update Window Image:" << win->name(); QRect geom(QPoint(0,0), win->property(NativeWindowObject::Size).toSize()); @@ -641,12 +641,12 @@ void NativeWindowSystem::UpdateWindowImage(NativeWindowObject* win){ //Pull the XCB pixmap out of the compositing layer xcb_pixmap_t pix = xcb_generate_id(QX11Info::connection()); xcb_composite_name_window_pixmap(QX11Info::connection(), win->id(), pix); - if(pix==0){ qDebug() << "Got blank pixmap!"; return; } + if(pix==0){ qDebug() << "Got blank pixmap!"; return QImage(); } //Convert this pixmap into a QImage //xcb_image_t *ximg = xcb_image_get(QX11Info::connection(), pix, 0, 0, this->width(), this->height(), ~0, XCB_IMAGE_FORMAT_Z_PIXMAP); xcb_image_t *ximg = xcb_image_get(QX11Info::connection(), pix, geom.x(), geom.y(), geom.width(), geom.height(), ~0, XCB_IMAGE_FORMAT_Z_PIXMAP); - if(ximg == 0){ qDebug() << "Got blank image!"; return; } + if(ximg == 0){ qDebug() << "Got blank image!"; return QImage(); } QImage tmp(ximg->data, ximg->width, ximg->height, ximg->stride, QImage::Format_ARGB32_Premultiplied); img = tmp.copy(); //detach this image from the XCB data structures before we clean them up, otherwise the QImage will try to clean it up a second time on window close and crash xcb_image_destroy(ximg); @@ -654,7 +654,8 @@ void NativeWindowSystem::UpdateWindowImage(NativeWindowObject* win){ //Cleanup the XCB data structures xcb_free_pixmap(QX11Info::connection(), pix); } - win->setProperty(NativeWindowObject::WinImage, QVariant::fromValue(img) ); + return img; + //win->setProperty(NativeWindowObject::WinImage, QVariant::fromValue(img) ); } // === PUBLIC SLOTS === @@ -942,12 +943,12 @@ void NativeWindowSystem::NewMouseRelease(int buttoncode, WId win){ } void NativeWindowSystem::CheckDamageID(WId win){ - qDebug() << "Got Damage Event:" << win; + //qDebug() << "Got Damage Event:" << win; for(int i=0; idamageId() == win || NWindows[i]->id() == win || NWindows[i]->frameId()==win){ - qDebug() << " - Found window"; - UpdateWindowImage(NWindows[i]); - NWindows[i]->emit VisualChanged(); + //qDebug() << " - Found window"; + //UpdateWindowImage(NWindows[i]); + NWindows[i]->emit winImageChanged(); return; } } diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h index c50babff..24128f32 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h @@ -23,11 +23,6 @@ private: QList NWindows; QList TWindows; - //Simplifications to find an already-created window object - NativeWindowObject* findWindow(WId id, bool checkRelated = true); - - NativeWindowObject* findTrayWindow(WId id); - //Now define a simple private_objects class so that each implementation // has a storage container for defining/placing private objects as needed class p_objects; @@ -51,14 +46,6 @@ private: } } - // Since some properties may be easier to update in bulk - // let the native system interaction do them in whatever logical groups are best - void UpdateWindowProperties(NativeWindowObject* win, QList< NativeWindowObject::Property > props); - void ChangeWindowProperties(NativeWindowObject* win, QList< NativeWindowObject::Property > props, QList vals); - - void SetupNewWindow(NativeWindowObject *win); - void UpdateWindowImage(NativeWindowObject *win); - //Generic private variables bool screenLocked; @@ -66,6 +53,18 @@ public: //enum Property{ None, CurrentWorkspace, Workspaces, VirtualRoots, WorkAreas }; enum MouseButton{NoButton, LeftButton, RightButton, MidButton, BackButton, ForwardButton, TaskButton, WheelUp, WheelDown, WheelLeft, WheelRight}; + //Simplifications to find an already-created window object + NativeWindowObject* findWindow(WId id, bool checkRelated = true); + + NativeWindowObject* findTrayWindow(WId id); + // Since some properties may be easier to update in bulk + // let the native system interaction do them in whatever logical groups are best + void UpdateWindowProperties(NativeWindowObject* win, QList< NativeWindowObject::Property > props); + void ChangeWindowProperties(NativeWindowObject* win, QList< NativeWindowObject::Property > props, QList vals); + + void SetupNewWindow(NativeWindowObject *win); + QImage GetWindowImage(NativeWindowObject *win); + NativeWindowSystem(); ~NativeWindowSystem(); -- cgit From bbabaada12e6d7e355c396961fe180e8e5b2b911 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Thu, 11 Jan 2018 09:22:40 -0500 Subject: Get a lot more of the Native Window embed routine up and running. Actually usable now. --- .../src-desktop/QMLImageProvider.cpp | 15 +++++- .../src-desktop/src-cpp/NativeWindowObject.cpp | 56 +++++++++++++--------- .../src-desktop/src-cpp/NativeWindowObject.h | 13 +++-- .../src-desktop/src-qml/NativeWindow.qml | 36 ++++++++++---- .../src-events/NativeWindowSystem.cpp | 10 ++-- 5 files changed, 88 insertions(+), 42 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.cpp index 0899337c..3f595245 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.cpp @@ -27,14 +27,25 @@ QImage QMLImageProvider::requestImage(const QString &id, QSize *size, const QSiz QImage img(requestedSize,QImage::Format_RGB32); if(win==0){ img.fill("black"); } //invalid window ID (should never happen) else if(id.startsWith("image:")){ img = Lumina::NWS->GetWindowImage(win); } + else if(id.startsWith("icon:")){ + QIcon ico = win->property(NativeWindowObject::Icon).value(); + QList sizes = ico.availableSizes(); + QSize sz(0,0); + //Just grab the largest size currently available + for(int i=0; iGetWindowIcon(win); } - qDebug() << "Got Window Image:" << img.size(); + //qDebug() << "Got Window Image:" << img.size(); if(img.size().isNull()){ if(requestedSize.isValid()){ img = QImage(requestedSize,QImage::Format_RGB32); } else{ img = QImage(QSize(64,64), QImage::Format_RGB32); } img.fill("black"); } - qDebug() << "Final Window Image:" << img.size(); + //qDebug() << "Final Window Image:" << img.size(); if(size!=0){ size->setHeight(img.height()); size->setWidth( img.width() ); diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp index 8ea00cc1..61a82e5c 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp @@ -22,6 +22,10 @@ NativeWindowObject::NativeWindowObject(WId id) : QObject(){ winid = id; frameid = 0; dmgID = dmg = 0; + geomTimer = new QTimer(this); + geomTimer->setSingleShot(true); + geomTimer->setInterval(50); //1/20 second + connect(geomTimer, SIGNAL(timeout()), this, SLOT(sendNewGeom()) ); } NativeWindowObject::~NativeWindowObject(){ @@ -62,17 +66,9 @@ void NativeWindowObject::setProperty(NativeWindowObject::Property prop, QVariant if(prop == NativeWindowObject::RelatedWindows){ relatedTo = val.value< QList >(); } else if(prop == NativeWindowObject::None || (!force && hash.value(prop)==val)){ return; } else if(prop == NativeWindowObject::WinImage){ - //special case - QImage is passed in, but QString is passed out (needed for QML) - QByteArray ba; - QBuffer buffer(&ba); - buffer.open(QIODevice::WriteOnly); - val.value().save(&buffer, "PNG"); - QString img("data:image/png;base64,"); - img.append(QString::fromLatin1(ba.toBase64().data())); - qDebug() << "Image Data Header:" << img.section(",",0,0); - hash.insert(prop, img); //save the string instead - } - else{ hash.insert(prop, val); } + //special case - This should never be actually set in the property hash + // it is loaded dynamically by the QMLImageProvider instead (prevent flickering/caching image) + } else{ hash.insert(prop, val); } emitSinglePropChanged(prop); emit PropertiesChanged(QList() << prop, QList() << val); } @@ -83,15 +79,8 @@ void NativeWindowObject::setProperties(QList props if(props[i] == NativeWindowObject::None || (!force && (hash.value(props[i]) == vals[i])) ){ props.removeAt(i); vals.removeAt(i); i--; continue; //Invalid property or identical value }else if(props[i] == NativeWindowObject::WinImage){ - //special case - QImage is passed in, but QString is passed out (needed for QML) - QByteArray ba; - QBuffer buffer(&ba); - buffer.open(QIODevice::WriteOnly); - vals[i].value().save(&buffer, "PNG"); - QString img("data:image/png;base64,"); - img.append(QString::fromLatin1(ba.toBase64().data())); - qDebug() << "Image Data Header:" << img.section(",",0,0); - hash.insert(props[i], img); //save the string instead + //special case - This should never be actually set in the property hash + // it is loaded dynamically by the QMLImageProvider instead (prevent flickering/caching image) }else{ hash.insert(props[i], vals[i]); } @@ -164,8 +153,11 @@ QString NativeWindowObject::shortTitle(){ return tmp; } -QIcon NativeWindowObject::icon(){ - return this->property(NativeWindowObject::Name).value(); +QString NativeWindowObject::icon(){ + if(icodmg==0){ icodmg=1; } + else{ icodmg = 0; } + qDebug() << "Window Icon:" << icodmg << this->property(NativeWindowObject::Icon).value().availableSizes(); + return "image://native_window/icon:"+QString::number(winid)+":"+QString::number(icodmg); } //QML Button states @@ -260,6 +252,18 @@ QRect NativeWindowObject::imageGeometry(){ return geom; } +void NativeWindowObject::updateGeometry(int x, int y, int width, int height){ + // Full frame+window geometry - go ahead and pull it apart and only update the interior window geom + QList fgeom = this->property(NativeWindowObject::FrameExtents).value >(); + if(fgeom.isEmpty()){ fgeom << 0<<0<<0<<0; } //just in case (left/right/top/bottom) + QPoint pos(x+fgeom[0], y+fgeom[2]); + QSize sz(width-fgeom[0]-fgeom[1], height-fgeom[2]-fgeom[3]); + newgeom = QRect(pos, sz); + //qDebug() << "Update Geometry:" << fgeom << QRect(x,y,width,height) << pos << sz; + //requestProperties(QList() << NativeWindowObject::GlobalPos << NativeWindowObject::Size, QList() << pos << sz); + if(!geomTimer->isActive()){ geomTimer->start(); } +} + // ==== PUBLIC SLOTS === void NativeWindowObject::toggleVisibility(){ setProperty(NativeWindowObject::Visible, !property(NativeWindowObject::Visible).toBool() ); @@ -284,7 +288,9 @@ void NativeWindowObject::emitSinglePropChanged(NativeWindowObject::Property prop case NativeWindowObject::Name: emit nameChanged(); break; case NativeWindowObject::Title: - emit titleChanged(); break; + emit titleChanged(); + if(this->property(NativeWindowObject::ShortTitle).toString().isEmpty()){ emit shortTitleChanged(); } + break; case NativeWindowObject::ShortTitle: emit shortTitleChanged(); break; case NativeWindowObject::Icon: @@ -300,3 +306,7 @@ void NativeWindowObject::emitSinglePropChanged(NativeWindowObject::Property prop break; //do nothing otherwise } } + +void NativeWindowObject::sendNewGeom(){ +requestProperties(QList() << NativeWindowObject::GlobalPos << NativeWindowObject::Size, QList() << newgeom.topLeft() << newgeom.size()); +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h index 0030d27c..332fe896 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h @@ -21,7 +21,7 @@ class NativeWindowObject : public QObject{ Q_PROPERTY( QString name READ name NOTIFY nameChanged) Q_PROPERTY( QString title READ title NOTIFY titleChanged) Q_PROPERTY( QString shortTitle READ shortTitle NOTIFY shortTitleChanged) - Q_PROPERTY( QIcon icon READ icon NOTIFY iconChanged) + Q_PROPERTY( QString icon READ icon NOTIFY iconChanged) Q_PROPERTY( bool sticky READ isSticky NOTIFY stickyChanged) //Button/Titlebar visibility Q_PROPERTY( bool showCloseButton READ showCloseButton NOTIFY winTypeChanged) @@ -98,7 +98,7 @@ public: Q_INVOKABLE QString name(); Q_INVOKABLE QString title(); Q_INVOKABLE QString shortTitle(); - Q_INVOKABLE QIcon icon(); + Q_INVOKABLE QString icon(); //QML Button states Q_INVOKABLE bool showCloseButton(); Q_INVOKABLE bool showMaxButton(); @@ -113,6 +113,7 @@ public: //QML Geometry reporting Q_INVOKABLE QRect frameGeometry(); Q_INVOKABLE QRect imageGeometry(); + Q_INVOKABLE void updateGeometry(int x, int y, int width, int height); //For QML to change the current window position public slots: Q_INVOKABLE void toggleVisibility(); @@ -125,10 +126,16 @@ private: //QWindow *WIN; WId winid, frameid; QList relatedTo; - unsigned int dmgID, dmg; + unsigned int dmgID, dmg, icodmg; + //Collation/Delay for window resize events + QTimer *geomTimer; + QRect newgeom; void emitSinglePropChanged(NativeWindowObject::Property); +private slots: + void sendNewGeom(); + signals: //General Notifications void PropertiesChanged(QList, QList); diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml index 74c3f025..2150e37c 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml @@ -15,13 +15,21 @@ Rectangle { id: windowFrame border.width: 5 - //border.color: palette.window - color: palette.window + border.color: palette.highlight + radius: 5 + color: "transparent" //palette.window x: object.frameGeometry.x y: object.frameGeometry.y width: object.frameGeometry.width height: object.frameGeometry.height + onXChanged: { + windowFrame.object.updateGeometry(windowFrame.x, windowFrame.y, windowFrame.width, windowFrame.height) + } + onYChanged: { + windowFrame.object.updateGeometry(windowFrame.x, windowFrame.y, windowFrame.width, windowFrame.height) + } + MouseArea { id: resizeArea anchors.fill: parent @@ -31,6 +39,7 @@ Rectangle { property int positionY: -1 onPressed: { + //NOTE: This is only triggered for resize events var globalP = windowFrame.mapToItem(rootCanvas, mouse.x, mouse.y) positionX = globalP.x positionY = globalP.y @@ -60,9 +69,11 @@ Rectangle { onReleased: { positionX = -1 positionY = -1 + //windowFrame.object.updateGeometry(windowFrame.x, windowFrame.y, windowFrame.width, windowFrame.height) } - onPositionChanged: { + onPositionChanged: { + //NOTE: This is only triggered for resize events if(positionX != -1 && positionY != -1) { var globalP = windowFrame.mapToItem(rootCanvas, mouse.x, mouse.y) /*console.log("Global P: ", globalP); @@ -109,13 +120,14 @@ Rectangle { positionY = globalP.y positionX = globalP.x } + windowFrame.object.updateGeometry(windowFrame.x, windowFrame.y, windowFrame.width, windowFrame.height) } } Rectangle { id: titleBar - border.width: 2 - color: palette.window + border.width: 0 + color: palette.window height: 25 anchors.top: windowFrame.top anchors.right: windowFrame.right @@ -133,9 +145,10 @@ Rectangle { //released: { function(); } } - Button { + ToolButton { id: otherButton anchors.left: parent.left + height: parent.height iconSource: windowFrame.object.icon } @@ -150,20 +163,25 @@ Rectangle { RowLayout { spacing: 0 anchors.right: parent.right - Button { + height: parent.height + + ToolButton { id: minButton + Layout.fillHeight: true iconName: "window-minimize" onClicked: { windowFrame.object.toggleVisibility() } } - Button { + ToolButton { id: maxButton + Layout.fillHeight: true iconName: "window-maximize" //onClicked: { windowFrame.object.toggleMaximize() } } - Button { + ToolButton { id: closeButton + Layout.fillHeight: true iconName: "document-close" onClicked: { windowFrame.object.requestClose() } } diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp index 15c79099..bd6d0179 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp @@ -523,7 +523,7 @@ void NativeWindowSystem::ChangeWindowProperties(NativeWindowObject* win, QList< } if(props.contains(NativeWindowObject::Size) || props.contains(NativeWindowObject::GlobalPos) ){ - /*xcb_configure_window_value_list_t valList; + xcb_configure_window_value_list_t valList; //valList.x = 0; //Note that this is the relative position - should always be 0,0 relative to the embed widget //valList.y = 0; QSize sz = win->property(NativeWindowObject::Size).toSize(); @@ -543,7 +543,7 @@ void NativeWindowSystem::ChangeWindowProperties(NativeWindowObject* win, QList< uint16_t mask = 0; mask = mask | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT | XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y; //qDebug() << "Configure window Geometry:" << sz; - xcb_configure_window_aux(QX11Info::connection(), win->id(), mask, &valList);*/ + xcb_configure_window_aux(QX11Info::connection(), win->id(), mask, &valList); } if(props.contains(NativeWindowObject::Name)){ @@ -630,7 +630,7 @@ void NativeWindowSystem::SetupNewWindow(NativeWindowObject *win){ QImage NativeWindowSystem::GetWindowImage(NativeWindowObject* win){ QImage img; - qDebug() << "Update Window Image:" << win->name(); + //qDebug() << "Update Window Image:" << win->name(); QRect geom(QPoint(0,0), win->property(NativeWindowObject::Size).toSize()); if(DISABLE_COMPOSITING){ QList screens = static_cast( QApplication::instance() )->screens(); @@ -641,12 +641,12 @@ QImage NativeWindowSystem::GetWindowImage(NativeWindowObject* win){ //Pull the XCB pixmap out of the compositing layer xcb_pixmap_t pix = xcb_generate_id(QX11Info::connection()); xcb_composite_name_window_pixmap(QX11Info::connection(), win->id(), pix); - if(pix==0){ qDebug() << "Got blank pixmap!"; return QImage(); } + if(pix==0){ return QImage(); } //Convert this pixmap into a QImage //xcb_image_t *ximg = xcb_image_get(QX11Info::connection(), pix, 0, 0, this->width(), this->height(), ~0, XCB_IMAGE_FORMAT_Z_PIXMAP); xcb_image_t *ximg = xcb_image_get(QX11Info::connection(), pix, geom.x(), geom.y(), geom.width(), geom.height(), ~0, XCB_IMAGE_FORMAT_Z_PIXMAP); - if(ximg == 0){ qDebug() << "Got blank image!"; return QImage(); } + if(ximg == 0){ return QImage(); } QImage tmp(ximg->data, ximg->width, ximg->height, ximg->stride, QImage::Format_ARGB32_Premultiplied); img = tmp.copy(); //detach this image from the XCB data structures before we clean them up, otherwise the QImage will try to clean it up a second time on window close and crash xcb_image_destroy(ximg); -- cgit From 35a425977ca313e608950cdc25c7df727e47251d Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Thu, 11 Jan 2018 14:47:08 -0800 Subject: Get the panels all setup and functional. The screen-dependent panels need to be moved to the RootDesktop QML object so the z-ordering is respected (panels on top), but other than that it seems to be working fine. --- .../defaults/desktop/screensaver.conf | 1 - .../src-desktop/DesktopManager.cpp | 30 ++++++++++------ .../src-desktop/DesktopManager.h | 1 - .../src-desktop/QMLImageProvider.cpp | 14 ++++++-- .../src-desktop/QMLImageProvider.h | 4 +-- .../src-desktop/RootWindow.cpp | 4 ++- .../src-desktop/src-cpp/PanelObject.cpp | 40 ++++++++++++++++++++++ .../src-desktop/src-cpp/PanelObject.h | 1 + .../src-desktop/src-cpp/RootDesktopObject.cpp | 36 +++++++++++++++++++ .../src-desktop/src-cpp/RootDesktopObject.h | 7 ++++ .../src-desktop/src-cpp/ScreenObject.cpp | 32 +++++++++++++++++ .../src-desktop/src-cpp/ScreenObject.h | 9 +++++ .../src-desktop/src-qml/Panel.qml | 8 ++--- .../src-desktop/src-qml/RootDesktop.qml | 10 ++++++ .../src-desktop/src-qml/Screen.qml | 14 ++++++++ 15 files changed, 188 insertions(+), 23 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/defaults/desktop/screensaver.conf b/src-qt5/core/lumina-desktop-unified/defaults/desktop/screensaver.conf index b4bfec59..98e6f20a 100644 --- a/src-qt5/core/lumina-desktop-unified/defaults/desktop/screensaver.conf +++ b/src-qt5/core/lumina-desktop-unified/defaults/desktop/screensaver.conf @@ -1,3 +1,2 @@ [General] default_plugin="random" -plugin_VGA-0="random" diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp index eefe6d7e..bfded781 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp @@ -84,10 +84,6 @@ void DesktopManager::updateWallpaper(QString screen_id, int wkspace){ RootDesktopObject::instance()->ChangeWallpaper(screen_id,QUrl::fromLocalFile(wpaper).toString() ); } -void DesktopManager::updatePanels(QString panel_id){ - -} - void DesktopManager::updatePlugins(QString plugin_id){ } @@ -103,13 +99,13 @@ void DesktopManager::settingsChanged(DesktopSettings::File type){ case DesktopSettings::Desktop: QTimer::singleShot(0, this, SLOT(updateDesktopSettings()) ); case DesktopSettings::Panels: - QTimer::singleShot(0, this, SLOT(updatePanelSettings()) ); + QTimer::singleShot(1, this, SLOT(updatePanelSettings()) ); case DesktopSettings::Plugins: - QTimer::singleShot(0, this, SLOT(updatePluginSettings()) ); + QTimer::singleShot(2, this, SLOT(updatePluginSettings()) ); case DesktopSettings::ContextMenu: - QTimer::singleShot(0, this, SLOT(updateMenuSettings()) ); + QTimer::singleShot(3, this, SLOT(updateMenuSettings()) ); case DesktopSettings::Animation: - QTimer::singleShot(0, this, SLOT(updateAnimationSettings()) ); + QTimer::singleShot(4, this, SLOT(updateAnimationSettings()) ); default: break; //Do nothing - not a settings change we care about here @@ -148,14 +144,28 @@ void DesktopManager::syncTrayWindowList(){ // === PRIVATE SLOTS === void DesktopManager::updateDesktopSettings(){ qDebug() << "Update Desktop Settings..."; - QList scrns= QApplication::screens(); + QList scrns = QGuiApplication::screens(); int wkspace = Lumina::NWS->currentWorkspace(); for(int i=0; iname(), wkspace); } } void DesktopManager::updatePanelSettings(){ - + QList scrns = QGuiApplication::screens(); + int primary = QApplication::desktop()->primaryScreen(); + for(int i=0; iscreen(scrns[i]->name()); + if(sObj == 0){ continue; } //screen is not managed directly - skip it + QStringList ids = DesktopSettings::instance()->value(DesktopSettings::Panels, scrns[i]->name().replace("-","_")+"/active_ids", QStringList()).toStringList(); + if(ids.isEmpty() && (scrns.length()==1 || i==primary)){ + //Also look for the "default" panel id's for the primary/default screen + ids = DesktopSettings::instance()->value(DesktopSettings::Panels, "default/active_ids", QStringList()).toStringList(); + } + sObj->setPanels(ids); + } + //Now do the global-session panels + QStringList ids = DesktopSettings::instance()->value(DesktopSettings::Panels, "session/active_ids", QStringList()).toStringList(); + RootDesktopObject::instance()->setPanels(ids); //put the new ones in place } void DesktopManager::updatePluginSettings(){ diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.h b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.h index d4a0cf79..da42e477 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.h @@ -23,7 +23,6 @@ public: private: void updateWallpaper(QString screen_id, int wkspace); - void updatePanels(QString panel_id); void updatePlugins(QString plugin_id); public slots: diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.cpp index 3f595245..a74d2585 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.cpp @@ -7,7 +7,7 @@ #include #include "QMLImageProvider.h" -QMLImageProvider::QMLImageProvider() : QQuickImageProvider(QQmlImageProviderBase::Image, 0){ +QMLImageProvider::QMLImageProvider(QQmlImageProviderBase::ImageType type) : QQuickImageProvider(type, 0){ } @@ -23,7 +23,10 @@ QMLImageProvider::~QMLImageProvider(){ QImage QMLImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize){ NativeWindowObject *win = Lumina::NWS->findWindow( id.section(":",1,1).toInt(), false); - qDebug() << "Request Image:" << id << win << requestedSize; + if(win==0){ win = Lumina::NWS->findTrayWindow(id.section(":",1,1).toInt()); } + + if(!id.startsWith("image:")){ qDebug() << "Request Image:" << id << win << requestedSize; } + QImage img(requestedSize,QImage::Format_RGB32); if(win==0){ img.fill("black"); } //invalid window ID (should never happen) else if(id.startsWith("image:")){ img = Lumina::NWS->GetWindowImage(win); } @@ -38,7 +41,6 @@ QImage QMLImageProvider::requestImage(const QString &id, QSize *size, const QSiz qDebug() << "Icon Sizes:" <GetWindowIcon(win); } //qDebug() << "Got Window Image:" << img.size(); if(img.size().isNull()){ if(requestedSize.isValid()){ img = QImage(requestedSize,QImage::Format_RGB32); } @@ -55,3 +57,9 @@ QImage QMLImageProvider::requestImage(const QString &id, QSize *size, const QSiz } return img; } + +QPixmap QMLImageProvider::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize){ + qDebug() << "Pixmap Requested:" << id; + QImage img = requestImage(id, size, requestedSize); + return QPixmap::fromImage(img); +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.h b/src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.h index d0ab74ff..8719176e 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/QMLImageProvider.h @@ -14,13 +14,13 @@ class QMLImageProvider : public QQuickImageProvider{ public: - QMLImageProvider(); + QMLImageProvider(QQmlImageProviderBase::ImageType); ~QMLImageProvider(); //static QMLImageProvider* instance(); virtual QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize); - + virtual QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize); }; #endif diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp index 5a9b8e09..2ceff4a0 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp @@ -6,6 +6,7 @@ //=========================================== #include "RootWindow.h" #include "QMLImageProvider.h" +#include RootWindow::RootWindow() : QObject(){ root_win = QWindow::fromWinId( QX11Info::appRootWindow() ); // @@ -17,7 +18,8 @@ RootWindow::RootWindow() : QObject(){ //Now setup the QQuickView root_view->setResizeMode(QQuickView::SizeRootObjectToView); root_view->engine()->rootContext()->setContextProperty("RootObject", root_obj); - root_view->engine()->addImageProvider("native_window", new QMLImageProvider() ); + root_view->engine()->addImageProvider("native_window", new QMLImageProvider(QQmlImageProviderBase::Image) ); + //root_view->engine()->addImageProvider("native_window_icon", new QMLImageProvider(QQmlImageProviderBase::Pixmap) ); RootDesktopObject::RegisterType(); //make sure object classes are registered with the QML subsystems } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.cpp index 471da58f..9054f528 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.cpp @@ -5,6 +5,8 @@ // See the LICENSE file for full details //=========================================== #include "PanelObject.h" +#include + #include #include @@ -42,3 +44,41 @@ void PanelObject::setGeometry( QRect newgeom ){ emit geomChanged(); } } + +void PanelObject::syncWithSettings(QRect parent_geom){ + //Read off all the settings + //qDebug() << "Sync Panel Settings:" << panel_id << parent_geom; + QString anchor = DesktopSettings::instance()->value(DesktopSettings::Panels, panel_id+"/anchor", "bottom").toString().toLower(); + QString align = DesktopSettings::instance()->value(DesktopSettings::Panels, panel_id+"/align", "center").toString().toLower(); + double length = DesktopSettings::instance()->value(DesktopSettings::Panels, panel_id+"/length_percent", 100).toDouble()/100.0; + double width = DesktopSettings::instance()->value(DesktopSettings::Panels, panel_id+"/width_font_percent", 2.1).toDouble(); + width = qRound(width * QApplication::fontMetrics().height() ); + this->setBackground( DesktopSettings::instance()->value(DesktopSettings::Panels, panel_id+"/background", "rgba(0,0,0,120)").toString() ); + // qDebug() << "Update Panel:" << panel_id << anchor+"/"+align << length << width; + //Now calculate the geometry of the panel + QRect newgeom; + //Figure out the size of the panel + if(anchor=="top" || anchor=="bottom"){ newgeom.setWidth( parent_geom.width()*length ); newgeom.setHeight(width); } + else{ newgeom.setWidth(width); newgeom.setHeight(parent_geom.height()*length); } + //qDebug() << " - Size:" << newgeom; + //Now figure out the location of the panel + if(align=="left" || align=="top"){ + if(anchor=="top" || anchor=="left"){ newgeom.moveTopLeft(QPoint(0,0)); } + else if(anchor=="right"){ newgeom.moveTopRight(QPoint(parent_geom.width(), 0)); } + else{ newgeom.moveBottomLeft(QPoint(0, parent_geom.height()) ); } //bottom by default + + }else if(align=="right" || align=="bottom"){ + if(anchor=="top"){ newgeom.moveTopRight(QPoint(parent_geom.width(),0)); } + else if(anchor=="left"){ newgeom.moveBottomLeft(QPoint(0, parent_geom.height())); } + else if(anchor=="right"){ newgeom.moveBottomRight(QPoint(parent_geom.width(), parent_geom.height())); } + else{ newgeom.moveBottomRight(QPoint(parent_geom.width(), parent_geom.height()) ); } + + }else{ //center + if(anchor=="top"){ newgeom.moveTopLeft(QPoint( (parent_geom.width()-newgeom.width())/2,0)); } + else if(anchor=="left"){ newgeom.moveTopLeft(QPoint(0, (parent_geom.height()-newgeom.height())/2 )); } + else if(anchor=="right"){ newgeom.moveTopRight(QPoint(parent_geom.width(), (parent_geom.height()-newgeom.height())/2 )); } + else{ newgeom.moveBottomLeft(QPoint( (parent_geom.width()-newgeom.width())/2, parent_geom.height()) ); } + } + //qDebug() << " - Calculated Geometry:" << newgeom; + this->setGeometry(newgeom); //Note: This is in parent-relative coordinates (not global) +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.h index a788fa07..8cf59dee 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.h @@ -40,6 +40,7 @@ public: public slots: void setBackground(QString fileOrColor); void setGeometry(QRect newgeom); + void syncWithSettings(QRect parent_geom); signals: void backgroundChanged(); 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 39dc30c1..07d4e463 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 @@ -14,6 +14,7 @@ // === PUBLIC === RootDesktopObject::RootDesktopObject(QObject *parent) : QObject(parent){ updateScreens(); //make sure the internal list is updated right away + connect(this, SIGNAL(changePanels(QStringList)), this, SLOT(setPanels(QStringList)) ); } RootDesktopObject::~RootDesktopObject(){ @@ -87,6 +88,41 @@ void RootDesktopObject::setPanels(QList list){ emit panelsChanged(); } +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; + } + + //Get the current bounding rectangle for the session + QRect total; + for(int i=0; igeometry()); + } + //First update/remove any current panel objects + bool change = false; + for(int i=0; iname()) ){ + ids.removeAll(panel_objects[i]->name()); //already handled + panel_objects[i]->syncWithSettings(total); + }else{ + panel_objects.takeAt(i)->deleteLater(); + i--; + change = true; //list changed + } + } + //Now create any new panel objects as needed + for(int i=0; isyncWithSettings(total); + panel_objects << tmp; + change = true; //list changed + } + if(change){ emit panelsChanged(); } +} + void RootDesktopObject::setWindows(QList list){ window_objects = list; emit windowsChanged(); diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h index a4236596..ad0e538b 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h @@ -10,6 +10,7 @@ #define _LUMINA_DESKTOP_QML_BACKEND_ROOT_DESKTOP_OBJECT_H #include #include +#include class RootDesktopObject : public QObject{ Q_OBJECT @@ -53,6 +54,9 @@ public slots: QString CurrentWallpaper(QString screen); void setPanels(QList list); + void setPanels(QStringList ids); + QList panelObjectList(){ return panel_objects; } + void setWindows(QList list); private slots: @@ -66,5 +70,8 @@ signals: void mouseMoved(); void lockScreen(); void launchApplication(QString); + + //Internal signals for thread-safety + void changePanels(QStringList); }; #endif diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/ScreenObject.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/ScreenObject.cpp index 1b22c450..c754906d 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/ScreenObject.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/ScreenObject.cpp @@ -10,6 +10,7 @@ ScreenObject::ScreenObject(QScreen *scrn, QObject *parent) : QObject(parent){ bg_screen = scrn; + connect(this, SIGNAL(changePanels(QStringList)), this, SLOT(setPanels(QStringList)) ); } void ScreenObject::RegisterType(){ @@ -40,6 +41,37 @@ void ScreenObject::setPanels(QList list){ emit panelsChanged(); } +void ScreenObject::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; + } + + //First update/remove any current panel objects + bool change = false; + for(int i=0; iname()) ){ + ids.removeAll(panel_objects[i]->name()); //already handled + panel_objects[i]->syncWithSettings(bg_screen->geometry()); + }else{ + panel_objects.takeAt(i)->deleteLater(); + i--; + change = true; //list changed + } + } + //Now create any new panel objects as needed + for(int i=0; isyncWithSettings(bg_screen->geometry()); + panel_objects << tmp; + change = true; //list changed + } + if(change){ emit panelsChanged(); } +} + + //QML Read Functions QStringList ScreenObject::panels(){ //qDebug() << "Request Panels:" << panel_objects.length(); diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/ScreenObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/ScreenObject.h index 1afff6d2..250c9403 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/ScreenObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/ScreenObject.h @@ -11,6 +11,7 @@ #include #include #include +#include #include "PanelObject.h" @@ -42,16 +43,24 @@ public: Q_INVOKABLE int height(); Q_INVOKABLE QStringList panels(); Q_INVOKABLE PanelObject* panel(QString id); + Q_INVOKABLE QRect geometry(){ return bg_screen->geometry(); } void setPanels(QList list); + QList panelObjectList(){ return panel_objects; } + public slots: + void setPanels(QStringList ids); void setBackground(QString fileOrColor); signals: void backgroundChanged(); void geomChanged(); void panelsChanged(); + + //Internal signals for thread-safety + void changePanels(QStringList); + }; #endif diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml index 846b5b55..556da5ec 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml @@ -10,15 +10,13 @@ import QtQuick.Controls 1 import Lumina.Backend.PanelObject 2.0 -AnimatedImage { +Rectangle { //C++ backend object - property string screen_id + property string panel_id property PanelObject object //Normal geometries/placements - asynchronous: true - clip: true - source: object.background + color: object.background x: object.x y: object.y width: object.width diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/RootDesktop.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/RootDesktop.qml index 9122ce5b..f48f7751 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/RootDesktop.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/RootDesktop.qml @@ -66,4 +66,14 @@ Rectangle { z: 100+index } } + + //Setup the Panels + Repeater{ + model: RootObject.panels + QML.Panel{ + panel_id: modelData + object: RootObject.panel(panel_id) + z: 10100+index + } + } } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Screen.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Screen.qml index 3b83653a..82e7c89d 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Screen.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Screen.qml @@ -9,6 +9,9 @@ import QtQuick.Window 2.2 import QtQuick.Controls 1 import Lumina.Backend.ScreenObject 2.0 +import Lumina.Backend.PanelObject 2.0 + +import "." as QML AnimatedImage { //C++ backend object @@ -23,4 +26,15 @@ AnimatedImage { y: object.y width: object.width height: object.height + + //Setup the Panels + Repeater{ + model: object.panels + QML.Panel{ + panel_id: modelData + object: parent.object.panel(panel_id) + z: 10000+index + } + } + } -- cgit From 9163f5e496cdb7e94f8e9b3e5b3dcb92ad2ef85f Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Thu, 11 Jan 2018 20:43:08 -0800 Subject: Fix up the saving of the current window positions in the backend objects. --- .../src-desktop/src-cpp/NativeWindowObject.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp index 61a82e5c..dae4676c 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp @@ -308,5 +308,8 @@ void NativeWindowObject::emitSinglePropChanged(NativeWindowObject::Property prop } void NativeWindowObject::sendNewGeom(){ -requestProperties(QList() << NativeWindowObject::GlobalPos << NativeWindowObject::Size, QList() << newgeom.topLeft() << newgeom.size()); + QList props; props << NativeWindowObject::GlobalPos << NativeWindowObject::Size; + QList vals; vals << newgeom.topLeft() << newgeom.size(); + requestProperties(props, vals); + setProperties(props,vals); } -- cgit From 9083f9a57b4414e0ad6f22127b156bc8581ef45c Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Fri, 12 Jan 2018 08:20:09 -0800 Subject: Add an additional OS-specific network device type parser. --- .../panel-plugins/battery/LBattery.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop/panel-plugins/battery/LBattery.cpp b/src-qt5/core/lumina-desktop/panel-plugins/battery/LBattery.cpp index 69ea5faa..1870eefb 100644 --- a/src-qt5/core/lumina-desktop/panel-plugins/battery/LBattery.cpp +++ b/src-qt5/core/lumina-desktop/panel-plugins/battery/LBattery.cpp @@ -78,19 +78,20 @@ void LBattery::updateBattery(bool force){ break; } } - if(iconvalue("PlayBatteryLowAudio",true).toBool(); - if( playaudio ){ QString sfile = LSession::handle()->sessionSettings()->value("audiofiles/batterylow", LOS::LuminaShare()+"low-battery.ogg").toString(); + if(iconvalue("PlayBatteryLowAudio",true).toBool(); + if( playaudio ){ + QString sfile = LSession::handle()->sessionSettings()->value("audiofiles/batterylow", LOS::LuminaShare()+"low-battery.ogg").toString(); LSession::handle()->playAudioFile(sfile); - } + } + } - if(icon==0){ label->setStyleSheet("QLabel{ background: red;}"); } - else if(icon==14 && charge>98){ label->setStyleSheet("QLabel{ background: green;}"); } - else{ label->setStyleSheet("QLabel{ background: transparent;}"); } - iconOld = icon; + if(icon==0){ label->setStyleSheet("QLabel{ background: red;}"); } + else if(icon==14 && charge>98){ label->setStyleSheet("QLabel{ background: green;}"); } + else{ label->setStyleSheet("QLabel{ background: transparent;}"); } + iconOld = icon; - } //Now update the display QString tt; //Make sure the tooltip can be properly translated as necessary (Ken Moore 5/9/14) -- cgit From 91e8877b9fe79f01518f89653a9dc157a79a2e83 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Sat, 13 Jan 2018 12:45:09 -0800 Subject: Another large checkpoint commit for Lumina 2: * Integrate the new window geometry manager class * Get the new OSInterface framework tied in * Start getting the various system monitoring solutions tied into the OSInterface --- .../core/libLumina/obsolete/RootWindow-mgmt.cpp | 95 ------------------- .../defaults/desktop/panels.conf | 21 +++++ .../core/lumina-desktop-unified/lumina-desktop.pro | 1 + .../src-desktop/src-cpp/NativeWindowObject.cpp | 19 +++- .../src-desktop/src-cpp/NativeWindowObject.h | 3 +- .../src-events/NativeWindowSystem.cpp | 6 +- .../src-events/NativeWindowSystem.h | 6 ++ .../src-events/Window-mgmt.cpp | 105 +++++++++++++++++++++ .../lumina-desktop-unified/src-events/events.pri | 3 +- 9 files changed, 156 insertions(+), 103 deletions(-) delete mode 100644 src-qt5/core/libLumina/obsolete/RootWindow-mgmt.cpp create mode 100644 src-qt5/core/lumina-desktop-unified/defaults/desktop/panels.conf create mode 100644 src-qt5/core/lumina-desktop-unified/src-events/Window-mgmt.cpp (limited to 'src-qt5/core') diff --git a/src-qt5/core/libLumina/obsolete/RootWindow-mgmt.cpp b/src-qt5/core/libLumina/obsolete/RootWindow-mgmt.cpp deleted file mode 100644 index 24ea639b..00000000 --- a/src-qt5/core/libLumina/obsolete/RootWindow-mgmt.cpp +++ /dev/null @@ -1,95 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2016, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "RootWindow.h" - -//Primary/private function -void RootWindow::arrangeWindows(RootSubWindow *primary, QString type, bool primaryonly){ - if(type.isEmpty()){ type = "center"; } - if(primary==0){ - //Get the currently active window and treat that as the primary - for(int i=0; inativeWindow()->property(NativeWindow::Active).toBool()){ primary = WINDOWS[i]; } - } - if(primary==0 && !WINDOWS.isEmpty()){ primary = WINDOWS[0]; } //just use the first one in the list - } - //Now get the current screen that the mouse cursor is over (and valid area) - QScreen *screen = screenUnderMouse(); - QRect desktopArea = screen->availableGeometry(); - //qDebug() << "Arrange Windows:" << primary->geometry() << type << primaryonly << desktopArea; - //Now start filtering out all the windows that need to be ignored - int wkspace = primary->nativeWindow()->property(NativeWindow::Workspace).toInt(); - QList winlist = WINDOWS; - for(int i=0; inativeWindow()->property(NativeWindow::Workspace).toInt()!=wkspace - || !winlist[i]->nativeWindow()->property(NativeWindow::Visible).toBool() - || desktopArea.intersected(winlist[i]->geometry()).isNull() ){ - //window is outside of the desired area or invisible - ignore it - winlist.removeAt(i); - i--; - } - } - if(!winlist.contains(primary)){ winlist << primary; } //could be doing this on a window right before it is shown - else if(primaryonly){ winlist.removeAll(primary); winlist << primary; } //move primary window to last - //QRegion used; - for(int i=0; igeometry(); - //verify that the window is contained by the desktop area - if(geom.width()>desktopArea.width()){ geom.setWidth(desktopArea.width()); } - if(geom.height()>desktopArea.height()){ geom.setHeight(desktopArea.height()); } - //Now apply the proper placement routine - if(type=="center"){ - QPoint ct = desktopArea.center(); - winlist[i]->setGeometry( ct.x()-(geom.width()/2), ct.y()-(geom.height()/2), geom.width(), geom.height()); - }else if(type=="snap"){ - - }else if(type=="single_max"){ - winlist[i]->setGeometry( desktopArea.x(), desktopArea.y(), desktopArea.width(), desktopArea.height()); - }else if(type=="under-mouse"){ - QPoint ct = QCursor::pos(); - geom = QRect(ct.x()-(geom.width()/2), ct.y()-(geom.height()/2), geom.width(), geom.height() ); - //Now verify that the top of the window is still contained within the desktop area - if(geom.y() < desktopArea.y() ){ geom.moveTop(desktopArea.y()); } - winlist[i]->setGeometry(geom); - - } - //qDebug() << " - New Geometry:" << winlist[i]->geometry(); - } //end loop over winlist -} - -// ================ -// Public slots for starting the arrangement routine(s) above -// ================ -void RootWindow::ArrangeWindows(WId primary, QString type){ - RootSubWindow* win = windowForId(primary); - if(type.isEmpty()){ type = "center"; } //grab the default arrangement format - arrangeWindows(win, type); -} - -void RootWindow::TileWindows(WId primary, QString type){ - RootSubWindow* win = windowForId(primary); - if(type.isEmpty()){ type = "single_max"; } //grab the default arrangement format for tiling - arrangeWindows(win, type); -} - -void RootWindow::CheckWindowPosition(WId id, bool newwindow){ - //used after a "drop" to validate/snap/re-arrange window(s) as needed - // if "newwindow" is true, then this is the first-placement routine for a window before it initially appears - RootSubWindow* win = windowForId(id); - if(win==0){ return; } //invalid window - QRect geom = win->nativeWindow()->geometry(); - bool changed = false; - //Make sure it is on the screen (quick check) - if(geom.x() < 0){ changed = true; geom.moveLeft(0); } - if(geom.y() < 0){ changed = true; geom.moveTop(0); } - if(geom.width() < 20){ changed = true; geom.setWidth(100); } - if(geom.height() < 20){ changed = true; geom.setHeight(100); } - if(changed){ win->setGeometry(geom); } - //Now run it through the window arrangement routine - arrangeWindows(win, newwindow ?"center" : "snap", true); -} diff --git a/src-qt5/core/lumina-desktop-unified/defaults/desktop/panels.conf b/src-qt5/core/lumina-desktop-unified/defaults/desktop/panels.conf new file mode 100644 index 00000000..07cf4635 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/defaults/desktop/panels.conf @@ -0,0 +1,21 @@ +[General] + +[templates] +windows/anchor="bottom" +windows/align="center" +windows/length_percent=100 +windows/plugins="" +windows/background="rgba(0,0,0,120)" + +[default] +active_ids="initial" + +[session] + +[initial] +anchor="bottom" +align="center" +length_percent=100 +width_percent=2.1 +plugins="" +background="rgba(0,0,0,120)" diff --git a/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro b/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro index f28b96c2..96d84a71 100644 --- a/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro +++ b/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro @@ -24,6 +24,7 @@ include(../libLumina/ExternalProcess.pri) include(../libLumina/XDGMime.pri) include(../../src-cpp/plugins-base.pri) +include(../../src-cpp/framework-OSInterface.pri) #include all the main individual source groups include(src-events/events.pri) diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp index dae4676c..9bb78dd0 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp @@ -130,6 +130,10 @@ QRect NativeWindowObject::geometry(){ return geom; } +void NativeWindowObject::setGeometryNow(QRect geom){ + updateGeometry(geom.x(), geom.y(), geom.width(), geom.height(), true); +} + // QML ACCESS FUNCTIONS (shortcuts for particular properties in a format QML can use) QString NativeWindowObject::winImage(){ //Need to alternate something on the end to ensure that QML knows to fetch the new image (non-cached only) @@ -252,16 +256,21 @@ QRect NativeWindowObject::imageGeometry(){ return geom; } -void NativeWindowObject::updateGeometry(int x, int y, int width, int height){ +void NativeWindowObject::updateGeometry(int x, int y, int width, int height, bool now){ // Full frame+window geometry - go ahead and pull it apart and only update the interior window geom QList fgeom = this->property(NativeWindowObject::FrameExtents).value >(); if(fgeom.isEmpty()){ fgeom << 0<<0<<0<<0; } //just in case (left/right/top/bottom) QPoint pos(x+fgeom[0], y+fgeom[2]); QSize sz(width-fgeom[0]-fgeom[1], height-fgeom[2]-fgeom[3]); - newgeom = QRect(pos, sz); - //qDebug() << "Update Geometry:" << fgeom << QRect(x,y,width,height) << pos << sz; - //requestProperties(QList() << NativeWindowObject::GlobalPos << NativeWindowObject::Size, QList() << pos << sz); - if(!geomTimer->isActive()){ geomTimer->start(); } + if(!now){ + newgeom = QRect(pos, sz); + //qDebug() << "Update Geometry:" << fgeom << QRect(x,y,width,height) << pos << sz; + //requestProperties(QList() << NativeWindowObject::GlobalPos << NativeWindowObject::Size, QList() << pos << sz); + if(!geomTimer->isActive()){ geomTimer->start(); } + }else{ + requestProperties(QList() << NativeWindowObject::GlobalPos << NativeWindowObject::Size , QList() << pos << sz ); + setProperties(QList() << NativeWindowObject::GlobalPos << NativeWindowObject::Size , QList() << pos << sz ); + } } // ==== PUBLIC SLOTS === diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h index 332fe896..6a63813e 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h @@ -92,6 +92,7 @@ public: void requestProperties(QList, QList, bool force = false); Q_INVOKABLE QRect geometry(); //this returns the "full" geometry of the window (window + frame) + void setGeometryNow(QRect geom); // QML ACCESS FUNCTIONS (shortcuts for particular properties in a format QML can use) Q_INVOKABLE QString winImage(); @@ -113,7 +114,7 @@ public: //QML Geometry reporting Q_INVOKABLE QRect frameGeometry(); Q_INVOKABLE QRect imageGeometry(); - Q_INVOKABLE void updateGeometry(int x, int y, int width, int height); //For QML to change the current window position + Q_INVOKABLE void updateGeometry(int x, int y, int width, int height, bool now = false); //For QML to change the current window position public slots: Q_INVOKABLE void toggleVisibility(); diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp index bd6d0179..063c1337 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp @@ -784,15 +784,19 @@ void NativeWindowSystem::NewWindowDetected(WId id){ registerClientEvents(win->id()); NWindows << win; UpdateWindowProperties(win, NativeWindowObject::allProperties()); - win->setProperty(NativeWindowObject::FrameExtents, QVariant::fromValue >( QList() << 5 << 5 << 30 << 5 )); + if(win->showWindowFrame()){ + win->setProperty(NativeWindowObject::FrameExtents, QVariant::fromValue >( QList() << 5 << 5 << 30 << 5 )); + } qDebug() << "New Window [& associated ID's]:" << win->id() << win->property(NativeWindowObject::Name).toString(); SetupNewWindow(win); + CheckWindowPosition(id, true); //first time placement //Now setup the connections with this window connect(win, SIGNAL(RequestClose(WId)), this, SLOT(RequestClose(WId)) ); connect(win, SIGNAL(RequestKill(WId)), this, SLOT(RequestKill(WId)) ); connect(win, SIGNAL(RequestPing(WId)), this, SLOT(RequestPing(WId)) ); connect(win, SIGNAL(RequestReparent(WId, WId, QPoint)), this, SLOT(RequestReparent(WId, WId, QPoint)) ); connect(win, SIGNAL(RequestPropertiesChange(WId, QList, QList)), this, SLOT(RequestPropertiesChange(WId, QList, QList)) ); + connect(win, SIGNAL(VerifyNewGeometry(WId)), this, SLOT(CheckWindowPosition(WId)) ); xcb_map_window(QX11Info::connection(), win->id()); emit NewWindowAvailable(win); } diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h index 24128f32..5810fc36 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h @@ -129,6 +129,12 @@ private slots: void RequestPing(WId); void RequestReparent(WId, WId, QPoint); //client, parent, relative origin point in parent + //Window-mgmt functions (see Window-mgmt.cpp for details) + void ArrangeWindows(WId primary, QString type); + void TileWindows(WId primary, QString type); + void CheckWindowPosition(WId id, bool newwindow = false); + void arrangeWindows(NativeWindowObject *primary, QString type, bool primaryonly = false); + signals: void NewWindowAvailable(NativeWindowObject*); void WindowClosed(); diff --git a/src-qt5/core/lumina-desktop-unified/src-events/Window-mgmt.cpp b/src-qt5/core/lumina-desktop-unified/src-events/Window-mgmt.cpp new file mode 100644 index 00000000..0b45c208 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-events/Window-mgmt.cpp @@ -0,0 +1,105 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "NativeWindowSystem.h" +inline QScreen* screenUnderMouse(){ + QPoint pos = QCursor::pos(); + QList scrns = QGuiApplication::screens(); + for(int i=0; igeometry().contains(pos)){ return scrns[i]; } + } + return 0; +} + + +//Primary/private function +void NativeWindowSystem::arrangeWindows(NativeWindowObject *primary, QString type, bool primaryonly){ + if(type.isEmpty()){ type = "center"; } + if(primary==0){ + //Get the currently active window and treat that as the primary + for(int i=0; iproperty(NativeWindowObject::Active).toBool()){ primary = NWindows[i]; } + } + if(primary==0 && !NWindows.isEmpty()){ primary = NWindows[0]; } //just use the first one in the list + } + //Now get the current screen that the mouse cursor is over (and valid area) + QScreen *screen = screenUnderMouse(); + if(screen==0){ return; } //should never happen (theoretically) + QRect desktopArea = screen->availableGeometry(); + //qDebug() << "Arrange Windows:" << primary->geometry() << type << primaryonly << desktopArea; + //Now start filtering out all the windows that need to be ignored + int wkspace = primary->property(NativeWindowObject::Workspace).toInt(); + QList winlist = NWindows; + for(int i=0; iproperty(NativeWindowObject::Workspace).toInt()!=wkspace + || !winlist[i]->property(NativeWindowObject::Visible).toBool() + || desktopArea.intersected(winlist[i]->geometry()).isNull() ){ + //window is outside of the desired area or invisible - ignore it + winlist.removeAt(i); + i--; + } + } + if(!winlist.contains(primary)){ winlist << primary; } //could be doing this on a window right before it is shown + else if(primaryonly){ winlist.removeAll(primary); winlist << primary; } //move primary window to last + //QRegion used; + for(int i=0; igeometry(); + //verify that the window is contained by the desktop area + if(geom.width()>desktopArea.width()){ geom.setWidth(desktopArea.width()); } + if(geom.height()>desktopArea.height()){ geom.setHeight(desktopArea.height()); } + //Now apply the proper placement routine + if(type=="center"){ + QPoint ct = desktopArea.center(); + winlist[i]->setGeometryNow( QRect( ct.x()-(geom.width()/2), ct.y()-(geom.height()/2), geom.width(), geom.height()) ); + }else if(type=="snap"){ + + }else if(type=="single_max"){ + winlist[i]->setGeometryNow( QRect( desktopArea.x(), desktopArea.y(), desktopArea.width(), desktopArea.height()) ); + }else if(type=="under-mouse"){ + QPoint ct = QCursor::pos(); + geom = QRect(ct.x()-(geom.width()/2), ct.y()-(geom.height()/2), geom.width(), geom.height() ); + //Now verify that the top of the window is still contained within the desktop area + if(geom.y() < desktopArea.y() ){ geom.moveTop(desktopArea.y()); } + winlist[i]->setGeometryNow(geom); + + } + //qDebug() << " - New Geometry:" << winlist[i]->geometry(); + } //end loop over winlist +} + +// ================ +// Public slots for starting the arrangement routine(s) above +// ================ +void NativeWindowSystem::ArrangeWindows(WId primary, QString type){ + NativeWindowObject* win = findWindow(primary); + if(type.isEmpty()){ type = "center"; } //grab the default arrangement format + arrangeWindows(win, type); +} + +void NativeWindowSystem::TileWindows(WId primary, QString type){ + NativeWindowObject* win = findWindow(primary); + if(type.isEmpty()){ type = "single_max"; } //grab the default arrangement format for tiling + arrangeWindows(win, type); +} + +void NativeWindowSystem::CheckWindowPosition(WId id, bool newwindow){ + //used after a "drop" to validate/snap/re-arrange window(s) as needed + // if "newwindow" is true, then this is the first-placement routine for a window before it initially appears + NativeWindowObject* win = findWindow(id); + if(win==0){ return; } //invalid window + QRect geom = win->geometry(); + bool changed = false; + //Make sure it is on the screen (quick check) + if(geom.x() < 0){ changed = true; geom.moveLeft(0); } + if(geom.y() < 0){ changed = true; geom.moveTop(0); } + if(geom.width() < 20){ changed = true; geom.setWidth(100); } + if(geom.height() < 20){ changed = true; geom.setHeight(100); } + if(changed){ win->setGeometryNow(geom); } + //Now run it through the window arrangement routine + arrangeWindows(win, newwindow ?"center" : "snap", true); +} diff --git a/src-qt5/core/lumina-desktop-unified/src-events/events.pri b/src-qt5/core/lumina-desktop-unified/src-events/events.pri index 3f89fdf2..3f586e8b 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/events.pri +++ b/src-qt5/core/lumina-desktop-unified/src-events/events.pri @@ -5,7 +5,8 @@ LIBS *= -lc -lxcb -lxcb-ewmh -lxcb-icccm -lxcb-image -lxcb-composite -lxcb-damag SOURCES *= $${PWD}/LShortcutEvents.cpp \ $${PWD}/NativeEventFilter.cpp \ $${PWD}/NativeKeyToQt.cpp \ - $${PWD}/NativeWindowSystem.cpp + $${PWD}/NativeWindowSystem.cpp \ + $${PWD}/Window-mgmt.cpp HEADERS *= $${PWD}/LShortcutEvents.h \ -- cgit From f1519a4377b6e553ac4e5c9b307a839ee9f6179a Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Wed, 17 Jan 2018 12:00:08 -0500 Subject: Add a failsafe setting into the 1.4.x lumina-desktop: Ensure that the lumina theme engine is always set in the session environment unless manually replaced/removed in the session settings. --- src-qt5/core/lumina-desktop/LSession.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop/LSession.cpp b/src-qt5/core/lumina-desktop/LSession.cpp index dab30f01..111a17b6 100644 --- a/src-qt5/core/lumina-desktop/LSession.cpp +++ b/src-qt5/core/lumina-desktop/LSession.cpp @@ -346,6 +346,8 @@ void LSession::watcherChange(QString changed){ //qDebug() << "Set Qt5 theme engine: " << engine; if(engine.isEmpty()){ unsetenv("QT_QPA_PLATFORMTHEME"); } else{ setenv("QT_QPA_PLATFORMTHEME", engine.toUtf8().data(),1); } + }else{ + setenv("QT_QPA_PLATFORMTHEME", "lthemeengine",1); //ensure the lumina theme engine is always enabled } emit SessionConfigChanged(); }else if(changed.endsWith("desktopsettings.conf") ){ emit DesktopConfigChanged(); } -- cgit From 8ab77628db56aba8e9295ede63c56d9312e4262a Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Fri, 19 Jan 2018 14:53:04 -0500 Subject: Get some more of Lumina 2 cleaned up: 1. Ensure window visibility is managed on the QML side 2. Have all panels (even ones pinned to a screen) get created by the root window QML (for layering purposes) 3. Change the default panel setting to include partial-transparency --- .../defaults/desktop/panels.conf | 5 ++- .../src-desktop/DesktopManager.cpp | 17 ++++++- .../src-desktop/src-cpp/NativeWindowObject.cpp | 12 +++-- .../src-desktop/src-cpp/NativeWindowObject.h | 4 ++ .../src-desktop/src-cpp/PanelObject.cpp | 22 +++++---- .../src-desktop/src-cpp/RootDesktopObject.cpp | 52 ++++++++++++++-------- .../src-desktop/src-qml/NativeWindow.qml | 3 +- .../src-events/NativeWindowSystem.cpp | 10 ++--- 8 files changed, 84 insertions(+), 41 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/defaults/desktop/panels.conf b/src-qt5/core/lumina-desktop-unified/defaults/desktop/panels.conf index 07cf4635..f0cdc5a4 100644 --- a/src-qt5/core/lumina-desktop-unified/defaults/desktop/panels.conf +++ b/src-qt5/core/lumina-desktop-unified/defaults/desktop/panels.conf @@ -4,8 +4,9 @@ windows/anchor="bottom" windows/align="center" windows/length_percent=100 +windows/width_percent=3 windows/plugins="" -windows/background="rgba(0,0,0,120)" +windows/background="#1A000000" [default] active_ids="initial" @@ -18,4 +19,4 @@ align="center" length_percent=100 width_percent=2.1 plugins="" -background="rgba(0,0,0,120)" +background="#33000000" diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp index bfded781..ad2bc445 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp @@ -153,19 +153,32 @@ void DesktopManager::updateDesktopSettings(){ void DesktopManager::updatePanelSettings(){ QList scrns = QGuiApplication::screens(); int primary = QApplication::desktop()->primaryScreen(); + qDebug() << "Panel Settings Changed:" << primary << scrns.length(); + QStringList total_ids; for(int i=0; iname(); ScreenObject *sObj = RootDesktopObject::instance()->screen(scrns[i]->name()); if(sObj == 0){ continue; } //screen is not managed directly - skip it QStringList ids = DesktopSettings::instance()->value(DesktopSettings::Panels, scrns[i]->name().replace("-","_")+"/active_ids", QStringList()).toStringList(); if(ids.isEmpty() && (scrns.length()==1 || i==primary)){ + //qDebug() << " -- PRIMARY"; //Also look for the "default" panel id's for the primary/default screen ids = DesktopSettings::instance()->value(DesktopSettings::Panels, "default/active_ids", QStringList()).toStringList(); } - sObj->setPanels(ids); + ids.removeAll(""); + //qDebug() << " -- settings:" << ids; + for(int j=0; jname()+"/"+ids[j]; + } } //Now do the global-session panels QStringList ids = DesktopSettings::instance()->value(DesktopSettings::Panels, "session/active_ids", QStringList()).toStringList(); - RootDesktopObject::instance()->setPanels(ids); //put the new ones in place + ids.removeAll(""); + for(int i=0; isetPanels(total_ids); //put the new ones in place } void DesktopManager::updatePluginSettings(){ diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp index 9bb78dd0..e2cac852 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.cpp @@ -242,6 +242,10 @@ bool NativeWindowObject::isSticky(){ return (this->property(NativeWindowObject::Workspace).toInt()<0 || this->property(NativeWindowObject::States).value >().contains(NativeWindowObject::S_STICKY) ); } +bool NativeWindowObject::isVisible(){ + return (this->property(NativeWindowObject::Visible).toBool() ); +} + int NativeWindowObject::workspace(){ return this->property(NativeWindowObject::Workspace).toInt(); } @@ -262,14 +266,13 @@ void NativeWindowObject::updateGeometry(int x, int y, int width, int height, boo if(fgeom.isEmpty()){ fgeom << 0<<0<<0<<0; } //just in case (left/right/top/bottom) QPoint pos(x+fgeom[0], y+fgeom[2]); QSize sz(width-fgeom[0]-fgeom[1], height-fgeom[2]-fgeom[3]); + newgeom = QRect(pos, sz); if(!now){ - newgeom = QRect(pos, sz); //qDebug() << "Update Geometry:" << fgeom << QRect(x,y,width,height) << pos << sz; //requestProperties(QList() << NativeWindowObject::GlobalPos << NativeWindowObject::Size, QList() << pos << sz); if(!geomTimer->isActive()){ geomTimer->start(); } }else{ - requestProperties(QList() << NativeWindowObject::GlobalPos << NativeWindowObject::Size , QList() << pos << sz ); - setProperties(QList() << NativeWindowObject::GlobalPos << NativeWindowObject::Size , QList() << pos << sz ); + sendNewGeom(); } } @@ -311,6 +314,8 @@ void NativeWindowObject::emitSinglePropChanged(NativeWindowObject::Property prop emit winImageChanged(); break; case NativeWindowObject::WinTypes: emit winTypeChanged(); break; + case NativeWindowObject::Visible: + emit visibilityChanged(); break; default: break; //do nothing otherwise } @@ -321,4 +326,5 @@ void NativeWindowObject::sendNewGeom(){ QList vals; vals << newgeom.topLeft() << newgeom.size(); requestProperties(props, vals); setProperties(props,vals); + emit VerifyNewGeometry(winid); } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h index 6a63813e..87df1f10 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h @@ -23,6 +23,7 @@ class NativeWindowObject : public QObject{ Q_PROPERTY( QString shortTitle READ shortTitle NOTIFY shortTitleChanged) Q_PROPERTY( QString icon READ icon NOTIFY iconChanged) Q_PROPERTY( bool sticky READ isSticky NOTIFY stickyChanged) + Q_PROPERTY(bool isVisible READ isVisible NOTIFY visibilityChanged) //Button/Titlebar visibility Q_PROPERTY( bool showCloseButton READ showCloseButton NOTIFY winTypeChanged) Q_PROPERTY( bool showMinButton READ showMinButton NOTIFY winTypeChanged) @@ -109,6 +110,7 @@ public: Q_INVOKABLE bool showWindowFrame(); //QML Window States Q_INVOKABLE bool isSticky(); + Q_INVOKABLE bool isVisible(); Q_INVOKABLE int workspace(); //QML Geometry reporting @@ -150,6 +152,7 @@ signals: void RequestKill(WId); //Kill the window/app (usually from being unresponsive) void RequestPing(WId); //Verify that the window is still active (such as not closing after a request void RequestReparent(WId, WId, QPoint); //client window, frame window, relative origin point in frame + void VerifyNewGeometry(WId); // System Tray Icon Embed/Unembed Requests //void RequestEmbed(WId, QWidget*); //void RequestUnEmbed(WId, QWidget*); @@ -163,6 +166,7 @@ signals: void stickyChanged(); void winTypeChanged(); void geomChanged(); + void visibilityChanged(); }; // Declare the enumerations as Qt MetaTypes diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.cpp index 9054f528..a0f58e71 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.cpp @@ -47,14 +47,15 @@ void PanelObject::setGeometry( QRect newgeom ){ void PanelObject::syncWithSettings(QRect parent_geom){ //Read off all the settings - //qDebug() << "Sync Panel Settings:" << panel_id << parent_geom; - QString anchor = DesktopSettings::instance()->value(DesktopSettings::Panels, panel_id+"/anchor", "bottom").toString().toLower(); - QString align = DesktopSettings::instance()->value(DesktopSettings::Panels, panel_id+"/align", "center").toString().toLower(); - double length = DesktopSettings::instance()->value(DesktopSettings::Panels, panel_id+"/length_percent", 100).toDouble()/100.0; - double width = DesktopSettings::instance()->value(DesktopSettings::Panels, panel_id+"/width_font_percent", 2.1).toDouble(); + QString id = panel_id.section("/",-1); //last section (allow for prefixes to distinguish multiple monitors with the same profile but different screens) + //qDebug() << "Sync Panel Settings:" << panel_id << id << parent_geom; + QString anchor = DesktopSettings::instance()->value(DesktopSettings::Panels, id+"/anchor", "bottom").toString().toLower(); + QString align = DesktopSettings::instance()->value(DesktopSettings::Panels, id+"/align", "center").toString().toLower(); + double length = DesktopSettings::instance()->value(DesktopSettings::Panels, id+"/length_percent", 100).toDouble()/100.0; + double width = DesktopSettings::instance()->value(DesktopSettings::Panels, id+"/width_font_percent", 2.1).toDouble(); width = qRound(width * QApplication::fontMetrics().height() ); - this->setBackground( DesktopSettings::instance()->value(DesktopSettings::Panels, panel_id+"/background", "rgba(0,0,0,120)").toString() ); - // qDebug() << "Update Panel:" << panel_id << anchor+"/"+align << length << width; + this->setBackground( DesktopSettings::instance()->value(DesktopSettings::Panels, id+"/background", "rgba(0,0,0,120)").toString() ); + // qDebug() << "Update Panel:" << panel_id << id << anchor+"/"+align << length << width; //Now calculate the geometry of the panel QRect newgeom; //Figure out the size of the panel @@ -79,6 +80,9 @@ void PanelObject::syncWithSettings(QRect parent_geom){ else if(anchor=="right"){ newgeom.moveTopRight(QPoint(parent_geom.width(), (parent_geom.height()-newgeom.height())/2 )); } else{ newgeom.moveBottomLeft(QPoint( (parent_geom.width()-newgeom.width())/2, parent_geom.height()) ); } } - //qDebug() << " - Calculated Geometry:" << newgeom; - this->setGeometry(newgeom); //Note: This is in parent-relative coordinates (not global) + //qDebug() << " - Calculated Geometry (relative to parent):" << newgeom; + //Note: newgeom is currently in parent-relative coordinates (not global) + newgeom.translate(parent_geom.x(), parent_geom.y()); + //qDebug() << " - Calculated Geometry (global):" << newgeom; + this->setGeometry(newgeom); //shift to global coordinates } 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 07d4e463..a565ef25 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 @@ -95,31 +95,45 @@ void RootDesktopObject::setPanels(QStringList ids){ this->emit changePanels(ids); return; } - + //qDebug() << "GOT PANEL CHANGE:" << ids; //Get the current bounding rectangle for the session QRect total; - for(int i=0; igeometry()); - } - //First update/remove any current panel objects bool change = false; - for(int i=0; iname()) ){ - ids.removeAll(panel_objects[i]->name()); //already handled - panel_objects[i]->syncWithSettings(total); + 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{ - panel_objects.takeAt(i)->deleteLater(); - i--; + 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; iname()) ){ + //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; isyncWithSettings(geom); + panel_objects << tmp; change = true; //list changed } - } - //Now create any new panel objects as needed - for(int i=0; isyncWithSettings(total); - panel_objects << tmp; - change = true; //list changed - } + } //end loop over screens+session if(change){ emit panelsChanged(); } } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml index 2150e37c..19ff4da9 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml @@ -14,10 +14,11 @@ Rectangle { SystemPalette { id:palette } id: windowFrame + visible: object.isVisible border.width: 5 border.color: palette.highlight radius: 5 - color: "transparent" //palette.window + color: palette.window x: object.frameGeometry.x y: object.frameGeometry.y width: object.frameGeometry.width diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp index 063c1337..a3bac808 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp @@ -788,8 +788,6 @@ void NativeWindowSystem::NewWindowDetected(WId id){ win->setProperty(NativeWindowObject::FrameExtents, QVariant::fromValue >( QList() << 5 << 5 << 30 << 5 )); } qDebug() << "New Window [& associated ID's]:" << win->id() << win->property(NativeWindowObject::Name).toString(); - SetupNewWindow(win); - CheckWindowPosition(id, true); //first time placement //Now setup the connections with this window connect(win, SIGNAL(RequestClose(WId)), this, SLOT(RequestClose(WId)) ); connect(win, SIGNAL(RequestKill(WId)), this, SLOT(RequestKill(WId)) ); @@ -797,6 +795,8 @@ void NativeWindowSystem::NewWindowDetected(WId id){ connect(win, SIGNAL(RequestReparent(WId, WId, QPoint)), this, SLOT(RequestReparent(WId, WId, QPoint)) ); connect(win, SIGNAL(RequestPropertiesChange(WId, QList, QList)), this, SLOT(RequestPropertiesChange(WId, QList, QList)) ); connect(win, SIGNAL(VerifyNewGeometry(WId)), this, SLOT(CheckWindowPosition(WId)) ); + SetupNewWindow(win); + CheckWindowPosition(id, true); //first time placement xcb_map_window(QX11Info::connection(), win->id()); emit NewWindowAvailable(win); } @@ -831,22 +831,22 @@ void NativeWindowSystem::NewTrayWindowDetected(WId id){ void NativeWindowSystem::WindowCloseDetected(WId id){ NativeWindowObject *win = findWindow(id, false); + if(win==0){ win = findWindow(id, true); } //qDebug() << "Got Window Closed" << id << win; //qDebug() << "Old Window List:" << NWindows.length(); if(win!=0){ NWindows.removeAll(win); - //RequestReparent(id, QX11Info::appRootWindow(), QPoint(0,0)); win->emit WindowClosed(id); //qDebug() << "Visible Window Closed!!!"; - //win->deleteLater(); emit WindowClosed(); + win->deleteLater(); }else{ win = findTrayWindow(id); if(win!=0){ TWindows.removeAll(win); win->emit WindowClosed(id); - win->deleteLater(); emit TrayWindowClosed(); + win->deleteLater(); } } //qDebug() << " - Now:" << NWindows.length(); -- cgit From 0f7272f3bf78e65103a6a3448ea155b28e00aad2 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Fri, 19 Jan 2018 15:29:36 -0500 Subject: a Couple more minor tweaks. Have lumina-textedit treat .qml as javascript for syntax highlighting --- .../lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml | 9 ++++++++- .../lumina-desktop-unified/src-events/NativeWindowSystem.cpp | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml index 19ff4da9..67d4b748 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml @@ -18,7 +18,7 @@ Rectangle { border.width: 5 border.color: palette.highlight radius: 5 - color: palette.window + color: palette.window //"transparent" x: object.frameGeometry.x y: object.frameGeometry.y width: object.frameGeometry.width @@ -202,6 +202,13 @@ Rectangle { anchors.bottomMargin: windowFrame.border.width width: parent.width height: parent.height + //color: palette.window + + //Image { + //anchors.fill: frameContents + //cache: false + //source: windowFrame.object.winImage + //} MouseArea { width: parent.width diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp index a3bac808..4a2e3545 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp @@ -629,9 +629,10 @@ void NativeWindowSystem::SetupNewWindow(NativeWindowObject *win){ } QImage NativeWindowSystem::GetWindowImage(NativeWindowObject* win){ - QImage img; //qDebug() << "Update Window Image:" << win->name(); QRect geom(QPoint(0,0), win->property(NativeWindowObject::Size).toSize()); + QImage img; //(geom.width(), geom.height(), QImage::Format_ARGB32); + //img.fill(QGuiApplication::palette().window()); if(DISABLE_COMPOSITING){ QList screens = static_cast( QApplication::instance() )->screens(); if(!screens.isEmpty()){ -- cgit From 21e61d5ed001a3859edd30c43e34304f53b6235f Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Wed, 24 Jan 2018 15:30:30 -0500 Subject: Add a quick 10-second failover timer to LScreensaver: This will do a quick probe of the mouse position to ensure it has/not moved just in case we missed the events. --- .../lumina-desktop-unified/src-screensaver/LScreenSaver.cpp | 12 ++++++++++++ .../lumina-desktop-unified/src-screensaver/LScreenSaver.h | 4 +++- 2 files changed, 15 insertions(+), 1 deletion(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.cpp b/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.cpp index a0edde9f..bd812744 100644 --- a/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.cpp @@ -17,6 +17,8 @@ LScreenSaver::LScreenSaver() : QWidget(0,Qt::BypassWindowManagerHint | Qt::Windo locktimer->setSingleShot(true); hidetimer = new QTimer(this); hidetimer->setSingleShot(true); + mouseCheckTimer = new QTimer(this); + mouseCheckTimer->setInterval(10000); //10 seconds - fallback timer for mouse movement detection LOCKER = new LLockScreen(this); LOCKER->hide(); @@ -27,6 +29,7 @@ LScreenSaver::LScreenSaver() : QWidget(0,Qt::BypassWindowManagerHint | Qt::Windo connect(starttimer, SIGNAL(timeout()), this, SLOT(ShowScreenSaver()) ); connect(locktimer, SIGNAL(timeout()), this, SLOT(LockScreen()) ); connect(hidetimer, SIGNAL(timeout()), this, SLOT(HideLockScreen()) ); + connect(mouseCheckTimer, SIGNAL(timeout()), this, SLOT(checkMousePosition()) ); connect(LOCKER, SIGNAL(ScreenUnlocked()), this, SLOT(SSFinished()) ); connect(LOCKER, SIGNAL(InputDetected()), this, SLOT(newInputEvent()) ); } @@ -56,6 +59,7 @@ void LScreenSaver::UpdateTimers(){ void LScreenSaver::start(){ reloadSettings(); //setup all the initial time frames starttimer->start(); + mouseCheckTimer->start(); } void LScreenSaver::reloadSettings(){ @@ -76,6 +80,7 @@ void LScreenSaver::newInputEvent(){ //Only running, not locked HideScreenSaver(); } + lastMousePos = QCursor::pos(); //update the internal point UpdateTimers(); } @@ -87,6 +92,13 @@ void LScreenSaver::LockScreenNow(){ // =========== // PRIVATE SLOTS // =========== +void LScreenSaver::checkMousePosition(){ + QPoint pos = QCursor::pos(); + if(pos != lastMousePos){ + newInputEvent(); //this will update the internal position automatically + } +} + void LScreenSaver::ShowScreenSaver(){ if(DEBUG){ qDebug() << "Showing Screen Saver:" << QDateTime::currentDateTime().toString(); } //QApplication::setOverrideCursor(QCursor::BlankCursor); diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.h index 2276fb6d..eec42481 100644 --- a/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.h +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.h @@ -21,9 +21,10 @@ public: bool isLocked(); private: - QTimer *starttimer, *locktimer, *hidetimer; + QTimer *starttimer, *locktimer, *hidetimer, *mouseCheckTimer; QList BASES; LLockScreen *LOCKER; + QPoint lastMousePos; int cBright; bool SSRunning, SSLocked, updating; @@ -36,6 +37,7 @@ public slots: void LockScreenNow(); private slots: + void checkMousePosition(); void ShowScreenSaver(); void ShowLockScreen(); void HideScreenSaver(); -- cgit From 06622b28748bcf07ffe75ac9427e4a00373e99d7 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Mon, 29 Jan 2018 14:19:45 -0500 Subject: Some more updates for Lumina 2: Almost have the transparent windows getting layered properly. --- .../src-desktop/src-cpp/RootDesktopObject.cpp | 17 ++++++++++++++++- .../src-desktop/src-cpp/RootDesktopObject.h | 1 + .../src-desktop/src-qml/NativeWindow.qml | 3 +++ .../src-events/NativeWindowSystem.cpp | 11 +++++++++++ .../src-events/NativeWindowSystem.h | 3 +++ 5 files changed, 34 insertions(+), 1 deletion(-) (limited to 'src-qt5/core') 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 07d4e463..8540f44e 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,7 +8,7 @@ #include #include #include - +#include #include // === PUBLIC === @@ -138,6 +138,21 @@ void RootDesktopObject::lockscreen(){ void RootDesktopObject::mousePositionChanged(){ 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]; + } + return; //found the currently-hovered window + } + } + //failover for when no window has the mouse over it (lower all of them) + if(last_window_up!=0){ Lumina::NWS->lowerWindow(last_window_up); } } void RootDesktopObject::launchApp(QString appOrPath){ diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h index ad0e538b..b1ca6f7e 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h @@ -47,6 +47,7 @@ private: QList s_objects; QList panel_objects; QList window_objects; + QPointer last_window_up; public slots: void updateScreens(); //rescan/update screen objects diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml index 2150e37c..a0bd36f4 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml @@ -207,6 +207,9 @@ Rectangle { height: parent.height anchors.fill: frameContents onClicked: { console.log(parent.mapToGlobal(mouse.x, mouse.y)); } + onPositionChanged: { + RootObject.mousePositionChanged() + } } } } diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp index 063c1337..3d6b0f3e 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp @@ -962,6 +962,17 @@ void NativeWindowSystem::CheckDamageID(WId win){ } } +void NativeWindowSystem::raiseWindow(NativeWindowObject *win){ + qDebug() << "Raise Window:" << win->name(); + xcb_circulate_window(QX11Info::connection(), XCB_CIRCULATE_RAISE_LOWEST ,win->id()); +} + + +void NativeWindowSystem::lowerWindow(NativeWindowObject *win){ + qDebug() << "Lower Window:" << win->name(); + xcb_circulate_window(QX11Info::connection(), XCB_CIRCULATE_LOWER_HIGHEST ,win->id()); +} + // === PRIVATE SLOTS === //These are the slots which are built-in and automatically connected when a new NativeWindow is created diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h index 5810fc36..74849cf4 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h @@ -80,6 +80,9 @@ public: static Qt::Key KeycodeToQt(int keycode); static NativeWindowSystem::MouseButton MouseToQt(int button); + void raiseWindow(NativeWindowObject *win); + void lowerWindow(NativeWindowObject *win); + public slots: //These are the slots which are typically only used by the desktop system itself or the NativeWindowEventFilter -- cgit From 331107f04943e5719b3d66e31b9dd9d4c78319b8 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Mon, 29 Jan 2018 15:09:37 -0500 Subject: Couple more minor tweaks - trying to get the layering working properly. --- .../src-desktop/src-cpp/RootDesktopObject.cpp | 10 +++++++--- .../src-desktop/src-cpp/RootDesktopObject.h | 2 +- .../lumina-desktop-unified/src-events/NativeWindowSystem.cpp | 6 ++++-- 3 files changed, 12 insertions(+), 6 deletions(-) (limited to 'src-qt5/core') 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 254a67ac..523fa09f 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 @@ -13,6 +13,7 @@ // === 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)) ); } @@ -140,6 +141,7 @@ void RootDesktopObject::setPanels(QStringList ids){ void RootDesktopObject::setWindows(QList list){ window_objects = list; emit windowsChanged(); + mousePositionChanged(true); } void RootDesktopObject::logout(){ @@ -150,7 +152,7 @@ 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 @@ -162,11 +164,13 @@ void RootDesktopObject::mousePositionChanged(){ Lumina::NWS->raiseWindow(window_objects[i]); last_window_up = window_objects[i]; } - return; //found the currently-hovered window + 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){ Lumina::NWS->lowerWindow(last_window_up); } + if(last_window_up!=0 && !lowerall){ Lumina::NWS->lowerWindow(last_window_up); } } void RootDesktopObject::launchApp(QString appOrPath){ diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h index b1ca6f7e..cc70f813 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h @@ -40,7 +40,7 @@ public: //QML Access Functions Q_INVOKABLE void logout(); Q_INVOKABLE void lockscreen(); - Q_INVOKABLE void mousePositionChanged(); + Q_INVOKABLE void mousePositionChanged(bool lowerall = false); Q_INVOKABLE void launchApp(QString appOrPath); private: diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp index 28c223ab..494b63c3 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp @@ -779,8 +779,10 @@ void NativeWindowSystem::NewWindowDetected(WId id){ if(attr == 0){ return; } //could not get attributes of window if(attr->override_redirect){ free(attr); return; } //window has override redirect set (do not manage) free(attr); + xcb_reparent_window(QX11Info::connection(), id, QX11Info::appRootWindow(), 0, 0); //Now go ahead and create/populate the container for this window NativeWindowObject *win = new NativeWindowObject(id); + //Register for events from this window registerClientEvents(win->id()); NWindows << win; @@ -964,13 +966,13 @@ void NativeWindowSystem::CheckDamageID(WId win){ } void NativeWindowSystem::raiseWindow(NativeWindowObject *win){ - qDebug() << "Raise Window:" << win->name(); + qDebug() << "Raise Window:" << win->name() << win->id(); xcb_circulate_window(QX11Info::connection(), XCB_CIRCULATE_RAISE_LOWEST ,win->id()); } void NativeWindowSystem::lowerWindow(NativeWindowObject *win){ - qDebug() << "Lower Window:" << win->name(); + qDebug() << "Lower Window:" << win->name() << win->id(); xcb_circulate_window(QX11Info::connection(), XCB_CIRCULATE_LOWER_HIGHEST ,win->id()); } -- cgit From 7631c2f6f6a76324b89517ce32a3f41c37bd4e61 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Mon, 29 Jan 2018 18:22:06 -0500 Subject: Make sure that the desktop canvas is always 2nd from the top of the stack of invisible windows. --- src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h | 2 ++ src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp | 2 ++ 2 files changed, 4 insertions(+) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h index 9cf42f3c..97b57a65 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h @@ -22,6 +22,8 @@ public: void start(); + WId viewID(){ return root_view->winId(); } + public slots: void syncRootSize(); diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp index 28c223ab..e23050f3 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp @@ -965,6 +965,8 @@ void NativeWindowSystem::CheckDamageID(WId win){ void NativeWindowSystem::raiseWindow(NativeWindowObject *win){ qDebug() << "Raise Window:" << win->name(); + //Note: Always ensure the desktop canvas is right under the main window that is raised + xcb_circulate_window(QX11Info::connection(), XCB_CIRCULATE_RAISE_LOWEST, Lumina::ROOTWIN->viewID()); xcb_circulate_window(QX11Info::connection(), XCB_CIRCULATE_RAISE_LOWEST ,win->id()); } -- cgit From fc138f1492c0275215327cfe698587916107b69f Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Tue, 30 Jan 2018 05:49:30 -0500 Subject: A few couple other attempts at the layering issue. Tie-in the new OSInterface class to the QML data store (RootObject). This will allow the new system status functions to be accessible to the QML interface. --- src-qt5/core/lumina-desktop-unified/LSession.cpp | 12 +++++++++++- src-qt5/core/lumina-desktop-unified/LSession.h | 3 +++ src-qt5/core/lumina-desktop-unified/global-includes.h | 1 + .../core/lumina-desktop-unified/src-desktop/RootWindow.cpp | 6 ++++-- src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h | 2 +- .../src-desktop/src-cpp/RootDesktopObject.cpp | 5 +++++ .../src-desktop/src-cpp/RootDesktopObject.h | 3 +++ .../src-desktop/src-qml/RootDesktop.qml | 6 +++--- 8 files changed, 31 insertions(+), 7 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/LSession.cpp b/src-qt5/core/lumina-desktop-unified/LSession.cpp index 69c42c73..dcd1688f 100644 --- a/src-qt5/core/lumina-desktop-unified/LSession.cpp +++ b/src-qt5/core/lumina-desktop-unified/LSession.cpp @@ -31,6 +31,7 @@ LSession::LSession(int &argc, char ** argv) : LSingleApplication(argc, argv, "lu qRegisterMetaType< NativeWindowSystem::MouseButton >("NativeWindowSystem::MouseButton"); mediaObj = 0; //private object used for playing login/logout chimes + OSThread = 0; if(this->isPrimaryProcess()){ //Setup the global registrations qsrand(QDateTime::currentMSecsSinceEpoch()); @@ -57,7 +58,9 @@ LSession::LSession(int &argc, char ** argv) : LSingleApplication(argc, argv, "lu Lumina::APPLIST = XDGDesktopList::instance(); Lumina::ROOTWIN = new RootWindow(); Lumina::SHORTCUTS = new LShortcutEvents(); //this can be moved to it's own thread eventually as well - + OSThread = new QThread(); + OSInterface::instance()->moveToThread(OSThread); + OSThread->start(); setupGlobalConnections(); } //end check for primary process } @@ -75,6 +78,12 @@ LSession::~LSession(){ if(Lumina::ROOTWIN!=0){ Lumina::ROOTWIN->deleteLater(); } if(Lumina::APPLIST!=0){ Lumina::APPLIST->deleteLater(); } if(Lumina::DESKMAN!=0){ Lumina::DESKMAN->deleteLater(); } + if(OSInterface::instance()->isRunning()){ OSInterface::instance()->stop(); } + OSInterface::instance()->deleteLater(); + if(OSThread!=0){ + if(OSThread->isRunning()){ OSThread->quit(); } + OSThread->deleteLater(); + } } void LSession::setupSession(){ @@ -108,6 +117,7 @@ void LSession::setupSession(){ //checkUserFiles(); //adds these files to the watcher as well Lumina::NWS->setRoot_numberOfWorkspaces(QStringList() << "one" << "two"); Lumina::NWS->setRoot_currentWorkspace(0); + if(!OSInterface::instance()->isRunning()){ OSInterface::instance()->start(); } Lumina::DESKMAN->start(); Lumina::ROOTWIN->start(); diff --git a/src-qt5/core/lumina-desktop-unified/LSession.h b/src-qt5/core/lumina-desktop-unified/LSession.h index 61da559b..2735502d 100644 --- a/src-qt5/core/lumina-desktop-unified/LSession.h +++ b/src-qt5/core/lumina-desktop-unified/LSession.h @@ -28,6 +28,9 @@ private: QTranslator *currTranslator; + //Extra background threads for individual objects + QThread *OSThread; //OSInterface thread + public slots: void setupSession(); //called during startup only diff --git a/src-qt5/core/lumina-desktop-unified/global-includes.h b/src-qt5/core/lumina-desktop-unified/global-includes.h index 2ca8af15..6a82775b 100644 --- a/src-qt5/core/lumina-desktop-unified/global-includes.h +++ b/src-qt5/core/lumina-desktop-unified/global-includes.h @@ -72,6 +72,7 @@ #include #include #include +#include // C++ Backend classes for QML interface #include diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp index 2ceff4a0..83c15601 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp @@ -9,8 +9,8 @@ #include RootWindow::RootWindow() : QObject(){ - root_win = QWindow::fromWinId( QX11Info::appRootWindow() ); // - root_view = new QQuickView(root_win); //make it a child of the root window + root_win = QWindow::fromWinId( QX11Info::appRootWindow() ); + root_view = new QQuickView(new QWindow()); //make it a child of the root window root_obj = RootDesktopObject::instance(); syncRootSize(); connect(root_win, SIGNAL(widthChanged(int)), this, SLOT(syncRootSize()) ); @@ -31,6 +31,7 @@ RootWindow::~RootWindow(){ void RootWindow::start(){ root_view->setSource(QUrl("qrc:///qml/RootDesktop.qml")); root_win->show(); + root_view->parent()->show(); root_view->show(); } @@ -40,6 +41,7 @@ void RootWindow::syncRootSize(){ QRect unif; for(int i=0; igeometry()); } if(unif.width() != root_view->width() || unif.height() != root_view->height()){ + root_view->parent()->setGeometry(0,0,unif.width(), unif.height()); root_view->setGeometry(0, 0, unif.width(), unif.height() ); emit RootResized(root_view->geometry()); } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h index 97b57a65..0e48c000 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h @@ -22,7 +22,7 @@ public: void start(); - WId viewID(){ return root_view->winId(); } + WId viewID(){ return root_view->parent()->winId(); } public slots: void syncRootSize(); 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 523fa09f..e1960ba0 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 @@ -30,6 +30,7 @@ void RootDesktopObject::RegisterType(){ //Also register any types that are needed by this class ScreenObject::RegisterType(); NativeWindowObject::RegisterType(); + OSInterface::RegisterType(); } RootDesktopObject* RootDesktopObject::instance(){ @@ -84,6 +85,10 @@ NativeWindowObject* RootDesktopObject::window(QString id){ return 0; } +OSInterface* RootDesktopObject::os_interface(){ + return OSInterface::instance(); +} + void RootDesktopObject::setPanels(QList list){ panel_objects = list; emit panelsChanged(); diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h index cc70f813..f9852e11 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h @@ -37,6 +37,9 @@ public: Q_INVOKABLE QStringList windows(); Q_INVOKABLE NativeWindowObject* window(QString id); + //QML Globals Access + Q_INVOKABLE OSInterface* os_interface(); + //QML Access Functions Q_INVOKABLE void logout(); Q_INVOKABLE void lockscreen(); diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/RootDesktop.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/RootDesktop.qml index f48f7751..ddb2a490 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/RootDesktop.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/RootDesktop.qml @@ -34,9 +34,9 @@ Rectangle { anchors.fill: rootCanvas acceptedButtons: Qt.RightButton onClicked: { - /*contextMenu.x = mouseX - contextMenu.y = mouseY - contextMenu.open() */ + //contextMenu.x = mouseX + //contextMenu.y = mouseY + //contextMenu.open() contextMenu.popup() } onPositionChanged: { -- cgit From 8b1cdec37e58d606a16ecb7539f72b092a3e2e16 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Tue, 30 Jan 2018 13:21:58 -0500 Subject: Start putting the new statusTray plugin together. The networking status button is working now, need to finish the others. --- src-qt5/core/lumina-desktop-unified/LSession.cpp | 10 +---- src-qt5/core/lumina-desktop-unified/LSession.h | 2 +- .../src-desktop/src-qml/Panel.qml | 17 +++++++- .../src-desktop/src-qml/plugins/StatusTray.qml | 49 ++++++++++++++++++++++ .../src-desktop/src-qml/plugins/plugins.pri | 9 ++++ .../src-qml/plugins/status_tray/BatteryButton.qml | 12 ++++++ .../src-qml/plugins/status_tray/NetworkButton.qml | 23 ++++++++++ .../src-qml/plugins/status_tray/TrayIcon.qml | 13 ++++++ .../src-qml/plugins/status_tray/VolumeButton.qml | 13 ++++++ .../src-desktop/src-qml/src-qml.pri | 1 + .../src-desktop/src-qml/src-qml.qrc | 5 +++ 11 files changed, 143 insertions(+), 11 deletions(-) create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/plugins.pri create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/NetworkButton.qml create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/TrayIcon.qml create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/VolumeButton.qml (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/LSession.cpp b/src-qt5/core/lumina-desktop-unified/LSession.cpp index dcd1688f..1c103fab 100644 --- a/src-qt5/core/lumina-desktop-unified/LSession.cpp +++ b/src-qt5/core/lumina-desktop-unified/LSession.cpp @@ -31,7 +31,6 @@ LSession::LSession(int &argc, char ** argv) : LSingleApplication(argc, argv, "lu qRegisterMetaType< NativeWindowSystem::MouseButton >("NativeWindowSystem::MouseButton"); mediaObj = 0; //private object used for playing login/logout chimes - OSThread = 0; if(this->isPrimaryProcess()){ //Setup the global registrations qsrand(QDateTime::currentMSecsSinceEpoch()); @@ -58,9 +57,6 @@ LSession::LSession(int &argc, char ** argv) : LSingleApplication(argc, argv, "lu Lumina::APPLIST = XDGDesktopList::instance(); Lumina::ROOTWIN = new RootWindow(); Lumina::SHORTCUTS = new LShortcutEvents(); //this can be moved to it's own thread eventually as well - OSThread = new QThread(); - OSInterface::instance()->moveToThread(OSThread); - OSThread->start(); setupGlobalConnections(); } //end check for primary process } @@ -80,10 +76,6 @@ LSession::~LSession(){ if(Lumina::DESKMAN!=0){ Lumina::DESKMAN->deleteLater(); } if(OSInterface::instance()->isRunning()){ OSInterface::instance()->stop(); } OSInterface::instance()->deleteLater(); - if(OSThread!=0){ - if(OSThread->isRunning()){ OSThread->quit(); } - OSThread->deleteLater(); - } } void LSession::setupSession(){ @@ -117,7 +109,7 @@ void LSession::setupSession(){ //checkUserFiles(); //adds these files to the watcher as well Lumina::NWS->setRoot_numberOfWorkspaces(QStringList() << "one" << "two"); Lumina::NWS->setRoot_currentWorkspace(0); - if(!OSInterface::instance()->isRunning()){ OSInterface::instance()->start(); } + OSInterface::instance()->start(); Lumina::DESKMAN->start(); Lumina::ROOTWIN->start(); diff --git a/src-qt5/core/lumina-desktop-unified/LSession.h b/src-qt5/core/lumina-desktop-unified/LSession.h index 2735502d..fb4bf29f 100644 --- a/src-qt5/core/lumina-desktop-unified/LSession.h +++ b/src-qt5/core/lumina-desktop-unified/LSession.h @@ -29,7 +29,7 @@ private: QTranslator *currTranslator; //Extra background threads for individual objects - QThread *OSThread; //OSInterface thread + public slots: void setupSession(); //called during startup only diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml index 556da5ec..44abb425 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml @@ -7,8 +7,10 @@ import QtQuick 2.2 import QtQuick.Window 2.2 import QtQuick.Controls 1 +import QtQuick.Layouts 1.3 import Lumina.Backend.PanelObject 2.0 +import "./plugins" as PLUGINS Rectangle { //C++ backend object @@ -21,4 +23,17 @@ Rectangle { y: object.y width: object.width height: object.height - } + + GridLayout{ + id: layout + anchors.fill: parent; + columns: (object.width>object.height) ? -1 : 1 + rows: (object.width>object.height) ? 1 : -1 + + //hardcode the "status_tray" plugin at the moment + PLUGINS.StatusTray{ + id: "statustray" + } + } + +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml new file mode 100644 index 00000000..4552ea39 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml @@ -0,0 +1,49 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +// This is the QML plugin that displays the OS status/system tray +//=========================================== +import QtQuick 2.2 +import QtQuick.Layouts 1.3 + +import "./status_tray" as QML + + +Rectangle { + property int prefsize: (parent.width < parent.height) ? parent.width : parent.height + id: "status_tray" + //color: "transparent" + Layout.fillHeight: true + Layout.fillWidth: true + + GridLayout{ + anchors.fill: parent + flow: GridLayout.LeftToRight + columnSpacing: 2 + rowSpacing: 2 + + //Volume Status + QML.VolumeButton{ + id: "volButton" + Layout.preferredHeight: status_tray.prefsize + Layout.preferredWidth: status_tray.prefsize + } + //Network Status + QML.NetworkButton{ + Layout.preferredHeight: status_tray.prefsize + Layout.preferredWidth: status_tray.prefsize + } + //Battery Status + QML.BatteryButton{ + id: "batButton" + Layout.preferredHeight: status_tray.prefsize + Layout.preferredWidth: status_tray.prefsize + } + //System Tray Menu Popup + + } //end of layout + +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/plugins.pri b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/plugins.pri new file mode 100644 index 00000000..36cc581b --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/plugins.pri @@ -0,0 +1,9 @@ +#Show the QML files to lupdate for translation purposes - not for the actual build +lupdate_only{ + SOURCES *= $${PWD}/StatusTray.qml \ + $${PWD}/status_tray/TrayIcon.qml \ + $${PWD}/status_tray/VolumeButton.qml \ + $${PWD}/status_tray/NetworkButton.qml \ + $${PWD}/status_tray/BatteryButton.qml + +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml new file mode 100644 index 00000000..0963165d --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml @@ -0,0 +1,12 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +import QtQuick 2.2 +import QtQuick.Controls 2 + +Rectangle{ + color: "red" +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/NetworkButton.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/NetworkButton.qml new file mode 100644 index 00000000..387c130b --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/NetworkButton.qml @@ -0,0 +1,23 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +import QtQuick 2.2 +import QtQuick.Controls 1 + +import Lumina.Backend.RootDesktopObject 2.0 +import Lumina.Backend.OSInterface 2.0 + +ToolButton{ + id: "netButton" + property OSInterface os: RootObject.os_interface() + iconName: os.networkIcon + tooltip: os.networkStatus + visible: os.networkAvailable + enabled: os.hasNetworkManager() + onClicked: { + RootObject.launchApplication(os.networkManagerUtility()) + } +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/TrayIcon.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/TrayIcon.qml new file mode 100644 index 00000000..4207b156 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/TrayIcon.qml @@ -0,0 +1,13 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +import QtQuick 2.2 +import QtQuick.Controls 2 +import Lumina.Backend.NativeWindowObject 2.0 + +Rectangle{ + color: "white" +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/VolumeButton.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/VolumeButton.qml new file mode 100644 index 00000000..43992fc4 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/VolumeButton.qml @@ -0,0 +1,13 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +import QtQuick 2.2 +import QtQuick.Controls 1 + +ToolButton{ + text: "volume" + tooltip: "volume" +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.pri b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.pri index 79941b82..fa29aa96 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.pri +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.pri @@ -6,5 +6,6 @@ lupdate_only{ $${PWD}/Panel.qml \ $${PWD}/NativeWindow.qml } +include(plugins/plugins.pri) RESOURCES *= $${PWD}/src-qml.qrc diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc index a4dc414f..ba143027 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc @@ -5,5 +5,10 @@ Screen.qml Panel.qml NativeWindow.qml + plugins/StatusTray.qml + plugins/status_tray/TrayIcon.qml + plugins/status_tray/VolumeButton.qml + plugins/status_tray/NetworkButton.qml + plugins/status_tray/BatteryButton.qml -- cgit From ff713a8605f39d95ce2d3cfd2c17f892539d0f5a Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Tue, 30 Jan 2018 16:57:34 -0500 Subject: Get the Battery notification button put together. --- .../src-desktop/src-qml/plugins/StatusTray.qml | 3 +-- .../src-qml/plugins/status_tray/BatteryButton.qml | 14 +++++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml index 4552ea39..8f2239b9 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml @@ -15,7 +15,7 @@ import "./status_tray" as QML Rectangle { property int prefsize: (parent.width < parent.height) ? parent.width : parent.height id: "status_tray" - //color: "transparent" + color: "transparent" Layout.fillHeight: true Layout.fillWidth: true @@ -38,7 +38,6 @@ Rectangle { } //Battery Status QML.BatteryButton{ - id: "batButton" Layout.preferredHeight: status_tray.prefsize Layout.preferredWidth: status_tray.prefsize } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml index 0963165d..8ceec2d4 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml @@ -5,8 +5,16 @@ // See the LICENSE file for full details //=========================================== import QtQuick 2.2 -import QtQuick.Controls 2 +import QtQuick.Controls 1 -Rectangle{ - color: "red" +import Lumina.Backend.RootDesktopObject 2.0 +import Lumina.Backend.OSInterface 2.0 + +ToolButton{ + property OSInterface os: RootObject.os_interface() + id: "batButton" + iconName: os.icon + tooltip: os.batteryCharge+"%: "+os.batteryRemaining + visible: os.batteryAvailable() + enabled: false } -- cgit From c18d3e92c8ee7fa3c4afc01d1a4952583eef6246 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Wed, 31 Jan 2018 08:55:03 -0500 Subject: Get the volume button/backend functional. --- .../src-desktop/src-qml/plugins/StatusTray.qml | 1 - .../src-qml/plugins/status_tray/BatteryButton.qml | 2 +- .../src-desktop/src-qml/plugins/status_tray/TrayIcon.qml | 1 + .../src-qml/plugins/status_tray/VolumeButton.qml | 16 ++++++++++++++-- 4 files changed, 16 insertions(+), 4 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml index 8f2239b9..254ffff2 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml @@ -27,7 +27,6 @@ Rectangle { //Volume Status QML.VolumeButton{ - id: "volButton" Layout.preferredHeight: status_tray.prefsize Layout.preferredWidth: status_tray.prefsize } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml index 8ceec2d4..38ed6a64 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml @@ -13,7 +13,7 @@ import Lumina.Backend.OSInterface 2.0 ToolButton{ property OSInterface os: RootObject.os_interface() id: "batButton" - iconName: os.icon + iconName: os.batteryIcon tooltip: os.batteryCharge+"%: "+os.batteryRemaining visible: os.batteryAvailable() enabled: false diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/TrayIcon.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/TrayIcon.qml index 4207b156..8b8367b0 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/TrayIcon.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/TrayIcon.qml @@ -6,6 +6,7 @@ //=========================================== import QtQuick 2.2 import QtQuick.Controls 2 + import Lumina.Backend.NativeWindowObject 2.0 Rectangle{ diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/VolumeButton.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/VolumeButton.qml index 43992fc4..e98a2603 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/VolumeButton.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/VolumeButton.qml @@ -7,7 +7,19 @@ import QtQuick 2.2 import QtQuick.Controls 1 +import Lumina.Backend.RootDesktopObject 2.0 +import Lumina.Backend.OSInterface 2.0 + ToolButton{ - text: "volume" - tooltip: "volume" + property OSInterface os: RootObject.os_interface() + id: "volButton" + iconName: os.volumeIcon + tooltip: os.volume+"%" + visible: os.volumeSupported() + enabled: os.hasAudioMixer() + //Simple launch of mixer at the moment - make this popup a menu later + onClicked: { + RootObject.launchApplication( os.audioMixerShortcut() ) + } + } -- cgit From 4a2a6f3af5dab7effdb7c512e8b03adf2724b401 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Wed, 31 Jan 2018 12:04:36 -0500 Subject: Get a lot more cache system setup for OSInterface backend. Add a new "UpdateButton" to the StatusTray plugin. --- .../src-desktop/src-qml/plugins/StatusTray.qml | 5 +++++ .../src-desktop/src-qml/plugins/plugins.pri | 3 ++- .../src-qml/plugins/status_tray/TrayIcon.qml | 17 ++++++++++++--- .../src-qml/plugins/status_tray/UpdateButton.qml | 24 ++++++++++++++++++++++ .../src-desktop/src-qml/src-qml.qrc | 1 + 5 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/UpdateButton.qml (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml index 254ffff2..e1e7cd10 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml @@ -40,6 +40,11 @@ Rectangle { Layout.preferredHeight: status_tray.prefsize Layout.preferredWidth: status_tray.prefsize } + //Update Status + QML.UpdateButton{ + Layout.preferredHeight: status_tray.prefsize + Layout.preferredWidth: status_tray.prefsize + } //System Tray Menu Popup } //end of layout diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/plugins.pri b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/plugins.pri index 36cc581b..50eb9c5c 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/plugins.pri +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/plugins.pri @@ -4,6 +4,7 @@ lupdate_only{ $${PWD}/status_tray/TrayIcon.qml \ $${PWD}/status_tray/VolumeButton.qml \ $${PWD}/status_tray/NetworkButton.qml \ - $${PWD}/status_tray/BatteryButton.qml + $${PWD}/status_tray/BatteryButton.qml \ + $${PWD}/status_tray/UpdateButton.qml } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/TrayIcon.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/TrayIcon.qml index 8b8367b0..26c50907 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/TrayIcon.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/TrayIcon.qml @@ -5,10 +5,21 @@ // See the LICENSE file for full details //=========================================== import QtQuick 2.2 -import QtQuick.Controls 2 +import QtQuick.Controls 1 import Lumina.Backend.NativeWindowObject 2.0 -Rectangle{ - color: "white" +Image{ + property NativeWindowObject winObj + source: winObj.icon + + MouseArea{ + anchors.fill: parent + acceptedButtons: Qt.NoButton + onEntered: { + //Need to ensure the invisible native window is over this place right now + point pt: parent.mapToGlobal(0,0) + winObj.updateGeometry( pt.x(), pt.y(), parent.width(), parent.height(), true); + } + } } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/UpdateButton.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/UpdateButton.qml new file mode 100644 index 00000000..881f164f --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/UpdateButton.qml @@ -0,0 +1,24 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +import QtQuick 2.2 +import QtQuick.Controls 1 + +import Lumina.Backend.RootDesktopObject 2.0 +import Lumina.Backend.OSInterface 2.0 + +ToolButton{ + id: "updateButton" + property OSInterface os: RootObject.os_interface() + iconName: os.updateIcon + tooltip: os.networkStatus + visible: (os.updateStatus == "") + /*enabled: os.hasUpdateManager() + onClicked: { + RootObject.launchApplication(os.updateManagerUtility()) + }*/ + //TODO - add a menu with update manager and start/view updates options +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc index ba143027..1da9d5bd 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc @@ -10,5 +10,6 @@ plugins/status_tray/VolumeButton.qml plugins/status_tray/NetworkButton.qml plugins/status_tray/BatteryButton.qml + plugins/status_tray/UpdateButton.qml -- cgit From 5a287a1132e787ded443c5fe954d7834447d705a Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Wed, 31 Jan 2018 15:40:09 -0500 Subject: Another large batch of work on Lumina 2. 1. Bypass a Qt bug in multi-session "DISPLAY" number detection 2. Start getting the system tray all setup. Not quite there yet (still some QML issues) 3. Convert all the Menu's to QtControls2 (actually works on multiple screens) --- src-qt5/core/libLumina/LuminaSingleApplication.cpp | 2 +- .../src-desktop/DesktopManager.cpp | 4 ++- .../src-desktop/RootWindow.cpp | 6 ++-- .../src-desktop/RootWindow.h | 5 ++- .../src-desktop/src-cpp/RootDesktopObject.cpp | 30 +++++++++++++++- .../src-desktop/src-cpp/RootDesktopObject.h | 10 +++++- .../src-desktop/src-qml/ContextMenu.qml | 13 ++++--- .../src-desktop/src-qml/RootDesktop.qml | 10 +++--- .../src-desktop/src-qml/plugins/StatusTray.qml | 41 ++++++++++++++++++++-- .../src-qml/plugins/status_tray/TrayIcon.qml | 15 ++++++-- .../src-events/NativeWindowSystem.cpp | 23 ++++++------ 11 files changed, 126 insertions(+), 33 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/libLumina/LuminaSingleApplication.cpp b/src-qt5/core/libLumina/LuminaSingleApplication.cpp index 6107aff8..927815a2 100644 --- a/src-qt5/core/libLumina/LuminaSingleApplication.cpp +++ b/src-qt5/core/libLumina/LuminaSingleApplication.cpp @@ -22,7 +22,7 @@ LSingleApplication::LSingleApplication(int &argc, char **argv, QString appname) QString username = QString::number(getuid()); //For locking the process use the official process name - not the user input (no masking) appname = this->applicationName(); - cfile = cfile.arg( username, appname, QString::number(QX11Info::appScreen()) ); + cfile = cfile.arg( username, appname, QString(getenv("DISPLAY")).replace(":","") ); lockfile = new QLockFile(cfile+"-lock"); lockfile->setStaleLockTime(0); //long-lived processes for(int i=1; i allWins = Lumina::NWS->currentTrayWindows(); + qDebug() << "Synced Tray Window List:" << allWins.length(); + RootDesktopObject::instance()->setTrayWindows(allWins); } // === PRIVATE SLOTS === diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp index 83c15601..9664e506 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp @@ -10,7 +10,7 @@ RootWindow::RootWindow() : QObject(){ root_win = QWindow::fromWinId( QX11Info::appRootWindow() ); - root_view = new QQuickView(new QWindow()); //make it a child of the root window + root_view = new QQuickView(); //make it a child of the root window root_obj = RootDesktopObject::instance(); syncRootSize(); connect(root_win, SIGNAL(widthChanged(int)), this, SLOT(syncRootSize()) ); @@ -31,7 +31,7 @@ RootWindow::~RootWindow(){ void RootWindow::start(){ root_view->setSource(QUrl("qrc:///qml/RootDesktop.qml")); root_win->show(); - root_view->parent()->show(); + if(root_view->parent()!=0){ root_view->parent()->show(); } root_view->show(); } @@ -41,7 +41,7 @@ void RootWindow::syncRootSize(){ QRect unif; for(int i=0; igeometry()); } if(unif.width() != root_view->width() || unif.height() != root_view->height()){ - root_view->parent()->setGeometry(0,0,unif.width(), unif.height()); + if(root_view->parent()!=0){ root_view->parent()->setGeometry(0,0,unif.width(), unif.height()); } root_view->setGeometry(0, 0, unif.width(), unif.height() ); emit RootResized(root_view->geometry()); } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h index 0e48c000..41c75a46 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h @@ -22,7 +22,10 @@ public: void start(); - WId viewID(){ return root_view->parent()->winId(); } + WId viewID(){ + if(root_view->parent()!=0){ return root_view->parent()->winId(); } + return root_view->winId(); + } public slots: void syncRootSize(); 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 e1960ba0..77dd2d79 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 @@ -85,6 +85,26 @@ NativeWindowObject* RootDesktopObject::window(QString id){ return 0; } +QStringList RootDesktopObject::trayWindows(){ + //qDebug() << "Request Panels:" << panel_objects.length(); + QStringList names; + for(int i=0; iid()); } + 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; iid()==chk){ return tray_window_objects[i]; } + } + return 0; +} + +bool RootDesktopObject::hasTrayWindows(){ + return !tray_window_objects.isEmpty(); +} + OSInterface* RootDesktopObject::os_interface(){ return OSInterface::instance(); } @@ -149,8 +169,16 @@ void RootDesktopObject::setWindows(QList list){ mousePositionChanged(true); } +void RootDesktopObject::setTrayWindows(QList list){ + tray_window_objects = list; + emit trayWindowsChanged(); + mousePositionChanged(true); +} + + 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(){ diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h index f9852e11..7914f3f6 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h @@ -17,7 +17,9 @@ class RootDesktopObject : public QObject{ //Define all the QML Properties here (interface between QML and the C++ methods below) Q_PROPERTY( QStringList screens READ screens NOTIFY screensChanged) Q_PROPERTY( QStringList panels READ panels NOTIFY panelsChanged) - Q_PROPERTY( QStringList windows READ windows NOTIFY windowsChanged); + Q_PROPERTY( QStringList windows READ windows NOTIFY windowsChanged) + Q_PROPERTY( QStringList trayWindows READ trayWindows NOTIFY trayWindowsChanged) + Q_PROPERTY( bool hasTrayWindows READ hasTrayWindows NOTIFY trayWindowsChanged) public: //main contructor/destructor @@ -36,6 +38,9 @@ public: Q_INVOKABLE PanelObject* panel(QString id); Q_INVOKABLE QStringList windows(); Q_INVOKABLE NativeWindowObject* window(QString id); + Q_INVOKABLE QStringList trayWindows(); + Q_INVOKABLE NativeWindowObject* trayWindow(QString id); + Q_INVOKABLE bool hasTrayWindows(); //QML Globals Access Q_INVOKABLE OSInterface* os_interface(); @@ -50,6 +55,7 @@ private: QList s_objects; QList panel_objects; QList window_objects; + QList tray_window_objects; QPointer last_window_up; public slots: @@ -62,6 +68,7 @@ public slots: QList panelObjectList(){ return panel_objects; } void setWindows(QList list); + void setTrayWindows(QList list); private slots: @@ -69,6 +76,7 @@ signals: void screensChanged(); void panelsChanged(); void windowsChanged(); + void trayWindowsChanged(); void startLogout(); void mouseMoved(); diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/ContextMenu.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/ContextMenu.qml index 778d7568..ee98a8db 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/ContextMenu.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/ContextMenu.qml @@ -6,22 +6,25 @@ //=========================================== import QtQuick 2.2 import QtQuick.Window 2.2 -import QtQuick.Controls 1 +import QtQuick.Controls 2 import Lumina.Backend.RootDesktopObject 2.0 + + Menu { id: contextMenu + MenuItem { text: "Launch Terminal" - iconName: "utilities-terminal" + //iconName: "utilities-terminal" onTriggered: { RootObject.launchApp("application/terminal") } } MenuItem { text: "Launch File Browser" - iconName: "user-home" + //iconName: "user-home" onTriggered: { RootObject.launchApp("inode/directory") } @@ -29,7 +32,7 @@ Menu { MenuItem { text: "Lock Screen" - iconName: "system-lock-screen" + //iconName: "system-lock-screen" onTriggered: { RootObject.lockscreen() } @@ -37,7 +40,7 @@ Menu { MenuItem { text: "Logout" - iconName: "system-log-out" + //iconName: "system-log-out" onTriggered: { RootObject.logout() } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/RootDesktop.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/RootDesktop.qml index ddb2a490..7310fd50 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/RootDesktop.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/RootDesktop.qml @@ -17,7 +17,7 @@ //=========================================== import QtQuick 2.2 import QtQuick.Window 2.2 -import QtQuick.Controls 1 +import QtQuick.Controls 2 import "." as QML @@ -34,10 +34,10 @@ Rectangle { anchors.fill: rootCanvas acceptedButtons: Qt.RightButton onClicked: { - //contextMenu.x = mouseX - //contextMenu.y = mouseY - //contextMenu.open() - contextMenu.popup() + contextMenu.x = mouseX + contextMenu.y = mouseY + contextMenu.open() + //contextMenu.popup() } onPositionChanged: { RootObject.mousePositionChanged() diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml index e1e7cd10..0bec74f2 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml @@ -8,6 +8,10 @@ //=========================================== import QtQuick 2.2 import QtQuick.Layouts 1.3 +import QtQuick.Controls 2 + +import Lumina.Backend.RootDesktopObject 2.0 +import Lumina.Backend.NativeWindowObject 2.0 import "./status_tray" as QML @@ -45,8 +49,41 @@ Rectangle { Layout.preferredHeight: status_tray.prefsize Layout.preferredWidth: status_tray.prefsize } - //System Tray Menu Popup - + //System Tray Menu Button + ToolButton{ + id: "trayButton" + text: "Tray" + //iconName: "view-more-vertical" + visible: RootObject.hasTrayWindows + onClicked: trayMenu.open() + Menu{ + id: "trayMenu" + //MenuItem{ text: "sample" } + //MenuItem{ text: "sample2" } + //Rectangle{ color: "blue"; width: 50; height: 50 } + GridLayout{ + columns: 4 + Repeater{ + model: RootObject.trayWindows + QML.TrayIcon{ + + winObj: RootObject.trayWindow(modelData) + parent: trayMenu + Layout.preferredWidth: 48 + Layout.preferredHeight: 48 + } + } + } + } + } //end of system tray menu button + /*Repeater{ + model: RootObject.trayWindows + QML.TrayIcon{ + winObj: RootObject.trayWindow(modelData) + Layout.preferredHeight: status_tray.prefsize + Layout.preferredWidth: status_tray.prefsize + } + }*/ } //end of layout } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/TrayIcon.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/TrayIcon.qml index 26c50907..6012ba5d 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/TrayIcon.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/TrayIcon.qml @@ -5,21 +5,30 @@ // See the LICENSE file for full details //=========================================== import QtQuick 2.2 -import QtQuick.Controls 1 +import QtQuick.Controls 2 import Lumina.Backend.NativeWindowObject 2.0 Image{ property NativeWindowObject winObj source: winObj.icon + id: "trayIcon" + fillMode: Qt.PreserveAspectFit + smooth: true + cache: false + asynchronous: false + //text: winObj.name + + onXChanged: { } MouseArea{ + //property point globalPos anchors.fill: parent acceptedButtons: Qt.NoButton onEntered: { //Need to ensure the invisible native window is over this place right now - point pt: parent.mapToGlobal(0,0) - winObj.updateGeometry( pt.x(), pt.y(), parent.width(), parent.height(), true); + console.log("Enter Tray Icon:", parent.mapToGlobal(0,0)); + winObj.updateGeometry( parent.mapToGlobal(0,0).x, parent.mapToGlobal(0,0).y, parent.width(), parent.height(), true) } } } diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp index b08f9109..9e2e7bba 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp @@ -294,7 +294,8 @@ NativeWindowObject* NativeWindowSystem::findWindow(WId id, bool checkRelated){ NativeWindowObject* NativeWindowSystem::findTrayWindow(WId id){ for(int i=0; iisRelatedTo(id)){ return TWindows[i]; } + if(TWindows[i]->id()==id){ return TWindows[i]; } + else if(TWindows[i]->isRelatedTo(id)){ return TWindows[i]; } } return 0; } @@ -806,29 +807,31 @@ void NativeWindowSystem::NewWindowDetected(WId id){ void NativeWindowSystem::NewTrayWindowDetected(WId id){ //Make sure this can be managed first + qDebug() << "New Tray Window Detected:" << id; if(findTrayWindow(id) != 0){ return; } //already managed - xcb_get_window_attributes_cookie_t cookie = xcb_get_window_attributes(QX11Info::connection(), id); + qDebug() << " - Setup new tray window"; + /*xcb_get_window_attributes_cookie_t cookie = xcb_get_window_attributes(QX11Info::connection(), id); xcb_get_window_attributes_reply_t *attr = xcb_get_window_attributes_reply(QX11Info::connection(), cookie, NULL); - if(attr == 0){ return; } //could not get attributes of window - if(attr->override_redirect){ free(attr); return; } //window has override redirect set (do not manage) - free(attr); + if(attr == 0){ qDebug() << " - [WARN] No tray window attributes"; return; } //could not get attributes of window + if(attr->override_redirect){ qDebug() << " - [WARN] Override Redirect"; free(attr); return; } //window has override redirect set (do not manage) + qDebug() << " - free attr"; + free(attr);*/ //Register for events from this window - #define TRAY_WIN_EVENT_MASK (XCB_EVENT_MASK_BUTTON_PRESS | \ - XCB_EVENT_MASK_BUTTON_RELEASE | \ - XCB_EVENT_MASK_POINTER_MOTION | \ - XCB_EVENT_MASK_BUTTON_MOTION | \ - XCB_EVENT_MASK_EXPOSURE | \ + #define TRAY_WIN_EVENT_MASK (XCB_EVENT_MASK_EXPOSURE | \ XCB_EVENT_MASK_STRUCTURE_NOTIFY | \ XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | \ XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | \ XCB_EVENT_MASK_ENTER_WINDOW) uint32_t value_list[1] = {TRAY_WIN_EVENT_MASK}; + qDebug() << " - change tray window attributes"; xcb_change_window_attributes(QX11Info::connection(), id, XCB_CW_EVENT_MASK, value_list); //Now go ahead and create/populate the container for this window NativeWindowObject *win = new NativeWindowObject(id); TWindows << win; + qDebug() << " - update tray window properties"; UpdateWindowProperties(win, NativeWindowObject::allProperties()); + qDebug() << " - emit new tray window signal"; emit NewTrayWindowAvailable(win); } -- cgit From 18330354e918d7fd369a6b6273da023b86a6242c Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Thu, 1 Feb 2018 09:26:58 -0500 Subject: Get a unified system clock setup within the RootDesktopObject. This can be used for any number of display clocks as needed without extra overhead --- .../src-desktop/src-cpp/RootDesktopObject.cpp | 29 ++++++++++++++++++++++ .../src-desktop/src-cpp/RootDesktopObject.h | 8 ++++++ 2 files changed, 37 insertions(+) (limited to 'src-qt5/core') 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 77dd2d79..0585ae2c 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 @@ -16,6 +16,8 @@ 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(){ @@ -105,6 +107,10 @@ bool RootDesktopObject::hasTrayWindows(){ return !tray_window_objects.isEmpty(); } +QString RootDesktopObject::currentTime(){ + return currentTimeString; +} + OSInterface* RootDesktopObject::os_interface(){ return OSInterface::instance(); } @@ -175,6 +181,18 @@ void RootDesktopObject::setTrayWindows(QList list){ mousePositionChanged(true); } +void RootDesktopObject::updateCurrentTimeFormat(QString fmt){ + currentTimeFormat = fmt.simplified(); + if(currentTimeTimer->isActive()){ currentTimeTimer->stop(); } + //sanitize the time format as needed + if(fmt.contains("z")){ currentTimeFormat.replace("z",""); } //do not allow millisecond updates - too fast for the desktop + //Adjust the refresh time for the clock based on the smallest unit requested + if(fmt.contains("s")){ currentTimeTimer->setInterval(500); } //1/2 second pings for 1-second displays + else if(fmt.contains("m") || currentTimeFormat.isEmpty()){ currentTimeTimer->setInterval(5000); } //5 second pings for 1-minute displays + else{ currentTimeTimer->setInterval(60000); } //1 minute pings for 1-hour displays + updateCurrentTime(); //refresh the currently-available time + currentTimeTimer->start();//start the update timer +} void RootDesktopObject::logout(){ //Emit the logout signal in a few ms (let the display close/sync first) @@ -246,3 +264,14 @@ QString RootDesktopObject::CurrentWallpaper(QString screen){ // === PRIVATE === + +// === PRIVATE SLOTS === +void RootDesktopObject::updateCurrentTime(){ + QString tmp; + if(currentTimeFormat.isEmpty()){ tmp = QDateTime::currentDateTime().toString(Qt::DefaultLocaleShortDate); } + else{ tmp = QDateTime::currentDateTime().toString(currentTimeFormat); } + if(tmp!=currentTimeString){ //prevent sending signals to update the interface if nothing changed + currentTimeString = tmp; + emit currentTimeChanged(); + } +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h index 7914f3f6..e7ce50e0 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h @@ -20,6 +20,7 @@ class RootDesktopObject : public QObject{ Q_PROPERTY( QStringList windows READ windows NOTIFY windowsChanged) Q_PROPERTY( QStringList trayWindows READ trayWindows NOTIFY trayWindowsChanged) Q_PROPERTY( bool hasTrayWindows READ hasTrayWindows NOTIFY trayWindowsChanged) + Q_PROPERTY( QString currentTime READ currentTime NOTIFY currentTimeChanged); public: //main contructor/destructor @@ -41,6 +42,7 @@ public: Q_INVOKABLE QStringList trayWindows(); Q_INVOKABLE NativeWindowObject* trayWindow(QString id); Q_INVOKABLE bool hasTrayWindows(); + Q_INVOKABLE QString currentTime(); //QML Globals Access Q_INVOKABLE OSInterface* os_interface(); @@ -57,6 +59,8 @@ private: QList window_objects; QList tray_window_objects; QPointer last_window_up; + QTimer *currentTimeTimer; + QString currentTimeFormat, currentTimeString; public slots: void updateScreens(); //rescan/update screen objects @@ -70,13 +74,17 @@ public slots: void setWindows(QList list); void setTrayWindows(QList list); + void updateCurrentTimeFormat(QString); + private slots: + void updateCurrentTime(); signals: void screensChanged(); void panelsChanged(); void windowsChanged(); void trayWindowsChanged(); + void currentTimeChanged(); void startLogout(); void mouseMoved(); -- cgit From 9d3f929c27127bbc8f9d4b3d286c5d979f7203e4 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Thu, 1 Feb 2018 09:48:11 -0500 Subject: Finish getting the session settings all loaded by the Desktop Manager. Also ensure the desktop clock is a bit smarter about when it changes it's functionality (just in case the setting did not change). --- .../src-desktop/DesktopManager.cpp | 19 +++++++++++---- .../src-desktop/DesktopManager.h | 1 + .../src-desktop/src-cpp/RootDesktopObject.cpp | 27 +++++++++++++++------- .../src-desktop/src-cpp/RootDesktopObject.h | 3 +++ 4 files changed, 37 insertions(+), 13 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp index be315596..35bd288d 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp @@ -20,6 +20,7 @@ DesktopManager::~DesktopManager(){ void DesktopManager::start(){ connect(DesktopSettings::instance(), SIGNAL(FileModified(DesktopSettings::File)), this, SLOT(settingsChanged(DesktopSettings::File)) ); //Perform the initial load of the settings files + QTimer::singleShot(0, this, SLOT(updateSessionSettings()) ); QTimer::singleShot(0, this, SLOT(updateDesktopSettings()) ); QTimer::singleShot(0, this, SLOT(updatePanelSettings()) ); QTimer::singleShot(0, this, SLOT(updatePluginSettings()) ); @@ -96,16 +97,18 @@ void DesktopManager::workspaceChanged(int wknum){ void DesktopManager::settingsChanged(DesktopSettings::File type){ switch(type){ + case DesktopSettings::Session: + QTimer::singleShot(0, this, SLOT(updateSessionSettings()) ); case DesktopSettings::Desktop: - QTimer::singleShot(0, this, SLOT(updateDesktopSettings()) ); + QTimer::singleShot(1, this, SLOT(updateDesktopSettings()) ); case DesktopSettings::Panels: - QTimer::singleShot(1, this, SLOT(updatePanelSettings()) ); + QTimer::singleShot(2, this, SLOT(updatePanelSettings()) ); case DesktopSettings::Plugins: - QTimer::singleShot(2, this, SLOT(updatePluginSettings()) ); + QTimer::singleShot(3, this, SLOT(updatePluginSettings()) ); case DesktopSettings::ContextMenu: - QTimer::singleShot(3, this, SLOT(updateMenuSettings()) ); + QTimer::singleShot(4, this, SLOT(updateMenuSettings()) ); case DesktopSettings::Animation: - QTimer::singleShot(4, this, SLOT(updateAnimationSettings()) ); + QTimer::singleShot(5, this, SLOT(updateAnimationSettings()) ); default: break; //Do nothing - not a settings change we care about here @@ -144,6 +147,12 @@ void DesktopManager::syncTrayWindowList(){ } // === PRIVATE SLOTS === +void DesktopManager::updateSessionSettings(){ + qDebug() << "Update Session Settings..."; + + RootDesktopObject::instance()->updateCurrentTimeFormat(DesktopSettings::instance()->value(DesktopSettings::Session, "datetime_format", "").toString()); +} + void DesktopManager::updateDesktopSettings(){ qDebug() << "Update Desktop Settings..."; QList scrns = QGuiApplication::screens(); diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.h b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.h index da42e477..b3511318 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.h @@ -36,6 +36,7 @@ public slots: void syncTrayWindowList(); private slots: + void updateSessionSettings(); void updateDesktopSettings(); void updatePanelSettings(); void updatePluginSettings(); 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 0585ae2c..b1bd939b 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 @@ -111,6 +111,10 @@ QString RootDesktopObject::currentTime(){ return currentTimeString; } +QDateTime RootDesktopObject::currentDateTime(){ + return currentDateTimeStruct; +} + OSInterface* RootDesktopObject::os_interface(){ return OSInterface::instance(); } @@ -182,14 +186,19 @@ void RootDesktopObject::setTrayWindows(QList list){ } void RootDesktopObject::updateCurrentTimeFormat(QString fmt){ - currentTimeFormat = fmt.simplified(); - if(currentTimeTimer->isActive()){ currentTimeTimer->stop(); } //sanitize the time format as needed - if(fmt.contains("z")){ currentTimeFormat.replace("z",""); } //do not allow millisecond updates - too fast for the desktop + 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")){ currentTimeTimer->setInterval(500); } //1/2 second pings for 1-second displays - else if(fmt.contains("m") || currentTimeFormat.isEmpty()){ currentTimeTimer->setInterval(5000); } //5 second pings for 1-minute displays - else{ currentTimeTimer->setInterval(60000); } //1 minute pings for 1-hour displays + 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 currentTimeTimer->start();//start the update timer } @@ -267,10 +276,12 @@ QString RootDesktopObject::CurrentWallpaper(QString screen){ // === PRIVATE SLOTS === void RootDesktopObject::updateCurrentTime(){ + QDateTime DT = QDateTime::currentDateTime(); QString tmp; - if(currentTimeFormat.isEmpty()){ tmp = QDateTime::currentDateTime().toString(Qt::DefaultLocaleShortDate); } - else{ tmp = QDateTime::currentDateTime().toString(currentTimeFormat); } + 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(); } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h index e7ce50e0..a6a4a236 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h @@ -21,6 +21,7 @@ class RootDesktopObject : public QObject{ Q_PROPERTY( QStringList trayWindows READ trayWindows NOTIFY trayWindowsChanged) Q_PROPERTY( bool hasTrayWindows READ hasTrayWindows NOTIFY trayWindowsChanged) Q_PROPERTY( QString currentTime READ currentTime NOTIFY currentTimeChanged); + Q_PROPERTY( QDateTime currentDateTime READ currentDateTime NOTIFY currentTimeChanged); public: //main contructor/destructor @@ -43,6 +44,7 @@ public: Q_INVOKABLE NativeWindowObject* trayWindow(QString id); Q_INVOKABLE bool hasTrayWindows(); Q_INVOKABLE QString currentTime(); + Q_INVOKABLE QDateTime currentDateTime(); //QML Globals Access Q_INVOKABLE OSInterface* os_interface(); @@ -61,6 +63,7 @@ private: QPointer last_window_up; QTimer *currentTimeTimer; QString currentTimeFormat, currentTimeString; + QDateTime currentDateTimeStruct; public slots: void updateScreens(); //rescan/update screen objects -- cgit From 7b781f1660c7cd3182315b4731336cf80fbfe771 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Thu, 1 Feb 2018 11:19:26 -0500 Subject: Fix up the single application numbering. Ensure that the "DISPLAY" number does not get modified between environments, only use the primary number rather than the whole number (0.0 and 0.1 both use display 0). --- src-qt5/core/libLumina/LuminaSingleApplication.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/libLumina/LuminaSingleApplication.cpp b/src-qt5/core/libLumina/LuminaSingleApplication.cpp index 927815a2..379ac02d 100644 --- a/src-qt5/core/libLumina/LuminaSingleApplication.cpp +++ b/src-qt5/core/libLumina/LuminaSingleApplication.cpp @@ -22,7 +22,10 @@ LSingleApplication::LSingleApplication(int &argc, char **argv, QString appname) QString username = QString::number(getuid()); //For locking the process use the official process name - not the user input (no masking) appname = this->applicationName(); - cfile = cfile.arg( username, appname, QString(getenv("DISPLAY")).replace(":","") ); + QString display = QString(getenv("DISPLAY")); + if(display.startsWith(":")){ display.remove(0,1); } + display = display.section(".",0,0); + cfile = cfile.arg( username, appname, display ); lockfile = new QLockFile(cfile+"-lock"); lockfile->setStaleLockTime(0); //long-lived processes for(int i=1; i Date: Thu, 1 Feb 2018 17:10:42 -0500 Subject: Get the FreeBSD OSInterface class all setup. Also test/fix some stuff in the build side of things. OSInterface no longer uses the LUtils and LXDG classes from libLumina. --- .../src-desktop/src-qml/plugins/status_tray/BatteryButton.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml index 38ed6a64..8603e072 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml @@ -16,5 +16,5 @@ ToolButton{ iconName: os.batteryIcon tooltip: os.batteryCharge+"%: "+os.batteryRemaining visible: os.batteryAvailable() - enabled: false + //enabled: false } -- cgit From 2f262ae79eb5fcab5257895534d605f47da047fa Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Fri, 2 Feb 2018 11:55:57 -0500 Subject: Fix up the battery status text. --- .../src-desktop/src-qml/plugins/status_tray/BatteryButton.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml index 8603e072..bc8ba68a 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/BatteryButton.qml @@ -14,7 +14,7 @@ ToolButton{ property OSInterface os: RootObject.os_interface() id: "batButton" iconName: os.batteryIcon - tooltip: os.batteryCharge+"%: "+os.batteryRemaining + tooltip: os.batteryStatus visible: os.batteryAvailable() //enabled: false } -- cgit From 9001eb57798a6c1fb02f811c08b7fd1520564974 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Fri, 2 Feb 2018 13:51:27 -0500 Subject: Add a new "Clock_Digital" plugin Also ensure the panel plugins are fit to the width/height depending on the type of panel (vertical/horizontal) --- .../src-desktop/src-cpp/PanelObject.cpp | 3 +++ .../src-desktop/src-cpp/PanelObject.h | 2 ++ .../src-desktop/src-cpp/RootDesktopObject.cpp | 2 +- .../src-desktop/src-qml/Panel.qml | 8 ++++++++ .../src-desktop/src-qml/plugins/Clock_Digital.qml | 17 +++++++++++++++++ .../src-desktop/src-qml/plugins/plugins.pri | 4 ++-- .../src-desktop/src-qml/src-qml.qrc | 1 + 7 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Clock_Digital.qml (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.cpp index a0f58e71..9b7b8da7 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.cpp @@ -30,6 +30,9 @@ int PanelObject::x(){ return geom.x(); } int PanelObject::y(){ return geom.y(); } int PanelObject::width(){ return geom.width(); } int PanelObject::height(){ return geom.height(); } +bool PanelObject::isVertical(){ + return ( geom.width() < geom.height() ); +} void PanelObject::setBackground(QString fileOrColor){ if(bg!=fileOrColor){ diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.h index 8cf59dee..04c47e06 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.h @@ -20,6 +20,7 @@ class PanelObject : public QObject { Q_PROPERTY( int y READ y NOTIFY geomChanged) Q_PROPERTY( int width READ width NOTIFY geomChanged) Q_PROPERTY( int height READ height NOTIFY geomChanged) + Q_PROPERTY( bool isVertical READ isVertical NOTIFY geomChanged) private: QString panel_id, bg; @@ -36,6 +37,7 @@ public: Q_INVOKABLE int y(); Q_INVOKABLE int width(); Q_INVOKABLE int height(); + Q_INVOKABLE bool isVertical(); public slots: void setBackground(QString fileOrColor); 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 b1bd939b..5891028c 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 @@ -200,7 +200,7 @@ void RootDesktopObject::updateCurrentTimeFormat(QString fmt){ else if(fmt.contains("h")){ interval = 30000; } //30 second pings for 1-hour displays currentTimeTimer->setInterval(interval); updateCurrentTime(); //refresh the currently-available time - currentTimeTimer->start();//start the update timer + QTimer::singleShot(0,currentTimeTimer, SLOT(start()) );//start the update timer } void RootDesktopObject::logout(){ diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml index 44abb425..48046648 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml @@ -33,6 +33,14 @@ Rectangle { //hardcode the "status_tray" plugin at the moment PLUGINS.StatusTray{ id: "statustray" + Layout.fillHeight: layout.parent.object.isVertical ? false : true + Layout.fillWidth: layout.parent.object.isVertical ? true : false + + } + PLUGINS.Clock_Digital{ + id: "clock" + Layout.fillHeight: layout.parent.object.isVertical ? false : true + Layout.fillWidth: layout.parent.object.isVertical ? true : false } } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Clock_Digital.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Clock_Digital.qml new file mode 100644 index 00000000..aaa8ddd0 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Clock_Digital.qml @@ -0,0 +1,17 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +// This is the QML plugin that displays the OS status/system tray +//=========================================== +import QtQuick 2.2 +import QtQuick.Layouts 1.3 +import QtQuick.Controls 1 + +import Lumina.Backend.RootDesktopObject 2.0 + +ToolButton{ + text: RootObject.currentTime +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/plugins.pri b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/plugins.pri index 50eb9c5c..a6296e13 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/plugins.pri +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/plugins.pri @@ -5,6 +5,6 @@ lupdate_only{ $${PWD}/status_tray/VolumeButton.qml \ $${PWD}/status_tray/NetworkButton.qml \ $${PWD}/status_tray/BatteryButton.qml \ - $${PWD}/status_tray/UpdateButton.qml - + $${PWD}/status_tray/UpdateButton.qml \ + $${PWD}/Clock_Digital.qml } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc index 1da9d5bd..292caea2 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc @@ -11,5 +11,6 @@ plugins/status_tray/NetworkButton.qml plugins/status_tray/BatteryButton.qml plugins/status_tray/UpdateButton.qml + plugins/Clock_Digital.qml -- cgit From 42c516b6907c041d46838ac808c9587baf7d1d9b Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Fri, 2 Feb 2018 15:07:12 -0500 Subject: Add a new "Spacer" plugin, and tinker with a lot of the panel mechanics. Trying to get things organized properly on the panels --- .../src-desktop/src-qml/Panel.qml | 26 ++++++++++------ .../src-desktop/src-qml/plugins/Clock_Digital.qml | 8 +++-- .../src-desktop/src-qml/plugins/Spacer.qml | 16 ++++++++++ .../src-desktop/src-qml/plugins/StatusTray.qml | 36 +++++++++++----------- .../src-desktop/src-qml/plugins/plugins.pri | 3 +- .../src-qml/plugins/status_tray/UpdateButton.qml | 4 +-- .../src-desktop/src-qml/src-qml.qrc | 1 + 7 files changed, 62 insertions(+), 32 deletions(-) create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Spacer.qml (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml index 48046648..2a8579a8 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml @@ -27,21 +27,29 @@ Rectangle { GridLayout{ id: layout anchors.fill: parent; - columns: (object.width>object.height) ? -1 : 1 - rows: (object.width>object.height) ? 1 : -1 + columns: parent.object.isVertical ? 1 : -1 + rows: parent.object.isVertical ? -1 : 1 + + //hardcode some plugins for the moment + //PLUGINS.Spacer{} - //hardcode the "status_tray" plugin at the moment PLUGINS.StatusTray{ id: "statustray" - Layout.fillHeight: layout.parent.object.isVertical ? false : true - Layout.fillWidth: layout.parent.object.isVertical ? true : false - + vertical: layout.parent.object.isVertical + //Layout.fillWidth: layout.parent.object.isVertical ? true : false + //Layout.fillHeight: layout.parent.object.isVertical ? false : true } + + //PLUGINS.Spacer{} + PLUGINS.Clock_Digital{ id: "clock" - Layout.fillHeight: layout.parent.object.isVertical ? false : true - Layout.fillWidth: layout.parent.object.isVertical ? true : false + vertical: layout.parent.object.isVertical + //Layout.fillWidth: layout.parent.object.isVertical ? true : false + //Layout.fillHeight: layout.parent.object.isVertical ? false : true } - } + //PLUGINS.Spacer{} + + } //end of grid layout } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Clock_Digital.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Clock_Digital.qml index aaa8ddd0..f82d398b 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Clock_Digital.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Clock_Digital.qml @@ -12,6 +12,10 @@ import QtQuick.Controls 1 import Lumina.Backend.RootDesktopObject 2.0 -ToolButton{ - text: RootObject.currentTime +Label{ + property bool vertical + text: RootObject.currentTime + wrapMode: Text.WrapWord + rotation: vertical ? 90 : 0 + transformOrigin: Item.Center } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Spacer.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Spacer.qml new file mode 100644 index 00000000..d46e486c --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Spacer.qml @@ -0,0 +1,16 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +// This is the QML plugin that displays the OS status/system tray +//=========================================== +import QtQuick 2.2 +import QtQuick.Layouts 1.3 + + +Item{ + Layout.fillWidth: true + Layout.fillHeight: true +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml index 0bec74f2..a2d49b35 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml @@ -8,7 +8,7 @@ //=========================================== import QtQuick 2.2 import QtQuick.Layouts 1.3 -import QtQuick.Controls 2 +import QtQuick.Controls 1 import Lumina.Backend.RootDesktopObject 2.0 import Lumina.Backend.NativeWindowObject 2.0 @@ -16,38 +16,38 @@ import Lumina.Backend.NativeWindowObject 2.0 import "./status_tray" as QML -Rectangle { - property int prefsize: (parent.width < parent.height) ? parent.width : parent.height +Item { + property bool vertical + property int prefsize: vertical ? parent.width : parent.height id: "status_tray" - color: "transparent" - Layout.fillHeight: true - Layout.fillWidth: true GridLayout{ anchors.fill: parent - flow: GridLayout.LeftToRight - columnSpacing: 2 - rowSpacing: 2 + flow: parent.vertical ? GridLayout.TopToBottom : GridLayout.LeftToRight + columns: vertical ? 2 : -1 + rows: vertical ? -1 : 2 + //columnSpacing: 2 + //rowSpacing: 2 //Volume Status QML.VolumeButton{ - Layout.preferredHeight: status_tray.prefsize - Layout.preferredWidth: status_tray.prefsize + //Layout.preferredHeight: status_tray.prefsize + //Layout.preferredWidth: status_tray.prefsize } //Network Status QML.NetworkButton{ - Layout.preferredHeight: status_tray.prefsize - Layout.preferredWidth: status_tray.prefsize + //Layout.preferredHeight: status_tray.prefsize + //Layout.preferredWidth: status_tray.prefsize } //Battery Status QML.BatteryButton{ - Layout.preferredHeight: status_tray.prefsize - Layout.preferredWidth: status_tray.prefsize + //Layout.preferredHeight: status_tray.prefsize + //Layout.preferredWidth: status_tray.prefsize } //Update Status QML.UpdateButton{ - Layout.preferredHeight: status_tray.prefsize - Layout.preferredWidth: status_tray.prefsize + //Layout.preferredHeight: status_tray.prefsize + //Layout.preferredWidth: status_tray.prefsize } //System Tray Menu Button ToolButton{ @@ -56,7 +56,7 @@ Rectangle { //iconName: "view-more-vertical" visible: RootObject.hasTrayWindows onClicked: trayMenu.open() - Menu{ + menu: Menu{ id: "trayMenu" //MenuItem{ text: "sample" } //MenuItem{ text: "sample2" } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/plugins.pri b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/plugins.pri index a6296e13..d1939616 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/plugins.pri +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/plugins.pri @@ -6,5 +6,6 @@ lupdate_only{ $${PWD}/status_tray/NetworkButton.qml \ $${PWD}/status_tray/BatteryButton.qml \ $${PWD}/status_tray/UpdateButton.qml \ - $${PWD}/Clock_Digital.qml + $${PWD}/Clock_Digital.qml \ + $${PWD}/Spacer.qml } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/UpdateButton.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/UpdateButton.qml index 881f164f..9ba824ae 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/UpdateButton.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/status_tray/UpdateButton.qml @@ -14,8 +14,8 @@ ToolButton{ id: "updateButton" property OSInterface os: RootObject.os_interface() iconName: os.updateIcon - tooltip: os.networkStatus - visible: (os.updateStatus == "") + tooltip: os.updateStatus + visible: os.updateInfoAvailable /*enabled: os.hasUpdateManager() onClicked: { RootObject.launchApplication(os.updateManagerUtility()) diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc index 292caea2..0513e467 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/src-qml.qrc @@ -12,5 +12,6 @@ plugins/status_tray/BatteryButton.qml plugins/status_tray/UpdateButton.qml plugins/Clock_Digital.qml + plugins/Spacer.qml -- cgit From 96c62cbb5ed33232f1774e67f0a475117b8a7182 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Mon, 5 Feb 2018 14:31:37 -0500 Subject: Add an xsession file for Lumina 2. --- .../lumina-desktop-unified.desktop | 34 ++++++++++++++++++++++ .../core/lumina-desktop-unified/lumina-desktop.pro | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src-qt5/core/lumina-desktop-unified/lumina-desktop-unified.desktop (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/lumina-desktop-unified.desktop b/src-qt5/core/lumina-desktop-unified/lumina-desktop-unified.desktop new file mode 100644 index 00000000..33681964 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/lumina-desktop-unified.desktop @@ -0,0 +1,34 @@ +[Desktop Entry] +Exec=start-lumina-desktop --unified +TryExec=lumina-desktop-unified +Icon=Lumina-DE +Type=Application +Name=Lumina 2 +Name[de]=Lumina +Name[en_GB]=Lumina +Name[en_ZA]=Lumina +Name[et]=Lumina +Name[fr]=Lumina +Name[fr_CA]=Lumina +Name[hi]=ल्यूमिना +Name[ja]=Lumina +Name[mt]=Lumina +Name[pl]=Lumina +Name[pt_BR]=Lumina +Name[ru]=Lumina +Name[uk]=Lumina +Name[vi]=Lumina +Comment=A Lightweight Desktop for FreeBSD +Comment[de]=Eine leichtgewichtige Arbeitsplatzumgebung für FreeBSD +Comment[en_GB]=A Lightweight Desktop for FreeBSD +Comment[en_ZA]=A Lightweight Desktop for FreeBSD +Comment[et]=Minimalistlik töölauakeskkond FreeBSD-le +Comment[fr]=Un environnement bureau léger pour FreeBSD +Comment[fr_CA]=Un environnement bureau léger pour FreeBSD +Comment[hi]=एक हल्का डेस्कटॉप फ्री बी.एस.डी के लिए +Comment[ja]=FreeBSD の為に作られた軽快なデスクトップ環境 +Comment[mt]=A Desktop irqiq għal FreeBSD +Comment[pl]=Lekkie Środowisko graficzne dla FreeBSD +Comment[pt_BR]=Um ambiente de trabalho leve para FreeBSD +Comment[uk]=Легковісне оточення стільниці для FreeBSD +Comment[vi]=Một máy tính để bàn nhẹ cho FreeBSD diff --git a/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro b/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro index 96d84a71..a929f844 100644 --- a/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro +++ b/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro @@ -46,7 +46,7 @@ FORMS += BootSplash.ui # Install all the various files for the desktop itself desktop.path = $${L_SESSDIR} -desktop.files = lumina-desktop.desktop +desktop.files = lumina-desktop-unified.desktop defaults.path = $${L_SHAREDIR}/lumina-desktop defaults.files = defaults/* -- cgit From b8a19f7ad4f8ef78f2c29a275b8c6057d37a13d5 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Tue, 6 Feb 2018 10:59:48 -0500 Subject: Some quick updates to lumina-terminal --- .../lumina-desktop-unified.desktop | 29 +--------------------- .../src-desktop/DesktopManager.cpp | 8 +++--- 2 files changed, 5 insertions(+), 32 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/lumina-desktop-unified.desktop b/src-qt5/core/lumina-desktop-unified/lumina-desktop-unified.desktop index 33681964..9f082647 100644 --- a/src-qt5/core/lumina-desktop-unified/lumina-desktop-unified.desktop +++ b/src-qt5/core/lumina-desktop-unified/lumina-desktop-unified.desktop @@ -4,31 +4,4 @@ TryExec=lumina-desktop-unified Icon=Lumina-DE Type=Application Name=Lumina 2 -Name[de]=Lumina -Name[en_GB]=Lumina -Name[en_ZA]=Lumina -Name[et]=Lumina -Name[fr]=Lumina -Name[fr_CA]=Lumina -Name[hi]=ल्यूमिना -Name[ja]=Lumina -Name[mt]=Lumina -Name[pl]=Lumina -Name[pt_BR]=Lumina -Name[ru]=Lumina -Name[uk]=Lumina -Name[vi]=Lumina -Comment=A Lightweight Desktop for FreeBSD -Comment[de]=Eine leichtgewichtige Arbeitsplatzumgebung für FreeBSD -Comment[en_GB]=A Lightweight Desktop for FreeBSD -Comment[en_ZA]=A Lightweight Desktop for FreeBSD -Comment[et]=Minimalistlik töölauakeskkond FreeBSD-le -Comment[fr]=Un environnement bureau léger pour FreeBSD -Comment[fr_CA]=Un environnement bureau léger pour FreeBSD -Comment[hi]=एक हल्का डेस्कटॉप फ्री बी.एस.डी के लिए -Comment[ja]=FreeBSD の為に作られた軽快なデスクトップ環境 -Comment[mt]=A Desktop irqiq għal FreeBSD -Comment[pl]=Lekkie Środowisko graficzne dla FreeBSD -Comment[pt_BR]=Um ambiente de trabalho leve para FreeBSD -Comment[uk]=Легковісне оточення стільниці для FreeBSD -Comment[vi]=Một máy tính để bàn nhẹ cho FreeBSD +Comment=Illuminating the desktop diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp index 35bd288d..73cd6645 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp @@ -142,19 +142,19 @@ void DesktopManager::syncWindowList(){ void DesktopManager::syncTrayWindowList(){ QList allWins = Lumina::NWS->currentTrayWindows(); - qDebug() << "Synced Tray Window List:" << allWins.length(); + //qDebug() << "Synced Tray Window List:" << allWins.length(); RootDesktopObject::instance()->setTrayWindows(allWins); } // === PRIVATE SLOTS === void DesktopManager::updateSessionSettings(){ - qDebug() << "Update Session Settings..."; + //qDebug() << "Update Session Settings..."; RootDesktopObject::instance()->updateCurrentTimeFormat(DesktopSettings::instance()->value(DesktopSettings::Session, "datetime_format", "").toString()); } void DesktopManager::updateDesktopSettings(){ - qDebug() << "Update Desktop Settings..."; + //qDebug() << "Update Desktop Settings..."; QList scrns = QGuiApplication::screens(); int wkspace = Lumina::NWS->currentWorkspace(); for(int i=0; iname(), wkspace); } @@ -164,7 +164,7 @@ void DesktopManager::updateDesktopSettings(){ void DesktopManager::updatePanelSettings(){ QList scrns = QGuiApplication::screens(); int primary = QApplication::desktop()->primaryScreen(); - qDebug() << "Panel Settings Changed:" << primary << scrns.length(); + //qDebug() << "Panel Settings Changed:" << primary << scrns.length(); QStringList total_ids; for(int i=0; iname(); -- cgit From 4455528cd9cd0b0594c3bcabf619a50e64e37832 Mon Sep 17 00:00:00 2001 From: q5sys Date: Wed, 7 Feb 2018 14:37:49 -0500 Subject: add shell logout to Lumina --- src-qt5/core/lumina-desktop/LSession.cpp | 2 +- src-qt5/core/lumina-desktop/lumina-desktop.pro | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop/LSession.cpp b/src-qt5/core/lumina-desktop/LSession.cpp index 111a17b6..7eafcde7 100644 --- a/src-qt5/core/lumina-desktop/LSession.cpp +++ b/src-qt5/core/lumina-desktop/LSession.cpp @@ -272,7 +272,7 @@ void LSession::NewCommunication(QStringList list){ screensChanged(); }else if(list[i]=="--show-start"){ emit StartButtonActivated(); - } + }else if(list[i]=="--logout"){ QTimer::singleShot(1000, this, SLOT(StartLogout()));} } } diff --git a/src-qt5/core/lumina-desktop/lumina-desktop.pro b/src-qt5/core/lumina-desktop/lumina-desktop.pro index e36d11a2..1c9e9268 100644 --- a/src-qt5/core/lumina-desktop/lumina-desktop.pro +++ b/src-qt5/core/lumina-desktop/lumina-desktop.pro @@ -172,6 +172,8 @@ TRANSLATIONS = i18n/lumina-desktop_af.ts \ dotrans.path=$${L_SHAREDIR}/lumina-desktop/i18n/ dotrans.extra=cd $$PWD/i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/ +link.extra=ln -sf "lumina-desktop --logout" $(INSTALL_ROOT)$${L_BINDIR}/llogout + manpage.path=$${L_MANDIR}/man1/ manpage.extra="$${MAN_ZIP} $$PWD/lumina-desktop.1 > $(INSTALL_ROOT)$${L_MANDIR}/man1/lumina-desktop.1.gz" -- cgit From dc18ed78126c752a6519d4827fb0b6d520aab08e Mon Sep 17 00:00:00 2001 From: q5sys Date: Wed, 7 Feb 2018 14:41:07 -0500 Subject: Revert "add shell logout to Lumina" This reverts commit 4455528cd9cd0b0594c3bcabf619a50e64e37832. --- src-qt5/core/lumina-desktop/LSession.cpp | 2 +- src-qt5/core/lumina-desktop/lumina-desktop.pro | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop/LSession.cpp b/src-qt5/core/lumina-desktop/LSession.cpp index 7eafcde7..111a17b6 100644 --- a/src-qt5/core/lumina-desktop/LSession.cpp +++ b/src-qt5/core/lumina-desktop/LSession.cpp @@ -272,7 +272,7 @@ void LSession::NewCommunication(QStringList list){ screensChanged(); }else if(list[i]=="--show-start"){ emit StartButtonActivated(); - }else if(list[i]=="--logout"){ QTimer::singleShot(1000, this, SLOT(StartLogout()));} + } } } diff --git a/src-qt5/core/lumina-desktop/lumina-desktop.pro b/src-qt5/core/lumina-desktop/lumina-desktop.pro index 1c9e9268..e36d11a2 100644 --- a/src-qt5/core/lumina-desktop/lumina-desktop.pro +++ b/src-qt5/core/lumina-desktop/lumina-desktop.pro @@ -172,8 +172,6 @@ TRANSLATIONS = i18n/lumina-desktop_af.ts \ dotrans.path=$${L_SHAREDIR}/lumina-desktop/i18n/ dotrans.extra=cd $$PWD/i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/ -link.extra=ln -sf "lumina-desktop --logout" $(INSTALL_ROOT)$${L_BINDIR}/llogout - manpage.path=$${L_MANDIR}/man1/ manpage.extra="$${MAN_ZIP} $$PWD/lumina-desktop.1 > $(INSTALL_ROOT)$${L_MANDIR}/man1/lumina-desktop.1.gz" -- cgit From 5b63bc57c9e36ea69da2ace22a78680200b713ae Mon Sep 17 00:00:00 2001 From: q5sys Date: Wed, 7 Feb 2018 14:45:58 -0500 Subject: redo shell logout to Lumina --- src-qt5/core/lumina-desktop/LSession.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop/LSession.cpp b/src-qt5/core/lumina-desktop/LSession.cpp index 111a17b6..7eafcde7 100644 --- a/src-qt5/core/lumina-desktop/LSession.cpp +++ b/src-qt5/core/lumina-desktop/LSession.cpp @@ -272,7 +272,7 @@ void LSession::NewCommunication(QStringList list){ screensChanged(); }else if(list[i]=="--show-start"){ emit StartButtonActivated(); - } + }else if(list[i]=="--logout"){ QTimer::singleShot(1000, this, SLOT(StartLogout()));} } } -- cgit From bac1b2939742ea275ac4b42cc881ad6cd4f16919 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Fri, 9 Feb 2018 14:16:31 -0500 Subject: Bump the minor version of Lumina to 1.4.2 This includes some larger changes to lumina-pdf, and some fixes for the 1.x session (battery chimes and such) --- src-qt5/core/libLumina/LDesktopUtils.cpp | 2 +- src-qt5/core/lumina-desktop/LSession.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/libLumina/LDesktopUtils.cpp b/src-qt5/core/libLumina/LDesktopUtils.cpp index 5595532a..fb44531a 100644 --- a/src-qt5/core/libLumina/LDesktopUtils.cpp +++ b/src-qt5/core/libLumina/LDesktopUtils.cpp @@ -14,7 +14,7 @@ #include "LuminaThemes.h" QString LDesktopUtils::LuminaDesktopVersion(){ - QString ver = "1.4.1"; + QString ver = "1.4.2"; #ifdef GIT_VERSION ver.append( QString(" (Git Revision: %1)").arg(GIT_VERSION) ); #endif diff --git a/src-qt5/core/lumina-desktop/LSession.cpp b/src-qt5/core/lumina-desktop/LSession.cpp index 7eafcde7..c1f49fc3 100644 --- a/src-qt5/core/lumina-desktop/LSession.cpp +++ b/src-qt5/core/lumina-desktop/LSession.cpp @@ -29,6 +29,7 @@ XCBEventFilter *evFilter = 0; LIconCache *ICONS = 0; LSession::LSession(int &argc, char ** argv) : LSingleApplication(argc, argv, "lumina-desktop"){ + xchange = false; if(this->isPrimaryProcess()){ connect(this, SIGNAL(InputsAvailable(QStringList)), this, SLOT(NewCommunication(QStringList)) ); this->setApplicationName("Lumina Desktop Environment"); -- cgit From 68313cf92a0b00b2c8dc94ed6821102012e36d76 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Tue, 13 Feb 2018 12:32:55 -0500 Subject: Quick update for the icon finder routine. Make sure that Qt does not blindly find a related icon before going through the default/pixmap routines. Qt does not seem to respect icon theme inheritance with a "hicolor" default theme. --- src-qt5/core/libLumina/LuminaXDG.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/libLumina/LuminaXDG.cpp b/src-qt5/core/libLumina/LuminaXDG.cpp index e1c582d9..95585f1e 100644 --- a/src-qt5/core/libLumina/LuminaXDG.cpp +++ b/src-qt5/core/libLumina/LuminaXDG.cpp @@ -853,9 +853,12 @@ QIcon LXDG::findIcon(QString iconName, QString fallback){ QIcon tmp; if(!iconName.contains("libreoffice")){ //libreoffice is stupid - their svg icons are un-renderable with Qt tmp = QIcon::fromTheme(iconName); + /*if(iconName.contains("start-here")){ + qDebug() << "[ICON]" << iconName << "found:" << !tmp.isNull() << tmp.name(); + }*/ //if(tmp.isNull()){ tmp = QIcon::fromTheme(fallback); } } - if(!tmp.isNull()){ return tmp; } //found one in the theme + if(!tmp.isNull() && tmp.name()==iconName){ return tmp; } //found this in the theme //NOTE: This was re-written on 11/10/15 to avoid using the QIcon::fromTheme() framework @@ -964,6 +967,8 @@ QIcon LXDG::findIcon(QString iconName, QString fallback){ else if(iconName.contains("-x-") && !iconName.endsWith("-x-generic")){ //mimetype - try to use the generic type icon ico = LXDG::findIcon(iconName.section("-x-",0,0)+"-x-generic", ""); + }else if(iconName.contains("-")){ + ico = LXDG::findIcon(iconName.section("-",0,-2), ""); //chop the last modifier off the end and try again } } if(ico.isNull()){ -- cgit From 9e5a4904de5f70d1686d824d024a0ea3ad0f547c Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Wed, 28 Feb 2018 16:42:53 -0500 Subject: Some work on Lumina 2. 1. Get dynamic loading of panel plugins functional. 2. Get some layout work for the panels functional (clock plugin still not aligned right - size issue?) 3. Looks like something related to the gridLayout flow pattern is still not getting respected. --- .../src-desktop/src-cpp/PanelObject.cpp | 29 +++++++++++++++ .../src-desktop/src-cpp/PanelObject.h | 5 +++ .../src-desktop/src-qml/Panel.qml | 42 ++++++++++------------ .../src-desktop/src-qml/plugins/Clock_Digital.qml | 8 +++-- .../src-desktop/src-qml/plugins/Spacer.qml | 5 ++- .../src-desktop/src-qml/plugins/StatusTray.qml | 21 ++++++----- 6 files changed, 72 insertions(+), 38 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.cpp index 9b7b8da7..e8830bde 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.cpp @@ -34,6 +34,10 @@ bool PanelObject::isVertical(){ return ( geom.width() < geom.height() ); } +QStringList PanelObject::plugins(){ + return panel_plugins; +} + void PanelObject::setBackground(QString fileOrColor){ if(bg!=fileOrColor){ bg = fileOrColor; @@ -48,6 +52,30 @@ void PanelObject::setGeometry( QRect newgeom ){ } } +void PanelObject::setPlugins( QStringList plist){ + //Iterate through the list and find the URL's for the files + QStringList dirs; dirs << ":/qml/plugins/"; //add local directories here + for(int i=0; iemit pluginsChanged(); + } +} + void PanelObject::syncWithSettings(QRect parent_geom){ //Read off all the settings QString id = panel_id.section("/",-1); //last section (allow for prefixes to distinguish multiple monitors with the same profile but different screens) @@ -88,4 +116,5 @@ void PanelObject::syncWithSettings(QRect parent_geom){ newgeom.translate(parent_geom.x(), parent_geom.y()); //qDebug() << " - Calculated Geometry (global):" << newgeom; this->setGeometry(newgeom); //shift to global coordinates + this->setPlugins( DesktopSettings::instance()->value(DesktopSettings::Panels, id+"/plugins", QStringList()).toStringList() ); } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.h index 04c47e06..945deec0 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/PanelObject.h @@ -21,10 +21,12 @@ class PanelObject : public QObject { Q_PROPERTY( int width READ width NOTIFY geomChanged) Q_PROPERTY( int height READ height NOTIFY geomChanged) Q_PROPERTY( bool isVertical READ isVertical NOTIFY geomChanged) + Q_PROPERTY( QStringList plugins READ plugins NOTIFY pluginsChanged) private: QString panel_id, bg; QRect geom; + QStringList panel_plugins; public: PanelObject(QString id = "", QObject *parent = 0); @@ -38,15 +40,18 @@ public: Q_INVOKABLE int width(); Q_INVOKABLE int height(); Q_INVOKABLE bool isVertical(); + Q_INVOKABLE QStringList plugins(); public slots: void setBackground(QString fileOrColor); void setGeometry(QRect newgeom); void syncWithSettings(QRect parent_geom); + void setPlugins(QStringList plist); signals: void backgroundChanged(); void geomChanged(); + void pluginsChanged(); }; #endif diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml index 2a8579a8..65c8a0eb 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/Panel.qml @@ -10,13 +10,13 @@ import QtQuick.Controls 1 import QtQuick.Layouts 1.3 import Lumina.Backend.PanelObject 2.0 -import "./plugins" as PLUGINS Rectangle { //C++ backend object property string panel_id property PanelObject object + id: panel //Normal geometries/placements color: object.background x: object.x @@ -26,30 +26,24 @@ Rectangle { GridLayout{ id: layout - anchors.fill: parent; - columns: parent.object.isVertical ? 1 : -1 - rows: parent.object.isVertical ? -1 : 1 + anchors.fill: parent + //columns: parent.object.isVertical ? 1 : -1 + //rows: parent.object.isVertical ? -1 : 1 + flow: parent.isVertical ? GridLayout.TopToBottom : GridLayout.LeftToRight + //horizontalItemAlignment: parent.object.isVertical ? Grid.AlignHCenter : Qt.AlignLeft + //verticalItemAlignment: parent.object.isVertical ? Grid.AlignTop : Qt.AlignVCenter + Repeater { + model: panel.object.plugins + Loader{ + asynchronous: true + property bool vertical : layout.parent.object.isVertical + property bool isspacer : modelData.endsWith("/Spacer.qml"); + source: modelData + Layout.fillWidth : (vertical || isspacer) ? true : false + Layout.fillHeight : (vertical && ! isspacer) ? false : true + Layout.alignment : Qt.AlignVCenter | Qt.AlignHCenter + } - //hardcode some plugins for the moment - //PLUGINS.Spacer{} - - PLUGINS.StatusTray{ - id: "statustray" - vertical: layout.parent.object.isVertical - //Layout.fillWidth: layout.parent.object.isVertical ? true : false - //Layout.fillHeight: layout.parent.object.isVertical ? false : true - } - - //PLUGINS.Spacer{} - - PLUGINS.Clock_Digital{ - id: "clock" - vertical: layout.parent.object.isVertical - //Layout.fillWidth: layout.parent.object.isVertical ? true : false - //Layout.fillHeight: layout.parent.object.isVertical ? false : true } - - //PLUGINS.Spacer{} - } //end of grid layout } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Clock_Digital.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Clock_Digital.qml index f82d398b..e68788f6 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Clock_Digital.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Clock_Digital.qml @@ -13,9 +13,11 @@ import QtQuick.Controls 1 import Lumina.Backend.RootDesktopObject 2.0 Label{ - property bool vertical + anchors.fill: parent text: RootObject.currentTime - wrapMode: Text.WrapWord - rotation: vertical ? 90 : 0 + wrapMode: Text.WordWrap + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + rotation: parent.vertical ? 90 : 0 transformOrigin: Item.Center } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Spacer.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Spacer.qml index d46e486c..93556790 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Spacer.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/Spacer.qml @@ -4,13 +4,12 @@ // Available under the 3-clause BSD license // See the LICENSE file for full details //=========================================== -// This is the QML plugin that displays the OS status/system tray +// This is a tiny QML plugin for a basic Item which can be set to grow //=========================================== import QtQuick 2.2 import QtQuick.Layouts 1.3 Item{ - Layout.fillWidth: true - Layout.fillHeight: true + anchors.fill: parent } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml index a2d49b35..f4063ed9 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/plugins/StatusTray.qml @@ -17,42 +17,47 @@ import "./status_tray" as QML Item { - property bool vertical - property int prefsize: vertical ? parent.width : parent.height + property int prefsize: parent.vertical ? parent.width : parent.height id: "status_tray" + anchors.fill: parent GridLayout{ anchors.fill: parent - flow: parent.vertical ? GridLayout.TopToBottom : GridLayout.LeftToRight - columns: vertical ? 2 : -1 - rows: vertical ? -1 : 2 - //columnSpacing: 2 - //rowSpacing: 2 + flow: status_tray.parent.vertical ? GridLayout.TopToBottom : GridLayout.LeftToRight + //columns: vertical ? 1 : -1 + //rows: vertical ? -1 : 1 + columnSpacing: 2 + rowSpacing: 2 //Volume Status QML.VolumeButton{ //Layout.preferredHeight: status_tray.prefsize //Layout.preferredWidth: status_tray.prefsize + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter } //Network Status QML.NetworkButton{ //Layout.preferredHeight: status_tray.prefsize //Layout.preferredWidth: status_tray.prefsize + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter } //Battery Status QML.BatteryButton{ //Layout.preferredHeight: status_tray.prefsize //Layout.preferredWidth: status_tray.prefsize + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter } //Update Status QML.UpdateButton{ //Layout.preferredHeight: status_tray.prefsize //Layout.preferredWidth: status_tray.prefsize + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter } //System Tray Menu Button ToolButton{ id: "trayButton" text: "Tray" + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter //iconName: "view-more-vertical" visible: RootObject.hasTrayWindows onClicked: trayMenu.open() @@ -60,7 +65,7 @@ Item { id: "trayMenu" //MenuItem{ text: "sample" } //MenuItem{ text: "sample2" } - //Rectangle{ color: "blue"; width: 50; height: 50 } + Rectangle{ color: "blue"; width: 48; height: 48 } GridLayout{ columns: 4 Repeater{ -- cgit From c67e9b998ee8078065d53823ec790999b9cce62f Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Wed, 28 Feb 2018 23:29:01 -0500 Subject: Start writing up research on how to do the keyboard event listening. --- .../lumina-desktop-unified/src-events/NativeWindowSystem.cpp | 9 +++++++++ .../core/lumina-desktop-unified/src-events/NativeWindowSystem.h | 2 ++ 2 files changed, 11 insertions(+) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp index 9e2e7bba..b9c1b6ef 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.cpp @@ -274,6 +274,15 @@ void NativeWindowSystem::stop(){ } +void NativeWindowSystem::RegisterEventShortcut(Qt::Key key, bool set){ +//RegisterEventShortcut( , set); +} + +void NativeWindowSystem::RegisterEventShortcut(int keycode, bool set){ + //xcb_input_grab_device_button_checked + //xcb_input_xi_passive_grab_device_unchecked +} + // === PRIVATE === NativeWindowObject* NativeWindowSystem::findWindow(WId id, bool checkRelated){ //qDebug() << "Find Window:" << id; diff --git a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h index 74849cf4..0b6cd67e 100644 --- a/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h +++ b/src-qt5/core/lumina-desktop-unified/src-events/NativeWindowSystem.h @@ -79,6 +79,8 @@ public: //Small simplification functions static Qt::Key KeycodeToQt(int keycode); static NativeWindowSystem::MouseButton MouseToQt(int button); + void RegisterEventShortcut(Qt::Key key, bool set); + void RegisterEventShortcut(int keycode, bool set); void raiseWindow(NativeWindowObject *win); void lowerWindow(NativeWindowObject *win); -- cgit From 80fa887a948817f796c76fd759067ccfd77c92cc Mon Sep 17 00:00:00 2001 From: boronology Date: Fri, 2 Mar 2018 23:34:09 +0900 Subject: enable to set volumeup/down parcentage --- src-qt5/core/lumina-open/main.cpp | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-open/main.cpp b/src-qt5/core/lumina-open/main.cpp index 2b9e9184..e53181f9 100644 --- a/src-qt5/core/lumina-open/main.cpp +++ b/src-qt5/core/lumina-open/main.cpp @@ -185,17 +185,33 @@ return; LaunchAutoStart(); return; }else if(QString(argv[i]).simplified() == "-volumeup"){ -int vol = LOS::audioVolume()+5; //increase 5% -if(vol>100){ vol=100; } -LOS::setAudioVolume(vol); -showOSD(argc,argv, QString(QObject::tr("Audio Volume %1%")).arg(QString::number(vol)) ); -return; + bool isInt = false; + int volupVal = 5; + if(argc > i){ + int parse = QString(argv[i+1]).toInt(&isInt,10); + if(isInt && 0 < parse && parse <= 20){ + volupVal = parse; + } + } + int vol = LOS::audioVolume()+volupVal; + if(vol>100){ vol=100; } + LOS::setAudioVolume(vol); + showOSD(argc,argv, QString(QObject::tr("Audio Volume %1%")).arg(QString::number(vol)) ); + return; }else if(QString(argv[i]).simplified() == "-volumedown"){ -int vol = LOS::audioVolume()-5; //decrease 5% -if(vol<0){ vol=0; } -LOS::setAudioVolume(vol); -showOSD(argc,argv, QString(QObject::tr("Audio Volume %1%")).arg(QString::number(vol)) ); -return; + bool isInt = false; + int voldownVal = 5; + if(argc > i){ + int parse = QString(argv[i+1]).toInt(&isInt,10); + if(isInt && 0 < parse && parse <= 20){ + voldownVal = parse; + } + } + int vol = LOS::audioVolume()-voldownVal; //decrease 5% + if(vol<0){ vol=0; } + LOS::setAudioVolume(vol); + showOSD(argc,argv, QString(QObject::tr("Audio Volume %1%")).arg(QString::number(vol)) ); + return; }else if(QString(argv[i]).simplified() == "-brightnessup"){ int bright = LOS::ScreenBrightness(); if(bright > 0){ //brightness control available -- cgit From 380c826f4dd98f00f7d0cde45fe48e652cdaa483 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Mon, 5 Mar 2018 15:26:59 -0500 Subject: Make the cursor theme change a but more dynamic. Can't seem to force a reload of the Qt cursor cache (for now), but this seems to fix it in Fluxbox right away. --- .../lthemeengine-qtplugin.pro | 3 + .../lthemeengineplatformtheme.cpp | 88 +++++++++++++++++++++- .../lthemeengineplatformtheme.h | 4 + 3 files changed, 91 insertions(+), 4 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengine-qtplugin.pro b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengine-qtplugin.pro index 3dca4fd1..227a196e 100644 --- a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengine-qtplugin.pro +++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengine-qtplugin.pro @@ -21,6 +21,9 @@ SOURCES += \ OTHER_FILES += lthemeengine.json +LIBS += -lXcursor +QT += x11extras + INCLUDEPATH += ../ HEADERS += \ diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.cpp index e581b016..302ec2fc 100644 --- a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.cpp +++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.cpp @@ -7,14 +7,18 @@ #include #include #include + #ifdef QT_WIDGETS_LIB #include #include #include #include #endif + #include #include +#include +#include #include @@ -28,7 +32,11 @@ #include #endif - +#include +#include +//Need access to the private QCursor header so we can refresh the mouse cursor cache +//#include //Does not work - looks like we need to use X11 stuff instead +#include Q_LOGGING_CATEGORY(llthemeengine, "lthemeengine") @@ -37,10 +45,11 @@ Q_LOGGING_CATEGORY(llthemeengine, "lthemeengine") lthemeenginePlatformTheme::lthemeenginePlatformTheme(){ if(QGuiApplication::desktopSettingsAware()){ readSettings(); - QMetaObject::invokeMethod(this, "applySettings", Qt::QueuedConnection); #ifdef QT_WIDGETS_LIB QMetaObject::invokeMethod(this, "createFSWatcher", Qt::QueuedConnection); #endif + QMetaObject::invokeMethod(this, "applySettings", Qt::QueuedConnection); + QGuiApplication::setFont(m_generalFont); } //qCDebug(llthemeengine) << "using lthemeengine plugin"; @@ -168,16 +177,26 @@ void lthemeenginePlatformTheme::applySettings(){ } #endif if(!m_update){ m_update = true; } + + //Mouse Cursor syncronization + QString mthemefile = QDir::homePath()+"/.icons/default/index.theme"; + if(!watcher->files().contains(mthemefile) && QFile::exists(mthemefile)){ + watcher->addPath(mthemefile); //X11 mouse cursor theme file + //qDebug() << "Add Mouse Cursor File to Watcher"; + syncMouseCursorTheme(mthemefile); + } } #ifdef QT_WIDGETS_LIB void lthemeenginePlatformTheme::createFSWatcher(){ - QFileSystemWatcher *watcher = new QFileSystemWatcher(this); - watcher->addPath(lthemeengine::configPath()); + watcher = new QFileSystemWatcher(this); + watcher->addPath(lthemeengine::configPath()); //theme engine settings directory + watcher->addPath(QDir::homePath()+"/.icons/default/index.theme"); //X11 mouse cursor theme file QTimer *timer = new QTimer(this); timer->setSingleShot(true); timer->setInterval(500); connect(watcher, SIGNAL(directoryChanged(QString)), timer, SLOT(start())); + connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT(fileChanged(QString)) ); connect(timer, SIGNAL(timeout()), SLOT(updateSettings())); } @@ -188,6 +207,13 @@ void lthemeenginePlatformTheme::updateSettings(){ } #endif +void lthemeenginePlatformTheme::fileChanged(QString path){ + if(path.endsWith("default/index.theme")){ + //qDebug() << "Mouse Cursor File Changed"; + syncMouseCursorTheme(path); + } +} + void lthemeenginePlatformTheme::readSettings(){ if(m_customPalette){ delete m_customPalette; @@ -294,3 +320,57 @@ QPalette lthemeenginePlatformTheme::loadColorScheme(QString filePath){ else{ customPalette = *QPlatformTheme::palette(SystemPalette); } //load fallback palette return customPalette; } + +void lthemeenginePlatformTheme::syncMouseCursorTheme(QString indexfile){ + //Read the index file and pull out the theme name + QFile file(indexfile); + QString newtheme; + if(file.open(QIODevice::ReadOnly)){ + QTextStream stream(&file); + QString tmp; + while(!stream.atEnd()){ + tmp = stream.readLine().simplified(); + if(tmp.startsWith("Inherits=")){ newtheme = tmp.section("=",1,-1).simplified(); break; } + } + file.close(); + } + if(newtheme.isEmpty()){ return; } //nothing to do + QString curtheme = QString(XcursorGetTheme(QX11Info::display()) ); //currently-used theme + //qDebug() << "Sync Mouse Cursur Theme:" << curtheme << newtheme; + if(curtheme!=newtheme){ + qDebug() << " - Setting new cursor theme:" << newtheme; + XcursorSetTheme(QX11Info::display(), newtheme.toLocal8Bit().data()); //save the new theme name + }else{ + return; + } + qDebug() << "Qt Stats:"; + qDebug() << " TopLevelWindows:" << QGuiApplication::topLevelWindows().length(); + qDebug() << " AllWindows:" << QGuiApplication::allWindows().length(); + qDebug() << " AllWidgets:" << QApplication::allWidgets().length(); + + //XcursorSetThemeCore( QX11Info::display(), XcursorGetThemeCore(QX11Info::display()) ); //reset the theme core + //Load the cursors from the new theme + int defsize = XcursorGetDefaultSize(QX11Info::display()); + qDebug() << "Default cursor size:" << defsize; + XcursorImages *imgs = XcursorLibraryLoadImages("left_ptr", NULL, defsize); + qDebug() << "imgs:" << imgs << imgs->nimage; + XcursorCursors *curs = XcursorImagesLoadCursors(QX11Info::display(), imgs); + if(curs==0){ return; } //not found + qDebug() << "Got Cursors:" << curs->ncursor; + //Now re-set the cursors for the current top-level X windows + QWindowList wins = QGuiApplication::allWindows(); //QGuiApplication::topLevelWindows(); + qDebug() << "Got Windows:" << wins.length(); + for(int i=0; incursor; i++){ + for(int w=0; wdpy, wins[w]->winId(), curs->cursors[i]); + } + } + XcursorCursorsDestroy(curs); //finished with this temporary structure + + /*QWidgetList wlist = QApplication::allWidgets(); + qDebug() << "Widget List:" << wlist.length(); + for(int i=0; icursor().shape()); + wlist[i]->cursor().swap( cur ); + }*/ +} diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.h index f521d457..359236b7 100644 --- a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.h +++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.h @@ -6,6 +6,7 @@ #include #include #include +#include #if (QT_VERSION < QT_VERSION_CHECK(5, 5, 0)) #ifndef QT_NO_SYSTEMTRAYICON @@ -58,6 +59,7 @@ private slots: void createFSWatcher(); void updateSettings(); #endif + void fileChanged(QString); private: void readSettings(); @@ -77,6 +79,7 @@ private: bool m_usePalette = true; int m_toolButtonStyle = Qt::ToolButtonFollowStyle; int m_wheelScrollLines = 3; + QFileSystemWatcher *watcher; #if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) && !defined(QT_NO_DBUS) mutable bool m_dbusGlobalMenuAvailable = false; mutable bool m_checkDBusGlobalMenu = true; @@ -86,6 +89,7 @@ private: mutable bool m_checkDBusTray = true; #endif + void syncMouseCursorTheme(QString indexfile); }; Q_DECLARE_LOGGING_CATEGORY(llthemeengine) -- cgit From ef784071eac09f0868ee1f354c91c41f14d8df31 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Mon, 5 Mar 2018 15:29:02 -0500 Subject: Turn off all the debugging output in the cursor change code in the theme engine. --- .../lthemeengine-qtplugin/lthemeengineplatformtheme.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.cpp index 302ec2fc..789b3990 100644 --- a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.cpp +++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.cpp @@ -343,23 +343,23 @@ void lthemeenginePlatformTheme::syncMouseCursorTheme(QString indexfile){ }else{ return; } - qDebug() << "Qt Stats:"; - qDebug() << " TopLevelWindows:" << QGuiApplication::topLevelWindows().length(); - qDebug() << " AllWindows:" << QGuiApplication::allWindows().length(); - qDebug() << " AllWidgets:" << QApplication::allWidgets().length(); + //qDebug() << "Qt Stats:"; + //qDebug() << " TopLevelWindows:" << QGuiApplication::topLevelWindows().length(); + //qDebug() << " AllWindows:" << QGuiApplication::allWindows().length(); + //qDebug() << " AllWidgets:" << QApplication::allWidgets().length(); //XcursorSetThemeCore( QX11Info::display(), XcursorGetThemeCore(QX11Info::display()) ); //reset the theme core //Load the cursors from the new theme int defsize = XcursorGetDefaultSize(QX11Info::display()); - qDebug() << "Default cursor size:" << defsize; + //qDebug() << "Default cursor size:" << defsize; XcursorImages *imgs = XcursorLibraryLoadImages("left_ptr", NULL, defsize); - qDebug() << "imgs:" << imgs << imgs->nimage; + //qDebug() << "imgs:" << imgs << imgs->nimage; XcursorCursors *curs = XcursorImagesLoadCursors(QX11Info::display(), imgs); if(curs==0){ return; } //not found - qDebug() << "Got Cursors:" << curs->ncursor; + //qDebug() << "Got Cursors:" << curs->ncursor; //Now re-set the cursors for the current top-level X windows QWindowList wins = QGuiApplication::allWindows(); //QGuiApplication::topLevelWindows(); - qDebug() << "Got Windows:" << wins.length(); + //qDebug() << "Got Windows:" << wins.length(); for(int i=0; incursor; i++){ for(int w=0; wdpy, wins[w]->winId(), curs->cursors[i]); -- cgit From 59f8dab8a85950d08d0044e3a2500df58fc5d9a8 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Tue, 6 Mar 2018 11:07:23 -0500 Subject: Update the i18N translation files (sync with sources) Also add in the new pandora shortcut for lumina-mediaplayer (*.desktop) --- .../core/lumina-desktop/i18n/lumina-desktop_af.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_ar.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_az.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_bg.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_bn.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_bs.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_ca.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_cs.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_cy.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_da.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_de.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_el.ts | 38 +++++++++++----------- .../lumina-desktop/i18n/lumina-desktop_en_AU.ts | 38 +++++++++++----------- .../lumina-desktop/i18n/lumina-desktop_en_GB.ts | 38 +++++++++++----------- .../lumina-desktop/i18n/lumina-desktop_en_ZA.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_es.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_et.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_eu.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_fa.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_fi.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_fr.ts | 38 +++++++++++----------- .../lumina-desktop/i18n/lumina-desktop_fr_CA.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_gl.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_he.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_hi.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_hr.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_hu.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_id.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_is.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_it.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_ja.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_ka.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_ko.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_lt.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_lv.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_mk.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_mn.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_ms.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_mt.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_nb.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_nl.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_pa.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_pl.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_pt.ts | 38 +++++++++++----------- .../lumina-desktop/i18n/lumina-desktop_pt_BR.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_ro.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_ru.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_sk.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_sl.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_sr.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_sv.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_sw.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_ta.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_tg.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_th.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_tr.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_uk.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_uz.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_vi.ts | 38 +++++++++++----------- .../lumina-desktop/i18n/lumina-desktop_zh_CN.ts | 38 +++++++++++----------- .../lumina-desktop/i18n/lumina-desktop_zh_HK.ts | 38 +++++++++++----------- .../lumina-desktop/i18n/lumina-desktop_zh_TW.ts | 38 +++++++++++----------- .../core/lumina-desktop/i18n/lumina-desktop_zu.ts | 38 +++++++++++----------- src-qt5/core/lumina-open/i18n/lumina-open_af.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_ar.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_az.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_bg.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_bn.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_bs.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_ca.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_cs.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_cy.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_da.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_de.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_el.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_en_AU.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_en_GB.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_en_ZA.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_es.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_et.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_eu.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_fa.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_fi.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_fr.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_fr_CA.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_gl.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_he.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_hi.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_hr.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_hu.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_id.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_is.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_it.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_ja.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_ka.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_ko.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_lt.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_lv.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_mk.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_mn.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_ms.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_mt.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_nb.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_nl.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_pa.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_pl.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_pt.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_pt_BR.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_ro.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_ru.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_sk.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_sl.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_sr.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_sv.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_sw.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_ta.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_tg.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_th.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_tr.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_uk.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_uz.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_vi.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_zh_CN.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_zh_HK.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_zh_TW.ts | 26 +++++++-------- src-qt5/core/lumina-open/i18n/lumina-open_zu.ts | 26 +++++++-------- 126 files changed, 2016 insertions(+), 2016 deletions(-) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_af.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_af.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_af.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_af.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ar.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ar.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ar.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ar.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_az.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_az.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_az.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_az.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bg.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bg.ts index d17703bb..e491dbee 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bg.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bg.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (зарежда се) - + %1 % (%2 Remaining) %1 % (%2 оставащи) @@ -855,8 +855,8 @@ LSession - - + + Desktop Работен плот @@ -1301,37 +1301,37 @@ Lumina Desktop RSS - + Feed URL: %1 Адрес на източника: %1 - + Title: %1 Заглавие: %1 - + Description: %1 Описание: %1 - + Website: %1 Уеб сайт: %1 - + Last Build Date: %1 Последно обновен: %1 - + Last Sync: %1 Последно синхронизиран: %1 - + Next Sync: %1 Следваща синхронизация: %1 @@ -1517,43 +1517,43 @@ Настройки на системата - + Log Out Отписване - + Restart Рестартиране - + Power Off - + Update Now - + Updates ready to install - + Cancel Отказ - + Lock Заключване - + Suspend Изключване diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bn.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bn.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bn.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bn.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bs.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bs.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bs.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bs.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ca.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ca.ts index 4a65596e..c0183f05 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ca.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ca.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (Carregant) - + %1 % (%2 Remaining) %1 % (resten %2) @@ -855,8 +855,8 @@ LSession - - + + Desktop Escriptori @@ -1301,37 +1301,37 @@ RSS de l'escriptori Lumina - + Feed URL: %1 URL del canal: %1 - + Title: %1 Títol: %1 - + Description: %1 Descripció: %1 - + Website: %1 Lloc web: %1 - + Last Build Date: %1 Data de l'última construcció: %1 - + Last Sync: %1 Última sincronització: %1 - + Next Sync: %1 Propera sincronització: %1 @@ -1517,43 +1517,43 @@ Opcions del sistema - + Log Out Surt - + Restart Reinicia - + Power Off Atura - + Update Now - + Updates ready to install - + Cancel Cancel·la - + Lock Bloqueja - + Suspend Atura temporalment diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cs.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cs.ts index eab383cb..0cca1e1b 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cs.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cs.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (Nabíjení) - + %1 % (%2 Remaining) %1 % (%2 Zbývá) @@ -855,8 +855,8 @@ LSession - - + + Desktop Plocha @@ -1301,37 +1301,37 @@ RSS kanál prostředí Lumina - + Feed URL: %1 URL adresa kanálu: %1 - + Title: %1 Název: %1 - + Description: %1 Popis: %1 - + Website: %1 Webová stránka: %1 - + Last Build Date: %1 Datum minulého sestavení: %1 - + Last Sync: %1 Minulá synchronizace: %1 - + Next Sync: %1 Příští synchronizace: %1 @@ -1517,43 +1517,43 @@ Předvolby systému - + Log Out Odhlásit se - + Restart Restartovat - + Power Off Vypnout - + Update Now - + Updates ready to install - + Cancel Storno - + Lock Zamknout - + Suspend Uspat do paměti diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cy.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cy.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cy.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cy.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_da.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_da.ts index 2507a671..629f85ef 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_da.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_da.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (lader) - + %1 % (%2 Remaining) %1 % (%2 tilbage) @@ -855,8 +855,8 @@ LSession - - + + Desktop Skrivebord @@ -1301,37 +1301,37 @@ Lumina-skrivebordets RSS-læser - + Feed URL: %1 Feed-URL: %1 - + Title: %1 Titel: %1 - + Description: %1 Beskrivelse: %1 - + Website: %1 Hjemmeside: %1 - + Last Build Date: %1 Seneste byggedato: %1 - + Last Sync: %1 Seneste synkronisering: %1 - + Next Sync: %1 Næste synkronisering: %1 @@ -1517,43 +1517,43 @@ Systemvalgmuligheder - + Log Out Log ud - + Restart Genstart - + Power Off Sluk - + Update Now - + Updates ready to install - + Cancel Annuller - + Lock Lås - + Suspend Dvale diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_de.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_de.ts index 65b16cdd..8aab1f1d 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_de.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_de.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (Aufladen) - + %1 % (%2 Remaining) %1 % (%2 verbleibend) @@ -855,8 +855,8 @@ LSession - - + + Desktop Arbeitsfläche @@ -1301,37 +1301,37 @@ Lumina Desktop RSS - + Feed URL: %1 Feed-URL: %1 - + Title: %1 Titel: %1 - + Description: %1 Beschreibung: %1 - + Website: %1 Internet-Seite: %1 - + Last Build Date: %1 Letzte Erstellung: %1 - + Last Sync: %1 Letzter Abgleich: %1 - + Next Sync: %1 Nächster Abgleich: %1 @@ -1517,43 +1517,43 @@ Systemoptionen - + Log Out Abmelden - + Restart Neustart - + Power Off - + Update Now - + Updates ready to install - + Cancel Abbrechen - + Lock Sperren - + Suspend In Bereitschaft versetzen diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_el.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_el.ts index 341f847d..d0e3142f 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_el.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_el.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_AU.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_AU.ts index 52d0e88f..30e03f6d 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_AU.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_AU.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (Charging) - + %1 % (%2 Remaining) %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop Desktop @@ -1301,37 +1301,37 @@ Lumina Desktop RSS - + Feed URL: %1 Feed URL: %1 - + Title: %1 Title: %1 - + Description: %1 Description: %1 - + Website: %1 Website: %1 - + Last Build Date: %1 Last Build Date: %1 - + Last Sync: %1 Last Sync: %1 - + Next Sync: %1 Next Sync: %1 @@ -1517,43 +1517,43 @@ System Options - + Log Out Log Out - + Restart Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel Cancel - + Lock Lock - + Suspend Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_GB.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_GB.ts index ad847d47..36bfd83c 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_GB.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_GB.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (Charging) - + %1 % (%2 Remaining) %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop Desktop @@ -1301,37 +1301,37 @@ Lumina Desktop RSS - + Feed URL: %1 Feed URL: %1 - + Title: %1 Title: %1 - + Description: %1 Description: %1 - + Website: %1 Website: %1 - + Last Build Date: %1 Last Build Date: %1 - + Last Sync: %1 Last Sync: %1 - + Next Sync: %1 Next Sync: %1 @@ -1517,43 +1517,43 @@ System Options - + Log Out Log Out - + Restart Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel Cancel - + Lock Lock - + Suspend Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_ZA.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_ZA.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_ZA.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_ZA.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_es.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_es.ts index 60c6c305..a0403866 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_es.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_es.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (Cargando) - + %1 % (%2 Remaining) %1 % (%2 Restante) @@ -855,8 +855,8 @@ LSession - - + + Desktop Escritorio @@ -1301,37 +1301,37 @@ RSS del Escritorio Lumina - + Feed URL: %1 URL del Feed: %1 - + Title: %1 Título: %1 - + Description: %1 Descripción: %1 - + Website: %1 Sitio Web: %1 - + Last Build Date: %1 Última Actualización: %1 - + Last Sync: %1 Última Sincronización: %1 - + Next Sync: %1 Siguiente Sincronización: %1 @@ -1517,43 +1517,43 @@ Opciones del Sistema - + Log Out Cerrar Sesión - + Restart Reiniciar - + Power Off - + Update Now - + Updates ready to install - + Cancel Cancelar - + Lock Bloquear - + Suspend Suspender diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_et.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_et.ts index e1b60acb..09a5ab40 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_et.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_et.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1% (laeb) - + %1 % (%2 Remaining) %1% (%2 jäänud) @@ -855,8 +855,8 @@ LSession - - + + Desktop Töölaud @@ -1301,37 +1301,37 @@ Lumina Töölaua RSS - + Feed URL: %1 Uudisvoo URL: %1 - + Title: %1 Pealkiri: %1 - + Description: %1 Kirjeldus: %1 - + Website: %1 Veebileht: %1 - + Last Build Date: %1 Viimane koostamise aeg: %1 - + Last Sync: %1 Viimane sünkr.: %1 - + Next Sync: %1 Järgmine sünkr.: %1 @@ -1517,43 +1517,43 @@ Süsteemi valikud - + Log Out Logi välja - + Restart Taaskäivita - + Power Off Lülita välja - + Update Now - + Updates ready to install - + Cancel Loobu - + Lock Lukusta - + Suspend Arvuti peatamine diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_eu.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_eu.ts index be61c50d..9316f8df 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_eu.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_eu.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (Kargatzen) - + %1 % (%2 Remaining) %1 % (%2 Faltan) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out Saioa amaitu - + Restart Berrabiarazi - + Power Off - + Update Now - + Updates ready to install - + Cancel Utzi - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fa.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fa.ts index c066d6b2..c852493b 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fa.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fa.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fi.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fi.ts index 73bdf6d8..c66d6ae1 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fi.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fi.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (lataa) - + %1 % (%2 Remaining) %1 % (%2 jäljellä) @@ -855,8 +855,8 @@ LSession - - + + Desktop Työpöytä @@ -1301,37 +1301,37 @@ Lumina-työpöydän RSS - + Feed URL: %1 Syötteen verkko-osoite: %1 - + Title: %1 Otsikko: %1 - + Description: %1 Kuvaus: %1 - + Website: %1 Sivusto: %1 - + Last Build Date: %1 Viimeisin koostamispäivä: %1 - + Last Sync: %1 Viimeisin tahdistus: %1 - + Next Sync: %1 Seuraava tahdistus: %1 @@ -1517,43 +1517,43 @@ Järjestelmäasetukset - + Log Out Kirjaudu ulos - + Restart Käynnistä uudelleen - + Power Off - + Update Now - + Updates ready to install - + Cancel Peru - + Lock Lukitse - + Suspend Valmiustila diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr.ts index c0217392..197143cc 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (Chargement) - + %1 % (%2 Remaining) %1 % (%2 Restant) @@ -855,8 +855,8 @@ LSession - - + + Desktop Bureau @@ -1301,37 +1301,37 @@ Lecteur de RSS de Lumina - + Feed URL: %1 URL du Flux : %1 - + Title: %1 Titre : %1 - + Description: %1 Description : %1 - + Website: %1 Site Web : %1 - + Last Build Date: %1 Dernière Modification : %1 - + Last Sync: %1 Dernière Synchro. : %1 - + Next Sync: %1 Prochaine Synchro. : %1 @@ -1517,43 +1517,43 @@ Options Système - + Log Out Se Déconnecter - + Restart Redémarrer - + Power Off - + Update Now - + Updates ready to install - + Cancel Annuler - + Lock Verrouiller - + Suspend Mettre en Veille diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr_CA.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr_CA.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr_CA.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr_CA.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_gl.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_gl.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_gl.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_gl.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_he.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_he.ts index b494b2cb..f0aced27 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_he.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_he.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop שולחן עבודה @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out התנתק - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel ביטול - + Lock נעל - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hi.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hi.ts index cee9a94d..a13425bf 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hi.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hi.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 %(चार्ज हो रहा है) - + %1 % (%2 Remaining) %1 %(%2 बचा है) @@ -855,8 +855,8 @@ LSession - - + + Desktop डेस्कटॉप @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ उपकरण विकल्प - + Log Out लॉगआउट - + Restart दोबारा चालू - + Power Off - + Update Now - + Updates ready to install - + Cancel रद्द - + Lock लॉक - + Suspend रोकें diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hr.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hr.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hr.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hr.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hu.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hu.ts index 88455320..8ee910a6 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hu.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hu.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (Töltés) - + %1 % (%2 Remaining) %1 % (%2 hátralévő) @@ -855,8 +855,8 @@ LSession - - + + Desktop Asztal @@ -1301,37 +1301,37 @@ Lumina Desktop RSS - + Feed URL: %1 Hírcsatorna URL: %1 - + Title: %1 Cím: %1 - + Description: %1 Leírás: %1 - + Website: %1 Weboldal: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 Következő frissítés: %1 @@ -1517,43 +1517,43 @@ Rendszer opciók - + Log Out Kijelentkezés - + Restart Újraindítás - + Power Off - + Update Now - + Updates ready to install - + Cancel Mégsem - + Lock Zárolás - + Suspend Felfüggesztés diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_id.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_id.ts index 2f3db87c..8786204e 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_id.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_id.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (pengisian baterai) - + %1 % (%2 Remaining) %1 % (%2 sisa) @@ -855,8 +855,8 @@ LSession - - + + Desktop Layar Kerja Utama @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ Opsi Sistem - + Log Out Log Keluar - + Restart mulai ulang - + Power Off - + Update Now - + Updates ready to install - + Cancel Batalkan - + Lock Kunci - + Suspend Suspensi diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_is.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_is.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_is.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_is.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_it.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_it.ts index 1cd93f4d..e7cfed3d 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_it.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_it.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (In Carica) - + %1 % (%2 Remaining) %1 % (%2 Rimanente) @@ -855,8 +855,8 @@ LSession - - + + Desktop Desktop @@ -1301,37 +1301,37 @@ RSS del desktop Lumina - + Feed URL: %1 URL del feed: %1 - + Title: %1 Titolo: %1 - + Description: %1 Descrizione: %1 - + Website: %1 Sito web: %1 - + Last Build Date: %1 Ultima data di versione: %1 - + Last Sync: %1 Ultimo aggiornamento: %1 - + Next Sync: %1 Prossimo aggiornamento: %1 @@ -1517,43 +1517,43 @@ Opzioni di Sistema - + Log Out Esci - + Restart Riavvia - + Power Off - + Update Now - + Updates ready to install - + Cancel Cancella - + Lock Blocca - + Suspend Sospendi diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ja.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ja.ts index 15c0f6c7..1f08a1e7 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ja.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ja.ts @@ -668,12 +668,12 @@ LBattery - + %1 % (Charging) %1 % (充電中) - + %1 % (%2 Remaining) %1 % (残り %2 %) @@ -860,8 +860,8 @@ LSession - - + + Desktop これ、ファイルパスなので、「デスクトップ」と訳したらまずい Desktop @@ -1315,37 +1315,37 @@ Lumina デスクトップ RSS - + Feed URL: %1 フィードの URL: %1 - + Title: %1 タイトル: %1 - + Description: %1 説明: %1 - + Website: %1 Web サイト: %1 - + Last Build Date: %1 最終更新日時: %1 - + Last Sync: %1 最終同期日時: %1 - + Next Sync: %1 次回同期日時: %1 @@ -1534,43 +1534,43 @@ システムのオプション - + Log Out ログアウト - + Restart 再起動 - + Power Off - + Update Now - + Updates ready to install - + Cancel キャンセル - + Lock ロック - + Suspend サスペンド diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ka.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ka.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ka.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ka.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ko.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ko.ts index 0d69f01f..850e8ea7 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ko.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ko.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (충전중) - + %1 % (%2 Remaining) %1 % (%2 남음) @@ -855,8 +855,8 @@ LSession - - + + Desktop 바탕 화면 @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ 시스템 설정 - + Log Out 로그 아웃 - + Restart 재시동 - + Power Off - + Update Now - + Updates ready to install - + Cancel 취소 - + Lock 잠그기 - + Suspend 절전 diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lt.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lt.ts index c6f635aa..c4020611 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lt.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lt.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (Kraunama) - + %1 % (%2 Remaining) %1 % (Liko %2) @@ -855,8 +855,8 @@ LSession - - + + Desktop Darbalaukis @@ -1301,37 +1301,37 @@ Lumina darbalaukio RSS - + Feed URL: %1 Kanalo URL: %1 - + Title: %1 Pavadinimas: %1 - + Description: %1 Aprašas: %1 - + Website: %1 Svetainė: %1 - + Last Build Date: %1 Paskutinio darinio data: %1 - + Last Sync: %1 Paskutinis sinchronizavimas: %1 - + Next Sync: %1 Kitas sinchronizavimas: %1 @@ -1517,43 +1517,43 @@ Sistemos parinktys - + Log Out Atsijungti - + Restart Paleisti iš naujo - + Power Off Išjungti - + Update Now - + Updates ready to install - + Cancel Atsisakyti - + Lock Užrakinti - + Suspend Pristabdyti diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lv.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lv.ts index 3cb0b2b0..5cdbd8fb 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lv.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lv.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (uzlādējas) - + %1 % (%2 Remaining) %1 % (%2 atlicis) @@ -855,8 +855,8 @@ LSession - - + + Desktop Darbvirsma @@ -1301,37 +1301,37 @@ Lumina darbvirsmas RSS - + Feed URL: %1 Plūsmas URL: %1 - + Title: %1 Virsraksts: %1 - + Description: %1 Apraksts: %1 - + Website: %1 Tīmekļa vietne: %1 - + Last Build Date: %1 Pēdējā būvējuma datums: %1 - + Last Sync: %1 Pēdējā sinhronizācija: %1 - + Next Sync: %1 Nākamā sinhronizēšana: %1 @@ -1517,43 +1517,43 @@ Sistēmas opcijas - + Log Out Izrakstīties - + Restart Restartēt - + Power Off - + Update Now - + Updates ready to install - + Cancel Atcelt - + Lock Slēgt - + Suspend Iemidzināt diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mk.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mk.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mk.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mk.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mn.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mn.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mn.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mn.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ms.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ms.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ms.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ms.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mt.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mt.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mt.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mt.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nb.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nb.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nb.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nb.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nl.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nl.ts index 2b2f15a4..b07292d8 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nl.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nl.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (Bezig met opladen) - + %1 % (%2 Remaining) %1 % (%2 resterend) @@ -855,8 +855,8 @@ LSession - - + + Desktop Bureaublad @@ -1301,37 +1301,37 @@ Lumina-bureaublad RSS - + Feed URL: %1 Feed-URL: %1 - + Title: %1 Titel: %1 - + Description: %1 Omschrijving: %1 - + Website: %1 Website: %1 - + Last Build Date: %1 Laaste bouwdatum: %1 - + Last Sync: %1 Laatste synchronisatie: %1 - + Next Sync: %1 Volgende synchronisatie: %1 @@ -1517,43 +1517,43 @@ Systeemopties - + Log Out Uitloggen - + Restart Herstarten - + Power Off - + Update Now - + Updates ready to install - + Cancel Annuleren - + Lock Vergrendelen - + Suspend Pauzestand diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pa.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pa.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pa.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pa.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pl.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pl.ts index 5ff8b01f..af9e65ba 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pl.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pl.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (Ładowanie) - + %1 % (%2 Remaining) %1 % (%2 pozostało) @@ -855,8 +855,8 @@ LSession - - + + Desktop Pulpit @@ -1301,37 +1301,37 @@ Pulpit Lumina RSS - + Feed URL: %1 URL kanału: %1 - + Title: %1 Tytuł: %1 - + Description: %1 Opis: %1 - + Website: %1 Witryna: %1 - + Last Build Date: %1 Data utworzenia: %1 - + Last Sync: %1 Ostatnia synchronizacja %1 - + Next Sync: %1 Następna synchronizacja: %1 @@ -1517,43 +1517,43 @@ Opcje Systemu - + Log Out Wyloguj - + Restart Uruchom ponownie - + Power Off - + Update Now - + Updates ready to install - + Cancel Zaniechaj - + Lock Zablokuj - + Suspend Wstrzymanie diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt.ts index 82881d5b..21bbdb65 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (Carregando) - + %1 % (%2 Remaining) %1 % (%2 Restantes) @@ -855,8 +855,8 @@ LSession - - + + Desktop Área de Trabalho @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ Opções do Sistema - + Log Out Sair - + Restart Reiniciar - + Power Off - + Update Now - + Updates ready to install - + Cancel Cancelar - + Lock Bloquear - + Suspend Suspender diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt_BR.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt_BR.ts index ec71e2ac..ca5b75cf 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt_BR.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt_BR.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (carregando) - + %1 % (%2 Remaining) %1 % (%2 restantes) @@ -855,8 +855,8 @@ LSession - - + + Desktop Área de trabalho @@ -1301,37 +1301,37 @@ Lumina Desktop RSS - + Feed URL: %1 URL da postagem: %1 - + Title: %1 Título: %1 - + Description: %1 Descrição: %1 - + Website: %1 Site: %1 - + Last Build Date: %1 Última data da compilação: %1 - + Last Sync: %1 Última sincronização: %1 - + Next Sync: %1 Próxima sincronização: %1 @@ -1517,43 +1517,43 @@ Opções do sistema - + Log Out Encerrar sessão - + Restart Reiniciar - + Power Off - + Update Now - + Updates ready to install - + Cancel Cancelar - + Lock Bloquear - + Suspend Suspender diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ro.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ro.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ro.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ro.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ru.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ru.ts index 0e54c34a..84e6a815 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ru.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ru.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (Заряжается) - + %1 % (%2 Remaining) %1 % (Осталось %2 ) @@ -855,8 +855,8 @@ LSession - - + + Desktop Рабочий стол @@ -1301,37 +1301,37 @@ RSS рабочего стола Lumina - + Feed URL: %1 URL потока: %1 - + Title: %1 Заголовок: %1 - + Description: %1 Описание: %1 - + Website: %1 Вэбсайт: %1 - + Last Build Date: %1 Дата последней сборки: %1 - + Last Sync: %1 Последняя синхронизация: %1 - + Next Sync: %1 Следущая синхронизация: %1 @@ -1517,43 +1517,43 @@ Параметры Системы - + Log Out Завершить Сеанс - + Restart Перезагрузить - + Power Off Выключить питание - + Update Now - + Updates ready to install - + Cancel Отмена - + Lock Замок - + Suspend Отложить diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sk.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sk.ts index 13e6c9a6..b19ee78c 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sk.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sk.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (Nabíjania) - + %1 % (%2 Remaining) %1 % (%2 zostáva) @@ -855,8 +855,8 @@ LSession - - + + Desktop Pracovná plocha @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ Systémové možnosti - + Log Out Odhlásiť sa - + Restart Reštartovať - + Power Off - + Update Now - + Updates ready to install - + Cancel Zrušiť - + Lock Uzamknúť - + Suspend Uspať diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sl.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sl.ts index ee11f368..4f250f1d 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sl.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sl.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sr.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sr.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sr.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sr.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sv.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sv.ts index e22270c5..f606b4e0 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sv.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sv.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (Laddar) - + %1 % (%2 Remaining) %1 % (%2 Återstår) @@ -855,8 +855,8 @@ LSession - - + + Desktop Skrivbord @@ -1301,37 +1301,37 @@ Lumina Skrivbordets RSS läsare - + Feed URL: %1 RSS-Flödes URL: %1 - + Title: %1 Titel: %1 - + Description: %1 Beskrivning: %1 - + Website: %1 Webbplats: %1 - + Last Build Date: %1 Senaste bygg datum: %1 - + Last Sync: %1 Senaste synkronisering: %1 - + Next Sync: %1 Nästa synkronisering: %1 @@ -1517,43 +1517,43 @@ Systemalternativ - + Log Out Logga ut - + Restart Starta om - + Power Off - + Update Now - + Updates ready to install - + Cancel Avbryt - + Lock Lås - + Suspend Vänteläge diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sw.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sw.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sw.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sw.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ta.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ta.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ta.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ta.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tg.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tg.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tg.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tg.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_th.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_th.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_th.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_th.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tr.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tr.ts index 704e1491..8ff02ed3 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tr.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tr.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) % %1 (Doluyor) - + %1 % (%2 Remaining) % %1 (Kalan %2) @@ -855,8 +855,8 @@ LSession - - + + Desktop Masaüstü @@ -1301,37 +1301,37 @@ Lumina Masaüstü RSS - + Feed URL: %1 Akış URL: %1 - + Title: %1 Başlık: %1 - + Description: %1 Açıklama: %1 - + Website: %1 Web sitesi: %1 - + Last Build Date: %1 Son Oluşturma Tarihi: %1 - + Last Sync: %1 Son Eşitleme: %1 - + Next Sync: %1 Sonraki Eşitleme: %1 @@ -1517,43 +1517,43 @@ Sistem Seçenekleri - + Log Out Oturumu Kapat - + Restart Yeniden başlat - + Power Off - + Update Now - + Updates ready to install - + Cancel İptal - + Lock Kilitle - + Suspend Beklet diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uk.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uk.ts index ec972577..cf287d79 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uk.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uk.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 % (Заряд) - + %1 % (%2 Remaining) %1 (залишилося %2) @@ -855,8 +855,8 @@ LSession - - + + Desktop Робочий стіл @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ Параметри системи - + Log Out Завершити сеанс - + Restart Перезапустити - + Power Off - + Update Now - + Updates ready to install - + Cancel Скасувати - + Lock Заблокувати - + Suspend Призупинити diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uz.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uz.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uz.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uz.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_vi.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_vi.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_vi.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_vi.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_CN.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_CN.ts index 8d7ea859..226730b6 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_CN.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_CN.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) %1 %(充电) - + %1 % (%2 Remaining) %1 (%2 剩余) @@ -855,8 +855,8 @@ LSession - - + + Desktop 桌面 @@ -1301,37 +1301,37 @@ Lumina 桌面 RSS - + Feed URL: %1 订阅地址: %1 - + Title: %1 标题: %1 - + Description: %1 描述: %1 - + Website: %1 网站: %1 - + Last Build Date: %1 最后构建日期: %1 - + Last Sync: %1 最后更新于: %1 - + Next Sync: %1 下次更新: %1 @@ -1517,43 +1517,43 @@ 系统选项 - + Log Out 注销 - + Restart 重启 - + Power Off - + Update Now - + Updates ready to install - + Cancel 取消 - + Lock 锁定 - + Suspend 休眠 diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_HK.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_HK.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_HK.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_HK.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_TW.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_TW.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_TW.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_TW.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zu.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zu.ts index 2f9340c6..b7440a58 100644 --- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zu.ts +++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zu.ts @@ -664,12 +664,12 @@ LBattery - + %1 % (Charging) - + %1 % (%2 Remaining) @@ -855,8 +855,8 @@ LSession - - + + Desktop @@ -1301,37 +1301,37 @@ - + Feed URL: %1 - + Title: %1 - + Description: %1 - + Website: %1 - + Last Build Date: %1 - + Last Sync: %1 - + Next Sync: %1 @@ -1517,43 +1517,43 @@ - + Log Out - + Restart - + Power Off - + Update Now - + Updates ready to install - + Cancel - + Lock - + Suspend diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_af.ts b/src-qt5/core/lumina-open/i18n/lumina-open_af.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_af.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_af.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_ar.ts b/src-qt5/core/lumina-open/i18n/lumina-open_ar.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_ar.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_ar.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_az.ts b/src-qt5/core/lumina-open/i18n/lumina-open_az.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_az.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_az.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_bg.ts b/src-qt5/core/lumina-open/i18n/lumina-open_bg.ts index e2f19d0a..d6c2c195 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_bg.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_bg.ts @@ -147,59 +147,59 @@ Грешка във файла - - + + Audio Volume %1% Сила на звука %1% - - + + Screen Brightness %1% Яркост на екрана %1% - + Invalid file or URL: %1 Невалиден файл или адрес: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 Информацията за стартиране липсва от прекия път (повреден пряк път): %1 - + URL shortcut is missing the URL: %1 Адресът липсва от прекия път към отдалечен адрес: %1 - + Directory shortcut is missing the path to the directory: %1 Пътят към директорията липсва от прекия път към директорията: %1 - + Unknown type of shortcut : %1 Непознат тип пряк път : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error Грешка в програмата - + The following application experienced an error and needed to close: Възникна грешка в програмата и трябваше да бъде затворена: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_bn.ts b/src-qt5/core/lumina-open/i18n/lumina-open_bn.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_bn.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_bn.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_bs.ts b/src-qt5/core/lumina-open/i18n/lumina-open_bs.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_bs.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_bs.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_ca.ts b/src-qt5/core/lumina-open/i18n/lumina-open_ca.ts index ff2c550b..ac403ed0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_ca.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_ca.ts @@ -147,59 +147,59 @@ Error del fitxer - - + + Audio Volume %1% Volum de l'àudio: %1% - - + + Screen Brightness %1% Brillantor de la pantalla: %1% - + Invalid file or URL: %1 Fitxer o URL no vàlids: %1 - + Application entry is invalid: %1 L'entrada de l'aplicació no és vàlida: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 La drecera de l'aplicació no té la informació de llançament (drecera malformada): %1 - + URL shortcut is missing the URL: %1 La drecera de l'URL no té l'URL: %1 - + Directory shortcut is missing the path to the directory: %1 La drecera del directori no té el camí cap al directori: %1 - + Unknown type of shortcut : %1 Tipus de drecera desconegut: %1 - + Could not find "%1". Please ensure it is installed first. No s'ha pogut trobar "%1". Si us plau, assegureu-vos que estigui instal·lat. - + Application Error Error de l'aplicació - + The following application experienced an error and needed to close: L'aplicació següent ha tingut un error i s'ha hagut de tancar: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_cs.ts b/src-qt5/core/lumina-open/i18n/lumina-open_cs.ts index fd7ed2cf..f038a5ed 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_cs.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_cs.ts @@ -147,59 +147,59 @@ Chyba souboru - - + + Audio Volume %1% Hlasitost zvuku %1% - - + + Screen Brightness %1% Jas obrazovky %1% - + Invalid file or URL: %1 Neplatný soubor nebo URL adresa: %1 - + Application entry is invalid: %1 Záznam pro aplikaci není platný: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 V zástupci aplikace chybí informace pro spouštění (chybná zkratka):% 1 - + URL shortcut is missing the URL: %1 V zástupci URL adresy chybí URL: %1 - + Directory shortcut is missing the path to the directory: %1 V zástupci složky chybí popis jejího umístění: %1 - + Unknown type of shortcut : %1 Neznámý typ zkratky: %1 - + Could not find "%1". Please ensure it is installed first. Nepodařilo se najít „%1“. Nejprve zajistěte, aby bylo nainstalované. - + Application Error Chyba aplikace - + The following application experienced an error and needed to close: V následující aplikaci došlo k chyba a bude proto ukončena: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_cy.ts b/src-qt5/core/lumina-open/i18n/lumina-open_cy.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_cy.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_cy.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_da.ts b/src-qt5/core/lumina-open/i18n/lumina-open_da.ts index 770e717e..3e00f1b5 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_da.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_da.ts @@ -147,59 +147,59 @@ Filfejl - - + + Audio Volume %1% Lydstyrke %1% - - + + Screen Brightness %1% Skærmlysstyrke %1% - + Invalid file or URL: %1 Ugyldig fil eller URL: %1 - + Application entry is invalid: %1 Programpost er ugyldig: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 Programgenvejen mangler korrekt opstartsinformation (forkert udformet genvej): %1 - + URL shortcut is missing the URL: %1 URL-genvejen mangler URL'en: %1 - + Directory shortcut is missing the path to the directory: %1 Mappegenvejen mangler stien til mappen: %1 - + Unknown type of shortcut : %1 Ukendt type genvej : %1 - + Could not find "%1". Please ensure it is installed first. Kunne ikke finde "%1". Sørg for at programmet er installeret først. - + Application Error Programfejl - + The following application experienced an error and needed to close: Det følgende program oplevede en fejl og blev nødt til at afslutte: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_de.ts b/src-qt5/core/lumina-open/i18n/lumina-open_de.ts index f1b09042..591f1398 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_de.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_de.ts @@ -147,59 +147,59 @@ Dateifehler - - + + Audio Volume %1% Lautstärke %1% - - + + Screen Brightness %1% Bildschirmhelligkeit %1% - + Invalid file or URL: %1 Ungültige Datei oder URL: %1 - + Application entry is invalid: %1 Anwendungseintrag ist ungültig: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 Fehlende Startup-Informationen für Programm-Verknüpfung (deformierte Verknüpfung): %1 - + URL shortcut is missing the URL: %1 URL-Verknüpfung fehlt die URL: %1 - + Directory shortcut is missing the path to the directory: %1 Verzeichnisverknüpfung fehlt der Pfad zum Verzeichnis: %1 - + Unknown type of shortcut : %1 Unbekannter Typ für Vernüpfung: %1 - + Could not find "%1". Please ensure it is installed first. Konnte "%1" nicht finden. Bitte stellen Sie zuerst sicher, dass es installiert ist. - + Application Error Anwendungsfehler - + The following application experienced an error and needed to close: Bei folgender Anwendung ist ein Fehler aufgetreten und sie wurde beendet: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_el.ts b/src-qt5/core/lumina-open/i18n/lumina-open_el.ts index 1cf5cbb8..9fc46d41 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_el.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_el.ts @@ -147,59 +147,59 @@ Σφάλμα Αρχείου - - + + Audio Volume %1% Ένταση ήχου %1% - - + + Screen Brightness %1% Φωτεινότητα οθόνης %1% - + Invalid file or URL: %1 Μη έγκυρο αρχείο ή URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 Οι πληροφορίες εκτέλεσης λείπουν απο την συντόμευση της εφαρμογής (Δυσλειτουργία συντόμευσης): %1 - + URL shortcut is missing the URL: %1 Απο την URL συντόμευση λείπει το URL: %1 - + Directory shortcut is missing the path to the directory: %1 Απο την συντόμευση του καταλόγου λείπει η διαδρομή προς τον κατάλογο: %1 - + Unknown type of shortcut : %1 Άγνωστος τύπος συντόμευσης: %1 - + Could not find "%1". Please ensure it is installed first. Αδυναμία έυρεσης "%1". Παρακαλώ βεβαιωθείτε ότι έχει ήδη εγκατασταθεί. - + Application Error Πρόβλημα Εφαρμογής - + The following application experienced an error and needed to close: Η παρακάτω εφαρμογή αντιμετώπισε ένα σφάλμα και πρέπει να τερματιστεί: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_en_AU.ts b/src-qt5/core/lumina-open/i18n/lumina-open_en_AU.ts index dbca5225..b64ca952 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_en_AU.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_en_AU.ts @@ -147,59 +147,59 @@ File Error - - + + Audio Volume %1% Audio Volume %1% - - + + Screen Brightness %1% Screen Brightness %1% - + Invalid file or URL: %1 Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 Application shortcut is missing the launch information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 Unknown type of shortcut: %1 - + Could not find "%1". Please ensure it is installed first. Could not find "%1". Please ensure it is installed first. - + Application Error Application Error - + The following application experienced an error and needed to close: The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_en_GB.ts b/src-qt5/core/lumina-open/i18n/lumina-open_en_GB.ts index afa92889..00ca4e0d 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_en_GB.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_en_GB.ts @@ -147,59 +147,59 @@ File Error - - + + Audio Volume %1% Audio Volume %1% - - + + Screen Brightness %1% Screen Brightness %1% - + Invalid file or URL: %1 Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 Application shortcut is missing the launch information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 Unknown type of shortcut: %1 - + Could not find "%1". Please ensure it is installed first. Could not find "%1". Please ensure it is installed first. - + Application Error Application Error - + The following application experienced an error and needed to close: The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_en_ZA.ts b/src-qt5/core/lumina-open/i18n/lumina-open_en_ZA.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_en_ZA.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_en_ZA.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_es.ts b/src-qt5/core/lumina-open/i18n/lumina-open_es.ts index abfe4962..6c3c5d51 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_es.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_es.ts @@ -147,59 +147,59 @@ Error de Archivo - - + + Audio Volume %1% Volúmen del Sonido %1% - - + + Screen Brightness %1% Brillo de Pantalla %1% - + Invalid file or URL: %1 Archivo o URL no válido(a): %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 El acceso directo a la aplicación no contiene la información para la ejecución (acceso directo defectuoso): %1 - + URL shortcut is missing the URL: %1 El acceso directo a la URL no contiene la URL: %1 - + Directory shortcut is missing the path to the directory: %1 El acceso directo al directorio no contiene la dirección al directorio: %1 - + Unknown type of shortcut : %1 Tipo de acceso directo desconocido: %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error Error en la Aplicación - + The following application experienced an error and needed to close: La siguiente aplicación presentó un error y necesita cerrarse: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_et.ts b/src-qt5/core/lumina-open/i18n/lumina-open_et.ts index fa069632..ee3b4351 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_et.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_et.ts @@ -147,59 +147,59 @@ Faili viga - - + + Audio Volume %1% Helitugevus %1% - - + + Screen Brightness %1% Ekraani heledus %1% - + Invalid file or URL: %1 Vigane fail või aadress: %1 - + Application entry is invalid: %1 Rakenduse %1 kirje on vigane. - + Application shortcut is missing the launching information (malformed shortcut): %1 Rakenduse otseteel puudub käivitamise info (vigane otsetee): %1 - + URL shortcut is missing the URL: %1 Aadressi otseteel puudub aadress: %1 - + Directory shortcut is missing the path to the directory: %1 Kausta otseteel puudub kausta rada: %1 - + Unknown type of shortcut : %1 Teadmata tüüpi otsetee: %1 - + Could not find "%1". Please ensure it is installed first. Ei leidnud "%1" . Palun veendu et see on paigaldatud. - + Application Error Programmi viga - + The following application experienced an error and needed to close: See rakendus sulgus, kuna esines viga: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_eu.ts b/src-qt5/core/lumina-open/i18n/lumina-open_eu.ts index 6a8f257b..cf77faf1 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_eu.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_eu.ts @@ -147,59 +147,59 @@ Fitxategiko akatsa - - + + Audio Volume %1% Audioaren bolumena %1% - - + + Screen Brightness %1% Pantailaren distira %1% - + Invalid file or URL: %1 Fitxategi edo URL okerra: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 Aplikazioko lasterbideak ez dauka abiarazteko informazioa (lasterbide okerra): %1 - + URL shortcut is missing the URL: %1 URLko lasterbideak ez dauka URLa: %1 - + Directory shortcut is missing the path to the directory: %1 Direktorioko lasterbideak ez dauka direktorioroko bide izena: %1 - + Unknown type of shortcut : %1 Lasterbide mota ezezaguna: %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error Aplikazioko akatsa - + The following application experienced an error and needed to close: Hurrengo aplikazioak akats bat izan du eta itxi behar da: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_fa.ts b/src-qt5/core/lumina-open/i18n/lumina-open_fa.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_fa.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_fa.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_fi.ts b/src-qt5/core/lumina-open/i18n/lumina-open_fi.ts index 403651fe..b3441d40 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_fi.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_fi.ts @@ -147,59 +147,59 @@ Tiedostovirhe - - + + Audio Volume %1% Äänenvoimakkuus %1 % - - + + Screen Brightness %1% Näytön kirkkaus %1 % - + Invalid file or URL: %1 Virheellinen tiedosto tai verkko-osoite: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 Sovelluksen pikakuvakkeesta puuttuvat käynnistystiedot (virheellinen pikakuvake): %1 - + URL shortcut is missing the URL: %1 Verkko-osoitteen pikakuvakkeesta puuttuu verkko-osoite: %1 - + Directory shortcut is missing the path to the directory: %1 Kansion pikakuvakkeesta puuttuu kansion sijainti: %1 - + Unknown type of shortcut : %1 Tuntematon pikakuvaketyyppi: %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error Sovellusvirhe - + The following application experienced an error and needed to close: Seuraavat sovellukset kohtasivat virheen ja ne täytyy sulkea: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_fr.ts b/src-qt5/core/lumina-open/i18n/lumina-open_fr.ts index 567fcf63..4b73891b 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_fr.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_fr.ts @@ -147,59 +147,59 @@ Erreur de fichier - - + + Audio Volume %1% Volume Audio %1% - - + + Screen Brightness %1% Luminosité de l'Écran %1% - + Invalid file or URL: %1 Fichier ou URL invalide : %1 - + Application entry is invalid: %1 Programme invalide : %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 Informations de lancement manquantes dans le raccourci du programme (raccourci invalide) : %1 - + URL shortcut is missing the URL: %1 L'adresse est introuvable dans le raccourci URL : %1 - + Directory shortcut is missing the path to the directory: %1 Le chemin du dossier est vide dans le raccourci du dossier : %1 - + Unknown type of shortcut : %1 Type du raccourci inconnu : %1 - + Could not find "%1". Please ensure it is installed first. "%1" non trouvé. Vérifiez qu'il soit bien installé. - + Application Error Erreur du Programme - + The following application experienced an error and needed to close: Le programme suivant a provoqué une erreur et a dû être fermé : diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_fr_CA.ts b/src-qt5/core/lumina-open/i18n/lumina-open_fr_CA.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_fr_CA.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_fr_CA.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_gl.ts b/src-qt5/core/lumina-open/i18n/lumina-open_gl.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_gl.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_gl.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_he.ts b/src-qt5/core/lumina-open/i18n/lumina-open_he.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_he.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_he.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_hi.ts b/src-qt5/core/lumina-open/i18n/lumina-open_hi.ts index 1b33caf3..4df6a468 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_hi.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_hi.ts @@ -147,59 +147,59 @@ फाइल त्रुटि - - + + Audio Volume %1% ऑडियो ध्वनि %1% - - + + Screen Brightness %1% स्क्रीन चमक %1% - + Invalid file or URL: %1 अवैध फाइल या यूआरएल:%1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 एप्लीकेशन शॉर्टकट में चालू करने सम्बन्धी जानकारी नहीं है( अपूर्ण शॉर्टकट):%1 - + URL shortcut is missing the URL: %1 यूआरएल के शॉर्टकट में यूआरएल नहीं है:%1 - + Directory shortcut is missing the path to the directory: %1 डायरेक्टरी के शॉर्टकट में डायरेक्टरी का पथ नहीं है:%1 - + Unknown type of shortcut : %1 अनजान प्रकार का शॉर्टकट:%1 - + Could not find "%1". Please ensure it is installed first. - + Application Error एप्लीकेशन त्रुटि - + The following application experienced an error and needed to close: इस एप्लीकेशन में त्रुटि है और इसे बंद करने की आवश्यकता है: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_hr.ts b/src-qt5/core/lumina-open/i18n/lumina-open_hr.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_hr.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_hr.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_hu.ts b/src-qt5/core/lumina-open/i18n/lumina-open_hu.ts index 2356b492..a75ae74e 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_hu.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_hu.ts @@ -147,59 +147,59 @@ Fájl hiba - - + + Audio Volume %1% Hangerő: %1% - - + + Screen Brightness %1% Képernyő fényessége: %1% - + Invalid file or URL: %1 Érvénytelen fájl vagy URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 a program hivatkozásában hiányosak az indítási adatok : %1 - + URL shortcut is missing the URL: %1 URL hivatkozás hiányos ebben: %1 - + Directory shortcut is missing the path to the directory: %1 Könyvtár hivatkozás hiányos ebben az útvonalban: %1 - + Unknown type of shortcut : %1 Ismeretlen hivatkozás: %1 - + Could not find "%1". Please ensure it is installed first. Nem találom: "%1". Először győződj meg hogy telepítve van. - + Application Error Alkalmazás hiba - + The following application experienced an error and needed to close: Az alkalmazás hibát észlelt, és bezárandó: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_id.ts b/src-qt5/core/lumina-open/i18n/lumina-open_id.ts index ee46566b..e099e24c 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_id.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_id.ts @@ -147,59 +147,59 @@ berkas error - - + + Audio Volume %1% Audio Volume %1% - - + + Screen Brightness %1% kecerahan layar %1% - + Invalid file or URL: %1 file yang tidak valid atau URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 Aplikasi shortcut yang hilang informasi meluncurkan (jelek cacat): %1 - + URL shortcut is missing the URL: %1 URL shortcut hilang URL: %1 - + Directory shortcut is missing the path to the directory: %1 Direktori shortcut yang hilang path ke direktori: %1 - + Unknown type of shortcut : %1 Jenis diketahui shortcut: %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error aplikasi error - + The following application experienced an error and needed to close: Aplikasi berikut mengalami kesalahan dan diperlukan untuk menutup: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_is.ts b/src-qt5/core/lumina-open/i18n/lumina-open_is.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_is.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_is.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_it.ts b/src-qt5/core/lumina-open/i18n/lumina-open_it.ts index 3189ccfa..ada557e8 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_it.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_it.ts @@ -147,59 +147,59 @@ Errore File - - + + Audio Volume %1% Volume Suono %1% - - + + Screen Brightness %1% luminosità dello Schermo %1% - + Invalid file or URL: %1 File o URL Invalido: %1 - + Application entry is invalid: %1 Applicazione principale non valida: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 Collegamento all'applicazione senzai informazioni di lancio (scorciatoia malformata):: %1 - + URL shortcut is missing the URL: %1 Collegamento URL senza l'URL: %1 - + Directory shortcut is missing the path to the directory: %1 Collegamento Directory senza il percorso della directory: %1 - + Unknown type of shortcut : %1 Tipo di abbreviazione sconosciuto : %1 - + Could not find "%1". Please ensure it is installed first. Impossibile trovare "% 1". Assicurarsi che sia installato per primo. - + Application Error Errore Applicazione - + The following application experienced an error and needed to close: La seguente applicazione ha avuto un errore e deve chiudere: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_ja.ts b/src-qt5/core/lumina-open/i18n/lumina-open_ja.ts index 9eb3e794..4cc2bf0e 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_ja.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_ja.ts @@ -148,59 +148,59 @@ ファイルエラー - - + + Audio Volume %1% 音声ボリューム %1% - - + + Screen Brightness %1% 画面の明るさ %1% - + Invalid file or URL: %1 無効なファイルまたはURL: %1 - + Application entry is invalid: %1 アプリケーションエントリーが不正です: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 アプリケーションショートカットの起動情報が失われています(無効なショートカット): %1 - + URL shortcut is missing the URL: %1 URL ショートカットの URL が失われています: %1 - + Directory shortcut is missing the path to the directory: %1 ディレクトリーショートカットのパス情報が失われています: %1 - + Unknown type of shortcut : %1 種類が不明なショートカットです: %1 - + Could not find "%1". Please ensure it is installed first. "%1" が見つかりませんでした。まずそれがインストールされている事を確認してください。 - + Application Error アプリケーションエラー - + The following application experienced an error and needed to close: このアプリケーションでエラーが発生したため、閉じる必要があります: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_ka.ts b/src-qt5/core/lumina-open/i18n/lumina-open_ka.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_ka.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_ka.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_ko.ts b/src-qt5/core/lumina-open/i18n/lumina-open_ko.ts index bcee9b12..255b8336 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_ko.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_ko.ts @@ -147,59 +147,59 @@ 파일 오류 - - + + Audio Volume %1% 오디오 볼륨 %1% - - + + Screen Brightness %1% 화면 밝기 %1% - + Invalid file or URL: %1 잘못된 파일이나 URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 프로그램 바로 가기에 실행 정보가 없습니다 (잘못된 바로 가기): %1 - + URL shortcut is missing the URL: %1 URL 바로 가기에 URL이 없습니다: %1 - + Directory shortcut is missing the path to the directory: %1 디렉터리 바로 가기에 디렉터리 경로가 없습니다: %1 - + Unknown type of shortcut : %1 알 수 없는 종류의 바로 가기: %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error 프로그램 오류 - + The following application experienced an error and needed to close: 다음의 프로그램에 오류가 발생하여 종료하였습니다: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_lt.ts b/src-qt5/core/lumina-open/i18n/lumina-open_lt.ts index e348dfba..a271c104 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_lt.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_lt.ts @@ -147,59 +147,59 @@ Failo klaida - - + + Audio Volume %1% Garso garsis %1% - - + + Screen Brightness %1% Ekrano ryškumas %1% - + Invalid file or URL: %1 Netinkamas failas ar URL: %1 - + Application entry is invalid: %1 Programos įrašas yra neteisingas: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 Programos šaukinyje trūksta paleidimo informacijos (netaisyklingas šaukinys): %1 - + URL shortcut is missing the URL: %1 URL šaukinyje trūksta URL: %1 - + Directory shortcut is missing the path to the directory: %1 Katalogo šaukinyje trūksta kelio į katalogą: %1 - + Unknown type of shortcut : %1 Nežinomas šaukinio tipas : %1 - + Could not find "%1". Please ensure it is installed first. Nepavyko rasti "%1". Iš pradžių, įsitikinkite ar ji įdiegta. - + Application Error Programos klaida - + The following application experienced an error and needed to close: Ši programa susidūrė su klaida ir turėjo būti užverta: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_lv.ts b/src-qt5/core/lumina-open/i18n/lumina-open_lv.ts index 8a818aa0..04fd8239 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_lv.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_lv.ts @@ -147,59 +147,59 @@ Faila kļūda - - + + Audio Volume %1% Audio skaļums %1% - - + + Screen Brightness %1% Ekrāna spilgtums %1% - + Invalid file or URL: %1 Nederīgs fails vai URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 Lietotnes saīsnei trūkst palaišanas informācijas (nepareizi veidota saīsne): %1 - + URL shortcut is missing the URL: %1 URL saīsnei trūkst URL: %1 - + Directory shortcut is missing the path to the directory: %1 Kataloga saīsnei trūkst ceļš uz katalogu: %1 - + Unknown type of shortcut : %1 Nezināma tipa saīsne : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error Lietotnes kļūda - + The following application experienced an error and needed to close: Šai lietotnei radās kļūda un bija nepieciešams to aizvērt: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_mk.ts b/src-qt5/core/lumina-open/i18n/lumina-open_mk.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_mk.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_mk.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_mn.ts b/src-qt5/core/lumina-open/i18n/lumina-open_mn.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_mn.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_mn.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_ms.ts b/src-qt5/core/lumina-open/i18n/lumina-open_ms.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_ms.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_ms.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_mt.ts b/src-qt5/core/lumina-open/i18n/lumina-open_mt.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_mt.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_mt.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_nb.ts b/src-qt5/core/lumina-open/i18n/lumina-open_nb.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_nb.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_nb.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_nl.ts b/src-qt5/core/lumina-open/i18n/lumina-open_nl.ts index 61b2a7c8..fe2794dd 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_nl.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_nl.ts @@ -147,59 +147,59 @@ Bestandsfout - - + + Audio Volume %1% Audiovolume %1% - - + + Screen Brightness %1% Schermhelderheid %1% - + Invalid file or URL: %1 Ongeldig bestand of URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 De opstartinformatie van de applicatie-snelkoppeling ontbreekt (ongeldige snelkoppeling): %1 - + URL shortcut is missing the URL: %1 De URL in de URL-snelkoppeling ontbreekt: %1 - + Directory shortcut is missing the path to the directory: %1 Het mappad in de mapsnelkoppeling ontbreekt: %1 - + Unknown type of shortcut : %1 Onbekend soort snelkoppeling: %1 - + Could not find "%1". Please ensure it is installed first. "%1" kan niet worden gevonden. Zorg ervoor dat het geïnstalleerd is. - + Application Error Applicatiefout - + The following application experienced an error and needed to close: Er is een fout opgetreden in de volgende applicatie en moet daarom worden gesloten: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_pa.ts b/src-qt5/core/lumina-open/i18n/lumina-open_pa.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_pa.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_pa.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_pl.ts b/src-qt5/core/lumina-open/i18n/lumina-open_pl.ts index 81dc5121..fbfa6016 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_pl.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_pl.ts @@ -147,59 +147,59 @@ Błąd pliku - - + + Audio Volume %1% Głośność dźwięku %1% - - + + Screen Brightness %1% Jasność ekranu %1% - + Invalid file or URL: %1 Nieprawidłowy plik lub URL: %1 - + Application entry is invalid: %1 Ścieżka aplikacji jest błędna: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 Skrót do aplikacji nie posiada odpowiednich informacji do uruchomienia (niewłaściwy skrót): %1 - + URL shortcut is missing the URL: %1 W skrócie URL brak adresu URL: %1 - + Directory shortcut is missing the path to the directory: %1 W skrócie do folderu brak ścieżki do folderu: %1 - + Unknown type of shortcut : %1 Nieznany błąd skrótu: %1 - + Could not find "%1". Please ensure it is installed first. Nie można znaleźć "%1". Upewnij się, że jest zainstalowany. - + Application Error Błąd aplikacji - + The following application experienced an error and needed to close: Aplikacja napotkała błąd i musi zostać zamknięta: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_pt.ts b/src-qt5/core/lumina-open/i18n/lumina-open_pt.ts index bf7c5214..c22093c7 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_pt.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_pt.ts @@ -147,59 +147,59 @@ Erro no Arquivo - - + + Audio Volume %1% Volume do Som %1% - - + + Screen Brightness %1% Brilho da Tela %1% - + Invalid file or URL: %1 Arquivo ou URL Inválidos: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 Está faltando a informação do lançamento do atalho do aplicativo (atalho mal informado): 1% - + URL shortcut is missing the URL: %1 Está faltando a URL do atalhos da URL: %1 - + Directory shortcut is missing the path to the directory: %1 Está faltando o caminho para o diretório do atalho do diretório" %1 - + Unknown type of shortcut : %1 Tipo de atalho desconhecido: %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error Erro no Aplicativo - + The following application experienced an error and needed to close: O seguinte aplicativo encontrou um erro e teve que ser fechado: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_pt_BR.ts b/src-qt5/core/lumina-open/i18n/lumina-open_pt_BR.ts index 01c4ffa9..542e135d 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_pt_BR.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_pt_BR.ts @@ -147,59 +147,59 @@ Erro de arquivo - - + + Audio Volume %1% Volume do som %1% - - + + Screen Brightness %1% Brilho da tela %1% - + Invalid file or URL: %1 Arquivo ou URL inválido: %1 - + Application entry is invalid: %1 A entrada do aplicativo é inválida: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 O atalho do aplicativo não tem a informação de lançamento (atalho malformado): %1 - + URL shortcut is missing the URL: %1 Está faltando o URL no atalho: %1 - + Directory shortcut is missing the path to the directory: %1 Está faltando o caminho para o diretório no atalho: %1 - + Unknown type of shortcut : %1 Tipo de atalho desconhecido: %1 - + Could not find "%1". Please ensure it is installed first. "%1" não pode ser localizado. Por favor, verifique se está instalado. - + Application Error Erro do aplicativo - + The following application experienced an error and needed to close: O seguinte aplicativo encontrou um erro e precisa ser fechado: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_ro.ts b/src-qt5/core/lumina-open/i18n/lumina-open_ro.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_ro.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_ro.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_ru.ts b/src-qt5/core/lumina-open/i18n/lumina-open_ru.ts index 3762faca..7a502cbe 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_ru.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_ru.ts @@ -147,59 +147,59 @@ Ошибка Файла - - + + Audio Volume %1% Громкость %1% - - + + Screen Brightness %1% Яркость Экрана %1% - + Invalid file or URL: %1 Неверный файл или URL-адрес: %1 - + Application entry is invalid: %1 Приложение вывело ошибку: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 В ярлыке приложения отсутствует информация для запуска (неверный формат ярлыка): %1 - + URL shortcut is missing the URL: %1 В ярлыке отсутствует URL-адрес: %1 - + Directory shortcut is missing the path to the directory: %1 В ярлыке отсутствует путь к папке: %1 - + Unknown type of shortcut : %1 Неизвестный тип ярлыка: %1 - + Could not find "%1". Please ensure it is installed first. Не найден "%1". Пожалуйста, убедитесь, что он установлен в первую очередь. - + Application Error Ошибка Приложения - + The following application experienced an error and needed to close: Следующее приложение вызвало ошибку и должно быть закрыто: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_sk.ts b/src-qt5/core/lumina-open/i18n/lumina-open_sk.ts index 153fbcf6..18932a98 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_sk.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_sk.ts @@ -147,59 +147,59 @@ Chyba súboru - - + + Audio Volume %1% Hlasitosť zvuku %1% - - + + Screen Brightness %1% Jas obrazovky %1% - + Invalid file or URL: %1 Neplatný súbor alebo URL %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 Zástupca aplikácie - chýbajúce informácie: %1 - + URL shortcut is missing the URL: %1 chýba URL:%1 - + Directory shortcut is missing the path to the directory: %1 chýba cesta adresára: %1 - + Unknown type of shortcut : %1 Neznámy typ skratky: %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error Chyba aplikácie - + The following application experienced an error and needed to close: Nasledujúca aplikácia hlási chybu a musí byť ukončená: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_sl.ts b/src-qt5/core/lumina-open/i18n/lumina-open_sl.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_sl.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_sl.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_sr.ts b/src-qt5/core/lumina-open/i18n/lumina-open_sr.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_sr.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_sr.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_sv.ts b/src-qt5/core/lumina-open/i18n/lumina-open_sv.ts index 7745b210..e04e433e 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_sv.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_sv.ts @@ -147,59 +147,59 @@ Filfel - - + + Audio Volume %1% Ljudvolym %1% - - + + Screen Brightness %1% Skärmljusstyrka %1% - + Invalid file or URL: %1 Ogiltig fil eller URL %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 Programgenväg saknar startinformation (missbildad genväg): %1 - + URL shortcut is missing the URL: %1 URL-genvägen saknar URL: %1 - + Directory shortcut is missing the path to the directory: %1 Genvägen till katalogen saknar sökvägen till katalogen :%1 - + Unknown type of shortcut : %1 Okänd typ av genväg: %1 - + Could not find "%1". Please ensure it is installed first. Kunde inte hitta "%1". Se till att du har detta programmet installerat först. - + Application Error Programfel - + The following application experienced an error and needed to close: Följande program upplevde ett fel och behövde stängas: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_sw.ts b/src-qt5/core/lumina-open/i18n/lumina-open_sw.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_sw.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_sw.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_ta.ts b/src-qt5/core/lumina-open/i18n/lumina-open_ta.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_ta.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_ta.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_tg.ts b/src-qt5/core/lumina-open/i18n/lumina-open_tg.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_tg.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_tg.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_th.ts b/src-qt5/core/lumina-open/i18n/lumina-open_th.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_th.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_th.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_tr.ts b/src-qt5/core/lumina-open/i18n/lumina-open_tr.ts index 06f75ad1..9e73a2b5 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_tr.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_tr.ts @@ -147,59 +147,59 @@ Dosya Hatası - - + + Audio Volume %1% Ses Düzeyi %1% - - + + Screen Brightness %1% Ekran Parlaklığı %1% - + Invalid file or URL: %1 Geçersiz Dosya ya da URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 Uygulama kısayolunda başlatma bilgisi eksik (hatalı kısayol): %1 - + URL shortcut is missing the URL: %1 URL kısayolunda URL eksik: %1 - + Directory shortcut is missing the path to the directory: %1 Dizin kısayolunda dizin yolu eksik: %1 - + Unknown type of shortcut : %1 Bilinmeyen kısayol türü: %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error Uygulama Hatası - + The following application experienced an error and needed to close: İzleyen uygulama bir hatayla karşılaştı ve kapatılması gerekti: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_uk.ts b/src-qt5/core/lumina-open/i18n/lumina-open_uk.ts index 8d8a2e09..a984132b 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_uk.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_uk.ts @@ -147,59 +147,59 @@ Помилка файлу - - + + Audio Volume %1% Гучність звуку %1% - - + + Screen Brightness %1% Яскравість екрану %1% - + Invalid file or URL: %1 Невірний файл або URL-адреса: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 В ярлику програми відсутня інформація для запуску (невірний формат ярлика): %1 - + URL shortcut is missing the URL: %1 В ярлику URL-адреса відсутня: %1 - + Directory shortcut is missing the path to the directory: %1 В ярлику відсутній шлях до папки: %1 - + Unknown type of shortcut : %1 Невідомий тип ярлику : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error Помилка програми - + The following application experienced an error and needed to close: Наступна програма викликало помилку и має бути закрита: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_uz.ts b/src-qt5/core/lumina-open/i18n/lumina-open_uz.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_uz.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_uz.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_vi.ts b/src-qt5/core/lumina-open/i18n/lumina-open_vi.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_vi.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_vi.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_zh_CN.ts b/src-qt5/core/lumina-open/i18n/lumina-open_zh_CN.ts index ffa75bdd..f937d362 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_zh_CN.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_zh_CN.ts @@ -147,59 +147,59 @@ 文件错误 - - + + Audio Volume %1% 音频音量 %1% - - + + Screen Brightness %1% 屏幕亮度 %1% - + Invalid file or URL: %1 无效的文件或网址:%1% - + Application entry is invalid: %1 应用程序输入无效: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 应用程序快捷方式缺少启动信息(错误的快捷方式):%1 - + URL shortcut is missing the URL: %1 网址快捷方式缺少网址 : %1 - + Directory shortcut is missing the path to the directory: %1 目录的快捷方式是丢失目录的路径 : %1 - + Unknown type of shortcut : %1 未知类型的快捷方式:%1 - + Could not find "%1". Please ensure it is installed first. 无法找到 “%1”。请确认它已被安装。 - + Application Error 应用程序出错 - + The following application experienced an error and needed to close: 下面的应用程序遇到错误,需要关闭: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_zh_HK.ts b/src-qt5/core/lumina-open/i18n/lumina-open_zh_HK.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_zh_HK.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_zh_HK.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_zh_TW.ts b/src-qt5/core/lumina-open/i18n/lumina-open_zh_TW.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_zh_TW.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_zh_TW.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_zu.ts b/src-qt5/core/lumina-open/i18n/lumina-open_zu.ts index 607f911f..514c2cc0 100644 --- a/src-qt5/core/lumina-open/i18n/lumina-open_zu.ts +++ b/src-qt5/core/lumina-open/i18n/lumina-open_zu.ts @@ -147,59 +147,59 @@ - - + + Audio Volume %1% - - + + Screen Brightness %1% - + Invalid file or URL: %1 - + Application entry is invalid: %1 - + Application shortcut is missing the launching information (malformed shortcut): %1 - + URL shortcut is missing the URL: %1 - + Directory shortcut is missing the path to the directory: %1 - + Unknown type of shortcut : %1 - + Could not find "%1". Please ensure it is installed first. - + Application Error - + The following application experienced an error and needed to close: -- cgit From 78fa2f5368ce789f8f1fe63d3de5f43bbb4a9308 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Wed, 7 Mar 2018 15:10:49 -0500 Subject: Split the Lumina 2 backend: Based on a qmake flag, have it use QtWidgets or QML for the front-end renderer. This will allow us to import/use all the Lumina 1.x interface elements (in Widget form) for now, but switch over to QML interface later without losing all the improvements to the underling events/communication systems. --- src-qt5/core/libLumina/LIconCache.h | 5 + src-qt5/core/libLumina/LUtils.cpp | 6 +- .../core/lumina-desktop-unified/global-includes.h | 1 + .../core/lumina-desktop-unified/lumina-desktop.pro | 4 +- .../src-desktop/DesktopManager.cpp | 10 +- .../src-desktop/OldContextMenu.cpp | 189 --------------------- .../src-desktop/OldContextMenu.h | 48 ------ .../src-desktop/RootWindow-QML.cpp | 57 +++++++ .../src-desktop/RootWindow-Widgets.cpp | 53 ++++++ .../src-desktop/RootWindow.cpp | 50 ------ .../src-desktop/RootWindow.h | 8 +- .../lumina-desktop-unified/src-desktop/desktop.pri | 35 +++- .../src-desktop/src-cpp/RootDesktopObject.cpp | 5 + .../src-desktop/src-cpp/RootDesktopObject.h | 3 + .../src-desktop/src-widgets/ContextMenu.cpp | 184 ++++++++++++++++++++ .../src-desktop/src-widgets/ContextMenu.h | 48 ++++++ .../src-desktop/src-widgets/RootDesktop.cpp | 120 +++++++++++++ .../src-desktop/src-widgets/RootDesktop.h | 44 +++++ .../src-desktop/src-widgets/src-widgets.pri | 8 + 19 files changed, 572 insertions(+), 306 deletions(-) delete mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/OldContextMenu.cpp delete mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/OldContextMenu.h create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow-QML.cpp create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow-Widgets.cpp delete mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/ContextMenu.cpp create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/ContextMenu.h create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/RootDesktop.cpp create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/RootDesktop.h create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/src-widgets.pri (limited to 'src-qt5/core') diff --git a/src-qt5/core/libLumina/LIconCache.h b/src-qt5/core/libLumina/LIconCache.h index 691d328c..6fc693d6 100644 --- a/src-qt5/core/libLumina/LIconCache.h +++ b/src-qt5/core/libLumina/LIconCache.h @@ -7,6 +7,9 @@ // This is a simple class for loading/serving icon files // from the icon theme or local filesystem //=========================================== +#ifndef _LUMINA_LIBRARY_ICON_CACHE_H +#define _LUMINA_LIBRARY_ICON_CACHE_H + #include #include #include @@ -79,3 +82,5 @@ signals: void InternalIconLoaded(QString, QDateTime, QByteArray*); //INTERNAL SIGNAL - DO NOT USE in other classes/objects void IconAvailable(QString); //way for classes to listen/reload icons as they change }; + +#endif diff --git a/src-qt5/core/libLumina/LUtils.cpp b/src-qt5/core/libLumina/LUtils.cpp index 3d3c878a..6ca8b679 100644 --- a/src-qt5/core/libLumina/LUtils.cpp +++ b/src-qt5/core/libLumina/LUtils.cpp @@ -273,13 +273,15 @@ QStringList LUtils::videoExtensions() { QStringList LUtils::imageExtensions(bool wildcards){ //Note that all the image extensions are lowercase!! static QStringList imgExtensions; + static QStringList imgExtensionsWC; if(imgExtensions.isEmpty()){ QList fmt = QImageReader::supportedImageFormats(); for(int i=0; i #include #include +#include // libLumina includes #include diff --git a/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro b/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro index a929f844..e601bb09 100644 --- a/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro +++ b/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro @@ -22,6 +22,7 @@ include(../libLumina/LuminaSingleApplication.pri) include(../libLumina/DesktopSettings.pri) include(../libLumina/ExternalProcess.pri) include(../libLumina/XDGMime.pri) +include(../libLumina/LIconCache.pri) include(../../src-cpp/plugins-base.pri) include(../../src-cpp/framework-OSInterface.pri) @@ -40,7 +41,8 @@ SOURCES += main.cpp \ HEADERS += global-includes.h \ global-objects.h \ LSession.h \ - BootSplash.h + BootSplash.h \ + JsonMenu.h FORMS += BootSplash.ui diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp index 73cd6645..b94a241d 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/DesktopManager.cpp @@ -41,16 +41,20 @@ void DesktopManager::updateWallpaper(QString screen_id, int wkspace){ QStringList wpaperList = DesktopSettings::instance()->value(DesktopSettings::Desktop, "wallpapers/"+screen_id+"_wk_"+QString::number(wkspace), QStringList()).toStringList(); //Next look for a list that matches this exact workspace if(wpaperList.isEmpty()){ wpaperList= DesktopSettings::instance()->value(DesktopSettings::Desktop, "wallpapers/default_wk_"+QString::number(wkspace), QStringList()).toStringList(); } + wpaperList.removeAll(""); //Next look for a list that matches this exact screen if(wpaperList.isEmpty()){ wpaperList= DesktopSettings::instance()->value(DesktopSettings::Desktop, "wallpapers/"+screen_id, QStringList()).toStringList(); } + wpaperList.removeAll(""); //Now look for a list that matches any screen/workspace if(wpaperList.isEmpty()){ wpaperList= DesktopSettings::instance()->value(DesktopSettings::Desktop, "wallpapers/default", QStringList()).toStringList(); } + wpaperList.removeAll(""); //Now use the failover wallpaper directory if(wpaperList.isEmpty()){ QString def = LOS::LuminaShare().section("/",0,-3)+"/wallpapers/lumina-nature"; //Note: LuminaShare() ends with an extra "/" //qDebug() << "Default Wallpaper:" << def; if(QFile::exists(def)){ wpaperList << def; } } + //qDebug() << "Got wallpaper list:" << screen_id << wkspace << wpaperList; //Wallpaper selection/randomization if(wpaperList.count()==1 && wpaperList.first()==current){ return; } //nothing to do - just the same image QString wpaper; @@ -60,6 +64,7 @@ void DesktopManager::updateWallpaper(QString screen_id, int wkspace){ if(!wpaper.isEmpty()){ //Got a directory - update the list of files and re-randomize the selection QStringList imgs = LUtils::imageExtensions(true); + //qDebug() << " - Got Dir: " << imgs; QDir tdir(wpaper); prefix=wpaper+"/"; bgL = tdir.entryList(imgs, QDir::Files | QDir::NoDotAndDotDot, QDir::Name); @@ -91,7 +96,7 @@ void DesktopManager::updatePlugins(QString plugin_id){ // === PUBLIC SLOTS === void DesktopManager::workspaceChanged(int wknum){ - qDebug() << "Got Workspace Changed:" << wknum; + //qDebug() << "Got Workspace Changed:" << wknum; syncWindowList(); } @@ -117,6 +122,9 @@ void DesktopManager::settingsChanged(DesktopSettings::File type){ void DesktopManager::NewWindowAvailable(NativeWindowObject* win){ //connect(win, SIGNAL(WindowClosed(WId)), this, SLOT(syncWindowList()) ); +#ifdef USE_WIDGETS + qDebug() << "Got New Widget Window:" << win->name(); +#endif syncWindowList(); } diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/OldContextMenu.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/OldContextMenu.cpp deleted file mode 100644 index 47f0e3d7..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/OldContextMenu.cpp +++ /dev/null @@ -1,189 +0,0 @@ -//=========================================== -// Lumina-desktop source code -// Copyright (c) 2012-2017, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "ContextMenu.h" -#include -#include - -void DesktopContextMenu::SettingsChanged(DesktopSettings::File file){ - if(file == DesktopSettings::ContextMenu){ UpdateMenu(false); } -} - -void DesktopContextMenu::UpdateMenu(bool fast){ - //Put a label at the top - unsigned int num = Lumina::NWS->currentWorkspace(); - workspaceLabel->setText( ""+QString(tr("Workspace %1")).arg(QString::number(num+1))+""); - if(fast && usewinmenu){ updateWinMenu(); } - if(fast){ return; } //already done - this->clear(); //clear it for refresh - this->addAction(wkspaceact); - this->addSeparator(); - //Now load the user's menu setup and fill the menu - QStringList items = DesktopSettings::instance()->value(DesktopSettings::ContextMenu, "itemlist", QStringList()<< "terminal" << "filemanager" << "line" << "applications" << "windowlist" << "settings" << "lockdesktop").toStringList(); - usewinmenu=false; - for(int i=0; iaddAction( tr("Terminal")); - LIconCache::instance()->loadIcon(act, "utilities-terminal"); - act->setWhatsThis("--terminal"); - } - else if(items[i]=="lockdesktop"){ - QAction *act = this->addAction( tr("Lock Session"), this, SIGNAL(LockSession()) ); - LIconCache::instance()->loadIcon(act, "system-lock-screen"); - } - else if(items[i]=="filemanager"){ - QAction *act = this->addAction( tr("Browse Files")); - LIconCache::instance()->loadIcon(act, "user-home"); - act->setWhatsThis(QDir::homePath()); - } - else if(items[i]=="applications"){ - if(appMenu==0){ updateAppMenu(); } - this->addMenu( appMenu ); - } - else if(items[i]=="line"){ this->addSeparator(); } - //else if(items[i]=="settings"){ this->addMenu( LSession::handle()->settingsMenu() ); } - else if(items[i]=="windowlist"){ - if(winMenu==0){ updateWinMenu(); } - this->addMenu( winMenu); - usewinmenu=true; - }else if(items[i].startsWith("app::::") && items[i].endsWith(".desktop")){ - //Custom *.desktop application - QString file = items[i].section("::::",1,1).simplified(); - //Try to use the pre-loaded app entry for this - XDGDesktop *xdg = XDGDesktopList::instance()->findAppFile(file); - if(xdg!=0){ xdg->addToMenu(this); } - else{ - XDGDesktop xdgf(file);// = LXDG::loadDesktopFile(file, ok); - if(xdgf.type!=XDGDesktop::BAD){ xdgf.addToMenu(this); } - } - }else if(items[i].startsWith("jsonmenu::::")){ - //Custom JSON menu system (populated on demand via external scripts/tools - QStringList info = items[i].split("::::"); //FORMAT:[ "jsonmenu",exec,name, icon(optional)] - if(info.length()>=3){ - //qDebug() << "Custom JSON Menu Loaded:" << info; - JsonMenu *tmp = new JsonMenu(info[1], this); - tmp->setTitle(info[2]); - connect(tmp, SIGNAL(triggered(QAction*)), this, SLOT(SystemApplication(QAction*)) ); - if(info.length()>=4){ tmp->setIcon( LXDG::findIcon(info[3],"") ); } - this->addMenu(tmp); - } - } - } - //Now add the system quit options - this->addSeparator(); - this->addAction(LXDG::findIcon("system-log-out",""), tr("Leave"), this, SIGNAL(showLeaveDialog()) ); -} - -// === PRIVATE === -void DesktopContextMenu::AddWindowToMenu(NativeWindow *win){ - QString label = win->property(NativeWindow::ShortTitle).toString(); - if(label.isEmpty()){ label = win->property(NativeWindow::Title).toString(); } - if(label.isEmpty()){ label = win->property(NativeWindow::Name).toString(); } - QAction *tmp = winMenu->addAction( win->property(NativeWindow::Icon).value(), label, win, SLOT(toggleVisibility()) ); - //Need to change the visual somehow to indicate whether it is visible or not - //bool visible = win->property(NativeWindow::Visible).toBool(); - // TODO -} - -// === PUBLIC === -DesktopContextMenu::DesktopContextMenu(QWidget *parent) : QMenu(parent){ - if(parent!=0){ - parent->setContextMenuPolicy(Qt::CustomContextMenu); - connect(parent, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showMenu(const QPoint&)) ); - } - appMenu = 0; - winMenu = 0; - usewinmenu = false; - workspaceLabel = new QLabel(0); - workspaceLabel->setAlignment(Qt::AlignCenter); - wkspaceact = new QWidgetAction(0); - wkspaceact->setDefaultWidget(workspaceLabel); - connect(this, SIGNAL(triggered(QAction*)), this, SLOT(LaunchAction(QAction*)) ); - //Connect to a couple global objects - connect(this, SIGNAL(aboutToShow()), this, SLOT(UpdateMenu()) ); //this will do a "fast" update - qDebug() << "Done Creating Context Menu"; -} - -DesktopContextMenu::~DesktopContextMenu(){ - //nothing special - //workspaceLabel->deleteLater(); //The QWidgetAction takes ownership of the label when inserted - do not manually delete - wkspaceact->deleteLater(); -} - -void DesktopContextMenu::start(){ - connect(DesktopSettings::instance(), SIGNAL(FileModified(DesktopSettings::File)), this, SLOT(SettingsChanged(DesktopSettings::File)) ); - connect(this, SIGNAL(LockSession()), Lumina::SS, SLOT(LockScreenNow()) ); - connect(XDGDesktopList::instance(), SIGNAL(appsUpdated()), this, SLOT(updateAppMenu()) ); - UpdateMenu(false); - //Still need to connect to some "workspaceChanged(int)" signal -} - -// === PRIVATE SLOTS === -void DesktopContextMenu::LaunchAction(QAction *act){ - //qDebug() << "Launch Action Triggered:" << act->whatsThis(); - if(act->whatsThis().isEmpty() || act->parent()!=this ){ return; } - qDebug() << "Launch Menu Action:" << act->whatsThis(); - QString cmd = act->whatsThis(); - if(cmd.startsWith("-action ")){ - LaunchApp(act); //forward this to the XDGDesktop parser - }else if(cmd.startsWith("--") || cmd.endsWith(".desktop")){ - LSession::instance()->LaunchStandardApplication(cmd); - }else if(QFile::exists(cmd)){ - QString mime = XDGMime::fromFileName(cmd); - LSession::instance()->LaunchStandardApplication(mime, QStringList() << cmd); - } -} - -void DesktopContextMenu::LaunchApp(QAction *act){ - - // The "whatsThis() field is set by the XDGDesktop object/format - if(act->whatsThis().isEmpty()){ return; } - QString action, file; - QString wt = act->whatsThis(); - if(wt.startsWith("-action")){ - action = wt.section(" ",1,1); action=action.remove("\""); - file = wt.section(" ",2,-1); file=file.remove("\""); - } - else{ file = wt; } - LSession::instance()->LaunchDesktopApplication(file, action); - -} - -void DesktopContextMenu::showMenu(const QPoint &pt){ - this->popup(pt); -} - -void DesktopContextMenu::updateAppMenu(){ - //qDebug() << "Update App Menu"; - if(appMenu==0){ - appMenu = new QMenu(this); - appMenu->setTitle( tr("Applications")); - LIconCache::instance()->loadIcon( appMenu, "system-run"); - connect(appMenu, SIGNAL(triggered(QAction*)), this, SLOT(LaunchApp(QAction*)) ); - } - //qDebug() << "Populate App Menu"; - XDGDesktopList::instance()->populateMenu(appMenu); -} - -void DesktopContextMenu::updateWinMenu(){ - //qDebug() << "Update Win Menu"; - if(winMenu==0){ - winMenu = new QMenu(this); - winMenu->setTitle( tr("Task Manager") ); - LIconCache::instance()->loadIcon( winMenu, "preferences-system-windows"); - } - winMenu->clear(); - QList wins = Lumina::NWS->currentWindows(); - unsigned int wkspace = Lumina::NWS->currentWorkspace(); - for(int i=0; iproperty(NativeWindow::Workspace).toUInt() != wkspace - && wins.at(i)->property(NativeWindow::States).value< QList >().contains(NativeWindow::S_STICKY) ){ - continue; - } - AddWindowToMenu(wins.at(i)); - } -} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/OldContextMenu.h b/src-qt5/core/lumina-desktop-unified/src-desktop/OldContextMenu.h deleted file mode 100644 index 78756e8c..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/OldContextMenu.h +++ /dev/null @@ -1,48 +0,0 @@ -//=========================================== -// Lumina-desktop source code -// Copyright (c) 2012-2017, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#ifndef _LUMINA_DESKTOP_CONTEXT_MENU_H -#define _LUMINA_DESKTOP_CONTEXT_MENU_H - -#include - -class DesktopContextMenu : public QMenu{ - Q_OBJECT -public slots: - void SettingsChanged(DesktopSettings::File); - void UpdateMenu(bool fast = true); //re-create the menu - -private: - QLabel *workspaceLabel; - QWidgetAction *wkspaceact; - QMenu *appMenu, *winMenu; - bool usewinmenu; - - void AddWindowToMenu(NativeWindow*); - -public: - DesktopContextMenu(QWidget *parent = 0); - ~DesktopContextMenu(); - - void start(); //setup connections to global objects - -private slots: - void LaunchAction(QAction *act); - void LaunchApp(QAction *act); - - void showMenu(const QPoint&); - - void updateAppMenu(); - void updateWinMenu(); - -signals: - void LockSession(); - void showLeaveDialog(); - void LaunchStandardApplication(QString); - void LaunchApplication(QString); -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow-QML.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow-QML.cpp new file mode 100644 index 00000000..8619544b --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow-QML.cpp @@ -0,0 +1,57 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2017-2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "RootWindow.h" +#include "QMLImageProvider.h" +#include + +QQuickView *root_view; + +RootWindow::RootWindow() : QObject(){ + root_win = QWindow::fromWinId( QX11Info::appRootWindow() ); + root_view = new QQuickView(); //make it a child of the root window + root_obj = RootDesktopObject::instance(); + syncRootSize(); + connect(root_win, SIGNAL(widthChanged(int)), this, SLOT(syncRootSize()) ); + connect(root_win, SIGNAL(heightChanged(int)),this, SLOT(syncRootSize()) ); + //Now setup the QQuickView + root_view->setResizeMode(QQuickView::SizeRootObjectToView); + root_view->engine()->rootContext()->setContextProperty("RootObject", root_obj); + root_view->engine()->addImageProvider("native_window", new QMLImageProvider(QQmlImageProviderBase::Image) ); + //root_view->engine()->addImageProvider("native_window_icon", new QMLImageProvider(QQmlImageProviderBase::Pixmap) ); + RootDesktopObject::RegisterType(); //make sure object classes are registered with the QML subsystems +} + +RootWindow::~RootWindow(){ + root_view->deleteLater(); + root_obj->deleteLater(); +} + +void RootWindow::start(){ + root_view->setSource(QUrl("qrc:///qml/RootDesktop.qml")); + root_win->show(); + if(root_view->parent()!=0){ root_view->parent()->show(); } + root_view->show(); +} + +WId RootWindow::viewID(){ + if(root_view->parent()!=0){ return root_view->parent()->winId(); } + return root_view->winId(); +} + +void RootWindow::syncRootSize(){ + //qDebug() << "Sync Root Size:" << root_win->width() << root_win->height() << root_view->geometry(); + QList screens = QApplication::screens(); + QRect unif; + for(int i=0; igeometry()); } + if(unif.width() != root_view->width() || unif.height() != root_view->height()){ + if(root_view->parent()!=0){ root_view->parent()->setGeometry(0,0,unif.width(), unif.height()); } + root_view->setGeometry(0, 0, unif.width(), unif.height() ); + emit RootResized(root_view->geometry()); + } + root_obj->updateScreens(); + //qDebug() << " - after:" << root_view->geometry(); +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow-Widgets.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow-Widgets.cpp new file mode 100644 index 00000000..6a4c4cb0 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow-Widgets.cpp @@ -0,0 +1,53 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2017-2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "RootWindow.h" + +//include the Widgets-based classes we need +#include "RootDesktop.h" + +RootDesktop *root_view; + +RootWindow::RootWindow() : QObject(){ + root_win = QWindow::fromWinId( QX11Info::appRootWindow() ); + root_view = new RootDesktop(root_win); //make it a child of the root window + root_obj = RootDesktopObject::instance(); + syncRootSize(); + connect(root_win, SIGNAL(widthChanged(int)), this, SLOT(syncRootSize()) ); + connect(root_win, SIGNAL(heightChanged(int)),this, SLOT(syncRootSize()) ); +} + +RootWindow::~RootWindow(){ + root_view->deleteLater(); + root_obj->deleteLater(); +} + +void RootWindow::start(){ + root_win->show(); + //if(root_view->parent()!=0){ root_view->parent()->show(); } + root_view->show(); + root_view->start(); + QTimer::singleShot(1000, this, SLOT(syncRootSize()) ); //just in case something changed during init routines +} + +WId RootWindow::viewID(){ + //if(root_view->parent()!=0){ return root_view->parent()->winId(); } + return root_view->winId(); +} + +void RootWindow::syncRootSize(){ + //qDebug() << "Sync Root Size:" << root_win->width() << root_win->height() << root_view->geometry(); + QList screens = QApplication::screens(); + QRect unif; + for(int i=0; igeometry()); } + if(unif.width() != root_view->width() || unif.height() != root_view->height()){ + //if(root_view->parent()!=0){ root_view->parent()->setGeometry(0,0,unif.width(), unif.height()); } + root_view->setGeometry(0, 0, unif.width(), unif.height() ); + emit RootResized(root_view->geometry()); + } + root_obj->updateScreens(); + //qDebug() << " - after:" << root_view->geometry(); +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp deleted file mode 100644 index 9664e506..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.cpp +++ /dev/null @@ -1,50 +0,0 @@ -//=========================================== -// Lumina-desktop source code -// Copyright (c) 2017, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "RootWindow.h" -#include "QMLImageProvider.h" -#include - -RootWindow::RootWindow() : QObject(){ - root_win = QWindow::fromWinId( QX11Info::appRootWindow() ); - root_view = new QQuickView(); //make it a child of the root window - root_obj = RootDesktopObject::instance(); - syncRootSize(); - connect(root_win, SIGNAL(widthChanged(int)), this, SLOT(syncRootSize()) ); - connect(root_win, SIGNAL(heightChanged(int)),this, SLOT(syncRootSize()) ); - //Now setup the QQuickView - root_view->setResizeMode(QQuickView::SizeRootObjectToView); - root_view->engine()->rootContext()->setContextProperty("RootObject", root_obj); - root_view->engine()->addImageProvider("native_window", new QMLImageProvider(QQmlImageProviderBase::Image) ); - //root_view->engine()->addImageProvider("native_window_icon", new QMLImageProvider(QQmlImageProviderBase::Pixmap) ); - RootDesktopObject::RegisterType(); //make sure object classes are registered with the QML subsystems -} - -RootWindow::~RootWindow(){ - root_view->deleteLater(); - root_obj->deleteLater(); -} - -void RootWindow::start(){ - root_view->setSource(QUrl("qrc:///qml/RootDesktop.qml")); - root_win->show(); - if(root_view->parent()!=0){ root_view->parent()->show(); } - root_view->show(); -} - -void RootWindow::syncRootSize(){ - //qDebug() << "Sync Root Size:" << root_win->width() << root_win->height() << root_view->geometry(); - QList screens = QApplication::screens(); - QRect unif; - for(int i=0; igeometry()); } - if(unif.width() != root_view->width() || unif.height() != root_view->height()){ - if(root_view->parent()!=0){ root_view->parent()->setGeometry(0,0,unif.width(), unif.height()); } - root_view->setGeometry(0, 0, unif.width(), unif.height() ); - emit RootResized(root_view->geometry()); - } - root_obj->updateScreens(); - //qDebug() << " - after:" << root_view->geometry(); -} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h index 41c75a46..3c7414f2 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/RootWindow.h @@ -1,6 +1,6 @@ //=========================================== // Lumina-desktop source code -// Copyright (c) 2017, Ken Moore +// Copyright (c) 2017-2018, Ken Moore // Available under the 3-clause BSD license // See the LICENSE file for full details //=========================================== @@ -13,7 +13,6 @@ class RootWindow : public QObject{ Q_OBJECT private: QWindow *root_win; - QQuickView *root_view; RootDesktopObject *root_obj; public: @@ -22,10 +21,7 @@ public: void start(); - WId viewID(){ - if(root_view->parent()!=0){ return root_view->parent()->winId(); } - return root_view->winId(); - } + WId viewID(); public slots: void syncRootSize(); diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/desktop.pri b/src-qt5/core/lumina-desktop-unified/src-desktop/desktop.pri index ee5ada62..89542e23 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/desktop.pri +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/desktop.pri @@ -1,15 +1,32 @@ -QT *= gui widgets qml quick +QT *= gui widgets -SOURCES *= $${PWD}/RootWindow.cpp \ - $${PWD}/Desktopmanager.cpp \ +#update the includepath so we can just #include as needed without paths +INCLUDEPATH *= $${PWD} + +SOURCES *= $${PWD}/Desktopmanager.cpp \ $${PWD}/QMLImageProvider.cpp HEADERS *= $${PWD}/RootWindow.h \ - $${PWD}/DesktopManager.h \ - $${PWD}/QMLImageProvider.h - -#update the includepath so we can just #include as needed without paths -INCLUDEPATH *= $${PWD} + $${PWD}/DesktopManager.h +#include the base objects include($${PWD}/src-cpp/src-cpp.pri) -include($${PWD}/src-qml/src-qml.pri) + +#Now do the QML/Widgets interface switch +isEmpty(USE_QML){ + #Widgets-based interface + DEFINES += USE_WIDGETS="true" + + SOURCES *= $${PWD}/RootWindow-Widgets.cpp + + include($${PWD}/src-widgets/src-widgets.pri) + +}else{ + #QML-based interface + QT *= qml quick + DEFINES += USE_QML="true" + SOURCES *= $${PWD}/RootWindow-QML.cpp + HEADERS *= $${PWD}/QMLImageProvider.h + + include($${PWD}/src-qml/src-qml.pri) +} 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 5891028c..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 @@ -237,6 +237,11 @@ void RootDesktopObject::launchApp(QString appOrPath){ emit launchApplication(appOrPath); } +//C++ Access Functions (simplifications for the QML ones) +QList RootDesktopObject::windowObjects(){ + return window_objects; +} + // === PUBLIC SLOTS === void RootDesktopObject::updateScreens(){ QList scrns = QApplication::screens(); diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h index a6a4a236..3c525848 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/RootDesktopObject.h @@ -55,6 +55,9 @@ public: Q_INVOKABLE void mousePositionChanged(bool lowerall = false); Q_INVOKABLE void launchApp(QString appOrPath); + //C++ Access Functions (simplifications for the QML ones) + QList windowObjects(); + private: QList s_objects; QList panel_objects; diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/ContextMenu.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/ContextMenu.cpp new file mode 100644 index 00000000..139eee89 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/ContextMenu.cpp @@ -0,0 +1,184 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2012-2017, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "ContextMenu.h" +#include +#include +#include + +void DesktopContextMenu::SettingsChanged(DesktopSettings::File file){ + if(file == DesktopSettings::ContextMenu){ UpdateMenu(false); } +} + +void DesktopContextMenu::UpdateMenu(bool fast){ + //Put a label at the top + unsigned int num = Lumina::NWS->currentWorkspace(); + workspaceLabel->setText( ""+QString(tr("Workspace %1")).arg(QString::number(num+1))+""); + if(fast && usewinmenu){ updateWinMenu(); } + if(fast){ return; } //already done + this->clear(); //clear it for refresh + this->addAction(wkspaceact); + this->addSeparator(); + //Now load the user's menu setup and fill the menu + QStringList items = DesktopSettings::instance()->value(DesktopSettings::ContextMenu, "itemlist", QStringList()<< "terminal" << "filemanager" << "line" << "applications" << "windowlist" << "settings" << "lockdesktop").toStringList(); + usewinmenu=false; + for(int i=0; iaddAction( tr("Terminal")); + LIconCache::instance()->loadIcon(act, "utilities-terminal"); + act->setWhatsThis("--terminal"); + } + else if(items[i]=="lockdesktop"){ + QAction *act = this->addAction( tr("Lock Session"), this, SIGNAL(LockSession()) ); + LIconCache::instance()->loadIcon(act, "system-lock-screen"); + } + else if(items[i]=="filemanager"){ + QAction *act = this->addAction( tr("Browse Files")); + LIconCache::instance()->loadIcon(act, "user-home"); + act->setWhatsThis(QDir::homePath()); + } + else if(items[i]=="applications"){ + if(appMenu==0){ updateAppMenu(); } + this->addMenu( appMenu ); + } + else if(items[i]=="line"){ this->addSeparator(); } + //else if(items[i]=="settings"){ this->addMenu( LSession::handle()->settingsMenu() ); } + else if(items[i]=="windowlist"){ + if(winMenu==0){ updateWinMenu(); } + this->addMenu( winMenu); + usewinmenu=true; + }else if(items[i].startsWith("app::::") && items[i].endsWith(".desktop")){ + //Custom *.desktop application + QString file = items[i].section("::::",1,1).simplified(); + //Try to use the pre-loaded app entry for this + XDGDesktop *xdg = XDGDesktopList::instance()->findAppFile(file); + if(xdg!=0){ xdg->addToMenu(this); } + else{ + XDGDesktop xdgf(file);// = LXDG::loadDesktopFile(file, ok); + if(xdgf.type!=XDGDesktop::BAD){ xdgf.addToMenu(this); } + } + }else if(items[i].startsWith("jsonmenu::::")){ + //Custom JSON menu system (populated on demand via external scripts/tools + QStringList info = items[i].split("::::"); //FORMAT:[ "jsonmenu",exec,name, icon(optional)] + if(info.length()>=3){ + //qDebug() << "Custom JSON Menu Loaded:" << info; + JsonMenu *tmp = new JsonMenu(info[1], this); + tmp->setTitle(info[2]); + connect(tmp, SIGNAL(triggered(QAction*)), this, SLOT(SystemApplication(QAction*)) ); + if(info.length()>=4){ tmp->setIcon( LXDG::findIcon(info[3],"") ); } + this->addMenu(tmp); + } + } + } + //Now add the system quit options + this->addSeparator(); + this->addAction(LXDG::findIcon("system-log-out",""), tr("Leave"), this, SIGNAL(showLeaveDialog()) ); +} + +// === PRIVATE === +void DesktopContextMenu::AddWindowToMenu(NativeWindowObject *win){ + QString label = win->property(NativeWindowObject::ShortTitle).toString(); + if(label.isEmpty()){ label = win->property(NativeWindowObject::Title).toString(); } + if(label.isEmpty()){ label = win->property(NativeWindowObject::Name).toString(); } + QAction *tmp = winMenu->addAction( win->property(NativeWindowObject::Icon).value(), label, win, SLOT(toggleVisibility()) ); + //Need to change the visual somehow to indicate whether it is visible or not + //bool visible = win->property(NativeWindow::Visible).toBool(); + // TODO +} + +// === PUBLIC === +DesktopContextMenu::DesktopContextMenu(QWidget *parent) : QMenu(parent){ + if(parent!=0){ + parent->setContextMenuPolicy(Qt::CustomContextMenu); + connect(parent, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showMenu(const QPoint&)) ); + } + appMenu = 0; + winMenu = 0; + usewinmenu = false; + workspaceLabel = new QLabel(0); + workspaceLabel->setAlignment(Qt::AlignCenter); + wkspaceact = new QWidgetAction(0); + wkspaceact->setDefaultWidget(workspaceLabel); + connect(this, SIGNAL(triggered(QAction*)), this, SLOT(LaunchAction(QAction*)) ); + //Connect to a couple global objects + connect(this, SIGNAL(aboutToShow()), this, SLOT(UpdateMenu()) ); //this will do a "fast" update + qDebug() << "Done Creating Context Menu"; +} + +DesktopContextMenu::~DesktopContextMenu(){ + //nothing special + //workspaceLabel->deleteLater(); //The QWidgetAction takes ownership of the label when inserted - do not manually delete + wkspaceact->deleteLater(); +} + +void DesktopContextMenu::start(){ + connect(DesktopSettings::instance(), SIGNAL(FileModified(DesktopSettings::File)), this, SLOT(SettingsChanged(DesktopSettings::File)) ); + connect(this, SIGNAL(LockSession()), Lumina::SS, SLOT(LockScreenNow()) ); + connect(XDGDesktopList::instance(), SIGNAL(appsUpdated()), this, SLOT(updateAppMenu()) ); + UpdateMenu(false); + //Still need to connect to some "workspaceChanged(int)" signal +} + +// === PRIVATE SLOTS === +void DesktopContextMenu::LaunchAction(QAction *act){ + //qDebug() << "Launch Action Triggered:" << act->whatsThis(); + if(act->whatsThis().isEmpty() || act->parent()!=this ){ return; } + qDebug() << "Launch Menu Action:" << act->whatsThis(); + QString cmd = act->whatsThis(); + if(cmd.startsWith("-action ")){ + LaunchApp(act); //forward this to the XDGDesktop parser + }else if(cmd.startsWith("--") || cmd.endsWith(".desktop")){ + LSession::instance()->LaunchStandardApplication(cmd); + }else if(QFile::exists(cmd)){ + QString mime = XDGMime::fromFileName(cmd); + LSession::instance()->LaunchStandardApplication(mime, QStringList() << cmd); + } +} + +void DesktopContextMenu::LaunchApp(QAction *act){ + + // The "whatsThis() field is set by the XDGDesktop object/format + if(act->whatsThis().isEmpty()){ return; } + QString action, file; + QString wt = act->whatsThis(); + if(wt.startsWith("-action")){ + action = wt.section(" ",1,1); action=action.remove("\""); + file = wt.section(" ",2,-1); file=file.remove("\""); + } + else{ file = wt; } + LSession::instance()->LaunchDesktopApplication(file, action); + +} + +void DesktopContextMenu::showMenu(const QPoint &pt){ + this->popup(pt); +} + +void DesktopContextMenu::updateAppMenu(){ + //qDebug() << "Update App Menu"; + if(appMenu==0){ + appMenu = new QMenu(this); + appMenu->setTitle( tr("Applications")); + LIconCache::instance()->loadIcon( appMenu, "system-run"); + connect(appMenu, SIGNAL(triggered(QAction*)), this, SLOT(LaunchApp(QAction*)) ); + } + //qDebug() << "Populate App Menu"; + XDGDesktopList::instance()->populateMenu(appMenu); +} + +void DesktopContextMenu::updateWinMenu(){ + //qDebug() << "Update Win Menu"; + if(winMenu==0){ + winMenu = new QMenu(this); + winMenu->setTitle( tr("Task Manager") ); + LIconCache::instance()->loadIcon( winMenu, "preferences-system-windows"); + } + winMenu->clear(); + QList wins = RootDesktopObject::instance()->windowObjects(); + for(int i=0; i + +class DesktopContextMenu : public QMenu{ + Q_OBJECT +public slots: + void SettingsChanged(DesktopSettings::File); + void UpdateMenu(bool fast = true); //re-create the menu + +private: + QLabel *workspaceLabel; + QWidgetAction *wkspaceact; + QMenu *appMenu, *winMenu; + bool usewinmenu; + + void AddWindowToMenu(NativeWindowObject*); + +public: + DesktopContextMenu(QWidget *parent = 0); + ~DesktopContextMenu(); + + void start(); //setup connections to global objects + +private slots: + void LaunchAction(QAction *act); + void LaunchApp(QAction *act); + + void showMenu(const QPoint&); + + void updateAppMenu(); + void updateWinMenu(); + +signals: + void LockSession(); + void showLeaveDialog(); + void LaunchStandardApplication(QString); + void LaunchApplication(QString); +}; + +#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/RootDesktop.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/RootDesktop.cpp new file mode 100644 index 00000000..9e22a143 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/RootDesktop.cpp @@ -0,0 +1,120 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include +#include "RootDesktop.h" + +// === PUBLIC === +RootDesktop::RootDesktop(QWindow *) : QWidget(0, Qt::Widget | Qt::FramelessWindowHint | Qt::WindowStaysOnBottomHint){ + +} + +RootDesktop::~RootDesktop(){ + +} + +void RootDesktop::start(){ + //qDebug() << "Starting RootDesktop" << this->geometry() << this->isVisible(); + bgTimer = new QTimer(this); + bgTimer->setInterval(50); + bgTimer->setSingleShot(true); + connect(bgTimer, SIGNAL(timeout()), this, SLOT(bgTimerUpdate()) ); + + cmenu = new DesktopContextMenu(this); + + //Setup the connections to the main objects + connect(RootDesktopObject::instance(), SIGNAL(screensChanged()), this, SLOT(on_screensChanged()) ); + connect(RootDesktopObject::instance(), SIGNAL(panelsChanged()), this, SLOT(on_panelsChanged()) ); + connect(RootDesktopObject::instance(), SIGNAL(windowsChanged()), this, SLOT(on_windowsChanged()) ); + connect(RootDesktopObject::instance(), SIGNAL(trayWindowsChanged()), this, SLOT(on_trayWindowsChanged()) ); + + connect(cmenu, SIGNAL(LockSession()), RootDesktopObject::instance(), SIGNAL(lockScreen()) ); + connect(cmenu, SIGNAL(showLeaveDialog()), RootDesktopObject::instance(), SIGNAL(startLogout()) ); + connect(cmenu, SIGNAL(LaunchStandardApplication(QString)), RootDesktopObject::instance(), SIGNAL(launchApplication(QString)) ); + connect(cmenu, SIGNAL(LaunchApplication(QString)), RootDesktopObject::instance(), SIGNAL(launchApplication(QString)) ); + + on_screensChanged(); //make sure this is setup right away (sets up connections + QTimer::singleShot(0, this, SLOT(on_panelsChanged()) ); + QTimer::singleShot(2, this, SLOT(on_windowsChanged()) ); + QTimer::singleShot(4, this, SLOT(on_trayWindowsChanged()) ); + + //Now start the first-run of the background change system + cmenu->start(); + bgTimer->start(); + this->show(); +} + +// === PRIVATE === +//QImage bgimage; + + +// === PRIVATE SLOTS === +//RootDesktopObject connections +void RootDesktop::on_screensChanged(){ + QStringList screens = RootDesktopObject::instance()->screens(); + //qDebug() << "Screens Changed:" << lastscreens << screens; + for(int i=0; iscreen(screens[i]), SIGNAL(backgroundChanged()), this, SLOT(on_screen_bg_changed()) ); + } + } + on_screen_bg_changed(); //start the timer to update the backgrounds now + lastscreens = screens; //save this for later +} + +void RootDesktop::on_panelsChanged(){ + +} + +void RootDesktop::on_windowsChanged(){ + +} + +void RootDesktop::on_trayWindowsChanged(){ + +} + +void RootDesktop::on_screen_bg_changed(){ + if(!bgTimer->isActive()){ bgTimer->start(); } +} + +//Internal use +void RootDesktop::bgTimerUpdate(){ + //qDebug() << "bgTimerUpdate"; + //QtConcurrent::run(this, &RootDesktop::updateBG, this); + updateBG(this); +} + +void RootDesktop::updateBG(RootDesktop* obj){ + + QImage tmp(obj->size(), QImage::Format_ARGB32_Premultiplied); + QStringList scr = RootDesktopObject::instance()->screens(); + //qDebug() << "updateBG" << scr << tmp.size() << obj->geometry(); + QPainter imgpaint(&tmp); + for(int i=0; iscreen(scr[i]); + QString file = screen->background(); //in URL format + //qDebug() << "Got BG File:" << file << QUrl(file).toLocalFile(); + QImage img(QUrl(file).toLocalFile()); + //qDebug() << " - BG File is null:" << img.isNull(); + imgpaint.drawImage(screen->geometry(), img, QRect(0,0,img.width(), img.height()) ); + } + bgimage = tmp; + //QTimer::singleShot(0, obj, SLOT(update()) ); + obj->update(); +} + +// === PROTECTED === +void RootDesktop::paintEvent(QPaintEvent *ev){ + //qDebug() << "Paint Event:" << bgimage.isNull(); + if (!bgimage.isNull()) { + //qDebug() << "Wallpaper paint Event:" << ev->rect(); + QPainter painter(this); + painter.drawImage(ev->rect(), bgimage, ev->rect()); + }else{ + QWidget::paintEvent(ev); + } +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/RootDesktop.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/RootDesktop.h new file mode 100644 index 00000000..16ce0e47 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/RootDesktop.h @@ -0,0 +1,44 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_DESKTOP_WIDGETS_ROOT_DESKTOP_H +#define _LUMINA_DESKTOP_WIDGETS_ROOT_DESKTOP_H + +#include +#include "ContextMenu.h" + +class RootDesktop : public QWidget{ + Q_OBJECT +public: + RootDesktop(QWindow *root); + ~RootDesktop(); + + void start(); + +private: + QImage bgimage; + QStringList lastscreens; + QTimer *bgTimer; + DesktopContextMenu *cmenu; + +private slots: + //RootDesktopObject connections + void on_screensChanged(); + void on_panelsChanged(); + void on_windowsChanged(); + void on_trayWindowsChanged(); + void on_screen_bg_changed(); + + //Internal use + void bgTimerUpdate(); + void updateBG(RootDesktop* obj); //designed to be run in a background thread + +protected: + virtual void paintEvent(QPaintEvent *ev); + +}; + +#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/src-widgets.pri b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/src-widgets.pri new file mode 100644 index 00000000..7994bb93 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/src-widgets.pri @@ -0,0 +1,8 @@ +#update the includepath so we can just #include as needed without paths +INCLUDEPATH *= $${PWD} + +SOURCES *= $${PWD}/RootDesktop.cpp \ + $${PWD}/ContextMenu.cpp + +HEADERS *= $${PWD}/RootDesktop.h \ + $${PWD}/ContextMenu.h -- cgit From f98120435fe52b8e2991353d43a7c1e2de75921d Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Thu, 8 Mar 2018 14:42:27 -0500 Subject: Add drag-n-drop to the desktop icons. This will let the user drag a desktop icon to any application/tool and have it react appropriately. NOTE: Directories on the desktop are not enabled as drop targets yet. --- .../applauncher/AppLauncherPlugin.h | 31 ++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.h b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.h index c8e3a475..833a2a48 100644 --- a/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.h +++ b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.h @@ -18,6 +18,8 @@ #include #include #include +#include +#include #include "../LDPlugin.h" @@ -38,6 +40,7 @@ private: QInputDialog *inputDLG; QString iconID; int icosize; + QPoint dragstartpos; private slots: void loadButton(); @@ -74,5 +77,33 @@ protected: QEvent::Type tmp = ev->type(); if(tmp == QEvent::StyleChange || tmp==QEvent::ThemeChange || tmp==QEvent::LanguageChange || tmp==QEvent::LocaleChange){ loadButton(); } } + + void mousePressEvent(QMouseEvent *ev){ + if(ev->button()==Qt::LeftButton){ + dragstartpos = ev->pos(); + } + } + + void mouseMoveEvent(QMouseEvent *ev){ + if( (ev->buttons() & Qt::LeftButton) ){ + if((ev->pos() - dragstartpos).manhattanLength() > (this->width()/4) ){ + //Start the drag event for this file + QDrag *drag = new QDrag(this); + QMimeData *md = new QMimeData; + md->setUrls( QList() << QUrl::fromLocalFile(button->whatsThis()) ); + drag->setMimeData(md); + //Now perform the drag and react appropriately + Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction); + if(dropAction == Qt::MoveAction){ + // File Moved, remove it from here + //qDebug() << "File Moved:" << button->whatsThis(); + //DO NOT DELETE FILES - return code often is wrong (browser drops for instance) + } + } + }else{ + LDPlugin::mouseMoveEvent(ev); + } + + } }; #endif -- cgit From 316223cb4a00af03a0989e0449fcac121213fda2 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Thu, 8 Mar 2018 15:20:09 -0500 Subject: Add drop support for directories on the desktop. --- .../applauncher/AppLauncherPlugin.cpp | 16 ++++++++++++++++ .../desktop-plugins/applauncher/AppLauncherPlugin.h | 21 +++++++++++++++++++++ 2 files changed, 37 insertions(+) (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp index 0bf087c1..837e3268 100644 --- a/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp +++ b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp @@ -47,6 +47,7 @@ void AppLauncherPlugin::loadButton(){ bool ok = info.canonicalPath().startsWith("/net/"); if(!ok){ ok = QFile::exists(path); } //do it this way to ensure the file existance check never runs for /net/ files if(!ok){ emit RemovePlugin(this->ID()); return;} + this->setAcceptDrops( info.isDir() ); icosize = this->height()-4 - 2.2*button->fontMetrics().height(); button->setFixedSize( this->width()-4, this->height()-4); button->setIconSize( QSize(icosize,icosize) ); @@ -316,3 +317,18 @@ void AppLauncherPlugin::renameFinished(int result){ qDebug() << " - SUCCESS"; } } + +void AppLauncherPlugin::fileDrop(bool copy, QList urls){ + for(int i=0; i" << button->whatsThis()+"/"+filename; + QFile::copy(oldpath, button->whatsThis()+"/"+filename); + }else{ + qDebug() << "Moving File:" << oldpath << "->" << button->whatsThis()+"/"+filename; + QFile::rename(oldpath, button->whatsThis()+"/"+filename); + } + } +} diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.h b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.h index 833a2a48..6cff4bf7 100644 --- a/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.h +++ b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.h @@ -20,6 +20,7 @@ #include #include #include +#include #include "../LDPlugin.h" @@ -62,6 +63,8 @@ private slots: void fileRename(); void renameFinished(int result); + void fileDrop(bool copy, QList urls); + public slots: void LocaleChange(){ loadButton(); //force reload @@ -103,7 +106,25 @@ protected: }else{ LDPlugin::mouseMoveEvent(ev); } + } + void dragEnterEvent(QDragEnterEvent *ev){ + if(ev->mimeData()->hasUrls() && this->acceptDrops()){ ev->acceptProposedAction(); } + } + + void dropEvent(QDropEvent *ev){ + QList urls = ev->mimeData()->urls(); + bool ok = !urls.isEmpty() && this->acceptDrops(); + if(ok){ + if(ev->proposedAction() == Qt::MoveAction){ + ev->setDropAction(Qt::MoveAction); + QtConcurrent::run(this, &AppLauncherPlugin::fileDrop, false, urls); + }else if(ev->proposedAction() == Qt::CopyAction){ + ev->setDropAction(Qt::CopyAction); + QtConcurrent::run(this, &AppLauncherPlugin::fileDrop, true, urls); + }else{ ok = false; } + } + if(ok){ ev->acceptProposedAction(); } } }; #endif -- cgit From c311d3688c2dc8175d627ddff8db2a7b729eb15e Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Fri, 9 Mar 2018 22:51:20 -0500 Subject: Add the beginnings of the new window frame (widgets-based) --- .../src-desktop/src-widgets/NativeWindow.cpp | 48 ++++++++++++++++++++++ .../src-desktop/src-widgets/NativeWindow.h | 34 +++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/NativeWindow.cpp create mode 100644 src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/NativeWindow.h (limited to 'src-qt5/core') diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/NativeWindow.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/NativeWindow.cpp new file mode 100644 index 00000000..24ad3fda --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/NativeWindow.cpp @@ -0,0 +1,48 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "NativeWindow.h" + +// === PUBLIC === +NativeWindow::NativeWindow( NativeWindowObject *obj ) : QFrame(0, Qt::Window | Qt::FramelessWindowHint){ + WIN = obj; + createFrame(); +} + +NativeWindow::~NativeWindow(){ + +} + +// === PRIVATE === +void NativeWindow::createFrame(){ + //Initialize the widgets + closeB = new QToolButton(this); + closeB->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + minB = new QToolButton(this); + minB->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + maxB = new QToolButton(this); + maxB->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + otherB = new QToolButton(this); + otherB->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + toolbarL = new QHBoxLayout(this); + vlayout = new QVBoxLayout(this); + vlayout.align + titleLabel = new QLabel(this); + titleLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + //Now put the widgets in the right places + toolbarL->addWidget(otherB); + toolbarL->addWidget(titleLabel); + toolbarL->addWidget(minB); + toolbarL->addWidget(maxB); + toolbarL->addWidget(closeB); + vlayout->addLayout(toolbarL); + vlayout->addStretch(); + this->setLayout(vlayout); + + // +} + +// === PRIVATE SLOTS === diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/NativeWindow.h b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/NativeWindow.h new file mode 100644 index 00000000..ffdb364a --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/src-widgets/NativeWindow.h @@ -0,0 +1,34 @@ +//=========================================== +// Lumina-desktop source code +// Copyright (c) 2018, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_DESKTOP_NATIVE_WINDOW_WIDGET_H +#define _LUMINA_DESKTOP_NATIVE_WINDOW_WIDGET_H + +#include + +class NativeWindow : public QFrame{ + Q_OBJECT +public: + NativeWindow(NativeWindowObject *obj); + ~NativeWindow(); + +private: + //Core object + NativeWindowObject *WIN; + // Interface items + void createFrame(); + QToolButton *closeB, *minB, *maxB, *otherB; + QHBoxLayout *toolbarL; + QVBoxLayout *vlayout; + QLabel *titleLabel; + // Info cache variables + QRect oldgeom; + +private slots: + +}; + +#endif -- cgit