aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debian/changelog8
-rw-r--r--debian/control8
-rw-r--r--debian/copyright4
-rw-r--r--debian/docs1
-rw-r--r--debian/lumina-xconfig.install2
-rwxr-xr-xdebian/rules3
-rw-r--r--libLumina/LuminaOS-OpenBSD.cpp20
-rw-r--r--lumina-desktop/LDesktop.cpp15
-rw-r--r--lumina-desktop/LDesktop.h5
-rw-r--r--lumina-desktop/LPanel.cpp13
-rw-r--r--lumina-desktop/LPanel.h2
-rw-r--r--lumina-desktop/LSession.cpp67
-rw-r--r--lumina-desktop/LSession.h1
-rw-r--r--lumina-desktop/SettingsMenu.cpp3
-rw-r--r--lumina-desktop/panel-plugins/userbutton/UserWidget.cpp2
-rw-r--r--lumina-desktop/panel-plugins/userbutton/UserWidget.h3
-rw-r--r--lumina-desktop/panel-plugins/userbutton/UserWidget.ui22
-rw-r--r--lumina-fm/DDFileSystemModel.h36
-rw-r--r--lumina-fm/MainUI.cpp87
-rw-r--r--lumina-fm/MainUI.h11
-rw-r--r--lumina-fm/MainUI.ui43
-rw-r--r--lumina-fm/MimeIconProvider.h6
-rw-r--r--lumina-fm/lumina-fm.pro3
-rw-r--r--lumina-search/MainUI.cpp3
-rw-r--r--lumina-search/main.cpp8
-rw-r--r--lumina-xconfig/MainUI.cpp191
-rw-r--r--lumina-xconfig/MainUI.h57
-rw-r--r--lumina-xconfig/MainUI.ui193
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_af.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_ar.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_az.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_bg.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_bn.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_bs.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_ca.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_cs.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_cy.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_da.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_de.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_el.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_en_GB.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_en_ZA.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_es.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_et.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_eu.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_fa.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_fi.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_fr.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_fr_CA.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_gl.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_he.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_hi.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_hr.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_hu.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_id.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_is.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_it.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_ja.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_ka.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_ko.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_lt.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_lv.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_mk.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_mn.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_ms.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_mt.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_nb.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_nl.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_pa.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_pl.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_pt.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_pt_BR.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_ro.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_ru.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_sk.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_sl.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_sr.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_sv.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_sw.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_ta.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_tg.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_th.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_tr.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_uk.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_uz.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_vi.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_zh_CN.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_zh_HK.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_zh_TW.ts4
-rw-r--r--lumina-xconfig/i18n/lumina-xconfig_zu.ts4
-rw-r--r--lumina-xconfig/lumina-xconfig.pro106
-rw-r--r--lumina-xconfig/main.cpp41
-rw-r--r--lumina.pro3
-rw-r--r--port-files/pkg-plist63
94 files changed, 1213 insertions, 65 deletions
diff --git a/debian/changelog b/debian/changelog
index 32ed822d..b9d3b36c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+lumina-desktop (0.8.3.347-1nano) unstable; urgency=low
+
+ * new GIT snapshot
+ - add lumina-xconfig package
+ - install ROADMAP doc file
+
+ -- Christopher Roy Bratusek <nano@jpberlin.de> Tue, 24 Feb 2015 19:15:07 +0100
+
lumina-desktop (0.8.2.282-1nano) unstable; urgency=low
* new GIT snapshot
diff --git a/debian/control b/debian/control
index f26327b8..14bce48d 100644
--- a/debian/control
+++ b/debian/control
@@ -99,3 +99,11 @@ Replaces: lumina-core (<< 0.8.2)
Description: Basic information utility for Lumina
lumina-info display various information about the Lumina installation,
like paths or version.
+
+Package: lumina-xconfig
+Architecture: any
+Depends: ${misc:Depends}, ${shlibs:Depends}, libluminautils1 (= ${binary:Version})
+Replaces: lumina-core (<< 0.8.2)
+Description: Display configuration tool for the lumina desktop environment
+ lumina-info display various information about the Lumina installation,
+ like paths or version.
diff --git a/debian/copyright b/debian/copyright
index d4c686c2..e339f063 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -3,11 +3,11 @@ Upstream-Name: lumina-desktop
Source: https://github.com/pcbsd/lumina
Files: *
-Copyright: 2012-2014, Ken Moore (moorekou@gmail.com)
+Copyright: 2012-2015, Ken Moore (moorekou@gmail.com)
License: BSD-3-Clause
Files: debian/*
-Copyright: 2014 Christopher Roy Bratusek <nano@jpberlin.de>
+Copyright: 2014-2015 Christopher Roy Bratusek <nano@jpberlin.de>
License: BSD-3-Clause
License: BSD-3-Clause
diff --git a/debian/docs b/debian/docs
index b43bf86b..0674dc87 100644
--- a/debian/docs
+++ b/debian/docs
@@ -1 +1,2 @@
README.md
+ROADMAP
diff --git a/debian/lumina-xconfig.install b/debian/lumina-xconfig.install
new file mode 100644
index 00000000..00d8279a
--- /dev/null
+++ b/debian/lumina-xconfig.install
@@ -0,0 +1,2 @@
+usr/bin/lumina-xconfig
+usr/share/Lumina-DE/i18n/lumina-xconfig*.qm
diff --git a/debian/rules b/debian/rules
index 0a1db87c..f86bf5e3 100755
--- a/debian/rules
+++ b/debian/rules
@@ -17,7 +17,8 @@ QMAKE_EXTRA_DIRS = libLumina \
lumina-open \
lumina-screenshot \
lumina-search \
- lumina-info
+ lumina-info \
+ lumina-xconfig
%:
dh $@
diff --git a/libLumina/LuminaOS-OpenBSD.cpp b/libLumina/LuminaOS-OpenBSD.cpp
index ffc21fa4..2c86995a 100644
--- a/libLumina/LuminaOS-OpenBSD.cpp
+++ b/libLumina/LuminaOS-OpenBSD.cpp
@@ -30,20 +30,22 @@ QStringList LOS::ExternalDevicePaths(){
QStringList devs = LUtils::getCmdOutput("mount");
//Now check the output
for(int i=0; i<devs.length(); i++){
- if(devs[i].startsWith("/dev/")){
- QString type = devs[i].section(" on ",0,0);
- type.remove("/dev/");
+ QString type = devs[i].section(" ",0,0);
+ type.remove("/dev/");
//Determine the type of hardware device based on the dev node
if(type.startsWith("sd")||type.startsWith("wd")){ type = "HDRIVE"; }
else if(type.startsWith("cd")){ type="DVD"; }
else{ type = "UNKNOWN"; }
//Now put the device in the proper output format
- devs[i] = type+"::::"+devs[i].section("(",1,1).section(",",0,0)+"::::"+devs[i].section(" on ",1,50).section("(",0,0).simplified();
- }else{
- //invalid device - remove it from the list
- devs.removeAt(i);
- i--;
- }
+ QString fs = devs[i].section(" ", 4, 4);
+ QString path = devs[i].section(" ",2, 2);
+ if (!fs.isEmpty() ) { //we not found a filesystem, most probably this is an invalid row
+ devs[i] = type+"::::"+fs+"::::"+path;
+ }
+ else {
+ devs.removeAt(i);
+ i--;
+ }
}
return devs;
}
diff --git a/lumina-desktop/LDesktop.cpp b/lumina-desktop/LDesktop.cpp
index 31baa48d..9a045e4f 100644
--- a/lumina-desktop/LDesktop.cpp
+++ b/lumina-desktop/LDesktop.cpp
@@ -13,12 +13,12 @@
#define DEBUG 1
-LDesktop::LDesktop(int deskNum) : QObject(){
+LDesktop::LDesktop(int deskNum, bool setdefault) : QObject(){
DPREFIX = "desktop-"+QString::number(deskNum)+"/";
desktopnumber = deskNum;
desktop = QApplication::desktop();
- defaultdesktop = (desktop->screenGeometry(desktopnumber).x()==0);
+ defaultdesktop = setdefault; //(desktop->screenGeometry(desktopnumber).x()==0);
desktoplocked = true;
issyncing = bgupdating = false;
usewinmenu=false;
@@ -52,10 +52,18 @@ void LDesktop::show(){
for(int i=0; i<PANELS.length(); i++){ PANELS[i]->show(); }
}
-void LDesktop::hide(){
+/*void LDesktop::hide(){
if(bgWindow!=0){ bgWindow->hide(); }
if(bgDesktop!=0){ bgDesktop->hide(); }
for(int i=0; i<PANELS.length(); i++){ PANELS[i]->hide(); }
+}*/
+
+void LDesktop::prepareToClose(){
+ //Get any panels ready to close
+ for(int i=0; i<PANELS.length(); i++){ PANELS[i]->prepareToClose(); delete PANELS.takeAt(i); i--; }
+ //Now close down any desktop plugins
+ desktoplocked = true; //make sure that plugin settings are preserved during removal
+ for(int i=0; i<PLUGINS.length(); i++){delete PLUGINS.takeAt(i); i--; }
}
WId LDesktop::backgroundID(){
@@ -390,6 +398,7 @@ void LDesktop::UpdatePanels(){
for(int i=0; i<PANELS.length(); i++){
if(panels <= PANELS[i]->number()){
if(DEBUG){ qDebug() << " -- Remove Panel:" << PANELS[i]->number(); }
+ PANELS[i]->prepareToClose();
delete PANELS.takeAt(i);
i--;
}
diff --git a/lumina-desktop/LDesktop.h b/lumina-desktop/LDesktop.h
index ef91110a..456c61e9 100644
--- a/lumina-desktop/LDesktop.h
+++ b/lumina-desktop/LDesktop.h
@@ -34,12 +34,13 @@
class LDesktop : public QObject{
Q_OBJECT
public:
- LDesktop(int deskNum=0);
+ LDesktop(int deskNum=0, bool setdefault = false);
~LDesktop();
int Screen(); //return the screen number this object is managing
void show();
- void hide();
+ //void hide();
+ void prepareToClose();
WId backgroundID();
QRect availableScreenGeom();
diff --git a/lumina-desktop/LPanel.cpp b/lumina-desktop/LPanel.cpp
index 51c994a5..f979ea15 100644
--- a/lumina-desktop/LPanel.cpp
+++ b/lumina-desktop/LPanel.cpp
@@ -64,6 +64,19 @@ LPanel::~LPanel(){
}
+void LPanel::prepareToClose(){
+ //Go through and remove all the plugins
+ for(int i=0; i<PLUGINS.length(); i++){
+ if( PLUGINS[i]->type().startsWith("systemtray---") ){
+ static_cast<LSysTray*>(PLUGINS[i])->stop();
+ }
+ layout->takeAt(i); //remove from the layout
+ delete PLUGINS.takeAt(i); //delete the actual widget
+ LSession::processEvents();
+ i--; //need to back up one space to not miss another plugin
+ }
+}
+
//===========
// PUBLIC SLOTS
//===========
diff --git a/lumina-desktop/LPanel.h b/lumina-desktop/LPanel.h
index b7b89d71..ed1a8906 100644
--- a/lumina-desktop/LPanel.h
+++ b/lumina-desktop/LPanel.h
@@ -49,6 +49,8 @@ public:
return panelnum;
}
+ void prepareToClose();
+
public slots:
void UpdatePanel(); //Load the settings file and update the panel appropriately
void UpdateLocale(); //Locale Changed externally
diff --git a/lumina-desktop/LSession.cpp b/lumina-desktop/LSession.cpp
index 4b0a04e7..811c60da 100644
--- a/lumina-desktop/LSession.cpp
+++ b/lumina-desktop/LSession.cpp
@@ -24,7 +24,7 @@
#include <X11/extensions/Xdamage.h>
#ifndef DEBUG
-#define DEBUG 0
+#define DEBUG 1
#endif
XCBEventFilter *evFilter = 0;
@@ -43,6 +43,10 @@ LSession::LSession(int &argc, char ** argv) : QApplication(argc, argv){
SystemTrayID = 0; VisualTrayID = 0;
TrayDmgEvent = 0;
TrayDmgError = 0;
+ cleansession = true;
+ for(int i=1; i<argc; i++){
+ if( QString::fromLocal8Bit(argv[i]) == "--noclean" ){ cleansession = false; break; }
+ }
XCB = new LXCB(); //need access to XCB data/functions right away
//initialize the empty internal pointers to 0
appmenu = 0;
@@ -133,28 +137,36 @@ void LSession::CleanupSession(){
if( sessionsettings->value("PlayLogoutAudio",true).toBool() ){
playAudioFile(LOS::LuminaShare()+"Logout.ogg");
}
- //Close any Tray Apps
- for(int i=0; i<RunningTrayApps.length(); i++){
- XCB->CloseWindow(RunningTrayApps[i]);
- LSession::processEvents();
- }
- //Close any open windows
- QList<WId> WL = XCB->WindowList(true);
- for(int i=0; i<WL.length(); i++){
- XCB->CloseWindow(WL[i]);
- LSession::processEvents();
- }
-
- //Now wait a moment for things to close down before quitting
- for(int i=0; i<20; i++){ LSession::processEvents(); usleep(25); } //1/2 second pause
- //Kill any remaining windows
- WL = XCB->WindowList(true); //all workspaces
- for(int i=0; i<WL.length(); i++){
- LX11::KillWindow(WL[i]);
- LSession::processEvents();
+ if(cleansession){
+ //Close any Tray Apps
+ for(int i=0; i<RunningTrayApps.length(); i++){
+ XCB->CloseWindow(RunningTrayApps[i]);
+ LSession::processEvents();
+ }
+ //Close any open windows
+ QList<WId> WL = XCB->WindowList(true);
+ for(int i=0; i<WL.length(); i++){
+ XCB->CloseWindow(WL[i]);
+ LSession::processEvents();
+ }
+ //Now wait a moment for things to close down before quitting
+ for(int i=0; i<20; i++){ LSession::processEvents(); usleep(25); } //1/2 second pause
+ //Kill any remaining windows
+ WL = XCB->WindowList(true); //all workspaces
+ for(int i=0; i<WL.length(); i++){
+ LX11::KillWindow(WL[i]);
+ LSession::processEvents();
+ }
+ }
+ //Stop the window manager
+ WM->stopWM();
+ //Now close down the desktop
+ for(int i=0; i<DESKTOPS.length(); i++){
+ DESKTOPS[i]->prepareToClose();
+ //don't actually close them yet - that will happen when the session exits
+ // this will leave the wallpapers up for a few moments (preventing black screens)
}
-
//Now wait a moment for things to close down before quitting
for(int i=0; i<20; i++){ LSession::processEvents(); usleep(25); } //1/2 second pause
}
@@ -295,7 +307,11 @@ void LSession::updateDesktops(){
if(!found){
//Start the desktop on the new screen
qDebug() << " - Start desktop on screen:" << i;
- DESKTOPS << new LDesktop(i);
+ if(firstrun && DW->screenGeometry(i).x()==0){
+ DESKTOPS << new LDesktop(i,true); //set this one as the default
+ }else{
+ DESKTOPS << new LDesktop(i);
+ }
}
}
//qDebug() << " - Done Starting Desktops";
@@ -305,8 +321,10 @@ void LSession::updateDesktops(){
//Now go through and make sure to delete any desktops for detached screens
for(int i=0; i<DESKTOPS.length(); i++){
if(DESKTOPS[i]->Screen() >= DW->screenCount()){
- qDebug() << " - Hide desktop on screen:" << DESKTOPS[i]->Screen();
- DESKTOPS[i]->hide();
+ qDebug() << " - Close desktop on screen:" << DESKTOPS[i]->Screen();
+ DESKTOPS[i]->prepareToClose(); //hide();
+ delete DESKTOPS.takeAt(i);
+ i--;
}else{
qDebug() << " - Show desktop on screen:" << DESKTOPS[i]->Screen();
DESKTOPS[i]->show();
@@ -341,6 +359,7 @@ void LSession::adjustWindowGeom(WId win, bool maximize){
}
//Adjust the window location if necessary
if(maximize){
+ if(DEBUG){ qDebug() << "Maximizing New Window:" << desk.width() << desk.height(); }
geom = desk; //Use the full screen
XCB->MoveResizeWindow(win, geom);
XCB->MaximizeWindow(win, true); //directly set the appropriate "maximized" flags (bypassing WM)
diff --git a/lumina-desktop/LSession.h b/lumina-desktop/LSession.h
index 6ad4ac90..fdd47eb6 100644
--- a/lumina-desktop/LSession.h
+++ b/lumina-desktop/LSession.h
@@ -99,6 +99,7 @@ private:
QMediaPlayer *mediaObj;
QThread *audioThread;
QSettings *sessionsettings;
+ bool cleansession;
//System Tray Variables
WId SystemTrayID, VisualTrayID;
diff --git a/lumina-desktop/SettingsMenu.cpp b/lumina-desktop/SettingsMenu.cpp
index 8c989600..95e6e44f 100644
--- a/lumina-desktop/SettingsMenu.cpp
+++ b/lumina-desktop/SettingsMenu.cpp
@@ -28,6 +28,9 @@ void SettingsMenu::InitMenu(){
act = new QAction( LXDG::findIcon("preferences-desktop",""), tr("Desktop"), this);
act->setWhatsThis("lumina-config");
this->addAction(act);
+ act = new QAction( LXDG::findIcon("preferences-other",""), tr("Screen Configuration"), this);
+ act->setWhatsThis("lumina-xconfig");
+ this->addAction(act);
QString qtconfig = LOS::QtConfigShortcut();
if(QFile::exists(qtconfig) && !qtconfig.isEmpty()){
act = new QAction( LXDG::findIcon("preferences-desktop-theme",""), tr("Window Theme"), this);
diff --git a/lumina-desktop/panel-plugins/userbutton/UserWidget.cpp b/lumina-desktop/panel-plugins/userbutton/UserWidget.cpp
index d5f8cd2e..6ca3ba19 100644
--- a/lumina-desktop/panel-plugins/userbutton/UserWidget.cpp
+++ b/lumina-desktop/panel-plugins/userbutton/UserWidget.cpp
@@ -32,12 +32,14 @@ UserWidget::UserWidget(QWidget* parent) : QTabWidget(parent), ui(new Ui::UserWid
ui->tool_fav_files->setIcon( LXDG::findIcon("document-multiple","") );
ui->tool_desktopsettings->setIcon( LXDG::findIcon("preferences-desktop","") );
ui->tool_config_screensaver->setIcon( LXDG::findIcon("preferences-desktop-screensaver","") );
+ ui->tool_config_screensettings->setIcon( LXDG::findIcon("preferences-other","") );
ui->tool_home_gohome->setIcon( LXDG::findIcon("go-home","") );
ui->tool_home_browse->setIcon( LXDG::findIcon("document-open","") );
ui->tool_config_about->setIcon( LXDG::findIcon("lumina","") );
//Connect the signals/slots
connect(ui->tool_desktopsettings, SIGNAL(clicked()), this, SLOT(openDeskSettings()) );
connect(ui->tool_config_screensaver, SIGNAL(clicked()), this, SLOT(openScreenSaverConfig()) );
+ connect(ui->tool_config_screensettings, SIGNAL(clicked()), this, SLOT(openScreenConfig()) );
connect(ui->tool_fav_apps, SIGNAL(clicked()), this, SLOT(FavChanged()) );
connect(ui->tool_fav_files, SIGNAL(clicked()), this, SLOT(FavChanged()) );
connect(ui->tool_fav_dirs, SIGNAL(clicked()), this, SLOT(FavChanged()) );
diff --git a/lumina-desktop/panel-plugins/userbutton/UserWidget.h b/lumina-desktop/panel-plugins/userbutton/UserWidget.h
index 108f540f..c7af2a4d 100644
--- a/lumina-desktop/panel-plugins/userbutton/UserWidget.h
+++ b/lumina-desktop/panel-plugins/userbutton/UserWidget.h
@@ -80,6 +80,9 @@ private slots:
void openScreenSaverConfig(){
LaunchItem(SSAVER, false);
}
+ void openScreenConfig(){
+ LaunchItem("lumina-xconfig",false);
+ }
void openLuminaInfo(){
LaunchItem("lumina-info",false);
}
diff --git a/lumina-desktop/panel-plugins/userbutton/UserWidget.ui b/lumina-desktop/panel-plugins/userbutton/UserWidget.ui
index 9a307cb6..f00daf08 100644
--- a/lumina-desktop/panel-plugins/userbutton/UserWidget.ui
+++ b/lumina-desktop/panel-plugins/userbutton/UserWidget.ui
@@ -481,6 +481,28 @@
</widget>
</item>
<item>
+ <widget class="QToolButton" name="tool_config_screensettings">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Screen Configuration</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QToolButton" name="tool_qtconfig">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
diff --git a/lumina-fm/DDFileSystemModel.h b/lumina-fm/DDFileSystemModel.h
new file mode 100644
index 00000000..caa83b0e
--- /dev/null
+++ b/lumina-fm/DDFileSystemModel.h
@@ -0,0 +1,36 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This is a simple subclassed QFileSystemModel to enable drag and drop
+// (and moving) but disable all the other filesystem modifications
+//===========================================
+#ifndef _LUMINA_FILE_MANAGER_DDFILESYSTEMMODEL_H
+#define _LUMINA_FILE_MANAGER_DDFILESYSTEMMODEL_H
+
+#include <QFileSystemModel>
+#include <QObject>
+
+class DDFileSystemModel : public QFileSystemModel{
+ Q_OBJECT
+public:
+ DDFileSystemModel(QObject *parent = 0) : QFileSystemModel(parent){
+ this->setReadOnly(false); //need this to enable DnD
+ }
+ ~DDFileSystemModel(){}
+
+ virtual Qt::ItemFlags flags(const QModelIndex &index) const {
+ //First get all the flags from the standard QFileSystemModel
+ Qt::ItemFlags defaultflags = QFileSystemModel::flags(index);
+ //Now if it has the "Editable" flag set - remove it
+ if(defaultflags & Qt::ItemIsEditable){
+ defaultflags ^= Qt::ItemIsEditable;
+ }
+
+ return defaultflags;
+ }
+};
+
+#endif \ No newline at end of file
diff --git a/lumina-fm/MainUI.cpp b/lumina-fm/MainUI.cpp
index 1b01a855..fe3240dc 100644
--- a/lumina-fm/MainUI.cpp
+++ b/lumina-fm/MainUI.cpp
@@ -44,8 +44,10 @@ MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){
worker = new BackgroundWorker;
worker->moveToThread(workThread);
if(DEBUG){ qDebug() << " - File System Model"; }
- fsmod = new QFileSystemModel(this);
+ fsmod = new DDFileSystemModel(this);
fsmod->setRootPath("/");
+ //fsmod->setReadOnly(false); //required for DnD, but also enables a lot of other stuff
+ //qDebug() << "DnD options:" << fsmod->supportedDropActions();
ui->tree_dir_view->setModel(fsmod);
ui->tree_dir_view->sortByColumn(0, Qt::AscendingOrder);
ui->tree_dir_view->setColumnWidth(0,200);
@@ -159,6 +161,7 @@ void MainUI::setupIcons(){
ui->actionScan->setIcon( LXDG::findIcon("system-search","") );
//Browser page
+ ui->tool_addNewFile->setIcon( LXDG::findIcon("document-new",""));
ui->tool_addToDir->setIcon( LXDG::findIcon("folder-new","") );
ui->tool_goToImages->setIcon( LXDG::findIcon("fileview-preview","") );
ui->tool_goToPlayer->setIcon( LXDG::findIcon("applications-multimedia","") );
@@ -282,9 +285,11 @@ void MainUI::loadSettings(){
//Note: make sure this is run after all the UI elements are created and connected to slots
// but before the first directory gets loaded
ui->actionView_Hidden_Files->setChecked( settings->value("showhidden", false).toBool() );
- on_actionView_Hidden_Files_triggered(); //make sure to update the models too
+ on_actionView_Hidden_Files_triggered(); //make sure to update the models too
ui->actionShow_Action_Buttons->setChecked(settings->value("showactions", true).toBool() );
- on_actionShow_Action_Buttons_triggered(); //make sure to update the UI
+ on_actionShow_Action_Buttons_triggered(); //make sure to update the UI
+ ui->actionShow_Thumbnails->setChecked( settings->value("showthumbnails", true).toBool() );
+ iconProv->showthumbnails = ui->actionShow_Thumbnails->isChecked();
QString view = settings->value("viewmode","details").toString();
if(view=="icons"){ radio_view_icons->setChecked(true); }
else if(view=="list"){ radio_view_list->setChecked(true); }
@@ -417,6 +422,7 @@ void MainUI::setCurrentDir(QString dir){
//Update the directory viewer and update the line edit
keepFocus = !currentDir->hasFocus();
currentDir->setWhatsThis(dir); //save the full path internally
+ fsmod->setRootPath(rawdir);
if(radio_view_details->isChecked()){
ui->tree_dir_view->setRootIndex(fsmod->index(dir));
ui->tree_dir_view->selectionModel()->clearSelection();
@@ -442,6 +448,7 @@ void MainUI::setCurrentDir(QString dir){
if(isUserWritable){ ui->label_dir_stats->setText(""); }
else{ ui->label_dir_stats->setText(tr("Limited Access Directory")); }
ui->tool_addToDir->setVisible(isUserWritable);
+ ui->tool_addNewFile->setVisible(isUserWritable);
ui->actionUpDir->setEnabled(dir!="/");
ui->actionBack->setEnabled(history.length() > 1);
ui->actionBookMark->setEnabled( rawdir!=QDir::homePath() && settings->value("bookmarks", QStringList()).toStringList().filter("::::"+rawdir).length()<1 );
@@ -469,6 +476,40 @@ QFileInfoList MainUI::getSelectedItems(){
return out;
}
+/*QModelIndexList MainUI::getVisibleItems(){
+ QModelIndexList out;
+ if(radio_view_details->isChecked()){
+ QModelIndex index = ui->tree_dir_view->indexAt(QPoint(0,0));
+ while( index.isValid()){
+ if(index.column()!=0){
+ //move on - multiple index's per row when we only need one
+ }else if(ui->tree_dir_view->viewport()->rect().contains( ui->tree_dir_view->visualRect(index) ) ){
+ //index within the viewport - add it to the list
+ out << index;
+ }else{
+ break; //index not in the viewport
+ }
+ index = ui->tree_dir_view->indexBelow(index); //go to the next
+ if(out.contains(index)){ break; } //end of the list
+ }
+
+ }else{
+ QModelIndex index = ui->list_dir_view->indexAt(QPoint(0,0));
+ while( index.isValid()){
+ if(ui->list_dir_view->viewport()->rect().contains( ui->list_dir_view->visualRect(index) ) ){
+ //index within the viewport - add it to the list
+ out << index;
+ }else{
+ break; //index not in the viewport
+ }
+ index = ui->list_dir_view->indexBelow(index); //go to the next
+ if(out.contains(index)){ break; } //end of the list
+ }
+
+ }
+ return out;
+}*/
+
//==============
// PRIVATE SLOTS
//==============
@@ -646,6 +687,18 @@ void MainUI::on_actionShow_Action_Buttons_triggered(){
ui->group_actions->setVisible(ui->actionShow_Action_Buttons->isChecked());
settings->setValue("showactions", ui->actionShow_Action_Buttons->isChecked());
}
+
+void MainUI::on_actionShow_Thumbnails_triggered(){
+ //Now save this setting for later
+ settings->setValue("showthumbnails", ui->actionShow_Thumbnails->isChecked());
+ //Set the value in the icon provider
+ iconProv->showthumbnails = ui->actionShow_Thumbnails->isChecked();
+ //Now make sure the filesystem model knows to re-load the image data
+ fsmod->revert();
+ //Re-load the view widget
+ setCurrentDir(getCurrentDir());
+}
+
void MainUI::goToBookmark(QAction *act){
if(act==ui->actionManage_Bookmarks){
BMMDialog dlg(this);
@@ -759,6 +812,17 @@ void MainUI::reloadDirectory(){
setCurrentDir( getCurrentDir() );
}
+/*void MainUI::viewportChanged(){
+ if( !ui->actionsShow_Thumbnails->isChecked()){ return; }
+ QModelIndexList list = getVisibleItems();
+ for(int i=0; i<list.length(); i++){
+ if( !ui->actionsShow_Thumbnails->isChecked()){ return; } //break out as necessary
+ if( imgFilter.contains("*."+fsmod->filePath(list[i]).section("/",-1).section(".",-1).toLower()){
+ fmod->
+ }
+ }
+}*/
+
void MainUI::currentDirectoryLoaded(){
//The directory was just loaded: refresh the action buttons as neccesary
ui->tool_goToPlayer->setVisible(false);
@@ -788,6 +852,23 @@ void MainUI::on_tool_addToDir_clicked(){
}
}
+void MainUI::on_tool_addNewFile_clicked(){
+ bool ok = false;
+ QString newdocument = QInputDialog::getText(this, tr("New Document"), tr("Name:"), QLineEdit::Normal, "", \
+ &ok, 0, Qt::ImhFormattedNumbersOnly | Qt::ImhUppercaseOnly | Qt::ImhLowercaseOnly);
+ if(!ok || newdocument.isEmpty()){ return; }
+ QString full = getCurrentDir();
+ if(!full.endsWith("/")){ full.append("/"); }
+ QFile file(full+newdocument);
+ if(file.open(QIODevice::ReadWrite)){
+ //If successfully opened, it has created a blank file
+ file.close();
+ }else{
+ QMessageBox::warning(this, tr("Error Creating Document"), tr("The document could not be created. Please ensure that you have the proper permissions."));
+ }
+
+}
+
void MainUI::tabChanged(int tab){
//Load the directory contained in the new tab
qDebug() << "Change to Tab:" << tab << tabBar->tabText(tab);
diff --git a/lumina-fm/MainUI.h b/lumina-fm/MainUI.h
index ccc85f72..40ef25ff 100644
--- a/lumina-fm/MainUI.h
+++ b/lumina-fm/MainUI.h
@@ -53,6 +53,7 @@
#include "BMMDialog.h" //bookmark manager dialog
#include "MimeIconProvider.h" //icon provider for the view widgets
#include "BackgroundWorker.h"
+#include "DDFileSystemModel.h"
namespace Ui{
class MainUI;
@@ -76,7 +77,8 @@ private:
//Internal non-ui widgets
QTabBar *tabBar;
QLineEdit *currentDir;
- QFileSystemModel *fsmod, *snapmod;
+ DDFileSystemModel *fsmod;
+ QFileSystemModel *snapmod;
//QFileSystemWatcher *fswatcher;
MimeIconProvider *iconProv;
QMenu *contextMenu;
@@ -115,7 +117,8 @@ private:
QString getCurrentDir();
void setCurrentDir(QString);
QFileInfoList getSelectedItems();
-
+ //QModelIndexList getVisibleItems();
+
private slots:
void slotSingleInstance(QStringList in){
this->show();
@@ -141,6 +144,7 @@ private slots:
void on_actionClose_triggered();
void on_actionView_Hidden_Files_triggered();
void on_actionShow_Action_Buttons_triggered();
+ void on_actionShow_Thumbnails_triggered();
void goToBookmark(QAction*);
void goToDevice(QAction*);
void viewModeChanged(bool);
@@ -157,7 +161,8 @@ private slots:
void reloadDirectory(); //Update the widget with the dir contents
void currentDirectoryLoaded(); //The file system model re-loaded the directory
void on_tool_addToDir_clicked();
- void tabChanged(int tab);
+ void on_tool_addNewFile_clicked();
+ void tabChanged(int tab);
void tabClosed(int tab = -1);
void prevTab();
void nextTab();
diff --git a/lumina-fm/MainUI.ui b/lumina-fm/MainUI.ui
index 9dae7a56..4b2156c2 100644
--- a/lumina-fm/MainUI.ui
+++ b/lumina-fm/MainUI.ui
@@ -30,7 +30,7 @@
<item>
<widget class="QStackedWidget" name="stackedWidget">
<property name="currentIndex">
- <number>2</number>
+ <number>0</number>
</property>
<widget class="QWidget" name="page_browser">
<layout class="QGridLayout" name="gridLayout">
@@ -69,10 +69,10 @@
<bool>true</bool>
</property>
<property name="dragDropMode">
- <enum>QAbstractItemView::NoDragDrop</enum>
+ <enum>QAbstractItemView::InternalMove</enum>
</property>
<property name="defaultDropAction">
- <enum>Qt::IgnoreAction</enum>
+ <enum>Qt::MoveAction</enum>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
@@ -124,10 +124,10 @@
<bool>true</bool>
</property>
<property name="dragDropMode">
- <enum>QAbstractItemView::NoDragDrop</enum>
+ <enum>QAbstractItemView::InternalMove</enum>
</property>
<property name="defaultDropAction">
- <enum>Qt::IgnoreAction</enum>
+ <enum>Qt::MoveAction</enum>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
@@ -422,6 +422,25 @@
</widget>
</item>
<item>
+ <widget class="QToolButton" name="tool_addNewFile">
+ <property name="statusTip">
+ <string>Create a new file</string>
+ </property>
+ <property name="text">
+ <string>New &amp;file</string>
+ </property>
+ <property name="popupMode">
+ <enum>QToolButton::InstantPopup</enum>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QToolButton" name="tool_addToDir">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
@@ -1086,7 +1105,7 @@
<x>0</x>
<y>0</y>
<width>567</width>
- <height>18</height>
+ <height>19</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
@@ -1101,6 +1120,7 @@
<property name="title">
<string>View</string>
</property>
+ <addaction name="actionShow_Thumbnails"/>
<addaction name="actionView_Hidden_Files"/>
<addaction name="actionShow_Action_Buttons"/>
<addaction name="separator"/>
@@ -1266,6 +1286,17 @@
<string>Show Action Buttons</string>
</property>
</action>
+ <action name="actionShow_Thumbnails">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Load Thumbnails</string>
+ </property>
+ </action>
</widget>
<resources/>
<connections/>
diff --git a/lumina-fm/MimeIconProvider.h b/lumina-fm/MimeIconProvider.h
index 044ff7eb..344d6801 100644
--- a/lumina-fm/MimeIconProvider.h
+++ b/lumina-fm/MimeIconProvider.h
@@ -19,15 +19,19 @@
class MimeIconProvider : public QFileIconProvider{
public:
+ bool showthumbnails;
MimeIconProvider() : QFileIconProvider(){
+ showthumbnails = false;
}
~MimeIconProvider(){}
+
+
QIcon icon(const QFileInfo &info) const{
if(info.isDir()){
return LXDG::findIcon("folder","");
}else if(info.isFile()){
- if(info.suffix().toLower()=="png" || info.suffix().toLower()=="jpg"){
+ if(showthumbnails && (info.suffix().toLower()=="png" || info.suffix().toLower()=="jpg") ){
//make sure to only load small versions of the files into memory: could have hundreds of them...
return QIcon( QPixmap(info.absoluteFilePath()).scaledToHeight(64) );
}else{
diff --git a/lumina-fm/lumina-fm.pro b/lumina-fm/lumina-fm.pro
index 8f01a93c..53e2dd2d 100644
--- a/lumina-fm/lumina-fm.pro
+++ b/lumina-fm/lumina-fm.pro
@@ -24,7 +24,8 @@ HEADERS += MainUI.h \
FODialog.h \
BMMDialog.h \
MimeIconProvider.h \
- BackgroundWorker.h
+ BackgroundWorker.h \
+ DDFileSystemModel.h
FORMS += MainUI.ui \
FODialog.ui \
diff --git a/lumina-search/MainUI.cpp b/lumina-search/MainUI.cpp
index 2a17217d..6597f589 100644
--- a/lumina-search/MainUI.cpp
+++ b/lumina-search/MainUI.cpp
@@ -11,7 +11,7 @@
MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){
ui->setupUi(this); //load the designer file
- setupIcons();
+ //setupIcons();
ui->radio_apps->setChecked(true); //always default to starting here
ui->tool_stop->setVisible(false); //no search running initially
ui->tool_configure->setVisible(false); //app search initially set
@@ -50,6 +50,7 @@ MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){
this->show();
workthread->start();
+ QTimer::singleShot(0,this, SLOT(setupIcons()) );
}
MainUI::~MainUI(){
diff --git a/lumina-search/main.cpp b/lumina-search/main.cpp
index 3739cf70..305c388b 100644
--- a/lumina-search/main.cpp
+++ b/lumina-search/main.cpp
@@ -17,14 +17,6 @@ int main(int argc, char ** argv)
//qDebug() << "Load Translations...";
a.setApplicationName("Search for...");
LUtils::LoadTranslation(&a, "lumina-search");
- /*QTranslator translator;
- QLocale mylocale;
- QString langCode = mylocale.name();
-
- if ( ! QFile::exists(LOS::LuminaShare()+"i18n/lumina-search_" + langCode + ".qm" ) ) langCode.truncate(langCode.indexOf("_"));
- translator.load( QString("lumina-search_") + langCode, LOS::LuminaShare()+"i18n/" );
- a.installTranslator( &translator );
- qDebug() << "Locale:" << langCode;*/
MainUI w;
QObject::connect(&theme,SIGNAL(updateIcons()), &w, SLOT(setupIcons()) );
diff --git a/lumina-xconfig/MainUI.cpp b/lumina-xconfig/MainUI.cpp
new file mode 100644
index 00000000..a4131649
--- /dev/null
+++ b/lumina-xconfig/MainUI.cpp
@@ -0,0 +1,191 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "MainUI.h"
+#include "ui_MainUI.h"
+
+#include <LuminaXDG.h>
+#include <LuminaUtils.h>
+
+#include <QTimer>
+
+MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){
+ ui->setupUi(this);
+ loadIcons();
+ //Fill the location list with the valid entries
+ ui->combo_location->clear();
+ ui->combo_location->addItem(tr("Right Of"), "--right-of");
+ ui->combo_location->addItem(tr("Left Of"), "--left-of");
+
+ connect(ui->push_close, SIGNAL(clicked()), this, SLOT(close()) );
+ connect(ui->push_rescan, SIGNAL(clicked()), this, SLOT(UpdateScreens()) );
+ connect(ui->push_activate, SIGNAL(clicked()), this, SLOT(ActivateScreen()) );
+ connect(ui->tool_deactivate, SIGNAL(clicked()), this, SLOT(DeactivateScreen()) );
+ connect(ui->tool_moveleft, SIGNAL(clicked()), this, SLOT(MoveScreenLeft()) );
+ connect(ui->tool_moveright, SIGNAL(clicked()), this, SLOT(MoveScreenRight()) );
+ connect(ui->list_screens, SIGNAL(itemSelectionChanged()),this, SLOT(ScreenSelected()) );
+ QTimer::singleShot(0, this, SLOT(UpdateScreens()) );
+}
+
+MainUI::~MainUI(){
+
+}
+
+void MainUI::loadIcons(){
+ this->setWindowIcon( LXDG::findIcon("preferences-system-windows-actions","") );
+ ui->tool_deactivate->setIcon( LXDG::findIcon("list-remove","") );
+ ui->tool_moveleft->setIcon( LXDG::findIcon("arrow-left","") );
+ ui->tool_moveright->setIcon( LXDG::findIcon("arrow-right","") );
+ ui->push_activate->setIcon( LXDG::findIcon("list-add","") );
+ ui->push_rescan->setIcon( LXDG::findIcon("view-refresh","") );
+ ui->push_close->setIcon( LXDG::findIcon("window-close","") );
+}
+
+void MainUI::UpdateScreens(){
+ //First probe the server for current screens
+ SCREENS.clear();
+ QStringList info = LUtils::getCmdOutput("xrandr -q");
+ ScreenInfo cscreen;
+ for(int i=0; i<info.length(); i++){
+ if(info[i].contains("connected") ){
+ //qDebug() << "xrandr info:" << info[i];
+ if(!cscreen.ID.isEmpty()){
+ SCREENS << cscreen; //current screen finished - save it into the array
+ cscreen = ScreenInfo(); //Now create a new structure
+ }
+ QString dev = info[i].section(" ",0,0); //device ID
+ QString devres = info[i].section("(",0,0).split(" ",QString::SkipEmptyParts).last();
+ qDebug() << " - ID:" <<dev;
+ //qDebug() << " - Res:" << devres;
+ if( !devres.contains("x") || !devres.contains("+") ){ devres.clear(); }
+ //qDebug() << " - Res (modified):" << devres;
+ if(info[i].contains(" disconnected ") && !devres.isEmpty() ){
+ //Disable this device and restart (disconnected, but still attached to the X server)
+ DeactivateScreen(dev);
+ UpdateScreens();
+ return;
+ }else if( !devres.isEmpty() ){
+ //Device that is connected and attached (has a resolution)
+ qDebug() << "Create new Screen entry:" << dev << devres;
+ cscreen.ID = dev;
+ //Note: devres format: "<width>x<height>+<xoffset>+<yoffset>"
+ cscreen.geom.setRect( devres.section("+",-2,-2).toInt(), devres.section("+",-1,-1).toInt(), devres.section("x",0,0).toInt(), devres.section("+",0,0).section("x",1,1).toInt() );
+
+ }else if(info[i].contains(" connected ")){
+ //Device that is connected, but not attached
+ qDebug() << "Create new Screen entry:" << dev << "none";
+ cscreen.ID = dev;
+ cscreen.order = -2; //flag this right now as a non-active screen
+ }
+ }else if( !cscreen.ID.isEmpty() && info[i].section("\t",0,0,QString::SectionSkipEmpty).contains("x")){
+ //available resolution for a device
+ cscreen.resList << info[i].section("\t",0,0,QString::SectionSkipEmpty);
+ }
+ }
+ if(!cscreen.ID.isEmpty()){ SCREENS << cscreen; } //make sure to add the last screen to the array
+
+ //Now go through the screens and arrange them in order from left->right in the UI
+ bool found = true;
+ int xoffset = 0; //start at 0
+ int cnum = 0;
+ ui->list_screens->clear();
+ while(found){
+ found = false; //make sure to break out if a screen is not found
+ for(int i=0; i<SCREENS.length(); i++){
+ if(SCREENS[i].order != -1){} //already evaluated - skip it
+ else if(SCREENS[i].geom.x()==xoffset){
+ found = true; //make sure to look for the next one
+ xoffset = xoffset+SCREENS[i].geom.width(); //next number to look for
+ SCREENS[i].order = cnum; //assign the currrent order to it
+ cnum++; //get ready for the next one
+ QListWidgetItem *it = new QListWidgetItem();
+ it->setTextAlignment(Qt::AlignCenter);
+ it->setText( SCREENS[i].ID+"\n ("+QString::number(SCREENS[i].geom.width())+"x"+QString::number(SCREENS[i].geom.height())+") " );
+ it->setWhatsThis(SCREENS[i].ID);
+ ui->list_screens->addItem(it);
+ }
+ }
+ }
+
+ //Now update the available/current screens in the UI
+ ui->combo_availscreens->clear();
+ ui->combo_cscreens->clear();
+ for(int i=0; i<SCREENS.length(); i++){
+ if(SCREENS[i].order<0){
+ ui->combo_availscreens->addItem(SCREENS[i].ID);
+ }else{
+ ui->combo_cscreens->addItem(SCREENS[i].ID);
+ }
+ }
+ ui->group_avail->setVisible( ui->combo_availscreens->count()>0 );
+ ScreenSelected(); //update buttons
+}
+
+void MainUI::ScreenSelected(){
+ QListWidgetItem *item = ui->list_screens->currentItem();
+ if(item==0){
+ //nothing selected
+ ui->tool_deactivate->setEnabled(false);
+ ui->tool_moveleft->setEnabled(false);
+ ui->tool_moveright->setEnabled(false);
+ }else{
+ //Item selected
+ ui->tool_deactivate->setEnabled(ui->list_screens->count()>1);
+ ui->tool_moveleft->setEnabled(ui->list_screens->row(item) > 0);
+ ui->tool_moveright->setEnabled(ui->list_screens->row(item) < (ui->list_screens->count()-1));
+ }
+}
+
+void MainUI::MoveScreenLeft(){
+ QListWidgetItem *item = ui->list_screens->currentItem();
+ if(item==0){ return; } //no selection
+ //Get the current ID
+ QString CID = item->whatsThis();
+ //Now get the ID of the one on the left
+ item = ui->list_screens->item( ui->list_screens->row(item)-1 );
+ if(item == 0){ return; } //no item on the left (can't go left)
+ QString LID = item->whatsThis(); //left ID
+ //Now run the command
+ LUtils::runCmd("xrandr", QStringList() << "--output" << CID << "--left-of" << LID << "--auto");
+ QTimer::singleShot(500, this, SLOT(UpdateScreens()) );
+}
+
+void MainUI::MoveScreenRight(){
+ QListWidgetItem *item = ui->list_screens->currentItem();
+ if(item==0){ return; } //no selection
+ //Get the current ID
+ QString CID = item->whatsThis();
+ //Now get the ID of the one on the left
+ item = ui->list_screens->item( ui->list_screens->row(item)+1 );
+ if(item == 0){ return; } //no item on the right (can't go right)
+ QString RID = item->whatsThis(); //right ID
+ //Now run the command
+ LUtils::runCmd("xrandr", QStringList() << "--output" << CID << "--right-of" << RID << "--auto");
+ QTimer::singleShot(500, this, SLOT(UpdateScreens()) );
+}
+
+void MainUI::DeactivateScreen(QString device){
+ if(device.isEmpty()){
+ //Get the currently selected device
+ QListWidgetItem *item = ui->list_screens->currentItem();
+ if(item==0){ return; } //no selection
+ //Get the current ID
+ device = item->whatsThis();
+ }
+ if(device.isEmpty()){ return; } //nothing found
+ LUtils::runCmd("xrandr", QStringList() << "--output" << device << "--off");
+ QTimer::singleShot(500, this, SLOT(UpdateScreens()) );
+}
+
+void MainUI::ActivateScreen(){
+ //Assemble the command;
+ QString ID = ui->combo_availscreens->currentText();
+ QString DID = ui->combo_cscreens->currentText();
+ QString loc = ui->combo_location->currentData().toString();
+ if(ID.isEmpty() || DID.isEmpty() || loc.isEmpty()){ return; } //invalid inputs
+ LUtils::runCmd("xrandr", QStringList() << "--output" << ID << loc << DID <<"--auto");
+ QTimer::singleShot(500, this, SLOT(UpdateScreens()) );
+}
diff --git a/lumina-xconfig/MainUI.h b/lumina-xconfig/MainUI.h
new file mode 100644
index 00000000..d7b9f2ea
--- /dev/null
+++ b/lumina-xconfig/MainUI.h
@@ -0,0 +1,57 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_SCREEN_CONFIG_DIALOG_H
+#define _LUMINA_SCREEN_CONFIG_DIALOG_H
+
+#include <QMainWindow>
+#include <QRect>
+#include <QString>
+#include <QList>
+
+class ScreenInfo{
+ public:
+ QString ID;
+ QRect geom; //screen geometry
+ int order; //left to right
+ QStringList resList;
+ ScreenInfo(){
+ order = -1; //initial value is invalid
+ }
+ ~ScreenInfo(){}
+};
+
+namespace Ui{
+ class MainUI;
+};
+
+class MainUI : public QMainWindow{
+ Q_OBJECT
+public:
+ MainUI();
+ ~MainUI();
+
+public slots:
+ void slotSingleInstance(){
+ this->raise();
+ this->show();
+ }
+ void loadIcons();
+
+private:
+ Ui::MainUI *ui;
+ QList<ScreenInfo> SCREENS;
+
+private slots:
+ void UpdateScreens();
+ void ScreenSelected();
+ void MoveScreenLeft();
+ void MoveScreenRight();
+ void DeactivateScreen(QString device = "");
+ void ActivateScreen();
+};
+
+#endif
diff --git a/lumina-xconfig/MainUI.ui b/lumina-xconfig/MainUI.ui
new file mode 100644
index 00000000..02df4b94
--- /dev/null
+++ b/lumina-xconfig/MainUI.ui
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainUI</class>
+ <widget class="QMainWindow" name="MainUI">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>424</width>
+ <height>255</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Monitor Configuration</string>
+ </property>
+ <widget class="QWidget" name="centralwidget">
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QListWidget" name="list_screens">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>100</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>100</height>
+ </size>
+ </property>
+ <property name="flow">
+ <enum>QListView::LeftToRight</enum>
+ </property>
+ <property name="viewMode">
+ <enum>QListView::ListMode</enum>
+ </property>
+ <property name="uniformItemSizes">
+ <bool>true</bool>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="selectionRectVisible">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QToolButton" name="tool_deactivate">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_moveleft">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_moveright">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QGroupBox" name="group_avail">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Available Screens</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QComboBox" name="combo_availscreens">
+ <property name="toolTip">
+ <string>Screen which is not in user</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QComboBox" name="combo_location">
+ <property name="toolTip">
+ <string>Location to insert the screen</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QComboBox" name="combo_cscreens">
+ <property name="toolTip">
+ <string>Current screens</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QPushButton" name="push_activate">
+ <property name="text">
+ <string>Activate Screen</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QPushButton" name="push_rescan">
+ <property name="text">
+ <string>Refresh Screens</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="push_close">
+ <property name="text">
+ <string>Close</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_af.ts b/lumina-xconfig/i18n/lumina-xconfig_af.ts
new file mode 100644
index 00000000..6b7e234b
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_af.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="af_ZA">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_ar.ts b/lumina-xconfig/i18n/lumina-xconfig_ar.ts
new file mode 100644
index 00000000..2e9eabf9
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_ar.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ar_EG">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_az.ts b/lumina-xconfig/i18n/lumina-xconfig_az.ts
new file mode 100644
index 00000000..a0d853de
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_az.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="az_AZ">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_bg.ts b/lumina-xconfig/i18n/lumina-xconfig_bg.ts
new file mode 100644
index 00000000..5e12aa5d
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_bg.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="bg_BG">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_bn.ts b/lumina-xconfig/i18n/lumina-xconfig_bn.ts
new file mode 100644
index 00000000..996a21c8
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_bn.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="bn_BD">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_bs.ts b/lumina-xconfig/i18n/lumina-xconfig_bs.ts
new file mode 100644
index 00000000..36253ae1
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_bs.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="bs_BA">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_ca.ts b/lumina-xconfig/i18n/lumina-xconfig_ca.ts
new file mode 100644
index 00000000..94254056
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_ca.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ca_ES">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_cs.ts b/lumina-xconfig/i18n/lumina-xconfig_cs.ts
new file mode 100644
index 00000000..80227e30
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_cs.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="cs_CZ">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_cy.ts b/lumina-xconfig/i18n/lumina-xconfig_cy.ts
new file mode 100644
index 00000000..05487897
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_cy.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="cy_GB">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_da.ts b/lumina-xconfig/i18n/lumina-xconfig_da.ts
new file mode 100644
index 00000000..f9fe4071
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_da.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="da_DK">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_de.ts b/lumina-xconfig/i18n/lumina-xconfig_de.ts
new file mode 100644
index 00000000..1552582e
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_de.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="de_DE">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_el.ts b/lumina-xconfig/i18n/lumina-xconfig_el.ts
new file mode 100644
index 00000000..d1fe6269
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_el.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="el_GR">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_en_GB.ts b/lumina-xconfig/i18n/lumina-xconfig_en_GB.ts
new file mode 100644
index 00000000..942967a2
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_en_GB.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="en_GB">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_en_ZA.ts b/lumina-xconfig/i18n/lumina-xconfig_en_ZA.ts
new file mode 100644
index 00000000..28ecea6e
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_en_ZA.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="en_ZA">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_es.ts b/lumina-xconfig/i18n/lumina-xconfig_es.ts
new file mode 100644
index 00000000..04ecad3c
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_es.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="es_ES">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_et.ts b/lumina-xconfig/i18n/lumina-xconfig_et.ts
new file mode 100644
index 00000000..8c9ea560
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_et.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="et_EE">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_eu.ts b/lumina-xconfig/i18n/lumina-xconfig_eu.ts
new file mode 100644
index 00000000..43af96eb
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_eu.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="eu_ES">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_fa.ts b/lumina-xconfig/i18n/lumina-xconfig_fa.ts
new file mode 100644
index 00000000..ec6d1a4e
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_fa.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fa_IR">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_fi.ts b/lumina-xconfig/i18n/lumina-xconfig_fi.ts
new file mode 100644
index 00000000..afaf9e44
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_fi.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fi_FI">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_fr.ts b/lumina-xconfig/i18n/lumina-xconfig_fr.ts
new file mode 100644
index 00000000..983be725
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_fr.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fr_FR">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_fr_CA.ts b/lumina-xconfig/i18n/lumina-xconfig_fr_CA.ts
new file mode 100644
index 00000000..7f4cf455
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_fr_CA.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fr_CA">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_gl.ts b/lumina-xconfig/i18n/lumina-xconfig_gl.ts
new file mode 100644
index 00000000..c67947fa
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_gl.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="gl_ES">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_he.ts b/lumina-xconfig/i18n/lumina-xconfig_he.ts
new file mode 100644
index 00000000..71aaf886
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_he.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="he_IL">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_hi.ts b/lumina-xconfig/i18n/lumina-xconfig_hi.ts
new file mode 100644
index 00000000..b5486bbb
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_hi.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="hi_IN">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_hr.ts b/lumina-xconfig/i18n/lumina-xconfig_hr.ts
new file mode 100644
index 00000000..e182599b
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_hr.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="hr_HR">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_hu.ts b/lumina-xconfig/i18n/lumina-xconfig_hu.ts
new file mode 100644
index 00000000..24721702
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_hu.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="hu_HU">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_id.ts b/lumina-xconfig/i18n/lumina-xconfig_id.ts
new file mode 100644
index 00000000..5898f681
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_id.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="id_ID">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_is.ts b/lumina-xconfig/i18n/lumina-xconfig_is.ts
new file mode 100644
index 00000000..c1800c9d
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_is.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="is_IS">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_it.ts b/lumina-xconfig/i18n/lumina-xconfig_it.ts
new file mode 100644
index 00000000..61c04918
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_it.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="it_IT">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_ja.ts b/lumina-xconfig/i18n/lumina-xconfig_ja.ts
new file mode 100644
index 00000000..0b5611e8
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_ja.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ja_JP">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_ka.ts b/lumina-xconfig/i18n/lumina-xconfig_ka.ts
new file mode 100644
index 00000000..f1af1936
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_ka.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ka_GE">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_ko.ts b/lumina-xconfig/i18n/lumina-xconfig_ko.ts
new file mode 100644
index 00000000..7d70aed2
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_ko.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ko_KR">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_lt.ts b/lumina-xconfig/i18n/lumina-xconfig_lt.ts
new file mode 100644
index 00000000..4c461882
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_lt.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="lt_LT">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_lv.ts b/lumina-xconfig/i18n/lumina-xconfig_lv.ts
new file mode 100644
index 00000000..8169c3ce
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_lv.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="lv_LV">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_mk.ts b/lumina-xconfig/i18n/lumina-xconfig_mk.ts
new file mode 100644
index 00000000..c56764ee
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_mk.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="mk_MK">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_mn.ts b/lumina-xconfig/i18n/lumina-xconfig_mn.ts
new file mode 100644
index 00000000..844219c9
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_mn.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="mn_MN">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_ms.ts b/lumina-xconfig/i18n/lumina-xconfig_ms.ts
new file mode 100644
index 00000000..330af06c
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_ms.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ms_MY">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_mt.ts b/lumina-xconfig/i18n/lumina-xconfig_mt.ts
new file mode 100644
index 00000000..5ef11dcc
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_mt.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="mt_MT">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_nb.ts b/lumina-xconfig/i18n/lumina-xconfig_nb.ts
new file mode 100644
index 00000000..90a410ec
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_nb.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="nb_NO">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_nl.ts b/lumina-xconfig/i18n/lumina-xconfig_nl.ts
new file mode 100644
index 00000000..9e739505
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_nl.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="nl_NL">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_pa.ts b/lumina-xconfig/i18n/lumina-xconfig_pa.ts
new file mode 100644
index 00000000..6845fd1a
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_pa.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="pa_IN">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_pl.ts b/lumina-xconfig/i18n/lumina-xconfig_pl.ts
new file mode 100644
index 00000000..fb60fbb0
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_pl.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="pl_PL">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_pt.ts b/lumina-xconfig/i18n/lumina-xconfig_pt.ts
new file mode 100644
index 00000000..b3cbf875
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_pt.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="pt_BR">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_pt_BR.ts b/lumina-xconfig/i18n/lumina-xconfig_pt_BR.ts
new file mode 100644
index 00000000..b3cbf875
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_pt_BR.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="pt_BR">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_ro.ts b/lumina-xconfig/i18n/lumina-xconfig_ro.ts
new file mode 100644
index 00000000..73c6d1cd
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_ro.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ro_RO">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_ru.ts b/lumina-xconfig/i18n/lumina-xconfig_ru.ts
new file mode 100644
index 00000000..f62cf2e1
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_ru.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ru_RU">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_sk.ts b/lumina-xconfig/i18n/lumina-xconfig_sk.ts
new file mode 100644
index 00000000..899d9f46
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_sk.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="sk_SK">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_sl.ts b/lumina-xconfig/i18n/lumina-xconfig_sl.ts
new file mode 100644
index 00000000..7f39524d
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_sl.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="sl_SI">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_sr.ts b/lumina-xconfig/i18n/lumina-xconfig_sr.ts
new file mode 100644
index 00000000..1d02152a
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_sr.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="sr_RS">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_sv.ts b/lumina-xconfig/i18n/lumina-xconfig_sv.ts
new file mode 100644
index 00000000..9a84441f
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_sv.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="sv_SE">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_sw.ts b/lumina-xconfig/i18n/lumina-xconfig_sw.ts
new file mode 100644
index 00000000..0b71f0ef
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_sw.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="sw_TZ">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_ta.ts b/lumina-xconfig/i18n/lumina-xconfig_ta.ts
new file mode 100644
index 00000000..134d2bbb
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_ta.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ta_IN">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_tg.ts b/lumina-xconfig/i18n/lumina-xconfig_tg.ts
new file mode 100644
index 00000000..268fac8b
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_tg.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="tg_TJ">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_th.ts b/lumina-xconfig/i18n/lumina-xconfig_th.ts
new file mode 100644
index 00000000..c6cff8e0
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_th.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="th_TH">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_tr.ts b/lumina-xconfig/i18n/lumina-xconfig_tr.ts
new file mode 100644
index 00000000..86089945
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_tr.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="tr_TR">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_uk.ts b/lumina-xconfig/i18n/lumina-xconfig_uk.ts
new file mode 100644
index 00000000..df16936b
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_uk.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="uk_UA">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_uz.ts b/lumina-xconfig/i18n/lumina-xconfig_uz.ts
new file mode 100644
index 00000000..f1a84854
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_uz.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="uz_UZ">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_vi.ts b/lumina-xconfig/i18n/lumina-xconfig_vi.ts
new file mode 100644
index 00000000..c3b761e4
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_vi.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="vi_VN">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_zh_CN.ts b/lumina-xconfig/i18n/lumina-xconfig_zh_CN.ts
new file mode 100644
index 00000000..e5ca8aa9
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_zh_CN.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="zh_CN">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_zh_HK.ts b/lumina-xconfig/i18n/lumina-xconfig_zh_HK.ts
new file mode 100644
index 00000000..1e2ff180
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_zh_HK.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="zh_HK">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_zh_TW.ts b/lumina-xconfig/i18n/lumina-xconfig_zh_TW.ts
new file mode 100644
index 00000000..4b703e33
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_zh_TW.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="zh_TW">
+</TS>
diff --git a/lumina-xconfig/i18n/lumina-xconfig_zu.ts b/lumina-xconfig/i18n/lumina-xconfig_zu.ts
new file mode 100644
index 00000000..6c7991fb
--- /dev/null
+++ b/lumina-xconfig/i18n/lumina-xconfig_zu.ts
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="zu_ZA">
+</TS>
diff --git a/lumina-xconfig/lumina-xconfig.pro b/lumina-xconfig/lumina-xconfig.pro
new file mode 100644
index 00000000..9b15459b
--- /dev/null
+++ b/lumina-xconfig/lumina-xconfig.pro
@@ -0,0 +1,106 @@
+
+QT += core gui
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets network
+
+TARGET = lumina-xconfig
+isEmpty(PREFIX) {
+ PREFIX = /usr/local
+}
+target.path = $$PREFIX/bin
+
+isEmpty(LIBPREFIX) {
+ LIBPREFIX = $$PREFIX/lib
+}
+
+TEMPLATE = app
+
+SOURCES += main.cpp \
+ mainUI.cpp
+
+HEADERS += mainUI.h
+
+FORMS += mainUI.ui
+
+# RESOURCES+= lumina-config.qrc
+
+INCLUDEPATH += ../libLumina $$PREFIX/include
+
+LIBS += -L../libLumina -L$$LIBPREFIX -lLuminaUtils
+
+isEmpty(QT5LIBDIR) {
+ QT5LIBDIR = $$PREFIX/lib/qt5
+}
+
+LRELEASE = $$QT5LIBDIR/bin/lrelease
+
+
+QMAKE_LIBDIR = ../libLumina
+DEPENDPATH += ../libLumina
+
+TRANSLATIONS = i18n/lumina-xconfig_af.ts \
+ i18n/lumina-xconfig_ar.ts \
+ i18n/lumina-xconfig_az.ts \
+ i18n/lumina-xconfig_bg.ts \
+ i18n/lumina-xconfig_bn.ts \
+ i18n/lumina-xconfig_bs.ts \
+ i18n/lumina-xconfig_ca.ts \
+ i18n/lumina-xconfig_cs.ts \
+ i18n/lumina-xconfig_cy.ts \
+ i18n/lumina-xconfig_da.ts \
+ i18n/lumina-xconfig_de.ts \
+ i18n/lumina-xconfig_el.ts \
+ i18n/lumina-xconfig_en_GB.ts \
+ i18n/lumina-xconfig_en_ZA.ts \
+ i18n/lumina-xconfig_es.ts \
+ i18n/lumina-xconfig_et.ts \
+ i18n/lumina-xconfig_eu.ts \
+ i18n/lumina-xconfig_fa.ts \
+ i18n/lumina-xconfig_fi.ts \
+ i18n/lumina-xconfig_fr.ts \
+ i18n/lumina-xconfig_fr_CA.ts \
+ i18n/lumina-xconfig_gl.ts \
+ i18n/lumina-xconfig_he.ts \
+ i18n/lumina-xconfig_hi.ts \
+ i18n/lumina-xconfig_hr.ts \
+ i18n/lumina-xconfig_hu.ts \
+ i18n/lumina-xconfig_id.ts \
+ i18n/lumina-xconfig_is.ts \
+ i18n/lumina-xconfig_it.ts \
+ i18n/lumina-xconfig_ja.ts \
+ i18n/lumina-xconfig_ka.ts \
+ i18n/lumina-xconfig_ko.ts \
+ i18n/lumina-xconfig_lt.ts \
+ i18n/lumina-xconfig_lv.ts \
+ i18n/lumina-xconfig_mk.ts \
+ i18n/lumina-xconfig_mn.ts \
+ i18n/lumina-xconfig_ms.ts \
+ i18n/lumina-xconfig_mt.ts \
+ i18n/lumina-xconfig_nb.ts \
+ i18n/lumina-xconfig_nl.ts \
+ i18n/lumina-xconfig_pa.ts \
+ i18n/lumina-xconfig_pl.ts \
+ i18n/lumina-xconfig_pt.ts \
+ i18n/lumina-xconfig_pt_BR.ts \
+ i18n/lumina-xconfig_ro.ts \
+ i18n/lumina-xconfig_ru.ts \
+ i18n/lumina-xconfig_sk.ts \
+ i18n/lumina-xconfig_sl.ts \
+ i18n/lumina-xconfig_sr.ts \
+ i18n/lumina-xconfig_sv.ts \
+ i18n/lumina-xconfig_sw.ts \
+ i18n/lumina-xconfig_ta.ts \
+ i18n/lumina-xconfig_tg.ts \
+ i18n/lumina-xconfig_th.ts \
+ i18n/lumina-xconfig_tr.ts \
+ i18n/lumina-xconfig_uk.ts \
+ i18n/lumina-xconfig_uz.ts \
+ i18n/lumina-xconfig_vi.ts \
+ i18n/lumina-xconfig_zh_CN.ts \
+ i18n/lumina-xconfig_zh_HK.ts \
+ i18n/lumina-xconfig_zh_TW.ts \
+ i18n/lumina-xconfig_zu.ts
+
+dotrans.path=$$PREFIX/share/Lumina-DE/i18n/
+dotrans.extra=cd i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$$PREFIX/share/Lumina-DE/i18n/
+
+INSTALLS += target dotrans
diff --git a/lumina-xconfig/main.cpp b/lumina-xconfig/main.cpp
new file mode 100644
index 00000000..de8de504
--- /dev/null
+++ b/lumina-xconfig/main.cpp
@@ -0,0 +1,41 @@
+#include <QApplication>
+#include <QDebug>
+#include <QFile>
+#include <QStringList>
+
+#include "MainUI.h"
+#include <LuminaOS.h>
+#include <LuminaThemes.h>
+#include <LuminaUtils.h>
+#include <LuminaSingleApplication.h>
+
+int main(int argc, char ** argv)
+{
+ /*QStringList in;
+ for(int i=1; i<argc; i++){ //skip the first arg (app binary)
+ QString path = argv[i];
+ if(path=="."){
+ //Insert the current working directory
+ in << QDir::currentPath();
+ }else{
+ if(!path.startsWith("/")){ path.prepend(QDir::currentPath()+"/"); }
+ in << path;
+ }
+ }
+ if(in.isEmpty()){ in << QDir::homePath(); }*/
+
+ LSingleApplication a(argc, argv, "lumina-xconfig"); //loads translations inside constructor
+ if( !a.isPrimaryProcess()){ return 0; }
+ //qDebug() << "Loaded QApplication";
+ a.setApplicationName("Lumina Screen Configuration");
+ LuminaThemeEngine themes(&a);
+
+ //Start the UI
+ MainUI w;
+ QObject::connect(&a, SIGNAL(InputsAvailable(QStringList)), &w, SLOT(slotSingleInstance()) );
+ QObject::connect(&themes, SIGNAL(updateIcons()), &w, SLOT(loadIcons()) );
+ w.show();
+
+ int retCode = a.exec();
+ return retCode;
+}
diff --git a/lumina.pro b/lumina.pro
index 89d20deb..5c0fc5eb 100644
--- a/lumina.pro
+++ b/lumina.pro
@@ -7,5 +7,6 @@ SUBDIRS+= libLumina \
lumina-fm \
lumina-screenshot \
lumina-search \
- lumina-info
+ lumina-info \
+ lumina-xconfig
diff --git a/port-files/pkg-plist b/port-files/pkg-plist
index b1d86fd3..9bed5c74 100644
--- a/port-files/pkg-plist
+++ b/port-files/pkg-plist
@@ -5,6 +5,7 @@ bin/lumina-fm
bin/lumina-screenshot
bin/lumina-search
bin/lumina-info
+bin/lumina-xconfig
etc/luminaDesktop.conf.dist
lib/libLuminaUtils.so
lib/libLuminaUtils.so.1
@@ -476,3 +477,65 @@ share/Lumina-DE/i18n/lumina-info_zh_CN.qm
share/Lumina-DE/i18n/lumina-info_zh_HK.qm
share/Lumina-DE/i18n/lumina-info_zh_TW.qm
share/Lumina-DE/i18n/lumina-info_zu.qm
+share/Lumina-DE/i18n/lumina-xconfig_af.qm
+share/Lumina-DE/i18n/lumina-xconfig_ar.qm
+share/Lumina-DE/i18n/lumina-xconfig_az.qm
+share/Lumina-DE/i18n/lumina-xconfig_bg.qm
+share/Lumina-DE/i18n/lumina-xconfig_bn.qm
+share/Lumina-DE/i18n/lumina-xconfig_bs.qm
+share/Lumina-DE/i18n/lumina-xconfig_ca.qm
+share/Lumina-DE/i18n/lumina-xconfig_cs.qm
+share/Lumina-DE/i18n/lumina-xconfig_cy.qm
+share/Lumina-DE/i18n/lumina-xconfig_da.qm
+share/Lumina-DE/i18n/lumina-xconfig_de.qm
+share/Lumina-DE/i18n/lumina-xconfig_el.qm
+share/Lumina-DE/i18n/lumina-xconfig_en_GB.qm
+share/Lumina-DE/i18n/lumina-xconfig_en_ZA.qm
+share/Lumina-DE/i18n/lumina-xconfig_es.qm
+share/Lumina-DE/i18n/lumina-xconfig_et.qm
+share/Lumina-DE/i18n/lumina-xconfig_eu.qm
+share/Lumina-DE/i18n/lumina-xconfig_fa.qm
+share/Lumina-DE/i18n/lumina-xconfig_fi.qm
+share/Lumina-DE/i18n/lumina-xconfig_fr.qm
+share/Lumina-DE/i18n/lumina-xconfig_fr_CA.qm
+share/Lumina-DE/i18n/lumina-xconfig_gl.qm
+share/Lumina-DE/i18n/lumina-xconfig_he.qm
+share/Lumina-DE/i18n/lumina-xconfig_hi.qm
+share/Lumina-DE/i18n/lumina-xconfig_hr.qm
+share/Lumina-DE/i18n/lumina-xconfig_hu.qm
+share/Lumina-DE/i18n/lumina-xconfig_id.qm
+share/Lumina-DE/i18n/lumina-xconfig_is.qm
+share/Lumina-DE/i18n/lumina-xconfig_it.qm
+share/Lumina-DE/i18n/lumina-xconfig_ja.qm
+share/Lumina-DE/i18n/lumina-xconfig_ka.qm
+share/Lumina-DE/i18n/lumina-xconfig_ko.qm
+share/Lumina-DE/i18n/lumina-xconfig_lt.qm
+share/Lumina-DE/i18n/lumina-xconfig_lv.qm
+share/Lumina-DE/i18n/lumina-xconfig_mk.qm
+share/Lumina-DE/i18n/lumina-xconfig_mn.qm
+share/Lumina-DE/i18n/lumina-xconfig_ms.qm
+share/Lumina-DE/i18n/lumina-xconfig_mt.qm
+share/Lumina-DE/i18n/lumina-xconfig_nb.qm
+share/Lumina-DE/i18n/lumina-xconfig_nl.qm
+share/Lumina-DE/i18n/lumina-xconfig_pa.qm
+share/Lumina-DE/i18n/lumina-xconfig_pl.qm
+share/Lumina-DE/i18n/lumina-xconfig_pt.qm
+share/Lumina-DE/i18n/lumina-xconfig_pt_BR.qm
+share/Lumina-DE/i18n/lumina-xconfig_ro.qm
+share/Lumina-DE/i18n/lumina-xconfig_ru.qm
+share/Lumina-DE/i18n/lumina-xconfig_sk.qm
+share/Lumina-DE/i18n/lumina-xconfig_sl.qm
+share/Lumina-DE/i18n/lumina-xconfig_sr.qm
+share/Lumina-DE/i18n/lumina-xconfig_sv.qm
+share/Lumina-DE/i18n/lumina-xconfig_sw.qm
+share/Lumina-DE/i18n/lumina-xconfig_ta.qm
+share/Lumina-DE/i18n/lumina-xconfig_tg.qm
+share/Lumina-DE/i18n/lumina-xconfig_th.qm
+share/Lumina-DE/i18n/lumina-xconfig_tr.qm
+share/Lumina-DE/i18n/lumina-xconfig_uk.qm
+share/Lumina-DE/i18n/lumina-xconfig_uz.qm
+share/Lumina-DE/i18n/lumina-xconfig_vi.qm
+share/Lumina-DE/i18n/lumina-xconfig_zh_CN.qm
+share/Lumina-DE/i18n/lumina-xconfig_zh_HK.qm
+share/Lumina-DE/i18n/lumina-xconfig_zh_TW.qm
+share/Lumina-DE/i18n/lumina-xconfig_zu.qm
bgstack15