aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/core/lumina-desktop
diff options
context:
space:
mode:
Diffstat (limited to 'src-qt5/core/lumina-desktop')
-rw-r--r--src-qt5/core/lumina-desktop/AppMenu.cpp151
-rw-r--r--src-qt5/core/lumina-desktop/AppMenu.h58
-rw-r--r--src-qt5/core/lumina-desktop/BootSplash.cpp62
-rw-r--r--src-qt5/core/lumina-desktop/BootSplash.h29
-rw-r--r--src-qt5/core/lumina-desktop/BootSplash.ui89
-rw-r--r--src-qt5/core/lumina-desktop/Globals.h75
-rw-r--r--src-qt5/core/lumina-desktop/Insight-FileManager.pngbin0 -> 2829 bytes
-rw-r--r--src-qt5/core/lumina-desktop/LDesktop.cpp532
-rw-r--r--src-qt5/core/lumina-desktop/LDesktop.h105
-rw-r--r--src-qt5/core/lumina-desktop/LDesktopPluginSpace.cpp300
-rw-r--r--src-qt5/core/lumina-desktop/LDesktopPluginSpace.h292
-rw-r--r--src-qt5/core/lumina-desktop/LPanel.cpp347
-rw-r--r--src-qt5/core/lumina-desktop/LPanel.h77
-rw-r--r--src-qt5/core/lumina-desktop/LSession.cpp895
-rw-r--r--src-qt5/core/lumina-desktop/LSession.h181
-rw-r--r--src-qt5/core/lumina-desktop/LWinInfo.cpp48
-rw-r--r--src-qt5/core/lumina-desktop/LWinInfo.h50
-rw-r--r--src-qt5/core/lumina-desktop/LXcbEventFilter.cpp109
-rw-r--r--src-qt5/core/lumina-desktop/LXcbEventFilter.h104
-rw-r--r--src-qt5/core/lumina-desktop/Lumina-DE.desktop34
-rw-r--r--src-qt5/core/lumina-desktop/Lumina-DE.pngbin0 -> 2847 bytes
-rw-r--r--src-qt5/core/lumina-desktop/Lumina-DE.qrc7
-rw-r--r--src-qt5/core/lumina-desktop/SettingsMenu.cpp64
-rw-r--r--src-qt5/core/lumina-desktop/SettingsMenu.h28
-rw-r--r--src-qt5/core/lumina-desktop/SystemWindow.cpp84
-rw-r--r--src-qt5/core/lumina-desktop/SystemWindow.h45
-rw-r--r--src-qt5/core/lumina-desktop/SystemWindow.ui194
-rw-r--r--src-qt5/core/lumina-desktop/WMProcess.cpp133
-rw-r--r--src-qt5/core/lumina-desktop/WMProcess.h47
-rw-r--r--src-qt5/core/lumina-desktop/audiofiles/LICENCE1
-rw-r--r--src-qt5/core/lumina-desktop/audiofiles/Login.oggbin0 -> 32111 bytes
-rw-r--r--src-qt5/core/lumina-desktop/audiofiles/Logout.oggbin0 -> 31255 bytes
-rw-r--r--src-qt5/core/lumina-desktop/defaults/defaultapps.conf1
-rw-r--r--src-qt5/core/lumina-desktop/defaults/desktop-background.jpgbin0 -> 3213848 bytes
-rw-r--r--src-qt5/core/lumina-desktop/defaults/desktop-background.pcbsd.jpgbin0 -> 3147703 bytes
-rw-r--r--src-qt5/core/lumina-desktop/defaults/desktopsettings.conf1
-rw-r--r--src-qt5/core/lumina-desktop/defaults/luminaDesktop.conf58
-rw-r--r--src-qt5/core/lumina-desktop/defaults/luminaDesktop.pcbsd.conf47
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/LDPlugin.cpp57
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/LDPlugin.h155
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/NewDP.h60
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/SamplePlugin.h38
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp140
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.h59
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/applauncher/OutlineToolButton.h98
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/audioplayer/PlayerWidget.cpp269
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/audioplayer/PlayerWidget.h84
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/audioplayer/PlayerWidget.ui182
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/calendar/CalendarPlugin.h58
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/desktop-plugins.pri19
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.cpp215
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.h55
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/messagecenter/LXDG-DBusNotifier.h17
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/messagecenter/MessageCenter.cpp90
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/messagecenter/MessageCenter.h48
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/notepad/NotepadPlugin.cpp329
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/notepad/NotepadPlugin.h66
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/quickcontainer/QuickDPlugin.h51
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/systemmonitor/MonitorWidget.cpp63
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/systemmonitor/MonitorWidget.h62
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/systemmonitor/MonitorWidget.ui143
-rw-r--r--src-qt5/core/lumina-desktop/fluxboxconf/fluxbox-init-rc82
-rw-r--r--src-qt5/core/lumina-desktop/fluxboxconf/fluxbox-keys151
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_af.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_ar.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_az.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_bg.ts403
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_bn.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_bs.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_ca.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_cs.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_cy.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_da.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_de.ts407
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_el.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_GB.ts372
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_ZA.ts372
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_es.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_et.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_eu.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_fa.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_fi.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr.ts372
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr_CA.ts372
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_gl.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_he.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_hi.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_hr.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_hu.ts373
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_id.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_is.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_it.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_ja.ts372
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_ka.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_ko.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_lt.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_lv.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_mk.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_mn.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_ms.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_mt.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_nb.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_nl.ts372
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_pa.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_pl.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt_BR.ts408
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_ro.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_ru.ts405
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_sk.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_sl.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_sr.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_sv.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_sw.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_ta.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_tg.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_th.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_tr.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_uk.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_uz.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_vi.ts408
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_CN.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_HK.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_TW.ts455
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_zu.ts455
-rw-r--r--src-qt5/core/lumina-desktop/images/desktop-background.jpgbin0 -> 1237995 bytes
-rw-r--r--src-qt5/core/lumina-desktop/images/sample-colorschemes.ui117
-rw-r--r--src-qt5/core/lumina-desktop/lumina-desktop.pro167
-rw-r--r--src-qt5/core/lumina-desktop/main.cpp104
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/LPPlugin.h77
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/LTBWidget.h71
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/NewPP.h75
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/applauncher/AppLaunchButton.cpp74
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/applauncher/AppLaunchButton.h63
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/appmenu/LAppMenuPlugin.cpp134
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/appmenu/LAppMenuPlugin.h63
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/battery/LBattery.cpp106
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/battery/LBattery.h53
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/battery/NOTES49
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.cpp214
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.h56
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/desktopbar/LDeskBar.cpp247
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/desktopbar/LDeskBar.h93
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/desktopswitcher/LDesktopSwitcher.cpp142
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/desktopswitcher/LDesktopSwitcher.h72
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/line/LLine.h40
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/panel-plugins.pri49
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/quickcontainer/QuickPPlugin.h43
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/showdesktop/LHomeButton.cpp43
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/showdesktop/LHomeButton.h62
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/spacer/LSpacer.h34
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/LSysDashboard.cpp91
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/LSysDashboard.h76
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/SysMenuQuick.cpp211
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/SysMenuQuick.h54
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/SysMenuQuick.ui400
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemstart/ItemWidget.cpp256
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemstart/ItemWidget.h98
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemstart/LStartButton.cpp120
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemstart/LStartButton.h111
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.cpp576
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.h99
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.ui1127
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemtray/LSysTray.cpp164
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemtray/LSysTray.h73
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemtray/TrayIcon.cpp128
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemtray/TrayIcon.h55
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskButton.cpp238
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskButton.h70
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskManagerPlugin.cpp129
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskManagerPlugin.h71
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/userbutton/LUserButton.cpp57
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/userbutton/LUserButton.h74
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserItemWidget.cpp204
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserItemWidget.h72
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.cpp385
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.h101
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.ui593
-rw-r--r--src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_blue-grey-zoom.jpgbin0 -> 6269314 bytes
-rw-r--r--src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_blue-grey.jpgbin0 -> 6508360 bytes
-rw-r--r--src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_gold.jpgbin0 -> 2523711 bytes
-rw-r--r--src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_green.jpgbin0 -> 1286362 bytes
-rw-r--r--src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_grey-blue-zoom.jpgbin0 -> 563037 bytes
-rw-r--r--src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_grey-blue.jpgbin0 -> 361771 bytes
-rw-r--r--src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_purple.jpgbin0 -> 926969 bytes
-rw-r--r--src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_red.jpgbin0 -> 1141515 bytes
186 files changed, 42106 insertions, 0 deletions
diff --git a/src-qt5/core/lumina-desktop/AppMenu.cpp b/src-qt5/core/lumina-desktop/AppMenu.cpp
new file mode 100644
index 00000000..14af988a
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/AppMenu.cpp
@@ -0,0 +1,151 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "AppMenu.h"
+#include "LSession.h"
+#include <LuminaOS.h>
+
+AppMenu::AppMenu(QWidget* parent) : QMenu(parent){
+ appstorelink = LOS::AppStoreShortcut(); //Default application "store" to display (AppCafe in PC-BSD)
+ controlpanellink = LOS::ControlPanelShortcut(); //Default control panel
+ APPS.clear();
+ watcher = new QFileSystemWatcher(this);
+ connect(watcher, SIGNAL(directoryChanged(QString)), this, SLOT(watcherUpdate()) );
+ //QTimer::singleShot(200, this, SLOT(start()) ); //Now start filling the menu
+ start(); //do the initial run during session init so things are responsive immediately.
+ connect(QApplication::instance(), SIGNAL(LocaleChanged()), this, SLOT(watcherUpdate()) );
+ connect(QApplication::instance(), SIGNAL(IconThemeChanged()), this, SLOT(watcherUpdate()) );
+}
+
+AppMenu::~AppMenu(){
+
+}
+
+QHash<QString, QList<XDGDesktop> >* AppMenu::currentAppHash(){
+ return &APPS;
+}
+
+//===========
+// PRIVATE
+//===========
+void AppMenu::updateAppList(){
+ //Make sure the title/icon are updated as well (in case of locale/icon change)
+ this->setTitle(tr("Applications"));
+ this->setIcon( LXDG::findIcon("system-run","") );
+ //Now update the lists
+ this->clear();
+ APPS.clear();
+ QList<XDGDesktop> allfiles = LXDG::systemDesktopFiles();
+ APPS = LXDG::sortDesktopCats(allfiles);
+ APPS.insert("All", LXDG::sortDesktopNames(allfiles));
+ lastHashUpdate = QDateTime::currentDateTime();
+ //Now fill the menu
+ bool ok; //for checking inputs
+ //Add link to the file manager
+ //this->addAction( LXDG::findIcon("user-home", ""), tr("Browse Files"), this, SLOT(launchFileManager()) );
+ //--Look for the app store
+ XDGDesktop store = LXDG::loadDesktopFile(appstorelink, ok);
+ if(ok){
+ this->addAction( LXDG::findIcon(store.icon, ""), tr("Manage Applications"), this, SLOT(launchStore()) );
+ }
+ //--Look for the control panel
+ store = LXDG::loadDesktopFile(controlpanellink, ok);
+ if(ok){
+ this->addAction( LXDG::findIcon(store.icon, ""), tr("Control Panel"), this, SLOT(launchControlPanel()) );
+ }
+ this->addSeparator();
+ //--Now create the sub-menus
+ QStringList cats = APPS.keys();
+ cats.sort(); //make sure they are alphabetical
+ for(int i=0; i<cats.length(); i++){
+ //Make sure they are translated and have the right icons
+ QString name, icon;
+ if(cats[i]=="All"){continue; } //skip this listing for the menu
+ else if(cats[i] == "Multimedia"){ name = tr("Multimedia"); icon = "applications-multimedia"; }
+ else if(cats[i] == "Development"){ name = tr("Development"); icon = "applications-development"; }
+ else if(cats[i] == "Education"){ name = tr("Education"); icon = "applications-education"; }
+ else if(cats[i] == "Game"){ name = tr("Games"); icon = "applications-games"; }
+ else if(cats[i] == "Graphics"){ name = tr("Graphics"); icon = "applications-graphics"; }
+ else if(cats[i] == "Network"){ name = tr("Network"); icon = "applications-internet"; }
+ else if(cats[i] == "Office"){ name = tr("Office"); icon = "applications-office"; }
+ else if(cats[i] == "Science"){ name = tr("Science"); icon = "applications-science"; }
+ else if(cats[i] == "Settings"){ name = tr("Settings"); icon = "preferences-system"; }
+ else if(cats[i] == "System"){ name = tr("System"); icon = "applications-system"; }
+ else if(cats[i] == "Utility"){ name = tr("Utility"); icon = "applications-utilities"; }
+ else if(cats[i] == "Wine"){ name = tr("Wine"); icon = "wine"; }
+ else{ name = tr("Unsorted"); icon = "applications-other"; }
+
+ QMenu *menu = new QMenu(name, this);
+ menu->setIcon(LXDG::findIcon(icon,""));
+ connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(launchApp(QAction*)) );
+ QList<XDGDesktop> appL = APPS.value(cats[i]);
+ for( int a=0; a<appL.length(); a++){
+ if(appL[a].actions.isEmpty()){
+ //Just a single entry point - no extra actions
+ QAction *act = new QAction(LXDG::findIcon(appL[a].icon, ""), appL[a].name, this);
+ act->setToolTip(appL[a].comment);
+ act->setWhatsThis(appL[a].filePath);
+ menu->addAction(act);
+ }else{
+ //This app has additional actions - make this a sub menu
+ // - first the main menu/action
+ QMenu *submenu = new QMenu(appL[a].name, this);
+ submenu->setIcon( LXDG::findIcon(appL[a].icon,"") );
+ //This is the normal behavior - not a special sub-action (although it needs to be at the top of the new menu)
+ QAction *act = new QAction(LXDG::findIcon(appL[a].icon, ""), appL[a].name, this);
+ act->setToolTip(appL[a].comment);
+ act->setWhatsThis(appL[a].filePath);
+ submenu->addAction(act);
+ //Now add entries for every sub-action listed
+ for(int sa=0; sa<appL[a].actions.length(); sa++){
+ QAction *sact = new QAction(LXDG::findIcon(appL[a].actions[sa].icon, appL[a].icon), appL[a].actions[sa].name, this);
+ sact->setToolTip(appL[a].comment);
+ sact->setWhatsThis("-action \""+appL[a].actions[sa].ID+"\" \""+appL[a].filePath+"\"");
+ submenu->addAction(sact);
+ }
+ menu->addMenu(submenu);
+ }
+ }
+ this->addMenu(menu);
+ }
+ emit AppMenuUpdated();
+}
+
+//=================
+// PRIVATE SLOTS
+//=================
+void AppMenu::start(){
+ //Setup the watcher
+ watcher->addPaths(LXDG::systemApplicationDirs());
+ //Now fill the menu the first time
+ updateAppList();
+}
+
+void AppMenu::watcherUpdate(){
+ updateAppList(); //Update the menu listings
+}
+
+void AppMenu::launchStore(){
+ LSession::LaunchApplication("lumina-open \""+appstorelink+"\"");
+}
+
+void AppMenu::launchControlPanel(){
+ LSession::LaunchApplication("lumina-open \""+controlpanellink+"\"");
+}
+
+void AppMenu::launchFileManager(){
+ QString fm = "lumina-open \""+QDir::homePath()+"\"";
+ LSession::LaunchApplication(fm);
+}
+
+void AppMenu::launchApp(QAction *act){
+ QString appFile = act->whatsThis();
+ if(appFile.startsWith("-action")){
+ LSession::LaunchApplication("lumina-open "+appFile); //already has quotes put in place properly
+ }else{
+ LSession::LaunchApplication("lumina-open \""+appFile+"\"");
+ }
+}
diff --git a/src-qt5/core/lumina-desktop/AppMenu.h b/src-qt5/core/lumina-desktop/AppMenu.h
new file mode 100644
index 00000000..42145e0c
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/AppMenu.h
@@ -0,0 +1,58 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This menu auto-updates to keep the list of available applications
+// current at all times - and can launch them as necessary
+//===========================================
+#ifndef _LUMINA_DESKTOP_APP_MENU_H
+#define _LUMINA_DESKTOP_APP_MENU_H
+
+// Qt includes
+#include <QMenu>
+#include <QFileSystemWatcher>
+#include <QString>
+#include <QList>
+#include <QTimer>
+#include <QDateTime>
+#include <QHash>
+#include <QAction>
+#include <QSettings>
+//#include <QProcess>
+
+// libLumina includes
+#include <LuminaXDG.h>
+
+class AppMenu : public QMenu{
+ Q_OBJECT
+public:
+ AppMenu(QWidget *parent = 0);
+ ~AppMenu();
+
+ QHash<QString, QList<XDGDesktop> > *currentAppHash();
+ QDateTime lastHashUpdate;
+
+private:
+ QFileSystemWatcher *watcher;
+ QString appstorelink, controlpanellink;
+ QList<QMenu> MLIST;
+ QHash<QString, QList<XDGDesktop> > APPS;
+
+ void updateAppList(); //completely update the menu lists
+
+private slots:
+ void start(); //This is called in a new thread after initialization
+ void watcherUpdate();
+ void launchStore();
+ void launchControlPanel();
+ void launchFileManager();
+ void launchApp(QAction *act);
+
+signals:
+ void AppMenuUpdated();
+};
+
+#endif
+
diff --git a/src-qt5/core/lumina-desktop/BootSplash.cpp b/src-qt5/core/lumina-desktop/BootSplash.cpp
new file mode 100644
index 00000000..e75bca21
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/BootSplash.cpp
@@ -0,0 +1,62 @@
+#include "BootSplash.h"
+#include "ui_BootSplash.h"
+
+#include <LuminaXDG.h>
+
+BootSplash::BootSplash() : QWidget(0, Qt::SplashScreen | Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint | Qt::WindowDoesNotAcceptFocus), ui(new Ui::BootSplash){
+ ui->setupUi(this);
+ this->setObjectName("LuminaBootSplash"); //for theme styling
+ //Center the window on the primary screen
+ QPoint ctr = QApplication::desktop()->screenGeometry().center();
+ this->move( ctr.x()-(this->width()/2), ctr.y()-(this->height()/2) );
+}
+
+void BootSplash::showScreen(QString loading){ //update icon, text, and progress
+ QString txt, icon;
+ int per = 0;
+ if(loading=="init"){
+ txt = tr("Initializing Session …"); per = 10;
+ icon = "preferences-system-login";
+ }else if(loading=="settings"){
+ txt = tr("Loading System Settings …"); per = 20;
+ icon = "user-home";
+ }else if(loading=="user"){
+ txt = tr("Loading User Preferences …"); per = 30;
+ icon = "preferences-desktop-user";
+ }else if(loading=="systray"){
+ txt = tr("Preparing System Tray …"); per = 40;
+ icon = "preferences-plugin";
+ }else if(loading=="wm"){
+ txt = tr("Starting Window Manager …"); per = 50;
+ icon = "preferences-system-windows-actions";
+ }else if(loading=="apps"){
+ txt = tr("Detecting Applications …"); per = 60;
+ icon = "preferences-desktop-icons";
+ }else if(loading=="menus"){
+ txt = tr("Preparing Menus …"); per = 70;
+ icon = "preferences-system-windows";
+ }else if(loading=="desktop"){
+ txt = tr("Preparing Workspace …"); per = 80;
+ icon = "preferences-desktop-wallpaper";
+ }else if(loading=="final"){
+ txt = tr("Finalizing …"); per = 90;
+ icon = "pcbsd";
+ }else if(loading.startsWith("app::")){
+ txt = QString(tr("Starting App: %1")).arg(loading.section("::",1,50)); per = -1;
+ }
+ if(per>0){ ui->progressBar->setValue(per); }
+ else{ ui->progressBar->setRange(0,0); } //loading indicator
+ ui->label_text->setText(txt);
+ if(!icon.isEmpty()){ui->label_icon->setPixmap( LXDG::findIcon(icon, "Lumina-DE").pixmap(64,64) ); }
+ this->raise();
+ this->show();
+ this->update();
+ QApplication::processEvents();
+}
+
+void BootSplash::showText(QString txt){ //will only update the text, not the icon/progress
+ ui->label_text->setText(txt);
+ this->show();
+ this->update();
+ QApplication::processEvents();
+}
diff --git a/src-qt5/core/lumina-desktop/BootSplash.h b/src-qt5/core/lumina-desktop/BootSplash.h
new file mode 100644
index 00000000..f5bf97a8
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/BootSplash.h
@@ -0,0 +1,29 @@
+#ifndef _LUMINA_DESKTOP_BOOT_SPLASHSCREEN_H
+#define _LUMINA_DESKTOP_BOOT_SPLASHSCREEN_H
+
+#include <QWidget>
+#include <QLabel>
+#include <QProgressBar>
+#include <QPixmap>
+#include <QPoint>
+#include <QApplication>
+#include <QDesktopWidget>
+
+namespace Ui{
+ class BootSplash;
+};
+
+class BootSplash : public QWidget{
+ Q_OBJECT
+private:
+ Ui::BootSplash *ui;
+
+public:
+ BootSplash();
+ ~BootSplash(){}
+
+ void showScreen(QString loading); //update icon, text, and progress
+ void showText(QString txt); //will only update the text, not the icon/progress
+};
+
+#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/BootSplash.ui b/src-qt5/core/lumina-desktop/BootSplash.ui
new file mode 100644
index 00000000..867b658c
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/BootSplash.ui
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>BootSplash</class>
+ <widget class="QWidget" name="BootSplash">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>280</width>
+ <height>127</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="4">
+ <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 row="0" column="2">
+ <widget class="QLabel" name="label_icon">
+ <property name="minimumSize">
+ <size>
+ <width>64</width>
+ <height>64</height>
+ </size>
+ </property>
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" rowspan="2">
+ <widget class="QProgressBar" name="progressBar">
+ <property name="value">
+ <number>0</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="format">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <spacer name="horizontalSpacer_2">
+ <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 row="1" column="1" colspan="4">
+ <widget class="QLabel" name="label_text">
+ <property name="text">
+ <string notr="true">Some loading message</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src-qt5/core/lumina-desktop/Globals.h b/src-qt5/core/lumina-desktop/Globals.h
new file mode 100644
index 00000000..479fe4ad
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/Globals.h
@@ -0,0 +1,75 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_GLOBALS_H
+#define _LUMINA_DESKTOP_GLOBALS_H
+
+#include <LuminaUtils.h>
+//#include "../global.h"
+
+#include <unistd.h>
+#include <stdio.h>
+
+/*#ifdef __linux
+ // Needed for BUFSIZ
+ #include <stdio.h>
+#endif // #ifdef __linux*/
+
+class Lumina{
+public:
+ enum STATES {NONE, VISIBLE, INVISIBLE, ACTIVE, NOTIFICATION, NOSHOW};
+
+};
+
+class SYSTEM{
+public:
+ //Installation location for finding default files
+ //static QString installDir(){ return PREFIX + "/share/Lumina-DE/"; }
+ //Current Username
+ static QString user(){ return QString::fromLocal8Bit(getlogin()); }
+ //Current Hostname
+ static QString hostname(){
+ char name[BUFSIZ];
+ int count = gethostname(name,sizeof(name));
+ if (count < 0) {
+ return QString::null;
+ }
+ return QString::fromLocal8Bit(name,count);
+ }
+ /*//Shutdown the system
+#ifdef __linux
+ static void shutdown(){ system("(shutdown -h now) &"); }
+#else // #ifdef __linux
+ static void shutdown(){ system("(shutdown -p now) &"); }
+#endif // #ifdef __linux
+ //Restart the system
+ static void restart(){ system("(shutdown -r now) &"); }
+
+ //Determine if there is battery support
+ static bool hasBattery(){
+ int val = LUtils::getCmdOutput("apm -l").join("").toInt();
+ return (val >= 0 && val <= 100);
+ }
+
+ //Get the current battery charge percentage
+ static int batteryCharge(){
+ int charge = LUtils::getCmdOutput("apm -l").join("").toInt();
+ if(charge > 100){ charge = -1; } //invalid charge
+ return charge;
+ }
+
+ //Get the current battery charge percentage
+ static bool batteryIsCharging(){
+ return (LUtils::getCmdOutput("apm -a").join("").simplified() == "1");
+ }
+
+ //Get the amount of time remaining for the battery
+ static int batterySecondsLeft(){
+ return LUtils::getCmdOutput("apm -t").join("").toInt();
+ }*/
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/Insight-FileManager.png b/src-qt5/core/lumina-desktop/Insight-FileManager.png
new file mode 100644
index 00000000..46cfaad7
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/Insight-FileManager.png
Binary files differ
diff --git a/src-qt5/core/lumina-desktop/LDesktop.cpp b/src-qt5/core/lumina-desktop/LDesktop.cpp
new file mode 100644
index 00000000..72b267b0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/LDesktop.cpp
@@ -0,0 +1,532 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LDesktop.h"
+#include "LSession.h"
+
+#include <LuminaOS.h>
+#include <LuminaX11.h>
+#include "LWinInfo.h"
+
+#define DEBUG 0
+
+LDesktop::LDesktop(int deskNum, bool setdefault) : QObject(){
+
+ DPREFIX = "desktop-"+QString::number(deskNum)+"/";
+ desktopnumber = deskNum;
+ desktop = QApplication::desktop();
+ defaultdesktop = setdefault; //(desktop->screenGeometry(desktopnumber).x()==0);
+ desktoplocked = true;
+ issyncing = bgupdating = false;
+ usewinmenu=false;
+
+ //Setup the internal variables
+ settings = new QSettings(QSettings::UserScope, "LuminaDE","desktopsettings", this);
+ //qDebug() << " - Desktop Settings File:" << settings->fileName();
+ if(!QFile::exists(settings->fileName())){ settings->setValue(DPREFIX+"background/filelist",QStringList()<<"default"); settings->sync(); }
+ bgWindow = 0;
+ bgDesktop = 0;
+ QTimer::singleShot(1,this, SLOT(InitDesktop()) );
+
+}
+
+LDesktop::~LDesktop(){
+ delete deskMenu;
+ delete winMenu;
+ delete bgWindow;
+ delete workspacelabel;
+ delete wkspaceact;
+}
+
+int LDesktop::Screen(){
+ return desktopnumber;
+}
+
+void LDesktop::show(){
+ if(bgWindow!=0){ bgWindow->show(); }
+ if(bgDesktop!=0){ bgDesktop->show(); }
+ for(int i=0; i<PANELS.length(); i++){ PANELS[i]->show(); }
+}
+
+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
+ issyncing = true; //Stop handling any watcher events
+ for(int i=0; i<PANELS.length(); i++){ PANELS[i]->prepareToClose(); PANELS.takeAt(i)->deleteLater(); i--; }
+ //Now close down any desktop plugins
+ desktoplocked = true; //make sure that plugin settings are preserved during removal
+ //Remove all the current containers
+ bgDesktop->cleanup();
+}
+
+WId LDesktop::backgroundID(){
+ if(bgWindow!=0){ return bgWindow->winId(); }
+ else{ return QX11Info::appRootWindow(); }
+}
+
+QRect LDesktop::availableScreenGeom(){
+ //Return a QRect containing the (global) screen area that is available (not under any panels)
+ if(bgDesktop!=0){
+ return globalWorkRect; //saved from previous calculations
+ }else{
+ return LSession::handle()->screenGeom(desktopnumber);
+ }
+}
+
+void LDesktop::UpdateGeometry(){
+ //First make sure there is something different about the geometry
+ //if(desktop->screenGeometry(desktopnumber)==bgWindow->geometry()){ return; }
+ //Now update the screen
+ // NOTE: This functionality is highly event-driven based on X changes - so we need to keep things in order (no signals/slots)
+ qDebug() << "Changing Desktop Geom:" << desktopnumber;
+ bgWindow->setGeometry(desktop->screenGeometry(desktopnumber));
+ qDebug() << " - Update Desktop Plugin Area";
+ UpdateDesktopPluginArea();
+ /*qDebug() << " - Update Panel Geometry";
+ for(int i=0; PANELS.length(); i++){
+ PANELS[i]->UpdatePanel(true); //only update geometry
+ }*/
+ qDebug() << " - Done With Desktop Geom Updates";
+ QTimer::singleShot(0, this, SLOT(UpdatePanels()));
+}
+
+void LDesktop::SystemLogout(){
+ LSession::handle()->systemWindow();
+}
+
+void LDesktop::SystemTerminal(){
+ LSession::handle()->sessionSettings()->sync(); //make sure it is up to date
+ QString term = LSession::handle()->sessionSettings()->value("default-terminal","xterm").toString();
+ if(term.endsWith(".desktop")){ term = "lumina-open \""+term+"\""; }
+ LSession::LaunchApplication(term);
+}
+
+void LDesktop::SystemFileManager(){
+ //Just open the home directory
+ QString fm = "lumina-open \""+QDir::homePath()+"\"";
+ LSession::LaunchApplication(fm);
+}
+
+void LDesktop::SystemApplication(QAction* act){
+ if(!act->whatsThis().isEmpty() && act->parent()==deskMenu){
+ LSession::LaunchApplication("lumina-open \""+act->whatsThis()+"\"");
+ }
+}
+
+void LDesktop::checkResolution(){
+ //Compare the current screen resolution with the last one used/saved and adjust config values *only*
+ //NOTE: This is only run the first time this desktop is created (before loading all the interface) - not on each desktop change
+ int oldWidth = settings->value(DPREFIX+"screen/lastWidth",-1).toInt();
+ int oldHeight = settings->value(DPREFIX+"screen/lastHeight",-1).toInt();
+ QRect scrn = LSession::handle()->screenGeom(desktopnumber);
+ if(scrn.isNull()){ return; }
+ issyncing = true;
+ settings->setValue(DPREFIX+"screen/lastWidth",scrn.width());
+ settings->setValue(DPREFIX+"screen/lastHeight",scrn.height());
+
+ if(oldWidth<1 || oldHeight<1 || scrn.width()<1 || scrn.height()<1){
+ //nothing to do - something invalid
+ }else if(scrn.width()==oldWidth && scrn.height()==oldHeight){
+ //nothing to do - same as before
+ }else{
+ //Calculate the scale factor between the old/new sizes in each dimension
+ // and forward that on to all the interface elements
+ double xscale = scrn.width()/((double) oldWidth);
+ double yscale = scrn.height()/((double) oldHeight);
+ if(DEBUG){
+ qDebug() << "Screen Resolution Changed:" << desktopnumber;
+ qDebug() << " - Old:" << QString::number(oldWidth)+"x"+QString::number(oldHeight);
+ qDebug() << " - New:" << QString::number(scrn.width())+"x"+QString::number(scrn.height());
+ qDebug() << " - Scale Factors:" << xscale << yscale;
+ }
+ //Update any panels in the config file
+ for(int i=0; i<4; i++){
+ QString PPREFIX = "panel"+QString::number(desktopnumber)+"."+QString::number(i)+"/";
+ int ht = settings->value(PPREFIX+"height",-1).toInt();
+ if(ht<1){ continue; } //no panel height defined
+ QString loc = settings->value(PPREFIX+"location","top").toString().toLower();
+ if(loc=="top" || loc=="bottom"){
+ settings->setValue(PPREFIX+"height", (int) ht*yscale); //vertical dimension
+ }else{
+ settings->setValue(PPREFIX+"height", (int) ht*xscale); //horizontal dimension
+ }
+ }
+ //Update any desktop plugins
+ QStringList plugs = settings->value(DPREFIX+"pluginlist").toStringList();
+ QFileInfoList files = LSession::handle()->DesktopFiles();
+ for(int i=0; i<files.length(); i++){
+ plugs << "applauncher::"+files[i].absoluteFilePath()+"---"+DPREFIX;
+ }
+ //QString pspath = QDir::homePath()+"/.lumina/desktop-plugins/%1.conf";
+ QSettings *DP = LSession::handle()->DesktopPluginSettings();
+ QStringList keys = DP->allKeys();
+ for(int i=0; i<plugs.length(); i++){
+ QStringList filter = keys.filter(plugs[i]);
+ for(int j=0; j<filter.length(); j++){
+ //Has existing settings - need to adjust it
+ if(filter[j].endsWith("location/height")){ DP->setValue( filter[j], qRound(DP->value(filter[j]).toInt()*yscale) ); }
+ if(filter[j].endsWith("location/width")){ DP->setValue( filter[j], qRound(DP->value(filter[j]).toInt()*xscale) ); }
+ if(filter[j].endsWith("location/x")){ DP->setValue( filter[j], qRound(DP->value(filter[j]).toInt()*xscale) ); }
+ if(filter[j].endsWith("location/y")){ DP->setValue( filter[j], qRound(DP->value(filter[j]).toInt()*yscale) ); }
+ if(filter[j].endsWith("IconSize")){ DP->setValue( filter[j], qRound(DP->value(filter[j]).toInt()*yscale) ); }
+ if(filter[j].endsWith("iconsize")){ DP->setValue( filter[j], qRound(DP->value(filter[j]).toInt()*yscale) ); }
+ }
+ }
+ DP->sync(); //make sure it gets saved to disk right away
+
+ }
+ issyncing = false;
+}
+
+// =====================
+// PRIVATE SLOTS
+// =====================
+void LDesktop::InitDesktop(){
+ //This is called *once* during the main initialization routines
+ checkResolution(); //Adjust the desktop config file first (if necessary)
+ if(DEBUG){ qDebug() << "Init Desktop:" << desktopnumber; }
+ //connect(desktop, SIGNAL(resized(int)), this, SLOT(UpdateGeometry(int)));
+ if(DEBUG){ qDebug() << "Desktop #"<<desktopnumber<<" -> "<< desktop->screenGeometry(desktopnumber) << LSession::handle()->screenGeom(desktopnumber); }
+ deskMenu = new QMenu(0);
+ connect(deskMenu, SIGNAL(triggered(QAction*)), this, SLOT(SystemApplication(QAction*)) );
+ winMenu = new QMenu(0);
+ winMenu->setTitle(tr("Window List"));
+ winMenu->setIcon( LXDG::findIcon("preferences-system-windows","") );
+ connect(winMenu, SIGNAL(triggered(QAction*)), this, SLOT(winClicked(QAction*)) );
+ workspacelabel = new QLabel(0);
+ workspacelabel->setAlignment(Qt::AlignCenter);
+ wkspaceact = new QWidgetAction(0);
+ wkspaceact->setDefaultWidget(workspacelabel);
+ bgtimer = new QTimer(this);
+ bgtimer->setSingleShot(true);
+ connect(bgtimer, SIGNAL(timeout()), this, SLOT(UpdateBackground()) );
+
+ connect(QApplication::instance(), SIGNAL(DesktopConfigChanged()), this, SLOT(SettingsChanged()) );
+ connect(QApplication::instance(), SIGNAL(DesktopFilesChanged()), this, SLOT(UpdateDesktop()) );
+ connect(QApplication::instance(), SIGNAL(LocaleChanged()), this, SLOT(LocaleChanged()) );
+
+ if(DEBUG){ qDebug() << "Create bgWindow"; }
+ bgWindow = new QWidget();
+ bgWindow->setObjectName("bgWindow");
+ bgWindow->setContextMenuPolicy(Qt::CustomContextMenu);
+ bgWindow->setFocusPolicy(Qt::StrongFocus);
+ bgWindow->setWindowFlags(Qt::WindowStaysOnBottomHint | Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
+ LSession::handle()->XCB->SetAsDesktop(bgWindow->winId());
+ bgWindow->setGeometry(LSession::handle()->screenGeom(desktopnumber));
+ connect(bgWindow, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(ShowMenu()) );
+ if(DEBUG){ qDebug() << "Create bgDesktop"; }
+ bgDesktop = new LDesktopPluginSpace(bgWindow); //new QMdiArea(bgWindow);
+ int grid = settings->value(DPREFIX+"GridSize",-1).toInt();
+ if(grid<0 && bgWindow->height() > 2000){ grid = 200; }
+ else if(grid<0){ grid = 100; }
+ bgDesktop->SetIconSize( grid );
+ connect(bgDesktop, SIGNAL(PluginRemovedByUser(QString)), this, SLOT(RemoveDeskPlugin(QString)) );
+ connect(bgDesktop, SIGNAL(IncreaseIcons()), this, SLOT(IncreaseDesktopPluginIcons()) );
+ connect(bgDesktop, SIGNAL(DecreaseIcons()), this, SLOT(DecreaseDesktopPluginIcons()) );
+ connect(bgDesktop, SIGNAL(HideDesktopMenu()), deskMenu, SLOT(hide()));
+ if(DEBUG){ qDebug() << " - Desktop Init Done:" << desktopnumber; }
+ //Start the update processes
+ QTimer::singleShot(10,this, SLOT(UpdateMenu()) );
+ QTimer::singleShot(0,this, SLOT(UpdateBackground()) );
+ QTimer::singleShot(1,this, SLOT(UpdateDesktop()) );
+ QTimer::singleShot(2,this, SLOT(UpdatePanels()) );
+}
+
+void LDesktop::SettingsChanged(){
+ if(issyncing){ return; } //don't refresh for internal modifications to the
+ issyncing = true;
+ qDebug() << "Found Settings Change:" << desktopnumber;
+ settings->sync(); //make sure to sync with external settings changes
+ UpdateBackground();
+ UpdateDesktop();
+ UpdatePanels();
+ UpdateMenu();
+ issyncing = false;
+ QTimer::singleShot(100, this, SLOT(UnlockSettings()) ); //give it a few moments to settle before performing another sync
+}
+
+void LDesktop::LocaleChanged(){
+ //Update any elements which require a re-translation
+ UpdateMenu(false); //do the full menu refresh
+}
+
+void LDesktop::UpdateMenu(bool fast){
+ if(DEBUG){ qDebug() << " - Update Menu:" << desktopnumber; }
+ //Put a label at the top
+ int num = LSession::handle()->XCB->CurrentWorkspace(); //LX11::GetCurrentDesktop();
+ if(DEBUG){ qDebug() << "Found workspace number:" << num; }
+ if(num < 0){ workspacelabel->setText( "<b>"+tr("Lumina Desktop")+"</b>"); }
+ else{ workspacelabel->setText( "<b>"+QString(tr("Workspace %1")).arg(QString::number(num+1))+"</b>"); }
+ if(fast && usewinmenu){ UpdateWinMenu(); }
+ if(fast){ return; } //already done
+ deskMenu->clear(); //clear it for refresh
+ deskMenu->addAction(wkspaceact);
+ deskMenu->addSeparator();
+ //Now load the user's menu setup and fill the menu
+ QStringList items = settings->value("menu/itemlist", QStringList()<< "terminal" << "filemanager" <<"applications" << "line" << "settings" ).toStringList();
+ usewinmenu=false;
+ for(int i=0; i<items.length(); i++){
+ if(items[i]=="terminal"){ deskMenu->addAction(LXDG::findIcon("utilities-terminal",""), tr("Terminal"), this, SLOT(SystemTerminal()) ); }
+ else if(items[i]=="filemanager"){ deskMenu->addAction( LXDG::findIcon("user-home",""), tr("Browse Files"), this, SLOT(SystemFileManager()) ); }
+ else if(items[i]=="applications"){ deskMenu->addMenu( LSession::handle()->applicationMenu() ); }
+ else if(items[i]=="line"){ deskMenu->addSeparator(); }
+ else if(items[i]=="settings"){ deskMenu->addMenu( LSession::handle()->settingsMenu() ); }
+ else if(items[i]=="windowlist"){ deskMenu->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();
+ bool ok = false;
+ XDGDesktop xdgf = LXDG::loadDesktopFile(file, ok);
+ if(ok){
+ deskMenu->addAction( LXDG::findIcon(xdgf.icon,""), xdgf.name)->setWhatsThis(file);
+ }else{
+ qDebug() << "Could not load application file:" << file;
+ }
+ }
+ }
+ //Now add the system quit options
+ deskMenu->addSeparator();
+ deskMenu->addAction(LXDG::findIcon("system-log-out",""), tr("Leave"), this, SLOT(SystemLogout()) );
+}
+
+void LDesktop::UpdateWinMenu(){
+ winMenu->clear();
+ //Get the current list of windows
+ QList<WId> wins = LSession::handle()->XCB->WindowList();
+ //Now add them to the menu
+ for(int i=0; i<wins.length(); i++){
+ LWinInfo info(wins[i]);
+ bool junk;
+ QAction *act = winMenu->addAction( info.icon(junk), info.text() );
+ act->setData( QString::number(wins[i]) );
+ }
+}
+
+void LDesktop::winClicked(QAction* act){
+ LSession::handle()->XCB->ActivateWindow( act->data().toString().toULong() );
+}
+
+void LDesktop::UpdateDesktop(){
+ if(DEBUG){ qDebug() << " - Update Desktop Plugins for screen:" << desktopnumber; }
+ QStringList plugins = settings->value(DPREFIX+"pluginlist", QStringList()).toStringList();
+ if(defaultdesktop && plugins.isEmpty()){
+ //plugins << "sample" << "sample" << "sample";
+ }
+ bool changed=false; //in case the plugin list needs to be changed
+ //First make sure all the plugin names are unique
+ for(int i=0; i<plugins.length(); i++){
+ if(!plugins[i].contains("---") ){
+ int num=1;
+ while( plugins.contains(plugins[i]+"---"+QString::number(desktopnumber)+"."+QString::number(num)) ){
+ num++;
+ }
+ plugins[i] = plugins[i]+"---"+QString::number(desktopnumber)+"."+QString::number(num);
+ changed=true;
+ }
+ }
+ if(changed){
+ //save the modified plugin list to file (so per-plugin settings are preserved)
+ issyncing=true; //don't let the change cause a refresh
+ settings->setValue(DPREFIX+"pluginlist", plugins);
+ settings->sync();
+ QTimer::singleShot(200, this, SLOT(UnlockSettings()) );
+ }
+ //If generating desktop file launchers, add those in
+ QStringList filelist;
+ if(settings->value(DPREFIX+"generateDesktopIcons",false).toBool()){
+ QFileInfoList files = LSession::handle()->DesktopFiles();
+ for(int i=0; i<files.length(); i++){
+ filelist << files[i].absoluteFilePath();
+ }
+ }
+ UpdateDesktopPluginArea();
+ bgDesktop->LoadItems(plugins, filelist);
+}
+
+void LDesktop::RemoveDeskPlugin(QString ID){
+ //This is called after a plugin is manually removed by the user
+ // just need to ensure that the plugin is also removed from the settings file
+ QStringList plugs = settings->value(DPREFIX+"pluginlist", QStringList()).toStringList();
+ if(plugs.contains(ID)){
+ plugs.removeAll(ID);
+ issyncing=true; //don't let the change cause a refresh
+ settings->setValue(DPREFIX+"pluginlist", plugs);
+ settings->sync();
+ QTimer::singleShot(200, this, SLOT(UnlockSettings()) );
+ }
+}
+
+void LDesktop::IncreaseDesktopPluginIcons(){
+ int cur = settings->value(DPREFIX+"GridSize",-1).toInt();
+ if(cur<0 && bgWindow->height() > 2000){ cur = 200; }
+ else if(cur<0){ cur = 100; }
+ cur+=16;
+ issyncing=true; //don't let the change cause a refresh
+ settings->setValue(DPREFIX+"GridSize",cur);
+ settings->sync();
+ QTimer::singleShot(200, this, SLOT(UnlockSettings()) );
+ bgDesktop->SetIconSize(cur);
+}
+
+void LDesktop::DecreaseDesktopPluginIcons(){
+ int cur = settings->value(DPREFIX+"GridSize",-1).toInt();
+ if(cur<0 && bgWindow->height() > 2000){ cur = 200; }
+ else if(cur<0){ cur = 100; }
+ if(cur<32){ return; } //cannot get smaller than 16x16
+ cur-=16;
+ issyncing=true; //don't let the change cause a refresh
+ settings->setValue(DPREFIX+"GridSize",cur);
+ settings->sync();
+ QTimer::singleShot(200, this, SLOT(UnlockSettings()) );
+ bgDesktop->SetIconSize(cur);
+}
+
+void LDesktop::UpdatePanels(){
+ if(DEBUG){ qDebug() << " - Update Panels For Screen:" << desktopnumber; }
+ int panels = settings->value(DPREFIX+"panels", -1).toInt();
+ //if(panels==-1 && defaultdesktop){ panels=1; } //need at least 1 panel on the primary desktop
+ //Remove all extra panels
+ for(int i=0; i<PANELS.length(); i++){
+ if(panels <= PANELS[i]->number()){
+ if(DEBUG){ qDebug() << " -- Remove Panel:" << PANELS[i]->number(); }
+ PANELS[i]->prepareToClose();
+ PANELS.takeAt(i)->deleteLater();
+ i--;
+ }
+ }
+ for(int i=0; i<panels; i++){
+ //Check for a panel with this number
+ bool found = false;
+ for(int p=0; p<PANELS.length() && !found; p++){
+ if(PANELS[p]->number() == i){
+ found = true;
+ if(DEBUG){ qDebug() << " -- Update panel "<< i; }
+ //panel already exists - just update it
+ QTimer::singleShot(0, PANELS[p], SLOT(UpdatePanel()) );
+ }
+ }
+ if(!found){
+ if(DEBUG){ qDebug() << " -- Create panel "<< i; }
+ //New panel
+ LPanel *pan = new LPanel(settings, desktopnumber, i, bgWindow);
+ PANELS << pan;
+ pan->show();
+ }
+ }
+ //Give it a 1/2 second before ensuring that the visible desktop area is correct
+ QTimer::singleShot(500, this, SLOT(UpdateDesktopPluginArea()) );
+}
+
+void LDesktop::UpdateDesktopPluginArea(){
+ QRegion visReg( bgWindow->geometry() ); //visible region (not hidden behind a panel)
+ QRect rawRect = visReg.boundingRect(); //initial value (screen size)
+ for(int i=0; i<PANELS.length(); i++){
+ QRegion shifted = visReg;
+ QString loc = settings->value(PANELS[i]->prefix()+"location","top").toString().toLower();
+ int vis = PANELS[i]->visibleWidth();
+ if(loc=="top"){
+ if(!shifted.contains(QRect(rawRect.x(), rawRect.y(), rawRect.width(), vis))){ continue; }
+ shifted.translate(0, (rawRect.top()+vis)-shifted.boundingRect().top() );
+ }else if(loc=="bottom"){
+ if(!shifted.contains(QRect(rawRect.x(), rawRect.bottom()-vis, rawRect.width(), vis))){ continue; }
+ shifted.translate(0, (rawRect.bottom()-vis)-shifted.boundingRect().bottom());
+ }else if(loc=="left"){
+ if( !shifted.contains(QRect(rawRect.x(), rawRect.y(), vis,rawRect.height())) ){ continue; }
+ shifted.translate((rawRect.left()+vis)-shifted.boundingRect().left() ,0);
+ }else{ //right
+ if(!shifted.contains(QRect(rawRect.right()-vis, rawRect.y(), vis,rawRect.height())) ){ continue; }
+ shifted.translate((rawRect.right()-vis)-shifted.boundingRect().right(),0);
+ }
+ visReg = visReg.intersected( shifted );
+ }
+ //Now make sure the desktop plugin area is only the visible area
+ QRect rec = visReg.boundingRect();
+ //LSession::handle()->XCB->SetScreenWorkArea((unsigned int) desktopnumber, rec);
+ //Now remove the X offset to place it on the current screen (needs widget-coords, not global)
+ globalWorkRect = rec; //save this for later
+ rec.moveTopLeft( QPoint( rec.x()-desktop->screenGeometry(desktopnumber).x() , rec.y() ) );
+ //qDebug() << "DPlug Area:" << rec << bgDesktop->geometry() << LSession::handle()->desktop()->availableGeometry(bgDesktop);
+ if(rec.size().isNull() || rec == bgDesktop->geometry()){return; } //nothing changed
+ bgDesktop->setGeometry( rec );
+ bgDesktop->UpdateGeom(); //just in case the plugin space itself needs to do anything
+ //Re-paint the panels (just in case a plugin was underneath it and the panel is transparent)
+ for(int i=0; i<PANELS.length(); i++){ PANELS[i]->update(); }
+ //Make sure to re-disable any WM control flags
+ LSession::handle()->XCB->SetDisableWMActions(bgWindow->winId());
+}
+
+void LDesktop::UpdateBackground(){
+ //Get the current Background
+ if(bgupdating || bgWindow==0){ return; } //prevent multiple calls to this at the same time
+ bgupdating = true;
+ if(DEBUG){ qDebug() << " - Update Desktop Background for screen:" << desktopnumber; }
+ //Get the list of background(s) to show
+ QStringList bgL = settings->value(DPREFIX+"background/filelist", QStringList()).toStringList();
+ //qDebug() << " - List:" << bgL << CBG;
+ //Remove any invalid files
+ for(int i=0; i<bgL.length(); i++){
+ if( (!QFile::exists(bgL[i]) && bgL[i]!="default" && !bgL[i].startsWith("rgb(") ) || bgL[i].isEmpty()){ bgL.removeAt(i); i--; }
+ }
+ if(bgL.isEmpty()){ bgL << "default"; } //always fall back on the default
+ //Determine if the background needs to be changed
+ //qDebug() << "BG List:" << bgL << oldBGL << CBG << bgtimer->isActive();
+ if(bgL==oldBGL && !CBG.isEmpty() && bgtimer->isActive()){
+ //No background change scheduled - just update the widget
+ bgWindow->update();
+ bgupdating=false;
+ return;
+ }
+ oldBGL = bgL; //save this for later
+ //Determine which background to use next
+ int index;
+ if(CBG.isEmpty()){ index = ( qrand() % bgL.length() ); } //random first wallpaper
+ else{
+ //Go to the next in the list
+ index = bgL.indexOf(CBG);
+ 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
+ }
+ QString bgFile = bgL[index];
+ //Save this file as the current background
+ CBG = bgFile;
+ //qDebug() << " - Set Background to:" << CBG << index << bgL;
+ if( (bgFile.toLower()=="default")){ bgFile = LOS::LuminaShare()+"desktop-background.jpg"; }
+ //Now set this file as the current background
+ QString style;
+ QString format = settings->value(DPREFIX+"background/format","stretch").toString();
+ if(bgFile.startsWith("rgb(")){ style = "QWidget#bgWindow{ border-image: none; background-color: %1;}";
+ }else if( format == "center"){ style = "QWidget#bgWindow{ background: black url(%1); background-position: center; background-repeat: no-repeat; }";
+ }else if( format == "topleft"){ style = "QWidget#bgWindow{ background: black url(%1); background-position: top left; background-repeat: no-repeat; }";
+ }else if( format == "topright"){ style = "QWidget#bgWindow{ background: black url(%1); background-position: top right; background-repeat: no-repeat; }";
+ }else if( format == "bottomleft"){ style = "QWidget#bgWindow{ background: black url(%1); background-position: bottom left; background-repeat: no-repeat; }";
+ }else if( format == "bottomright"){ style = "QWidget#bgWindow{ background: black url(%1); background-position: bottom right; background-repeat: no-repeat; }";
+ }else if( format == "tile"){ style = "QWidget#bgWindow{ background-color: black; border-image:url(%1) repeat;}";
+ }else{ /* STRETCH*/ style = "QWidget#bgWindow{ background-color: black; border-image:url(%1) stretch;}"; }
+ style = style.arg(bgFile);
+ bgWindow->setStyleSheet(style);
+ bgWindow->show();
+ //Now reset the timer for the next change (if appropriate)
+ if(bgtimer->isActive()){ bgtimer->stop(); }
+ if(bgL.length() > 1){
+ //get the length of the timer (in minutes)
+ int min = settings->value(DPREFIX+"background/minutesToChange",5).toInt();
+ //restart the internal timer
+ if(min > 0){
+ bgtimer->start(min*60000); //convert from minutes to milliseconds
+ }
+ }
+ //Now update the panel backgrounds
+ for(int i=0; i<PANELS.length(); i++){
+ PANELS[i]->update();
+ PANELS[i]->show();
+ }
+ bgupdating=false;
+}
diff --git a/src-qt5/core/lumina-desktop/LDesktop.h b/src-qt5/core/lumina-desktop/LDesktop.h
new file mode 100644
index 00000000..14b6efc3
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/LDesktop.h
@@ -0,0 +1,105 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_LDESKTOP_H
+#define _LUMINA_DESKTOP_LDESKTOP_H
+
+#include <QCoreApplication>
+
+
+#include <QSettings>
+#include <QFile>
+#include <QList>
+#include <QDebug>
+#include <QTimer>
+#include <QFileSystemWatcher>
+#include <QLabel>
+#include <QWidgetAction>
+#include <QMdiArea>
+#include <QMdiSubWindow>
+#include <QRegion>
+
+
+#include <LuminaXDG.h>
+
+#include "LPanel.h"
+//#include "Globals.h"
+#include "AppMenu.h"
+#include "LDesktopPluginSpace.h"
+#include "desktop-plugins/LDPlugin.h"
+//#include "desktop-plugins/NewDP.h"
+
+class LDesktop : public QObject{
+ Q_OBJECT
+public:
+ LDesktop(int deskNum=0, bool setdefault = false);
+ ~LDesktop();
+
+ int Screen(); //return the screen number this object is managing
+ void show();
+ void hide();
+ void prepareToClose();
+
+ WId backgroundID();
+ QRect availableScreenGeom();
+
+ void UpdateGeometry();
+
+public slots:
+ void SystemLogout();
+ void SystemTerminal();
+ void SystemFileManager();
+ void SystemApplication(QAction*);
+
+ void checkResolution();
+
+private:
+ QSettings *settings;
+ QTimer *bgtimer;
+ QDesktopWidget *desktop;
+ QString DPREFIX;
+ int desktopnumber;
+ QRegion availDPArea;
+ bool defaultdesktop, desktoplocked, issyncing, usewinmenu, bgupdating;
+ QStringList oldBGL;
+ QList<LPanel*> PANELS;
+ LDesktopPluginSpace *bgDesktop; //desktop plugin area
+ QWidget *bgWindow; //full screen background
+ QMenu *deskMenu, *winMenu;
+ QLabel *workspacelabel;
+ QWidgetAction *wkspaceact;
+ QList<LDPlugin*> PLUGINS;
+ QString CBG; //current background
+ QRect globalWorkRect;
+
+private slots:
+ void InitDesktop();
+ void SettingsChanged();
+ void UnlockSettings(){ issyncing=false; }
+ void LocaleChanged();
+
+ //Menu functions
+ void UpdateMenu(bool fast = false);
+ void ShowMenu(){
+ UpdateMenu(true); //run the fast version
+ deskMenu->popup(QCursor::pos()); //}
+ }
+ void UpdateWinMenu();
+ void winClicked(QAction*);
+
+ //Desktop plugin system functions
+ void UpdateDesktop();
+ void RemoveDeskPlugin(QString);
+ void IncreaseDesktopPluginIcons();
+ void DecreaseDesktopPluginIcons();
+
+ void UpdatePanels();
+
+ void UpdateDesktopPluginArea(); //make sure the area is not underneath any panels
+
+ void UpdateBackground();
+};
+#endif
diff --git a/src-qt5/core/lumina-desktop/LDesktopPluginSpace.cpp b/src-qt5/core/lumina-desktop/LDesktopPluginSpace.cpp
new file mode 100644
index 00000000..a55f3e31
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/LDesktopPluginSpace.cpp
@@ -0,0 +1,300 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LDesktopPluginSpace.h"
+#include "LSession.h"
+#include "desktop-plugins/NewDP.h"
+
+#include <LuminaXDG.h>
+#include <QDesktopWidget>
+
+#define DEBUG 0
+
+// ===================
+// PUBLIC
+// ===================
+LDesktopPluginSpace::LDesktopPluginSpace(QWidget *parent) : QWidget(parent){
+ this->setObjectName("LuminaDesktopPluginSpace");
+ this->setStyleSheet("QWidget#LuminaDesktopPluginSpace{ border: none; background: transparent; }");
+ this->setAcceptDrops(true);
+ this->setContextMenuPolicy(Qt::NoContextMenu);
+ this->setMouseTracking(true);
+ TopToBottom = true;
+ GRIDSIZE = 100.0; //default value if not set
+ plugsettings = LSession::handle()->DesktopPluginSettings();
+
+}
+
+LDesktopPluginSpace::~LDesktopPluginSpace(){
+
+}
+
+void LDesktopPluginSpace::LoadItems(QStringList plugs, QStringList files){
+ if(DEBUG){ qDebug() << "Loading Desktop Items:" << plugs << files << "Area:" << this->size() << GRIDSIZE; }
+ bool changes = false;
+ if(plugs != plugins){ plugins = plugs; changes = true; }
+ if(files != deskitems){ deskitems = files; changes = true; }
+ if(changes){ QTimer::singleShot(0,this, SLOT(reloadPlugins())); }
+}
+
+void LDesktopPluginSpace::SetIconSize(int size){
+ if(DEBUG){ qDebug() << "Set Desktop Icon Size:" << size; }
+ //QSize newsize = calculateItemSize(size);
+ int oldsize = GRIDSIZE;
+ GRIDSIZE = size; //turn the int into a float;
+ //itemSize = QSize(1,1); //save this for all the later icons which are generated (grid size)
+ UpdateGeom(oldsize);
+ //Now re-set the item icon size
+ //reloadPlugins(true);
+}
+
+void LDesktopPluginSpace::cleanup(){
+ //Perform any final cleanup actions here
+ for(int i=0; i<ITEMS.length(); i++){
+ ITEMS.takeAt(i)->deleteLater();
+ i--;
+ }
+ plugins.clear();
+ deskitems.clear();
+ this->hide();
+}
+// ===================
+// PUBLIC SLOTS
+// ===================
+void LDesktopPluginSpace::UpdateGeom(int oldgrid){
+ if(DEBUG){ qDebug() << "Updated Desktop Geom:" << this->size() << GRIDSIZE << this->size()/GRIDSIZE; }
+ //Go through and check the locations/sizes of all items (particularly the ones on the bottom/right edges)
+ //bool reload = false;
+ for(int i=0; i<ITEMS.length(); i++){
+ QRect grid = geomToGrid(ITEMS[i]->geometry(), oldgrid);
+ if(DEBUG){ qDebug() << " - Check Plugin:" << ITEMS[i]->whatsThis() << grid; }
+ if( !ValidGrid(grid) ){
+ //This plugin is too far out of the screen - find new location for it
+ if(DEBUG){ qDebug() << " -- Out of bounds - Find a new spot"; }
+ grid = findOpenSpot(grid, ITEMS[i]->whatsThis(), true); //Reverse lookup spot
+ }
+ if(!ValidGrid(grid)){
+ qDebug() << "No Place for plugin:" << ITEMS[i]->whatsThis();
+ qDebug() << " - Removing it for now...";
+ ITEMS.takeAt(i)->deleteLater();
+ i--;
+ }else{
+ //NOTE: We are not doing the ValidGeometry() checks because we are only resizing existing plugin with pre-set & valid grid positions
+ grid = gridToGeom(grid); //convert to pixels before saving/sizing
+ MovePlugin(ITEMS[i], grid);
+ /*ITEMS[i]->setGeometry( grid );
+ ITEMS[i]->setFixedSize(grid.size());
+ ITEMS[i]->savePluginGeometry(grid);*/
+ }
+ }
+ //if(reload){ QTimer::singleShot(0,this, SLOT(reloadPlugins())); }
+}
+
+// ===================
+// PRIVATE
+// ===================
+void LDesktopPluginSpace::addDesktopItem(QString filepath){
+ addDesktopPlugin("applauncher::"+filepath+"---dlink"+QString::number(LSession::handle()->desktop()->screenNumber(this)) );
+}
+
+void LDesktopPluginSpace::addDesktopPlugin(QString plugID){
+ //This is used for generic plugins (QWidget-based)
+ if(DEBUG){ qDebug() << "Adding Desktop Plugin:" << plugID; }
+ LDPlugin *plug = NewDP::createPlugin(plugID, this);
+ if(plug==0){ return; } //invalid plugin
+ plug->setWhatsThis(plugID);
+ //Now get the geometry for the plugin
+ QRect geom = plug->loadPluginGeometry(); //in pixel coords
+ if(!geom.isNull()){ geom = geomToGrid(geom); } //convert to grid coordinates
+ if(geom.isNull()){
+ //No previous location - need to calculate initial geom
+ QSize sz = plug->defaultPluginSize(); //in grid coordinates
+ geom.setSize(sz);
+ geom = findOpenSpot(geom.width(), geom.height() );
+ }else if(!ValidGeometry(plugID, gridToGeom(geom)) ){
+ //Find a new location for the plugin (saved location is invalid)
+ geom = findOpenSpot(geom.width(), geom.height(), geom.y(), geom.x(), false); //try to get it within the same general area first
+ }
+ if(geom.x() < 0 || geom.y() < 0){
+ qDebug() << "No available space for desktop plugin:" << plugID << " - IGNORING";
+ delete plug;
+ }else{
+ if(DEBUG){ qDebug() << " - New Plugin Geometry (grid):" << geom; }
+ //Now place the item in the proper spot/size
+ MovePlugin(plug, gridToGeom(geom));
+ //plug->setGeometry( gridToGeom(geom) );
+ plug->show();
+ if(DEBUG){ qDebug() << " - New Plugin Geometry (px):" << plug->geometry(); }
+ ITEMS << plug;
+ connect(plug, SIGNAL(StartMoving(QString)), this, SLOT(StartItemMove(QString)) );
+ connect(plug, SIGNAL(StartResizing(QString)), this, SLOT(StartItemResize(QString)) );
+ connect(plug, SIGNAL(RemovePlugin(QString)), this, SLOT(RemoveItem(QString)) );
+ connect(plug, SIGNAL(IncreaseIconSize()), this, SIGNAL(IncreaseIcons()) );
+ connect(plug, SIGNAL(DecreaseIconSize()), this, SIGNAL(DecreaseIcons()) );
+ connect(plug, SIGNAL(CloseDesktopMenu()), this, SIGNAL(HideDesktopMenu()) );
+ }
+}
+
+QRect LDesktopPluginSpace::findOpenSpot(int gridwidth, int gridheight, int startRow, int startCol, bool reversed, QString plugID){
+ //Note about the return QPoint: x() is the column number, y() is the row number
+ QPoint pt(0,0);
+ //qDebug() << "FIND OPEN SPOT:" << gridwidth << gridheight << startRow << startCol << reversed;
+ int row = startRow; int col = startCol;
+ if(row<0){ row = 0; } //just in case - since this can be recursively called
+ if(col<0){ col = 0; } //just in case - since this can be recursively called
+ bool found = false;
+ int rowCount, colCount;
+ rowCount = RoundUp(this->height()/GRIDSIZE);
+ colCount = RoundUp(this->width()/GRIDSIZE);
+ if( (row+gridheight)>rowCount){ row = rowCount-gridheight; startRow = row; }
+ if( (col+gridwidth)>colCount){ col = colCount-gridwidth; startCol = col; }
+ QRect geom(0, 0, gridwidth*GRIDSIZE, gridheight*GRIDSIZE); //origin point will be adjusted in a moment
+ if(DEBUG){ qDebug() << "Search for plugin space:" << rowCount << colCount << gridheight << gridwidth << this->size(); }
+ if(TopToBottom && reversed && (startRow>0 || startCol>0) ){
+ //Arrange Top->Bottom (work backwards)
+ //qDebug() << "Search backwards for space:" << rowCount << colCount << startRow << startCol << gridheight << gridwidth;
+ while(col>=0 && !found){
+ while(row>=0 && !found){
+ bool ok = true;
+ geom.moveTo(col*GRIDSIZE, row*GRIDSIZE);
+ //qDebug() << " - Check Geom:" << geom << col << row;
+ //Check all the existing items to ensure no overlap
+ for(int i=0; i<ITEMS.length() && ok; i++){
+ if(ITEMS[i]->whatsThis()==plugID){ continue; } //same plugin - this is not a conflict
+ if(geom.intersects(ITEMS[i]->geometry())){
+ //Collision - move the next searchable row/column index
+ ok = false;
+ //qDebug() << "Collision:" << col << row;
+ row = ((ITEMS[i]->geometry().y()-GRIDSIZE/2)/GRIDSIZE) -gridheight; //use top edge for next search (minus item height)
+ //qDebug() << " - new row:" << row;
+ }
+ }
+ if(ok){ pt = QPoint(col,row); found = true; } //found an open spot
+ }
+ if(!found){ col--; row=rowCount-gridheight; } //go to the previous column
+ }
+ }else if(TopToBottom){
+ //Arrange Top->Bottom
+ while(col<(colCount-gridwidth) && !found){
+ while(row<(rowCount-gridheight) && !found){
+ bool ok = true;
+ geom.moveTo(col*GRIDSIZE, row*GRIDSIZE);
+ //qDebug() << " - Check Geom:" << geom << col << row;
+ //Check all the existing items to ensure no overlap
+ for(int i=0; i<ITEMS.length() && ok; i++){
+ if(ITEMS[i]->whatsThis()==plugID){ continue; } //same plugin - this is not a conflict
+ if(geom.intersects(ITEMS[i]->geometry())){
+ //Collision - move the next searchable row/column index
+ ok = false;
+ row = posToGrid(ITEMS[i]->geometry().bottomLeft()).y(); //use bottom edge for next search
+ }
+ }
+ if(ok){ pt = QPoint(col,row); found = true; } //found an open spot
+ //else{ row++; }
+ }
+ if(!found){ col++; row=0; } //go to the next column
+ }
+ }else if(reversed && (startRow>0 || startCol>0) ){
+ //Arrange Left->Right (work backwards)
+ while(row>=0 && !found){
+ while(col>=0 && !found){
+ bool ok = true;
+ geom.moveTo(col*GRIDSIZE, row*GRIDSIZE);
+ //Check all the existing items to ensure no overlap
+ for(int i=0; i<ITEMS.length() && ok; i++){
+ if(ITEMS[i]->whatsThis()==plugID){ continue; } //same plugin - this is not a conflict
+ if(geom.intersects(ITEMS[i]->geometry())){
+ //Collision - move the next searchable row/column index
+ ok = false;
+ col = (ITEMS[i]->geometry().x()-GRIDSIZE/2)/GRIDSIZE - gridwidth; // Fill according to row/column
+ }
+ }
+ if(ok){ pt = QPoint(col,row); found = true; } //found an open spot
+ //else{ col++; }
+ }
+ if(!found){ row--; col=colCount-gridwidth;} //go to the previous row
+ }
+ }else{
+ //Arrange Left->Right
+ while(row<(rowCount-gridheight) && !found){
+ while(col<(colCount-gridwidth) && !found){
+ bool ok = true;
+ geom.moveTo(col*GRIDSIZE, row*GRIDSIZE);
+ //Check all the existing items to ensure no overlap
+ for(int i=0; i<ITEMS.length() && ok; i++){
+ if(ITEMS[i]->whatsThis()==plugID){ continue; } //same plugin - this is not a conflict
+ if(geom.intersects(ITEMS[i]->geometry())){
+ //Collision - move the next searchable row/column index
+ ok = false;
+ col = posToGrid(ITEMS[i]->geometry().topRight()).x(); // Fill according to row/column
+ }
+ }
+ if(ok){ pt = QPoint(col,row); found = true; } //found an open spot
+ //else{ col++; }
+ }
+ if(!found){ row++; col=0;} //go to the next row
+ }
+ }
+ if(!found){
+ //qDebug() << "Could not find a spot:" << startRow << startCol << gridheight << gridwidth;
+ if( (startRow!=0 || startCol!=0) && !reversed){
+ //Did not check the entire screen yet - gradually work it's way back to the top/left corner
+ //qDebug() << " - Start backwards search";
+ return findOpenSpot(gridwidth, gridheight,startRow,startCol, true); //reverse the scan
+ }else if(gridwidth>1 && gridheight>1){
+ //Decrease the size of the item by 1x1 grid points and try again
+ //qDebug() << " - Out of space: Decrease item size and try again...";
+ return findOpenSpot(gridwidth-1, gridheight-1, 0, 0);
+ }else{
+ //qDebug() << " - Could not find an open spot for a desktop plugin:" << gridwidth << gridheight << startRow << startCol;
+ return QRect(-1,-1,-1,-1);
+ }
+ }else{
+ return QRect(pt,QSize(gridwidth,gridheight));
+ }
+}
+
+QRect LDesktopPluginSpace::findOpenSpot(QRect grid, QString plugID, bool recursive){ //Reverse lookup spotc{
+ //This is just an overloaded simplification for checking currently existing plugins
+ return findOpenSpot(grid.width(), grid.height(), grid.y(), grid.x(), recursive, plugID);
+}
+
+// ===================
+// PRIVATE SLOTS
+// ===================
+void LDesktopPluginSpace::reloadPlugins(bool ForceIconUpdate ){
+ //Remove any plugins as necessary
+ QStringList plugs = plugins;
+ QStringList items = deskitems;
+ for(int i=0; i<ITEMS.length(); i++){
+
+ if( ITEMS[i]->whatsThis().startsWith("applauncher") && ForceIconUpdate){
+ //Change the size of the existing plugin - preserving the location if possible
+ /*QRect geom = ITEMS[i]->loadPluginGeometry(); //pixel coords
+ if(!geom.isNull()){
+ geom = geomToGrid(geom); //convert to grid coords
+ geom.setSize(itemSize); //Reset back to default size (does not change location)
+ ITEMS[i]->savePluginGeometry( gridToGeom(geom)); //save it back in pixel coords
+ }*/
+ //Now remove the plugin for the moment - run it through the re-creation routine below
+ ITEMS.takeAt(i)->deleteLater();
+ i--;
+ }
+ else if(plugs.contains(ITEMS[i]->whatsThis())){ plugs.removeAll(ITEMS[i]->whatsThis()); }
+ else if(items.contains(ITEMS[i]->whatsThis().section("---",0,0).section("::",1,50))){ items.removeAll(ITEMS[i]->whatsThis().section("---",0,0).section("::",1,50)); }
+ else{ ITEMS[i]->removeSettings(true); ITEMS.takeAt(i)->deleteLater(); i--; } //this is considered a permanent removal (cleans settings)
+ }
+
+ //Now create any new items
+ //First load the plugins (almost always have fixed locations)
+ for(int i=0; i<plugs.length(); i++){
+ addDesktopPlugin(plugs[i]);
+ }
+ //Now load the desktop shortcuts (fill in the gaps as needed)
+ for(int i=0; i<items.length(); i++){
+ addDesktopItem(items[i]);
+ }
+}
diff --git a/src-qt5/core/lumina-desktop/LDesktopPluginSpace.h b/src-qt5/core/lumina-desktop/LDesktopPluginSpace.h
new file mode 100644
index 00000000..5ef51930
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/LDesktopPluginSpace.h
@@ -0,0 +1,292 @@
+//===========================================
+// 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_DESKTOP_LDESKTOP_PLUGIN_SPACE_H
+#define _LUMINA_DESKTOP_LDESKTOP_PLUGIN_SPACE_H
+
+#include <QListWidget>
+#include <QDropEvent>
+#include <QDrag> //includes all the QDrag*Event classes
+#include <QUrl>
+#include <QMimeData>
+#include <QSettings>
+#include <QDebug>
+#include <QFile>
+#include <QDir>
+#include <QFileInfo>
+#include <QProcess>
+
+#include "desktop-plugins/LDPlugin.h"
+
+#define MIMETYPE QString("x-special/lumina-desktop-plugin")
+
+class LDesktopPluginSpace : public QWidget{
+ Q_OBJECT
+
+signals:
+ void PluginRemovedByUser(QString ID);
+ void IncreaseIcons(); //increase default icon sizes
+ void DecreaseIcons(); //decrease default icon sizes
+ void HideDesktopMenu();
+
+public:
+ LDesktopPluginSpace(QWidget *parent = 0);
+ ~LDesktopPluginSpace();
+
+ void LoadItems(QStringList plugs, QStringList files);
+ //void setShowGrid(bool show); This is already implemented in QTableView (inherited)
+ void SetIconSize(int size);
+ void ArrangeTopToBottom(bool ttb); //if false, will arrange left->right
+ void cleanup();
+
+public slots:
+ void UpdateGeom(int oldgrid = -1);
+
+private:
+ QSettings *plugsettings;
+ QStringList plugins, deskitems;
+ QList<LDPlugin*> ITEMS;
+ bool TopToBottom;
+ float GRIDSIZE;
+
+ int RoundUp(double num){
+ int out = num; //This will truncate the number
+ if(out < num){ out++; } //need to increase by 1
+ return out;
+ }
+
+ void addDesktopItem(QString filepath); //This will convert it into a valid Plugin ID automatically
+ void addDesktopPlugin(QString plugID);
+
+
+ QRect findOpenSpot(int gridwidth = 1, int gridheight = 1, int startRow = 0, int startCol = 0, bool reversed = false, QString plugID = "");
+ QRect findOpenSpot(QRect grid, QString plugID, bool recursive = false);
+
+ QPoint posToGrid(QPoint pos){
+ //This assumes a point in widget-relative coordinates
+ pos.setX( RoundUp(pos.x()/GRIDSIZE));
+ pos.setY( RoundUp(pos.y()/GRIDSIZE));
+ return pos;
+ }
+
+ QRect geomToGrid(QRect geom, int grid = -1){
+ if(grid<0){
+ //use the current grid size
+ return QRect( RoundUp(geom.x()/GRIDSIZE), RoundUp(geom.y()/GRIDSIZE), \
+ RoundUp(geom.width()/GRIDSIZE), RoundUp(geom.height()/GRIDSIZE) );
+ }else{
+ //use the input grid size
+ return QRect( RoundUp(geom.x()/((double) grid)), RoundUp(geom.y()/((double) grid)), \
+ RoundUp(geom.width()/((double) grid)), RoundUp(geom.height()/((double) grid)) );
+ }
+ }
+
+ QRect gridToGeom(QRect grid){
+ //This function incorporates the bottom/right edge matchins procedures (for incomplete last grid)
+ QRect geom(grid.x()*GRIDSIZE, grid.y()*GRIDSIZE, grid.width()*GRIDSIZE, grid.height()*GRIDSIZE);
+ //Now check the edge conditions (last right/bottom grid points might be smaller than GRIDSIZE)
+ QSize areaSize = this->size(); //use the size of the area instead of the geometry - because we need this in child coordinates like "geom" above
+ //qDebug() << "GridToGeom:" << grid << geom << "Area size:" << areaSize;
+ if(geom.right() > areaSize.width() && (geom.right()-areaSize.width())<GRIDSIZE ){
+ geom.setRight(areaSize.width()-1); //match up with the edge
+ }
+ if(geom.bottom() > areaSize.height() && (geom.bottom() -areaSize.height())<GRIDSIZE ){
+ geom.setBottom(areaSize.height()-1); //match up with the edge
+ }
+ //qDebug() << " - Adjusted:" << geom;
+ return geom;
+ }
+
+ //Internal simplification for setting up a drag event
+ void setupDrag(QString id, QString type){
+ QMimeData *mime = new QMimeData;
+ mime->setData(MIMETYPE, QString(type+"::::"+id).toLocal8Bit() );
+ //If this is a desktop file - also add it to the generic URI list mimetype
+ if(id.startsWith("applauncher::")){
+ QList<QUrl> urilist;
+ urilist << QUrl::fromLocalFile( id.section("---",0,0).section("::",1,50) );
+ mime->setUrls(urilist);
+ }
+ //Create the drag structure
+ QDrag *drag = new QDrag(this);
+ drag->setMimeData(mime);
+ drag->exec(Qt::CopyAction);
+ }
+
+ bool ValidGrid(QRect grid){
+ //qDebug() << "Check Valid Grid:" << grid << RoundUp(this->width()/GRIDSIZE) << RoundUp(this->height()/GRIDSIZE);
+ //This just checks that the grid coordinates are not out of bounds - should still run ValidGeometry() below with the actual pixel geom
+ if(grid.x()<0 || grid.y()<0 || grid.width()<0 || grid.height()<0){ return false; }
+ else if( (grid.x()+grid.width()) > RoundUp(this->width()/GRIDSIZE) ){ return false; }
+ else if( (grid.y()+grid.height()) > RoundUp(this->height()/GRIDSIZE) ){ return false; }
+ return true;
+ }
+
+ bool ValidGeometry(QString id, QRect geom){
+ //First check that it is within the desktop area completely
+ // Note that "this->geometry()" is not in the same coordinate space as the geometry inputs
+ if(!QRect(0,0,this->width(), this->height()).contains(geom)){ return false; }
+ //Now check that it does not collide with any other items
+ for(int i=0; i<ITEMS.length(); i++){
+ if(ITEMS[i]->whatsThis()==id){ continue; }
+ else if(geom.intersects(ITEMS[i]->geometry())){ return false; }
+ }
+ return true;
+ }
+
+ LDPlugin* ItemFromID(QString ID){
+ for(int i=0; i<ITEMS.length(); i++){
+ if(ITEMS[i]->whatsThis()==ID){ return ITEMS[i]; }
+ }
+ return 0;
+ }
+
+ void MovePlugin(LDPlugin* plug, QRect geom){
+ plug->setGeometry( geom );
+ plug->setFixedSize(geom.size()); //needed for some plugins
+ plug->savePluginGeometry(geom);
+ }
+
+private slots:
+ void reloadPlugins(bool ForceIconUpdate = false);
+
+ void StartItemMove(QString ID){
+ setupDrag(ID, "move");
+ }
+ void StartItemResize(QString ID){
+ setupDrag(ID, "resize");
+ }
+ void RemoveItem(QString ID){
+ //Special case - desktop file/dir link using the "applauncher" plugin
+ if(ID.startsWith("applauncher::")){
+ QFileInfo info(ID.section("---",0,0).section("::",1,50) );
+ if(info.exists() && info.absolutePath()==QDir::homePath()+"/Desktop"){
+ qDebug() << "Deleting Desktop Item:" << info.absoluteFilePath();
+ if(!info.isSymLink() && info.isDir()){ QProcess::startDetached("rm -r \""+info.absoluteFilePath()+"\""); }
+ else{ QFile::remove(info.absoluteFilePath()); } //just remove the file/symlink directly
+ emit PluginRemovedByUser(ID);
+ return;
+ }
+ }
+ //Any other type of plugin
+ for(int i=0; i<ITEMS.length(); i++){
+ if(ITEMS[i]->whatsThis()==ID){
+ ITEMS[i]->Cleanup();
+ delete ITEMS.takeAt(i);
+ break;
+ }
+ }
+ emit PluginRemovedByUser(ID);
+ }
+
+protected:
+ //Need Drag and Drop functionality (internal movement)
+ void dragEnterEvent(QDragEnterEvent *ev){
+ if(ev->mimeData()->hasFormat(MIMETYPE) ){
+ ev->acceptProposedAction(); //allow this to be dropped here
+ }else if(ev->mimeData()->hasUrls()){
+ ev->acceptProposedAction(); //allow this to be dropped here
+ }else{
+ ev->ignore();
+ }
+ }
+
+ void dragMoveEvent(QDragMoveEvent *ev){
+ if(ev->mimeData()->hasFormat(MIMETYPE) ){
+ //Internal move/resize - Check for validity
+ QString act = QString( ev->mimeData()->data(MIMETYPE) );
+ LDPlugin *item = ItemFromID(act.section("::::",1,50));
+ //qDebug() << "Internal Move Event:" << act << ev->pos();
+ if(item!=0){
+ QRect geom = item->geometry();
+ QPoint grid = posToGrid(ev->pos());
+ if(act.section("::::",0,0)=="move"){
+ QPoint diff = grid - posToGrid(geom.center()); //difference in grid coords
+ //qDebug() << "Move Event:" << "Diff:" << diff << "Geom:" << geom << grid << ev->pos();
+ geom = geomToGrid(geom); //convert to grid coords
+ //qDebug() << "Move Event:" << "Old geom (grid):" << geom;
+ geom.moveTo( (geom.topLeft()+diff) );
+ //qDebug() << " - After Move:" << geom;
+ bool valid = ValidGrid(geom);
+ if(valid){
+ //Convert to pixel coordinates and check validity again
+ geom = gridToGeom(geom); //convert back to px coords with edge matching
+ valid = ValidGeometry(act.section("::::",1,50), geom);
+ }
+ if(valid){
+ MovePlugin(item, geom);
+ //item->setGeometry(geom);
+ //item->setFixedSize(geom.size()); //needed due to resizing limitations and such for some plugins
+ ev->acceptProposedAction();
+ //item->savePluginGeometry(geom); //save in pixel coords
+ }else{ ev->ignore(); } //invalid location
+
+ }else{
+ //Resize operation
+ QPoint diff = ev->pos() - (geom.center()-QPoint(1,1)); //need difference from center (pixels)
+ //Note: Use the 1x1 pixel offset to ensure that the center point is not exactly on a grid point intersection (2x2, 4x4, etc)
+ //qDebug() << "Resize Plugin:" << geom << grid << posToGrid(geom.center()) << diff;
+ geom = geomToGrid(geom); //convert to grid coordinates now
+ //qDebug() << " - Grid Geom:" << geom;
+ if(diff.x()<0){ geom.setLeft(ev->pos().x()/GRIDSIZE); } //expanding to the left (round down)
+ else if(diff.x()>0){ geom.setRight( ev->pos().x()/GRIDSIZE); } //expanding to the right (round down)
+ if(diff.y()<0){ geom.setTop( ev->pos().y()/GRIDSIZE); } //expanding above (round down)
+ else if(diff.y()>0){ geom.setBottom( ev->pos().y()/GRIDSIZE); } //expanding below (round down)
+ //qDebug() << " - Adjusted:" << geom;
+ bool valid = ValidGrid(geom);
+ if(valid){
+ //Convert to pixel coordinates and check validity again
+ geom = gridToGeom(geom); //convert back to px coords with edge matching
+ valid = ValidGeometry(act.section("::::",1,50), geom);
+ }
+ if(valid){
+ MovePlugin(item, geom);
+ //item->setGeometry(geom);
+ //item->setFixedSize(geom.size()); //needed due to resizing limitations and such for some plugins
+ ev->acceptProposedAction();
+ //item->savePluginGeometry(geom); //save in pixel coords
+ }else{ ev->ignore(); } //invalid location
+ }
+ }
+ }else if(ev->mimeData()->hasUrls()){
+ ev->acceptProposedAction(); //allow this to be dropped here
+ }else{
+ ev->ignore();
+ }
+ }
+
+ void dropEvent(QDropEvent *ev){
+ //QPoint grid = posToGrid(ev->pos());
+ if(ev->mimeData()->hasFormat(MIMETYPE)){
+ //Desktop Items getting moved around - already performed in the dragMoveEvent
+ ev->accept();
+ }else if(ev->mimeData()->hasUrls()){
+ ev->accept();
+ //Files getting dropped here
+ QList<QUrl> urls = ev->mimeData()->urls();
+ qDebug() << "Desktop Drop Event:" << urls;
+ for(int i=0; i<urls.length(); i++){
+ //If this file is not in the desktop folder, move/copy it here
+ if(urls[i].isLocalFile()){
+ QFileInfo info(urls[i].toLocalFile());
+ if(info.exists() && !QFile::exists(QDir::homePath()+"/Desktop/"+info.fileName())){
+ //Make a link to the file here
+ QFile::link(info.absoluteFilePath(), QDir::homePath()+"/Desktop/"+info.fileName());
+ }else{
+ qWarning() << "Invalid desktop file drop (ignored):" << urls[i].toString();
+ }
+ }
+
+ }
+ }else{
+ //Ignore this event
+ ev->ignore();
+ }
+ }
+
+};
+
+#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/LPanel.cpp b/src-qt5/core/lumina-desktop/LPanel.cpp
new file mode 100644
index 00000000..8486bf1c
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/LPanel.cpp
@@ -0,0 +1,347 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LPanel.h"
+#include "LSession.h"
+#include "panel-plugins/systemtray/LSysTray.h"
+
+#define DEBUG 0
+
+LPanel::LPanel(QSettings *file, int scr, int num, QWidget *parent) : QWidget(){
+ //Take care of inputs
+ this->setMouseTracking(true);
+ if(DEBUG){ qDebug() << " - Creating Panel:" << scr << num; }
+ bgWindow = parent; //save for later
+ //Setup the widget overlay for the entire panel to provide transparency effects
+ panelArea = new QWidget(this);
+ QBoxLayout *tmp = new QBoxLayout(QBoxLayout::LeftToRight);
+ tmp->setContentsMargins(0,0,0,0);
+ this->setLayout(tmp);
+ tmp->addWidget(panelArea);
+ settings = file;
+ screennum = scr;
+ panelnum = num; //save for later
+ screen = LSession::desktop();
+ PPREFIX = "panel"+QString::number(screennum)+"."+QString::number(num)+"/";
+ defaultpanel = (LSession::handle()->screenGeom(screennum).x()==0 && num==0);
+ horizontal=true; //use this by default initially
+ hidden = false; //use this by default
+ //Setup the panel
+ if(DEBUG){ qDebug() << " -- Setup Panel"; }
+ this->setContentsMargins(0,0,0,0);
+ this->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ //panels cannot get keyboard focus otherwise it upsets the task manager window detection
+ this->setAttribute(Qt::WA_X11DoNotAcceptFocus);
+ this->setAttribute(Qt::WA_X11NetWmWindowTypeDock);
+ this->setAttribute(Qt::WA_AlwaysShowToolTips);
+ this->setWindowFlags(Qt::FramelessWindowHint | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint);
+ //this->setWindowFlags(Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint);
+
+ this->setWindowTitle("LuminaPanel");
+ this->setObjectName("LuminaPanelBackgroundWidget");
+ this->setStyleSheet("QToolButton::menu-indicator{ image: none; }");
+ panelArea->setObjectName("LuminaPanelColor");
+ layout = new QBoxLayout(QBoxLayout::LeftToRight);
+ layout->setContentsMargins(0,0,0,0);
+ layout->setSpacing(1);
+ //layout->setSizeConstraint(QLayout::SetFixedSize);
+ panelArea->setLayout(layout);
+ //Set special window flags on the panel for proper usage
+ this->show();
+ LSession::handle()->XCB->SetAsPanel(this->winId());
+ LSession::handle()->XCB->SetAsSticky(this->winId());
+
+ QTimer::singleShot(1,this, SLOT(UpdatePanel()) ); //start this in a new thread
+ //connect(screen, SIGNAL(resized(int)), this, SLOT(UpdatePanel()) ); //in case the screen resolution changes
+}
+
+LPanel::~LPanel(){
+
+}
+
+void LPanel::prepareToClose(){
+ //Go through and remove all the plugins
+ for(int i=0; i<PLUGINS.length(); i++){
+ PLUGINS[i]->AboutToClose(); //any last cleanup for this plugin
+ layout->takeAt(i); //remove from the layout
+ PLUGINS.takeAt(i)->deleteLater(); //delete the actual widget
+ LSession::processEvents();
+ i--; //need to back up one space to not miss another plugin
+ }
+ this->hide();
+}
+
+void LPanel::scalePanel(double xscale, double yscale){
+ int ht = settings->value(PPREFIX+"height", 30).toInt(); //this is technically the distance into the screen from the edge
+ QString loc = settings->value(PPREFIX+"location","").toString().toLower();
+ if(loc=="top" || loc=="bottom"){
+ ht = qRound(ht*yscale);
+ }else{
+ ht = qRound(ht*xscale);
+ }
+ settings->setValue(PPREFIX+"height", ht);
+ settings->sync();
+ QTimer::singleShot(0, this, SLOT(UpdatePanel()) );
+}
+
+//===========
+// PUBLIC SLOTS
+//===========
+void LPanel::UpdatePanel(bool geomonly){
+ //Create/Update the panel as designated in the Settings file
+ settings->sync(); //make sure to catch external settings changes
+ //First set the geometry of the panel and send the EWMH message to reserve that space
+ if(DEBUG){ qDebug() << "Update Panel: Geometry only=" << geomonly << "Screen Size:" << LSession::handle()->screenGeom(screennum); }
+ hidden = settings->value(PPREFIX+"hidepanel",false).toBool();
+ QString loc = settings->value(PPREFIX+"location","").toString().toLower();
+ if(loc.isEmpty() && defaultpanel){ loc="top"; }
+ if(loc=="top" || loc=="bottom"){
+ horizontal=true;
+ layout->setAlignment(Qt::AlignLeft);
+ layout->setDirection(QBoxLayout::LeftToRight);
+ }else{
+ horizontal=false;
+ layout->setAlignment(Qt::AlignTop);
+ layout->setDirection(QBoxLayout::TopToBottom);
+ }
+ int ht = settings->value(PPREFIX+"height", 30).toInt(); //this is technically the distance into the screen from the edge
+ if(ht<=1){ ht = 30; } //some kind of error in the saved height - use the default value
+ int hidesize = qRound(ht*0.01); //use 1% of the panel size
+ if(hidesize<2){ hidesize=2; } //minimum of 2 pixels (need space for the mouse to go over it)
+ if(hidden){ viswidth = hidesize; }
+ else{ viswidth = ht; }
+ if(DEBUG){ qDebug() << "Hidden Panel size:" << hidesize << "pixels"; }
+ //qDebug() << " - set Geometry";
+ int xwid = LSession::handle()->screenGeom(screennum).width();
+ int xhi = LSession::handle()->screenGeom(screennum).height();
+ int xloc = LSession::handle()->screenGeom(screennum).x();
+ double panelPercent = settings->value(PPREFIX+"lengthPercent",100).toInt();
+ if(panelPercent<1 || panelPercent>100){ panelPercent = 100; }
+ panelPercent = panelPercent/100.0;
+ QString panelPinLoc = settings->value(PPREFIX+"pinLocation","center").toString().toLower(); //[left/right/center] possible values (assume center otherwise)
+ if(DEBUG){ qDebug() << " - Panel settings:" << QString::number(panelPercent)+QString("%") << panelPinLoc << loc; }
+ //xloc=xoffset;
+ if(loc=="top"){ //top of screen
+ QSize sz = QSize(xwid*panelPercent, ht);
+ if(panelPinLoc=="left"){} // no change to xloc
+ else if(panelPinLoc=="right"){ xloc = xloc+xwid-sz.width(); }
+ else{ xloc = xloc+((xwid-sz.width())/2) ; } //centered
+ //qDebug() << " - Panel Sizing:" << xloc << sz;
+ this->setMinimumSize(sz);
+ this->setMaximumSize(sz);
+ this->setGeometry(xloc,0,sz.width(), sz.height());
+ //qDebug() << " - Reserve Panel Localation";
+ if(!hidden){ LSession::handle()->XCB->ReserveLocation(this->winId(), this->geometry(), "top"); }
+ else{
+ LSession::handle()->XCB->ReserveLocation(this->winId(), QRect(xloc, 0, this->width(), hidesize), "top");
+ hidepoint = QPoint(xloc, hidesize-ht);
+ showpoint = QPoint(xloc, 0);
+ this->move(hidepoint); //Could bleed over onto the screen above
+ }
+ }else if(loc=="bottom"){ //bottom of screen
+ QSize sz = QSize(xwid*panelPercent, ht);
+ if(panelPinLoc=="left"){} // no change to xloc
+ else if(panelPinLoc=="right"){ xloc = xloc+xwid-sz.width(); }
+ else{ xloc = xloc+((xwid-sz.width())/2) ; } //centered
+ this->setMinimumSize(sz);
+ this->setMaximumSize(sz);
+ this->setGeometry(xloc,xhi-ht,sz.width(), ht );
+ if(!hidden){ LSession::handle()->XCB->ReserveLocation(this->winId(), this->geometry(), "bottom"); }
+ else{
+ LSession::handle()->XCB->ReserveLocation(this->winId(), QRect(xloc, xhi-hidesize, this->width(), hidesize), "bottom");
+ hidepoint = QPoint(xloc, xhi-hidesize);
+ showpoint = QPoint(xloc, xhi-ht);
+ this->move(hidepoint); //Could bleed over onto the screen below
+ }
+ }else if(loc=="left"){ //left side of screen
+ QSize sz = QSize(ht, xhi*panelPercent);
+ int yloc = 0;
+ if(panelPinLoc=="left"){} //this is actually the top (left of center in length dimension)
+ else if(panelPinLoc=="right"){ yloc = yloc+xhi-sz.height(); }
+ else{ yloc = yloc+((xhi-sz.height())/2) ; } //centered
+ this->setMinimumSize(sz);
+ this->setMaximumSize(sz);
+ this->setGeometry(xloc,yloc, ht, sz.height());
+ if(!hidden){ LSession::handle()->XCB->ReserveLocation(this->winId(), this->geometry(), "left"); }
+ else{
+ LSession::handle()->XCB->ReserveLocation(this->winId(), QRect(xloc, yloc, hidesize, sz.height()), "left");
+ hidepoint = QPoint(xloc-ht+hidesize, yloc);
+ showpoint = QPoint(xloc, yloc);
+ this->move(hidepoint); //Could bleed over onto the screen left
+ }
+ }else{ //right side of screen
+ QSize sz = QSize(ht, xhi*panelPercent);
+ int yloc = 0;
+ if(panelPinLoc=="left"){} //this is actually the top (left of center in length dimension)
+ else if(panelPinLoc=="right"){ yloc = yloc+xhi-sz.height(); }
+ else{ yloc = yloc+((xhi-sz.height())/2) ; } //centered
+ this->setMinimumSize(sz);
+ this->setMaximumSize(sz);
+ this->setGeometry(xloc+xwid-ht,yloc,ht, sz.height());
+ if(!hidden){ LSession::handle()->XCB->ReserveLocation(this->winId(), this->geometry(), "right"); }
+ else{
+ LSession::handle()->XCB->ReserveLocation(this->winId(), QRect(xloc+xwid-hidesize, yloc, hidesize, sz.height()), "right");
+ hidepoint = QPoint(xloc+xwid-hidesize, yloc);
+ showpoint = QPoint(xloc+xwid-ht, yloc);
+ this->move(hidepoint); //Could bleed over onto the screen right
+ }
+ }
+ if(DEBUG){ qDebug() << " - Done with panel geometry"; }
+ if(geomonly){ return; }
+ //Now update the appearance of the toolbar
+ if(settings->value(PPREFIX+"customColor", false).toBool()){
+ QString color = settings->value(PPREFIX+"color", "rgba(255,255,255,160)").toString();
+ QString style = "QWidget#LuminaPanelColor{ background: %1; border-radius: 3px; border: 1px solid %1; }";
+ style = style.arg(color);
+ panelArea->setStyleSheet(style);
+ }else{
+ panelArea->setStyleSheet(""); //clear it and use the one from the theme
+ }
+
+ //Then go through the plugins and create them as necessary
+ QStringList plugins = settings->value(PPREFIX+"pluginlist", QStringList()).toStringList();
+ /*if(defaultpanel && plugins.isEmpty()){
+ plugins << "userbutton" << "taskmanager" << "spacer" << "systemtray" << "clock" << "systemdashboard";
+ }*/
+ if(DEBUG){ qDebug() << " - Initialize Plugins: " << plugins; }
+ for(int i=0; i<plugins.length(); i++){
+ //Ensure this plugin has a unique ID (NOTE: this numbering does not persist between sessions)
+ if(!plugins[i].contains("---")){
+ int num=1;
+ while( plugins.contains(plugins[i]+"---"+QString::number(screennum)+"."+QString::number(this->number())+"."+QString::number(num)) ){
+ num++;
+ }
+
+ plugins[i] = plugins[i]+"---"+QString::number(screennum)+"."+QString::number(this->number())+"."+QString::number(num);
+ //qDebug() << "Adjust Plugin ID:" << plugins[i];
+ }
+ //See if this plugin is already there or in a different spot
+ bool found = false;
+ for(int p=0; p<PLUGINS.length(); p++){
+ if(PLUGINS[p]->type()==plugins[i]){
+ found = true; //already exists
+ //Make sure the plugin layout has the correct orientation
+ if(horizontal){PLUGINS[p]->layout()->setDirection(QBoxLayout::LeftToRight); }
+ else{ PLUGINS[p]->layout()->setDirection(QBoxLayout::TopToBottom); }
+ QTimer::singleShot(0,PLUGINS[p], SLOT( OrientationChange() ) );
+ //Now check the location of the plugin in the panel
+ if(p!=i){ //wrong place in the panel
+ layout->takeAt(p); //remove the item from the current location
+ layout->insertWidget(i, PLUGINS[p]); //add the item into the correct location
+ PLUGINS.move(p,i); //move the identifier in the list to match
+ }
+ break;
+ }
+ }
+ if(!found){
+ //New Plugin
+ if(DEBUG){ qDebug() << " -- New Plugin:" << plugins[i] << i; }
+ LPPlugin *plug = NewPP::createPlugin(plugins[i], panelArea, horizontal);
+ if(plug != 0){
+ PLUGINS.insert(i, plug);
+ layout->insertWidget(i, PLUGINS[i]);
+ connect(plug, SIGNAL(MenuClosed()), this, SLOT(checkPanelFocus()));
+ }else{
+ //invalid plugin type
+ plugins.removeAt(i); //remove this invalid plugin from the list
+ i--; //make sure we don't miss the next item with the re-order
+ }
+ }
+ LSession::processEvents();
+ }
+ //Now remove any extra plugins from the end
+ //qDebug() << "plugins:" << plugins;
+ //qDebug() << "PLUGINS length:" << PLUGINS.length();
+ for(int i=0; i<PLUGINS.length(); i++){
+ if(plugins.contains(PLUGINS[i]->type())){ continue; } //good plugin - skip it
+ if(DEBUG){ qDebug() << " -- Remove Plugin: " << PLUGINS[i]->type(); }
+ //If this is the system tray - stop it first
+ if( PLUGINS[i]->type().startsWith("systemtray---") ){
+ static_cast<LSysTray*>(PLUGINS[i])->stop();
+ }
+ layout->takeAt(i); //remove from the layout
+ PLUGINS.takeAt(i)->deleteLater(); //delete the actual widget
+ LSession::processEvents();
+ i--; //need to back up one space to not miss another plugin
+ }
+ this->update();
+ this->show(); //make sure the panel is visible now
+ if(hidden){ this->move(hidepoint); }
+ //Now go through and send the orientation update signal to each plugin
+ for(int i=0; i<PLUGINS.length(); i++){
+ QTimer::singleShot(0,PLUGINS[i], SLOT(OrientationChange()));
+ }
+ LSession::processEvents();
+}
+
+void LPanel::UpdateLocale(){
+ //The panel itself has no text to translate, just forward the signal to all the plugins
+ for(int i=0; i<PLUGINS.length(); i++){
+ QTimer::singleShot(1,PLUGINS[i], SLOT(LocaleChange()));
+ }
+}
+
+void LPanel::UpdateTheme(){
+ //The panel itself has no theme-based icons, just forward the signal to all the plugins
+ for(int i=0; i<PLUGINS.length(); i++){
+ QTimer::singleShot(1,PLUGINS[i], SLOT(ThemeChange()));
+ }
+}
+
+// ===================
+// PRIVATE SLOTS
+// ===================
+void LPanel::checkPanelFocus(){
+ if( !this->geometry().contains(QCursor::pos()) ){
+ //Move the panel back to it's "hiding" spot
+ if(hidden){ this->move(hidepoint); this->update(); }
+ //Re-active the old window
+ if(LSession::handle()->activeWindow()!=0){
+ LSession::handle()->XCB->ActivateWindow(LSession::handle()->activeWindow());
+ }
+ }
+
+}
+
+//===========
+// PROTECTED
+//===========
+void LPanel::paintEvent(QPaintEvent *event){
+ QPainter *painter = new QPainter(this);
+ //qDebug() << "Paint Tray:";
+ //Make sure the base background of the event rectangle is the associated rectangle from the BGWindow
+ QRect rec = this->geometry(); //start with the global geometry of the panel
+ //Need to translate that rectangle to the background image coordinates
+ //qDebug() << " - Rec:" << rec << hidden << this->geometry();
+ rec.moveTo( rec.x()-LSession::handle()->screenGeom(screennum).x(), rec.y() );
+ //qDebug() << " - Adjusted Global Rec:" << rec;
+ painter->drawPixmap(QRect(0,0,this->width(), this->height()), bgWindow->grab(rec) );
+ QWidget::paintEvent(event); //now pass the event along to the normal painting event
+}
+
+void LPanel::enterEvent(QEvent *event){
+ //qDebug() << "Panel Enter Event:";
+ if(hidden){
+ //Move the panel out so it is fully available
+ this->move(showpoint);
+ this->update();
+ }
+ this->activateWindow();
+ event->accept(); //just to quiet the compile warning
+}
+
+void LPanel::leaveEvent(QEvent *event){
+ /*qDebug() << "Panel Leave Event:";
+ qDebug() << "Panel Geom:" << this->geometry().x() << this->geometry().y() << this->geometry().width() << this->geometry().height() ;
+ QPoint pt = QCursor::pos();
+ qDebug() << "Mouse Point (global):" << pt.x() << pt.y();
+ //pt = this->mapFromGlobal(pt);
+ //qDebug() << "Mouse Point (local):" << pt.x() << pt.y();
+ qDebug() << "Contained:" << this->geometry().contains(pt);*/
+ checkPanelFocus();
+ event->accept(); //just to quiet the compile warning
+}
+
diff --git a/src-qt5/core/lumina-desktop/LPanel.h b/src-qt5/core/lumina-desktop/LPanel.h
new file mode 100644
index 00000000..396ffecc
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/LPanel.h
@@ -0,0 +1,77 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This is the generic class for creating a full-width panel that stays
+// on top of all other windows (top or bottom of the screen only)
+//===========================================
+#ifndef _LUMINA_DESKTOP_PANEL_H
+#define _LUMINA_DESKTOP_PANEL_H
+
+#include <QWidget>
+#include <QBoxLayout>
+#include <QSettings>
+#include <QString>
+#include <QStringList>
+#include <QTimer>
+#include <QMoveEvent>
+#include <QDesktopWidget>
+#include <QPainter>
+#include <QPaintEvent>
+
+#include "panel-plugins/NewPP.h"
+#include "panel-plugins/LPPlugin.h"
+
+#include <LuminaX11.h>
+#include <LuminaOS.h>
+
+class LPanel : public QWidget{
+ Q_OBJECT
+private:
+ QBoxLayout *layout;
+ QSettings *settings;
+ QString PPREFIX; //internal prefix for all settings
+ QDesktopWidget *screen;
+ QWidget *bgWindow, *panelArea;
+ QPoint hidepoint, showpoint; //for hidden panels: locations when hidden/visible
+ bool defaultpanel, horizontal, hidden;
+ int screennum;
+ int panelnum;
+ int viswidth;
+ QList<LPPlugin*> PLUGINS;
+
+public:
+ LPanel(QSettings *file, int scr = 0, int num =0, QWidget *parent=0); //settings file, screen number, panel number
+ ~LPanel();
+
+ int number(){
+ return panelnum;
+ }
+
+ QString prefix(){
+ return PPREFIX;
+ }
+
+ int visibleWidth(){
+ return viswidth;
+ }
+ void prepareToClose();
+ void scalePanel(double xscale, double yscale);
+
+public slots:
+ void UpdatePanel(bool geomonly = false); //Load the settings file and update the panel appropriately
+ void UpdateLocale(); //Locale Changed externally
+ void UpdateTheme(); //Theme Changed externally
+
+private slots:
+ void checkPanelFocus();
+
+protected:
+ void paintEvent(QPaintEvent *event);
+ void enterEvent(QEvent *event);
+ void leaveEvent(QEvent *event);
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/LSession.cpp b/src-qt5/core/lumina-desktop/LSession.cpp
new file mode 100644
index 00000000..d4146e77
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/LSession.cpp
@@ -0,0 +1,895 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LSession.h"
+#include <LuminaOS.h>
+
+#include <QTime>
+#include <QScreen>
+#include <QtConcurrent>
+#include "LXcbEventFilter.h"
+#include "BootSplash.h"
+
+//LibLumina X11 class
+#include <LuminaX11.h>
+#include <LuminaUtils.h>
+
+#include <unistd.h> //for usleep() usage
+
+#ifndef DEBUG
+#define DEBUG 0
+#endif
+
+XCBEventFilter *evFilter = 0;
+
+LSession::LSession(int &argc, char ** argv) : LSingleApplication(argc, argv, "lumina-desktop"){
+ if(this->isPrimaryProcess()){
+ connect(this, SIGNAL(InputsAvailable(QStringList)), this, SLOT(NewCommunication(QStringList)) );
+ this->setApplicationName("Lumina Desktop Environment");
+ this->setApplicationVersion( LUtils::LuminaDesktopVersion() );
+ this->setOrganizationName("LuminaDesktopEnvironment");
+ this->setQuitOnLastWindowClosed(false); //since the LDesktop's are not necessarily "window"s
+ //Enabled a few of the simple effects by default
+ this->setEffectEnabled( Qt::UI_AnimateMenu, true);
+ this->setEffectEnabled( Qt::UI_AnimateCombo, true);
+ this->setEffectEnabled( Qt::UI_AnimateTooltip, true);
+ //this->setAttribute(Qt::AA_UseDesktopOpenGL);
+ //this->setAttribute(Qt::AA_UseHighDpiPixmaps); //allow pixmaps to be scaled up as well as down
+ //this->setStyle( new MenuProxyStyle); //QMenu icon size override
+ SystemTrayID = 0; VisualTrayID = 0;
+ sysWindow = 0;
+ TrayDmgEvent = 0;
+ TrayDmgError = 0;
+ lastActiveWin = 0;
+ cleansession = true;
+ TrayStopping = false;
+ screenTimer = new QTimer(this);
+ screenTimer->setSingleShot(true);
+ screenTimer->setInterval(1000); //2 seconds - This needs to be long(ish) to prevent being called while
+ // X is still setting up any screens
+ connect(screenTimer, SIGNAL(timeout()), this, SLOT(updateDesktops()) );
+ 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;
+ settingsmenu = 0;
+ currTranslator=0;
+ mediaObj=0;
+ sessionsettings=0;
+ //Setup the event filter for Qt5
+ evFilter = new XCBEventFilter(this);
+ this->installNativeEventFilter( evFilter );
+ } //end check for primary process
+}
+
+LSession::~LSession(){
+ if(this->isPrimaryProcess()){
+ WM->stopWM();
+ for(int i=0; i<DESKTOPS.length(); i++){
+ delete DESKTOPS[i];
+ }
+ delete WM;
+ delete settingsmenu;
+ delete appmenu;
+ delete currTranslator;
+ if(mediaObj!=0){delete mediaObj;}
+ }
+}
+
+void LSession::setupSession(){
+ BootSplash splash;
+ splash.showScreen("init");
+ qDebug() << "Initializing Session";
+ if(QFile::exists("/tmp/.luminastopping")){ QFile::remove("/tmp/.luminastopping"); }
+ QTime* timer = 0;
+ if(DEBUG){ timer = new QTime(); timer->start(); qDebug() << " - Init srand:" << timer->elapsed();}
+ //Seed random number generator (if needed)
+ qsrand( QTime::currentTime().msec() );
+ //Setup the QSettings default paths
+ splash.showScreen("settings");
+ if(DEBUG){ qDebug() << " - Init QSettings:" << timer->elapsed();}
+ QSettings::setPath(QSettings::NativeFormat, QSettings::UserScope, QDir::homePath()+"/.lumina");
+ sessionsettings = new QSettings("LuminaDE", "sessionsettings");
+ DPlugSettings = new QSettings("pluginsettings","desktopsettings");
+ //Load the proper translation files
+ if(sessionsettings->value("ForceInitialLocale",false).toBool()){
+ //Some system locale override it in place - change the env first
+ LUtils::setLocaleEnv( sessionsettings->value("InitLocale/LANG","").toString(), \
+ sessionsettings->value("InitLocale/LC_MESSAGES","").toString(), \
+ sessionsettings->value("InitLocale/LC_TIME","").toString(), \
+ sessionsettings->value("InitLocale/LC_NUMERIC","").toString(), \
+ sessionsettings->value("InitLocale/LC_MONETARY","").toString(), \
+ sessionsettings->value("InitLocale/LC_COLLATE","").toString(), \
+ sessionsettings->value("InitLocale/LC_CTYPE","").toString() );
+ }
+ currTranslator = LUtils::LoadTranslation(this, "lumina-desktop");
+//use the system settings
+ //Setup the user's lumina settings directory as necessary
+ splash.showScreen("user");
+ if(DEBUG){ qDebug() << " - Init User Files:" << timer->elapsed();}
+ checkUserFiles(); //adds these files to the watcher as well
+
+ //Initialize the internal variables
+ DESKTOPS.clear();
+ //savedScreens.clear();
+ //for(int i=0; i<this->desktop()->screenCount(); i++){ savedScreens << this->desktop()->screenGeometry(i); }
+
+ //Start the background system tray
+ splash.showScreen("systray");
+ if(DEBUG){ qDebug() << " - Init System Tray:" << timer->elapsed();}
+ startSystemTray();
+
+ //Launch Fluxbox
+ splash.showScreen("wm");
+ if(DEBUG){ qDebug() << " - Init WM:" << timer->elapsed();}
+ WM = new WMProcess();
+ WM->startWM();
+
+ //Initialize the global menus
+ qDebug() << " - Initialize system menus";
+ splash.showScreen("apps");
+ if(DEBUG){ qDebug() << " - Init AppMenu:" << timer->elapsed();}
+ 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();}
+ desktopFiles = QDir(QDir::homePath()+"/Desktop").entryInfoList(QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs, QDir::Name | QDir::IgnoreCase | QDir::DirsFirst);
+ updateDesktops();
+
+ //Now setup the system watcher for changes
+ splash.showScreen("final");
+ qDebug() << " - Initialize file system watcher";
+ if(DEBUG){ qDebug() << " - Init QFileSystemWatcher:" << timer->elapsed();}
+ watcher = new QFileSystemWatcher(this);
+ //watcher->addPath( QDir::homePath()+"/.lumina/stylesheet.qss" );
+ watcher->addPath( QDir::homePath()+"/.lumina/LuminaDE/sessionsettings.conf" );
+ watcher->addPath( QDir::homePath()+"/.lumina/LuminaDE/desktopsettings.conf" );
+ watcher->addPath( QDir::homePath()+"/.lumina/fluxbox-init" );
+ watcher->addPath( QDir::homePath()+"/.lumina/fluxbox-keys" );
+ watcher->addPath( QDir::homePath()+"/Desktop" );
+
+ //connect internal signals/slots
+ connect(this->desktop(), SIGNAL(screenCountChanged(int)), this, SLOT(screensChanged()) );
+ connect(this->desktop(), SIGNAL(resized(int)), this, SLOT(screenResized(int)) );
+ 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() << " - Init Finished:" << timer->elapsed(); delete timer;}
+ QApplication::processEvents();
+ launchStartupApps();
+ //QTimer::singleShot(500, this, SLOT(launchStartupApps()) );
+ //QApplication::processEvents();
+ splash.close();
+}
+
+void LSession::CleanupSession(){
+ //Close any running applications and tray utilities (Make sure to keep the UI interactive)
+ LSession::processEvents();
+ QDateTime time = QDateTime::currentDateTime();
+ qDebug() << "Start closing down the session: " << time.toString( Qt::SystemLocaleShortDate);
+ //Create a temporary flag to prevent crash dialogs from opening during cleanup
+ LUtils::writeFile("/tmp/.luminastopping",QStringList() << "yes", true);
+ //Start the logout chimes (if necessary)
+ LOS::setAudioVolume( LOS::audioVolume() ); //make sure the audio volume is saved in the backend for the next login
+ bool playaudio = sessionsettings->value("PlayLogoutAudio",true).toBool();
+ if( playaudio ){ playAudioFile(LOS::LuminaShare()+"Logout.ogg"); }
+ //Stop the background system tray (detaching/closing apps as necessary)
+ stopSystemTray(!cleansession);
+ //Now perform any other cleanup
+ if(cleansession){
+ //Close any open windows
+ //qDebug() << " - Closing any open windows";
+ QList<WId> WL = XCB->WindowList(true);
+ for(int i=0; i<WL.length(); i++){
+ qDebug() << " - Closing window:" << XCB->WindowClass(WL[i]) << WL[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++){
+ qDebug() << " - Window did not close, killing application:" << XCB->WindowClass(WL[i]) << WL[i];
+ XCB->KillClient(WL[i]);
+ LSession::processEvents();
+ }
+ }
+ evFilter->StopEventHandling();
+ //Stop the window manager
+ qDebug() << " - Stopping the window manager";
+ WM->stopWM();
+ //Now close down the desktop
+ qDebug() << " - Closing down the desktop elements";
+ 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
+ if(playaudio){
+ //wait a max of 3 seconds for audio to finish
+ bool waitmore = true;
+ for(int i=0; i<60 && waitmore; i++){
+ usleep(50000); //50ms = 50000 us
+ waitmore = (mediaObj->state()==QMediaPlayer::PlayingState);
+ //waitmore = !audioThread->wait(500);
+ LSession::processEvents();
+ }
+ if(waitmore){ mediaObj->stop(); } //timed out
+ }else{
+ for(int i=0; i<20; i++){ LSession::processEvents(); usleep(25000); } //1/2 second pause
+ }
+ //Clean up the temporary flag
+ if(QFile::exists("/tmp/.luminastopping")){ QFile::remove("/tmp/.luminastopping"); }
+ //if(audioThread!=0){ audioThread->exit(0); }
+}
+
+int LSession::VersionStringToNumber(QString version){
+ version = version.section("-",0,0); //trim any extra labels off the end
+ int maj, mid, min; //major/middle/minor version numbers (<Major>.<Middle>.<Minor>)
+ maj = mid = min = 0;
+ bool ok = true;
+ maj = version.section(".",0,0).toInt(&ok);
+ if(ok){ mid = version.section(".",1,1).toInt(&ok); }else{ maj = 0; }
+ if(ok){ min = version.section(".",2,2).toInt(&ok); }else{ mid = 0; }
+ if(!ok){ min = 0; }
+ //Now assemble the number
+ //NOTE: This format allows numbers to be anywhere from 0->999 without conflict
+ return (maj*1000000 + mid*1000 + min);
+}
+
+void LSession::NewCommunication(QStringList list){
+ if(DEBUG){ qDebug() << "New Communications:" << list; }
+ for(int i=0; i<list.length(); i++){
+ if(list[i]=="--check-geoms"){
+ screensChanged();
+ }
+ }
+}
+
+void LSession::launchStartupApps(){
+ //First start any system-defined startups, then do user defined
+ qDebug() << "Launching startup applications";
+
+ //Enable Numlock
+ if(LUtils::isValidBinary("numlockx")){ //make sure numlockx is installed
+ if(sessionsettings->value("EnableNumlock",false).toBool()){
+ QProcess::startDetached("numlockx on");
+ }else{
+ QProcess::startDetached("numlockx off");
+ }
+ }
+ int tmp = LOS::ScreenBrightness();
+ if(tmp>0){
+ LOS::setScreenBrightness( tmp );
+ qDebug() << " - - Screen Brightness:" << QString::number(tmp)+"%";
+ }
+ QProcess::startDetached("nice lumina-open -autostart-apps");
+
+ //Re-load the screen brightness and volume settings from the previous session
+ // Wait until after the XDG-autostart functions, since the audio system might be started that way
+ qDebug() << " - Loading previous settings";
+ tmp = LOS::audioVolume();
+ LOS::setAudioVolume(tmp);
+ qDebug() << " - - Audio Volume:" << QString::number(tmp)+"%";
+
+ //Now play the login music since we are finished
+ if(sessionsettings->value("PlayStartupAudio",true).toBool()){
+ //Make sure to re-set the system volume to the last-used value at outset
+ int vol = LOS::audioVolume();
+ if(vol>=0){ LOS::setAudioVolume(vol); }
+ LSession::playAudioFile(LOS::LuminaShare()+"Login.ogg");
+ }
+ qDebug() << " - Finished with startup routines";
+}
+
+void LSession::StartLogout(){
+ CleanupSession();
+ QCoreApplication::exit(0);
+}
+
+void LSession::StartShutdown(){
+ CleanupSession();
+ LOS::systemShutdown();
+ QCoreApplication::exit(0);
+}
+
+void LSession::StartReboot(){
+ CleanupSession();
+ LOS::systemRestart();
+ QCoreApplication::exit(0);
+}
+
+void LSession::reloadIconTheme(){
+ //Wait a moment for things to settle before sending out the signal to the interfaces
+ QApplication::processEvents();
+ QApplication::processEvents();
+ emit IconThemeChanged();
+}
+
+void LSession::watcherChange(QString changed){
+ if(DEBUG){ qDebug() << "Session Watcher Change:" << changed; }
+ if(changed.endsWith("fluxbox-init") || changed.endsWith("fluxbox-keys")){ refreshWindowManager(); }
+ else if(changed.endsWith("sessionsettings.conf") ){ sessionsettings->sync(); emit SessionConfigChanged(); }
+ else if(changed.endsWith("desktopsettings.conf") ){ emit DesktopConfigChanged(); }
+ else if(changed == QDir::homePath()+"/Desktop"){
+ desktopFiles = QDir(QDir::homePath()+"/Desktop").entryInfoList(QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs ,QDir::Name | QDir::IgnoreCase | QDir::DirsFirst);
+ if(DEBUG){ qDebug() << "New Desktop Files:" << desktopFiles.length(); }
+ emit DesktopFilesChanged();
+ }
+ //Now ensure this file was not removed from the watcher
+ if(!watcher->files().contains(changed) && !watcher->directories().contains(changed)){
+ watcher->addPath(changed);
+ }
+ /*QStringList files = watcher->files();
+ if(files.length() < 5){
+ qDebug() << " - Resetting Watched Files...";
+ watcher->removePaths(files); //clear the current files before re-setting them
+ watcher->addPath( QDir::homePath()+"/.lumina/LuminaDE/sessionsettings.conf" );
+ watcher->addPath( QDir::homePath()+"/.lumina/LuminaDE/desktopsettings.conf" );
+ watcher->addPath( QDir::homePath()+"/.lumina/fluxbox-init" );
+ watcher->addPath( QDir::homePath()+"/.lumina/fluxbox-keys" );
+ watcher->addPath( QDir::homePath()+"/Desktop");
+ }*/
+}
+
+void LSession::screensChanged(){
+ qDebug() << "Screen Number Changed";
+ if(screenTimer->isActive()){ screenTimer->stop(); }
+ screenTimer->start();
+ //updateDesktops();
+}
+
+void LSession::screenResized(int scrn){
+ qDebug() << "Screen Resized:" << scrn; // << this->desktop()->screenGeometry(scrn);
+ /*for(int i=0; i<DESKTOPS.length(); i++){
+ if(DESKTOPS[i]->Screen() == scrn){ DESKTOPS[i]->UpdateGeometry(); return; }
+ }*/
+ if(screenTimer->isActive()){ screenTimer->stop(); }
+ screenTimer->start();
+ //updateDesktops();
+}
+
+void LSession::checkWindowGeoms(){
+ //Only do one window per run (this will be called once per new window - with time delays between)
+ if(checkWin.isEmpty()){ return; }
+ WId win = checkWin.takeFirst();
+ if(RunningApps.contains(win) ){ //just to make sure it did not close during the delay
+ adjustWindowGeom( win );
+ }
+}
+
+void LSession::checkUserFiles(){
+ //internal version conversion examples:
+ // [1.0.0 -> 1000000], [1.2.3 -> 1002003], [0.6.1 -> 6001]
+ QString OVS = sessionsettings->value("DesktopVersion","0").toString(); //Old Version String
+ int oldversion = VersionStringToNumber(OVS);
+ int nversion = VersionStringToNumber(this->applicationVersion());
+ bool newversion = ( oldversion < VersionStringToNumber(this->applicationVersion()) ); //increasing version number
+ bool newrelease = ( OVS.contains("-devel", Qt::CaseInsensitive) && this->applicationVersion().contains("-release", Qt::CaseInsensitive) ); //Moving from devel to release
+
+ //Check for the desktop settings file
+ QString dset = QDir::homePath()+"/.lumina/LuminaDE/desktopsettings.conf";
+ bool firstrun = false;
+ if(!QFile::exists(dset) || oldversion < 5000){
+ if( oldversion < 5000 ){ QFile::remove(dset); qDebug() << "Current desktop settings obsolete: Re-implementing defaults"; }
+ else{ firstrun = true; }
+ LUtils::LoadSystemDefaults();
+ }
+ //Convert the favorites framework as necessary (change occured with 0.8.4)
+ if(newversion || newrelease){
+ LUtils::upgradeFavorites(oldversion);
+ }
+ //Convert any "userbutton" and "appmenu" panel plugins to the new "systemstart" plugin (0.8.7)
+ if(oldversion <= 8007 && (newversion || newrelease) && nversion < 8008){
+ QSettings dset(QSettings::UserScope, "LuminaDE","desktopsettings", this);
+ QStringList plugKeys = dset.allKeys().filter("panel").filter("/pluginlist");
+ for(int i=0; i<plugKeys.length(); i++){
+ QStringList plugs = dset.value(plugKeys[i],QStringList()).toStringList();
+ //Do the appmenu/userbutton -> systemstart conversion
+ plugs = plugs.join(";;;;").replace("userbutton","systemstart").replace("appmenu","systemstart").split(";;;;");
+ //Remove any system dashboard plugins
+ plugs.removeAll("systemdashboard");
+ //Now save that back to the file
+ dset.setValue(plugKeys[i], plugs);
+ }
+ //Also remove any "desktopview" desktop plugin and enable the automatic desktop icons instead
+ plugKeys = dset.allKeys().filter("desktop-").filter("/pluginlist");
+ for(int i=0; i<plugKeys.length(); i++){
+ QStringList plugs = dset.value(plugKeys[i], QStringList()).toStringList();
+ QStringList old = plugs.filter("desktopview");
+ bool found = !old.isEmpty();
+ for(int j=0; j<old.length(); j++){ plugs.removeAll(old[j]); }
+ if(found){
+ dset.setValue(plugKeys[i],plugs); //save the modified plugin list
+ //Also set the auto-generate flag on this desktop
+ dset.setValue(plugKeys[i].section("/",0,0)+"/generateDesktopIcons", true);
+ }
+ }
+ dset.sync();
+ //Due to the grid size change for desktop plugins, need to remove any old plugin geometries
+ if(QFile::exists(QDir::homePath()+"/.lumina/pluginsettings/desktopsettings.conf")){
+ QFile::remove(QDir::homePath()+"/.lumina/pluginsettings/desktopsettings.conf");
+ }
+ }
+
+ //Convert to the XDG autostart spec as necessary (Change occured with 0.8.5)
+ if(QFile::exists(QDir::homePath()+"/.lumina/startapps") ){
+ QStringList cmds = LUtils::readFile(QDir::homePath()+"/.lumina/startapps");
+ for(int i=0; i<cmds.length(); i++){
+ cmds[i] = cmds[i].remove("lumina-open").simplified(); //remove the file opener
+ if(cmds[i].startsWith("#") || cmds[i].isEmpty()){ continue; } //invalid line
+
+ LXDG::setAutoStarted(true, cmds[i]);
+ }
+ QFile::remove(QDir::homePath()+"/.lumina/startapps"); //delete the old file
+ }
+
+ //Check for the default applications file for lumina-open
+ dset = QDir::homePath()+"/.lumina/LuminaDE/lumina-open.conf";
+ if(!QFile::exists(dset)){
+ firstrun = true;
+ /*if(QFile::exists(LOS::LuminaShare()+"defaultapps.conf")){
+ if( QFile::copy(LOS::LuminaShare()+"defaultapps.conf", dset) ){
+ QFile::setPermissions(dset, QFile::ReadUser | QFile::WriteUser | QFile::ReadOwner | QFile::WriteOwner);
+ }
+ }*/
+
+ }
+ //Check the fluxbox configuration files
+ dset = QDir::homePath()+"/.lumina/";
+ bool fluxcopy = false;
+ if(!QFile::exists(dset+"fluxbox-init")){ fluxcopy=true; }
+ else if(!QFile::exists(dset+"fluxbox-keys")){fluxcopy=true; }
+ else if(oldversion < 60){ fluxcopy=true; qDebug() << "Current fluxbox settings obsolete: Re-implementing defaults"; }
+ if(fluxcopy){
+ qDebug() << "Copying default fluxbox configuration files";
+ if(QFile::exists(dset+"fluxbox-init")){ QFile::remove(dset+"fluxbox-init"); }
+ if(QFile::exists(dset+"fluxbox-keys")){ QFile::remove(dset+"fluxbox-keys"); }
+ QFile::copy(LOS::LuminaShare()+"fluxbox-init-rc", dset+"fluxbox-init");
+ QFile::copy(LOS::LuminaShare()+"fluxbox-keys", dset+"fluxbox-keys");
+ QFile::setPermissions(dset+"fluxbox-init", QFile::ReadOwner | QFile::WriteOwner | QFile::ReadUser | QFile::ReadOther | QFile::ReadGroup);
+ QFile::setPermissions(dset+"fluxbox-keys", QFile::ReadOwner | QFile::WriteOwner | QFile::ReadUser | QFile::ReadOther | QFile::ReadGroup);
+ }
+
+ if(firstrun){ qDebug() << "First time using Lumina!!"; }
+ else if(newversion || newrelease){
+ qDebug() << "Updating session file to current version";
+ }
+
+ //Save the current version of the session to the settings file (for next time)
+ if(newversion || newrelease){
+ sessionsettings->setValue("DesktopVersion", this->applicationVersion());
+ }
+}
+
+void LSession::refreshWindowManager(){
+ WM->updateWM();
+}
+
+void LSession::updateDesktops(){
+ qDebug() << " - Update Desktops";
+ QDesktopWidget *DW = this->desktop();
+ int sC = DW->screenCount();
+ qDebug() << " Screen Count:" << sC;
+ qDebug() << " DESKTOPS Length:" << DESKTOPS.length();
+ if(sC<1){ return; } //stop here - no screens available temporarily (displayport/4K issue)
+
+ for(int i=0; i<sC; i++){ qDebug() << " -- Screen["+QString::number(i)+"]:" << DW->screenGeometry(i); }
+
+ bool firstrun = (DESKTOPS.length()==0);
+ bool numchange = DESKTOPS.length()!=sC;
+
+ // If the screen count is changing on us
+ if ( sC != DW->screenCount() ) {
+ qDebug() << "Screen Count changed while running";
+ return;
+ }
+
+ //First clean up any current desktops
+ QList<int> dnums; //keep track of which screens are already managed
+ for(int i=0; i<DESKTOPS.length(); i++){
+ if (DESKTOPS[i]->Screen() >= sC) {
+ //qDebug() << " - Close desktop:" << i;
+ qDebug() << " - Close desktop on screen:" << DESKTOPS[i]->Screen();
+ DESKTOPS[i]->prepareToClose();
+ DESKTOPS.takeAt(i)->deleteLater();
+ i--;
+ } else {
+ //qDebug() << " - Show desktop:" << i;
+ qDebug() << " - Show desktop on screen:" << DESKTOPS[i]->Screen();
+ DESKTOPS[i]->UpdateGeometry();
+ DESKTOPS[i]->show();
+ dnums << DESKTOPS[i]->Screen();
+ //QTimer::singleShot(0,DESKTOPS[i], SLOT(checkResolution()));
+ }
+ }
+
+ //Now add any new desktops
+ for(int i=0; i<sC; i++){
+ if(!dnums.contains(i)){
+ //Start the desktop on this screen
+ qDebug() << " - Start desktop on screen:" << i;
+ DESKTOPS << new LDesktop(i);
+ }
+ }
+
+ //Make sure fluxbox also gets prompted to re-load screen config if the number of screens changes in the middle of a session
+ if(numchange && !firstrun) {
+ qDebug() << "Update WM";
+ //QTimer::singleShot(1000,WM, SLOT(restartWM())); //Note: This causes crashes in X if a full-screen app
+ WM->updateWM();
+ }
+
+ //Make sure all the background windows are registered on the system as virtual roots
+ QTimer::singleShot(100,this, SLOT(registerDesktopWindows()));
+}
+
+void LSession::registerDesktopWindows(){
+ QList<WId> wins;
+ for(int i=0; i<DESKTOPS.length(); i++){
+ wins << DESKTOPS[i]->backgroundID();
+ }
+ XCB->RegisterVirtualRoots(wins);
+}
+
+void LSession::adjustWindowGeom(WId win, bool maximize){
+ //return; //temporary disable
+ if(DEBUG){ qDebug() << "AdjustWindowGeometry():" << win << maximize << XCB->WindowClass(win); }
+ if(XCB->WindowIsFullscreen(win) >=0 ){ return; } //don't touch it
+ //Quick hack for making sure that new windows are not located underneath any panels
+ // Get the window location
+ QRect geom = XCB->WindowGeometry(win, false);
+ //Get the frame size
+ QList<int> frame = XCB->WindowFrameGeometry(win); //[top,bottom,left,right] sizes of the frame
+ //Calculate the full geometry (window + frame)
+ QRect fgeom = QRect(geom.x()-frame[2], geom.y()-frame[0], geom.width()+frame[2]+frame[3], geom.height()+frame[0]+frame[1]);
+ if(DEBUG){
+ qDebug() << "Check Window Geometry:" << XCB->WindowClass(win) << !geom.isNull() << geom << fgeom;
+ }
+ if(geom.isNull()){ return; } //Could not get geometry for some reason
+ //Get the available geometry for the screen the window is on
+ QRect desk;
+ for(int i=0; i<DESKTOPS.length(); i++){
+ if( this->desktop()->screenGeometry(DESKTOPS[i]->Screen()).contains(geom.center()) ){
+ //Window is on this screen
+ if(DEBUG){ qDebug() << " - On Screen:" << DESKTOPS[i]->Screen(); }
+ desk = DESKTOPS[i]->availableScreenGeom();
+ if(DEBUG){ qDebug() << " - Screen Geom:" << desk; }
+ break;
+ }
+ }
+ if(desk.isNull()){ return; } //Unable to determine screen
+ //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)
+
+ }else if(!desk.contains(fgeom) ){
+ //Adjust origin point for left/top margins
+ if(fgeom.y() < desk.y()){ geom.moveTop(desk.y()+frame[0]); fgeom.moveTop(desk.y()); } //move down to the edge (top panel)
+ if(fgeom.x() < desk.x()){ geom.moveLeft(desk.x()+frame[2]); fgeom.moveLeft(desk.x()); } //move right to the edge (left panel)
+ //Adjust size for bottom margins (within reason, since window titles are on top normally)
+ // if(geom.right() > desk.right() && (geom.width() > 100)){ geom.setRight(desk.right()); }
+ if(fgeom.bottom() > desk.bottom() && geom.height() > 10){
+ if(DEBUG){ qDebug() << "Adjust Y:" << fgeom << geom << desk; }
+ int diff = fgeom.bottom()-desk.bottom(); //amount of overlap
+ if(DEBUG){ qDebug() << "Y-Diff:" << diff; }
+ if(diff < 0){ diff = -diff; } //need a positive value
+ if( (fgeom.height()+ diff)< desk.height()){
+ //just move the window - there is room for it above
+ geom.setBottom(desk.bottom()-frame[1]);
+ fgeom.setBottom(desk.bottom());
+ }else if(geom.height() > diff){ //window bigger than the difference
+ //Need to resize the window - keeping the origin point the same
+ geom.setHeight( geom.height()-diff-1 ); //shrink it by the difference (need an extra pixel somewhere)
+ fgeom.setHeight( fgeom.height()-diff );
+ }
+ }
+ //Now move/resize the window
+ if(DEBUG){
+ qDebug() << " - New Geom:" << geom << fgeom;
+ }
+ XCB->WM_Request_MoveResize_Window(win, geom);
+ /*
+ //Need to use the frame origin point with the window size (for some reason - strange Fluxbox issue)
+ XCB->MoveResizeWindow(win, QRect(fgeom.topLeft(), geom.size()) );
+
+ //For the random windows which are *still* off the top of the screen
+ QRect nfgeom = XCB->WindowGeometry(win, true); //re-fetch the current geometry (including frame)
+ if(nfgeom!=fgeom){
+ if(DEBUG){ qDebug() << " -- Adjust again:" << fgeom; }
+ XCB->MoveResizeWindow(win, geom);
+ }*/
+ }
+
+}
+
+void LSession::SessionEnding(){
+ stopSystemTray(); //just in case it was not stopped properly earlier
+}
+
+//===============
+// SYSTEM ACCESS
+//===============
+void LSession::LaunchApplication(QString cmd){
+ LSession::setOverrideCursor(QCursor(Qt::BusyCursor));
+ QProcess::startDetached(cmd);
+}
+
+QFileInfoList LSession::DesktopFiles(){
+ return desktopFiles;
+}
+
+QRect LSession::screenGeom(int num){
+ if(num < 0 || num >= this->desktop()->screenCount() ){ return QRect(); }
+ QRect geom = this->desktop()->screenGeometry(num);
+ QScreen* scrn = this->screens().at(num);
+ //if(DEBUG){ qDebug() << "Screen Geometry:" << num << geom << scrn->geometry() << scrn->virtualGeometry(); }
+ if(geom.isNull() ){
+ if( !scrn->geometry().isNull() ){ geom = scrn->geometry(); }
+ else if( !scrn->virtualGeometry().isNull() ){ geom = scrn->virtualGeometry(); }
+ //else if(num < savedScreens.length() ){
+ //Qt is backfiring (Xinarama w/ Fluxbox?) - return the saved geometry
+ //geom = savedScreens[num];
+ //}
+ }
+ return geom;
+}
+
+AppMenu* LSession::applicationMenu(){
+ return appmenu;
+}
+
+SettingsMenu* LSession::settingsMenu(){
+ return settingsmenu;
+}
+
+QSettings* LSession::sessionSettings(){
+ return sessionsettings;
+}
+
+QSettings* LSession::DesktopPluginSettings(){
+ return DPlugSettings;
+}
+
+WId LSession::activeWindow(){
+ //Check the last active window pointer first
+ WId active = XCB->ActiveWindow();
+ //qDebug() << "Check Active Window:" << active << lastActiveWin;
+ if(RunningApps.contains(active)){ lastActiveWin = active; }
+ else if(RunningApps.contains(lastActiveWin) && XCB->WindowState(lastActiveWin) >= LXCB::VISIBLE){} //no change needed
+ else if(RunningApps.contains(lastActiveWin) && RunningApps.length()>1){
+ int start = RunningApps.indexOf(lastActiveWin);
+ if(start<1){ lastActiveWin = RunningApps.length()-1; } //wrap around to the last item
+ else{ lastActiveWin = RunningApps[start-1]; }
+ }else{
+ //Need to change the last active window - find the first one which is visible
+ lastActiveWin = 0; //fallback value - nothing active
+ for(int i=0; i<RunningApps.length(); i++){
+ if(XCB->WindowState(RunningApps[i]) >= LXCB::VISIBLE){
+ lastActiveWin = RunningApps[i];
+ break;
+ }
+ }
+ //qDebug() << " -- New Last Active Window:" << lastActiveWin;
+ }
+ return lastActiveWin;
+}
+
+//Temporarily change the session locale (nothing saved between sessions)
+void LSession::switchLocale(QString localeCode){
+ currTranslator = LUtils::LoadTranslation(this, "lumina-desktop", localeCode, currTranslator);
+ if(currTranslator!=0 || localeCode=="en_US"){
+ LUtils::setLocaleEnv(localeCode); //will set everything to this locale (no custom settings)
+ }
+ emit LocaleChanged();
+}
+
+void LSession::systemWindow(){
+ if(sysWindow==0){ sysWindow = new SystemWindow(); }
+ else{ sysWindow->updateWindow(); }
+ sysWindow->show();
+ //LSession::processEvents();
+}
+
+//Play System Audio
+void LSession::playAudioFile(QString filepath){
+ //Setup the audio output systems for the desktop
+ if(DEBUG){ qDebug() << "Play Audio File"; }
+ if(mediaObj==0){ qDebug() << " - Initialize media player"; mediaObj = new QMediaPlayer(); }
+ if(mediaObj !=0 ){
+ if(DEBUG){ qDebug() << " - starting playback:" << filepath; }
+ mediaObj->setVolume(100);
+ mediaObj->setMedia(QUrl::fromLocalFile(filepath));
+ mediaObj->play();
+ //if(!audioThread->isRunning()){ audioThread->start(); }
+ LSession::processEvents();
+ }
+ if(DEBUG){ qDebug() << " - Done with Audio File"; }
+}
+// =======================
+// XCB EVENT FILTER FUNCTIONS
+// =======================
+void LSession::WindowPropertyEvent(){
+ if(DEBUG){ qDebug() << "Window Property Event"; }
+ QList<WId> newapps = XCB->WindowList();
+ if(RunningApps.length() < newapps.length()){
+ //New Window found
+ //qDebug() << "New window found";
+ LSession::restoreOverrideCursor(); //restore the mouse cursor back to normal (new window opened?)
+ //Perform sanity checks on any new window geometries
+ for(int i=0; i<newapps.length() && !TrayStopping; i++){
+ if(!RunningApps.contains(newapps[i])){
+ checkWin << newapps[i];
+ XCB->SelectInput(newapps[i]); //make sure we get property/focus events for this window
+ if(DEBUG){ qDebug() << "New Window - check geom in a moment:" << XCB->WindowClass(newapps[i]); }
+ QTimer::singleShot(50, this, SLOT(checkWindowGeoms()) );
+ }
+ }
+ }
+
+ //Now save the list and send out the event
+ RunningApps = newapps;
+ emit WindowListEvent();
+}
+
+void LSession::WindowPropertyEvent(WId win){
+ //Emit the single-app signal if the window in question is one used by the task manager
+ if(RunningApps.contains(win)){
+ if(DEBUG){ qDebug() << "Single-window property event"; }
+ //emit WindowListEvent();
+ WindowPropertyEvent(); //Run through the entire routine for window checks
+ }else if(RunningTrayApps.contains(win)){
+ emit TrayIconChanged(win);
+ }
+}
+
+void LSession::SysTrayDockRequest(WId win){
+ if(TrayStopping){ return; }
+ attachTrayWindow(win); //Check to see if the window is already registered
+}
+
+void LSession::WindowClosedEvent(WId win){
+ if(TrayStopping){ return; }
+ removeTrayWindow(win); //Check to see if the window is a tray app
+}
+
+void LSession::WindowConfigureEvent(WId win){
+ if(TrayStopping){ return; }
+ if(RunningTrayApps.contains(win)){
+ if(DEBUG){ qDebug() << "SysTray: Configure Event"; }
+ emit TrayIconChanged(win); //trigger a repaint event
+ }else if(RunningApps.contains(win)){
+ WindowPropertyEvent();
+ }
+}
+
+void LSession::WindowDamageEvent(WId win){
+ if(TrayStopping){ return; }
+ if(RunningTrayApps.contains(win)){
+ if(DEBUG){ qDebug() << "SysTray: Damage Event"; }
+ emit TrayIconChanged(win); //trigger a repaint event
+ }
+}
+
+void LSession::WindowSelectionClearEvent(WId win){
+ if(win==SystemTrayID && !TrayStopping){
+ qDebug() << "Stopping system tray";
+ stopSystemTray(true); //make sure to detach all windows
+ }
+}
+
+
+//======================
+// SYSTEM TRAY FUNCTIONS
+//======================
+bool LSession::registerVisualTray(WId visualTray){
+ //Only one visual tray can be registered at a time
+ // (limitation of how tray apps are embedded)
+ if(TrayStopping){ return false; }
+ else if(VisualTrayID==0){ VisualTrayID = visualTray; return true; }
+ else if(VisualTrayID==visualTray){ return true; }
+ else{ return false; }
+}
+
+void LSession::unregisterVisualTray(WId visualTray){
+ if(VisualTrayID==visualTray){
+ qDebug() << "Unregistered Visual Tray";
+ VisualTrayID=0;
+ if(!TrayStopping){ emit VisualTrayAvailable(); }
+ }
+}
+
+QList<WId> LSession::currentTrayApps(WId visualTray){
+ if(visualTray==VisualTrayID){
+ //Check the validity of all the current tray apps (make sure nothing closed erratically)
+ for(int i=0; i<RunningTrayApps.length(); i++){
+ if(XCB->WindowClass(RunningTrayApps[i]).isEmpty()){ RunningTrayApps.removeAt(i); i--; }
+ }
+ return RunningTrayApps;
+ }else if( registerVisualTray(visualTray) ){
+ return RunningTrayApps;
+ }else{
+ return QList<WId>();
+ }
+}
+
+void LSession::startSystemTray(){
+ if(SystemTrayID!=0){ return; }
+ RunningTrayApps.clear(); //nothing running yet
+ SystemTrayID = XCB->startSystemTray(0);
+ TrayStopping = false;
+ if(SystemTrayID!=0){
+ XCB->SelectInput(SystemTrayID); //make sure TrayID events get forwarded here
+ TrayDmgEvent = XCB->GenerateDamageID(SystemTrayID);
+ //XDamageQueryExtension( QX11Info::display(), &TrayDmgEvent, &TrayDmgError);
+ evFilter->setTrayDamageFlag(TrayDmgEvent);
+ qDebug() << "System Tray Started Successfully";
+ if(DEBUG){ qDebug() << " - System Tray Flags:" << TrayDmgEvent << TrayDmgError; }
+ }
+}
+
+void LSession::stopSystemTray(bool detachall){
+ if(TrayStopping){ return; } //already run
+ qDebug() << "Stopping system tray...";
+ TrayStopping = true; //make sure the internal list does not modified during this
+ //Close all the running Tray Apps
+ QList<WId> tmpApps = RunningTrayApps;
+ RunningTrayApps.clear(); //clear this ahead of time so tray's do not attempt to re-access the apps
+ if(!detachall){
+ for(int i=0; i<tmpApps.length(); i++){
+ qDebug() << " - Stopping tray app:" << XCB->WindowClass(tmpApps[i]);
+ //XCB->CloseWindow(RunningTrayApps[i]);
+ //Tray apps are special and closing the window does not close the app
+ XCB->KillClient(tmpApps[i]);
+ LSession::processEvents();
+ }
+ }
+ //Now close down the tray backend
+ XCB->closeSystemTray(SystemTrayID);
+ SystemTrayID = 0;
+ TrayDmgEvent = 0;
+ TrayDmgError = 0;
+ evFilter->setTrayDamageFlag(0); //turn off tray event handling
+ emit TrayListChanged();
+ LSession::processEvents();
+}
+
+void LSession::attachTrayWindow(WId win){
+ //static int appnum = 0;
+ if(TrayStopping){ return; }
+ if(RunningTrayApps.contains(win)){ return; } //already managed
+ qDebug() << "Session Tray: Window Added";
+ RunningTrayApps << win;
+ LSession::restoreOverrideCursor();
+ if(DEBUG){ qDebug() << "Tray List Changed"; }
+ emit TrayListChanged();
+}
+
+void LSession::removeTrayWindow(WId win){
+ if(SystemTrayID==0){ return; }
+ for(int i=0; i<RunningTrayApps.length(); i++){
+ if(win==RunningTrayApps[i]){
+ qDebug() << "Session Tray: Window Removed";
+ RunningTrayApps.removeAt(i);
+ emit TrayListChanged();
+ break;
+ }
+ }
+}
diff --git a/src-qt5/core/lumina-desktop/LSession.h b/src-qt5/core/lumina-desktop/LSession.h
new file mode 100644
index 00000000..ae217bd8
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/LSession.h
@@ -0,0 +1,181 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_SESSION_H
+#define _LUMINA_DESKTOP_SESSION_H
+
+#include <QApplication>
+#include <QDebug>
+#include <QString>
+#include <QX11Info>
+#include <QEvent>
+#include <QTranslator>
+#include <QSettings>
+#include <QProxyStyle>
+#include <QDesktopWidget>
+#include <QList>
+#include <QThread>
+#include <QMediaPlayer>
+#include <QThread>
+#include <QUrl>
+
+#include "Globals.h"
+#include "AppMenu.h"
+#include "SettingsMenu.h"
+#include "SystemWindow.h"
+#include "LDesktop.h"
+#include "WMProcess.h"
+//#include "BootSplash.h"
+
+#include <LuminaX11.h>
+#include <LuminaSingleApplication.h>
+
+//SYSTEM TRAY STANDARD DEFINITIONS
+#define SYSTEM_TRAY_REQUEST_DOCK 0
+#define SYSTEM_TRAY_BEGIN_MESSAGE 1
+#define SYSTEM_TRAY_CANCEL_MESSAGE 2
+
+/*class MenuProxyStyle : public QProxyStyle{
+public:
+ int pixelMetric(PixelMetric metric, const QStyleOption *option=0, const QWidget *widget=0) const{
+ if(metric==PM_SmallIconSize){ return 22; } //override QMenu icon size (make it larger)
+ else{ return QProxyStyle::pixelMetric(metric, option, widget); } //use the current style for everything else
+ }
+};*/
+
+class LSession : public LSingleApplication{
+ Q_OBJECT
+public:
+ LSession(int &argc, char **argv);
+ ~LSession();
+ //Functions to be called during startup
+ void setupSession();
+
+ //Public System Tray Functions
+ QList<WId> currentTrayApps(WId visualTray);
+ bool registerVisualTray(WId);
+ void unregisterVisualTray(WId);
+
+ //Special functions for XCB event filter parsing only
+ // (DO NOT USE MANUALLY)
+ void WindowPropertyEvent();
+ void WindowPropertyEvent(WId);
+ void SysTrayDockRequest(WId);
+ void WindowClosedEvent(WId);
+ void WindowConfigureEvent(WId);
+ void WindowDamageEvent(WId);
+ void WindowSelectionClearEvent(WId);
+
+ //System Access
+ //Return a pointer to the current session
+ static LSession* handle(){
+ return static_cast<LSession*>(LSession::instance());
+ }
+
+ static void LaunchApplication(QString cmd);
+ QFileInfoList DesktopFiles();
+
+ QRect screenGeom(int num);
+
+ AppMenu* applicationMenu();
+ void systemWindow();
+ SettingsMenu* settingsMenu();
+ LXCB *XCB; //class for XCB usage
+
+ QSettings* sessionSettings();
+ QSettings* DesktopPluginSettings();
+
+ //Keep track of which non-desktop window should be treated as active
+ WId activeWindow(); //This will return the last active window if a desktop element is currently active
+
+ //Temporarily change the session locale (nothing saved between sessions)
+ void switchLocale(QString localeCode);
+
+ //Play System Audio
+ void playAudioFile(QString filepath);
+ //Window Adjustment Routine (due to Fluxbox not respecting _NET_WM_STRUT)
+ void adjustWindowGeom(WId win, bool maximize = false);
+
+private:
+ WMProcess *WM;
+ QList<LDesktop*> DESKTOPS;
+ QFileSystemWatcher *watcher;
+ QTimer *screenTimer;
+
+ //Internal variable for global usage
+ AppMenu *appmenu;
+ SettingsMenu *settingsmenu;
+ SystemWindow *sysWindow;
+ QTranslator *currTranslator;
+ QMediaPlayer *mediaObj;
+ QSettings *sessionsettings, *DPlugSettings;
+ bool cleansession;
+ //QList<QRect> savedScreens;
+
+ //System Tray Variables
+ WId SystemTrayID, VisualTrayID;
+ int TrayDmgEvent, TrayDmgError;
+ QList<WId> RunningTrayApps;
+ bool TrayStopping;
+
+ //Task Manager Variables
+ WId lastActiveWin;
+ QList<WId> RunningApps;
+ QList<WId> checkWin;
+ QFileInfoList desktopFiles;
+
+ void CleanupSession();
+
+ int VersionStringToNumber(QString version);
+
+public slots:
+ void StartLogout();
+ void StartShutdown();
+ void StartReboot();
+
+ void reloadIconTheme();
+
+private slots:
+ void NewCommunication(QStringList);
+ void launchStartupApps(); //used during initialization
+ void watcherChange(QString);
+ void screensChanged();
+ void screenResized(int);
+ void checkWindowGeoms();
+
+ //System Tray Functions
+ void startSystemTray();
+ void stopSystemTray(bool detachall = false);
+ void attachTrayWindow(WId);
+ void removeTrayWindow(WId);
+
+ //Internal simplification functions
+ void checkUserFiles();
+ void refreshWindowManager();
+ void updateDesktops();
+ void registerDesktopWindows();
+
+
+ void SessionEnding();
+
+signals:
+ //System Tray Signals
+ void VisualTrayAvailable(); //new Visual Tray Plugin can be registered
+ void TrayListChanged(); //Item added/removed from the list
+ void TrayIconChanged(WId); //WinID of Tray App
+ //Task Manager Signals
+ void WindowListEvent(WId);
+ void WindowListEvent();
+ //General Signals
+ void LocaleChanged();
+ void IconThemeChanged();
+ void DesktopConfigChanged();
+ void SessionConfigChanged();
+ void DesktopFilesChanged();
+
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/LWinInfo.cpp b/src-qt5/core/lumina-desktop/LWinInfo.cpp
new file mode 100644
index 00000000..3ff0c2d7
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/LWinInfo.cpp
@@ -0,0 +1,48 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LWinInfo.h"
+
+#include <LuminaX11.h>
+
+#include "LSession.h"
+
+//Information Retrieval
+ // Don't cache these results because they can change regularly
+QString LWinInfo::text(){
+ if(window==0){ return ""; }
+ QString nm = LSession::handle()->XCB->WindowVisibleIconName(window);
+ if(nm.simplified().isEmpty()){ nm = LSession::handle()->XCB->WindowIconName(window); }
+ if(nm.simplified().isEmpty()){ nm = LSession::handle()->XCB->WindowVisibleName(window); }
+ if(nm.simplified().isEmpty()){ nm = LSession::handle()->XCB->WindowName(window); }
+ if(nm.simplified().isEmpty()){ nm = LSession::handle()->XCB->OldWindowIconName(window); }
+ if(nm.simplified().isEmpty()){ nm = LSession::handle()->XCB->OldWindowName(window); }
+ //Make sure that the text is a reasonable size (40 char limit)
+ if(nm.length()>40){ nm = nm.left(40)+"..."; }
+ return nm;
+}
+
+QIcon LWinInfo::icon(bool &noicon){
+ if(window==0){ noicon = true; return QIcon();}
+ noicon = false;
+ QIcon ico = LSession::handle()->XCB->WindowIcon(window);
+ //Check for a null icon, and supply one if necessary
+ if(ico.isNull()){ ico = LXDG::findIcon( this->Class().toLower(),""); }
+ if(ico.isNull()){ico = LXDG::findIcon("preferences-system-windows",""); noicon=true;}
+ return ico;
+}
+
+QString LWinInfo::Class(){
+ return LSession::handle()->XCB->WindowClass(window);
+}
+
+LXCB::WINDOWVISIBILITY LWinInfo::status(bool update){
+ if(window==0){ return LXCB::IGNORE; }
+ if(update || cstate == LXCB::IGNORE){
+ cstate = LSession::handle()->XCB->WindowState(window);
+ }
+ return cstate;
+} \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/LWinInfo.h b/src-qt5/core/lumina-desktop/LWinInfo.h
new file mode 100644
index 00000000..3d2ea65a
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/LWinInfo.h
@@ -0,0 +1,50 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_WINDOW_INFO_H
+#define _LUMINA_DESKTOP_WINDOW_INFO_H
+
+// Qt includes
+#include <QString>
+#include <QPixmap>
+#include <QIcon>
+#include <QPainter>
+
+// libLumina includes
+#include <LuminaX11.h>
+#include <LuminaXDG.h>
+
+// Local includes
+//#include "Globals.h" //For the STATES enumeration definition
+//#include "LSession.h"
+
+
+class LWinInfo{
+private:
+ WId window;
+ LXCB::WINDOWVISIBILITY cstate; //current window state
+
+public:
+ LWinInfo(WId id = 0){
+ window = id;
+ cstate = LXCB::IGNORE; //make sure this gets updates with the first "status" call
+ }
+ ~LWinInfo(){};
+
+ //The current window ID
+ WId windowID(){
+ return window;
+ }
+
+ //Information Retrieval
+ // Don't cache these results because they can change regularly
+ QString text();
+ QIcon icon(bool &noicon);
+ QString Class();
+ LXCB::WINDOWVISIBILITY status(bool update = false);
+};
+
+#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/LXcbEventFilter.cpp b/src-qt5/core/lumina-desktop/LXcbEventFilter.cpp
new file mode 100644
index 00000000..7ee4f974
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/LXcbEventFilter.cpp
@@ -0,0 +1,109 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LXcbEventFilter.h"
+
+//For all the XCB interactions and atoms
+// is accessed via
+// session->XCB->EWMH.(atom name)
+// session->XCB->(do something)
+#include <LuminaX11.h>
+#include <QDebug>
+
+XCBEventFilter::XCBEventFilter(LSession *sessionhandle) : QAbstractNativeEventFilter(){
+ session = sessionhandle; //save this for interaction with the session later
+ TrayDmgFlag = 0;
+ stopping = false;
+ InitAtoms();
+}
+
+void XCBEventFilter::setTrayDamageFlag(int flag){
+ //Special flag for system tray damage events
+ TrayDmgFlag = flag + XCB_DAMAGE_NOTIFY; //save the whole flag (no calculations later)
+}
+
+//This function format taken directly from the Qt5.3 documentation
+bool XCBEventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *){
+ if(stopping){ return false; } //don't do any parsing
+ //qDebug() << "New Event";
+ if(eventType=="xcb_generic_event_t"){
+ //qDebug() << " - XCB event";
+ //Convert to known event type (for X11 systems)
+ xcb_generic_event_t *ev = static_cast<xcb_generic_event_t *>(message);
+ //Now parse the event and emit signals as necessary
+ switch( ev->response_type & ~0x80){
+//==============================
+ case XCB_PROPERTY_NOTIFY:
+ //qDebug() << "Property Notify Event:";
+ //qDebug() << " - Root Window:" << QX11Info::appRootWindow();
+ //qDebug() << " - Given Window:" << ((xcb_property_notify_event_t*)ev)->window;
+ //System-specific proprty change
+ if( SysNotifyAtoms.contains( ((xcb_property_notify_event_t*)ev)->atom ) ){
+ //Update the status/list of all running windows
+ session->WindowPropertyEvent();
+
+ //window-specific property change
+ }else if( WinNotifyAtoms.contains( ((xcb_property_notify_event_t*)ev)->atom ) ){
+ //Ping only that window
+ //session->WindowPropertyEvent( ((xcb_property_notify_event_t*)ev)->window );
+ session->WindowPropertyEvent();
+ }
+ break;
+//==============================
+ case XCB_CLIENT_MESSAGE:
+ //qDebug() << "Client Message Event";
+ //qDebug() << " - Root Window:" << QX11Info::appRootWindow();
+ //qDebug() << " - Given Window:" << ((xcb_client_message_event_t*)ev)->window;
+ if( TrayDmgFlag!=0 && ((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]){
+ session->SysTrayDockRequest( ((xcb_client_message_event_t*)ev)->data.data32[2] );
+ }
+ //Ignore the System Tray messages at the moment (let the WM handle it)
+
+ //window-specific property changes
+ /*}else if( ((xcb_client_message_event_t*)ev)->type == session->XCB->EWMH._NET_WM_STATE ){
+ if( session->XCB->WindowIsMaximized( ((xcb_client_message_event_t*)ev)->window ) ){
+ //Quick fix for maximized windows (since Fluxbox is not doing the STRUT detection properly)
+ session->adjustWindowGeom( ((xcb_client_message_event_t*)ev)->window );
+ }
+ session->WindowPropertyEvent( ((xcb_client_message_event_t*)ev)->window );*/
+ }else if( WinNotifyAtoms.contains( ((xcb_client_message_event_t*)ev)->type ) ){
+ //Ping only that window
+ //session->WindowPropertyEvent( ((xcb_client_message_event_t*)ev)->window );
+ session->WindowPropertyEvent();
+ }
+ break;
+//==============================
+ case XCB_DESTROY_NOTIFY:
+ //qDebug() << "Window Closed Event";
+ session->WindowClosedEvent( ( (xcb_destroy_notify_event_t*)ev )->window );
+ break;
+//==============================
+ case XCB_CONFIGURE_NOTIFY:
+ //qDebug() << "Configure Notify Event";
+ session->WindowConfigureEvent( ((xcb_configure_notify_event_t*)ev)->window );
+ break;
+//==============================
+ case XCB_SELECTION_CLEAR:
+ //qDebug() << "Selection Clear Event";
+ session->WindowSelectionClearEvent( ((xcb_selection_clear_event_t*)ev)->owner );
+ break;
+//==============================
+ default:
+ if(TrayDmgFlag!=0){
+ //if( (ev->response_type & ~0x80)==TrayDmgFlag){
+ session->WindowDamageEvent( ((xcb_damage_notify_event_t*)ev)->drawable );
+ //}
+ }/*else{
+ qDebug() << "Default Event:" << (ev->response_type & ~0x80);
+ }*/
+//==============================
+ }
+ }
+ //qDebug() << " - finished event";
+ return false; //make sure the handling keeps going (transparent watching of events)
+}
diff --git a/src-qt5/core/lumina-desktop/LXcbEventFilter.h b/src-qt5/core/lumina-desktop/LXcbEventFilter.h
new file mode 100644
index 00000000..c56471c9
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/LXcbEventFilter.h
@@ -0,0 +1,104 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This class provides the XCB ->Xlib conversion necessary for Qt5 usage
+//===========================================
+#ifndef _LUMINA_DESKTOP_XCB_FILTER_H
+#define _LUMINA_DESKTOP_XCB_FILTER_H
+
+#include <QAbstractNativeEventFilter>
+#include <QList>
+#include <QStringList>
+#include <QX11Info>
+
+#include <xcb/xcb.h>
+#include <xcb/xproto.h>
+#include <xcb/damage.h>
+#include <xcb/xcb_atom.h>
+#include "LSession.h"
+
+/*
+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
+
+class XCBEventFilter : public QAbstractNativeEventFilter{
+private:
+ LSession *session;
+ xcb_atom_t _NET_SYSTEM_TRAY_OPCODE;
+ QList<xcb_atom_t> WinNotifyAtoms, SysNotifyAtoms;
+ int TrayDmgFlag; //internal damage event offset value for the system tray
+ bool stopping;
+
+ void InitAtoms(){
+ //Initialize any special atoms that we need to save/use regularly
+ //NOTE: All the EWMH atoms are already saved in session->XCB->EWMH
+ WinNotifyAtoms.clear();
+ WinNotifyAtoms << session->XCB->EWMH._NET_WM_NAME \
+ << session->XCB->EWMH._NET_WM_VISIBLE_NAME \
+ << session->XCB->EWMH._NET_WM_ICON_NAME \
+ << session->XCB->EWMH._NET_WM_VISIBLE_ICON_NAME \
+ << session->XCB->EWMH._NET_WM_ICON \
+ << session->XCB->EWMH._NET_WM_ICON_GEOMETRY;
+
+ SysNotifyAtoms.clear();
+ SysNotifyAtoms << session->XCB->EWMH._NET_CLIENT_LIST \
+ << session->XCB->EWMH._NET_CLIENT_LIST_STACKING \
+ << session->XCB->EWMH._NET_CURRENT_DESKTOP \
+ << session->XCB->EWMH._NET_WM_STATE \
+ << session->XCB->EWMH._NET_ACTIVE_WINDOW \
+ << session->XCB->EWMH._NET_WM_ICON \
+ << session->XCB->EWMH._NET_WM_ICON_GEOMETRY;
+ //_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);
+ }
+ }
+
+public:
+ XCBEventFilter(LSession *sessionhandle);
+ void setTrayDamageFlag(int flag);
+ void StopEventHandling(){ stopping = true; }
+
+ //This function format taken directly from the Qt5.3 documentation
+ virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *) Q_DECL_OVERRIDE;
+
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/Lumina-DE.desktop b/src-qt5/core/lumina-desktop/Lumina-DE.desktop
new file mode 100644
index 00000000..f83c6a7c
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/Lumina-DE.desktop
@@ -0,0 +1,34 @@
+[Desktop Entry]
+Exec=Lumina-DE
+TryExec=Lumina-DE
+Icon=Lumina-DE
+Type=Application
+Name=Lumina
+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/Lumina-DE.png b/src-qt5/core/lumina-desktop/Lumina-DE.png
new file mode 100644
index 00000000..ce88a252
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/Lumina-DE.png
Binary files differ
diff --git a/src-qt5/core/lumina-desktop/Lumina-DE.qrc b/src-qt5/core/lumina-desktop/Lumina-DE.qrc
new file mode 100644
index 00000000..5fada9b6
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/Lumina-DE.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource>
+ <file>images/desktop-background.jpg</file>
+ <file>fluxboxconf/fluxbox-init-rc</file>
+ <file>fluxboxconf/fluxbox-keys</file>
+ </qresource>
+</RCC>
diff --git a/src-qt5/core/lumina-desktop/SettingsMenu.cpp b/src-qt5/core/lumina-desktop/SettingsMenu.cpp
new file mode 100644
index 00000000..540538b5
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/SettingsMenu.cpp
@@ -0,0 +1,64 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "SettingsMenu.h"
+#include "LSession.h"
+
+#include <LuminaOS.h>
+
+SettingsMenu::SettingsMenu() : QMenu(){
+ connect(this, SIGNAL(triggered(QAction*)), this, SLOT(runApp(QAction*)) );
+ connect(QApplication::instance(), SIGNAL(LocaleChanged()), this, SLOT(UpdateMenu()) );
+ connect(QApplication::instance(), SIGNAL(IconThemeChanged()), this, SLOT(UpdateMenu()) );
+ QTimer::singleShot(100, this, SLOT(UpdateMenu()) );
+}
+
+SettingsMenu::~SettingsMenu(){
+
+}
+
+void SettingsMenu::UpdateMenu(){
+ //Change the title/icon to account for locale/icon changes
+ this->setTitle( tr("Preferences") );
+ this->setIcon( LXDG::findIcon("configure","") );
+ this->clear();
+ //Now setup the possible configuration options
+ QAction *act = new QAction(LXDG::findIcon("preferences-desktop-screensaver",""), tr("Screensaver"), this);
+ act->setWhatsThis("xscreensaver-demo");
+ this->addAction(act);
+ 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("Display"), 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);
+ act->setWhatsThis(qtconfig);
+ this->addAction(act);
+ }*/
+ QString CONTROLPANEL = LOS::ControlPanelShortcut();
+ if(QFile::exists(CONTROLPANEL) && !CONTROLPANEL.isEmpty()){
+ //Now load the info
+ bool ok = false;
+ XDGDesktop cpan = LXDG::loadDesktopFile(CONTROLPANEL, ok);
+ if(ok){
+ act = new QAction( LXDG::findIcon(cpan.icon,""), tr("Control Panel"), this);
+ act->setWhatsThis("lumina-open \""+CONTROLPANEL+"\"");
+ this->addAction(act);
+ }
+ }
+ this->addSeparator();
+ act = new QAction( LXDG::findIcon("lumina",""), tr("About Lumina"), this);
+ act->setWhatsThis("lumina-info");
+ this->addAction(act);
+}
+
+
+void SettingsMenu::runApp(QAction* act){
+ LSession::LaunchApplication(act->whatsThis());
+}
diff --git a/src-qt5/core/lumina-desktop/SettingsMenu.h b/src-qt5/core/lumina-desktop/SettingsMenu.h
new file mode 100644
index 00000000..eeabab85
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/SettingsMenu.h
@@ -0,0 +1,28 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_SETTINGS_MENU_H
+#define _LUMINA_DESKTOP_SETTINGS_MENU_H
+
+#include <QMenu>
+#include <QProcess>
+#include <QAction>
+
+#include <LuminaXDG.h>
+
+class SettingsMenu : public QMenu{
+ Q_OBJECT
+public:
+ SettingsMenu();
+ ~SettingsMenu();
+
+private slots:
+ void UpdateMenu();
+ void runApp(QAction* act);
+
+};
+
+#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/SystemWindow.cpp b/src-qt5/core/lumina-desktop/SystemWindow.cpp
new file mode 100644
index 00000000..74538404
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/SystemWindow.cpp
@@ -0,0 +1,84 @@
+#include "SystemWindow.h"
+#include "ui_SystemWindow.h"
+
+#include "LSession.h"
+#include <LuminaOS.h>
+#include <QPoint>
+#include <QCursor>
+#include <QDebug>
+#include <QProcess>
+#include <QDesktopWidget>
+
+SystemWindow::SystemWindow() : QDialog(), ui(new Ui::SystemWindow){
+ ui->setupUi(this); //load the designer file
+ //Setup the window flags
+ this->setWindowFlags( Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
+ //Setup the icons based on the current theme
+ ui->tool_logout->setIcon( LXDG::findIcon("system-log-out","") );
+ ui->tool_restart->setIcon( LXDG::findIcon("system-reboot","") );
+ ui->tool_shutdown->setIcon( LXDG::findIcon("system-shutdown","") );
+ ui->tool_suspend->setIcon( LXDG::findIcon("system-suspend","") );
+ ui->push_cancel->setIcon( LXDG::findIcon("dialog-cancel","") );
+ ui->push_lock->setIcon( LXDG::findIcon("system-lock-screen","") );
+ //Connect the signals/slots
+ connect(ui->tool_logout, SIGNAL(clicked()), this, SLOT(sysLogout()) );
+ connect(ui->tool_restart, SIGNAL(clicked()), this, SLOT(sysRestart()) );
+ connect(ui->tool_shutdown, SIGNAL(clicked()), this, SLOT(sysShutdown()) );
+ connect(ui->tool_suspend, SIGNAL(clicked()), this, SLOT(sysSuspend()) );
+ connect(ui->push_cancel, SIGNAL(clicked()), this, SLOT(sysCancel()) );
+ connect(ui->push_lock, SIGNAL(clicked()), this, SLOT(sysLock()) );
+ //Disable buttons if necessary
+ updateWindow();
+ ui->tool_suspend->setVisible(LOS::systemCanSuspend()); //does not change with time - just do a single check
+ connect(QApplication::instance(), SIGNAL(LocaleChanged()), this, SLOT(updateWindow()) );
+ connect(QApplication::instance(), SIGNAL(IconThemeChanged()), this, SLOT(updateWindow()) );
+}
+
+SystemWindow::~SystemWindow(){
+
+}
+
+void SystemWindow::updateWindow(){
+ //Disable the shutdown/restart buttons if necessary
+ ui->retranslateUi(this);
+ bool ok = LOS::userHasShutdownAccess();
+ ui->tool_restart->setEnabled(ok);
+ ui->tool_shutdown->setEnabled(ok);
+ //Center this window on the current screen
+ QPoint center = QApplication::desktop()->screenGeometry(QCursor::pos()).center(); //get the center of the current screen
+ this->move(center.x() - this->width()/2, center.y() - this->height()/2);
+}
+
+void SystemWindow::sysLogout(){
+ this->hide();
+ LSession::processEvents();
+ QTimer::singleShot(0, LSession::handle(), SLOT(StartLogout()) );
+}
+
+void SystemWindow::sysRestart(){
+ this->hide();
+ LSession::processEvents();
+ QTimer::singleShot(0, LSession::handle(), SLOT(StartReboot()) );
+}
+
+void SystemWindow::sysShutdown(){
+ this->hide();
+ LSession::processEvents();
+ QTimer::singleShot(0, LSession::handle(), SLOT(StartShutdown()) );
+}
+
+void SystemWindow::sysSuspend(){
+ this->hide();
+ LSession::processEvents();
+ //Make sure to lock the system first (otherwise anybody can access it again)
+ LUtils::runCmd("xscreensaver-command -lock");
+ //Now suspend the system
+ LOS::systemSuspend();
+}
+
+void SystemWindow::sysLock(){
+ this->hide();
+ LSession::processEvents();
+ qDebug() << "Locking the desktop...";
+ QProcess::startDetached("xscreensaver-command -lock");
+}
diff --git a/src-qt5/core/lumina-desktop/SystemWindow.h b/src-qt5/core/lumina-desktop/SystemWindow.h
new file mode 100644
index 00000000..98617f79
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/SystemWindow.h
@@ -0,0 +1,45 @@
+#ifndef _LUMINA_DESKTOP_SYSTEM_WINDOW_H
+#define _LUMINA_DESKTOP_SYSTEM_WINDOW_H
+
+#include <QDialog>
+
+#include "ui_SystemWindow.h"
+
+
+
+
+namespace Ui{
+ class SystemWindow;
+};
+
+class SystemWindow : public QDialog{
+ Q_OBJECT
+public:
+ SystemWindow();
+ ~SystemWindow();
+
+public slots:
+ void updateWindow();
+
+private:
+ Ui::SystemWindow *ui;
+
+ //void closeAllWindows();
+
+private slots:
+ void sysLogout();
+
+ void sysRestart();
+
+ void sysShutdown();
+
+ void sysSuspend();
+
+ void sysCancel(){
+ this->close();
+ }
+
+ void sysLock();
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/SystemWindow.ui b/src-qt5/core/lumina-desktop/SystemWindow.ui
new file mode 100644
index 00000000..9e25509b
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/SystemWindow.ui
@@ -0,0 +1,194 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SystemWindow</class>
+ <widget class="QDialog" name="SystemWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>289</width>
+ <height>135</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>System Options</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="leftMargin">
+ <number>2</number>
+ </property>
+ <property name="topMargin">
+ <number>2</number>
+ </property>
+ <property name="rightMargin">
+ <number>2</number>
+ </property>
+ <property name="bottomMargin">
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QFrame" name="frame">
+ <property name="frameShape">
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="leftMargin">
+ <number>3</number>
+ </property>
+ <property name="topMargin">
+ <number>3</number>
+ </property>
+ <property name="rightMargin">
+ <number>3</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QToolButton" name="tool_logout">
+ <property name="text">
+ <string>Log Out</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>64</width>
+ <height>64</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextUnderIcon</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_restart">
+ <property name="text">
+ <string>Restart</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>64</width>
+ <height>64</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextUnderIcon</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_shutdown">
+ <property name="text">
+ <string>Shutdown</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>64</width>
+ <height>64</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextUnderIcon</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <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>
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QToolButton" name="push_cancel">
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextUnderIcon</enum>
+ </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="QToolButton" name="push_lock">
+ <property name="text">
+ <string>Lock</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextUnderIcon</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_suspend">
+ <property name="text">
+ <string>Suspend</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextUnderIcon</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src-qt5/core/lumina-desktop/WMProcess.cpp b/src-qt5/core/lumina-desktop/WMProcess.cpp
new file mode 100644
index 00000000..a2a4933f
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/WMProcess.cpp
@@ -0,0 +1,133 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "WMProcess.h"
+#include "LSession.h"
+
+WMProcess::WMProcess() : QProcess(){
+ connect(this,SIGNAL(finished(int, QProcess::ExitStatus)),this,SLOT(processFinished(int, QProcess::ExitStatus)) );
+ this->setProcessChannelMode(QProcess::MergedChannels);
+ QString log = QDir::homePath()+"/.lumina/logs/wm.log";
+ if(QFile::exists(log)){ QFile::remove(log); }
+ this->setStandardOutputFile(log);
+ ssaver = new QProcess(0);
+ inShutdown = false;
+}
+
+WMProcess::~WMProcess(){
+
+}
+
+// =======================
+// PUBLIC FUNCTIONS
+// =======================
+void WMProcess::startWM(){
+ inShutdown = false;
+ QString cmd = setupWM();
+ if(!isRunning()){this->start(cmd); }
+ if(ssaver->state() == QProcess::NotRunning \
+ && LSession::handle()->sessionSettings()->value("WindowManager", "fluxbox").toString() != "lumina-wm"){
+ ssaver->start("xscreensaver -no-splash");
+ }
+}
+
+void WMProcess::stopWM(){
+ if(isRunning()){
+ inShutdown = true;
+ //QProcess::startDetached("fluxbox-remote closeallwindows");
+ ssaver->kill();
+ this->kill();
+ if(!this->waitForFinished(10000)){ this->terminate(); };
+ }else{
+ qWarning() << "WM already closed - did it crash?";
+ }
+}
+
+void WMProcess::restartWM(){
+ qDebug() << "Restarting WM";
+ if(isRunning()){
+ inShutdown = true;
+ this->kill();
+ if(!this->waitForFinished(5000) ){ this->terminate(); };
+ inShutdown = false;
+ }
+ this->startWM();
+}
+
+void WMProcess::updateWM(){
+ if(isRunning()){
+ qDebug() << "Updating WM";
+ ::kill(this->pid(), SIGUSR2); //send fluxbox the signal to reload it's configuration
+ }
+}
+// =======================
+// PRIVATE FUNCTIONS
+// =======================
+bool WMProcess::isRunning(){
+ return (this->state() != QProcess::NotRunning);
+}
+
+QString WMProcess::setupWM(){
+ QString WM = LSession::handle()->sessionSettings()->value("WindowManager", "fluxbox").toString();
+ QString cmd="echo WM Disabled";
+ //leave the option to add other window managers here (for testing purposes)
+ if(WM=="openbox"){
+ QString confDir = QDir::homePath()+"/.config/openbox";
+ if(!QFile::exists(confDir)){ QDir dir(confDir); dir.mkpath(confDir); }
+ if(!QFile::exists(confDir+"lumina-rc.xml")){
+ QFile::copy(":/openboxconf/lumina-rc.xml",confDir+"/lumina-rc.xml");
+ QFile::setPermissions(confDir+"/lumina-rc.xml", QFile::ReadOwner | QFile::WriteOwner | QFile::ReadUser | QFile::ReadOther | QFile::ReadGroup);
+ }
+ if(!QFile::exists(confDir+"lumina-menu.xml")){
+ QFile::copy(":/openboxconf/lumina-menu.xml",confDir+"/lumina-menu.xml");
+ QFile::setPermissions(confDir+"/lumina-menu.xml", QFile::ReadOwner | QFile::WriteOwner | QFile::ReadUser | QFile::ReadOther | QFile::ReadGroup);
+ }
+ //Now copy the configuration files around as necessary
+ //if(QFile::exists(confDir+"/rc.xml")){ QFile::rename(confDir+"/rc.xml",confDir+"/openbox-rc.xml"); }
+ //QFile::copy(confDir+"/lumina-rc.xml",confDir+"/rc.xml");
+ cmd = "openbox --debug --sm-disable --config-file "+confDir+"/lumina-rc.xml";
+ }else if(WM=="fluxbox"){
+ QString confDir = QDir::homePath()+"/.lumina";
+ if(!QFile::exists(confDir)){ QDir dir(confDir); dir.mkpath(confDir); }
+ if(!QFile::exists(confDir+"/fluxbox-init")){
+ QFile::copy(":/fluxboxconf/fluxbox-init-rc",confDir+"/fluxbox-init");
+ QFile::setPermissions(confDir+"/fluxbox-init", QFile::ReadOwner | QFile::WriteOwner | QFile::ReadUser | QFile::ReadOther | QFile::ReadGroup);
+ }
+ // FLUXBOX BUG BYPASS: if the ~/.fluxbox dir does not exist, it will ignore the given config file
+ if(!QFile::exists(QDir::homePath()+"/.fluxbox")){
+ QDir dir; dir.mkpath(QDir::homePath()+"/.fluxbox");
+ }
+ cmd = "fluxbox -rc "+confDir+"/fluxbox-init -no-slit -no-toolbar";
+ }else {
+ cmd = WM;
+ }
+ return cmd;
+}
+
+void WMProcess::cleanupConfig(){
+ //QString confDir = QDir::homePath()+"/.config/openbox";
+ //if(!QFile::exists(confDir+"/rc.xml")){ return; } //Make sure that there is a current config file
+ //if(QFile::exists(confDir+"/lumina-rc.xml")){ QFile::remove(confDir+"/lumina-rc.xml"); }
+ //QFile::rename(confDir+"/rc.xml",confDir+"/lumina-rc.xml");
+ //if(QFile::exists(confDir+"/openbox-rc.xml")){ QFile::rename(confDir+"/openbox-rc.xml",confDir+"/rc.xml"); }
+}
+// =======================
+// PRIVATE SLOTS
+// =======================
+void WMProcess::processFinished(int exitcode, QProcess::ExitStatus status){
+ if(!inShutdown){
+ if(exitcode == 0 && status == QProcess::NormalExit){
+ cleanupConfig();
+ emit WMShutdown();
+ }else{
+ //restart the Window manager
+ qDebug() << "WM Stopped Unexpectedly: Restarting it...";
+ this->startWM();
+ }
+ }else{
+ cleanupConfig();
+ }
+}
diff --git a/src-qt5/core/lumina-desktop/WMProcess.h b/src-qt5/core/lumina-desktop/WMProcess.h
new file mode 100644
index 00000000..ff1b3963
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/WMProcess.h
@@ -0,0 +1,47 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_WMPROCESS_H
+#define _LUMINA_DESKTOP_WMPROCESS_H
+
+#include <QProcess>
+#include <QFile>
+#include <QDir>
+#include <QDebug>
+
+#include <sys/types.h>
+#include <signal.h>
+
+class WMProcess : public QProcess{
+ Q_OBJECT
+public:
+ WMProcess();
+ ~WMProcess();
+
+ void startWM();
+ void stopWM();
+
+ void updateWM();
+
+public slots:
+ void restartWM();
+
+private:
+ bool inShutdown;
+ bool isRunning();
+ QString setupWM();
+ void cleanupConfig();
+ QProcess *ssaver;
+
+private slots:
+ void processFinished(int exitcode, QProcess::ExitStatus status);
+
+signals:
+ void WMShutdown();
+};
+
+#endif
+
diff --git a/src-qt5/core/lumina-desktop/audiofiles/LICENCE b/src-qt5/core/lumina-desktop/audiofiles/LICENCE
new file mode 100644
index 00000000..2929216f
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/audiofiles/LICENCE
@@ -0,0 +1 @@
+These audio files are BSD-licensed and were created/owned by the PC-BSD Project
diff --git a/src-qt5/core/lumina-desktop/audiofiles/Login.ogg b/src-qt5/core/lumina-desktop/audiofiles/Login.ogg
new file mode 100644
index 00000000..43a07e27
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/audiofiles/Login.ogg
Binary files differ
diff --git a/src-qt5/core/lumina-desktop/audiofiles/Logout.ogg b/src-qt5/core/lumina-desktop/audiofiles/Logout.ogg
new file mode 100644
index 00000000..e63ae07f
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/audiofiles/Logout.ogg
Binary files differ
diff --git a/src-qt5/core/lumina-desktop/defaults/defaultapps.conf b/src-qt5/core/lumina-desktop/defaults/defaultapps.conf
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/defaults/defaultapps.conf
@@ -0,0 +1 @@
+
diff --git a/src-qt5/core/lumina-desktop/defaults/desktop-background.jpg b/src-qt5/core/lumina-desktop/defaults/desktop-background.jpg
new file mode 100644
index 00000000..ddee66ea
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/defaults/desktop-background.jpg
Binary files differ
diff --git a/src-qt5/core/lumina-desktop/defaults/desktop-background.pcbsd.jpg b/src-qt5/core/lumina-desktop/defaults/desktop-background.pcbsd.jpg
new file mode 100644
index 00000000..67ad41f1
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/defaults/desktop-background.pcbsd.jpg
Binary files differ
diff --git a/src-qt5/core/lumina-desktop/defaults/desktopsettings.conf b/src-qt5/core/lumina-desktop/defaults/desktopsettings.conf
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/defaults/desktopsettings.conf
@@ -0,0 +1 @@
+
diff --git a/src-qt5/core/lumina-desktop/defaults/luminaDesktop.conf b/src-qt5/core/lumina-desktop/defaults/luminaDesktop.conf
new file mode 100644
index 00000000..2c973adb
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/defaults/luminaDesktop.conf
@@ -0,0 +1,58 @@
+#This is the configuration file that generates all the default settings files for the Lumina desktop
+# For any setting that can take a list of values, each vale needs to be seperated by a comma and a space (", ")
+# Example: some_setting=item1, item2, item3
+
+#NOTE: To pre-setup default applications for particular mime-types, you need to create *.desktop entries on
+# system corresponding to the XDG mime-type specifications for default applications
+# See Here for specifications: http://www.freedesktop.org/wiki/Specifications/mime-apps-spec/
+
+# Possible Desktop Plugins (Lumina version 0.8.7):
+# calendar, applauncher[::absolute path to *.desktop file], desktopview, notepad, audioplayer
+# Possible Panel Plugins (Lumina version 0.8.7):
+# userbutton, desktopbar, spacer, desktopswitcher, battery, clock, systemdashboard, systemstart
+# taskmanager[-nogroups], systemtray, homebutton, appmenu, applauncher[::absolute path to *.desktop file]
+# Possible Menu Plugins (Lumina version 0.8.7):
+# terminal, filemanager, applications, line, settings, windowlist, app::<absolute path to *.desktop file>
+
+#GENERAL SESSION SETTINGS
+session_enablenumlock=false #[true/false] Enable numlock on login using "numlockx"
+session_playloginaudio=true #[true/false] Play the audio chimes on log in
+session_playlogoutaudio=true #[true/false] Play the audio chimes on log out
+
+# DEFAULT UTILITIES
+# Provide the full path to *.desktop file, or a binary name which exists on PATH
+# *.desktop files provide better support for input formats, and are recommended
+#session_default_terminal=xterm
+#session_default_filemanager=lumina-fm
+#session_default_webbrowser=/usr/local/share/applications/firefox.desktop
+#session_default_email=/usr/local/share/applications/thunderbird.desktop
+
+#THEME SETTINGS
+#theme.themefile=<file path> #Absolute path to the theme template file to use (disable for Lumina-Default)
+theme_colorfile=Black #Name of the color spec file to use for theming
+theme_iconset=oxygen #Name of the icon theme to use
+theme_font=Arial #Name of the font family to use
+theme_fontsize=10pt #Default size of the fonts to use on the desktop (can also use a percentage of the screen height (<number>%) )
+
+#DESKTOP SETTINGS (used for the primary screen in multi-screen setups)
+desktop_visiblepanels=1 #[0/1/2] The number of panels visible by default
+#desktop.backgroundfiles= #list of absolute file paths for image files (disable for Lumina default)
+desktop_backgroundrotateminutes=5 #[positive integer] number of minutes between background rotations (if multiple files)
+desktop_plugins= #list of plugins to be shown on the desktop by default
+desktop_generate_icons=true #[true/false] Auto-generate launchers for ~/Desktop items
+
+#PANEL SETTINGS (preface with panel1.<setting> or panel2.<setting>, depending on the number of panels you have visible by default)
+panel1_location=top #[top/bottom/left/right] Screen edge the panel should be on
+panel1_pixelsize=4%H #number of pixels wide/high the panel should be (or <number>%[W/H] for a percentage of the screen width/height)
+panel1_autohide=false #[true/false] Have the panel become visible on mouse-over
+panel1_plugins=systemstart, taskmanager-nogroups, spacer, systemtray, clock #list of plugins for the panel
+panel1_pinlocation=center #[left/center/right] Note:[left/right] corresponds to [top/bottom] for vertical panels
+panel1_edgepercent=90 #[1->100] percentage of the screen edge to use
+
+#MENU SETTINGS (right-click menu)
+menu_plugins=terminal, filemanager, applications, line, settings #list of menu plugins to show
+
+#FAVORITES CUSTOMIZATION
+#favorites_add=<file/dir path> #Create a favorites entry for this file/dir
+#favorites_remove=<file/dir path> #Remove a favorites entry for this file/dir
+#favorites_add_ifexists=<file/dir path> #Create a favorites entry for this file/dir if the file/dir exists
diff --git a/src-qt5/core/lumina-desktop/defaults/luminaDesktop.pcbsd.conf b/src-qt5/core/lumina-desktop/defaults/luminaDesktop.pcbsd.conf
new file mode 100644
index 00000000..3dd95444
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/defaults/luminaDesktop.pcbsd.conf
@@ -0,0 +1,47 @@
+#PC-BSD configuration file for the Lumina Desktop Environment (0.8.7+)
+
+# See the /usr/local/share/LuminaDE/luminaDesktop.conf file for all the possible values/details
+
+#GENERAL SESSION SETTINGS
+session_enablenumlock=false #[true/false] Enable numlock on login using "numlockx"
+session_playloginaudio=true #[true/false] Play the audio chimes on log in
+session_playlogoutaudio=true #[true/false] Play the audio chimes on log out
+
+#Note: the last "ifexists" entry has the highest priority for the next few options
+session_default_terminal=/usr/local/share/applications/xterm.desktop
+session_default_filemanager=/usr/local/share/applications/lumina-fm.desktop
+session_default_webbrowser_ifexists=/usr/local/share/applications/chromium-browser.desktop
+session_default_webbrowser_ifexists=/usr/local/share/applications/firefox.desktop
+session_default_email_ifexists=/usr/local/share/applications/thunderbird.desktop
+
+#FAVORITES (Not shown on the desktop by default, but in the menu)
+favorites_add_ifexists=/usr/local/share/applications/firefox.desktop
+favorites_add_ifexists=/usr/local/share/applications/chromium-browser.desktop
+favorites_add_ifexists=/usr/local/share/applications/thunderbird.desktop
+favorites_add_ifexists=/usr/local/share/applications/smplayer.desktop
+favorites_add_ifexists=/usr/local/share/applications/vlc.desktop
+favorites_add_ifexists=/usr/local/share/applications/lumina-fm.desktop
+
+#THEME SETTINGS
+#theme.themefile=<file path> #Absolute path to the theme template file to use (disable for Lumina-Default)
+theme_colorfile=/usr/local/share/Lumina-DE/colors/PCBSD10-Default.qss.colors #Absolute path to the color spec file to use for theming
+theme_iconset=oxygen #Name of the icon theme to use
+theme_font=Noto Sans #Name of the font family to use
+theme_fontsize=11pt #Default size of the fonts to use on the desktop
+
+#DESKTOP SETTINGS (used for the left-most screen in multi-screen setups)
+desktop_visiblepanels=1 #The number of panels visible by default
+#desktop_backgroundfiles=/usr/local/share/wallpapers/pcbsd-default.jpg #list of absolute file paths for image files (disable for Lumina default)
+desktop_backgroundrotateminutes=5 #[positive integer] number of minutes between background rotations (if multiple files)
+desktop_generate_icons=true #[true/false] Auto-generate launchers for ~/Desktop items
+
+#PANEL SETTINGS (preface with panel1.<setting> or panel2.<setting>, depending on the number of panels you have visible by default)
+panel1_location=bottom #[top/bottom/left/right] Screen edge the panel should be on
+panel1_pixelsize=4%H #number of pixels wide/high the panel should be (or <number>%[W/H] for a percentage of the screen width/height)
+panel1_autohide=false #[true/false] Have the panel become visible on mouse-over
+panel1_plugins=systemstart, taskmanager-nogroups, spacer, systemtray, clock #list of plugins for the panel
+panel1_pinlocation=center #[left/center/right] Note:[left/right] corresponds to [top/bottom] for vertical panels
+panel1_edgepercent=100 #[1->100] percentage of the screen edge to use
+
+#MENU SETTINGS (right-click menu)
+menu_plugins=terminal, filemanager, applications, line, settings #list of menu plugins to show
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/LDPlugin.cpp b/src-qt5/core/lumina-desktop/desktop-plugins/LDPlugin.cpp
new file mode 100644
index 00000000..69505705
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/LDPlugin.cpp
@@ -0,0 +1,57 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LDPlugin.h"
+
+#include "../LSession.h"
+#include <LuminaXDG.h>
+
+LDPlugin::LDPlugin(QWidget *parent, QString id) : QFrame(parent){
+ PLUGID=id;
+ prefix = id.replace("/","_")+"/";
+ //qDebug() << "ID:" << PLUGID << prefix;
+ settings = LSession::handle()->DesktopPluginSettings();
+ //Setup the plugin system control menu
+ menu = new QMenu(this);
+ setupMenu();
+ //Setup the internal timer for when to start/stop drag events
+ dragTimer = new QTimer(this);
+ dragTimer->setSingleShot(true);
+ dragTimer->setInterval(500); //1/2 second to show the plugin menu
+ connect(dragTimer, SIGNAL(timeout()), this, SLOT(showPluginMenu()));
+ //Use plugin-specific values for stylesheet control (applauncher, desktopview, etc...)
+ this->setObjectName(id.section("---",0,0).section("::",0,0));
+ this->setContextMenuPolicy(Qt::CustomContextMenu);
+ this->setMouseTracking(false); //only catch mouse movement events if the mouse is clicked/held on the plugin
+ connect(QApplication::instance(), SIGNAL(LocaleChanged()), this, SLOT(LocaleChange()) );
+ connect(QApplication::instance(), SIGNAL(IconThemeChanged()), this, SLOT(ThemeChange()) );
+ connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showPluginMenu()) );
+}
+
+void LDPlugin::setupMenu(){
+ menu->clear();
+ menu->addAction( LXDG::findIcon("transform-move",""), tr("Start Moving Item"), this, SLOT(slotStartMove()) );
+ menu->addAction( LXDG::findIcon("transform-scale",""), tr("Start Resizing Item"), this, SLOT(slotStartResize()) );
+ menu->addSeparator();
+ menu->addAction( LXDG::findIcon("zoom-in",""), tr("Increase Item Sizes"), this, SIGNAL(IncreaseIconSize()) );
+ menu->addAction( LXDG::findIcon("zoom-out",""), tr("Decrease Item Sizes"), this, SIGNAL(DecreaseIconSize()) );
+ menu->addSeparator();
+ menu->addAction( LXDG::findIcon("edit-delete",""), tr("Remove Item"), this, SLOT(slotRemovePlugin()) );
+}
+
+/*void LDPlugin::setInitialSize(int width, int height){
+ //Note: Only run this in the plugin initization routine:
+ // if the plugin is completely new (first time used), it will be this size
+ if(settings->allKeys().filter(prefix+"location").isEmpty()){
+ //Brand new plugin: set initial size
+ //qDebug() << "Setting Initial Size:" << PLUGID << width << height;
+ settings->setValue(prefix+"location/width",width);
+ settings->setValue(prefix+"location/height",height);
+ settings->sync();
+ }
+ //Now make sure the plugin is the saved size right away
+ this->resize( settings->value(prefix+"location/width").toInt(), settings->value(prefix+"location/height").toInt());
+}*/ \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/LDPlugin.h b/src-qt5/core/lumina-desktop/desktop-plugins/LDPlugin.h
new file mode 100644
index 00000000..27fcaa24
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/LDPlugin.h
@@ -0,0 +1,155 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This class is the generic container layout for all desktop plugins
+// Simply subclass this when creating a new plugin to enable correct
+// visibility and usage within the desktop window
+//===========================================
+// WARNING: Do *not* setup a custom context menu for the entire plugins area!
+// This can prevent access to the general desktop context menu if
+// the plugin was maximized to fill the desktop area!
+//===========================================
+#ifndef _LUMINA_DESKTOP_DESKTOP_PLUGIN_H
+#define _LUMINA_DESKTOP_DESKTOP_PLUGIN_H
+
+#include <QObject>
+#include <QFrame>
+#include <QWidget>
+#include <QString>
+#include <QDebug>
+#include <QSettings>
+#include <QMoveEvent>
+#include <QResizeEvent>
+#include <QMouseEvent>
+#include <QTimer>
+#include <QMenu>
+
+class LDPlugin : public QFrame{
+ Q_OBJECT
+
+private:
+ QString PLUGID, prefix;
+ QSettings *settings;
+ QMenu *menu;
+ QTimer *dragTimer;
+
+ void setupMenu();
+
+public:
+ LDPlugin(QWidget *parent = 0, QString id="unknown");
+
+ ~LDPlugin(){}
+
+ QString ID(){
+ return PLUGID;
+ }
+
+ virtual QSize defaultPluginSize(){
+ //This needs to be re-implemented in the subclassed plugin
+ // The returned QSize is in grid points (typically 100 or 200 pixels square)
+ return QSize(1,1); //1x1 grid size
+ }
+
+ void savePluginGeometry(QRect geom){
+ settings->setValue(prefix+"geometry/desktopGridPoints", geom);
+ settings->sync();
+ }
+
+ QRect loadPluginGeometry(){
+ return settings->value(prefix+"geometry/desktopGridPoints", QRect()).toRect();
+ }
+
+ void saveSetting(QString var, QVariant val){
+ //qDebug() << "Saving Setting:" << prefix+var+QString(" = ")+val.toString();
+ settings->setValue(prefix+var, val);
+ settings->sync();
+ }
+
+ QVariant readSetting(QString var, QVariant defaultval){
+ return settings->value(prefix+var, defaultval);
+ }
+
+ virtual void Cleanup(){
+ //This needs to be re-implemented in the subclassed plugin
+ //This is where any last-minute changes are performed before a plugin is removed permanently
+ //Note1: This is *not* called if the plugin is being temporarily closed
+ //Note2: All the settings for this plugin will be automatically removed after this is finished
+ }
+
+ void removeSettings(bool permanent = false){ //such as when a plugin is deleted
+ if(permanent){ Cleanup(); }
+ QStringList list = settings->allKeys().filter(prefix);
+ for(int i=0; i<list.length(); i++){ settings->remove(list[i]); }
+
+ }
+
+public slots:
+ virtual void LocaleChange(){
+ //This needs to be re-implemented in the subclassed plugin
+ //This is where all text is set/translated
+ setupMenu();
+ }
+ virtual void ThemeChange(){
+ //This needs to be re-implemented in the subclassed plugin
+ //This is where all the visuals are set if using Theme-dependant icons.
+ setupMenu();
+ }
+ void showPluginMenu(){
+ emit CloseDesktopMenu();
+ menu->popup( QCursor::pos() );
+ }
+
+signals:
+ void OpenDesktopMenu();
+ void CloseDesktopMenu();
+ void PluginResized();
+
+ //Signals for communication with the desktop layout system (not generally used by hand)
+ void StartMoving(QString); //ID of plugin
+ void StartResizing(QString); //ID of plugin
+ void RemovePlugin(QString); //ID of plugin
+ void IncreaseIconSize(); // only used for desktop icons
+ void DecreaseIconSize(); // only used for desktop icons
+
+private slots:
+ void slotStartMove(){
+ QCursor::setPos( this->mapToGlobal(QPoint(this->width()/2, this->height()/2)) );
+ emit StartMoving(PLUGID);
+ }
+
+ void slotStartResize(){
+ QCursor::setPos( this->mapToGlobal(QPoint(this->width()/2, this->height()/2)) );
+ emit StartResizing(PLUGID);
+ }
+
+ void slotRemovePlugin(){
+ removeSettings(true);
+ emit RemovePlugin(PLUGID);
+ }
+
+protected:
+ void mousePressEvent(QMouseEvent *ev){
+ if(!dragTimer->isActive() && ev->buttons().testFlag(Qt::LeftButton) ){ dragTimer->start(); }
+ QWidget::mousePressEvent(ev);
+ }
+ void mouseReleaseEvent(QMouseEvent *ev){
+ if(dragTimer->isActive()){ dragTimer->stop(); }
+ QWidget::mouseReleaseEvent(ev);
+ }
+ void mouseMoveEvent(QMouseEvent *ev){
+ if(ev->buttons().testFlag(Qt::LeftButton)){
+ if(dragTimer->isActive()){ dragTimer->stop(); }
+ slotStartMove();
+ }
+ QWidget::mouseMoveEvent(ev);
+ }
+ void resizeEvent(QResizeEvent *ev){
+ emit PluginResized();
+ QFrame::resizeEvent(ev); //do normal processing
+ }
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/NewDP.h b/src-qt5/core/lumina-desktop/desktop-plugins/NewDP.h
new file mode 100644
index 00000000..a12341bb
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/NewDP.h
@@ -0,0 +1,60 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This class is the interface to load all the different desktop plugins
+//===========================================
+#ifndef _LUMINA_DESKTOP_NEW_DESKTOP_PLUGIN_H
+#define _LUMINA_DESKTOP_NEW_DESKTOP_PLUGIN_H
+
+#include <QDebug>
+
+//List all the individual plugin includes here
+#include "LDPlugin.h"
+//#include "SamplePlugin.h"
+#include "calendar/CalendarPlugin.h"
+#include "applauncher/AppLauncherPlugin.h"
+#include "desktopview/DesktopViewPlugin.h"
+#include "notepad/NotepadPlugin.h"
+#include "audioplayer/PlayerWidget.h"
+#include "systemmonitor/MonitorWidget.h"
+//#include "quickcontainer/QuickDPlugin.h"
+//#include "messagecenter/MessageCenter.h"
+
+class NewDP{
+public:
+ static LDPlugin* createPlugin(QString plugin, QWidget* parent=0){
+ //qDebug() << "Create Plugin:" << plugin;
+ LDPlugin *plug = 0;
+ /*if(plugin.section("---",0,0)=="sample"){
+ plug = new SamplePlugin(parent, plugin);
+ }else */
+ if(plugin.section("---",0,0)=="calendar"){
+ plug = new CalendarPlugin(parent, plugin);
+ }else if(plugin.section("---",0,0).section("::",0,0)=="applauncher"){
+ //This plugin can be pre-initialized to a file path after the "::" delimiter
+ plug = new AppLauncherPlugin(parent, plugin);
+ }else if(plugin.section("---",0,0)=="desktopview"){
+ plug = new DesktopViewPlugin(parent, plugin);
+ }else if(plugin.section("---",0,0)=="notepad"){
+ plug = new NotePadPlugin(parent, plugin);
+ }else if(plugin.section("---",0,0)=="audioplayer"){
+ plug = new AudioPlayerPlugin(parent, plugin);
+ }else if(plugin.section("---",0,0)=="systemmonitor"){
+ plug = new SysMonitorPlugin(parent, plugin);
+ //}else if(plugin.section("---",0,0)=="messagecenter"){
+ //plug = new MessageCenterPlugin(parent, plugin);
+ //}else if(plugin.section("---",0,0).startsWith("quick-") && LUtils::validQuickPlugin(plugin.section("---",0,0)) ){
+ //plug = new QuickDPlugin(parent, plugin);
+ }else{
+ qWarning() << "Invalid Desktop Plugin:"<<plugin << " -- Ignored";
+ }
+ //qDebug() << " -- done";
+ return plug;
+ }
+
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/SamplePlugin.h b/src-qt5/core/lumina-desktop/desktop-plugins/SamplePlugin.h
new file mode 100644
index 00000000..4a790c2d
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/SamplePlugin.h
@@ -0,0 +1,38 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This class is a quick sample desktop plugin
+//===========================================
+#ifndef _LUMINA_DESKTOP_DESKTOP_PLUGIN_SAMPLE_H
+#define _LUMINA_DESKTOP_DESKTOP_PLUGIN_SAMPLE_H
+
+#include <QPushButton>
+#include <QMessageBox>
+#include <QVBoxLayout>
+#include "LDPlugin.h"
+
+class SamplePlugin : public LDPlugin{
+ Q_OBJECT
+public:
+ SamplePlugin(QWidget* parent, QString ID) : LDPlugin(parent, ID){
+ this->setLayout( new QVBoxLayout());
+ this->layout()->setContentsMargins(0,0,0,0);
+ button = new QPushButton("sample");
+ this->layout()->addWidget(button);
+ connect(button, SIGNAL(clicked()), this, SLOT(showMessage()) );
+ }
+
+ ~SamplePlugin(){}
+
+private:
+ QPushButton *button;
+
+private slots:
+ void showMessage(){
+ QMessageBox::information(this,"sample","sample desktop plugin works");
+ }
+};
+#endif
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp
new file mode 100644
index 00000000..101abd31
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp
@@ -0,0 +1,140 @@
+#include "AppLauncherPlugin.h"
+#include "../../LSession.h"
+#include "OutlineToolButton.h"
+
+#define OUTMARGIN 10 //special margin for fonts due to the outlining effect from the OutlineToolbutton
+
+AppLauncherPlugin::AppLauncherPlugin(QWidget* parent, QString ID) : LDPlugin(parent, ID){
+ QVBoxLayout *lay = new QVBoxLayout();
+ this->setLayout(lay);
+ lay->setContentsMargins(0,0,0,0);
+ button = new OutlineToolButton(this);
+ button->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
+ button->setAutoRaise(true);
+ button->setText("...\n..."); //Need to set something here so that initial sizing works properly
+ button->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
+ lay->addWidget(button, 0, Qt::AlignCenter);
+ connect(button, SIGNAL(DoubleClicked()), this, SLOT(buttonClicked()) );
+ button->setContextMenuPolicy(Qt::NoContextMenu);
+ watcher = new QFileSystemWatcher(this);
+ connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT( loadButton()) );
+
+ QTimer::singleShot(200,this, SLOT(loadButton()) );
+}
+
+void AppLauncherPlugin::Cleanup(){
+ //This is run only when the plugin was forcibly closed/removed
+
+}
+
+void AppLauncherPlugin::loadButton(){
+ QString def = this->ID().section("::",1,50).section("---",0,0).simplified();
+ QString path = this->readSetting("applicationpath",def).toString(); //use the default if necessary
+ //qDebug() << "Default Application Launcher:" << def << path;
+ bool ok = QFile::exists(path);
+ if(!ok){ emit RemovePlugin(this->ID()); return;}
+ int icosize = this->height()-4 - 2.2*button->fontMetrics().height();
+ button->setFixedSize( this->width()-4, this->height()-4);
+ button->setIconSize( QSize(icosize,icosize) );
+ QString txt;
+ if(path.endsWith(".desktop") && ok){
+ XDGDesktop file = LXDG::loadDesktopFile(path, ok);
+ if(path.isEmpty() || !QFile::exists(path) || !ok){
+ button->setWhatsThis("");
+ button->setIcon( QIcon(LXDG::findIcon("quickopen-file","").pixmap(QSize(icosize,icosize)).scaledToHeight(icosize, Qt::SmoothTransformation) ) );
+ txt = tr("Click to Set");
+ if(!watcher->files().isEmpty()){ watcher->removePaths(watcher->files()); }
+ }else{
+ button->setWhatsThis(file.filePath);
+ button->setIcon( QIcon(LXDG::findIcon(file.icon,"quickopen").pixmap(QSize(icosize,icosize)).scaledToHeight(icosize, Qt::SmoothTransformation) ) );
+ txt = file.name;
+ if(!watcher->files().isEmpty()){ watcher->removePaths(watcher->files()); }
+ watcher->addPath(file.filePath); //make sure to update this shortcut if the file changes
+ }
+ }else if(ok){
+ QFileInfo info(path);
+ button->setWhatsThis(info.absoluteFilePath());
+ if(info.isDir()){
+ button->setIcon( LXDG::findIcon("folder","") );
+ }else if(LUtils::imageExtensions().contains(info.suffix().toLower()) ){
+ button->setIcon( QIcon(QPixmap(path).scaled(256,256)) ); //max size for thumbnails in memory
+ }else{
+ button->setIcon( QIcon(LXDG::findMimeIcon(path).pixmap(QSize(icosize,icosize)).scaledToHeight(icosize, Qt::SmoothTransformation) ) );
+ }
+ txt = info.fileName();
+ if(!watcher->files().isEmpty()){ watcher->removePaths(watcher->files()); }
+ watcher->addPath(path); //make sure to update this shortcut if the file changes
+ }else{
+ //InValid File
+ button->setWhatsThis("");
+ button->setIcon( QIcon(LXDG::findIcon("quickopen","").pixmap(QSize(icosize,icosize)).scaledToHeight(icosize, Qt::SmoothTransformation) ) );
+ button->setText( tr("Click to Set") );
+ if(!watcher->files().isEmpty()){ watcher->removePaths(watcher->files()); }
+ }
+ //If the file is a symlink, put the overlay on the icon
+ if(QFileInfo(path).isSymLink()){
+ QImage img = button->icon().pixmap(QSize(icosize,icosize)).toImage();
+ int oSize = icosize/3; //overlay size
+ QPixmap overlay = LXDG::findIcon("emblem-symbolic-link").pixmap(oSize,oSize).scaled(oSize,oSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+ QPainter painter(&img);
+ painter.drawPixmap(icosize-oSize,icosize-oSize,overlay); //put it in the bottom-right corner
+ button->setIcon( QIcon(QPixmap::fromImage(img)) );
+ }
+ //Now adjust the visible text as necessary based on font/grid sizing
+ button->setToolTip(txt);
+ //Double check that the visual icon size matches the requested size - otherwise upscale the icon
+ if(button->fontMetrics().width(txt) > (button->width()-OUTMARGIN) ){
+ //Text too long, try to show it on two lines
+ //txt = button->fontMetrics().elidedText(txt, Qt::ElideRight, 2*(button->width()-OUTMARGIN), Qt::TextWordWrap);
+ txt =txt.section(" ",0,2).replace(" ","\n"); //First take care of any natural breaks
+ //Go through and combine any lines
+ if(txt.contains("\n")){
+ //need to check each line
+ QStringList txtL = txt.split("\n");
+ for(int i=0; i<txtL.length(); i++){
+ if(( i+1<txtL.length()) && (button->fontMetrics().width(txtL[i]) < button->width()/2) ){
+ txtL[i] = txtL[i]+" "+txtL[i+1];
+ txtL.removeAt(i+1);
+ }
+ }
+ txt = txtL.join("\n").section("\n",0,2);
+ }
+
+ if(txt.contains("\n")){
+ //need to check each line
+ QStringList txtL = txt.split("\n");
+ for(int i=0; i<txtL.length(); i++){
+ if(i>1){ txtL.removeAt(i); i--; } //Only take the first two lines
+ else{ txtL[i] = button->fontMetrics().elidedText(txtL[i], Qt::ElideRight, (button->width()-OUTMARGIN) ); }
+ }
+ txt = txtL.join("\n");
+ }else{
+ txt = this->fontMetrics().elidedText(txt,Qt::ElideRight, 2*(button->width()-OUTMARGIN));
+ //Now split the line in half for the two lines
+ txt.insert( ((txt.count())/2), "\n");
+ }
+ }
+ if(!txt.contains("\n")){ txt.append("\n "); } //always use two lines
+ //qDebug() << " - Setting Button Text:" << txt;
+ button->setText(txt);
+
+ QTimer::singleShot(100, this, SLOT(update()) ); //Make sure to re-draw the image in a moment
+}
+
+void AppLauncherPlugin::buttonClicked(){
+ QString path = button->whatsThis();
+ if(path.isEmpty() || !QFile::exists(path) ){
+ //prompt for the user to select an application
+ QList<XDGDesktop> apps = LXDG::sortDesktopNames( LXDG::systemDesktopFiles() );
+ QStringList names;
+ for(int i=0; i<apps.length(); i++){ names << apps[i].name; }
+ bool ok = false;
+ QString app = QInputDialog::getItem(this, tr("Select Application"), tr("Name:"), names, 0, false, &ok);
+ if(!ok || names.indexOf(app)<0){ return; } //cancelled
+ this->saveSetting("applicationpath", apps[ names.indexOf(app) ].filePath);
+ QTimer::singleShot(0,this, SLOT(loadButton()));
+ }else{
+ LSession::LaunchApplication("lumina-open \""+path+"\"");
+ }
+
+} \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.h b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.h
new file mode 100644
index 00000000..a0f6a7cd
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.h
@@ -0,0 +1,59 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This class is a quick sample desktop plugin
+//===========================================
+#ifndef _LUMINA_DESKTOP_DESKTOP_PLUGIN_APPLICATION_LAUNCHER_H
+#define _LUMINA_DESKTOP_DESKTOP_PLUGIN_APPLICATION_LAUNCHER_H
+
+#include <QToolButton>
+#include <QInputDialog>
+#include <QVBoxLayout>
+#include <QProcess>
+#include <QFile>
+#include <QFileSystemWatcher>
+#include <QTimer>
+#include <QMenu>
+#include <QCursor>
+
+#include "../LDPlugin.h"
+
+#include <LuminaXDG.h>
+
+class AppLauncherPlugin : public LDPlugin{
+ Q_OBJECT
+public:
+ AppLauncherPlugin(QWidget* parent, QString ID);
+ ~AppLauncherPlugin(){}
+
+ void Cleanup(); //special function for final cleanup
+
+private:
+ QToolButton *button;
+ QFileSystemWatcher *watcher;
+ //QMenu *menu;
+
+private slots:
+ void loadButton();
+ void buttonClicked();
+ //void openContextMenu();
+
+ //void increaseIconSize();
+ //void decreaseIconSize();
+ //void deleteFile();
+
+public slots:
+ void LocaleChange(){
+ loadButton(); //force reload
+ }
+
+protected:
+ void resizeEvent(QResizeEvent *ev){
+ LDPlugin::resizeEvent(ev);
+ QTimer::singleShot(100, this, SLOT(loadButton()) );
+ }
+};
+#endif
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/OutlineToolButton.h b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/OutlineToolButton.h
new file mode 100644
index 00000000..eaf9e23e
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/OutlineToolButton.h
@@ -0,0 +1,98 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This is a simple subclass for a QToolButton with black/white text (for transparent backgrounds)
+//===========================================
+#ifndef _LUMINA_DESKTOP_PLUGIN_APPLAUNCHER_OUTLINE_TOOLBUTTON_H
+#define _LUMINA_DESKTOP_PLUGIN_APPLAUNCHER_OUTLINE_TOOLBUTTON_H
+
+#include <QToolButton>
+#include <QPainter>
+#include <QPainterPath>
+#include <QPen>
+#include <QStyle>
+#include <QStyleOption>
+#include <QStylePainter>
+#include <QFont>
+#include <QDebug>
+#include <QMouseEvent>
+
+
+class OutlineToolButton : public QToolButton{
+ Q_OBJECT
+public:
+ OutlineToolButton(QWidget *parent=0) : QToolButton(parent){
+ //This button needs slightly different font settings - do this in the constructor so that other widgets can take it into account.
+ QFont font = this->font();
+ font.setStyleStrategy(QFont::PreferAntialias); //Always set the font strategy (just in case it starts working down the road)
+ this->setFont(font);
+ }
+ ~OutlineToolButton(){}
+
+signals:
+ void DoubleClicked();
+
+protected:
+ void mouseDoubleClickEvent(QMouseEvent *ev){
+ ev->accept();
+ emit DoubleClicked();
+ }
+ void mousePressEvent(QMouseEvent *ev){
+ ev->ignore();
+ }
+ void mouseReleaseEvent(QMouseEvent *ev){
+ ev->ignore();
+ }
+
+ void paintEvent(QPaintEvent*){
+ /* NOTE: This is what a standard QToolButton performs (peeked at Qt source code for this tidbit)
+ QStylePainter p(this);
+ QStyleOptionToolButton opt;
+ initStyleOption(&opt);
+ p.drawComplexControl(QStyle::CC_ToolButton, opt);
+ */
+
+ //Modify the standard QToolButton routine to paint the text differently
+ QStylePainter p(this);
+ QStyleOptionToolButton opt;
+ initStyleOption(&opt);
+ opt.font = this->property("font").value<QFont>(); //This ensures that the stylesheet values are incorporated
+ opt.font.setStyleStrategy(QFont::PreferAntialias); //Always set the font strategy (just in case it starts working down the road)
+ opt.font.setKerning(true);
+ opt.fontMetrics = QFontMetrics(opt.font);
+ opt.text.clear(); //Don't paint the text yet - just the background/icon
+ p.drawComplexControl(QStyle::CC_ToolButton, opt); //This does all the normal QToolButton stuff - just not text
+ //Now get the text rectangle for the widget
+ QRect box = p.style()->itemTextRect(opt.fontMetrics, opt.rect, Qt::AlignHCenter | Qt::AlignBottom, true, this->text());
+ //Get the QColors for the outline/text
+ QColor textC = opt.palette.text().color().toHsl(); //need the lightness value in a moment
+ QColor outC = textC;
+ //qDebug() << "Font Color Values:" << textC << textC.lightness() << textC.lightnessF();
+ if(textC.lightnessF() > 0.5){ outC.setHsl(textC.hue(), textC.hslSaturation(), 0, 90); }
+ else{outC.setHsl(textC.hue(), textC.hslSaturation(), 255, 50); }
+ //qDebug() << "Outline Color Values:" << outC;
+ //Now get the size of the outline border (need to scale for high-res monitors)
+ qreal OWidth = opt.fontMetrics.width("o")/2.0;
+ //qDebug() << "Outline Width:" << OWidth;
+ //Now generate a QPainterPath for the text
+ QPainterPath path;
+ QStringList txt = this->text().split("\n"); //need each line independently, the newline actually gets painted otherwise
+ for(int i=0; i<txt.length(); i++){
+ path.addText(box.center().x() - (opt.fontMetrics.width(txt[i])/2), box.y()+((i+1)*(box.height()/txt.length()))-opt.fontMetrics.descent(), opt.font, txt[i] );
+ }
+ path.setFillRule(Qt::WindingFill);
+ //Now paint the text
+ QRadialGradient RG(box.center(), box.width()*1.5); //width is always going to be greater than height
+ RG.setColorAt(0, outC);
+ RG.setColorAt(1, Qt::transparent);
+ p.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); //need antialiasing for this to work well (sub-pixel painting)
+ p.strokePath(path, QPen(QBrush(RG),OWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin) ); //This will be the outline - 1pixel thick, semi-transparent
+ p.fillPath(path, QBrush(textC)); //this will be the inside/text color
+
+ }
+
+};
+#endif
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/audioplayer/PlayerWidget.cpp b/src-qt5/core/lumina-desktop/desktop-plugins/audioplayer/PlayerWidget.cpp
new file mode 100644
index 00000000..4d293b39
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/audioplayer/PlayerWidget.cpp
@@ -0,0 +1,269 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "PlayerWidget.h"
+#include "ui_PlayerWidget.h"
+
+#include <QDir>
+#include <QUrl>
+#include <QInputDialog>
+#include <QFileDialog>
+#include <LuminaXDG.h>
+#include <QDebug>
+#include <QDesktopWidget>
+
+PlayerWidget::PlayerWidget(QWidget *parent) : QWidget(parent), ui(new Ui::PlayerWidget()){
+ ui->setupUi(this); //load the designer form
+ PLAYER = new QMediaPlayer(this);
+ PLAYER->setVolume(100);
+ PLAYER->setNotifyInterval(1000); //1 second interval (just needs to be a rough estimate)
+ PLAYLIST = new QMediaPlaylist(this);
+ PLAYLIST->setPlaybackMode(QMediaPlaylist::Sequential);
+ PLAYER->setPlaylist(PLAYLIST);
+
+ configMenu = new QMenu(this);
+ ui->tool_config->setMenu(configMenu);
+ addMenu = new QMenu(this);
+ ui->tool_add->setMenu(addMenu);
+
+ updatinglists = false; //start off as false
+
+ LoadIcons();
+ playerStateChanged(); //update button visibility
+ currentSongChanged();
+ //Connect all the signals/slots
+ //connect(infoTimer, SIGNAL(timeout()), this, SLOT(rotateTrackInfo()) );
+ connect(PLAYER, SIGNAL(positionChanged(qint64)),this, SLOT(updateProgress(qint64)) );
+ connect(PLAYER, SIGNAL(durationChanged(qint64)), this, SLOT(updateMaxProgress(qint64)) );
+ connect(PLAYLIST, SIGNAL(mediaChanged(int, int)), this, SLOT(playlistChanged()) );
+ connect(PLAYER, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(playerStateChanged()) );
+ connect(PLAYLIST, SIGNAL(currentMediaChanged(const QMediaContent&)), this, SLOT(currentSongChanged()) );
+ connect(ui->combo_playlist, SIGNAL(currentIndexChanged(int)), this, SLOT(userlistSelectionChanged()) );
+ connect(ui->tool_play, SIGNAL(clicked()), this, SLOT(playClicked()) );
+ connect(ui->tool_pause, SIGNAL(clicked()), this, SLOT(pauseClicked()) );
+ connect(ui->tool_stop, SIGNAL(clicked()), this, SLOT(stopClicked()) );
+ connect(ui->tool_next, SIGNAL(clicked()), this, SLOT(nextClicked()) );
+ connect(ui->tool_prev, SIGNAL(clicked()), this, SLOT(prevClicked()) );
+
+}
+
+PlayerWidget::~PlayerWidget(){
+ //qDebug() << "Removing PlayerWidget";
+}
+
+void PlayerWidget::LoadIcons(){
+ ui->tool_stop->setIcon( LXDG::findIcon("media-playback-stop","") );
+ ui->tool_play->setIcon( LXDG::findIcon("media-playback-start","") );
+ ui->tool_pause->setIcon( LXDG::findIcon("media-playback-pause","") );
+ ui->tool_next->setIcon( LXDG::findIcon("media-skip-forward","") );
+ ui->tool_prev->setIcon( LXDG::findIcon("media-skip-backward","") );
+ ui->tool_add->setIcon( LXDG::findIcon("list-add","") );
+ ui->tool_config->setIcon( LXDG::findIcon("configure","") );
+ //Now re-assemble the menus as well
+ configMenu->clear();
+ configMenu->addAction(LXDG::findIcon("media-eject",""), tr("Clear Playlist"), this, SLOT(ClearPlaylist()));
+ configMenu->addAction(LXDG::findIcon("roll",""), tr("Shuffle Playlist"), this, SLOT(ShufflePlaylist()));
+ addMenu->clear();
+ addMenu->addAction(LXDG::findIcon("document-new",""), tr("Add Files"), this, SLOT(AddFilesToPlaylist()));
+ addMenu->addAction(LXDG::findIcon("folder-new",""), tr("Add Directory"), this, SLOT(AddDirToPlaylist()));
+ addMenu->addAction(LXDG::findIcon("download",""), tr("Add URL"), this, SLOT(AddURLToPlaylist()));
+}
+
+void PlayerWidget::playClicked(){
+ PLAYER->play();
+}
+
+void PlayerWidget::pauseClicked(){
+ PLAYER->pause();
+}
+
+void PlayerWidget::stopClicked(){
+ PLAYER->stop();
+}
+
+void PlayerWidget::nextClicked(){
+ PLAYLIST->next();
+}
+
+void PlayerWidget::prevClicked(){
+ PLAYLIST->previous();
+}
+
+void PlayerWidget::AddFilesToPlaylist(){
+ //Prompt the user to select multimedia files
+ QFileDialog dlg(0, Qt::Dialog | Qt::WindowStaysOnTopHint );
+ dlg.setFileMode(QFileDialog::ExistingFiles);
+ dlg.setAcceptMode(QFileDialog::AcceptOpen);
+ dlg.setNameFilter( tr("Multimedia Files")+" ("+LXDG::findAVFileExtensions().join(" ")+")");
+ dlg.setWindowTitle(tr("Select Multimedia Files"));
+ dlg.setWindowIcon( LXDG::findIcon("file-open","") );
+ dlg.setDirectory(QDir::homePath()); //start in the home directory
+ //ensure it is centered on the current screen
+ QPoint center = QApplication::desktop()->screenGeometry(this).center();
+ dlg.move( center.x()-(dlg.width()/2), center.y()-(dlg.height()/2) );
+ dlg.show();
+ while( dlg.isVisible() ){
+ QApplication::processEvents();
+ }
+ QList<QUrl> files = dlg.selectedUrls();
+ if(files.isEmpty() || dlg.result()!=QDialog::Accepted){ return; } //cancelled
+ //Make this use show/processEvents later
+ //QList<QUrl> files = QFileDialog::getOpenFileUrls(0, tr("Select Multimedia Files"), QDir::homePath(), "Multimedia Files ("+LXDG::findAVFileExtensions().join(" ")+")");
+ QList<QMediaContent> urls;
+ for(int i=0; i<files.length(); i++){
+ urls << QMediaContent(files[i]);
+ }
+ PLAYLIST->addMedia(urls);
+ playlistChanged();
+}
+
+void PlayerWidget::AddDirToPlaylist(){
+ QFileDialog dlg(0, Qt::Dialog | Qt::WindowStaysOnTopHint );
+ dlg.setFileMode(QFileDialog::Directory);
+ dlg.setOption(QFileDialog::ShowDirsOnly, true);
+ dlg.setAcceptMode(QFileDialog::AcceptOpen);
+ dlg.setWindowTitle(tr("Select Multimedia Directory"));
+ dlg.setWindowIcon( LXDG::findIcon("folder-open","") );
+ dlg.setDirectory(QDir::homePath()); //start in the home directory
+ //ensure it is centered on the current screen
+ QPoint center = QApplication::desktop()->screenGeometry(this).center();
+ dlg.move( center.x()-(dlg.width()/2), center.y()-(dlg.height()/2) );
+ dlg.show();
+ while( dlg.isVisible() ){
+ QApplication::processEvents();
+ }
+ if(dlg.result() != QDialog::Accepted){ return; } //cancelled
+ QStringList sel = dlg.selectedFiles();
+ if(sel.isEmpty()){ return; } //cancelled
+ QString dirpath = sel.first(); //QFileDialog::getExistingDirectory(0, tr("Select a Multimedia Directory"), QDir::homePath() );
+ if(dirpath.isEmpty()){ return; } //cancelled
+ QDir dir(dirpath);
+ QFileInfoList files = dir.entryInfoList(LXDG::findAVFileExtensions(), QDir::Files | QDir::NoDotAndDotDot, QDir::Name);
+ if(files.isEmpty()){ return; } //nothing in this directory
+ QList<QMediaContent> urls;
+ for(int i=0; i<files.length(); i++){
+ urls << QMediaContent(QUrl::fromLocalFile(files[i].absoluteFilePath()) );
+ }
+ PLAYLIST->addMedia(urls);
+ playlistChanged();
+}
+
+void PlayerWidget::AddURLToPlaylist(){
+ QInputDialog dlg(0, Qt::Dialog | Qt::WindowStaysOnTopHint );
+ dlg.setInputMode(QInputDialog::TextInput);
+ dlg.setLabelText(tr("Enter a valid URL for a multimedia file or stream:"));
+ dlg.setTextEchoMode(QLineEdit::Normal);
+ dlg.setWindowTitle(tr("Multimedia URL"));
+ dlg.setWindowIcon( LXDG::findIcon("download","") );
+ //ensure it is centered on the current screen
+ QPoint center = QApplication::desktop()->screenGeometry(this).center();
+ dlg.move( center.x()-(dlg.width()/2), center.y()-(dlg.height()/2) );
+ dlg.show();
+ while( dlg.isVisible() ){
+ QApplication::processEvents();
+ }
+ QString url = dlg.textValue();
+ if(url.isEmpty() || dlg.result()!=QDialog::Accepted){ return; } //cancelled
+
+ //QString url = QInputDialog::getText(0, tr("Multimedia URL"), tr("Enter a valid URL for a multimedia file or stream"), QLineEdit::Normal);
+ //if(url.isEmpty()){ return; }
+ QUrl newurl(url);
+ if(!newurl.isValid()){ return; } //invalid URL
+ PLAYLIST->addMedia(newurl);
+ playlistChanged();
+}
+
+void PlayerWidget::ClearPlaylist(){
+ PLAYER->stop();
+ PLAYLIST->clear();
+ playlistChanged();
+}
+
+void PlayerWidget::ShufflePlaylist(){
+ PLAYLIST->shuffle();
+}
+
+
+void PlayerWidget::userlistSelectionChanged(){ //front-end combobox was changed by the user
+ if(updatinglists){ return; }
+ PLAYLIST->setCurrentIndex( ui->combo_playlist->currentIndex() );
+}
+
+void PlayerWidget::playerStateChanged(){
+ switch( PLAYER->state() ){
+ case QMediaPlayer::StoppedState:
+ ui->tool_stop->setVisible(false);
+ ui->tool_play->setVisible(true);
+ ui->tool_pause->setVisible(false);
+ ui->progressBar->setVisible(false);
+ break;
+ case QMediaPlayer::PausedState:
+ ui->tool_stop->setVisible(true);
+ ui->tool_play->setVisible(true);
+ ui->tool_pause->setVisible(false);
+ ui->progressBar->setVisible(true);
+ break;
+ case QMediaPlayer::PlayingState:
+ ui->tool_stop->setVisible(true);
+ ui->tool_play->setVisible(false);
+ ui->tool_pause->setVisible(true);
+ ui->progressBar->setVisible(true);
+ break;
+ }
+
+}
+
+void PlayerWidget::playlistChanged(){
+ updatinglists = true;
+ ui->combo_playlist->clear();
+ for(int i=0; i<PLAYLIST->mediaCount(); i++){
+ QUrl url = PLAYLIST->media(i).canonicalUrl();
+ if(url.isLocalFile()){
+ ui->combo_playlist->addItem(LXDG::findMimeIcon(url.fileName().section(".",-1)), url.fileName() );
+ }else{
+ ui->combo_playlist->addItem(LXDG::findIcon("download",""), url.toString() );
+ }
+ }
+ if(PLAYLIST->currentIndex()<0 && PLAYLIST->mediaCount()>0){ PLAYLIST->setCurrentIndex(0); }
+ ui->combo_playlist->setCurrentIndex(PLAYLIST->currentIndex());
+
+ updatinglists = false;
+}
+
+void PlayerWidget::currentSongChanged(){
+ if(PLAYLIST->currentIndex() != ui->combo_playlist->currentIndex()){
+ updatinglists = true;
+ ui->combo_playlist->setCurrentIndex(PLAYLIST->currentIndex());
+ updatinglists = false;
+ }
+ ui->tool_next->setEnabled( PLAYLIST->nextIndex() >= 0 );
+ ui->tool_prev->setEnabled( PLAYLIST->previousIndex() >= 0);
+ ui->label_num->setText( QString::number( PLAYLIST->currentIndex()+1)+"/"+QString::number(PLAYLIST->mediaCount()) );
+ ui->progressBar->setRange(0, PLAYER->duration() );
+ ui->progressBar->setValue(0);
+}
+
+void PlayerWidget::updateProgress(qint64 val){
+ //qDebug() << "Update Progress Bar:" << val;
+ ui->progressBar->setValue(val);
+}
+
+void PlayerWidget::updateMaxProgress(qint64 val){
+ ui->progressBar->setRange(0,val);
+}
+
+
+AudioPlayerPlugin::AudioPlayerPlugin(QWidget *parent, QString ID) : LDPlugin(parent, ID){
+ player = new PlayerWidget(this);
+ this->setLayout( new QVBoxLayout() );
+ this->layout()->setContentsMargins(0,0,0,0);
+ this->layout()->addWidget(player);
+
+}
+
+AudioPlayerPlugin::~AudioPlayerPlugin(){
+ //qDebug() << "Remove AudioPlayerPlugin";
+} \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/audioplayer/PlayerWidget.h b/src-qt5/core/lumina-desktop/desktop-plugins/audioplayer/PlayerWidget.h
new file mode 100644
index 00000000..6aaeac4c
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/audioplayer/PlayerWidget.h
@@ -0,0 +1,84 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This plugin is a simple audio player on the desktop
+//===========================================
+#ifndef _LUMINA_DESKTOP_PLUGIN_AUDIO_PLAYER_WIDGET_H
+#define _LUMINA_DESKTOP_PLUGIN_AUDIO_PLAYER_WIDGET_H
+
+#include <QMediaPlaylist>
+#include <QMediaPlayer>
+#include <QTimer>
+#include <QWidget>
+#include <QMenu>
+
+#include "../LDPlugin.h"
+
+namespace Ui{
+ class PlayerWidget;
+};
+
+class PlayerWidget : public QWidget{
+ Q_OBJECT
+public:
+ PlayerWidget(QWidget *parent = 0);
+ ~PlayerWidget();
+
+public slots:
+ void LoadIcons();
+
+private:
+ Ui::PlayerWidget *ui;
+ QMediaPlaylist *PLAYLIST;
+ QMediaPlayer *PLAYER;
+ QMenu *configMenu, *addMenu;
+ bool updatinglists;
+
+private slots:
+ void playClicked();
+ void pauseClicked();
+ void stopClicked();
+ void nextClicked();
+ void prevClicked();
+
+ void AddFilesToPlaylist();
+ void AddDirToPlaylist();
+ void AddURLToPlaylist();
+ void ClearPlaylist();
+ void ShufflePlaylist();
+ void userlistSelectionChanged(); //front-end combobox was changed by the user
+ void playerStateChanged();
+ void playlistChanged(); //list of items changed
+ void currentSongChanged();
+ void updateProgress(qint64 val);
+ void updateMaxProgress(qint64 val);
+};
+
+// Wrapper class to put this into a desktop plugin container
+class AudioPlayerPlugin : public LDPlugin{
+ Q_OBJECT
+public:
+ AudioPlayerPlugin(QWidget* parent, QString ID);
+ ~AudioPlayerPlugin();
+
+ virtual QSize defaultPluginSize(){
+ // The returned QSize is in grid points (typically 100 or 200 pixels square)
+ return QSize(3,1);
+ }
+
+private:
+ PlayerWidget *player;
+
+public slots:
+ void LocaleChange(){
+ QTimer::singleShot(0,player, SLOT(LoadIcons()));
+ }
+ void ThemeChange(){
+ QTimer::singleShot(0,player, SLOT(LoadIcons()));
+ }
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/audioplayer/PlayerWidget.ui b/src-qt5/core/lumina-desktop/desktop-plugins/audioplayer/PlayerWidget.ui
new file mode 100644
index 00000000..b1e7ee59
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/audioplayer/PlayerWidget.ui
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PlayerWidget</class>
+ <widget class="QWidget" name="PlayerWidget">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>346</width>
+ <height>81</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">QToolButton::menu-indicator{ image: none; }</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>4</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QToolButton" name="tool_config">
+ <property name="text">
+ <string notr="true">Config</string>
+ </property>
+ <property name="popupMode">
+ <enum>QToolButton::InstantPopup</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_add">
+ <property name="text">
+ <string notr="true">Add</string>
+ </property>
+ <property name="popupMode">
+ <enum>QToolButton::InstantPopup</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </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="QToolButton" name="tool_prev">
+ <property name="text">
+ <string notr="true">prev</string>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_num">
+ <property name="text">
+ <string notr="true">1/10</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_next">
+ <property name="text">
+ <string notr="true">next</string>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QComboBox" name="combo_playlist"/>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QToolButton" name="tool_play">
+ <property name="text">
+ <string notr="true">Play</string>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_pause">
+ <property name="text">
+ <string notr="true">Pause</string>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_stop">
+ <property name="text">
+ <string notr="true">Stop</string>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <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="QProgressBar" name="progressBar">
+ <property name="value">
+ <number>24</number>
+ </property>
+ <property name="textVisible">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </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>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/calendar/CalendarPlugin.h b/src-qt5/core/lumina-desktop/desktop-plugins/calendar/CalendarPlugin.h
new file mode 100644
index 00000000..b3a6a8d7
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/calendar/CalendarPlugin.h
@@ -0,0 +1,58 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This class is a quick sample desktop plugin
+//===========================================
+#ifndef _LUMINA_DESKTOP_DESKTOP_PLUGIN_CALENDAR_H
+#define _LUMINA_DESKTOP_DESKTOP_PLUGIN_CALENDAR_H
+
+#include <QCalendarWidget>
+#include <QVBoxLayout>
+#include <QDate>
+#include <QTimer>
+#include "../LDPlugin.h"
+
+class CalendarPlugin : public LDPlugin{
+ Q_OBJECT
+private:
+ QCalendarWidget *cal;
+ QTimer *timer;
+
+public:
+ CalendarPlugin(QWidget* parent, QString ID) : LDPlugin(parent, ID){
+ this->setLayout( new QVBoxLayout());
+ this->layout()->setContentsMargins(0,0,0,0);
+ cal = new QCalendarWidget(this);
+ cal->setSelectionMode(QCalendarWidget::NoSelection);
+ this->layout()->addWidget(cal);
+ timer = new QTimer(this);
+ timer->setInterval(1800000); //30 minute refresh timer
+ timer->start();
+ QTimer::singleShot(0,this, SLOT(updateDate()) );
+ connect(this, SIGNAL(PluginResized()), this, SLOT(UpdateCalendarSize()));
+ }
+
+ ~CalendarPlugin(){ timer->stop(); }
+
+ virtual QSize defaultPluginSize(){
+ // The returned QSize is in grid points (typically 100 or 200 pixels square)
+ return QSize(3,2);
+ }
+
+private slots:
+ void updateDate(){
+ if(cal->selectedDate() != QDate::currentDate()){
+ cal->setSelectedDate(QDate::currentDate());
+ cal->showSelectedDate();
+ }
+ }
+ void UpdateCalendarSize(){
+ cal->setFixedSize(this->size());
+ }
+
+
+};
+#endif
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/desktop-plugins.pri b/src-qt5/core/lumina-desktop/desktop-plugins/desktop-plugins.pri
new file mode 100644
index 00000000..5a631b52
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/desktop-plugins.pri
@@ -0,0 +1,19 @@
+SOURCES += $$PWD/applauncher/AppLauncherPlugin.cpp \
+ $$PWD/desktopview/DesktopViewPlugin.cpp \
+ $$PWD/notepad/NotepadPlugin.cpp \
+ $$PWD/audioplayer/PlayerWidget.cpp \
+ $$PWD/systemmonitor/MonitorWidget.cpp
+# $$PWD/messagecenter/MessageCenter.cpp
+
+HEADERS += $$PWD/calendar/CalendarPlugin.h \
+ $$PWD/applauncher/AppLauncherPlugin.h \
+ $$PWD/applauncher/OutlineToolButton.h \
+ $$PWD/desktopview/DesktopViewPlugin.h \
+ $$PWD/notepad/NotepadPlugin.h \
+ $$PWD/audioplayer/PlayerWidget.h \
+ $$PWD/systemmonitor/MonitorWidget.h
+# $$PWD/quickcontainer/QuickDPlugin.h
+# $$PWD/messagecenter/MessageCenter.h
+
+FORMS += $$PWD/audioplayer/PlayerWidget.ui \
+ $$PWD/systemmonitor/MonitorWidget.ui \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.cpp b/src-qt5/core/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.cpp
new file mode 100644
index 00000000..01e174e9
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.cpp
@@ -0,0 +1,215 @@
+#include "DesktopViewPlugin.h"
+
+#include <QFileInfo>
+#include <QDir>
+#include <QClipboard>
+#include <QMimeData>
+#include <QImageReader>
+
+#include <LuminaXDG.h>
+#include "LSession.h"
+
+
+DesktopViewPlugin::DesktopViewPlugin(QWidget* parent, QString ID) : LDPlugin(parent, ID){
+ this->setLayout( new QVBoxLayout());
+ this->layout()->setContentsMargins(0,0,0,0);
+
+ list = new QListWidget(this);
+ list->setViewMode(QListView::IconMode);
+ list->setFlow(QListWidget::TopToBottom); //Qt bug workaround - need the opposite flow in the widget constructor
+ list->setWrapping(true);
+ list->setSpacing(4);
+ list->setSelectionBehavior(QAbstractItemView::SelectItems);
+ list->setSelectionMode(QAbstractItemView::ExtendedSelection);
+ list->setContextMenuPolicy(Qt::CustomContextMenu);
+ list->setMovement(QListView::Snap); //make sure items are "stuck" in the grid
+
+ menu = new QMenu(this);
+ menu->addAction( LXDG::findIcon("run-build-file",""), tr("Open"), this, SLOT(runItems()) );
+ menu->addSeparator();
+ menu->addAction( LXDG::findIcon("edit-cut",""), tr("Cut"), this, SLOT(cutItems()) );
+ menu->addAction( LXDG::findIcon("edit-copy",""), tr("Copy"), this, SLOT(copyItems()) );
+ menu->addSeparator();
+ menu->addAction( LXDG::findIcon("zoom-in",""), tr("Increase Icons"), this, SLOT(increaseIconSize()) );
+ menu->addAction( LXDG::findIcon("zoom-out",""), tr("Decrease Icons"), this, SLOT(decreaseIconSize()) );
+ menu->addSeparator();
+ menu->addAction( LXDG::findIcon("edit-delete",""), tr("Delete"), this, SLOT(deleteItems()) );
+ menu->addSeparator();
+ if(LUtils::isValidBinary("lumina-fileinfo")){
+ menu->addAction( LXDG::findIcon("system-search",""), tr("Properties"), this, SLOT(displayProperties()) );
+ }
+ this->layout()->addWidget(list);
+
+ connect(QApplication::instance(), SIGNAL(DesktopFilesChanged()), this, SLOT(updateContents()) );
+ connect(list, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(runItems()) );
+ connect(list, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showMenu(const QPoint&)) );
+ QTimer::singleShot(1000,this, SLOT(updateContents()) ); //wait a second before loading contents
+}
+
+DesktopViewPlugin::~DesktopViewPlugin(){
+
+}
+
+void DesktopViewPlugin::runItems(){
+ QList<QListWidgetItem*> sel = list->selectedItems();
+ for(int i=0; i<sel.length(); i++){
+ LSession::LaunchApplication("lumina-open \""+sel[i]->whatsThis()+"\"");
+ }
+}
+
+void DesktopViewPlugin::copyItems(){
+ QList<QListWidgetItem*> sel = list->selectedItems();
+ if(sel.isEmpty()){ return; } //nothing selected
+ QStringList items;
+ //Format the data string
+ for(int i=0; i<sel.length(); i++){
+ items << "copy::::"+sel[i]->whatsThis();
+ }
+ //Now save that data to the global clipboard
+ QMimeData *dat = new QMimeData;
+ dat->clear();
+ dat->setData("x-special/lumina-copied-files", items.join("\n").toLocal8Bit());
+ QApplication::clipboard()->clear();
+ QApplication::clipboard()->setMimeData(dat);
+}
+
+void DesktopViewPlugin::cutItems(){
+ QList<QListWidgetItem*> sel = list->selectedItems();
+ if(sel.isEmpty()){ return; } //nothing selected
+ QStringList items;
+ //Format the data string
+ for(int i=0; i<sel.length(); i++){
+ items << "cut::::"+sel[i]->whatsThis();
+ }
+ //Now save that data to the global clipboard
+ QMimeData *dat = new QMimeData;
+ dat->clear();
+ dat->setData("x-special/lumina-copied-files", items.join("\n").toLocal8Bit());
+ QApplication::clipboard()->clear();
+ QApplication::clipboard()->setMimeData(dat);
+}
+
+void DesktopViewPlugin::deleteItems(){
+ QList<QListWidgetItem*> sel = list->selectedItems();
+ for(int i=0; i<sel.length(); i++){
+ if(QFileInfo(sel[i]->whatsThis()).isDir()){
+ QProcess::startDetached("rm -r \""+sel[i]->whatsThis()+"\"");
+ }else{
+ QFile::remove(sel[i]->whatsThis());
+ }
+ }
+}
+
+void DesktopViewPlugin::showMenu(const QPoint &pos){
+ //Make sure there is an item underneath the mouse first
+ if(list->itemAt(pos)!=0){
+ menu->popup(this->mapToGlobal(pos));
+ }else{
+ //Pass the context menu request on to the desktop (emit it from the plugin)
+ this->showPluginMenu();
+ //emit OpenDesktopMenu();
+ }
+}
+
+void DesktopViewPlugin::increaseIconSize(){
+ int icosize = this->readSetting("IconSize",64).toInt();
+ icosize+=16; //go in orders of 16 pixels
+ //list->setIconSize(QSize(icosize,icosize));
+ this->saveSetting("IconSize",icosize);
+ QTimer::singleShot(10, this, SLOT(updateContents()));
+}
+
+void DesktopViewPlugin::decreaseIconSize(){
+ int icosize = this->readSetting("IconSize",64).toInt();
+ if(icosize < 20){ return; } //too small to decrease more
+ icosize-=16; //go in orders of 16 pixels
+ //list->setIconSize(QSize(icosize,icosize));
+ this->saveSetting("IconSize",icosize);
+ QTimer::singleShot(10,this, SLOT(updateContents()));
+}
+
+void DesktopViewPlugin::updateContents(){
+ list->clear();
+
+ int icosize = this->readSetting("IconSize",64).toInt();
+ QSize gridSZ = QSize(qRound(1.8*icosize),icosize+4+(2*this->fontMetrics().height()) );
+ //qDebug() << "Icon Size:" << icosize <<"Grid Size:" << gridSZ.width() << gridSZ.height();
+ list->setGridSize(gridSZ);
+ list->setIconSize(QSize(icosize,icosize));
+ QDir dir(QDir::homePath()+"/Desktop");
+ QFileInfoList files = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name | QDir::Type | QDir::DirsFirst);
+ for(int i=0; i<files.length(); i++){
+ QListWidgetItem *it = new QListWidgetItem;
+ it->setSizeHint(gridSZ); //ensure uniform item sizes
+ //it->setForeground(QBrush(Qt::black, Qt::Dense2Pattern)); //Try to use a font color which will always be visible
+ it->setTextAlignment(Qt::AlignCenter);
+ it->setWhatsThis(files[i].absoluteFilePath());
+ QString txt;
+ if(files[i].isDir()){
+ it->setIcon( LXDG::findIcon("folder","") );
+ txt = files[i].fileName();
+ }else if(files[i].suffix() == "desktop" ){
+ bool ok = false;
+ XDGDesktop desk = LXDG::loadDesktopFile(files[i].absoluteFilePath(), ok);
+ if(ok){
+ it->setIcon( LXDG::findIcon(desk.icon,"unknown") );
+ if(desk.name.isEmpty()){
+ txt = files[i].fileName();
+ }else{
+ txt = desk.name;
+ }
+ }else{
+ //Revert back to a standard file handling
+ it->setIcon( LXDG::findMimeIcon(files[i].fileName()) );
+ txt = files[i].fileName();
+ }
+ }else if(LUtils::imageExtensions().contains(files[i].suffix().toLower()) ){
+ it->setIcon( QIcon( QPixmap(files[i].absoluteFilePath()).scaled(icosize,icosize,Qt::IgnoreAspectRatio, Qt::SmoothTransformation) ) );
+ txt = files[i].fileName();
+ }else{
+ it->setIcon( LXDG::findMimeIcon( files[i].fileName() ) );
+ txt = files[i].fileName();
+ }
+ //Add the sym-link overlay to the icon as necessary
+ if(files[i].isSymLink()){
+ QImage img = it->icon().pixmap(QSize(icosize,icosize)).toImage();
+ int oSize = icosize/2; //overlay size
+ QPixmap overlay = LXDG::findIcon("emblem-symbolic-link").pixmap(oSize,oSize).scaled(oSize,oSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+ QPainter painter(&img);
+ painter.drawPixmap(icosize-oSize,icosize-oSize,overlay); //put it in the bottom-right corner
+ it->setIcon( QIcon(QPixmap::fromImage(img)) );
+ }
+ //Now adjust the visible text as necessary based on font/grid sizing
+ it->setToolTip(txt);
+ if(this->fontMetrics().width(txt) > (gridSZ.width()-4) ){
+ //int dash = this->fontMetrics().width("-");
+ //Text too long, try to show it on two lines
+ txt = txt.section(" ",0,2).replace(" ","\n"); //First take care of any natural breaks
+ if(txt.contains("\n")){
+ //need to check each line
+ QStringList txtL = txt.split("\n");
+ for(int i=0; i<txtL.length(); i++){ txtL[i] = this->fontMetrics().elidedText(txtL[i], Qt::ElideRight, gridSZ.width()-4); }
+ txt = txtL.join("\n");
+ if(txtL.length()>2){ txt = txt.section("\n",0,1); } //only keep the first two lines
+ }else{
+ txt = this->fontMetrics().elidedText(txt,Qt::ElideRight, 2*(gridSZ.width()-4));
+ //Now split the line in half for the two lines
+ txt.insert( (txt.count()/2), "\n");
+ }
+ }else{
+ txt.append("\n "); //ensure two lines (2nd one invisible) - keeps formatting sane
+ }
+ it->setText(txt);
+ list->addItem(it);
+ if( (i%10) == 0){ QApplication::processEvents(); }//keep the UI snappy, every 10 items
+ }
+ list->setFlow(QListWidget::TopToBottom); //To ensure this is consistent - issues with putting it in the constructor
+ list->update(); //Re-paint the widget after all items are added
+}
+
+void DesktopViewPlugin::displayProperties(){
+ QList<QListWidgetItem*> sel = list->selectedItems();
+ for(int i=0; i<sel.length(); i++){
+ LSession::LaunchApplication("lumina-fileinfo \""+sel[i]->whatsThis());
+ }
+}
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.h b/src-qt5/core/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.h
new file mode 100644
index 00000000..046b6e5c
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.h
@@ -0,0 +1,55 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This plugin is a listing/launcher for things in the ~/Desktop folder
+//===========================================
+#ifndef _LUMINA_DESKTOP_DESKTOP_VIEW_PLUGIN_H
+#define _LUMINA_DESKTOP_DESKTOP_VIEW_PLUGIN_H
+
+#include <QListWidget>
+#include <QVBoxLayout>
+#include <QTimer>
+#include <QFileSystemWatcher>
+#include <QMouseEvent>
+
+#include "../LDPlugin.h"
+
+class DesktopViewPlugin : public LDPlugin{
+ Q_OBJECT
+public:
+ DesktopViewPlugin(QWidget* parent, QString ID);
+ ~DesktopViewPlugin();
+
+ virtual QSize defaultPluginSize(){
+ // The returned QSize is in grid points (typically 100 or 200 pixels square)
+ return QSize(3,3);
+ }
+private:
+ QListWidget *list;
+ QMenu *menu;
+
+private slots:
+ void runItems();
+ void copyItems();
+ void cutItems();
+ void deleteItems();
+ void showMenu(const QPoint&);
+ void increaseIconSize();
+ void decreaseIconSize();
+ void updateContents();
+ void displayProperties();
+
+
+public slots:
+ void LocaleChange(){
+ QTimer::singleShot(0,this, SLOT(updateContents()));
+ }
+ void ThemeChange(){
+ QTimer::singleShot(0,this, SLOT(updateContents()));
+ }
+
+};
+#endif
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/messagecenter/LXDG-DBusNotifier.h b/src-qt5/core/lumina-desktop/desktop-plugins/messagecenter/LXDG-DBusNotifier.h
new file mode 100644
index 00000000..64413e95
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/messagecenter/LXDG-DBusNotifier.h
@@ -0,0 +1,17 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// Simple DBUS message handler for the FreeDesktop desktop notifications specification
+
+
+class LXDG-DBusNotifier : public QDBusVirtualObkect{
+ Q_OBJECT
+public:
+
+private:
+
+
+};
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/messagecenter/MessageCenter.cpp b/src-qt5/core/lumina-desktop/desktop-plugins/messagecenter/MessageCenter.cpp
new file mode 100644
index 00000000..df07a122
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/messagecenter/MessageCenter.cpp
@@ -0,0 +1,90 @@
+#include "MessageCenter.h"
+
+#include <LuminaXDG.h>
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QDBusConnection>
+#include <QDBusConnectionInterface>
+
+MessageCenterPlugin::MessageCenterPlugin(QWidget* parent, QString ID) : LDPlugin(parent, ID){
+ //Setup the UI
+ QVBoxLayout *vlay = new QVBoxLayout();
+ this->setLayout( new QVBoxLayout() );
+ this->layout()->setContentsMargins(0,0,0,0);
+ vlay->setContentsMargins(3,3,3,3);
+ frame = new QFrame(this);
+ frame->setObjectName("messagecenterbase");
+ this->layout()->addWidget(frame);
+ frame->setLayout(vlay);
+
+
+ //Setup the title bar header buttons
+ QHBoxLayout *hlay = new QHBoxLayout();
+ tool_clearall = new QToolButton(this);
+ tool_clearall->setAutoRaise(true);
+ tool_clearone = new QToolButton(this);
+ tool_clearone->setAutoRaise(true);
+ QWidget *spacer = new QWidget(this);
+ spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ hlay->addWidget(spacer);
+ hlay->addWidget(tool_clearone);
+ hlay->addWidget(tool_clearall);
+ vlay->addLayout(hlay);
+
+ //Setup the main text widget
+ list_messages = new QListWidget(this);
+ list_messages->setSelectionMode(QAbstractItemView::SingleSelection);
+ list_messages->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ vlay->addWidget(list_messages);
+
+ //Now setup the initial values
+ this->setInitialSize(200,300);
+ //Setup the button connections
+ connect(tool_clearall, SIGNAL(clicked()), this, SLOT(clearAllMessages()) );
+ connect(tool_clearone, SIGNAL(clicked()), this, SLOT(clearSelectedMessage()) );
+
+ //Setup the DBUS signals/slots
+ if(QDBusConnection::sessionBus().isConnected()){
+ if( QDBusConnection::sessionBus().registerService("org.freedesktop.Notifications") ){
+ //Was able to register this service, also register everything it can do...
+ //SUPPORTED: "body", "body-hyperlinks", "body-markup", "icon-static"
+
+
+ }
+ QDBusConnection::sessionBus().connect("", "", "org.freedesktop.Notifications", "Notify", this, SLOT(newMessage(QString, uint, QString, QString, QString, QStringList, dict, int)) );
+ QDBusConnection::sessionBus().interface().call("AddMatch", "interface='org.freedesktop.Notifications',member='Notify',type='method_call',eavesdrop='true'");
+ qDebug() << "Available Session DBUS Services:" << QDBusConnection::sessionBus().interface()->registeredServiceNames().value();
+ //connect(QString(), QString(),
+ }
+ if(QDBusConnection::systemBus().isConnected()){
+ qDebug() << "Available System DBUS Services:" << QDBusConnection::systemBus().interface()->registeredServiceNames().value();
+ }
+
+ QTimer::singleShot(0,this, SLOT(loadIcons()) );
+}
+
+MessageCenterPlugin::~MessageCenterPlugin(){
+
+}
+
+void MessageCenterPlugin::newMessage(QString summary, QString body){
+ qDebug() << "New Message:" << summary, body;
+}
+
+void MessageCenterPlugin::clearAllMessages(){
+ list_messages->clear();
+}
+
+void MessageCenterPlugin::clearSelectedMessage(){
+ if( list_messages->currentItem()==0){ return; } //nothing selected
+ list_messages->removeItemWidget( list_messages->currentItem() );
+}
+
+
+void MessageCenterPlugin::loadIcons(){
+ tool_clearall->setIcon( LXDG::findIcon("edit-clear-list","") );
+ tool_clearall->setToolTip( tr("Clear all messages") );
+ tool_clearone->setIcon( LXDG::findIcon("edit-delete","") );
+ tool_clearone->setToolTip( tr("Clear selected message") );
+
+}
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/messagecenter/MessageCenter.h b/src-qt5/core/lumina-desktop/desktop-plugins/messagecenter/MessageCenter.h
new file mode 100644
index 00000000..8491546f
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/messagecenter/MessageCenter.h
@@ -0,0 +1,48 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This plugin is a simple DBUS monitor which display's messages that come in
+//===========================================
+#ifndef _LUMINA_DESKTOP_MESSAGE_CENTER_PLUGIN_H
+#define _LUMINA_DESKTOP_MESSAGE_CENTER_PLUGIN_H
+
+#include <QListWidget>
+#include <QToolButton>
+#include <QFrame>
+
+#include <QTimer>
+#include "../LDPlugin.h"
+
+class MessageCenterPlugin : public LDPlugin{
+ Q_OBJECT
+public:
+ MessageCenterPlugin(QWidget* parent, QString ID);
+ ~MessageCenterPlugin();
+
+private:
+ //QDBusConnection *sess, *sys;
+ QListWidget *list_messages;
+ QFrame *frame;
+ QToolButton *tool_clearall; //clear all messages
+ QToolButton *tool_clearone; //clear selected message
+
+private slots:
+ //void newMessage(QDBusMessage *message);
+ void clearAllMessages();
+ void clearSelectedMessage();
+
+ void loadIcons();
+
+public slots:
+ void LocaleChange(){
+ QTimer::singleShot(0,this, SLOT(loadIcons()));
+ }
+ void ThemeChange(){
+ QTimer::singleShot(0,this, SLOT(loadIcons()));
+ }
+
+};
+#endif
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/notepad/NotepadPlugin.cpp b/src-qt5/core/lumina-desktop/desktop-plugins/notepad/NotepadPlugin.cpp
new file mode 100644
index 00000000..435a57c2
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/notepad/NotepadPlugin.cpp
@@ -0,0 +1,329 @@
+#include "NotepadPlugin.h"
+
+#include <LuminaXDG.h>
+#include "LSession.h"
+#include <LuminaUtils.h>
+#include <QDir>
+#include <QFileDialog>
+#include <QInputDialog>
+#include <QtConcurrent>
+
+NotePadPlugin::NotePadPlugin(QWidget* parent, QString ID) : LDPlugin(parent, ID){
+ //qDebug() << "Creating Notepad Plugin:";
+ QVBoxLayout *vlay = new QVBoxLayout();
+ this->setLayout( new QVBoxLayout() );
+ this->layout()->setContentsMargins(0,0,0,0);
+ vlay->setContentsMargins(3,3,3,3);
+ frame = new QFrame(this);
+ frame->setObjectName("notepadbase");
+ //frame->setStyleSheet("QFrame#notepadbase{border-width: 1px; background: rgba(255,255,255,50); color: black;} QFrame{ border: none; border-radius: 3px; background: rgba(255,255,255,100); color: black;}");
+ this->layout()->addWidget(frame);
+ frame->setLayout(vlay);
+
+ if(!QFile::exists(QDir::homePath()+"/Notes")){
+ //Create the notes directory if non-existant
+ QDir dir;
+ dir.mkpath(QDir::homePath()+"/Notes");
+ }
+ watcher = new QFileSystemWatcher(this);
+ //Always watch the notes directory for new files/changes
+ watcher->addPath(QDir::homePath()+"/Notes");
+
+ typeTimer = new QTimer(this);
+ typeTimer->setInterval(1000); // 1 second before it saves
+ typeTimer->setSingleShot(true); //compress lots of signals into a single save
+
+ updating = false;
+ //Setup the title bar header buttons
+ QHBoxLayout *hlay = new QHBoxLayout();
+ config = new QToolButton(this);
+ config->setAutoRaise(true);
+ config->setMenu(new QMenu(this));
+ config->setPopupMode(QToolButton::InstantPopup);
+ /*open = new QToolButton(this);
+ open->setAutoRaise(true);
+ add = new QToolButton(this);
+ add->setAutoRaise(true);
+ rem = new QToolButton(this);
+ rem->setAutoRaise(true);*/
+ cnote = new QComboBox(this);
+
+ hlay->addWidget(cnote);
+ hlay->addWidget(config);
+ //hlay->addWidget(open);
+ //hlay->addWidget(add);
+ //hlay->addWidget(rem);
+ vlay->addLayout(hlay);
+
+ //Setup the main text widget
+ edit = new QPlainTextEdit(this);
+ edit->setReadOnly(false);
+ edit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ vlay->addWidget(edit);
+
+ //Now load the new file-based system for saving notes
+ //qDebug() << "Saving a new setting";
+ this->saveSetting("customFile",""); //always clear this when the plugin is initialized (only maintained per-session)
+ //qDebug() << "Loading Notes Dir";
+ QTimer::singleShot(2000, this, SLOT(notesDirChanged()));
+ //qDebug() << "Set Sizing";
+
+ //qDebug() << "Connect Signals/slots";
+ //Setup the button connections
+ /*connect(open, SIGNAL(clicked()), this, SLOT(openNoteClicked()) );
+ connect(add, SIGNAL(clicked()), this, SLOT(newNoteClicked()) );
+ connect(rem, SIGNAL(clicked()), this, SLOT(remNote()) );*/
+ //connect(config, SIGNAL(clicked()), this, SLOT(openConfigMenu()) );
+ connect(edit, SIGNAL(textChanged()), this, SLOT(newTextAvailable()) );
+ connect(cnote, SIGNAL(currentIndexChanged(QString)), this, SLOT(noteChanged()) );
+ connect(typeTimer, SIGNAL(timeout()), this, SLOT(updateContents()) );
+ connect(watcher, SIGNAL(directoryChanged(QString)), this, SLOT(notesDirChanged()) ); //re-load the available notes
+ connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT(noteChanged()) ); //re-load the current file
+ QTimer::singleShot(0,this, SLOT(loadIcons()) );
+ //qDebug() << " - Done with init";
+}
+
+NotePadPlugin::~NotePadPlugin(){
+
+}
+
+
+void NotePadPlugin::openNote(){
+ //qDebug() << "Open New Note:";
+ //Prompt for a name for the new note
+ QFileDialog dlg(0, Qt::Dialog | Qt::WindowStaysOnTopHint );
+ dlg.setFileMode(QFileDialog::ExistingFile);
+ dlg.setAcceptMode(QFileDialog::AcceptOpen);
+ dlg.setNameFilters( QStringList() << tr("Note Files (*.note)") << tr("Text Files (*)"));
+ dlg.setWindowTitle(tr("Open a note file"));
+ dlg.setWindowIcon( LXDG::findIcon("document-open","") );
+ dlg.setDirectory(QDir::homePath()); //start in the home directory
+ //ensure it is centered on the current screen
+ QPoint center = QApplication::desktop()->screenGeometry(this).center();
+ dlg.move( center.x()-(dlg.width()/2), center.y()-(dlg.height()/2) );
+ dlg.show();
+ while( dlg.isVisible() ){
+ QApplication::processEvents();
+ }
+ QStringList sel = dlg.selectedFiles();
+ if(sel.isEmpty() || dlg.result()!=QDialog::Accepted){ return; } //cancelled
+ QString fullpath = sel.first();
+ QString name = fullpath.section("/",-1);
+ //qDebug() << " - Found Note:" << name << fullpath;
+ int index = cnote->findText(name, Qt::MatchExactly | Qt::MatchCaseSensitive);
+ if(QFile::exists(fullpath) && index <0){
+ //Alternate option of searching for the file in the list
+ index = cnote->findText(fullpath, Qt::MatchExactly | Qt::MatchCaseSensitive);
+ }
+ if(index>=0){
+ //This note already exists: just load it
+ cnote->setCurrentIndex(index);
+ }else{
+ //New note - add it to the end of the list and then load it
+ cnote->addItem(name, fullpath);
+ this->saveSetting("customFile", fullpath); //save this as a custom file
+ cnote->setCurrentIndex( cnote->count()-1 );
+ QTimer::singleShot(1000, this, SLOT(notesDirChanged())); //Make sure to refresh the list (only one custom file at a time)
+ }
+}
+
+QString NotePadPlugin::newNoteName(QString oldname, bool tryagain){
+ //Prompt for a name for the new note
+ //qDebug() << "Create new note";
+ QInputDialog dlg(0, Qt::Dialog | Qt::WindowStaysOnTopHint );
+ dlg.setInputMode(QInputDialog::TextInput);
+ dlg.setLabelText(tr("Name:"));
+ dlg.setTextEchoMode(QLineEdit::Normal);
+ if(tryagain){ dlg.setWindowTitle(tr("Invalid Note Name: Try Again")); }
+ else{ dlg.setWindowTitle(tr("Select a Note Name")); }
+ dlg.setWindowIcon( LXDG::findIcon("document-new","") );
+ dlg.setTextValue(oldname);
+ //ensure it is centered on the current screen
+ QPoint center = QApplication::desktop()->screenGeometry(this).center();
+ dlg.move( center.x()-(dlg.width()/2), center.y()-(dlg.height()/2) );
+ dlg.show();
+ while( dlg.isVisible() ){
+ //this->thread()->usleep(300000); //300 ms between updates
+ QApplication::processEvents();
+ }
+ QString name = dlg.textValue();
+ //make sure to remove any "bad" characters from the name
+ name.remove("\""); name.remove(";"); name.remove("\'"); name.replace("/","_");
+ if(name.isEmpty() || dlg.result()!=QDialog::Accepted){ return ""; } //cancelled
+ //Check validity of the new note filename
+ QString fullpath = QDir::homePath()+"/Notes/"+name;
+ if(!fullpath.endsWith(".note")){ fullpath.append(".note"); }
+ if(QFile::exists(fullpath)){
+ return newNoteName(name, true); //try again
+ }
+ return name; //good name - go ahead and return it
+}
+
+void NotePadPlugin::updateConfigMenu(){
+ //Re-create the menu and open it
+ config->menu()->clear();
+ config->menu()->addAction(LXDG::findIcon("document-open",""), tr("Open Text File"), this, SLOT(openNoteClicked()) );
+ config->menu()->addAction(LXDG::findIcon("document-new",""), tr("Create a Note"), this, SLOT(newNoteClicked()) );
+ if(cnote->currentIndex()>=0){
+ config->menu()->addSeparator();
+ config->menu()->addAction(LXDG::findIcon("document-edit",""), tr("Rename Note"), this, SLOT(renameNote()) );
+ config->menu()->addAction(LXDG::findIcon("document-close",""), tr("Delete Note"), this, SLOT(remNote()) );
+ }
+}
+
+void NotePadPlugin::openNoteClicked(){
+ openNote();
+}
+
+void NotePadPlugin::newNoteClicked(){
+ //QtConcurrent::run(this, &NotePadPlugin::newNote);
+ QString name = newNoteName();
+ if(name.isEmpty()){ return; }
+ QString fullpath = QDir::homePath()+"/Notes/"+name;
+ if(!fullpath.endsWith(".note")){ fullpath.append(".note"); }
+ //qDebug() << " - New Note:" << name << fullpath;
+ int index = cnote->findText(name, Qt::MatchExactly | Qt::MatchCaseSensitive);
+ if(QFile::exists(fullpath) && index <0){
+ //Alternate option of searching for the file in the list
+ index = cnote->findText(fullpath, Qt::MatchExactly | Qt::MatchCaseSensitive);
+ }
+ if(index>=0){
+ //This note already exists: just load it
+ cnote->setCurrentIndex(index);
+ }else{
+ //New note - add it to the end of the list and then load it
+ cnote->addItem(name, fullpath);
+ cnote->setCurrentIndex( cnote->count()-1 );
+ }
+}
+
+void NotePadPlugin::remNote(){
+ QString note = cnote->currentData().toString();
+ if(note.isEmpty()){ return; }
+ watcher->removePath(note); //remove this file from the watcher
+ this->saveSetting("currentFile",""); //reset the internal value
+ QFile::remove(note); //remove the file
+ //if(!note.startsWith(QDir::homePath()+"/Notes/") ){
+ //If the file was not in the notes directory, need to manually prompt for a re-load
+ // otherwise, the directory watcher will catch it and trigger a re-load (no need to double-load)
+ notesDirChanged();
+ //}
+}
+
+void NotePadPlugin::renameNote(){
+ int item = cnote->currentIndex();
+ if(item<0){ return; } //nothing selected
+ QString oldpath = cnote->currentData().toString();
+ if(oldpath.isEmpty() || !oldpath.endsWith(".note")){ return; }
+ QString name = newNoteName(cnote->currentText());
+ if(name.isEmpty()){ return; }
+ QString fullpath = QDir::homePath()+"/Notes/"+name;
+ if(!fullpath.endsWith(".note")){ fullpath.append(".note"); }
+ //qDebug() << " - New Note:" << name << fullpath;
+ //Update the current item data to point to this file
+ cnote->setItemText(item, name);
+ cnote->setItemData(item, fullpath);
+ //Now move the file over
+ QFile::rename(oldpath, fullpath);
+ noteChanged();
+}
+
+void NotePadPlugin::newTextAvailable(){
+ if(updating){ return; } //programmatic change of the widget
+ if(typeTimer->isActive()){ typeTimer->stop(); }
+ typeTimer->start();
+}
+
+void NotePadPlugin::updateContents(){
+ if(updating){ return; } //this was a programmatic change to the widget
+ //The text was changed in the plugin - save it in the file
+ QString note = cnote->currentData().toString();
+ updating = true;
+ LUtils::writeFile(note, edit->toPlainText().split("\n"), true);
+ QApplication::processEvents(); //make sure to process/discard the file changed signal before disabling the flag
+ updating = false;
+}
+
+void NotePadPlugin::notesDirChanged(){
+ if(updating){ return; }
+ QString cfile = this->readSetting("currentFile","").toString();
+ QStringList notes;
+ QDir dir(QDir::homePath()+"/Notes");
+ QStringList files = dir.entryList(QStringList() << "*.note", QDir::Files | QDir::NoDotAndDotDot, QDir::Name);
+ for(int i=0; i<files.length(); i++){
+ notes << dir.absoluteFilePath(files[i]);
+ }
+ QString custom = this->readSetting("customFile","").toString();
+ if(!custom.isEmpty() && QFile::exists(custom) ){ notes << custom; }
+ //qDebug() << "Available Notes:" << notes << cfile;
+ //Now update the UI list
+ updating = true; //don't refresh the UI until done changing lists
+ cnote->clear();
+ bool found = false;
+ for(int i=0; i<notes.length(); i++){
+ QString name = notes[i].section("/",-1);
+ if(name.endsWith(".note")){ name.chop(5); }
+ cnote->addItem(name, notes[i]);
+ if(notes[i]==cfile){ cnote->setCurrentIndex(i); found = true;}
+ }
+ if(!found && !cfile.isEmpty() && QFile::exists(cfile)){
+ //Current note is a manually-loaded text file
+ cnote->addItem(cfile.section("/",-1), cfile);
+ cnote->setCurrentIndex( cnote->count()-1 ); //last item
+ found = true;
+ }
+ if(!found && cnote->count()>0){ cnote->setCurrentIndex(0); }
+ updating =false;
+ noteChanged();
+}
+
+void NotePadPlugin::noteChanged(){
+ if(updating){ return; }
+ updating =true;
+ QString note;
+ if(cnote->currentIndex()>=0){
+ note = cnote->currentData().toString();
+ }
+ QTimer::singleShot(0, this, SLOT(updateConfigMenu()) );
+ if(note.isEmpty() && cnote->count()>0){
+ updating=false;
+ cnote->setCurrentIndex(0);
+ return;
+ }
+ QString oldnote = this->readSetting("currentFile","").toString();
+ //qDebug() << "Note Changed:" << note << oldnote;
+ if( oldnote!=note ){
+ //Clear the old note file/setting
+ if(!oldnote.isEmpty()){
+ watcher->removePath(oldnote);
+ this->saveSetting("currentFile","");
+ }
+ if(!note.isEmpty()){
+ this->saveSetting("currentFile",note);
+ watcher->addPath(note);
+ }
+ }
+
+ if(!note.isEmpty()){
+ QString text = LUtils::readFile(note).join("\n");
+ if(text!=edit->toPlainText()){
+ edit->setPlainText( text );
+ }
+ }else{
+ edit->clear();
+ }
+ //If no notes available - disable the editor until a new one is created
+ edit->setEnabled(!note.isEmpty());
+ //rem->setEnabled(!note.isEmpty());
+ cnote->setEnabled(!note.isEmpty());
+ //leave the new/open buttons enabled all the time
+ updating = false;
+}
+
+
+void NotePadPlugin::loadIcons(){
+ /*open->setIcon( LXDG::findIcon("document-open","") );
+ add->setIcon( LXDG::findIcon("document-new","") );
+ rem->setIcon( LXDG::findIcon("document-close","") );*/
+ config->setIcon( LXDG::findIcon("configure","") );
+}
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/notepad/NotepadPlugin.h b/src-qt5/core/lumina-desktop/desktop-plugins/notepad/NotepadPlugin.h
new file mode 100644
index 00000000..5084dadf
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/notepad/NotepadPlugin.h
@@ -0,0 +1,66 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This plugin is a simple text editor for notes on the desktop
+//===========================================
+#ifndef _LUMINA_DESKTOP_NOTEPAD_PLUGIN_H
+#define _LUMINA_DESKTOP_NOTEPAD_PLUGIN_H
+
+#include <QPlainTextEdit>
+#include <QToolButton>
+#include <QComboBox>
+#include <QVBoxLayout>
+#include <QTimer>
+#include <QFileSystemWatcher>
+#include "../LDPlugin.h"
+
+class NotePadPlugin : public LDPlugin{
+ Q_OBJECT
+public:
+ NotePadPlugin(QWidget* parent, QString ID);
+ ~NotePadPlugin();
+
+ virtual QSize defaultPluginSize(){
+ // The returned QSize is in grid points (typically 100 or 200 pixels square)
+ return QSize(3,3);
+ }
+private:
+ QPlainTextEdit *edit;
+ QToolButton *config; //*open, *add, *rem;
+ QComboBox *cnote;
+ QFrame *frame;
+ QFileSystemWatcher *watcher;
+ bool updating;
+ QTimer *typeTimer;
+
+ void openNote();
+ QString newNoteName(QString oldname = "", bool tryagain = false);
+
+private slots:
+ void updateConfigMenu();
+
+ void openNoteClicked();
+ void newNoteClicked();
+ void remNote();
+ void renameNote();
+ void newTextAvailable();
+ void updateContents();
+
+ void notesDirChanged();
+ void noteChanged();
+
+ void loadIcons();
+
+public slots:
+ void LocaleChange(){
+ QTimer::singleShot(0,this, SLOT(noteChanged()));
+ }
+ void ThemeChange(){
+ QTimer::singleShot(0,this, SLOT(loadIcons()));
+ }
+
+};
+#endif
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/quickcontainer/QuickDPlugin.h b/src-qt5/core/lumina-desktop/desktop-plugins/quickcontainer/QuickDPlugin.h
new file mode 100644
index 00000000..4ba74133
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/quickcontainer/QuickDPlugin.h
@@ -0,0 +1,51 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This class is a simple container for a QtQuick plugin
+//===========================================
+#ifndef _LUMINA_DESKTOP_DESKTOP_PLUGIN_QUICK_H
+#define _LUMINA_DESKTOP_DESKTOP_PLUGIN_QUICK_H
+
+#include <QQuickWidget>
+#include <QVBoxLayout>
+#include "../LDPlugin.h"
+
+#include <LuminaUtils.h>
+
+class QuickDPlugin : public LDPlugin{
+ Q_OBJECT
+public:
+ QuickDPlugin(QWidget* parent, QString ID) : LDPlugin(parent, ID){
+ this->setLayout( new QVBoxLayout());
+ this->layout()->setContentsMargins(0,0,0,0);
+ container = new QQuickWidget(this);
+ container->setResizeMode(QQuickWidget::SizeRootObjectToView);
+ connect(container, SIGNAL(statusChanged(QQuickWidget::Status)), this, SLOT(statusChange(QQuickWidget::Status)) );
+ this->layout()->addWidget(container);
+ container->setSource(QUrl::fromLocalFile( LUtils::findQuickPluginFile(ID.section("---",0,0)) ));
+ QApplication::processEvents(); //to check for errors right away
+ //this->setInitialSize(container->initialSize().width(), container->initialSize().height());
+ }
+
+ ~QuickDPlugin(){}
+
+ virtual QSize defaultPluginSize(){
+ // The returned QSize is in grid points (typically 100 or 200 pixels square)
+ return QSize(2,2);
+ }
+private:
+ QQuickWidget *container;
+
+private slots:
+ void statusChange(QQuickWidget::Status status){
+ if(status == QQuickWidget::Error){
+ qDebug() << "Quick Widget Error:" << this->ID();
+ container->setSource(QUrl()); //clear out the script - experienced an error
+ }
+ }
+
+};
+#endif
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/systemmonitor/MonitorWidget.cpp b/src-qt5/core/lumina-desktop/desktop-plugins/systemmonitor/MonitorWidget.cpp
new file mode 100644
index 00000000..951bcc98
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/systemmonitor/MonitorWidget.cpp
@@ -0,0 +1,63 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "MonitorWidget.h"
+#include "ui_MonitorWidget.h"
+
+
+#include <LuminaXDG.h>
+#include <LuminaOS.h>
+
+MonitorWidget::MonitorWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MonitorWidget()){
+ ui->setupUi(this); //load the designer form
+ upTimer = new QTimer(this);
+ upTimer->setInterval(2000); //update every 2 seconds
+ connect(upTimer, SIGNAL(timeout()), this, SLOT(UpdateStats()) );
+ LoadIcons();
+ upTimer->start();
+}
+
+MonitorWidget::~MonitorWidget(){
+ //qDebug() << "Removing MonitorWidget";
+}
+
+void MonitorWidget::LoadIcons(){
+ ui->tabWidget->setTabIcon(0,LXDG::findIcon("appointment-recurring","") ); //Summary
+ ui->tabWidget->setTabIcon(1,LXDG::findIcon("drive-harddisk","") ); //Disk Usage
+ //ui->tabWidget->setTabIcon(1,LXDG::findIcon("cpu","") ); //CPU Log
+ //ui->tabWidget->setTabIcon(2,LXDG::findIcon("media-flash-memory-stick","") ); //Mem Log
+}
+
+void MonitorWidget::UpdateStats(){
+ //qDebug() << "Updating System statistics...";
+ ui->label_temps->setText( LOS::CPUTemperatures().join(", ") );
+ if(ui->progress_cpu->isEnabled()){
+ int perc = LOS::CPUUsagePercent();
+ ui->progress_cpu->setValue(perc);
+ if(perc<0){ ui->progress_cpu->setEnabled(false); } //disable this for future checks
+ }
+ if(ui->progress_mem->isEnabled()){
+ int perc = LOS::MemoryUsagePercent();
+ ui->progress_mem->setValue(perc);
+ if(perc<0){ ui->progress_mem->setEnabled(false); } //disable this for future checks
+ }
+ ui->label_diskinfo->setText( LOS::DiskUsage().join("\n") );
+ //Also perform/update the logs as necessary
+ // -- TO DO --
+}
+
+SysMonitorPlugin::SysMonitorPlugin(QWidget *parent, QString ID) : LDPlugin(parent, ID){
+ monitor = new MonitorWidget(this);
+ this->setLayout( new QVBoxLayout() );
+ this->layout()->setContentsMargins(0,0,0,0);
+ this->layout()->addWidget(monitor);
+
+ //this->setInitialSize(monitor->sizeHint().width(),monitor->sizeHint().height());
+}
+
+SysMonitorPlugin::~SysMonitorPlugin(){
+ //qDebug() << "Remove SysMonitorPlugin";
+} \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/systemmonitor/MonitorWidget.h b/src-qt5/core/lumina-desktop/desktop-plugins/systemmonitor/MonitorWidget.h
new file mode 100644
index 00000000..618ac8f4
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/systemmonitor/MonitorWidget.h
@@ -0,0 +1,62 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This plugin is a simple hardware status monitor on the desktop
+//===========================================
+#ifndef _LUMINA_DESKTOP_PLUGIN_HW_MONITOR_WIDGET_H
+#define _LUMINA_DESKTOP_PLUGIN_HW_MONITOR_WIDGET_H
+
+#include <QTimer>
+#include <QWidget>
+
+#include "../LDPlugin.h"
+
+namespace Ui{
+ class MonitorWidget;
+};
+
+class MonitorWidget : public QWidget{
+ Q_OBJECT
+public:
+ MonitorWidget(QWidget *parent = 0);
+ ~MonitorWidget();
+
+public slots:
+ void LoadIcons();
+
+private:
+ Ui::MonitorWidget *ui;
+ QTimer *upTimer;
+
+private slots:
+ void UpdateStats();
+};
+
+// Wrapper class to put this into a desktop plugin container
+class SysMonitorPlugin : public LDPlugin{
+ Q_OBJECT
+public:
+ SysMonitorPlugin(QWidget* parent, QString ID);
+ ~SysMonitorPlugin();
+
+ virtual QSize defaultPluginSize(){
+ // The returned QSize is in grid points (typically 100 or 200 pixels square)
+ return QSize(3,2);
+ }
+
+private:
+ MonitorWidget *monitor;
+
+public slots:
+ void LocaleChange(){
+ QTimer::singleShot(0,monitor, SLOT(LoadIcons()));
+ }
+ void ThemeChange(){
+ QTimer::singleShot(0,monitor, SLOT(LoadIcons()));
+ }
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/systemmonitor/MonitorWidget.ui b/src-qt5/core/lumina-desktop/desktop-plugins/systemmonitor/MonitorWidget.ui
new file mode 100644
index 00000000..8798bc25
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/systemmonitor/MonitorWidget.ui
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MonitorWidget</class>
+ <widget class="QWidget" name="MonitorWidget">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>300</width>
+ <height>122</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="leftMargin">
+ <number>2</number>
+ </property>
+ <property name="topMargin">
+ <number>2</number>
+ </property>
+ <property name="rightMargin">
+ <number>2</number>
+ </property>
+ <property name="bottomMargin">
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab_summary">
+ <attribute name="title">
+ <string>Summary</string>
+ </attribute>
+ <layout class="QFormLayout" name="formLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>CPU Temp:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_temps">
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>CPU Usage:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QProgressBar" name="progress_cpu">
+ <property name="value">
+ <number>0</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Mem Usage:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QProgressBar" name="progress_mem">
+ <property name="value">
+ <number>0</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_disks">
+ <attribute name="title">
+ <string>Disk I/O</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QScrollArea" name="scrollArea">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="scrollAreaWidgetContents">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>292</width>
+ <height>89</height>
+ </rect>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QLabel" name="label_diskinfo">
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src-qt5/core/lumina-desktop/fluxboxconf/fluxbox-init-rc b/src-qt5/core/lumina-desktop/fluxboxconf/fluxbox-init-rc
new file mode 100644
index 00000000..15283468
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/fluxboxconf/fluxbox-init-rc
@@ -0,0 +1,82 @@
+session.screen0.window.focus.alpha: 255
+session.screen0.window.unfocus.alpha: 255
+session.screen0.titlebar.left: Stick
+session.screen0.titlebar.right: Minimize Maximize Close
+session.screen0.menu.alpha: 255
+session.screen0.clientMenu.usePixmap: true
+session.screen0.toolbar.onhead: 2
+session.screen0.toolbar.onTop: False
+session.screen0.toolbar.maxOver: false
+session.screen0.toolbar.widthPercent: 100
+session.screen0.toolbar.autoHide: false
+session.screen0.toolbar.placement: BottomCenter
+session.screen0.toolbar.alpha: 150
+session.screen0.toolbar.visible: false
+session.screen0.toolbar.layer: Dock
+session.screen0.toolbar.height: 0
+session.screen0.toolbar.tools:
+session.screen0.iconbar.iconWidth: 128
+session.screen0.iconbar.alignment: Left
+session.screen0.iconbar.usePixmap: true
+session.screen0.iconbar.iconTextPadding: 10
+session.screen0.iconbar.mode: workspace
+session.screen0.slit.direction: Vertical
+session.screen0.slit.onTop: False
+session.screen0.slit.onhead: 0
+session.screen0.slit.autoHide: false
+session.screen0.slit.maxOver: false
+session.screen0.slit.placement: RightBottom
+session.screen0.slit.alpha: 255
+session.screen0.slit.acceptKdeDockapps: true
+session.screen0.slit.layer: Dock
+session.screen0.tab.alignment: Left
+session.screen0.tab.placement: Top
+session.screen0.tab.width: 64
+session.screen0.tab.rotatevertical: True
+session.screen0.tab.height: 16
+session.screen0.tabs.usePixmap: false
+session.screen0.tabs.maxOver: false
+session.screen0.tabs.intitlebar: true
+session.screen0.windowPlacement: RowSmartPlacement
+session.screen0.rowPlacementDirection: LeftToRight
+session.screen0.opaqueMove: true
+session.screen0.focusLastWindow: True
+session.screen0.maxDisableMove: false
+session.screen0.showwindowposition: false
+session.screen0.fullMaximization: false
+session.screen0.defaultDeco: NORMAL
+session.screen0.workspaceNames: one,two
+session.screen0.maxIgnoreIncrement: true
+session.screen0.edgeSnapThreshold: 10
+session.screen0.workspaces: 2
+session.screen0.noFocusWhileTypingDelay: 0
+session.screen0.focusNewWindows: true
+session.screen0.menuDelay: 200
+session.screen0.clickRaises: true
+session.screen0.focusSameHead: true
+session.screen0.focusModel: ClickFocus
+session.screen0.workspacewarping: true
+session.screen0.maxDisableResize: false
+session.screen0.autoRaise: true
+session.screen0.allowRemoteActions: false
+session.screen0.tooltipDelay: 500
+session.screen0.colPlacementDirection: TopToBottom
+session.screen0.tabFocusModel: ClickToTabFocus
+session.screen0.strftimeFormat: %l:%M
+session.titlebar.right: Minimize Maximize Close
+session.colorsPerChannel: 4
+session.opaqueMove: False
+session.styleFile: /usr/local/share/fluxbox/styles/bora_black
+session.doubleClickInterval: 250
+session.iconbar: false
+session.cacheLife: 5
+session.ignoreBorder: false
+session.tabsAttachArea: Window
+session.tabPadding: 0
+session.keyFile: ~/.lumina/fluxbox-keys
+session.configVersion: 13
+session.autoRaiseDelay: 250
+session.cacheMax: 200
+session.imageDither: True
+session.forcePseudoTransparency: True
+
diff --git a/src-qt5/core/lumina-desktop/fluxboxconf/fluxbox-keys b/src-qt5/core/lumina-desktop/fluxboxconf/fluxbox-keys
new file mode 100644
index 00000000..821e463f
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/fluxboxconf/fluxbox-keys
@@ -0,0 +1,151 @@
+! fluxbox-update_configs added '(workspace=[current])' to (Next|Prev)(Window|Group)
+! check lines marked by 'FBCV13' if they are correctly updated
+!mouse actions added by fluxbox-update_configs
+OnTitlebar Mouse1 :MacroCmd {Focus} {Raise} {ActivateTab}
+!mouse actions added by fluxbox-update_configs
+OnTitlebar Move1 :StartMoving
+OnLeftGrip Move1 :StartResizing bottomleft
+OnRightGrip Move1 :StartResizing bottomright
+OnWindowBorder Move1 :StartMoving
+
+!mouse actions added by fluxbox-update_configs
+OnTitlebar Mouse2 :StartTabbing
+
+!mouse actions added by fluxbox-update_configs
+OnTitlebar Double Mouse1 :Shade
+OnTitlebar Mouse3 :WindowMenu
+
+# scroll on the toolbar to change current window
+OnToolbar Mouse4 :PrevWindow {static groups} (workspace=[current]) (iconhidden=no) !! FBCV13 !!
+OnToolbar Mouse5 :NextWindow {static groups} (workspace=[current]) (iconhidden=no) !! FBCV13 !!
+
+# alt + left/right click to move/resize a window
+OnWindow Mod1 Mouse1 :If {Matches (Layer=Normal)} {MacroCmd {Raise} {Focus} {StartMoving}}
+OnWindow Mod1 Mouse3 :If {Matches (Layer=Normal)} {MacroCmd {Raise} {Focus} {StartResizing NearestCorner}}
+
+OnWindowBorder Move1 :StartMoving
+OnLeftGrip Move1 :StartResizing bottomleft
+OnRightGrip Move1 :StartResizing bottomright
+
+# alt + middle click to lower the window
+OnWindow Mod1 Mouse2 :If {Matches (Layer=Normal)} {Lower}
+
+# control-click a window's titlebar and drag to attach windows
+OnTitlebar Control Mouse1 :StartTabbing
+
+# double click on the titlebar to shade
+OnTitlebar Double Mouse1 :Shade
+
+# left click on the titlebar to move the window
+OnTitlebar Mouse1 :MacroCmd {Raise} {Focus} {ActivateTab}
+OnTitlebar Move1 :StartMoving
+
+# middle click on the titlebar to lower
+OnTitlebar Mouse2 :Lower
+
+# right click on the titlebar for a menu of options
+OnTitlebar Mouse3 :WindowMenu
+
+# alt-tab
+Mod1 Tab :NextWindow {groups} (workspace=[current]) (workspace=[current]) !! FBCV13 !!
+Mod1 Shift Tab :PrevWindow {groups} (workspace=[current]) (workspace=[current]) !! FBCV13 !!
+
+# cycle through tabs in the current window
+Mod4 Tab :NextTab
+Mod4 Shift Tab :PrevTab
+
+# Arrange/Tile Current windows
+Mod1 Left :ArrangeWindowsStackRight (Layer=Normal)
+Mod1 Right :ArrangeWindowsStackLeft (Layer=Normal)
+
+# go to a specific tab in the current window
+Mod4 1 :Tab 1
+Mod4 2 :Tab 2
+Mod4 3 :Tab 3
+Mod4 4 :Tab 4
+Mod4 5 :Tab 5
+Mod4 6 :Tab 6
+Mod4 7 :Tab 7
+Mod4 8 :Tab 8
+Mod4 9 :Tab 9
+
+# open a terminal
+Mod1 F1 :Exec xterm
+
+# open a dialog to run programs
+Mod1 F2 :Exec lumina-search
+
+# current window commands
+Mod1 F4 :If {Matches (Layer=Normal)} {Close}
+Mod1 F5 :If {Matches (Layer=Normal)} {Kill}
+Mod1 F9 :If {Matches (Layer=Normal)} {Minimize}
+Mod1 F10 :If {Matches (Layer=Normal)} {Maximize}
+Mod1 F11 :If {Matches (Layer=Normal)} {Fullscreen}
+
+# send the current window to previous/next workspace
+Mod4 Left :If {Matches (Layer=Normal)} {SendToPrevWorkspace}
+Mod4 Right :If {Matches (Layer=Normal)} {SendToNextWorkspace}
+
+# send the current window and follow it to previous/next workspace
+Control Mod4 Left :If {Matches (Layer=Normal)} {TakeToPrevWorkspace}
+Control Mod4 Right :If {Matches (Layer=Normal)} {TakeToNextWorkspace}
+
+# change to a specific workspace
+Control F1 :Workspace 1
+Control F2 :Workspace 2
+Control F3 :Workspace 3
+Control F4 :Workspace 4
+Control F5 :Workspace 5
+Control F6 :Workspace 6
+Control F7 :Workspace 7
+Control F8 :Workspace 8
+Control F9 :Workspace 9
+Control F10 :Workspace 10
+Control F11 :Workspace 11
+Control F12 :Workspace 12
+
+Control Mod1 Left :PrevWorkspace
+Control Mod1 Right :NextWorkspace
+
+# Control + MouseWheel to change workspaces
+Control Mouse4 :PrevWorkspace
+Control Mouse5 :NextWorkspace
+
+# send the current window to a specific workspace
+Mod4 F1 :SendToWorkspace 1
+Mod4 F2 :SendToWorkspace 2
+Mod4 F3 :SendToWorkspace 3
+Mod4 F4 :SendToWorkspace 4
+Mod4 F5 :SendToWorkspace 5
+Mod4 F6 :SendToWorkspace 6
+Mod4 F7 :SendToWorkspace 7
+Mod4 F8 :SendToWorkspace 8
+Mod4 F9 :SendToWorkspace 9
+Mod4 F10 :SendToWorkspace 10
+Mod4 F11 :SendToWorkspace 11
+Mod4 F12 :SendToWorkspace 12
+
+# send the current window and change to a specific workspace
+Control Mod4 F1 :If {Matches (Layer=Normal)} {TakeToWorkspace 1}
+Control Mod4 F2 :If {Matches (Layer=Normal)} {TakeToWorkspace 2}
+Control Mod4 F3 :If {Matches (Layer=Normal)} {TakeToWorkspace 3}
+Control Mod4 F4 :If {Matches (Layer=Normal)} {TakeToWorkspace 4}
+Control Mod4 F5 :If {Matches (Layer=Normal)} {TakeToWorkspace 5}
+Control Mod4 F6 :If {Matches (Layer=Normal)} {TakeToWorkspace 6}
+Control Mod4 F7 :If {Matches (Layer=Normal)} {TakeToWorkspace 7}
+Control Mod4 F8 :If {Matches (Layer=Normal)} {TakeToWorkspace 8}
+Control Mod4 F9 :If {Matches (Layer=Normal)} {TakeToWorkspace 9}
+Control Mod4 F10 :If {Matches (Layer=Normal)} {TakeToWorkspace 10}
+Control Mod4 F11 :If {Matches (Layer=Normal)} {TakeToWorkspace 11}
+Control Mod4 F12 :If {Matches (Layer=Normal)} {TakeToWorkspace 12}
+
+#Lumina Specific defaults
+Print :Exec lumina-screenshot
+Pause :Exec xscreensaver-command -lock
+Mod4 L :Exec xscreensaver-command -lock
+Mod4 space :Exec lumina-search
+Mod4 Prior :Exec lumina-open -volumeup
+Mod4 Next :Exec lumina-open -volumedown
+Mod4 Home :Exec lumina-open -brightnessup
+Mod4 End :Exec lumina-open -brightnessdown
+
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_af.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_af.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_af.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ar.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ar.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ar.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_az.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_az.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_az.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bg.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bg.ts
new file mode 100644
index 00000000..c769cb89
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bg.ts
@@ -0,0 +1,403 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation>Приложения</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>Мултимедия</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>Разработка</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>Образование</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Игри</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>Графики</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Мрежа</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>Офис</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>Наука</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Настройки</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>Системни</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation>Инструменти</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation>Несортирани</translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation>%1 % (Зарежда)</translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation>%1 % (%2 Остава)</translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation>Аудио</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Видео</translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation>Изображения</translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation>Други Файлове</translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation>Документи</translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation>Терминал</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">Log Out</translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation>Lumina Десктоп</translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation>Работен плот %1</translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation>Разглегай Системата</translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation>Заключи Десктопа</translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation>Отключи Десктопа</translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">Snap Plugins to Grid</translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation>Работен плот %1</translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">Log Out</translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation>Затвоти Прозореца</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation>Настройки на Десктопа</translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">Screensaver</translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation>Десктоп</translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation>Системни Опции</translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation>Рестарт</translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation>Изключване</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отказ</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">Log Out</translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">Home</translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">Мултимедия</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">Разработка</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">Образование</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">Игри</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">Графики</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">Мрежа</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">Офис</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">Наука</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Настройки</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">Системни</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">Инструменти</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">Несортирани</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bn.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bn.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bn.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bs.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bs.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bs.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ca.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ca.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ca.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cs.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cs.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cs.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cy.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cy.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cy.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_da.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_da.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_da.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_de.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_de.ts
new file mode 100644
index 00000000..42b9b203
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_de.ts
@@ -0,0 +1,407 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation>Anwendungen</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>Multimedia</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>Entwicklung</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>Bildung</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Spiele</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>Grafisch</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Netzwerk</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>Büro</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>Wissenschaft</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Einstellungen</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>System</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation>Dienstprogramme</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation>Unsortiert</translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation>%1 % (Laden)</translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation>%1 % (%2 verbleibend)</translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation>Audio</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Video</translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation>Bilder</translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation>Andere Dateien</translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation>Dokumente</translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation>Terminal</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Abmelden</translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation>Lumina-Arbeitsplatz</translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation>Arbeitsplatz %1</translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation>Arbeitsplatz %1</translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">Abmelden</translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation>Fenster schließen</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation>Arbeitsplatzeinstellungen</translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation>Bildschirmschoner</translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation>Arbeitsplatz</translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation>Systemoptionen</translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation>Neustart</translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation>Herunterfahren</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Abbruch</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">Abmelden</translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation>Anfang</translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">Multimedia</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">Entwicklung</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">Bildung</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">Spiele</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">Grafisch</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">Netzwerk</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">Büro</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">Wissenschaft</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Einstellungen</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">System</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">Dienstprogramme</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">Unsortiert</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_el.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_el.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_el.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
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
new file mode 100644
index 00000000..a00ef9d9
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_GB.ts
@@ -0,0 +1,372 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation>Click to Set</translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation>Select Application</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>Name:</translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation>Applications</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>Multimedia</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>Development</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>Education</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Games</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>Graphics</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Network</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>Office</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>Science</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Settings</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>System</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation>Utility</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation>Unsorted</translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation>Open Home</translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation>Install Applications</translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation>Control Panel</translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation>%1 % (Charging)</translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation>%1 % (%2 Remaining)</translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation>Audio</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Video</translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation>Pictures</translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation>Other Files</translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation>Documents</translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation>Favorite Applications</translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation>Favorite Folders</translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation>Favorite Files</translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation>Terminal</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Log Out</translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation>Lumina Desktop</translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation>Workspace %1</translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation>Browse System</translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation>Lock Desktop</translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation>Unlock Desktop</translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation>Snap Plugins to Grid</translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation>Workspace %1</translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation>System Volume</translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation>Screen Brightness</translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation>Battery Status</translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation>Workspace</translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation>charging</translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation>%1 of %2</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Log Out</translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation>Launch Audio Mixer</translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation>Close Window</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation>Desktop Settings</translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation>Screensaver</translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation>Desktop</translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation>Window Theme</translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation>System Options</translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation>Restart</translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation>Shutdown</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancel</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Log Out</translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation>Remove Shortcut</translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation>Create Shortcut</translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation>Favorites</translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation>Favorite Applications</translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation>Favorite Directories</translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation>Favorite FIles</translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation>System Applications</translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation>Home</translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation>Desktop Preferences</translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation>Control Panel</translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation>Desktop Appearance/Plugins</translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation>Application Appearance</translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation>Screensaver Settings</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>Multimedia</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>Development</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>Education</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Games</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>Graphics</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Network</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>Office</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>Science</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Settings</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>System</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation>Utility</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation>Unsorted</translation>
+ </message>
+</context>
+</TS>
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
new file mode 100644
index 00000000..a00ef9d9
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_ZA.ts
@@ -0,0 +1,372 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation>Click to Set</translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation>Select Application</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>Name:</translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation>Applications</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>Multimedia</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>Development</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>Education</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Games</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>Graphics</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Network</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>Office</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>Science</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Settings</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>System</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation>Utility</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation>Unsorted</translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation>Open Home</translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation>Install Applications</translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation>Control Panel</translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation>%1 % (Charging)</translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation>%1 % (%2 Remaining)</translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation>Audio</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Video</translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation>Pictures</translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation>Other Files</translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation>Documents</translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation>Favorite Applications</translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation>Favorite Folders</translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation>Favorite Files</translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation>Terminal</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Log Out</translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation>Lumina Desktop</translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation>Workspace %1</translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation>Browse System</translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation>Lock Desktop</translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation>Unlock Desktop</translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation>Snap Plugins to Grid</translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation>Workspace %1</translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation>System Volume</translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation>Screen Brightness</translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation>Battery Status</translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation>Workspace</translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation>charging</translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation>%1 of %2</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Log Out</translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation>Launch Audio Mixer</translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation>Close Window</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation>Desktop Settings</translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation>Screensaver</translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation>Desktop</translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation>Window Theme</translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation>System Options</translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation>Restart</translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation>Shutdown</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancel</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Log Out</translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation>Remove Shortcut</translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation>Create Shortcut</translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation>Favorites</translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation>Favorite Applications</translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation>Favorite Directories</translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation>Favorite FIles</translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation>System Applications</translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation>Home</translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation>Desktop Preferences</translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation>Control Panel</translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation>Desktop Appearance/Plugins</translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation>Application Appearance</translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation>Screensaver Settings</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>Multimedia</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>Development</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>Education</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Games</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>Graphics</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Network</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>Office</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>Science</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Settings</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>System</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation>Utility</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation>Unsorted</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_es.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_es.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_es.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_et.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_et.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_et.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_eu.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_eu.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_eu.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fa.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fa.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fa.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fi.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fi.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fi.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr.ts
new file mode 100644
index 00000000..85022fb5
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr.ts
@@ -0,0 +1,372 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation>Cliquez pour définir</translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation>Sélectionnez une application</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>Nom:</translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation>Applications</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>Multimédia</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>Développement</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>Éducation</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Jeux</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>Graphique</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Internet</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>Bureautique</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>Science</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Paramétrages</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>Système</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation>Utilitaires</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation>Non triés</translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation>Ouvrir Accueil</translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation>Installer des applications</translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation>Panneau Contrôle</translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation>%1 % (Charge)</translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation>%1 % (%2 Restant)</translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation>Audio</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Video</translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation>Images</translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation>Autres Fichiers</translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation>Documents</translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation>Applications Favorites</translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation>Dossiers Favoris</translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation>Fichier Favoris</translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation>Terminal</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Déconnexion</translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation>Lumina Destop</translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation>Espace de travail %1</translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation>Parcourir système</translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation>Verrouillage du Bureau</translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation>Déverrouillage du Bureau</translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation>Aligner Greffon sur la grille</translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation>Espace de travail %1</translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation>Forme</translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation>Volume Système</translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation>Luminosité de l&apos;écran</translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation>État de la batterie</translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation>Espace de travail</translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation>chargement</translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation>%1 de %2</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Déconnexion</translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation>Lancer Mixeur Audio</translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation>Fermer la Fenêtre</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation>Paramètres de bureau</translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation>Économiseur d&apos;écran</translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation>Desktop</translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation>Thème Fenêtre</translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation>Options du système</translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation>Redémarrage</translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation>Éteindre</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Déconnexion</translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation>Supprimer Raccourci</translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation>Créer Raccourci</translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>Forme</translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation>Favoris</translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation>Applications Favorites</translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation>Répertoires favoris</translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation>Fichiers Favoris</translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation>Applications du système</translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation>Accueil</translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation>Préférences du Bureau</translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation>Panneau Contrôle</translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation>Bureau Apparence/Plugins</translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation>Application Apparence</translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation>Paramètres d&apos;économiseur d&apos;écran</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>Multimédia</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>Développement</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>Éducation</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Jeux</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>Graphique</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Internet</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>Bureautique</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>Science</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Paramétrages</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>Système</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation>Utilitaires</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation>Non triés</translation>
+ </message>
+</context>
+</TS>
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
new file mode 100644
index 00000000..638b0b05
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr_CA.ts
@@ -0,0 +1,372 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation>Cliquez pour définir</translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation>Sélectionnez une application</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>Nom:</translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation>Applications</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>Multimédia</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>Développement</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>Éducation</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Jeux</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>Graphique</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Internet</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>Bureautique</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>Science</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Paramétrages</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>Système</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation>Utilitaires</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation>Non triés</translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation>Ouvrir Accueil</translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation>Installer des applications</translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation>Panneau Contrôle</translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation>%1 % (Charge)</translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation>%1 % (%2 Restant)</translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation>Audio</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Video</translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation>Images</translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation>Autres Fichiers</translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation>Documents</translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation>Applications Favorites</translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation>Dossiers Favoris</translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation>Fichier Favoris</translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation>Terminal</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Déconnexion</translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation>Lumina Destop</translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation>Espace de travail %1</translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation>Parcourir système</translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation>Verrouillage du bureau </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation>Déverrouiller le bureau</translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation>Aligner Greffon sur la grille</translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation>Espace de travail %1</translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation>Forme</translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation>Volume Système</translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation>Luminosité de l&apos;écran</translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation>État de la batterie</translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation>Espace de travail</translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation>chargement</translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation>%1 de %2</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Déconnexion</translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation>Lancer Mixeur Audio</translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation>Fermer la Fenêtre</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation>Paramètres de bureau</translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation>Économiseur d&apos;écran</translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation>Desktop</translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation>Thème Fenêtre </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation>Options du système</translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation>Redémarrage</translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation>Éteindre</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Déconnexion</translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation>Supprimer Raccourci</translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation>Créer Raccourci</translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>Forme</translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation>Favoris</translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation>Applications Favorites</translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation>Répertoires favoris</translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation>Fichiers Favoris</translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation>Applications du système</translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation>Home</translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation>Préférences du Bureau</translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation>Panneau Contrôle</translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation>Bureau Apparence/Plugins</translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation>Application Apparence</translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation>Paramètres d&apos;économiseur d&apos;écran</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>Multimédia</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>Développement</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>Éducation</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Jeux</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>Graphique</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Internet</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>Bureautique</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>Science</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Paramétrages</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>Système</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation>Utilitaires</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation>Non triés</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_gl.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_gl.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_gl.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_he.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_he.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_he.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hi.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hi.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hi.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hr.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hr.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hr.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hu.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hu.ts
new file mode 100644
index 00000000..1da91c5a
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hu.ts
@@ -0,0 +1,373 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="hu_HU">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation>Kattintás a beállításhoz</translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation>Alkalmazás kiválasztása</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>Név:</translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation>Alkalmazások</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>Multimédia</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>Fejlesztés</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>Oktatás</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Játékok</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>Grafika</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Hálózat</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>Iroda</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>Tudomány</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Beállítások</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>Rendszer</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation>Segédeszközök</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation>Nem rendszerezett</translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation>Saját könyvtár megnyitása</translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation>Alkalmazások telepítése</translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation>Vezérlőpult</translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation>%1 % (Töltés)</translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation>%1 % (%2 fennmaradó)</translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation>Audió</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Videó</translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation>Képek</translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation>Egyéb fájlok</translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation>Dokumentumok</translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation>Kedvenc alkalmazások</translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation>Kedvenc mappák</translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation>Kedvenc fájlok</translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation>Terminál</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Kijelentkezés</translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation>Lumina Desktop</translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation>%1 munkaterület</translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation>Rendszer böngészése</translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation>Asztal zárolása</translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation>Asztal zárolásának feloldása</translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">Snap Plugins to Grid</translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation>%1 munkaterület</translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">Form</translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation>Rendszer hangereje</translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation>Képernyő világosság</translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation>Akkumulátor állapota</translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation>Munkaterület</translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation>töltés</translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation>%1 / %2</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Kijelentkezés</translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation>Hangkeverő indítása</translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation>Ablak bezárása</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation>Asztal beállításai</translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation>Képernyővédő</translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation>Asztal</translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation>Ablaktéma</translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation>Rendszer opciók</translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation>Újraindítás</translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation>Leállítás</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Mégsem</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Kijelentkezés</translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation>Gyorsindító eltávolítása</translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation>Gyorsindító létrehozása</translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">Nem rendszerezett</translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation>Kedvencek</translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation>Kedvenc alkalmazások</translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation>Kedvenc könyvtárak</translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation>Kedvenc fájlok</translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation>Rendszer alkalmazások</translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation>Saját könyvtár
+</translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation>Asztal beállításai</translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation>Vezérlőpult</translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation>Asztal megjelenése / pluginek</translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation>Alkalmazások megjelenése</translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation>Képernyővédő beállításai</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>Multimédia</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>Fejlesztés</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>Oktatás</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Játékok</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>Grafika</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Hálózat</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>Iroda</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>Tudomány</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Beállítások</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>Rendszer</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation>Segédeszközök</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation>Nem rendszerezett</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_id.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_id.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_id.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_is.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_is.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_is.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_it.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_it.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_it.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ja.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ja.ts
new file mode 100644
index 00000000..36387363
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ja.ts
@@ -0,0 +1,372 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation>クリックしてセットする</translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation>アプリケーションを選択する</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>名前:</translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation>アプリケーション</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>マルチメディア</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>開発</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>教育</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>ゲーム</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>グラフィック</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>ネットワーク</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>オフィス</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>科学</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>設定</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>システム</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation>ユーティリティ</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation>未分類</translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation>ホームディレクトリーを開く</translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation>アプリケーションをインストールする</translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation>コントロールパネル</translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation>%1 % (充電しています)</translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation>%1 % (残り %2)</translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation>オーディオ</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>ビデオ</translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation>写真</translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation>その他のファイル</translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation>文書</translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation>お気に入りのアプリケーション</translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation>お気に入りのフォルダー</translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation>お気に入りのファイル</translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation>端末</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>ログアウト</translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation>Lumina デスクトップ</translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation>ワークスペース %1</translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation>システムを閲覧する</translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation>デスクトップをロックする</translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation>デスクトップのロックを解除する</translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation>プラグインをグリッドに合わせる</translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation>ワークスペース %1</translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation>フォーム</translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation>システムの音量</translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation>画面の明るさ</translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation>バッテリーの状態</translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation>ワークスペース</translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation>充電中</translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation>%1 / %2</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>ログアウト</translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation>オーディオミキサーを起動する</translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation>ウィンドウを閉じる</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation>デスクトップの設定</translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation>スクリーンセーバー</translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation>デスクトップ</translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation>ウィンドウのテーマ</translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation>システムオプション</translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation>再起動</translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation>シャットダウン</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>キャンセル</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>ログアウト</translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation>ショートカットを削除する</translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation>ショートカットを作成する</translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>フォーム</translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation>お気に入り</translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation>お気に入りのアプリケーション</translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation>お気に入りのディレクトリー</translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation>お気に入りのファイル</translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation>システムのアプリケーション</translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation>ホーム</translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation>デスクトップの設定</translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation>コントロールパネル</translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation>デスクトップの外観/プラグイン</translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation>アプリケーションの外観</translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation>スクリーンセーバーの設定</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>マルチメディア</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>開発</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>教育</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>ゲーム</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>グラフィックス</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>ネットワーク</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>オフィス</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>科学</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>設定</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>システム</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation>ユーティリティ</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation>未分類</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ka.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ka.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ka.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ko.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ko.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ko.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lt.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lt.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lt.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lv.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lv.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lv.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mk.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mk.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mk.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mn.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mn.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mn.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ms.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ms.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ms.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mt.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mt.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mt.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nb.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nb.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nb.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nl.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nl.ts
new file mode 100644
index 00000000..2e1ab6cb
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nl.ts
@@ -0,0 +1,372 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation>Klik om in te stellen</translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation>Selecteer applicatie</translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation>Naam:</translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation>Applicaties</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>Multimedia</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>Ontwikkeling</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>Educatie</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Spellen</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>Grafisch</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Netwerk</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>Kantoor</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>Wetenschap</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Instellingen</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>Systeem</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation>Hulpprogramma's</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation>Niet gesorteerd</translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation>Open huis</translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation>Installeer applicaties</translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation>Beheer paneel</translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation>%1 % (Laden)</translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation>%1 % (%2 Resterend)</translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation>Geluid</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Video</translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation>Foto's</translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation>Overige bestanden</translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation>Documenten</translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation>Favoriete applicaties</translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation>Favorite mappen</translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation>Favoriete bestanden</translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation>Terminal</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Uitloggen</translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation>Lumina bureaublad</translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation>Werkplek %1</translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation>Blader door systeem</translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation>Vergrendel bureaublad</translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation>Ontgrendel bureaublad</translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation>Bind plugin aan rooster</translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation>Werkplek %1</translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation>Formulier</translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation>Systeem geluids volume</translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation>Scherm helderheid</translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation>Batterij status</translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation>Werkplek</translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation>aan het opladen</translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation>%1 van %2</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Uitloggen</translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation>Start audio mengpaneel</translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation>Scherm sluiten</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation>Bureaublad instellingen</translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation>Schermbeveiliging</translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation>Bureaublad</translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation>Scherm thema</translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation>System opties</translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation>Herstart</translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation>Afsluiten</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuleren</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Uitloggen</translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation>Verwijder snelkoppeling</translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation>Snelkoppeling aanmaken</translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation>Formulier</translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation>Favorieten</translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation>Favoriete applicaties</translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation>Favoriete mappen</translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation>Favoriete bestanden</translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation>System applicaties</translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation>Thuis</translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation>Bureaublad voorkeuren</translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation>Beheer paneel</translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation>Bureaublad uiterlijk/plugins</translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation>Applicatie uiterlijk</translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation>Schermbeveiliging instellingen</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>Multimedia</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>Ontwikkeling</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>Educatie</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Spellen</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>Grafisch</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Netwerk</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>Kantoor</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>Wetenschap</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Instellingen</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>Systeem</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation>Hulpprogramma's</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation>Niet gesorteerd</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pa.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pa.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pa.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pl.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pl.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pl.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
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
new file mode 100644
index 00000000..7e1e2b2b
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt_BR.ts
@@ -0,0 +1,408 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation>Aplicativos</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>Multimídia</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>Desenvolvimento</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>Educação</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Jogos</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>Gráficos</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Rede</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>Escritório</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>Ciência</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Configurações</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>Sistema</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">Utilitários</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">Sem classificação</translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">%1 % (Carregando)</translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation>%1 % (%2 Restantes)</translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation>Áudio</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Vídeo</translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">Fotos</translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation>Outros arquivos</translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation>Terminal</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">Encerrar</translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">Lumina Desktop</translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation>Espaço de trabalho %1</translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation>Espaço de trabalho %1</translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">Encerrar</translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation>Fechar janela</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation>Configurações da área de trabalho</translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation>Protetor de tela</translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation>Área de trabalho</translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation>Opções do sistema</translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation>Reiniciar</translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">Desligar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">Encerrar</translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">Início</translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">Multimídia</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">Desenvolvimento</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">Educação</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">Jogos</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">Gráficos</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">Rede</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">Escritório</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">Ciência</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Configurações</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">Sistema</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">Utilitários</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">Sem classificação</translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ro.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ro.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ro.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ru.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ru.ts
new file mode 100644
index 00000000..cfcbc18f
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ru.ts
@@ -0,0 +1,405 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation>Приложения</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>Мультимедиа</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>Разработка</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>Образование</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Игры</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>Графика</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Сети</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>Офис</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>Наука</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Параметры</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>Система</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation>Инструменты</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation>Не классифицированные </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">%1 % (Заряжается)</translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">%1 % (Осталось %2 )</translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation>Звук</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Видео</translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation>Изображения</translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation>Прочие файлы</translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation>Документы</translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation>Терминал</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Завершить сеанс</translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">Рабочий стол Lumina</translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">Рабочая область %1</translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation>Обзор системы</translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation>Заблокировать рабочий стол</translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation>Разблокировать рабочий стол</translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">Рабочий стол %1</translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">Завершить сеанс</translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation>Закрыть окно</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation>Настройки рабочего стола</translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation>Заставка экрана</translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation>Рабочий стол</translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation>Параметры системы</translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation>Перезагрузить…</translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation>Выключить…</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Отмена</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">Завершить сеанс</translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">Мультимедиа</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">Разработка</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">Образование</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">Игры</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">Графика</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">Сети</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">Офис</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">Наука</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Параметры</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">Система</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">Инструменты</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">Не классифицированные </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sk.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sk.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sk.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sl.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sl.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sl.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sr.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sr.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sr.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sv.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sv.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sv.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sw.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sw.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sw.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ta.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ta.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ta.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tg.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tg.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tg.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_th.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_th.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_th.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tr.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tr.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tr.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uk.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uk.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uk.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uz.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uz.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uz.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_vi.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_vi.ts
new file mode 100644
index 00000000..4e2e8773
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_vi.ts
@@ -0,0 +1,408 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation>ứng dụng</translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation>đa phương</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation>Phát triển</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation>Giáo dục</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation>Trò chơi</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation>đồ họa</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Mạng</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation>Văn phòng</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation>Khoa học</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Các thiết lập</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation>Hệ thống</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation>Tiện ích</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation>Phân loại</translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation>% 1% (Sạc)</translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation>%1 % (%2 còn lại)</translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation>âm thanh</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Video</translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation>Hình ảnh</translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation>Tập tin khác</translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation>Terminal</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation>Nhập Thoát</translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation>Lumina để bàn</translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation>Không gian làm việc %1</translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation>Không gian làm việc %1</translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">Nhập Thoát</translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation>Đóng cửa sổ</translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation>Các thiết lập để bàn</translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation>Bảo vệ màn hình</translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation>Dể bàn</translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation>Tùy chọn hệ thống</translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation>Khởi động lại</translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation>Tắt máy </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Bỏ tem</translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">Nhập Thoát</translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation>Nhà</translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">đa phương</translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">Phát triển</translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">Giáo dục</translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">Trò chơi</translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">đồ họa</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">Mạng</translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">Văn phòng</translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">Khoa học</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Các thiết lập</translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">Hệ thống</translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">Tiện ích</translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">Phân loại</translation>
+ </message>
+</context>
+</TS>
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
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_CN.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
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
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_HK.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
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
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_TW.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zu.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zu.ts
new file mode 100644
index 00000000..2a73bbc0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zu.ts
@@ -0,0 +1,455 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AppLauncherPlugin</name>
+ <message>
+ <source>Click to Set</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Select Application</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Name:</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>AppMenu</name>
+ <message>
+ <source>Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Open Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Install Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LBattery</name>
+ <message>
+ <source>%1 % (Charging)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 % (%2 Remaining)</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDeskBarPlugin</name>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Pictures</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Other Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Documents</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Folders</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Files</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktop</name>
+ <message>
+ <source>Terminal</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lumina Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Browse System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Lock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unlock Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Snap Plugins to Grid</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LDesktopSwitcher</name>
+ <message>
+ <source>Workspace %1</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LSysMenuQuick</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Volume</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screen Brightness</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Battery Status</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Workspace</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>charging</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>%1 of %2</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Launch Audio Mixer</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>LTaskButton</name>
+ <message>
+ <source>Close Window</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SettingsMenu</name>
+ <message>
+ <source>Desktop Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Window Theme</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>SystemWindow</name>
+ <message>
+ <source>System Options</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Restart</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Shutdown</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Log Out</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserItemWidget</name>
+ <message>
+ <source>Remove Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Create Shortcut</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+<context>
+ <name>UserWidget</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorites</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite Directories</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Favorite FIles</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System Applications</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Preferences</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Control Panel</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Desktop Appearance/Plugins</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Application Appearance</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Screensaver Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Multimedia</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Development</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Education</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Games</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Graphics</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Office</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Science</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>System</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Utility</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+ <message>
+ <source>Unsorted</source>
+ <translation type="unfinished">
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/src-qt5/core/lumina-desktop/images/desktop-background.jpg b/src-qt5/core/lumina-desktop/images/desktop-background.jpg
new file mode 100644
index 00000000..976e2417
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/images/desktop-background.jpg
Binary files differ
diff --git a/src-qt5/core/lumina-desktop/images/sample-colorschemes.ui b/src-qt5/core/lumina-desktop/images/sample-colorschemes.ui
new file mode 100644
index 00000000..bc9d9972
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/images/sample-colorschemes.ui
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <widget class="QLabel" name="label">
+ <property name="geometry">
+ <rect>
+ <x>250</x>
+ <y>50</y>
+ <width>111</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">QLabel{ background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(241, 233, 156, 240), stop:0.505682 rgba(255, 243, 127, 180), stop:1 rgba(221, 246, 255, 55)); border: 1px solid grey; border-radius: 5px;}</string>
+ </property>
+ <property name="text">
+ <string>Active</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_2">
+ <property name="geometry">
+ <rect>
+ <x>250</x>
+ <y>90</y>
+ <width>111</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">QLabel{background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(255, 255, 255, 240), stop:0.505682 rgba(240, 240, 240, 180), stop:1 rgba(210, 210, 210, 55)); border: 1px solid grey; border-radius: 5px;}</string>
+ </property>
+ <property name="text">
+ <string>Visible</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_3">
+ <property name="geometry">
+ <rect>
+ <x>250</x>
+ <y>130</y>
+ <width>111</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">QLabel{ background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(215, 215, 215, 210), stop:0.505682 rgba(184, 185, 186, 150), stop:1 rgba(221, 246, 255, 55)); border: 1px solid grey; border-radius: 5px;}</string>
+ </property>
+ <property name="text">
+ <string>Invisible</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_4">
+ <property name="geometry">
+ <rect>
+ <x>250</x>
+ <y>170</y>
+ <width>111</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">QLabel{ background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(252, 187, 127, 210), stop:0.505682 rgba(255, 222, 197, 150), stop:1 rgba(221, 246, 255, 55)); border: 1px solid grey; border-radius: 5px; }
+
+</string>
+ </property>
+ <property name="text">
+ <string>Notification</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_5">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>50</y>
+ <width>221</width>
+ <height>51</height>
+ </rect>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">QLabel{ background: qlineargradient(spread:pad, x1:0.291182, y1:0, x2:0.693, y2:1, stop:0 rgb(255, 253, 250), stop:1 rgb(230, 230, 230));}</string>
+ </property>
+ <property name="text">
+ <string>Taskbar</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_6">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>220</y>
+ <width>381</width>
+ <height>41</height>
+ </rect>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">QLabel{ background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(178, 45, 39, 255), stop:0.471591 rgba(221, 173, 68, 255), stop:0.528409 rgba(215, 202, 124, 255), stop:1 rgba(189, 17, 17, 255)); border-radius: 5px; border: 1px solid rgb(233, 218, 5);}</string>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src-qt5/core/lumina-desktop/lumina-desktop.pro b/src-qt5/core/lumina-desktop/lumina-desktop.pro
new file mode 100644
index 00000000..cfc175ef
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/lumina-desktop.pro
@@ -0,0 +1,167 @@
+include($${PWD}/../../OS-detect.pri)
+
+QT += core gui network
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets x11extras multimedia concurrent svg
+
+
+TARGET = Lumina-DE
+target.path = $${L_BINDIR}
+
+
+LIBS += -lLuminaUtils -lxcb -lxcb-damage
+DEPENDPATH += ../libLumina
+
+TEMPLATE = app
+
+
+SOURCES += main.cpp \
+ WMProcess.cpp \
+ LXcbEventFilter.cpp \
+ LSession.cpp \
+ LDesktop.cpp \
+ LDesktopPluginSpace.cpp \
+ LPanel.cpp \
+ LWinInfo.cpp \
+ AppMenu.cpp \
+ SettingsMenu.cpp \
+ SystemWindow.cpp \
+ BootSplash.cpp \
+ desktop-plugins/LDPlugin.cpp \
+
+
+HEADERS += Globals.h \
+ WMProcess.h \
+ LXcbEventFilter.h \
+ LSession.h \
+ LDesktop.h \
+ LDesktopPluginSpace.h \
+ LPanel.h \
+ LWinInfo.h \
+ AppMenu.h \
+ SettingsMenu.h \
+ SystemWindow.h \
+ BootSplash.h \
+ panel-plugins/LPPlugin.h \
+ panel-plugins/NewPP.h \
+ panel-plugins/LTBWidget.h \
+ desktop-plugins/LDPlugin.h \
+ desktop-plugins/NewDP.h \
+
+FORMS += SystemWindow.ui \
+ BootSplash.ui
+
+#Now include all the files for the various plugins
+include(panel-plugins/panel-plugins.pri)
+include(desktop-plugins/desktop-plugins.pri)
+
+RESOURCES+= Lumina-DE.qrc
+
+desktop.path = $${L_SESSDIR}
+desktop.files = Lumina-DE.desktop
+
+icons.files = Lumina-DE.png \
+ Insight-FileManager.png
+icons.path = $${L_SHAREDIR}/pixmaps
+
+fluxconf.files = fluxboxconf/fluxbox-init-rc \
+ fluxboxconf/fluxbox-keys
+fluxconf.path = $${L_SHAREDIR}/Lumina-DE/
+
+wallpapers.files = wallpapers/Lumina_Wispy_gold.jpg \
+ wallpapers/Lumina_Wispy_green.jpg \
+ wallpapers/Lumina_Wispy_purple.jpg \
+ wallpapers/Lumina_Wispy_red.jpg \
+ wallpapers/Lumina_Wispy_blue-grey.jpg \
+ wallpapers/Lumina_Wispy_blue-grey-zoom.jpg \
+ wallpapers/Lumina_Wispy_grey-blue.jpg \
+ wallpapers/Lumina_Wispy_grey-blue-zoom.jpg
+wallpapers.path = $${L_SHAREDIR}/wallpapers/Lumina-DE
+
+
+defaults.files = defaults/luminaDesktop.conf \
+ audiofiles/Logout.ogg \
+ audiofiles/Login.ogg
+defaults.path = $${L_SHAREDIR}/Lumina-DE/
+
+conf.path = $${L_ETCDIR}
+
+#Now do any PC-BSD defaults (if set)
+PCBSD{
+ conf.extra = cp defaults/luminaDesktop.pcbsd.conf $(INSTALL_ROOT)$${L_ETCDIR}/luminaDesktop.conf.dist
+ defaults.extra = cp defaults/desktop-background.pcbsd.jpg $(INSTALL_ROOT)$${L_SHAREDIR}/Lumina-DE/desktop-background.jpg
+}else{
+ conf.extra = cp defaults/luminaDesktop.conf $(INSTALL_ROOT)$${L_ETCDIR}/luminaDesktop.conf.dist
+ defaults.extra = cp defaults/desktop-background.jpg $(INSTALL_ROOT)$${L_SHAREDIR}/Lumina-DE/desktop-background.jpg
+}
+
+TRANSLATIONS = i18n/lumina-desktop_af.ts \
+ i18n/lumina-desktop_ar.ts \
+ i18n/lumina-desktop_az.ts \
+ i18n/lumina-desktop_bg.ts \
+ i18n/lumina-desktop_bn.ts \
+ i18n/lumina-desktop_bs.ts \
+ i18n/lumina-desktop_ca.ts \
+ i18n/lumina-desktop_cs.ts \
+ i18n/lumina-desktop_cy.ts \
+ i18n/lumina-desktop_da.ts \
+ i18n/lumina-desktop_de.ts \
+ i18n/lumina-desktop_el.ts \
+ i18n/lumina-desktop_en_GB.ts \
+ i18n/lumina-desktop_en_ZA.ts \
+ i18n/lumina-desktop_es.ts \
+ i18n/lumina-desktop_et.ts \
+ i18n/lumina-desktop_eu.ts \
+ i18n/lumina-desktop_fa.ts \
+ i18n/lumina-desktop_fi.ts \
+ i18n/lumina-desktop_fr.ts \
+ i18n/lumina-desktop_fr_CA.ts \
+ i18n/lumina-desktop_gl.ts \
+ i18n/lumina-desktop_he.ts \
+ i18n/lumina-desktop_hi.ts \
+ i18n/lumina-desktop_hr.ts \
+ i18n/lumina-desktop_hu.ts \
+ i18n/lumina-desktop_id.ts \
+ i18n/lumina-desktop_is.ts \
+ i18n/lumina-desktop_it.ts \
+ i18n/lumina-desktop_ja.ts \
+ i18n/lumina-desktop_ka.ts \
+ i18n/lumina-desktop_ko.ts \
+ i18n/lumina-desktop_lt.ts \
+ i18n/lumina-desktop_lv.ts \
+ i18n/lumina-desktop_mk.ts \
+ i18n/lumina-desktop_mn.ts \
+ i18n/lumina-desktop_ms.ts \
+ i18n/lumina-desktop_mt.ts \
+ i18n/lumina-desktop_nb.ts \
+ i18n/lumina-desktop_nl.ts \
+ i18n/lumina-desktop_pa.ts \
+ i18n/lumina-desktop_pl.ts \
+ i18n/lumina-desktop_pt.ts \
+ i18n/lumina-desktop_pt_BR.ts \
+ i18n/lumina-desktop_ro.ts \
+ i18n/lumina-desktop_ru.ts \
+ i18n/lumina-desktop_sk.ts \
+ i18n/lumina-desktop_sl.ts \
+ i18n/lumina-desktop_sr.ts \
+ i18n/lumina-desktop_sv.ts \
+ i18n/lumina-desktop_sw.ts \
+ i18n/lumina-desktop_ta.ts \
+ i18n/lumina-desktop_tg.ts \
+ i18n/lumina-desktop_th.ts \
+ i18n/lumina-desktop_tr.ts \
+ i18n/lumina-desktop_uk.ts \
+ i18n/lumina-desktop_uz.ts \
+ i18n/lumina-desktop_vi.ts \
+ i18n/lumina-desktop_zh_CN.ts \
+ i18n/lumina-desktop_zh_HK.ts \
+ i18n/lumina-desktop_zh_TW.ts \
+ i18n/lumina-desktop_zu.ts
+
+dotrans.path=$${L_SHAREDIR}/Lumina-DE/i18n/
+dotrans.extra=cd i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/Lumina-DE/i18n/
+
+INSTALLS += target desktop icons wallpapers defaults conf fluxconf dotrans
+
+NO_I18N{
+ INSTALLS -= dotrans
+}
diff --git a/src-qt5/core/lumina-desktop/main.cpp b/src-qt5/core/lumina-desktop/main.cpp
new file mode 100644
index 00000000..50ad7ef4
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/main.cpp
@@ -0,0 +1,104 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include <QDebug>
+//#include <QApplication>
+#include <QFile>
+#include <QDir>
+#include <QString>
+#include <QTextStream>
+//#include <QDesktopWidget>
+//#include <QList>
+//#include <QDebug>
+#include <QUrl>
+
+
+#include "LSession.h"
+#include "Globals.h"
+
+#include <LuminaXDG.h> //from libLuminaUtils
+#include <LuminaThemes.h>
+#include <LuminaOS.h>
+#include <LuminaUtils.h>
+
+#define DEBUG 0
+
+QFile logfile(QDir::homePath()+"/.lumina/logs/runtime.log");
+void MessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg){
+ QString txt;
+ switch(type){
+ case QtDebugMsg:
+ txt = QString("Debug: %1").arg(msg);
+ break;
+ case QtWarningMsg:
+ txt = QString("Warning: %1").arg(msg);
+ txt += "\nContext: "+QString(context.file)+" Line: "+QString(context.line)+" Function: "+QString(context.function);
+ break;
+ case QtCriticalMsg:
+ txt = QString("CRITICAL: %1").arg(msg);
+ txt += "\nContext: "+QString(context.file)+" Line: "+QString(context.line)+" Function: "+QString(context.function);
+ break;
+ case QtFatalMsg:
+ txt = QString("FATAL: %1").arg(msg);
+ txt += "\nContext: "+QString(context.file)+" Line: "+QString(context.line)+" Function: "+QString(context.function);
+ break;
+ }
+
+ QTextStream out(&logfile);
+ out << txt;
+ if(!txt.endsWith("\n")){ out << "\n"; }
+}
+
+int main(int argc, char ** argv)
+{
+ if (argc > 1) {
+ if (QString(argv[1]) == QString("--version")){
+ qDebug() << LUtils::LuminaDesktopVersion();
+ return 0;
+ }
+ }
+ if(!QFile::exists(LOS::LuminaShare())){
+ qDebug() << "Lumina does not appear to be installed correctly. Cannot find: " << LOS::LuminaShare();
+ return 1;
+ }
+ //Setup any pre-QApplication initialization values
+ LTHEME::LoadCustomEnvSettings();
+ LXDG::setEnvironmentVars();
+ setenv("DESKTOP_SESSION","Lumina",1);
+ setenv("XDG_CURRENT_DESKTOP","Lumina",1);
+ unsetenv("QT_QPA_PLATFORMTHEME"); //causes issues with Lumina themes - not many people have this by default...
+ //Startup the session
+ LSession a(argc, argv);
+ if(!a.isPrimaryProcess()){ return 0; }
+ //Setup the log file
+ qDebug() << "Lumina Log File:" << logfile.fileName();
+ if(QFile::exists(logfile.fileName()+".old")){ QFile::remove(logfile.fileName()+".old"); }
+ if(logfile.exists()){ QFile::rename(logfile.fileName(), logfile.fileName()+".old"); }
+ //Make sure the parent directory exists
+ if(!QFile::exists(QDir::homePath()+"/.lumina/logs")){
+ QDir dir;
+ dir.mkpath(QDir::homePath()+"/.lumina/logs");
+ }
+ logfile.open(QIODevice::WriteOnly | QIODevice::Append);
+ QTime *timer=0;
+ if(DEBUG){ timer = new QTime(); timer->start(); }
+ //Setup Log File
+ qInstallMessageHandler(MessageOutput);
+ if(DEBUG){ qDebug() << "Theme Init:" << timer->elapsed(); }
+ LuminaThemeEngine theme(&a);
+ QObject::connect(&theme, SIGNAL(updateIcons()), &a, SLOT(reloadIconTheme()) );
+ //if(DEBUG){ qDebug() << "Load Locale:" << timer->elapsed(); }
+ //LUtils::LoadTranslation(&a, "lumina-desktop");
+ if(DEBUG){ qDebug() << "Session Setup:" << timer->elapsed(); }
+ a.setupSession();
+ theme.refresh();
+ if(DEBUG){ qDebug() << "Exec Time:" << timer->elapsed(); delete timer;}
+ int retCode = a.exec();
+ //qDebug() << "Stopping the window manager";
+ qDebug() << "Finished Closing Down Lumina";
+ logfile.close();
+ return retCode;
+}
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/LPPlugin.h b/src-qt5/core/lumina-desktop/panel-plugins/LPPlugin.h
new file mode 100644
index 00000000..c4c76297
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/LPPlugin.h
@@ -0,0 +1,77 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This class is the generic container layout for all panel plugins
+// Simply subclass this when creating a new plugin to enable correct
+// visibility and usage within a panel
+//===========================================
+#ifndef _LUMINA_DESKTOP_PANEL_PLUGIN_H
+#define _LUMINA_DESKTOP_PANEL_PLUGIN_H
+
+#include <QObject>
+#include <QWidget>
+#include <QString>
+#include <QBoxLayout>
+#include <QApplication>
+
+class LPPlugin : public QWidget{
+ Q_OBJECT
+
+private:
+ QBoxLayout *LY;
+ QString plugintype;
+
+public:
+ LPPlugin(QWidget *parent = 0, QString ptype="unknown", bool horizontal = true) : QWidget(parent){
+ plugintype=ptype;
+ this->setContentsMargins(1,1,1,1);
+ this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+ this->setFocusPolicy(Qt::NoFocus); //no keyboard focus on the panel/plugins
+ if(horizontal){LY = new QBoxLayout(QBoxLayout::LeftToRight, this); }
+ else{ LY = new QBoxLayout(QBoxLayout::TopToBottom, this); }
+ this->setObjectName(ptype.section("---",0,0));
+ LY->setContentsMargins(0,0,0,0);
+ LY->setSpacing(1);
+ this->setLayout(LY);
+ connect(QApplication::instance(), SIGNAL(LocaleChanged()), this, SLOT(LocaleChange()) );
+ connect(QApplication::instance(), SIGNAL(IconThemeChanged()), this, SLOT(ThemeChange()) );
+ }
+
+ ~LPPlugin(){
+ }
+
+ QBoxLayout* layout(){
+ return LY;
+ }
+
+ QString type(){
+ return plugintype;
+ }
+
+ virtual void AboutToClose(){
+ //This needs to be re-implemented in the subclasses plugin
+ //This is for any last-minute cleanup before the plugin gets deleted
+ }
+
+public slots:
+ virtual void LocaleChange(){
+ //This needs to be re-implemented in the subclassed plugin
+ //This is where all text is set/translated
+ }
+ virtual void ThemeChange(){
+ //This needs to be re-implemented in the subclasses plugin
+ //This is where all the visuals are set if using Theme-dependant icons.
+ }
+ virtual void OrientationChange(){
+ //This needs to be re-implemented in the subclasses plugin
+ //This is where any horizontal/vertical orientations can be changed appropriately
+ }
+
+signals:
+ void MenuClosed(); //This needs to be emitted when any plugin's menu is closed for some reason (check/set focus properly)
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/LTBWidget.h b/src-qt5/core/lumina-desktop/panel-plugins/LTBWidget.h
new file mode 100644
index 00000000..560e5811
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/LTBWidget.h
@@ -0,0 +1,71 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2013, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_TOOLBAR_WIDGET_H
+#define _LUMINA_TOOLBAR_WIDGET_H
+
+#include <QToolButton>
+#include <QEvent>
+#include <QWheelEvent>
+
+#include "Globals.h"
+#include <LuminaX11.h>
+
+class LTBWidget : public QToolButton{
+ Q_OBJECT
+
+private:
+ LXCB::WINDOWVISIBILITY cstate;
+ //QString rawstyle;
+ void updateBackground(){
+ //QString background = "background: transparent; "; //default value
+ //QString border = "border: 1px solid transparent;";
+ if(cstate == LXCB::IGNORE){ this->setObjectName(""); } //just use the defaults
+ else if(cstate == LXCB::VISIBLE){ this->setObjectName("WindowVisible"); }//background = "background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(255, 255, 255, 240), stop:0.505682 rgba(240, 240, 240, 150), stop:1 rgba(210, 210, 210, 55));"; border="border: 1px solid transparent;"; }
+ else if(cstate == LXCB::INVISIBLE){this->setObjectName("WindowInvisible"); } //background = "background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(215, 215, 215, 240), stop:0.505682 rgba(184, 185, 186, 150), stop:1 rgba(221, 246, 255, 55));"; border="border: 1px solid transparent;"; }
+ else if(cstate == LXCB::ACTIVE){ this->setObjectName("WindowActive"); }//background= "background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(241, 233, 156, 240), stop:0.355682 rgba(255, 243, 127, 150), stop:1 rgba(221, 246, 255, 55));"; border ="border: 1px solid transparent;"; }
+ else if(cstate == LXCB::ATTENTION){ this->setObjectName("WindowAttention"); }//background= "background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(252, 187, 127, 240), stop:0.505682 rgba(255, 222, 197, 150), stop:1 rgba(221, 246, 255, 55));"; border="border: 1px solid transparent;"; }
+ this->setStyleSheet(""); //force the object to re-evaluate the current theme stylesheet and update visuals
+ //QString raw = rawstyle;
+ //this->setStyleSheet( raw.replace("%1",background).replace("%2", border) );
+ }
+
+signals:
+
+ void wheelScroll(int change);
+
+public:
+ LTBWidget(QWidget* parent) : QToolButton(parent){
+ //this->setStyleSheet( this->styleSheet()+" LTBWidget::menu-indicator{image: none;}");
+ cstate = LXCB::IGNORE;
+
+ this->setPopupMode(QToolButton::InstantPopup);
+ this->setAutoRaise(true);
+
+ //rawstyle = "LTBWidget{ %1 %2 border-radius: 5px;} LTBWidget::menu-indicator{image: none;} LTBWidget::hover{ %1 border: 1px solid black; border-radius: 5px; } LTBWidget::menu-button{ background: transparent; width: 15px; } LTBWidget[popupMode=\"1\"]{%1 %2 border-radius: 5px; padding-right: 15px;} LTBWidget[popupMode=\"1\"]::hover{%1 border: 1px solid black; border-radius: 5px; padding-right: 15px}";
+ updateBackground();
+ }
+
+ ~LTBWidget(){
+ }
+
+ void setState(LXCB::WINDOWVISIBILITY newstate){
+ cstate = newstate;
+ updateBackground();
+ }
+
+public slots:
+
+
+protected:
+ void wheelEvent(QWheelEvent *event){
+ int change = event->delta()/120; // 1/15th of a rotation (delta/120) is usually one "click" of the wheel
+ emit wheelScroll(change);
+ }
+
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/NewPP.h b/src-qt5/core/lumina-desktop/panel-plugins/NewPP.h
new file mode 100644
index 00000000..50bf2232
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/NewPP.h
@@ -0,0 +1,75 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This class is the interface to load all the different panel plugins
+//===========================================
+#ifndef _LUMINA_DESKTOP_NEW_PANEL_PLUGIN_H
+#define _LUMINA_DESKTOP_NEW_PANEL_PLUGIN_H
+
+#include <QDebug>
+
+//List all the individual plugin includes here
+#include "LPPlugin.h"
+#include "userbutton/LUserButton.h"
+#include "desktopbar/LDeskBar.h"
+#include "spacer/LSpacer.h"
+#include "line/LLine.h"
+#include "clock/LClock.h"
+#include "battery/LBattery.h"
+#include "desktopswitcher/LDesktopSwitcher.h"
+#include "taskmanager/LTaskManagerPlugin.h"
+#include "systemdashboard/LSysDashboard.h"
+#include "showdesktop/LHomeButton.h"
+#include "appmenu/LAppMenuPlugin.h"
+#include "applauncher/AppLaunchButton.h"
+#include "systemstart/LStartButton.h"
+//#include "quickcontainer/QuickPPlugin.h"
+#include "systemtray/LSysTray.h" //must be last due to X11 compile issues
+
+class NewPP{
+public:
+ static LPPlugin* createPlugin(QString plugin, QWidget* parent = 0, bool horizontal = true){
+ LPPlugin *plug = 0;
+ if(plugin.startsWith("userbutton---")){
+ plug = new LUserButtonPlugin(parent, plugin, horizontal);
+ }else if(plugin.startsWith("homebutton---")){
+ plug = new LHomeButtonPlugin(parent, plugin, horizontal);
+ }else if(plugin.startsWith("desktopbar---")){
+ plug = new LDeskBarPlugin(parent, plugin, horizontal);
+ }else if(plugin.startsWith("spacer---")){
+ plug = new LSpacerPlugin(parent, plugin, horizontal);
+ }else if(plugin.startsWith("line---")){
+ plug = new LLinePlugin(parent, plugin, horizontal);
+ }else if(plugin.startsWith("taskmanager")){
+ //This one can be "taskmanager[-nogroups]---"
+ plug = new LTaskManagerPlugin(parent, plugin, horizontal);
+ }else if(plugin.startsWith("systemtray---")){
+ plug = new LSysTray(parent, plugin, horizontal);
+ }else if(plugin.startsWith("desktopswitcher---")){
+ plug = new LDesktopSwitcher(parent, plugin, horizontal);
+ }else if(plugin.startsWith("battery---")){
+ plug = new LBattery(parent, plugin, horizontal);
+ }else if(plugin.startsWith("clock---")){
+ plug = new LClock(parent, plugin, horizontal);
+ }else if(plugin.startsWith("systemdashboard---")){
+ plug = new LSysDashboard(parent, plugin, horizontal);
+ }else if(plugin.startsWith("appmenu---")){
+ plug = new LAppMenuPlugin(parent, plugin, horizontal);
+ }else if(plugin.startsWith("systemstart---")){
+ plug = new LStartButtonPlugin(parent, plugin, horizontal);
+ }else if(plugin.section("---",0,0).section("::",0,0)=="applauncher"){
+ plug = new AppLaunchButtonPlugin(parent, plugin, horizontal);
+ //}else if( plugin.section("---",0,0).startsWith("quick-") && LUtils::validQuickPlugin(plugin.section("---",0,0)) ){
+ //plug = new QuickPPlugin(parent, plugin, horizontal);
+ }else{
+ qWarning() << "Invalid Panel Plugin:"<<plugin << " -- Ignored";
+ }
+ return plug;
+ }
+
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/applauncher/AppLaunchButton.cpp b/src-qt5/core/lumina-desktop/panel-plugins/applauncher/AppLaunchButton.cpp
new file mode 100644
index 00000000..321970ed
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/applauncher/AppLaunchButton.cpp
@@ -0,0 +1,74 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "AppLaunchButton.h"
+#include "../../LSession.h"
+
+#include <LuminaXDG.h>
+#include <QInputDialog>
+
+AppLaunchButtonPlugin::AppLaunchButtonPlugin(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){
+ button = new QToolButton(this);
+ button->setAutoRaise(true);
+ button->setToolButtonStyle(Qt::ToolButtonIconOnly);
+ appfile = id.section("---",0,0).section("::",1,1);
+ if(!QFile::exists(appfile)){ appfile.clear(); }
+ connect(button, SIGNAL(clicked()), this, SLOT(AppClicked()));
+ this->layout()->setContentsMargins(0,0,0,0);
+ this->layout()->addWidget(button);
+
+ QTimer::singleShot(0,this, SLOT(OrientationChange())); //Update icons/sizes
+}
+
+AppLaunchButtonPlugin::~AppLaunchButtonPlugin(){
+
+}
+
+void AppLaunchButtonPlugin::updateButtonVisuals(){
+ QIcon icon;
+ QString tooltip = tr("Click to assign an application");
+ if(appfile.endsWith(".desktop")){
+ bool ok = false;
+ XDGDesktop desk = LXDG::loadDesktopFile(appfile,ok);
+ if(ok){
+ icon = LXDG::findIcon(desk.icon, "unknown");
+ tooltip = QString(tr("Launch %1")).arg(desk.name);
+ }else{
+ icon = LXDG::findIcon("task-attention","");
+ appfile.clear();
+ }
+ }else if(QFile::exists(appfile)){
+ icon = LXDG::findMimeIcon(appfile.section("/",-1));
+ tooltip = QString(tr("Open %1")).arg(appfile.section("/",-1));
+ }else{
+ icon = LXDG::findIcon("task-attention", "");
+ }
+ button->setIcon( icon );
+ button->setToolTip(tooltip);
+}
+
+// ========================
+// PRIVATE FUNCTIONS
+// ========================
+void AppLaunchButtonPlugin::AppClicked(){
+ if(appfile.isEmpty()){
+ //No App File selected
+ QList<XDGDesktop> apps = LSession::handle()->applicationMenu()->currentAppHash()->value("All");
+ QStringList names;
+ for(int i=0; i<apps.length(); i++){ names << apps[i].name; }
+ bool ok = false;
+ QString app = QInputDialog::getItem(this, tr("Select Application"), tr("Name:"), names, 0, false, &ok);
+ if(!ok || names.indexOf(app)<0){ return; } //cancelled
+ appfile = apps[ names.indexOf(app) ].filePath;
+ //Still need to find a way to set this value persistently
+ // --- perhaps replace the plugin in the desktop settings file with the new path?
+ // --- "applauncher::broken---<something>" -> "applauncher::fixed---<something>" ?
+ QTimer::singleShot(0,this, SLOT(updateButtonVisuals()));
+ }else{
+ LSession::LaunchApplication("lumina-open \""+appfile+"\"");
+ }
+}
+
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/applauncher/AppLaunchButton.h b/src-qt5/core/lumina-desktop/panel-plugins/applauncher/AppLaunchButton.h
new file mode 100644
index 00000000..3aa3c7ad
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/applauncher/AppLaunchButton.h
@@ -0,0 +1,63 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This panel plugin is a simple button to launch a single application
+//===========================================
+#ifndef _LUMINA_DESKTOP_LAUNCH_APP_PANEL_PLUGIN_H
+#define _LUMINA_DESKTOP_LAUNCH_APP_PANEL_PLUGIN_H
+
+// Qt includes
+#include <QToolButton>
+#include <QString>
+#include <QWidget>
+
+
+// Lumina-desktop includes
+#include "../LPPlugin.h" //main plugin widget
+
+// libLumina includes
+#include "LuminaXDG.h"
+
+// PANEL PLUGIN BUTTON
+class AppLaunchButtonPlugin : public LPPlugin{
+ Q_OBJECT
+
+public:
+ AppLaunchButtonPlugin(QWidget *parent = 0, QString id = "applauncher", bool horizontal=true);
+ ~AppLaunchButtonPlugin();
+
+private:
+ QToolButton *button;
+ QString appfile;
+
+ void updateButtonVisuals();
+
+private slots:
+ void AppClicked();
+
+public slots:
+ void OrientationChange(){
+ if(this->layout()->direction()==QBoxLayout::LeftToRight){
+ this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
+ button->setIconSize( QSize(this->height(), this->height()) );
+ }else{
+ this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
+ button->setIconSize( QSize(this->width(), this->width()) );
+ }
+ this->layout()->update();
+ updateButtonVisuals();
+ }
+
+ void LocaleChange(){
+ updateButtonVisuals();
+ }
+
+ void ThemeChange(){
+ updateButtonVisuals();
+ }
+};
+
+#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/appmenu/LAppMenuPlugin.cpp b/src-qt5/core/lumina-desktop/panel-plugins/appmenu/LAppMenuPlugin.cpp
new file mode 100644
index 00000000..318d03fa
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/appmenu/LAppMenuPlugin.cpp
@@ -0,0 +1,134 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LAppMenuPlugin.h"
+#include "../../LSession.h"
+
+#include <LuminaXDG.h>
+
+LAppMenuPlugin::LAppMenuPlugin(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){
+ button = new QToolButton(this);
+ button->setAutoRaise(true);
+ button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+ mainmenu = new QMenu(this);
+ button->setMenu( mainmenu );
+ button->setPopupMode(QToolButton::InstantPopup);
+ this->layout()->setContentsMargins(0,0,0,0);
+ this->layout()->addWidget(button);
+
+ connect(mainmenu, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed()));
+ connect(mainmenu, SIGNAL(triggered(QAction*)), this, SLOT(LaunchItem(QAction*)) );
+ connect(LSession::handle()->applicationMenu(), SIGNAL(AppMenuUpdated()), this, SLOT(UpdateMenu()));
+ QTimer::singleShot(0,this, SLOT(OrientationChange())); //Update icons/sizes
+ QTimer::singleShot(0,this, SLOT(UpdateMenu()) );
+}
+
+LAppMenuPlugin::~LAppMenuPlugin(){
+
+}
+
+void LAppMenuPlugin::updateButtonVisuals(){
+ button->setToolTip( tr("Quickly launch applications or open files"));
+ button->setText( tr("Applications") );
+ //Use the PC-BSD icon by default (or the Lumina icon for non-PC-BSD systems)
+ button->setIcon( LXDG::findIcon("pcbsd","Lumina-DE") );
+}
+
+// ========================
+// PRIVATE FUNCTIONS
+// ========================
+void LAppMenuPlugin::LaunchItem(QAction* item){
+ QString appFile = item->whatsThis();
+ if(appFile.startsWith("internal::")){
+ appFile = appFile.section("::",1,50); //cut off the "internal" flag
+ if(appFile=="logout"){ LSession::handle()->systemWindow(); }
+ }else if(!appFile.isEmpty()){
+ LSession::LaunchApplication("lumina-open "+appFile);
+ }
+}
+
+void LAppMenuPlugin::UpdateMenu(){
+ mainmenu->clear();
+ QHash<QString, QList<XDGDesktop> > *HASH = LSession::handle()->applicationMenu()->currentAppHash();
+ //Now Re-create the menu (orignally copied from the AppMenu class)
+ bool ok; //for checking inputs
+ //Add link to the file manager
+ QAction *tmpact = mainmenu->addAction( LXDG::findIcon("user-home", ""), tr("Browse Files") );
+ tmpact->setWhatsThis("\""+QDir::homePath()+"\"");
+ //--Look for the app store
+ XDGDesktop store = LXDG::loadDesktopFile(LOS::AppStoreShortcut(), ok);
+ if(ok){
+ tmpact = mainmenu->addAction( LXDG::findIcon(store.icon, ""), tr("Install Applications") );
+ tmpact->setWhatsThis("\""+store.filePath+"\"");
+ }
+ //--Look for the control panel
+ store = LXDG::loadDesktopFile(LOS::ControlPanelShortcut(), ok);
+ if(ok){
+ tmpact = mainmenu->addAction( LXDG::findIcon(store.icon, ""), tr("Control Panel") );
+ tmpact->setWhatsThis("\""+store.filePath+"\"");
+ }
+ mainmenu->addSeparator();
+ //--Now create the sub-menus
+ QStringList cats = HASH->keys();
+ cats.sort(); //make sure they are alphabetical
+ for(int i=0; i<cats.length(); i++){
+ //Make sure they are translated and have the right icons
+ QString name, icon;
+ if(cats[i]=="All"){continue; } //skip this listing for the menu
+ else if(cats[i] == "Multimedia"){ name = tr("Multimedia"); icon = "applications-multimedia"; }
+ else if(cats[i] == "Development"){ name = tr("Development"); icon = "applications-development"; }
+ else if(cats[i] == "Education"){ name = tr("Education"); icon = "applications-education"; }
+ else if(cats[i] == "Game"){ name = tr("Games"); icon = "applications-games"; }
+ else if(cats[i] == "Graphics"){ name = tr("Graphics"); icon = "applications-graphics"; }
+ else if(cats[i] == "Network"){ name = tr("Network"); icon = "applications-internet"; }
+ else if(cats[i] == "Office"){ name = tr("Office"); icon = "applications-office"; }
+ else if(cats[i] == "Science"){ name = tr("Science"); icon = "applications-science"; }
+ else if(cats[i] == "Settings"){ name = tr("Settings"); icon = "preferences-system"; }
+ else if(cats[i] == "System"){ name = tr("System"); icon = "applications-system"; }
+ else if(cats[i] == "Utility"){ name = tr("Utility"); icon = "applications-utilities"; }
+ else if(cats[i] == "Wine"){ name = tr("Wine"); icon = "wine"; }
+ else{ name = tr("Unsorted"); icon = "applications-other"; }
+
+ QMenu *menu = new QMenu(name, this);
+ menu->setIcon(LXDG::findIcon(icon,""));
+ QList<XDGDesktop> appL = HASH->value(cats[i]);
+ for( int a=0; a<appL.length(); a++){
+ if(appL[a].actions.isEmpty()){
+ //Just a single entry point - no extra actions
+ QAction *act = new QAction(LXDG::findIcon(appL[a].icon, ""), appL[a].name, menu);
+ act->setToolTip(appL[a].comment);
+ act->setWhatsThis("\""+appL[a].filePath+"\"");
+ menu->addAction(act);
+ }else{
+ //This app has additional actions - make this a sub menu
+ // - first the main menu/action
+ QMenu *submenu = new QMenu(appL[a].name, menu);
+ submenu->setIcon( LXDG::findIcon(appL[a].icon,"") );
+ //This is the normal behavior - not a special sub-action (although it needs to be at the top of the new menu)
+ QAction *act = new QAction(LXDG::findIcon(appL[a].icon, ""), appL[a].name, submenu);
+ act->setToolTip(appL[a].comment);
+ act->setWhatsThis(appL[a].filePath);
+ submenu->addAction(act);
+ //Now add entries for every sub-action listed
+ for(int sa=0; sa<appL[a].actions.length(); sa++){
+ QAction *sact = new QAction(LXDG::findIcon(appL[a].actions[sa].icon, appL[a].icon), appL[a].actions[sa].name, this);
+ sact->setToolTip(appL[a].comment);
+ sact->setWhatsThis("-action \""+appL[a].actions[sa].ID+"\" \""+appL[a].filePath+"\"");
+ submenu->addAction(sact);
+ }
+ menu->addMenu(submenu);
+ }
+ }//end loop over apps within this category
+ mainmenu->addMenu(menu);
+ } //end loop over categories
+ //Now add any logout options
+ mainmenu->addSeparator();
+ //QMenu *tmpmenu = mainmenu->addMenu(LXDG::findIcon("system-log-out",""), tr("Leave"));
+ tmpact =mainmenu->addAction(LXDG::findIcon("system-log-out"),tr("Leave"));
+ tmpact->setWhatsThis("internal::logout");
+
+}
+
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/appmenu/LAppMenuPlugin.h b/src-qt5/core/lumina-desktop/panel-plugins/appmenu/LAppMenuPlugin.h
new file mode 100644
index 00000000..36cd8605
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/appmenu/LAppMenuPlugin.h
@@ -0,0 +1,63 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This panel plugin is a re-creation of the classic "start" menu
+//===========================================
+#ifndef _LUMINA_DESKTOP_APP_MENU_PANEL_PLUGIN_H
+#define _LUMINA_DESKTOP_APP_MENU_PANEL_PLUGIN_H
+
+// Qt includes
+#include <QMenu>
+#include <QToolButton>
+#include <QString>
+#include <QWidget>
+
+
+// Lumina-desktop includes
+#include "../LPPlugin.h" //main plugin widget
+
+
+// PANEL PLUGIN BUTTON
+class LAppMenuPlugin : public LPPlugin{
+ Q_OBJECT
+
+public:
+ LAppMenuPlugin(QWidget *parent = 0, QString id = "appmenu", bool horizontal=true);
+ ~LAppMenuPlugin();
+
+private:
+ QToolButton *button;
+ QMenu *mainmenu;
+
+ void updateButtonVisuals();
+
+private slots:
+ void LaunchItem(QAction* item);
+ void UpdateMenu();
+
+public slots:
+ void OrientationChange(){
+ if(this->layout()->direction()==QBoxLayout::LeftToRight){
+ this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
+ button->setIconSize( QSize(this->height(), this->height()) );
+ }else{
+ this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
+ button->setIconSize( QSize(this->width(), this->width()) );
+ }
+ this->layout()->update();
+ updateButtonVisuals();
+ }
+
+ void LocaleChange(){
+ updateButtonVisuals();
+ }
+
+ void ThemeChange(){
+ updateButtonVisuals();
+ }
+};
+
+#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/battery/LBattery.cpp b/src-qt5/core/lumina-desktop/panel-plugins/battery/LBattery.cpp
new file mode 100644
index 00000000..dda32ecd
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/battery/LBattery.cpp
@@ -0,0 +1,106 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Susanne Jaeckel
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LBattery.h"
+
+LBattery::LBattery(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){
+ iconOld = -1;
+ //Setup the widget
+ label = new QLabel(this);
+ label->setScaledContents(true);
+ //label->setAlignment(Qt::AlignCenter);
+ this->layout()->addWidget(label);
+ //Setup the timer
+ timer = new QTimer();
+ timer->setInterval(5000); //update every 5 seconds
+ connect(timer,SIGNAL(timeout()), this, SLOT(updateBattery()) );
+ timer->start();
+ QTimer::singleShot(0,this,SLOT(OrientationChange()) ); //update the sizing/icon
+}
+
+LBattery::~LBattery(){
+ timer->stop();
+ delete timer;
+}
+
+void LBattery::updateBattery(bool force){
+ // Get current state of charge
+ //QStringList result = LUtils::getCmdOutput("/usr/sbin/apm", QStringList() << "-al");
+ int charge = LOS::batteryCharge(); //result.at(1).toInt();
+//qDebug() << "1: " << result.at(0).toInt() << " 2: " << result.at(1).toInt();
+ int icon = -1;
+ if (charge > 90) { icon = 4; }
+ else if (charge > 70) { icon = 3; }
+ else if (charge > 50) { icon = 2; }
+ else if (charge > 30) { icon = 1; }
+ else if (charge > 0 ) { icon = 0; }
+ if(LOS::batteryIsCharging()){ icon = icon+10; }
+ //icon = icon + result.at(0).toInt() * 10;
+ if (icon != iconOld || force) {
+ switch (icon) {
+ case 0:
+ label->setPixmap( LXDG::findIcon("battery-caution", "").pixmap(label->size()) );
+ break;
+ case 1:
+ label->setPixmap( LXDG::findIcon("battery-040", "").pixmap(label->size()) );
+ break;
+ case 2:
+ label->setPixmap( LXDG::findIcon("battery-060", "").pixmap(label->size()) );
+ break;
+ case 3:
+ label->setPixmap( LXDG::findIcon("battery-080", "").pixmap(label->size()) );
+ break;
+ case 4:
+ label->setPixmap( LXDG::findIcon("battery-100", "").pixmap(label->size()) );
+ break;
+ case 10:
+ label->setPixmap( LXDG::findIcon("battery-charging-caution", "").pixmap(label->size()) );
+ break;
+ case 11:
+ label->setPixmap( LXDG::findIcon("battery-charging-040", "").pixmap(label->size()) );
+ break;
+ case 12:
+ label->setPixmap( LXDG::findIcon("battery-charging-060", "").pixmap(label->size()) );
+ break;
+ case 13:
+ label->setPixmap( LXDG::findIcon("battery-charging-080", "").pixmap(label->size()) );
+ break;
+ case 14:
+ label->setPixmap( LXDG::findIcon("battery-charging", "").pixmap(label->size()) );
+ break;
+ default:
+ label->setPixmap( LXDG::findIcon("battery-missing", "").pixmap(label->size()) );
+ break;
+ }
+ iconOld = icon;
+ }
+ //Now update the display
+ QString tt;
+ //Make sure the tooltip can be properly translated as necessary (Ken Moore 5/9/14)
+ if(icon > 9 && icon < 15){ tt = QString(tr("%1 % (Charging)")).arg(QString::number(charge)); }
+ else{ tt = QString( tr("%1 % (%2 Remaining)") ).arg(QString::number(charge), getRemainingTime() ); }
+ label->setToolTip(tt);
+}
+
+QString LBattery::getRemainingTime(){
+ int secs = LOS::batterySecondsLeft();
+ if(secs < 0){ return "??"; }
+ QString rem; //remaining
+ if(secs > 3600){
+ int hours = secs/3600;
+ rem.append( QString::number(hours)+"h ");
+ secs = secs - (hours*3600);
+ }
+ if(secs > 60){
+ int min = secs/60;
+ rem.append( QString::number(min)+"m ");
+ secs = secs - (min*60);
+ }
+ if(secs > 0){
+ rem.append(QString::number(secs)+"s");
+ }
+ return rem;
+}
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/battery/LBattery.h b/src-qt5/core/lumina-desktop/panel-plugins/battery/LBattery.h
new file mode 100644
index 00000000..3d31faad
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/battery/LBattery.h
@@ -0,0 +1,53 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Susanne Jaeckel
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_BATTERY_H
+#define _LUMINA_DESKTOP_BATTERY_H
+
+#include <QTimer>
+#include <QWidget>
+#include <QString>
+#include <QLabel>
+
+#include <LuminaUtils.h>
+#include <LuminaXDG.h>
+#include <LuminaOS.h>
+
+#include "../../Globals.h"
+//#include "../LTBWidget.h"
+#include "../LPPlugin.h"
+
+class LBattery : public LPPlugin{
+ Q_OBJECT
+public:
+ LBattery(QWidget *parent = 0, QString id = "battery", bool horizontal=true);
+ ~LBattery();
+
+private:
+ QTimer *timer;
+ QLabel *label;
+ int iconOld;
+
+private slots:
+ void updateBattery(bool force = false);
+ QString getRemainingTime();
+
+public slots:
+ void LocaleChange(){
+ updateBattery(true);
+ }
+
+ void OrientationChange(){
+ if(this->layout()->direction()==QBoxLayout::LeftToRight){
+ label->setFixedSize( QSize(this->height(), this->height()) );
+ }else{
+ label->setFixedSize( QSize(this->width(), this->width()) );
+ }
+ updateBattery(true); //force icon refresh
+ }
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/battery/NOTES b/src-qt5/core/lumina-desktop/panel-plugins/battery/NOTES
new file mode 100644
index 00000000..3ea07778
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/battery/NOTES
@@ -0,0 +1,49 @@
+Eventuell mit einem Menü implementieren, mit Einträgen für:
+Anzeige des kompletten Status und Infos
+Herunterfahren des Systems etc.
+
+apm -a
+ Zeigt den AC line status an
+ 0 = off-line
+ 1 = on-line
+ 2 = backup-power
+
+apm -b
+ Zeigt
+ 0 = high
+ 1 = low
+ 2 = critical
+ 3 = charging
+
+apm -l
+ Zeit die prozentuale Kapazitaet
+ 255 = nicht unterstuetzt
+
+apm -t
+ Zeigt die verbleibende Zeit in Sekunden
+
+Aufruf Systemfunktionen: LuminaUtils.h
+
+mit der Methode:
+QStringList LUtils::getCmdOutput(QString cmd, QStringList args)
+
+Icons:
+/usr/local/share/icons/oxygen/22x22/status
+oder unter:
+/usr/local/share/icons/oxygen/16x16/status
+
+battery-040.png // 40 %
+battery-060.png
+battery-080.png
+battery-100.png
+
+battery-caution.png
+battery-charging.png
+battery-charging-040.png
+battery-charging-060.png
+battery-charging-080.png
+battery-charging-caution.png
+
+battery-charging-log.png
+battery-log.png
+battery-missing.png
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.cpp b/src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.cpp
new file mode 100644
index 00000000..0ecef3b2
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.cpp
@@ -0,0 +1,214 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LClock.h"
+#include "LSession.h"
+#include <LuminaThemes.h>
+#include <LuminaXDG.h>
+
+LClock::LClock(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){
+ button = new QToolButton(this);
+ button->setAutoRaise(true);
+ button->setToolButtonStyle(Qt::ToolButtonTextOnly);
+ button->setStyleSheet("font-weight: bold;");
+ button->setPopupMode(QToolButton::DelayedPopup); //make sure it runs the update routine first
+ button->setMenu(new QMenu());
+ //button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
+ //this->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
+ connect(button, SIGNAL(clicked()), this, SLOT(openMenu()));
+ connect(button->menu(), SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed()));
+ calendar = new QCalendarWidget(this);
+ calAct = new QWidgetAction(this);
+ calAct->setDefaultWidget(calendar);
+ TZMenu = new QMenu(this);
+ connect(TZMenu, SIGNAL(triggered(QAction*)), this, SLOT(ChangeTZ(QAction*)) );
+
+ //Now assemble the menu
+ button->menu()->addAction(calAct);
+ button->menu()->addMenu(TZMenu);
+
+ this->layout()->setContentsMargins(0,0,0,0); //reserve some space on left/right
+ this->layout()->addWidget(button);
+
+ //Setup the timer
+ timer = new QTimer();
+ //Load all the initial settings
+ updateFormats();
+ LocaleChange();
+ ThemeChange();
+ OrientationChange();
+ //Now connect/start the timer
+ connect(timer,SIGNAL(timeout()), this, SLOT(updateTime()) );
+ connect(QApplication::instance(), SIGNAL(SessionConfigChanged()), this, SLOT(updateFormats()) );
+ timer->start();
+}
+
+LClock::~LClock(){
+ timer->stop();
+ delete timer;
+}
+
+
+void LClock::updateTime(bool adjustformat){
+ QDateTime CT = QDateTime::currentDateTime();
+ //Now update the display
+ QString label;
+ QString timelabel;
+ QString datelabel;
+ if(deftime){ timelabel = CT.time().toString(Qt::DefaultLocaleShortDate) ; }
+ else{ timelabel=CT.toString(timefmt); }
+ if(defdate){ datelabel = CT.date().toString(Qt::DefaultLocaleShortDate); }
+ else{ datelabel = CT.toString(datefmt); }
+ if(datetimeorder == "dateonly"){
+ label = datelabel;
+ button->setToolTip(timelabel);
+ }else if(datetimeorder == "timedate"){
+ label = timelabel + "\n" + datelabel;
+ button->setToolTip("");
+ }else if(datetimeorder == "datetime"){
+ label = datelabel + "\n" + timelabel;
+ button->setToolTip("");
+ }else{
+ label = timelabel;
+ button->setToolTip(datelabel);
+ }
+ if( this->layout()->direction() == QBoxLayout::TopToBottom ){
+ //different routine for vertical text (need newlines instead of spaces)
+ label.replace(" ","\n");
+ }
+ if(adjustformat){
+ //Check the font/spacing for the display and adjust as necessary
+ /*double efflines = label.count("\n")+1; //effective lines (with wordwrap)
+ if( (button->fontMetrics().height()*efflines) > button->height() ){
+ //Force a pixel metric font size to fit everything
+ int szH = qRound( (button->height() - button->fontMetrics().lineSpacing() )/efflines );
+ //Need to supply a *width* pixel, not a height metric
+ int szW = qRound( (szH*button->fontMetrics().maxWidth())/( (double) button->fontMetrics().height()) );
+ qDebug() << "Change Clock font:" << button->height() << szH << szW << efflines << button->fontMetrics().height() << button->fontMetrics().lineSpacing();
+ button->setStyleSheet("font-weight: bold; font-size: "+QString::number(szW)+"px;");
+ }else{
+ button->setStyleSheet("font-weight: bold;");
+ }*/
+ }
+ button->setText(label);
+
+}
+
+void LClock::updateFormats(){
+ qDebug() << "Updating clock format";
+ timefmt = LSession::handle()->sessionSettings()->value("TimeFormat","").toString();
+ datefmt = LSession::handle()->sessionSettings()->value("DateFormat","").toString();
+ deftime = timefmt.simplified().isEmpty();
+ defdate = datefmt.simplified().isEmpty();
+ //Adjust the timer interval based on the smallest unit displayed
+ if(deftime){ timer->setInterval(500); } //1/2 second
+ else if(timefmt.contains("z")){ timer->setInterval(1); } //every millisecond (smallest unit)
+ else if(timefmt.contains("s")){ timer->setInterval(500); } //1/2 second
+ else if(timefmt.contains("m")){ timer->setInterval(2000); } //2 seconds
+ else{ timer->setInterval(1000); } //unknown format - use 1 second interval
+ datetimeorder = LSession::handle()->sessionSettings()->value("DateTimeOrder", "timeonly").toString().toLower();
+ //this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+ updateTime(true);
+ //Now fix the size of the widget with the new size hint
+ this->setFixedWidth( this->sizeHint().width() +6);
+}
+
+void LClock::updateMenu(){
+ QDateTime cdt = QDateTime::currentDateTime();
+ TZMenu->setTitle(QString(tr("Time Zone (%1)")).arg(cdt.timeZoneAbbreviation()) );
+ calendar->showToday(); //make sure the current month is visible
+ calendar->setSelectedDate(QDate::currentDate()); //select the actual date for today
+}
+
+void LClock::openMenu(){
+ updateMenu();
+ button->showMenu();
+}
+
+void LClock::closeMenu(){
+ button->menu()->hide();
+}
+
+void LClock::ChangeTZ(QAction *act){
+ LTHEME::setCustomEnvSetting("TZ",act->whatsThis());
+ QTimer::singleShot(500, this, SLOT(updateTime()) );
+}
+
+void LClock::LocaleChange(){
+ //Refresh all the time zone information
+ TZMenu->clear();
+ TZMenu->addAction(tr("Use System Time"));
+ TZMenu->addSeparator();
+ QList<QByteArray> TZList = QTimeZone::availableTimeZoneIds();
+ //Orgnize time zones for smaller menus (Continent/Country/City)
+ // Note: id = Continent/City
+ QStringList info;
+ for(int i=0; i<TZList.length(); i++){
+ QTimeZone tz(TZList[i]);
+ if(!QString(tz.id()).contains("/")){ continue; }
+ info << "::::"+QString(tz.id()).section("/",0,0)+"::::"+QLocale::countryToString(tz.country())+"::::"+QString(tz.id()).section("/",1,100).replace("_"," ")+"::::"+QString(tz.id());
+ }
+ //Now sort alphabetically
+ info.sort();
+ //Now create the menu tree
+ QString continent, country; //current continent/country
+ QMenu *tmpC=0; //continent menu
+ QMenu *tmpCM=0; //country menu
+ for(int i=0; i<info.length(); i++){
+ //Check if different continent
+ if(info[i].section("::::",1,1)!=continent){
+ if(tmpC!=0){
+ if(tmpCM!=0 && !tmpCM->isEmpty()){
+ tmpC->addMenu(tmpCM);
+ }
+ if(!tmpC->isEmpty()){ TZMenu->addMenu(tmpC); }
+ }
+ tmpC = new QMenu(this);
+ tmpC->setTitle(info[i].section("::::",1,1));
+ tmpCM = new QMenu(this);
+ tmpCM->setTitle(info[i].section("::::",2,2));
+ //Check if different country
+ }else if(info[i].section("::::",2,2)!=country){
+ if(tmpC!=0 && tmpCM!=0 && !tmpCM->isEmpty()){
+ tmpC->addMenu(tmpCM);
+ }
+ tmpCM = new QMenu(this);
+ tmpCM->setTitle(info[i].section("::::",2,2));
+ }
+ //Now create the entry within the country menu
+ if(tmpCM!=0){
+ QAction *act = new QAction(info[i].section("::::",3,3), this);
+ act->setWhatsThis(info[i].section("::::",4,4) );
+ tmpCM->addAction(act);
+ }
+ //Save the values for the next run
+ continent = info[i].section("::::",1,1);
+ country = info[i].section("::::",2,2);
+
+ if(i== info.length()-1){
+ //last go through - save all menus
+ if(tmpCM!=0 && tmpC!=0 && !tmpCM->isEmpty()){ tmpC->addMenu(tmpCM); }
+ if(tmpC!=0 && !tmpC->isEmpty()){ TZMenu->addMenu(tmpC); }
+ }
+ }
+
+}
+
+void LClock::ThemeChange(){
+ TZMenu->setIcon(LXDG::findIcon("clock",""));
+}
+
+void LClock::OrientationChange(){
+ if(this->layout()->direction()==QBoxLayout::LeftToRight){
+ this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
+ button->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
+ }else{
+ this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ }
+ updateTime(true); //re-adjust the font/spacings
+ this->layout()->update();
+}
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.h b/src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.h
new file mode 100644
index 00000000..8131375d
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.h
@@ -0,0 +1,56 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_CLOCK_H
+#define _LUMINA_DESKTOP_CLOCK_H
+
+#include <QTimer>
+#include <QDateTime>
+#include <QLabel>
+#include <QWidget>
+#include <QString>
+#include <QLocale>
+#include <QTimeZone>
+#include <QCalendarWidget>
+#include <QWidgetAction>
+#include <QAction>
+#include <QToolButton>
+#include <QMenu>
+
+#include "../LPPlugin.h"
+
+class LClock : public LPPlugin{
+ Q_OBJECT
+public:
+ LClock(QWidget *parent = 0, QString id = "clock", bool horizontal=true);
+ ~LClock();
+
+private:
+ QTimer *timer;
+ QToolButton *button;
+ QString timefmt, datefmt, datetimeorder;
+ bool deftime, defdate;
+ QMenu *TZMenu;
+ QCalendarWidget *calendar;
+ QWidgetAction *calAct;
+
+private slots:
+ void updateTime(bool adjustformat = false);
+ void updateFormats();
+
+ void updateMenu();
+ void openMenu();
+ void closeMenu();
+
+ void ChangeTZ(QAction*);
+
+public slots:
+ void LocaleChange();
+ void ThemeChange();
+ void OrientationChange();
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/desktopbar/LDeskBar.cpp b/src-qt5/core/lumina-desktop/panel-plugins/desktopbar/LDeskBar.cpp
new file mode 100644
index 00000000..0aa896ce
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/desktopbar/LDeskBar.cpp
@@ -0,0 +1,247 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LDeskBar.h"
+#include "../../LSession.h"
+
+LDeskBarPlugin::LDeskBarPlugin(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){
+ this->layout()->setContentsMargins(0,0,0,0);
+ this->setStyleSheet( "QToolButton::menu-indicator{ image: none; } QToolButton{ padding: 0px; }");
+ //Find the path to the desktop folder
+ if(QFile::exists(QDir::homePath()+"/Desktop")){ desktopPath = QDir::homePath()+"/Desktop"; }
+ else if(QFile::exists(QDir::homePath()+"/desktop")){ desktopPath = QDir::homePath()+"/desktop"; }
+ else{ desktopPath=""; }
+ //Make sure the favorites directory exists
+ if(!QFile::exists(QDir::homePath()+"/.lumina/favorites") ){
+ QDir dir;
+ dir.mkpath(QDir::homePath()+"/.lumina/favorites");
+ }
+ //Setup the filter lists for the different types of files
+ /*audioFilter <<"*.ogg"<<"*.mp3"<<"*.wav"<<"*.aif"<<"*.iff"<<"*.m3u"<<"*.m4a"<<"*.mid"<<"*.mpa"<<"*.ra"<<"*.wma";
+ videoFilter <<"*.3g2"<<"*.3gp"<<"*.asf"<<"*.asx"<<"*.avi"<<"*.flv"<<"*.m4v"<<"*.mov"<<"*.mp4"<<"*.mpg"<<"*.rm"<<"*.srt"<<"*.swf"<<"*.vob"<<"*.wmv";
+ pictureFilter <<"*.bmp"<<"*.dds"<<"*.gif"<<"*.jpg"<<"*.png"<<"*.psd"<<"*.thm"<<"*.tif"<<"*.tiff"<<"*.ai"<<"*.eps"<<"*.ps"<<"*.svg"<<"*.ico";
+ docsFilter << "*.txt"<<"*.rtf"<<"*.doc"<<"*.docx"<<"*.odf"<<"*.pdf";*/
+ //initialize the desktop bar items
+ initializeDesktop();
+ //setup the directory watcher
+ watcher = new QFileSystemWatcher(this);
+ if(!desktopPath.isEmpty()){
+ watcher->addPath(desktopPath);
+ watcher->addPath(QDir::homePath()+"/.lumina/favorites");
+ }
+ connect(watcher, SIGNAL(directoryChanged(QString)), this, SLOT(desktopChanged()) );
+ QTimer::singleShot(1,this, SLOT(desktopChanged()) ); //make sure to load it the first time
+ QTimer::singleShot(0,this, SLOT(OrientationChange()) ); //adjust sizes/layout
+ connect(QApplication::instance(), SIGNAL(DesktopFilesChanged()), this, SLOT(desktopChanged()) );
+}
+
+LDeskBarPlugin::~LDeskBarPlugin(){
+ if(!desktopPath.isEmpty()){
+ watcher->removePath(desktopPath);
+ disconnect(watcher);
+ }
+ delete watcher;
+
+}
+
+// =======================
+// PRIVATE FUNCTIONS
+// =======================
+void LDeskBarPlugin::initializeDesktop(){
+ //Applications on the desktop
+ appB = new QToolButton(this);
+ appB->setToolButtonStyle(Qt::ToolButtonIconOnly);
+ appB->setAutoRaise(true);
+ appB->setPopupMode(QToolButton::InstantPopup);
+ appM = new QMenu(this);
+ appB->setMenu(appM);
+ this->layout()->addWidget(appB);
+ connect(appM,SIGNAL(triggered(QAction*)),this,SLOT(ActionTriggered(QAction*)) );
+ connect(appM, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed()));
+ //Directories on the desktop
+ dirB = new QToolButton(this);
+ dirB->setToolButtonStyle(Qt::ToolButtonIconOnly);
+ dirB->setAutoRaise(true);
+ dirB->setPopupMode(QToolButton::InstantPopup);
+ dirM = new QMenu(this);
+ dirB->setMenu(dirM);
+ this->layout()->addWidget(dirB);
+ connect(dirM,SIGNAL(triggered(QAction*)),this,SLOT(ActionTriggered(QAction*)) );
+ connect(dirM, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed()));
+ //Audio Files on the desktop
+ audioM = new QMenu(this);
+ connect(audioM,SIGNAL(triggered(QAction*)),this,SLOT(ActionTriggered(QAction*)) );
+ //Video Files on the desktop
+ videoM = new QMenu(this);
+ connect(videoM,SIGNAL(triggered(QAction*)),this,SLOT(ActionTriggered(QAction*)) );
+ //Picture Files on the desktop
+ pictureM = new QMenu(this);
+ connect(pictureM,SIGNAL(triggered(QAction*)),this,SLOT(ActionTriggered(QAction*)) );
+ //Other Files on the desktop
+ otherM = new QMenu(this);
+ connect(otherM,SIGNAL(triggered(QAction*)),this,SLOT(ActionTriggered(QAction*)) );
+ docM = new QMenu(this);
+ connect(docM,SIGNAL(triggered(QAction*)), this,SLOT(ActionTriggered(QAction*)) );
+ //All Files Button
+ fileB = new QToolButton(this);
+ fileB->setToolButtonStyle(Qt::ToolButtonIconOnly);
+ fileB->setAutoRaise(true);
+ fileB->setPopupMode(QToolButton::InstantPopup);
+ fileM = new QMenu(this);
+ fileB->setMenu(fileM);
+ this->layout()->addWidget(fileB);
+
+ updateIcons(); //set all the text/icons
+}
+
+QAction* LDeskBarPlugin::newAction(QString filepath, QString name, QString iconpath){
+ return newAction(filepath, name, QIcon(iconpath));
+}
+
+QAction* LDeskBarPlugin::newAction(QString filepath, QString name, QIcon icon){
+ QAction *act = new QAction(icon, name, this);
+ act->setWhatsThis(filepath);
+ return act;
+}
+
+/*void LDeskBarPlugin::updateMenu(QMenu* menu, QFileInfoList files, bool trim){
+ menu->clear();
+ //re-create the menu (since it is hidden from view)
+ QStringList filevals;
+ for(int i=0; i<files.length(); i++){
+ qDebug() << "New Menu Item:" << files[i].fileName();
+ if(trim){ totals.removeAll(files[i]); }
+ filevals << files[i].fileName()+"::::"+files[i].canonicalFilePath();
+ //menu->addAction( newAction( files[i].canonicalFilePath(), files[i].fileName(), "") );
+ }
+ //Now sort the list by file name
+ filevals.sort();
+ for(int i=0; i<filevals.length(); i++){
+ menu->addAction( newAction( filevals[i].section("::::",1,1), filevals[i].section("::::",0,0), "") );
+ }
+}*/
+
+// =======================
+// PRIVATE SLOTS
+// =======================
+void LDeskBarPlugin::ActionTriggered(QAction* act){
+ //Open up the file with the appropriate application
+ QString cmd = "lumina-open \""+act->whatsThis()+"\"";
+ qDebug() << "Open File:" << cmd;
+ LSession::LaunchApplication(cmd);
+}
+
+void LDeskBarPlugin::desktopChanged(){
+ QStringList newfavs = LUtils::listFavorites();
+ if(lastHomeUpdate.isNull() || (QFileInfo(QDir::homePath()+"/Desktop").lastModified() > lastHomeUpdate) || newfavs!=favs ){
+ favs = newfavs;
+ homefiles = LSession::handle()->DesktopFiles();
+ lastHomeUpdate = QDateTime::currentDateTime();
+ QStringList favitems = favs;
+ //Remember for format for favorites: <name>::::[app/dir/<mimetype>]::::<full path>
+ for(int i=0; i<homefiles.length(); i++){
+ QString type;
+ if(homefiles[i].isDir()){ type="dir"; }
+ else if(homefiles[i].fileName().endsWith(".desktop")){ type="app"; }
+ else{ type=LXDG::findAppMimeForFile(homefiles[i].fileName()); }
+ favitems << homefiles[i].fileName()+"::::"+type+"::::"+homefiles[i].absoluteFilePath();
+ //qDebug() << "Desktop Item:" << favitems.last();
+ }
+
+ favitems.sort(); //sort them alphabetically
+ //Now add the items to the lists
+ appM->clear();
+ dirM->clear();
+ audioM->clear();
+ videoM->clear();
+ pictureM->clear();
+ docM->clear();
+ otherM->clear();
+ for(int i=0; i<favitems.length(); i++){
+ QString type = favitems[i].section("::::",1,1);
+ QString name = favitems[i].section("::::",0,0);
+ QString path = favitems[i].section("::::",2,50);
+ if(type=="app"){
+ //Add it to appM
+ bool ok = false;
+ XDGDesktop df = LXDG::loadDesktopFile(path, ok);
+ if(ok){
+ if( LXDG::checkValidity(df) && !df.isHidden ){
+ appM->addAction( newAction(df.filePath, df.name, LXDG::findIcon(df.icon, ":/images/default-application.png")) );
+ }
+ }
+ }else if(type=="dir"){
+ //Add it to dirM
+ dirM->addAction( newAction(path, name, LXDG::findIcon("folder","")) );
+ }else if(type.startsWith("audio/")){
+ //Add it to audioM
+ audioM->addAction( newAction(path, name, LXDG::findMimeIcon(type)) );
+ }else if(type.startsWith("video/")){
+ //Add it to videoM
+ videoM->addAction( newAction(path, name, LXDG::findMimeIcon(type)) );
+ }else if(type.startsWith("image/")){
+ //Add it to pictureM
+ if(LUtils::imageExtensions().contains(path.section("/",-1).section(".",-1).toLower()) ){
+ pictureM->addAction( newAction(path, name, QIcon(path)) );
+ }else{
+ pictureM->addAction( newAction(path, name, LXDG::findMimeIcon(type)) );
+ }
+ }else if(type.startsWith("text/")){
+ //Add it to docM
+ docM->addAction( newAction(path, name, LXDG::findMimeIcon(type)) );
+ }else{
+ //Add it to otherM
+ otherM->addAction( newAction(path, name, LXDG::findMimeIcon(type)) );
+ }
+
+ }
+
+ //Now update the file menu as appropriate
+ fileM->clear();
+ if(!audioM->isEmpty()){ fileM->addMenu(audioM); }
+ if(!docM->isEmpty()){ fileM->addMenu(docM); }
+ if(!pictureM->isEmpty()){ fileM->addMenu(pictureM); }
+ if(!videoM->isEmpty()){ fileM->addMenu(videoM); }
+ if(!otherM->isEmpty()){ fileM->addMenu(otherM); }
+ //Check for a single submenu, and skip the main if need be
+ disconnect(fileB->menu(), SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed()) );
+ if(fileM->actions().length()==1){
+ if(!audioM->isEmpty()){ fileB->setMenu(audioM); }
+ else if(!pictureM->isEmpty()){ fileB->setMenu(pictureM); }
+ else if(!videoM->isEmpty()){ fileB->setMenu(videoM); }
+ else if(!docM->isEmpty()){ fileB->setMenu(docM); }
+ else if(!otherM->isEmpty()){ fileB->setMenu(otherM); }
+ }else{
+ fileB->setMenu(fileM);
+ }
+ connect(fileB->menu(), SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed()));
+ } //end of check for if updates are needed
+
+ //Setup the visibility of the buttons
+ appB->setVisible( !appM->isEmpty() );
+ dirB->setVisible( !dirM->isEmpty() );
+ fileB->setVisible( !fileM->isEmpty() );
+}
+
+void LDeskBarPlugin::updateIcons(){
+ //Set all the text/icons
+ appB->setIcon( LXDG::findIcon("favorites", "") );
+ appB->setToolTip(tr("Favorite Applications"));
+ dirB->setIcon( LXDG::findIcon("folder", "") );
+ dirB->setToolTip(tr("Favorite Folders"));
+ audioM->setTitle( tr("Audio") );
+ audioM->setIcon( LXDG::findIcon("audio-x-generic","") );
+ videoM->setTitle( tr("Video") );
+ videoM->setIcon( LXDG::findIcon("video-x-generic","") );
+ pictureM->setTitle( tr("Pictures") );
+ pictureM->setIcon( LXDG::findIcon("image-x-generic","") );
+ otherM->setTitle( tr("Other Files") );
+ otherM->setIcon( LXDG::findIcon("unknown","") );
+ docM->setTitle( tr("Documents") );
+ docM->setIcon( LXDG::findIcon("x-office-document","") );
+ fileB->setIcon( LXDG::findIcon("document-multiple", "") );
+ fileB->setToolTip(tr("Favorite Files") );
+} \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/desktopbar/LDeskBar.h b/src-qt5/core/lumina-desktop/panel-plugins/desktopbar/LDeskBar.h
new file mode 100644
index 00000000..57d40e4c
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/desktopbar/LDeskBar.h
@@ -0,0 +1,93 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This plugin displays the contents of the user's home directory
+// as organized within a couple buttons on the panel (apps, dirs, files)
+//===========================================
+#ifndef _LUMINA_DESKTOP_DESKBAR_H
+#define _LUMINA_DESKTOP_DESKBAR_H
+
+// Qt includes
+#include <QWidget>
+#include <QString>
+#include <QAction>
+#include <QMenu>
+#include <QProcess>
+#include <QTimer>
+#include <QFileSystemWatcher>
+#include <QHBoxLayout>
+#include <QIcon>
+#include <QToolButton>
+#include <QDebug>
+
+// libLumina includes
+#include <LuminaXDG.h>
+
+// local includes
+//#include "../LTBWidget.h"
+#include "../LPPlugin.h"
+
+class LDeskBarPlugin : public LPPlugin{
+ Q_OBJECT
+public:
+ LDeskBarPlugin(QWidget* parent=0, QString id = "desktopbar", bool horizontal=true);
+ ~LDeskBarPlugin();
+
+private:
+ //QHBoxLayout *layout;
+ QString desktopPath;
+ QFileSystemWatcher *watcher;
+ //Special toolbuttons and menus
+ QToolButton *appB, *fileB, *dirB;
+ QMenu *appM, *dirM, *audioM, *videoM, *pictureM, *fileM, *otherM, *docM;
+ //QStringList audioFilter, videoFilter, pictureFilter, docsFilter;
+ QFileInfoList homefiles;
+ QStringList favs;
+ QList<QToolButton*> APPLIST;
+ QDateTime lastHomeUpdate;
+
+ void initializeDesktop();
+ //bool readDesktopFile(QString path, QString &name, QString &iconpath);
+
+ QAction* newAction(QString filepath, QString name, QString iconpath);
+ QAction* newAction(QString filepath, QString name, QIcon icon);
+
+ //void updateMenu(QMenu* menu, QFileInfoList files, bool trim = true);
+
+
+private slots:
+ void ActionTriggered(QAction* act);
+ void desktopChanged();
+ void updateIcons();
+
+public slots:
+ void LocaleChange(){
+ updateIcons();
+ desktopChanged();
+ }
+
+ void OrientationChange(){
+ QSize sz;
+ if(this->layout()->direction()==QBoxLayout::LeftToRight){
+ this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
+ sz = QSize(this->height(), this->height());
+ }else{
+ this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
+ sz = QSize(this->width(), this->width());
+ }
+ appB->setIconSize(sz);
+ fileB->setIconSize(sz);
+ dirB->setIconSize(sz);
+ for(int i=0; i<APPLIST.length(); i++){
+ APPLIST[i]->setIconSize(sz);
+ }
+ this->layout()->update();
+ }
+};
+
+
+#endif
+
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/desktopswitcher/LDesktopSwitcher.cpp b/src-qt5/core/lumina-desktop/panel-plugins/desktopswitcher/LDesktopSwitcher.cpp
new file mode 100644
index 00000000..c51e4b4a
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/desktopswitcher/LDesktopSwitcher.cpp
@@ -0,0 +1,142 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Susanne Jaeckel
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LDesktopSwitcher.h"
+#include <LSession.h>
+
+LDesktopSwitcher::LDesktopSwitcher(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal) {
+ iconOld = -1;
+ this->setStyleSheet( "QToolButton::menu-indicator{ image: none; } QToolButton{padding: 0px;}");
+ //Setup the widget
+ label = new QToolButton(this);
+ label->setPopupMode(QToolButton::DelayedPopup);
+ label->setAutoRaise(true);
+ label->setToolButtonStyle(Qt::ToolButtonIconOnly);
+ label->setIcon( LXDG::findIcon("preferences-desktop-display-color", "") );
+ label->setToolTip(QString("Workspace 1"));
+ connect(label, SIGNAL(clicked()), this, SLOT(openMenu()));
+ menu = new QMenu(this);
+ connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(menuActionTriggered(QAction*)));
+ connect(menu, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed()));
+ label->setMenu(menu);
+ this->layout()->addWidget(label);
+
+ // Maybe a timer should be set to set the toolTip of the button,
+ // becasue the workspace could be switched via Keyboard-shortcuts ...
+
+ QTimer::singleShot(500, this, SLOT(createMenu()) ); //needs a delay to make sure it works right the first time
+ QTimer::singleShot(0,this, SLOT(OrientationChange()) ); //adjust icon size
+}
+
+LDesktopSwitcher::~LDesktopSwitcher(){
+}
+/* MOVED THESE FUNCTIONS TO LIBLUMINA (LuminaX11.h) -- Ken Moore 5/9/14
+void LDesktopSwitcher::setNumberOfDesktops(int number) {
+ Display *display = QX11Info::display();
+ Window rootWindow = QX11Info::appRootWindow();
+
+ Atom atom = XInternAtom(display, "_NET_NUMBER_OF_DESKTOPS", False);
+ XEvent xevent;
+ xevent.type = ClientMessage;
+ xevent.xclient.type = ClientMessage;
+ xevent.xclient.display = display;
+ xevent.xclient.window = rootWindow;
+ xevent.xclient.message_type = atom;
+ xevent.xclient.format = 32;
+ xevent.xclient.data.l[0] = number;
+ xevent.xclient.data.l[1] = CurrentTime;
+ xevent.xclient.data.l[2] = 0;
+ xevent.xclient.data.l[3] = 0;
+ xevent.xclient.data.l[4] = 0;
+ XSendEvent(display, rootWindow, False, SubstructureNotifyMask | SubstructureRedirectMask, &xevent);
+
+ XFlush(display);
+}
+
+void LDesktopSwitcher::setCurrentDesktop(int number) {
+ Display *display = QX11Info::display();
+ Window rootWindow = QX11Info::appRootWindow();
+
+ Atom atom = XInternAtom(display, "_NET_CURRENT_DESKTOP", False);
+ XEvent xevent;
+ xevent.type = ClientMessage;
+ xevent.xclient.type = ClientMessage;
+ xevent.xclient.display = display;
+ xevent.xclient.window = rootWindow;
+ xevent.xclient.message_type = atom;
+ xevent.xclient.format = 32;
+ xevent.xclient.data.l[0] = number;
+ xevent.xclient.data.l[1] = CurrentTime;
+ xevent.xclient.data.l[2] = 0;
+ xevent.xclient.data.l[3] = 0;
+ xevent.xclient.data.l[4] = 0;
+ XSendEvent(display, rootWindow, False, SubstructureNotifyMask | SubstructureRedirectMask, &xevent);
+
+ XFlush(display);
+}
+
+int LDesktopSwitcher::getNumberOfDesktops() {
+ int number = -1;
+ Atom a = XInternAtom(QX11Info::display(), "_NET_NUMBER_OF_DESKTOPS", true);
+ Atom realType;
+ int format;
+ unsigned long num, bytes;
+ unsigned char *data = 0;
+ int status = XGetWindowProperty(QX11Info::display(), QX11Info::appRootWindow(), a, 0L, (~0L),
+ false, AnyPropertyType, &realType, &format, &num, &bytes, &data);
+ if( (status >= Success) && (num > 0) ){
+ number = *data;
+ XFree(data);
+ }
+ return number;
+}
+
+int LDesktopSwitcher::getCurrentDesktop() {
+ int number = -1;
+ Atom a = XInternAtom(QX11Info::display(), "_NET_CURRENT_DESKTOP", true);
+ Atom realType;
+ int format;
+ unsigned long num, bytes;
+ unsigned char *data = 0;
+ int status = XGetWindowProperty(QX11Info::display(), QX11Info::appRootWindow(), a, 0L, (~0L),
+ false, AnyPropertyType, &realType, &format, &num, &bytes, &data);
+ if( (status >= Success) && (num > 0) ){
+ number = *data;
+ XFree(data);
+ }
+ return number;
+} */
+
+void LDesktopSwitcher::openMenu(){
+ //Make sure the menu is refreshed right before it opens
+ createMenu();
+ label->showMenu();
+}
+
+QAction* LDesktopSwitcher::newAction(int what, QString name) {
+ QAction *act = new QAction(LXDG::findIcon("preferences-desktop-display", ""), name, this);
+ act->setWhatsThis(QString::number(what));
+ return act;
+}
+
+void LDesktopSwitcher::createMenu() {
+ int cur = LSession::handle()->XCB->CurrentWorkspace(); //current desktop number
+ int tot = LSession::handle()->XCB->NumberOfWorkspaces(); //total number of desktops
+ //qDebug() << "-- vor getCurrentDesktop SWITCH";
+ qDebug() << "Virtual Desktops:" << tot << cur;
+ menu->clear();
+ for (int i = 0; i < tot; i++) {
+ QString name = QString(tr("Workspace %1")).arg( QString::number(i+1) );
+ if(i == cur){ name.prepend("*"); name.append("*");} //identify which desktop this is currently
+ menu->addAction(newAction(i, name));
+ }
+}
+
+void LDesktopSwitcher::menuActionTriggered(QAction* act) {
+ LSession::handle()->XCB->SetCurrentWorkspace(act->whatsThis().toInt());
+ label->setToolTip(QString(tr("Workspace %1")).arg(act->whatsThis().toInt() +1));
+ QTimer::singleShot(500, this, SLOT(createMenu()) ); //make sure the menu gets updated
+}
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/desktopswitcher/LDesktopSwitcher.h b/src-qt5/core/lumina-desktop/panel-plugins/desktopswitcher/LDesktopSwitcher.h
new file mode 100644
index 00000000..851d9e35
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/desktopswitcher/LDesktopSwitcher.h
@@ -0,0 +1,72 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Susanne Jaeckel
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_SWITCHER_H
+#define _LUMINA_DESKTOP_SWITCHER_H
+
+#include <QTimer>
+#include <QWidget>
+#include <QString>
+//#include <QX11Info>
+#include <QMenu>
+#include <QToolButton>
+
+#include <LuminaUtils.h>
+#include <LuminaXDG.h>
+#include <LuminaX11.h>
+
+//#include "../LTBWidget.h"
+#include "../LPPlugin.h"
+
+//#include <X11/Xlib.h>
+//#include <X11/Xutil.h>
+//#include <X11/Xatom.h>
+
+class LDesktopSwitcher : public LPPlugin{
+ Q_OBJECT
+public:
+ LDesktopSwitcher(QWidget *parent = 0, QString id = "desktopswitcher", bool horizontal=true);
+ ~LDesktopSwitcher();
+
+private:
+ QTimer *timer;
+ QToolButton *label;
+ QMenu *menu;
+ int iconOld;
+
+ //void setNumberOfDesktops(int);
+ //void setCurrentDesktop(int);
+ //int getNumberOfDesktops();
+ //int getCurrentDesktop();
+
+
+ QAction* newAction(int, QString);
+
+private slots:
+ void openMenu();
+ void createMenu();
+ void menuActionTriggered(QAction*);
+
+public slots:
+ void LocaleChange(){
+ createMenu();
+ }
+
+ void OrientationChange(){
+ QSize sz;
+ if(this->layout()->direction()==QBoxLayout::LeftToRight){
+ this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
+ sz = QSize(this->height(), this->height());
+ }else{
+ this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
+ sz = QSize(this->width(), this->width());
+ }
+ label->setIconSize(sz);
+ this->layout()->update();
+ }
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/line/LLine.h b/src-qt5/core/lumina-desktop/panel-plugins/line/LLine.h
new file mode 100644
index 00000000..94de486e
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/line/LLine.h
@@ -0,0 +1,40 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This class is a generic line separator for the panel
+//===========================================
+#ifndef _LUMINA_DESKTOP_PANEL_PLUGIN_LINE_H
+#define _LUMINA_DESKTOP_PANEL_PLUGIN_LINE_H
+
+#include "../LPPlugin.h"
+#include <QFrame>
+
+class LLinePlugin : public LPPlugin{
+ Q_OBJECT
+private:
+ QFrame *line;
+
+public:
+ LLinePlugin(QWidget *parent=0, QString id="spacer", bool horizontal=true) : LPPlugin(parent, id, horizontal){
+ line = new QFrame(this);
+ line->setObjectName("LuminaPanelLine");
+ this->layout()->addWidget(line);
+ OrientationChange();
+ }
+ ~LLinePlugin(){}
+
+public slots:
+ void OrientationChange(){
+ if(this->layout()->direction()==QBoxLayout::LeftToRight){ //horizontal
+ line->setFrameShape(QFrame::VLine);
+ }else{ //vertical
+ line->setFrameShape(QFrame::HLine);
+ }
+ }
+};
+
+
+#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/panel-plugins.pri b/src-qt5/core/lumina-desktop/panel-plugins/panel-plugins.pri
new file mode 100644
index 00000000..afa7dbe2
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/panel-plugins.pri
@@ -0,0 +1,49 @@
+#Lumina Desktop Panel Plugin files
+
+SOURCES += $$PWD/userbutton/LUserButton.cpp \
+ $$PWD/userbutton/UserWidget.cpp \
+ $$PWD/userbutton/UserItemWidget.cpp \
+ $$PWD/desktopbar/LDeskBar.cpp \
+ $$PWD/taskmanager/LTaskManagerPlugin.cpp \
+ $$PWD/taskmanager/LTaskButton.cpp \
+ $$PWD/systemtray/LSysTray.cpp \
+ $$PWD/systemtray/TrayIcon.cpp \
+ $$PWD/clock/LClock.cpp \
+ $$PWD/battery/LBattery.cpp \
+ $$PWD/desktopswitcher/LDesktopSwitcher.cpp \
+ $$PWD/systemdashboard/LSysDashboard.cpp \
+ $$PWD/systemdashboard/SysMenuQuick.cpp \
+ $$PWD/showdesktop/LHomeButton.cpp \
+ $$PWD/appmenu/LAppMenuPlugin.cpp \
+ $$PWD/applauncher/AppLaunchButton.cpp \
+ $$PWD/systemstart/LStartButton.cpp \
+ $$PWD/systemstart/StartMenu.cpp \
+ $$PWD/systemstart/ItemWidget.cpp
+
+HEADERS += $$PWD/userbutton/LUserButton.h \
+ $$PWD/userbutton/UserWidget.h \
+ $$PWD/userbutton/UserItemWidget.h \
+ $$PWD/desktopbar/LDeskBar.h \
+ $$PWD/systemtray/LSysTray.h \
+ $$PWD/systemtray/TrayIcon.h \
+ $$PWD/spacer/LSpacer.h \
+ $$PWD/line/LLine.h \
+ $$PWD/clock/LClock.h \
+ $$PWD/battery/LBattery.h \
+ $$PWD/desktopswitcher/LDesktopSwitcher.h \
+ $$PWD/taskmanager/LTaskManagerPlugin.h \
+ $$PWD/taskmanager/LTaskButton.h \
+ $$PWD/systemdashboard/LSysDashboard.h \
+ $$PWD/systemdashboard/SysMenuQuick.h \
+ $$PWD/showdesktop/LHomeButton.h \
+ $$PWD/appmenu/LAppMenuPlugin.h \
+ $$PWD/applauncher/AppLaunchButton.h \
+ $$PWD/systemstart/LStartButton.h \
+ $$PWD/systemstart/StartMenu.h \
+ $$PWD/systemstart/ItemWidget.h
+# $$PWD/quickcontainer/QuickPPlugin.h
+
+FORMS += $$PWD/userbutton/UserWidget.ui \
+ $$PWD/systemdashboard/SysMenuQuick.ui \
+ $$PWD/systemstart/StartMenu.ui
+ \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/quickcontainer/QuickPPlugin.h b/src-qt5/core/lumina-desktop/panel-plugins/quickcontainer/QuickPPlugin.h
new file mode 100644
index 00000000..e160c2b3
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/quickcontainer/QuickPPlugin.h
@@ -0,0 +1,43 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This class is a simple container for a QtQuick plugin
+//===========================================
+#ifndef _LUMINA_DESKTOP_PANEL_PLUGIN_QUICK_H
+#define _LUMINA_DESKTOP_PANEL_PLUGIN_QUICK_H
+
+#include <QQuickWidget>
+#include <QVBoxLayout>
+#include "../LPPlugin.h"
+
+#include <LuminaUtils.h>
+#include <QDebug>
+
+class QuickPPlugin : public LPPlugin{
+ Q_OBJECT
+public:
+ QuickPPlugin(QWidget* parent, QString ID, bool horizontal) : LPPlugin(parent, ID){
+ container = new QQuickWidget(this);
+ container->setResizeMode(QQuickWidget::SizeRootObjectToView);
+ this->layout()->addWidget(container);
+ horizontal = true; //just to silence compiler warning
+ container->setSource(QUrl::fromLocalFile( LUtils::findQuickPluginFile(ID.section("---",0,0)) ));
+ }
+
+ ~QuickPPlugin(){}
+
+private:
+ QQuickWidget *container;
+
+private slots:
+ void statusChange(QQuickWidget::Status status){
+ if(status == QQuickWidget::Error){
+ qDebug() << "Quick Widget Error:" << this->type();
+ }
+ }
+
+};
+#endif
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/showdesktop/LHomeButton.cpp b/src-qt5/core/lumina-desktop/panel-plugins/showdesktop/LHomeButton.cpp
new file mode 100644
index 00000000..6c259b16
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/showdesktop/LHomeButton.cpp
@@ -0,0 +1,43 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LHomeButton.h"
+#include "../../LSession.h"
+
+#include <LuminaX11.h>
+
+LHomeButtonPlugin::LHomeButtonPlugin(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){
+ button = new QToolButton(this);
+ button->setAutoRaise(true);
+ button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+
+ connect(button, SIGNAL(clicked()), this, SLOT(showDesktop()));
+ this->layout()->setContentsMargins(0,0,0,0);
+ this->layout()->addWidget(button);
+
+ QTimer::singleShot(0,this, SLOT(OrientationChange())); //Update icons/sizes
+}
+
+LHomeButtonPlugin::~LHomeButtonPlugin(){
+
+}
+
+void LHomeButtonPlugin::updateButtonVisuals(){
+ button->setIcon( LXDG::findIcon("user-desktop", "") );
+}
+
+// ========================
+// PRIVATE FUNCTIONS
+// ========================
+void LHomeButtonPlugin::showDesktop(){
+ QList<WId> wins = LSession::handle()->XCB->WindowList();
+ for(int i=0; i<wins.length(); i++){
+ if( LXCB::INVISIBLE != LSession::handle()->XCB->WindowState(wins[i]) ){
+ LSession::handle()->XCB->MinimizeWindow(wins[i]);
+ }
+ }
+}
+
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/showdesktop/LHomeButton.h b/src-qt5/core/lumina-desktop/panel-plugins/showdesktop/LHomeButton.h
new file mode 100644
index 00000000..74aaf4fb
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/showdesktop/LHomeButton.h
@@ -0,0 +1,62 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This panel plugin is a simple button to hide all windows so the desktop is visible
+//===========================================
+#ifndef _LUMINA_DESKTOP_GO_HOME_PLUGIN_H
+#define _LUMINA_DESKTOP_GO_HOME_PLUGIN_H
+
+// Qt includes
+#include <QToolButton>
+#include <QString>
+#include <QWidget>
+
+
+// Lumina-desktop includes
+#include "../LPPlugin.h" //main plugin widget
+
+// libLumina includes
+#include "LuminaXDG.h"
+
+// PANEL PLUGIN BUTTON
+class LHomeButtonPlugin : public LPPlugin{
+ Q_OBJECT
+
+public:
+ LHomeButtonPlugin(QWidget *parent = 0, QString id = "homebutton", bool horizontal=true);
+ ~LHomeButtonPlugin();
+
+private:
+ QToolButton *button;
+
+ void updateButtonVisuals();
+
+private slots:
+ void showDesktop();
+
+public slots:
+ void OrientationChange(){
+ if(this->layout()->direction()==QBoxLayout::LeftToRight){
+ this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
+ button->setIconSize( QSize(this->height(), this->height()) );
+ }else{
+ this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
+ button->setIconSize( QSize(this->width(), this->width()) );
+ }
+ this->layout()->update();
+ updateButtonVisuals();
+ }
+
+ void LocaleChange(){
+ updateButtonVisuals();
+ }
+
+ void ThemeChange(){
+ updateButtonVisuals();
+ }
+};
+
+#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/spacer/LSpacer.h b/src-qt5/core/lumina-desktop/panel-plugins/spacer/LSpacer.h
new file mode 100644
index 00000000..1e60c519
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/spacer/LSpacer.h
@@ -0,0 +1,34 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This class is a generic invisible spacer for the panel
+//===========================================
+#ifndef _LUMINA_DESKTOP_PANEL_PLUGIN_SPACER_H
+#define _LUMINA_DESKTOP_PANEL_PLUGIN_SPACER_H
+
+#include "../LPPlugin.h"
+
+class LSpacerPlugin : public LPPlugin{
+ Q_OBJECT
+public:
+ LSpacerPlugin(QWidget *parent=0, QString id="spacer", bool horizontal=true) : LPPlugin(parent, id, horizontal){
+ if(horizontal){ this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); }
+ else{ this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); }
+ }
+ ~LSpacerPlugin(){}
+
+public slots:
+ void OrientationChange(){
+ if(this->layout()->direction()==QBoxLayout::LeftToRight){ //horizontal
+ this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ }else{ //vertical
+ this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
+ }
+ }
+};
+
+
+#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/LSysDashboard.cpp b/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/LSysDashboard.cpp
new file mode 100644
index 00000000..267a7cb0
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/LSysDashboard.cpp
@@ -0,0 +1,91 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LSysDashboard.h"
+
+LSysDashboard::LSysDashboard(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){
+ upTimer = new QTimer(this);
+ upTimer->setInterval(10000); //10 second update ping
+ connect(upTimer, SIGNAL(timeout()), this, SLOT(updateIcon()));
+ button = new QToolButton(this);
+ button->setAutoRaise(true);
+ button->setToolButtonStyle(Qt::ToolButtonIconOnly);
+ button->setPopupMode(QToolButton::DelayedPopup); //make sure it runs the update routine first
+ connect(button, SIGNAL(clicked()), this, SLOT(openMenu()));
+ this->layout()->setContentsMargins(0,0,0,0);
+ this->layout()->addWidget(button);
+ menu = new QMenu(this);
+ connect(menu, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed()));
+ sysmenu = new LSysMenuQuick(this);
+ connect(sysmenu, SIGNAL(CloseMenu()), this, SLOT(closeMenu()) );
+ mact = new QWidgetAction(this);
+ mact->setDefaultWidget(sysmenu);
+ menu->addAction(mact);
+
+ button->setMenu(menu);
+ QTimer::singleShot(0,this, SLOT(OrientationChange())); //Update icons/sizes
+}
+
+LSysDashboard::~LSysDashboard(){
+
+}
+
+// ========================
+// PRIVATE FUNCTIONS
+// ========================
+void LSysDashboard::updateIcon(bool force){
+ //For the visual, show battery state only if important
+ static bool batcharging = false;
+ QPixmap pix;
+ button->setToolTip(tr("System Dashboard"));
+ if(LOS::hasBattery()){
+ int bat = LOS::batteryCharge();
+ bool charging = LOS::batteryIsCharging();
+ //Set the icon as necessary
+ if(charging && !batcharging){
+ //Charging and just plugged in
+ if(bat < 15){ button->setIcon( LXDG::findIcon("battery-charging-low","") ); QTimer::singleShot(5000, this, SLOT(resetIcon()));}
+ else if(bat < 30){ button->setIcon( LXDG::findIcon("battery-charging-caution","") ); QTimer::singleShot(5000, this, SLOT(resetIcon()));}
+ else if(force || button->icon().isNull()){ resetIcon(); }
+ }else if(!charging){
+ //Not charging (critical level or just unplugged)
+ if(bat<5){ button->setIcon( LXDG::findIcon("battery-missing","") ); }
+ else if(bat < 15){ button->setIcon( LXDG::findIcon("battery-low","") ); QTimer::singleShot(5000, this, SLOT(resetIcon())); }
+ else if(bat < 30 && batcharging){ button->setIcon( LXDG::findIcon("battery-caution","") ); QTimer::singleShot(5000, this, SLOT(resetIcon()));}
+ else if(bat < 50 && batcharging){ button->setIcon( LXDG::findIcon("battery-040","")); QTimer::singleShot(5000, this, SLOT(resetIcon()));}
+ else if(bat < 70 && batcharging){ button->setIcon( LXDG::findIcon("battery-060","")); QTimer::singleShot(5000, this, SLOT(resetIcon()));}
+ else if(bat < 90 && batcharging){ button->setIcon( LXDG::findIcon("battery-080","")); QTimer::singleShot(5000, this, SLOT(resetIcon()));}
+ else if(batcharging){ button->setIcon( LXDG::findIcon("battery-100","")); QTimer::singleShot(5000, this, SLOT(resetIcon()));}
+ else if(force || button->icon().isNull()){ resetIcon(); }
+ }else if(force || button->icon().isNull()){
+ //Otherwise just use the default icon
+ resetIcon();
+ }
+ //Save the values for comparison later
+ batcharging = charging;
+ if( !upTimer->isActive() ){ upTimer->start(); } //only use the timer if a battery is present
+
+ // No battery - just use/set the normal icon
+ }else if(force || button->icon().isNull()){
+ resetIcon();
+ if(upTimer->isActive() ){ upTimer->stop(); } //no battery available - no refresh timer needed
+ }
+
+}
+
+void LSysDashboard::resetIcon(){
+ button->setIcon( LXDG::findIcon("dashboard-show",""));
+}
+
+void LSysDashboard::openMenu(){
+ sysmenu->UpdateMenu();
+ button->showMenu();
+}
+
+void LSysDashboard::closeMenu(){
+ menu->hide();
+}
+
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/LSysDashboard.h b/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/LSysDashboard.h
new file mode 100644
index 00000000..782fc4e6
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/LSysDashboard.h
@@ -0,0 +1,76 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This panel plugin allows the user to control different system settings
+// For example: screen brightness, audio volume, workspace, and battery
+//===========================================
+#ifndef _LUMINA_DESKTOP_SYSTEM_DASHBOARD_H
+#define _LUMINA_DESKTOP_SYSTEM_DASHBOARD_H
+
+//Qt includes
+
+#include <QHBoxLayout>
+#include <QDebug>
+#include <QCoreApplication>
+#include <QPainter>
+#include <QPixmap>
+#include <QWidgetAction>
+#include <QMenu>
+#include <QTimer>
+#include <QToolButton>
+
+//libLumina includes
+#include <LuminaOS.h>
+#include <LuminaXDG.h>
+
+//Local includes
+#include "../LPPlugin.h"
+#include "SysMenuQuick.h"
+
+class LSysDashboard : public LPPlugin{
+ Q_OBJECT
+public:
+ LSysDashboard(QWidget *parent = 0, QString id="systemdashboard", bool horizontal=true);
+ ~LSysDashboard();
+
+private:
+ QMenu *menu;
+ QWidgetAction *mact;
+ LSysMenuQuick *sysmenu;
+ QToolButton *button;
+ QTimer *upTimer;
+
+private slots:
+ void updateIcon(bool force = false);
+ void resetIcon();
+ void openMenu();
+ void closeMenu();
+
+public slots:
+ void LocaleChange(){
+ updateIcon(true);
+ sysmenu->UpdateMenu();
+ }
+
+ void ThemeChange(){
+ updateIcon(true);
+ sysmenu->UpdateMenu();
+ }
+
+ void OrientationChange(){
+ if(this->layout()->direction()==QBoxLayout::LeftToRight){
+ this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
+ button->setIconSize( QSize(this->height(), this->height()) );
+ }else{
+ this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
+ button->setIconSize( QSize(this->width(), this->width()) );
+ }
+ updateIcon(true); //force icon refresh
+ this->layout()->update();
+ }
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/SysMenuQuick.cpp b/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/SysMenuQuick.cpp
new file mode 100644
index 00000000..1d699ea9
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/SysMenuQuick.cpp
@@ -0,0 +1,211 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "SysMenuQuick.h"
+#include "ui_SysMenuQuick.h"
+
+#include "../../LSession.h"
+#include <LuminaX11.h>
+
+LSysMenuQuick::LSysMenuQuick(QWidget *parent) : QWidget(parent), ui(new Ui::LSysMenuQuick){
+ ui->setupUi(this);
+ brighttimer = new QTimer(this);
+ brighttimer->setSingleShot(true);
+ brighttimer->setInterval(50); //50ms delay in setting the new value
+ //Now reset the initial saved settings (this is handles by the LOS/session now - 4/22/15)
+ firstrun = true;
+ UpdateMenu(); //do this once before all the signals/slots are connected below
+ firstrun = false;
+ //Now setup the connections
+ connect(ui->slider_volume, SIGNAL(valueChanged(int)), this, SLOT(volSliderChanged()) );
+ connect(ui->slider_brightness, SIGNAL(valueChanged(int)), this, SLOT(brightSliderChanged()) );
+ connect(ui->tool_wk_prev, SIGNAL(clicked()), this, SLOT(prevWorkspace()) );
+ connect(ui->tool_wk_next, SIGNAL(clicked()), this, SLOT(nextWorkspace()) );
+ connect(ui->tool_logout, SIGNAL(clicked()), this, SLOT(startLogout()) );
+ connect(ui->tool_vol_mixer, SIGNAL(clicked()), this, SLOT(startMixer()) );
+ connect(brighttimer, SIGNAL(timeout()), this, SLOT(setCurrentBrightness()) );
+ connect(ui->combo_locale, SIGNAL(currentIndexChanged(int)), this, SLOT(changeLocale()) );
+ //And setup the default icons
+ ui->label_bright_icon->setPixmap( LXDG::findIcon("preferences-system-power-management","").pixmap(ui->label_bright_icon->maximumSize()) );
+ ui->tool_wk_prev->setIcon( LXDG::findIcon("go-previous-view",""));
+ ui->tool_wk_next->setIcon( LXDG::findIcon("go-next-view","") );
+ ui->tool_logout->setIcon( LXDG::findIcon("system-log-out","") );
+}
+
+LSysMenuQuick::~LSysMenuQuick(){
+
+}
+
+void LSysMenuQuick::UpdateMenu(){
+ ui->retranslateUi(this);
+ //Audio Volume
+ int val = LOS::audioVolume();
+ QIcon ico;
+ if(val > 66){ ico= LXDG::findIcon("audio-volume-high",""); }
+ else if(val > 33){ ico= LXDG::findIcon("audio-volume-medium",""); }
+ else if(val > 0){ ico= LXDG::findIcon("audio-volume-low",""); }
+ else{ ico= LXDG::findIcon("audio-volume-muted",""); }
+ bool hasMixer = LOS::hasMixerUtility();
+ ui->label_vol_icon->setVisible(!hasMixer);
+ ui->tool_vol_mixer->setVisible(hasMixer);
+ if(!hasMixer){ ui->label_vol_icon->setPixmap( ico.pixmap(ui->label_vol_icon->maximumSize()) ); }
+ else{ ui->tool_vol_mixer->setIcon(ico); }
+ QString txt = QString::number(val)+"%";
+ if(val<100){ txt.prepend(" "); } //make sure no widget resizing
+ ui->label_vol_text->setText(txt);
+ if(ui->slider_volume->value()!= val){ ui->slider_volume->setValue(val); }
+ //Screen Brightness
+ val = LOS::ScreenBrightness();
+ if(val < 0){
+ //No brightness control - hide it
+ ui->group_brightness->setVisible(false);
+ }else{
+ ui->group_brightness->setVisible(true);
+ txt = QString::number(val)+"%";
+ if(val<100){ txt.prepend(" "); } //make sure no widget resizing
+ ui->label_bright_text->setText(txt);
+ if(ui->slider_brightness->value()!=val){ ui->slider_brightness->setValue(val); }
+ }
+
+ //Do any one-time checks
+ if(firstrun){
+ hasBat = LOS::hasBattery(); //No need to check this more than once - will not change in the middle of a session
+ //Current Locale
+ QStringList locales = LUtils::knownLocales();
+ ui->combo_locale->clear();
+ QLocale curr;
+ for(int i=0; i<locales.length(); i++){
+ QLocale loc( (locales[i]=="pt") ? "pt_PT" : locales[i] );
+ ui->combo_locale->addItem(loc.nativeLanguageName()+" ("+locales[i]+")", locales[i]); //Make the display text prettier later
+ if(locales[i] == curr.name() || locales[i] == curr.name().section("_",0,0) ){
+ //Current Locale
+ ui->combo_locale->setCurrentIndex(ui->combo_locale->count()-1); //the last item in the list right now
+ }
+ }
+ ui->group_locale->setVisible(locales.length() > 1);
+ }
+
+ //Battery Status
+ if(hasBat){
+ ui->group_battery->setVisible(true);
+ val = LOS::batteryCharge();
+ if(LOS::batteryIsCharging()){
+ if(val < 15){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-charging-low","").pixmap(ui->label_bat_icon->maximumSize()) ); }
+ else if(val < 30){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-charging-caution","").pixmap(ui->label_bat_icon->maximumSize()) ); }
+ else if(val < 50){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-charging-040","").pixmap(ui->label_bat_icon->maximumSize()) ); }
+ else if(val < 70){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-charging-060","").pixmap(ui->label_bat_icon->maximumSize()) ); }
+ else if(val < 90){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-charging-080","").pixmap(ui->label_bat_icon->maximumSize()) ); }
+ else{ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-charging","").pixmap(ui->label_bat_icon->maximumSize()) ); }
+ ui->label_bat_text->setText( QString("%1%\n(%2)").arg(QString::number(val), tr("connected")) );
+ }else{
+ if(val < 1){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-missing","").pixmap(ui->label_bat_icon->maximumSize()) ); }
+ else if(val < 15){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-low","").pixmap(ui->label_bat_icon->maximumSize()) ); }
+ else if(val < 30){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-caution","").pixmap(ui->label_bat_icon->maximumSize()) ); }
+ else if(val < 50){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-040","").pixmap(ui->label_bat_icon->maximumSize()) ); }
+ else if(val < 70){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-060","").pixmap(ui->label_bat_icon->maximumSize()) ); }
+ else if(val < 90){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-080","").pixmap(ui->label_bat_icon->maximumSize()) ); }
+ else{ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-100","").pixmap(ui->label_bat_icon->maximumSize()) ); }
+ ui->label_bat_text->setText( QString("%1%\n(%2)").arg(QString::number(val), getRemainingTime()) );
+ }
+ }else{
+ ui->group_battery->setVisible(false);
+ }
+ //Workspace
+ val = LSession::handle()->XCB->CurrentWorkspace();
+ int tot = LSession::handle()->XCB->NumberOfWorkspaces();
+ ui->group_workspace->setVisible(val>=0 && tot>1);
+ ui->label_wk_text->setText( QString(tr("%1 of %2")).arg(QString::number(val+1), QString::number(tot)) );
+}
+
+void LSysMenuQuick::volSliderChanged(){
+ int val = ui->slider_volume->value();
+ LOS::setAudioVolume(val);
+ QString txt = QString::number(val)+"%";
+ if(val<100){ txt.prepend(" "); } //make sure no widget resizing
+ ui->label_vol_text->setText( txt );
+ if(val > 66){ ui->label_vol_icon->setPixmap( LXDG::findIcon("audio-volume-high","").pixmap(ui->label_vol_icon->maximumSize()) ); }
+ else if(val > 33){ ui->label_vol_icon->setPixmap( LXDG::findIcon("audio-volume-medium","").pixmap(ui->label_vol_icon->maximumSize()) ); }
+ else if(val > 0){ ui->label_vol_icon->setPixmap( LXDG::findIcon("audio-volume-low","").pixmap(ui->label_vol_icon->maximumSize()) ); }
+ else{ ui->label_vol_icon->setPixmap( LXDG::findIcon("audio-volume-muted","").pixmap(ui->label_vol_icon->maximumSize()) ); }
+}
+
+void LSysMenuQuick::startMixer(){
+ emit CloseMenu();
+ LOS::startMixerUtility();
+}
+
+void LSysMenuQuick::brightSliderChanged(){
+ //Brightness controls cannot operate extremely quickly - combine calls as necessary
+ if(brighttimer->isActive()){ brighttimer->stop(); }
+ brighttimer->start();
+ //*DO* update the label right away
+ int val = ui->slider_brightness->value();
+ QString txt = QString::number(val)+"%";
+ if(val<100){ txt.prepend(" "); } //make sure no widget resizing
+ ui->label_bright_text->setText( txt );
+}
+
+void LSysMenuQuick::setCurrentBrightness(){
+ int val = ui->slider_brightness->value();
+ LOS::setScreenBrightness(val);
+ QString txt = QString::number(val)+"%";
+ if(val<100){ txt.prepend(" "); } //make sure no widget resizing
+ ui->label_bright_text->setText( txt );
+}
+
+void LSysMenuQuick::nextWorkspace(){
+ int cur = LSession::handle()->XCB->CurrentWorkspace();
+ int tot = LSession::handle()->XCB->NumberOfWorkspaces();
+ //qDebug()<< "Next Workspace:" << cur << tot;
+ cur++;
+ if(cur>=tot){ cur = 0; } //back to beginning
+ //qDebug() << " - New Current:" << cur;
+ LSession::handle()->XCB->SetCurrentWorkspace(cur);
+ui->label_wk_text->setText( QString(tr("%1 of %2")).arg(QString::number(cur+1), QString::number(tot)) );
+}
+
+void LSysMenuQuick::prevWorkspace(){
+ int cur = LSession::handle()->XCB->CurrentWorkspace();
+ int tot = LSession::handle()->XCB->NumberOfWorkspaces();
+ cur--;
+ if(cur<0){ cur = tot-1; } //back to last
+ LSession::handle()->XCB->SetCurrentWorkspace(cur);
+ ui->label_wk_text->setText( QString(tr("%1 of %2")).arg(QString::number(cur+1), QString::number(tot)) );
+}
+
+QString LSysMenuQuick::getRemainingTime(){
+ int secs = LOS::batterySecondsLeft();
+ if(secs < 0){ return "??"; }
+ QString rem; //remaining
+ if(secs > 3600){
+ int hours = secs/3600;
+ rem.append( QString::number(hours)+"h ");
+ secs = secs - (hours*3600);
+ }
+ if(secs > 60){
+ int min = secs/60;
+ rem.append( QString::number(min)+"m ");
+ secs = secs - (min*60);
+ }
+ if(secs > 0){
+ rem.append( QString::number(secs)+"s");
+ }else{
+ rem.append( "0s" );
+ }
+ return rem;
+}
+
+void LSysMenuQuick::startLogout(){
+ emit CloseMenu();
+ LSession::handle()->systemWindow();
+}
+
+void LSysMenuQuick::changeLocale(){
+ //Get the currently selected Locale
+ QString locale = ui->combo_locale->currentData().toString();
+ emit CloseMenu();
+ LSession::handle()->switchLocale(locale);
+} \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/SysMenuQuick.h b/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/SysMenuQuick.h
new file mode 100644
index 00000000..a300b5b1
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/SysMenuQuick.h
@@ -0,0 +1,54 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This panel plugin allows the user to control different system settings
+// For example: screen brightness, audio volume, workspace, and battery
+//===========================================
+#ifndef _LUMINA_PANEL_QUICK_SYSTEM_MENU_H
+#define _LUMINA_PANEL_QUICK_SYSTEM_MENU_H
+
+#include <QWidget>
+#include <QSettings>
+#include <QString>
+
+#include <LuminaOS.h>
+#include <LuminaXDG.h>
+
+namespace Ui{
+ class LSysMenuQuick;
+};
+
+class LSysMenuQuick : public QWidget{
+ Q_OBJECT
+public:
+ LSysMenuQuick(QWidget *parent=0);
+ ~LSysMenuQuick();
+
+ void UpdateMenu();
+
+private:
+ Ui::LSysMenuQuick *ui;
+ QTimer *brighttimer;
+ bool firstrun, hasBat;
+ QString getRemainingTime(); //battery time left
+
+private slots:
+ void volSliderChanged();
+ void brightSliderChanged(); //start the delay/collection timer
+ void setCurrentBrightness(); //perform the change
+ void startMixer();
+ void nextWorkspace();
+ void prevWorkspace();
+ void startLogout();
+ void changeLocale();
+
+
+signals:
+ void CloseMenu();
+
+};
+
+#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/SysMenuQuick.ui b/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/SysMenuQuick.ui
new file mode 100644
index 00000000..26c32c74
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/SysMenuQuick.ui
@@ -0,0 +1,400 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>LSysMenuQuick</class>
+ <widget class="QWidget" name="LSysMenuQuick">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>171</width>
+ <height>317</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">/*QGroupBox{
+border-radius: 5px;
+border: 1px solid grey;
+margin-top: 1ex;
+}
+QGroupBox::title{
+subcontrol-origin: margin;
+subcontrol-position: top center;
+padding: 0 3px;
+background-color: rgba(255,255,255,255);
+border-radius: 5px;
+font: bold;
+}*/</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="leftMargin">
+ <number>1</number>
+ </property>
+ <property name="topMargin">
+ <number>1</number>
+ </property>
+ <property name="rightMargin">
+ <number>1</number>
+ </property>
+ <property name="bottomMargin">
+ <number>1</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="group_volume">
+ <property name="title">
+ <string>System Volume</string>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="leftMargin">
+ <number>2</number>
+ </property>
+ <property name="topMargin">
+ <number>2</number>
+ </property>
+ <property name="rightMargin">
+ <number>2</number>
+ </property>
+ <property name="bottomMargin">
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_vol_icon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_vol_mixer">
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Launch Audio Mixer</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>30</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="slider_volume">
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ <property name="value">
+ <number>100</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_vol_text">
+ <property name="text">
+ <string notr="true">100%</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="group_brightness">
+ <property name="title">
+ <string>Screen Brightness</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="leftMargin">
+ <number>2</number>
+ </property>
+ <property name="topMargin">
+ <number>2</number>
+ </property>
+ <property name="rightMargin">
+ <number>2</number>
+ </property>
+ <property name="bottomMargin">
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_bright_icon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="slider_brightness">
+ <property name="minimum">
+ <number>10</number>
+ </property>
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ <property name="value">
+ <number>100</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_bright_text">
+ <property name="text">
+ <string notr="true">100%</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="group_battery">
+ <property name="title">
+ <string>Battery Status</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="leftMargin">
+ <number>2</number>
+ </property>
+ <property name="topMargin">
+ <number>2</number>
+ </property>
+ <property name="rightMargin">
+ <number>2</number>
+ </property>
+ <property name="bottomMargin">
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_bat_icon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_bat_text">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string notr="true">100% (Plugged in)</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="group_workspace">
+ <property name="title">
+ <string>Workspace</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="leftMargin">
+ <number>2</number>
+ </property>
+ <property name="topMargin">
+ <number>2</number>
+ </property>
+ <property name="rightMargin">
+ <number>2</number>
+ </property>
+ <property name="bottomMargin">
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="tool_wk_prev">
+ <property name="text">
+ <string notr="true">prev</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_wk_text">
+ <property name="text">
+ <string notr="true">1 of 2</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_wk_next">
+ <property name="text">
+ <string notr="true">next</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="group_locale">
+ <property name="title">
+ <string>Locale</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="leftMargin">
+ <number>2</number>
+ </property>
+ <property name="topMargin">
+ <number>2</number>
+ </property>
+ <property name="rightMargin">
+ <number>2</number>
+ </property>
+ <property name="bottomMargin">
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QComboBox" name="combo_locale"/>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_6">
+ <item>
+ <widget class="QToolButton" name="tool_logout">
+ <property name="font">
+ <font>
+ <pointsize>9</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>Log Out</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemstart/ItemWidget.cpp b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/ItemWidget.cpp
new file mode 100644
index 00000000..bdd13b18
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/ItemWidget.cpp
@@ -0,0 +1,256 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "ItemWidget.h"
+#include <LuminaUtils.h>
+#include <QMenu>
+#include "../../LSession.h"
+
+
+ItemWidget::ItemWidget(QWidget *parent, QString itemPath, QString type, bool goback) : QFrame(parent){
+ createWidget();
+ //Now fill it appropriately
+ bool inHome = type.endsWith("-home"); //internal code
+ if(inHome){ type = type.remove("-home"); }
+ if(itemPath.endsWith(".desktop") || type=="app"){
+ bool ok = false;
+ XDGDesktop item = LXDG::loadDesktopFile(itemPath, ok);
+ if(ok && LXDG::checkValidity(item) ){
+ icon->setPixmap( LXDG::findIcon(item.icon, "preferences-system-windows-actions").pixmap(32,32) );
+ iconPath = item.icon;
+ text = item.name;
+ if(!item.genericName.isEmpty() && item.name!=item.genericName){ text.append("<br><i> -- "+item.genericName+"</i>"); }
+ name->setText(text);
+ name->setToolTip(item.comment);
+ setupActions(item);
+ }else{
+ gooditem = false;
+ return;
+ }
+ }else if(type=="dir"){
+ actButton->setVisible(false);
+ if(itemPath.endsWith("/")){ itemPath.chop(1); }
+ if(goback){
+ icon->setPixmap( LXDG::findIcon("go-previous","").pixmap(64,64) );
+ iconPath = "go-previous";
+ text = tr("Go Back");
+ name->setText( text );
+ }else{
+ icon->setPixmap( LXDG::findIcon("folder","").pixmap(64,64) );
+ iconPath = "folder";
+ name->setText( itemPath.section("/",-1));
+ text = itemPath.section("/",-1);
+ }
+ }else if(type.startsWith("chcat::::")){
+ //Category given
+ actButton->setVisible(false);
+ iconPath = LXDG::DesktopCatToIcon(type.section("::::",1,50));
+ if(goback){ iconPath = "go-previous"; type = "chcat::::"; itemPath = "<B>("+itemPath+")</B>"; }
+ icon->setPixmap( LXDG::findIcon(iconPath,"applications-other").pixmap(64,64) );
+ name->setText(itemPath);
+ text = itemPath;
+ icon->setWhatsThis(type);
+ linkPath = type;
+ }else{
+ actButton->setVisible(false);
+ if(itemPath.endsWith("/")){ itemPath.chop(1); }
+ if(QFileInfo(itemPath).isDir()){
+ type = "dir";
+ icon->setPixmap( LXDG::findIcon("folder","").pixmap(64,64) );
+ iconPath = "folder";
+ }else if(LUtils::imageExtensions().contains(itemPath.section("/",-1).section(".",-1).toLower()) ){
+ icon->setPixmap( QIcon(itemPath).pixmap(64,64) );
+ }else{
+ icon->setPixmap( LXDG::findMimeIcon(itemPath.section("/",-1)).pixmap(64,64) );
+ }
+ name->setText( itemPath.section("/",-1) ); //this->fontMetrics().elidedText(itemPath.section("/",-1), Qt::ElideRight, TEXTCUTOFF) );
+ text = itemPath.section("/",-1) ;
+ }
+ icon->setWhatsThis(itemPath);
+ if(!goback){ this->setWhatsThis(name->text()); }
+ isDirectory = (type=="dir"); //save this for later
+ if(LUtils::isFavorite(itemPath)){
+ linkPath = itemPath;
+ isShortcut=true;
+ }else if( inHome ){//|| itemPath.section("/",0,-2)==QDir::homePath()+"/Desktop" ){
+ isShortcut = true;
+ }else{
+ isShortcut = false;
+ }
+ if(isShortcut && name->toolTip().isEmpty()){
+ name->setToolTip(icon->whatsThis()); //also allow the user to see the full shortcut path
+ }
+ //Now setup the button appropriately
+ setupContextMenu();
+}
+
+// - Application constructor
+ItemWidget::ItemWidget(QWidget *parent, XDGDesktop item) : QFrame(parent){
+ createWidget();
+ isDirectory = false;
+ if(LUtils::isFavorite(item.filePath)){
+ linkPath = item.filePath;
+ isShortcut=true;
+ }else if( item.filePath.section("/",0,-2)==QDir::homePath()+"/Desktop" ){
+ isShortcut = true;
+ }else{
+ isShortcut = false;
+ }
+ if(isShortcut){
+ name->setToolTip(icon->whatsThis()); //also allow the user to see the full shortcut path
+ }
+ //Now fill it appropriately
+ icon->setPixmap( LXDG::findIcon(item.icon,"preferences-system-windows-actions").pixmap(64,64) );
+ text = item.name;
+ if(!item.genericName.isEmpty() && item.name!=item.genericName){ text.append("<br><i> -- "+item.genericName+"</i>"); }
+ name->setText(text);
+ name->setToolTip(item.comment);
+ this->setWhatsThis(item.name);
+ icon->setWhatsThis(item.filePath);
+ iconPath = item.icon;
+ //Now setup the buttons appropriately
+ setupContextMenu();
+ setupActions(item);
+}
+
+ItemWidget::~ItemWidget(){
+}
+
+void ItemWidget::createWidget(){
+ //Initialize the widgets
+ gooditem = true;
+ menuopen = false;
+ menureset = new QTimer(this);
+ menureset->setSingleShot(true);
+ menureset->setInterval(1000); //1 second
+ this->setContentsMargins(0,0,0,0);
+ contextMenu = new QMenu();
+ connect(contextMenu, SIGNAL(aboutToShow()), this, SLOT(actionMenuOpen()) );
+ connect(contextMenu, SIGNAL(aboutToHide()), this, SLOT(actionMenuClosed()) );
+ actButton = new QToolButton(this);
+ actButton->setPopupMode(QToolButton::InstantPopup);
+ actButton->setArrowType(Qt::DownArrow);
+ icon = new QLabel(this);
+ name = new QLabel(this);
+ name->setWordWrap(true);
+ name->setTextFormat(Qt::RichText);
+ name->setTextInteractionFlags(Qt::NoTextInteraction);
+ //Add them to the layout
+ this->setLayout(new QHBoxLayout());
+ this->layout()->setContentsMargins(1,1,1,1);
+ this->layout()->addWidget(icon);
+ this->layout()->addWidget(actButton);
+ this->layout()->addWidget(name);
+ //Set a custom object name so this can be tied into the Lumina Theme stylesheets
+ this->setObjectName("LuminaItemWidget");
+}
+
+void ItemWidget::setupContextMenu(){
+ //Now refresh the context menu
+ contextMenu->clear();
+ if(!QFile::exists(QDir::homePath()+"/Desktop/"+icon->whatsThis().section("/",-1)) ){
+ //Does not have a desktop link
+ contextMenu->addAction( LXDG::findIcon("preferences-desktop-icons",""), tr("Pin to Desktop"), this, SLOT(PinToDesktop()) );
+ }
+ //Favorite Item
+ if( LUtils::isFavorite(icon->whatsThis()) ){ //Favorite Item - can always remove this
+ contextMenu->addAction( LXDG::findIcon("edit-delete",""), tr("Remove from Favorites"), this, SLOT(RemoveFavorite()) );
+ }else{
+ //This file does not have a shortcut yet -- allow the user to add it
+ contextMenu->addAction( LXDG::findIcon("bookmark-toolbar",""), tr("Add to Favorites"), this, SLOT(AddFavorite()) );
+ }
+ //QuickLaunch Item
+ if(LSession::handle()->sessionSettings()->value("QuicklaunchApps",QStringList()).toStringList().contains(icon->whatsThis()) ){ //Favorite Item - can always remove this
+ contextMenu->addAction( LXDG::findIcon("edit-delete",""), tr("Remove from Quicklaunch"), this, SLOT(RemoveQL()) );
+ }else{
+ //This file does not have a shortcut yet -- allow the user to add it
+ contextMenu->addAction( LXDG::findIcon("quickopen",""), tr("Add to Quicklaunch"), this, SLOT(AddQL()) );
+ }
+}
+
+void ItemWidget::setupActions(XDGDesktop app){
+ if(app.actions.isEmpty()){ actButton->setVisible(false); return; }
+ //Actions Available - go ahead and list them all
+ actButton->setMenu( new QMenu(this) );
+ for(int i=0; i<app.actions.length(); i++){
+ QAction *act = new QAction(LXDG::findIcon(app.actions[i].icon, app.icon), app.actions[i].name, this);
+ act->setToolTip(app.actions[i].ID);
+ act->setWhatsThis(app.actions[i].ID);
+ actButton->menu()->addAction(act);
+ }
+ connect(actButton->menu(), SIGNAL(triggered(QAction*)), this, SLOT(actionClicked(QAction*)) );
+ connect(actButton->menu(), SIGNAL(aboutToShow()), this, SLOT(actionMenuOpen()) );
+ connect(actButton->menu(), SIGNAL(aboutToHide()), this, SLOT(actionMenuClosed()) );
+ connect(menureset, SIGNAL(timeout()), this, SLOT(resetmenuflag()) );
+}
+
+void ItemWidget::updateItems(){
+ //update the text/icon to match sizes
+ int H = 2.3*name->fontMetrics().height(); //make sure the height is large enough for two lines
+ icon->setFixedSize(QSize(H-4, H-4));
+ actButton->setFixedSize( QSize( (H-4)/2, H-4) );
+ QStringList newname = text.split("<br>");
+ for(int i=0; i<newname.length(); i++){ newname[i] = name->fontMetrics().elidedText(newname[i], Qt::ElideRight, name->width()); }
+ name->setText( newname.join("<br>") );
+ //Now reload the icon if necessary
+ if(icon->pixmap()->size().height() < (H-4) ){
+ if(iconPath.isEmpty()){
+ //Use item path (thumbnail or mimetype)
+ if(LUtils::imageExtensions().contains(icon->whatsThis().section("/",-1).section(".",-1).toLower()) ){
+ icon->setPixmap( QIcon(icon->whatsThis()).pixmap(H-4,H-4).scaledToHeight(H-4,Qt::SmoothTransformation) );
+ }else{
+ icon->setPixmap( LXDG::findMimeIcon(icon->whatsThis().section("/",-1)).pixmap(H-4,H-4).scaledToHeight(H-4,Qt::SmoothTransformation) );
+ }
+ }else{
+ icon->setPixmap( LXDG::findIcon(iconPath,"preferences-system-windows-actions").pixmap(H-4,H-4).scaledToHeight(H-4,Qt::SmoothTransformation) );
+ }
+ }else if(icon->pixmap()->size().height() > (H-4) ){
+ icon->setPixmap( icon->pixmap()->scaled(H-4, H-4, Qt::IgnoreAspectRatio, Qt::SmoothTransformation) );
+ }
+}
+
+void ItemWidget::PinToDesktop(){
+ qDebug() << "Create Link on Desktop:" << icon->whatsThis();
+ bool ok = QFile::link(icon->whatsThis(), QDir::homePath()+"/Desktop/"+icon->whatsThis().section("/",-1));
+ qDebug() << " - " << (ok ? "Success": "Failure");
+}
+
+void ItemWidget::RemoveFavorite(){
+ LUtils::removeFavorite(icon->whatsThis());
+ linkPath.clear();
+ emit RemovedShortcut();
+}
+
+void ItemWidget::AddFavorite(){
+ if( LUtils::addFavorite(icon->whatsThis()) ){
+ linkPath = icon->whatsThis();
+ emit NewShortcut();
+ }
+
+}
+void ItemWidget::RemoveQL(){
+ qDebug() << "Remove QuickLaunch Button:" << icon->whatsThis();
+ emit toggleQuickLaunch(icon->whatsThis(), false);
+}
+
+void ItemWidget::AddQL(){
+ qDebug() << "Add QuickLaunch Button:" << icon->whatsThis();
+ emit toggleQuickLaunch(icon->whatsThis(), true);
+}
+
+
+void ItemWidget::ItemClicked(){
+ if(!linkPath.isEmpty()){ emit RunItem(linkPath); }
+ else{ emit RunItem(icon->whatsThis()); }
+}
+
+void ItemWidget::actionClicked(QAction *act){
+ actButton->menu()->hide();
+ QString cmd = "lumina-open -action \""+act->whatsThis()+"\" \"%1\"";
+ if(!linkPath.isEmpty()){ cmd = cmd.arg(linkPath); }
+ else{ cmd = cmd.arg(icon->whatsThis()); }
+ emit RunItem(cmd);
+} \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemstart/ItemWidget.h b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/ItemWidget.h
new file mode 100644
index 00000000..0f24cec4
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/ItemWidget.h
@@ -0,0 +1,98 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This item widget manages a single file/directory
+//===========================================
+#ifndef _LUMINA_PANEL_SYSTEM_START_ITEM_WIDGET_H
+#define _LUMINA_PANEL_SYSTEM_START_ITEM_WIDGET_H
+
+#include <QFrame>
+#include <QLabel>
+#include <QToolButton>
+#include <QString>
+#include <QHBoxLayout>
+#include <QSize>
+#include <QDir>
+#include <QFile>
+#include <QMouseEvent>
+#include <QAction>
+#include <QMenu>
+#include <QTimer>
+#include <QResizeEvent>
+
+#include <LuminaXDG.h>
+
+class ItemWidget : public QFrame{
+ Q_OBJECT
+public:
+ //Overloaded Constructors for various uses
+ // - Favorites (path/type)
+ ItemWidget(QWidget *parent=0, QString itemPath="", QString type="unknown", bool goback=false);
+ // - Generic Apps
+ ItemWidget(QWidget *parent=0, XDGDesktop item= XDGDesktop());
+ // - Categories
+ //ItemWidget(QWidget *parent=0, QString cat="");
+
+ ~ItemWidget();
+
+ bool gooditem;
+
+private:
+ QToolButton *actButton;
+ QMenu *contextMenu;
+ QLabel *icon, *name;
+ bool isDirectory, isShortcut, menuopen;
+ QString linkPath, iconPath, text;
+ QTimer *menureset;
+
+ void createWidget();
+ //void setupButton(bool disable = false);
+ void setupContextMenu();
+ void setupActions(XDGDesktop);
+
+ void updateItems(); //update the text/icon to match sizes
+
+private slots:
+ void PinToDesktop();
+ void RemoveFavorite();
+ void AddFavorite();
+ void RemoveQL();
+ void AddQL();
+ void ItemClicked();
+ void actionClicked(QAction*);
+ //Functions to fix the submenu open/close issues
+ void actionMenuOpen(){
+ if(menureset->isActive()){ menureset->stop(); }
+ menuopen = true;
+ }
+ void resetmenuflag(){ menuopen = false; } //tied to the "menureset" timer
+ void actionMenuClosed(){ menureset->start(); }
+
+
+protected:
+ void mouseReleaseEvent(QMouseEvent *event){
+ if(menuopen){ resetmenuflag(); } //skip this event if a submenu was open
+ else if(event->button() == Qt::RightButton && !icon->whatsThis().startsWith("chcat::::") ){
+ menuopen = true;
+ setupContextMenu();
+ contextMenu->popup(event->globalPos());
+ }else if(event->button() != Qt::NoButton){ ItemClicked(); }
+ }
+
+ void resizeEvent(QResizeEvent *ev){
+ updateItems(); //update the sizing of everything
+ QFrame::resizeEvent(ev); // do the normal procedures
+ }
+
+signals:
+ void NewShortcut();
+ void RemovedShortcut();
+ void RunItem(QString cmd);
+ void toggleQuickLaunch(QString path, bool ok);
+
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemstart/LStartButton.cpp b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/LStartButton.cpp
new file mode 100644
index 00000000..e08ef1c8
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/LStartButton.cpp
@@ -0,0 +1,120 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LStartButton.h"
+#include "../../LSession.h"
+
+#include <LuminaXDG.h>
+#include <LuminaUtils.h> //This contains the "ResizeMenu" class
+
+LStartButtonPlugin::LStartButtonPlugin(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){
+ button = new QToolButton(this);
+ button->setAutoRaise(true);
+ button->setToolButtonStyle(Qt::ToolButtonIconOnly);
+ button->setPopupMode(QToolButton::DelayedPopup); //make sure it runs the update routine first
+ connect(button, SIGNAL(clicked()), this, SLOT(openMenu()));
+ this->layout()->setContentsMargins(0,0,0,0);
+ this->layout()->addWidget(button);
+ menu = new ResizeMenu(this);
+ menu->setContentsMargins(1,1,1,1);
+ connect(menu, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed()));
+ connect(menu, SIGNAL(MenuResized(QSize)), this, SLOT(SaveMenuSize(QSize)) );
+ startmenu = new StartMenu(this);
+ connect(startmenu, SIGNAL(CloseMenu()), this, SLOT(closeMenu()) );
+ connect(startmenu, SIGNAL(UpdateQuickLaunch(QStringList)), this, SLOT(updateQuickLaunch(QStringList)));
+ menu->setContents(startmenu);
+ QSize saved = LSession::handle()->DesktopPluginSettings()->value("panelPlugs/"+this->type()+"/MenuSize", QSize(0,0)).toSize();
+ if(!saved.isNull()){ startmenu->setFixedSize(saved); } //re-load the previously saved value
+
+ button->setMenu(menu);
+ connect(menu, SIGNAL(aboutToHide()), this, SLOT(updateButtonVisuals()) );
+ QTimer::singleShot(0,this, SLOT(OrientationChange())); //Update icons/sizes
+ QTimer::singleShot(0, startmenu, SLOT(ReLoadQuickLaunch()) );
+}
+
+LStartButtonPlugin::~LStartButtonPlugin(){
+
+}
+
+void LStartButtonPlugin::updateButtonVisuals(){
+ button->setToolTip(tr(""));
+ button->setText( SYSTEM::user() );
+ button->setIcon( LXDG::findIcon("pcbsd","Lumina-DE") ); //force icon refresh
+}
+
+void LStartButtonPlugin::updateQuickLaunch(QStringList apps){
+ //First clear any obsolete apps
+ QStringList old;
+ qDebug() << "Update QuickLaunch Buttons";
+ for(int i=0; i<QUICKL.length(); i++){
+ if( !apps.contains(QUICKL[i]->whatsThis()) ){
+ //App was removed
+ QUICKL.takeAt(i)->deleteLater();
+ i--;
+ }else{
+ //App still listed - update the button
+ old << QUICKL[i]->whatsThis(); //add the list of current buttons
+ LFileInfo info(QUICKL[i]->whatsThis());
+ QUICKL[i]->setIcon( LXDG::findIcon(info.iconfile(),"unknown") );
+ if(info.isDesktopFile()){ QUICKL[i]->setToolTip( info.XDG()->name ); }
+ else{ QUICKL[i]->setToolTip( info.fileName() ); }
+ }
+ }
+ //Now go through and create any new buttons
+ for(int i=0; i<apps.length(); i++){
+ if( !old.contains(apps[i]) ){
+ //New App
+ LQuickLaunchButton *tmp = new LQuickLaunchButton(apps[i], this);
+ QUICKL << tmp;
+ LFileInfo info(apps[i]);
+ tmp->setIcon( LXDG::findIcon( info.iconfile() ) );
+ if(info.isDesktopFile()){ tmp->setToolTip( info.XDG()->name ); }
+ else{ tmp->setToolTip( info.fileName() ); }
+ //Now add the button to the layout and connect the signal/slots
+ this->layout()->insertWidget(i+1,tmp); //"button" is always in slot 0
+ connect(tmp, SIGNAL(Launch(QString)), this, SLOT(LaunchQuick(QString)) );
+ connect(tmp, SIGNAL(Remove(QString)), this, SLOT(RemoveQuick(QString)) );
+ }
+ }
+ qDebug() << " - Done updateing QuickLaunch Buttons";
+ QTimer::singleShot(0,this, SLOT(OrientationChange())); //Update icons/sizes
+}
+
+void LStartButtonPlugin::LaunchQuick(QString file){
+ //Need to get which button was clicked
+ qDebug() << "Quick Launch triggered:" << file;
+ if(!file.isEmpty()){
+ LSession::LaunchApplication("lumina-open \""+file+"\"");
+ emit MenuClosed();
+ }
+}
+
+void LStartButtonPlugin::RemoveQuick(QString file){
+ qDebug() << "Remove Quicklaunch Button:" << file;
+ if(!file.isEmpty()){
+ startmenu->UpdateQuickLaunch(file, false); //always a removal
+ emit MenuClosed();
+ }
+}
+
+void LStartButtonPlugin::SaveMenuSize(QSize sz){
+ //Save this size for the menu
+ LSession::handle()->DesktopPluginSettings()->setValue("panelPlugs/"+this->type()+"/MenuSize", sz);
+}
+
+// ========================
+// PRIVATE FUNCTIONS
+// ========================
+void LStartButtonPlugin::openMenu(){
+ if(menu->isVisible()){ return; } //don't re-show it - already open
+ startmenu->UpdateMenu();
+ button->showMenu();
+}
+
+void LStartButtonPlugin::closeMenu(){
+ menu->hide();
+}
+
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemstart/LStartButton.h b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/LStartButton.h
new file mode 100644
index 00000000..f549b8d2
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/LStartButton.h
@@ -0,0 +1,111 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This panel plugin is the main button that allow the user to run
+// applications or logout of the desktop
+//===========================================
+#ifndef _LUMINA_DESKTOP_START_MENU_PLUGIN_H
+#define _LUMINA_DESKTOP_START_MENU_PLUGIN_H
+
+// Qt includes
+#include <QMenu>
+#include <QWidgetAction>
+#include <QToolButton>
+#include <QString>
+#include <QWidget>
+#include <QMenu>
+
+// Lumina-desktop includes
+//#include "../../Globals.h"
+#include "../LPPlugin.h" //main plugin widget
+
+// libLumina includes
+#include <LuminaXDG.h>
+#include <LuminaUtils.h>
+
+#include "StartMenu.h"
+
+//Simple Tool Button For QuickLaunch Items
+class LQuickLaunchButton : public QToolButton{
+ Q_OBJECT
+signals:
+ void Launch(QString);
+ void Remove(QString);
+
+private slots:
+ void rmentry(){
+ emit Remove(this->whatsThis());
+ }
+ void launchentry(){
+ emit Launch(this->whatsThis());
+ }
+
+public:
+ LQuickLaunchButton(QString path, QWidget* parent = 0) : QToolButton(parent){
+ this->setWhatsThis(path);
+ this->setMenu(new QMenu(this));
+ this->setContextMenuPolicy(Qt::CustomContextMenu);
+ this->menu()->addAction( LXDG::findIcon("edit-delete",""), tr("Remove from Quicklaunch"), this, SLOT(rmentry()) );
+ connect(this, SIGNAL(clicked()), this, SLOT(launchentry()) );
+ connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showMenu()) );
+ }
+ ~LQuickLaunchButton(){}
+
+};
+
+// PANEL PLUGIN BUTTON
+class LStartButtonPlugin : public LPPlugin{
+ Q_OBJECT
+
+public:
+ LStartButtonPlugin(QWidget *parent = 0, QString id = "systemstart", bool horizontal=true);
+ ~LStartButtonPlugin();
+
+private:
+ ResizeMenu *menu;
+ //QWidgetAction *mact;
+ StartMenu *startmenu;
+ QToolButton *button;
+ QList<LQuickLaunchButton*> QUICKL;
+
+private slots:
+ void openMenu();
+ void closeMenu();
+
+ void updateButtonVisuals();
+
+ void updateQuickLaunch(QStringList);
+ void LaunchQuick(QString);
+ void RemoveQuick(QString);
+ void SaveMenuSize(QSize);
+
+public slots:
+ void OrientationChange(){
+ if(this->layout()->direction()==QBoxLayout::LeftToRight){
+ this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
+ button->setIconSize( QSize(this->height(), this->height()) );
+ for(int i=0; i<QUICKL.length(); i++){ QUICKL[i]->setIconSize(QSize(this->height(), this->height())); }
+ }else{
+ this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
+ button->setIconSize( QSize(this->width(), this->width()) );
+ for(int i=0; i<QUICKL.length(); i++){ QUICKL[i]->setIconSize(QSize(this->width(), this->width())); }
+ }
+ this->layout()->update();
+ updateButtonVisuals();
+ }
+
+ void LocaleChange(){
+ updateButtonVisuals();
+ startmenu->UpdateAll();
+ }
+
+ void ThemeChange(){
+ updateButtonVisuals();
+ startmenu->UpdateAll();
+ }
+};
+
+#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.cpp b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.cpp
new file mode 100644
index 00000000..9f172096
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.cpp
@@ -0,0 +1,576 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "StartMenu.h"
+#include "ui_StartMenu.h"
+//#include <QtConcurrent>
+
+#include <LuminaOS.h>
+#include "../../LSession.h"
+#include <QtConcurrent>
+
+#include "ItemWidget.h"
+//#define SSAVER QString("xscreensaver-demo")
+
+StartMenu::StartMenu(QWidget *parent) : QWidget(parent), ui(new Ui::StartMenu){
+ ui->setupUi(this); //load the designer file
+ this->setMouseTracking(true);
+ sysapps = LSession::handle()->applicationMenu()->currentAppHash();
+ connect(LSession::handle()->applicationMenu(), SIGNAL(AppMenuUpdated()), this, SLOT(UpdateApps()) );
+ //Need to load the last used setting of the application list
+ QString state = LSession::handle()->DesktopPluginSettings()->value("panelPlugs/systemstart/showcategories", "partial").toString();
+ if(state=="partial"){ui->check_apps_showcats->setCheckState(Qt::PartiallyChecked); }
+ else if(state=="true"){ ui->check_apps_showcats->setCheckState(Qt::Checked); }
+ else{ ui->check_apps_showcats->setCheckState(Qt::Unchecked); }
+ connect(ui->check_apps_showcats, SIGNAL(stateChanged(int)), this, SLOT(catViewChanged()) );
+ UpdateAll();
+ QTimer::singleShot(10, this,SLOT(UpdateApps()));
+ QTimer::singleShot(10, this, SLOT(UpdateFavs()));
+}
+
+StartMenu::~StartMenu(){
+
+}
+
+void StartMenu::UpdateAll(){
+ //Update all the icons/text on all the pages
+
+ // Update Text
+ ui->retranslateUi(this);
+
+ //Update Icons
+ ui->tool_goto_apps->setIcon(LXDG::findIcon("system-run",""));
+ ui->tool_goto_settings->setIcon(LXDG::findIcon("preferences-system",""));
+ ui->tool_launch_fm->setIcon(LXDG::findIcon("user-home",""));
+ ui->tool_launch_desksettings->setIcon(LXDG::findIcon("preferences-desktop",""));
+ ui->tool_lock->setIcon(LXDG::findIcon("system-lock-screen",""));
+ ui->tool_goto_logout->setIcon(LXDG::findIcon("system-log-out",""));
+ ui->tool_back->setIcon(LXDG::findIcon("go-previous",""));
+ ui->tool_launch_deskinfo->setIcon(LXDG::findIcon("system-help",""));
+
+ ui->tool_launch_mixer->setIcon( LXDG::findIcon("preferences-desktop-sound","") );
+ ui->label_bright_icon->setPixmap( LXDG::findIcon("preferences-system-power-management","").pixmap(ui->tool_goto_apps->iconSize()) );
+ ui->label_locale_icon->setPixmap( LXDG::findIcon("preferences-desktop-locale","").pixmap(ui->tool_goto_apps->iconSize()) );
+ ui->tool_set_nextwkspace->setIcon(LXDG::findIcon("go-next-view",""));
+ ui->tool_set_prevwkspace->setIcon(LXDG::findIcon("go-previous-view",""));
+ ui->tool_logout->setIcon(LXDG::findIcon("system-log-out",""));
+ ui->tool_restart->setIcon(LXDG::findIcon("system-reboot",""));
+ ui->tool_shutdown->setIcon(LXDG::findIcon("system-shutdown",""));
+ ui->tool_suspend->setIcon(LXDG::findIcon("system-suspend",""));
+
+ //Update Visibility of system/session/OS options
+ // -- Control Panel
+ QString tmp = LOS::ControlPanelShortcut();
+ if(QFile::exists(tmp)){
+ ui->tool_launch_controlpanel->setWhatsThis(tmp);
+ //Now read the file to see which icon to use
+ bool ok = false;
+ XDGDesktop desk = LXDG::loadDesktopFile(tmp, ok);
+ if(ok && LXDG::checkValidity(desk)){
+ ui->tool_launch_controlpanel->setIcon(LXDG::findIcon(desk.icon,"preferences-other"));
+ }else{ ui->tool_launch_controlpanel->setVisible(false); }
+ }else{ ui->tool_launch_controlpanel->setVisible(false); }
+ // -- App Store
+ tmp = LOS::AppStoreShortcut();
+ if(QFile::exists(tmp)){
+ ui->tool_launch_store->setWhatsThis(tmp);
+ //Now read the file to see which icon to use
+ bool ok = false;
+ XDGDesktop desk = LXDG::loadDesktopFile(tmp, ok);
+ if(ok && LXDG::checkValidity(desk)){
+ ui->tool_launch_store->setIcon(LXDG::findIcon(desk.icon,"utilities-file-archiver"));
+ }else{ ui->tool_launch_store->setVisible(false); }
+ }else{ ui->tool_launch_store->setVisible(false); }
+ //Audio Controls
+ ui->frame_audio->setVisible( LOS::audioVolume() >=0 );
+ //Brightness controls
+ ui->frame_bright->setVisible( LOS::ScreenBrightness() >=0 );
+ //Shutdown/restart
+ bool ok = LOS::userHasShutdownAccess();
+ ui->frame_leave_system->setWhatsThis(ok ? "allowed": "");
+ ui->frame_leave_system->setVisible(ok);
+ //Battery Availability
+ ok = LOS::hasBattery();
+ ui->label_status_battery->setWhatsThis(ok ? "allowed": "");
+ ui->label_status_battery->setVisible(ok);
+ //Locale availability
+ QStringList locales = LUtils::knownLocales();
+ ui->stackedWidget->setCurrentWidget(ui->page_main); //need to ensure the settings page is not active
+ ui->combo_locale->clear();
+ QString curr = LUtils::currentLocale();
+ qDebug() << "Update Locales:" << locales;
+ qDebug() << "Current Locale:" << curr;
+ for(int i=0; i<locales.length(); i++){
+ QLocale loc( (locales[i]=="pt") ? "pt_PT" : locales[i] );
+ ui->combo_locale->addItem(loc.nativeLanguageName() +" ("+locales[i]+")", locales[i]); //Make the display text prettier later
+ if(locales[i] == curr || locales[i] == curr.section("_",0,0) ){
+ //Current Locale
+ ui->combo_locale->setCurrentIndex(ui->combo_locale->count()-1); //the last item in the list right now
+ }
+ }
+ ui->frame_locale->setVisible(locales.length() > 1);
+ //User Name in status bar
+ ui->label_status->setText( QString::fromLocal8Bit(getlogin()) );
+ //Lumina Utilities
+ ui->tool_launch_desksettings->setVisible(LUtils::isValidBinary("lumina-config"));
+ ui->tool_launch_deskinfo->setVisible(LUtils::isValidBinary("lumina-info"));
+
+}
+
+void StartMenu::UpdateMenu(bool forceall){
+ if(forceall){ UpdateAll(); }
+ //Quick update routine before the menu is made visible
+ UpdateFavs();
+ if(ui->stackedWidget->currentWidget() != ui->page_main){
+ ui->stackedWidget->setCurrentWidget(ui->page_main); //just show the main page
+ }else{
+ on_stackedWidget_currentChanged(0); //refresh/update the main page every time
+ }
+}
+
+void StartMenu::ReLoadQuickLaunch(){
+ emit UpdateQuickLaunch( LSession::handle()->sessionSettings()->value("QuicklaunchApps",QStringList()).toStringList() );
+}
+
+void StartMenu::UpdateQuickLaunch(QString path, bool keep){
+ QStringList QL = LSession::handle()->sessionSettings()->value("QuicklaunchApps",QStringList()).toStringList();
+ if(keep){QL << path; }
+ else{ QL.removeAll(path); }
+ QL.removeDuplicates();
+ LSession::handle()->sessionSettings()->setValue("QuicklaunchApps",QL);
+ //LSession::handle()->sessionSettings()->sync();
+ emit UpdateQuickLaunch(QL);
+}
+
+// ==========================
+// PRIVATE FUNCTIONS
+// ==========================
+void StartMenu::ClearScrollArea(QScrollArea *area){
+ area->takeWidget()->deleteLater();
+ area->setWidget( new QWidget() ); //create a new widget in the scroll area
+ area->widget()->setContentsMargins(0,0,0,0);
+ QVBoxLayout *layout = new QVBoxLayout;
+ layout->setSpacing(2);
+ layout->setContentsMargins(3,1,3,1);
+ layout->setDirection(QBoxLayout::TopToBottom);
+ layout->setAlignment(Qt::AlignTop);
+ area->widget()->setLayout(layout);
+}
+
+void StartMenu::SortScrollArea(QScrollArea *area){
+ //qDebug() << "Sorting Scroll Area:";
+ //Sort all the items in the scroll area alphabetically
+ QLayout *lay = area->widget()->layout();
+ QStringList items;
+ for(int i=0; i<lay->count(); i++){
+ items << lay->itemAt(i)->widget()->whatsThis();
+ }
+
+ items.sort();
+ //qDebug() << " - Sorted Items:" << items;
+ for(int i=0; i<items.length(); i++){
+ if(items[i].isEmpty()){ continue; }
+ //QLayouts are weird in that they can only add items to the end - need to re-insert almost every item
+ for(int j=0; j<lay->count(); j++){
+ //Find this item
+ if(lay->itemAt(j)->widget()->whatsThis()==items[i]){
+ //Found it - now move it if necessary
+ //qDebug() << "Found Item:" << items[i] << i << j;
+ lay->addItem( lay->takeAt(j) );
+ break;
+ }
+ }
+ }
+}
+
+// ========================
+// PRIVATE SLOTS
+// ========================
+void StartMenu::LaunchItem(QString path, bool fix){
+ if(path.startsWith("chcat::::")){
+ ChangeCategory(path.section("::::",1,50));
+ return;
+ }
+ qDebug() << "Launching Item:" << path << fix;
+ if(!path.isEmpty()){
+ qDebug() << "Launch Application:" << path;
+ if( fix && !path.startsWith("lumina-open") ){ LSession::LaunchApplication("lumina-open \""+path+"\""); }
+ else{ LSession::LaunchApplication(path); }
+ emit CloseMenu(); //so the menu container will close
+ }
+}
+
+void StartMenu::ChangeCategory(QString cat){
+ //This only happens on user interaction - make sure to run the update routine in a separate thread
+ CCat = cat;
+ UpdateApps();
+ //QtConcurrent::run(this, &StartMenu::UpdateApps);
+}
+
+//Listing Update routines
+void StartMenu::UpdateApps(){
+ ClearScrollArea(ui->scroll_apps);
+ //Now assemble the apps list (note: this normally happens in the background - not when it is visible/open)
+ //qDebug() << "Update Apps:" << CCat << ui->check_apps_showcats->checkState();
+ if(ui->check_apps_showcats->checkState() == Qt::PartiallyChecked){
+ //qDebug() << " - Partially Checked";
+ //Show a single page of apps, but still divided up by categories
+ CCat.clear();
+ QStringList cats = sysapps->keys();
+ cats.sort();
+ cats.removeAll("All");
+ for(int c=0; c<cats.length(); c++){
+ QList<XDGDesktop> apps = sysapps->value(cats[c]);
+ if(apps.isEmpty()){ continue; }
+ //Add the category label to the scroll
+ QLabel *catlabel = new QLabel("<b>"+cats[c]+"</b>",ui->scroll_apps->widget());
+ catlabel->setAlignment(Qt::AlignCenter);
+ ui->scroll_apps->widget()->layout()->addWidget(catlabel);
+ //Now add all the apps for this category
+ for(int i=0; i<apps.length(); i++){
+ ItemWidget *it = new ItemWidget(ui->scroll_apps->widget(), apps[i] );
+ if(!it->gooditem){ continue; } //invalid for some reason
+ ui->scroll_apps->widget()->layout()->addWidget(it);
+ connect(it, SIGNAL(NewShortcut()), this, SLOT(UpdateFavs()) );
+ connect(it, SIGNAL(RemovedShortcut()), this, SLOT(UpdateFavs()) );
+ connect(it, SIGNAL(RunItem(QString)), this, SLOT(LaunchItem(QString)) );
+ connect(it, SIGNAL(toggleQuickLaunch(QString, bool)), this, SLOT(UpdateQuickLaunch(QString, bool)) );
+ }
+ }
+
+ }else if(ui->check_apps_showcats->checkState() == Qt::Checked){
+ //qDebug() << " - Checked";
+ //Only show categories to start with - and have the user click-into a cat to see apps
+ if(CCat.isEmpty()){
+ //No cat selected yet - show cats only
+ QStringList cats = sysapps->keys();
+ cats.sort();
+ cats.removeAll("All"); //This is not a "real" category
+ for(int c=0; c<cats.length(); c++){
+ ItemWidget *it = new ItemWidget(ui->scroll_apps->widget(), cats[c], "chcat::::"+cats[c] );
+ if(!it->gooditem){ continue; } //invalid for some reason
+ ui->scroll_apps->widget()->layout()->addWidget(it);
+ connect(it, SIGNAL(RunItem(QString)), this, SLOT(LaunchItem(QString)) );
+ }
+ }else{
+ //qDebug() << "Show Apps For category:" << CCat;
+ //Show the "go back" button
+ ItemWidget *it = new ItemWidget(ui->scroll_apps->widget(), CCat, "chcat::::"+CCat, true);
+ //if(!it->gooditem){ continue; } //invalid for some reason
+ ui->scroll_apps->widget()->layout()->addWidget(it);
+ connect(it, SIGNAL(RunItem(QString)), this, SLOT(LaunchItem(QString)) );
+ //Show apps for this cat
+ QList<XDGDesktop> apps = sysapps->value(CCat);
+ for(int i=0; i<apps.length(); i++){
+ //qDebug() << " - App:" << apps[i].name;
+ ItemWidget *it = new ItemWidget(ui->scroll_apps->widget(), apps[i] );
+ if(!it->gooditem){ continue; } //invalid for some reason
+ ui->scroll_apps->widget()->layout()->addWidget(it);
+ connect(it, SIGNAL(NewShortcut()), this, SLOT(UpdateFavs()) );
+ connect(it, SIGNAL(RemovedShortcut()), this, SLOT(UpdateFavs()) );
+ connect(it, SIGNAL(RunItem(QString)), this, SLOT(LaunchItem(QString)) );
+ connect(it, SIGNAL(toggleQuickLaunch(QString, bool)), this, SLOT(UpdateQuickLaunch(QString, bool)) );
+ }
+ }
+
+ }else{
+ //qDebug() << " - Not Checked";
+ //No categories at all - just alphabetize all the apps
+ QList<XDGDesktop> apps = sysapps->value("All");
+ CCat.clear();
+ //Now add all the apps for this category
+ for(int i=0; i<apps.length(); i++){
+ ItemWidget *it = new ItemWidget(ui->scroll_apps->widget(), apps[i] );
+ if(!it->gooditem){ continue; } //invalid for some reason
+ ui->scroll_apps->widget()->layout()->addWidget(it);
+ connect(it, SIGNAL(NewShortcut()), this, SLOT(UpdateFavs()) );
+ connect(it, SIGNAL(RemovedShortcut()), this, SLOT(UpdateFavs()) );
+ connect(it, SIGNAL(RunItem(QString)), this, SLOT(LaunchItem(QString)) );
+ connect(it, SIGNAL(toggleQuickLaunch(QString, bool)), this, SLOT(UpdateQuickLaunch(QString, bool)) );
+ }
+ }
+
+
+}
+
+void StartMenu::UpdateFavs(){
+ //SYNTAX NOTE: (per-line) "<name>::::[dir/app/<mimetype>]::::<path>"
+ QStringList newfavs = LUtils::listFavorites();
+ if(favs == newfavs){ return; } //nothing to do - same as before
+ favs = newfavs;
+ ClearScrollArea(ui->scroll_favs);
+ favs.sort();
+ //Iterate over types of favorites
+ QStringList rest = favs;
+ QStringList tmp;
+ for(int type = 0; type<3; type++){
+ if(type==0){ tmp = favs.filter("::::app::::"); } //apps first
+ else if(type==1){ tmp = favs.filter("::::dir::::"); } //dirs next
+ else{ tmp = rest; } //everything left over
+ if(type==1){
+ //Need to run a special routine for sorting the apps (already in the widget)
+ // Since each app actually might have a different name listed within the file
+ QLayout *lay = ui->scroll_favs->widget()->layout();
+ QStringList items;
+ for(int i=0; i<lay->count(); i++){
+ items << lay->itemAt(i)->widget()->whatsThis().toLower();
+ }
+
+ items.sort();
+ //qDebug() << " - Sorted Items:" << items;
+ for(int i=0; i<items.length(); i++){
+ if(items[i].isEmpty()){ continue; }
+ //QLayouts are weird in that they can only add items to the end - need to re-insert almost every item
+ for(int j=0; j<lay->count(); j++){
+ //Find this item
+ if(lay->itemAt(j)->widget()->whatsThis().toLower()==items[i]){
+ //Found it - now move it if necessary
+ //qDebug() << "Found Item:" << items[i] << i << j;
+ lay->addItem( lay->takeAt(j) );
+ break;
+ }
+ }
+ }
+ }//end of special app sorting routine
+ tmp.sort(); //Sort alphabetically by name (dirs/files)
+ for(int i=0; i<tmp.length(); i++){
+ if(type<2){ rest.removeAll(tmp[i]); }
+ if(!QFile::exists(tmp[i].section("::::",2,50))){ continue; } //invalid favorite - skip it
+ ItemWidget *it = new ItemWidget(ui->scroll_favs->widget(), tmp[i].section("::::",2,50), tmp[i].section("::::",1,1) );
+ if(!it->gooditem){ continue; } //invalid for some reason
+ ui->scroll_favs->widget()->layout()->addWidget(it);
+ connect(it, SIGNAL(NewShortcut()), this, SLOT(UpdateFavs()) );
+ connect(it, SIGNAL(RemovedShortcut()), this, SLOT(UpdateFavs()) );
+ connect(it, SIGNAL(RunItem(QString)), this, SLOT(LaunchItem(QString)) );
+ connect(it, SIGNAL(toggleQuickLaunch(QString, bool)), this, SLOT(UpdateQuickLaunch(QString, bool)) );
+ }
+ QApplication::processEvents();
+ }
+}
+
+// Page update routines
+void StartMenu::on_stackedWidget_currentChanged(int val){
+ QWidget *page = ui->stackedWidget->widget(val);
+ ui->tool_back->setVisible(page != ui->page_main);
+ ui->line_search->setVisible(false); //not implemented yet
+ //Now the page specific updates
+ if(page == ui->page_main){
+ if(!ui->label_status_battery->whatsThis().isEmpty()){
+ //Battery available - update the status button
+ int charge = LOS::batteryCharge();
+ QString TT, ICON;
+ if(charge < 10){ ICON="-low"; }
+ else if(charge<20){ ICON="-caution"; }
+ else if(charge<40){ ICON="-040"; }
+ else if(charge<60){ ICON="-060"; }
+ else if(charge<80){ ICON="-080"; }
+ else{ ICON="-100"; }
+ if(LOS::batteryIsCharging()){
+ if(charge>=80){ ICON.clear(); } //for charging, there is no suffix to the icon name over 80%
+ ICON.prepend("battery-charging");
+ TT = QString(tr("%1% (Plugged In)")).arg(QString::number(charge));
+ }else{
+ ICON.prepend("battery");
+ int secs = LOS::batterySecondsLeft();
+ if(secs>1){ TT = QString(tr("%1% (%2 Estimated)")).arg(QString::number(charge), LUtils::SecondsToDisplay(secs)); }
+ else{ TT = QString(tr("%1% Remaining")).arg(QString::number(charge)); }
+ }
+ //qDebug() << " Battery Icon:" << ICON << val << TT
+ ui->label_status_battery->setPixmap( LXDG::findIcon(ICON,"").pixmap(ui->tool_goto_apps->iconSize()/2) );
+ ui->label_status_battery->setToolTip(TT);
+ }
+ //Network Status
+ ui->label_status_network->clear(); //not implemented yet
+ }else if(page == ui->page_apps){
+ //Nothing needed for this page explicitly
+ }else if( page == ui->page_settings){
+ // -- Workspaces
+ int tot = LSession::handle()->XCB->NumberOfWorkspaces();
+ if(tot>1){
+ ui->frame_wkspace->setVisible(true);
+ int cur = LSession::handle()->XCB->CurrentWorkspace();
+ ui->label_wkspace->setText( QString(tr("Workspace %1/%2")).arg(QString::number(cur+1), QString::number(tot)) );
+ }else{
+ ui->frame_wkspace->setVisible(false);
+ }
+ // -- Brightness Controls
+ int tmp = LOS::ScreenBrightness();
+ ui->frame_bright->setVisible(tmp >= 0);
+ if(tmp >= 0){ ui->slider_bright->setValue(tmp); }
+ // -- Audio Controls
+ tmp = LOS::audioVolume();
+ ui->frame_audio->setVisible(tmp >= 0);
+ if(tmp >= 0){ ui->slider_volume->setValue(tmp); }
+ }else if(page == ui->page_leave){
+ if( !ui->frame_leave_system->whatsThis().isEmpty() ){
+ //This frame is allowed/visible - need to adjust the shutdown detection
+ bool updating = LOS::systemPerformingUpdates();
+ ui->tool_restart->setEnabled(!updating);
+ ui->tool_shutdown->setEnabled(!updating);
+ ui->label_updating->setVisible(updating); //to let the user know *why* they can't shutdown/restart right now
+ }
+ ui->frame_leave_suspend->setVisible( LOS::systemCanSuspend() );
+ }
+
+}
+
+void StartMenu::catViewChanged(){
+ QString state;
+ switch(ui->check_apps_showcats->checkState()){
+ case Qt::Checked:
+ state = "true";
+ break;
+ case Qt::PartiallyChecked:
+ state = "partial";
+ break;
+ default:
+ state = "false";
+ }
+ LSession::handle()->DesktopPluginSettings()->setValue("panelPlugs/systemstart/showcategories", state);
+ //Now kick off the reload of the apps list
+ UpdateApps();
+ //QtConcurrent::run(this, &StartMenu::UpdateApps); //this was a direct user change - keep it thread safe
+}
+//Page Change Buttons
+void StartMenu::on_tool_goto_apps_clicked(){
+ ui->stackedWidget->setCurrentWidget(ui->page_apps);
+}
+
+void StartMenu::on_tool_goto_settings_clicked(){
+ ui->stackedWidget->setCurrentWidget(ui->page_settings);
+}
+
+void StartMenu::on_tool_goto_logout_clicked(){
+ ui->stackedWidget->setCurrentWidget(ui->page_leave);
+}
+
+void StartMenu::on_tool_back_clicked(){
+ ui->stackedWidget->setCurrentWidget(ui->page_main);
+}
+
+
+//Launch Buttons
+void StartMenu::on_tool_launch_controlpanel_clicked(){
+ LaunchItem(ui->tool_launch_controlpanel->whatsThis());
+}
+
+void StartMenu::on_tool_launch_fm_clicked(){
+ LaunchItem(QDir::homePath());
+}
+
+void StartMenu::on_tool_launch_store_clicked(){
+ LaunchItem(ui->tool_launch_store->whatsThis());
+}
+
+void StartMenu::on_tool_launch_desksettings_clicked(){
+ LaunchItem("lumina-config", false);
+}
+
+void StartMenu::on_tool_launch_deskinfo_clicked(){
+ LaunchItem("lumina-info",false);
+}
+
+//Logout Buttons
+void StartMenu::on_tool_lock_clicked(){
+ QProcess::startDetached("xscreensaver-command -lock");
+}
+
+void StartMenu::on_tool_logout_clicked(){
+ emit CloseMenu();
+ LSession::handle()->StartLogout();
+}
+
+void StartMenu::on_tool_restart_clicked(){
+ emit CloseMenu();
+ LSession::handle()->StartReboot();
+}
+
+void StartMenu::on_tool_shutdown_clicked(){
+ emit CloseMenu();
+ LSession::handle()->StartShutdown();
+}
+
+void StartMenu::on_tool_suspend_clicked(){
+ //Make sure to lock the system first (otherwise anybody can access it again)
+ emit CloseMenu();
+ LUtils::runCmd("xscreensaver-command -lock");
+ LOS::systemSuspend();
+}
+
+
+//Audio Volume
+void StartMenu::on_slider_volume_valueChanged(int val){
+ ui->label_vol->setText(QString::number(val)+"%");
+ LOS::setAudioVolume(val);
+ //Also adjust the icon for the volume
+ if(val<1){ ui->tool_mute_audio->setIcon(LXDG::findIcon("audio-volume-muted","")); }
+ else if(val<33){ ui->tool_mute_audio->setIcon(LXDG::findIcon("audio-volume-low","")); }
+ else if(val<66){ ui->tool_mute_audio->setIcon(LXDG::findIcon("audio-volume-medium","")); }
+ else{ ui->tool_mute_audio->setIcon(LXDG::findIcon("audio-volume-high","")); }
+}
+
+void StartMenu::on_tool_launch_mixer_clicked(){
+ if(LOS::hasMixerUtility()){
+ emit CloseMenu();
+ LOS::startMixerUtility();
+ }
+}
+
+void StartMenu::on_tool_mute_audio_clicked(){
+ static int lastvol = 50;
+ if(ui->slider_volume->value()==0){ ui->slider_volume->setValue(lastvol); }
+ else{
+ lastvol = ui->slider_volume->value();
+ ui->slider_volume->setValue(0);
+ }
+}
+
+//Screen Brightness
+void StartMenu::on_slider_bright_valueChanged(int val){
+ ui->label_bright->setText(QString::number(val)+"%");
+ LOS::setScreenBrightness(val);
+}
+
+
+//Workspace
+void StartMenu::on_tool_set_nextwkspace_clicked(){
+ int cur = LSession::handle()->XCB->CurrentWorkspace();
+ int tot = LSession::handle()->XCB->NumberOfWorkspaces();
+ //qDebug()<< "Next Workspace:" << cur << tot;
+ cur++;
+ if(cur>=tot){ cur = 0; } //back to beginning
+ //qDebug() << " - New Current:" << cur;
+ LSession::handle()->XCB->SetCurrentWorkspace(cur);
+ ui->label_wkspace->setText( QString(tr("Workspace %1/%2")).arg(QString::number(cur+1), QString::number(tot)) );
+}
+
+void StartMenu::on_tool_set_prevwkspace_clicked(){
+ int cur = LSession::handle()->XCB->CurrentWorkspace();
+ int tot = LSession::handle()->XCB->NumberOfWorkspaces();
+ //qDebug()<< "Next Workspace:" << cur << tot;
+ cur--;
+ if(cur<0){ cur = tot-1; } //back to end
+ //qDebug() << " - New Current:" << cur;
+ LSession::handle()->XCB->SetCurrentWorkspace(cur);
+ ui->label_wkspace->setText( QString(tr("Workspace %1/%2")).arg(QString::number(cur+1), QString::number(tot)) );
+}
+
+
+//Locale
+void StartMenu::on_combo_locale_currentIndexChanged(int){
+ //Get the currently selected Locale
+ if(ui->stackedWidget->currentWidget()!=ui->page_settings){ return; }
+ QString locale = ui->combo_locale->currentData().toString();
+ emit CloseMenu();
+ LSession::processEvents();
+ LSession::handle()->switchLocale(locale);
+}
+
+
+//Search
+void StartMenu::on_line_search_editingFinished(){
+
+}
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.h b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.h
new file mode 100644
index 00000000..23aa4c07
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.h
@@ -0,0 +1,99 @@
+//===========================================
+// 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_DESKTOP_SYSTEM_START_PANEL_PLUGIN_H
+#define _LUMINA_DESKTOP_SYSTEM_START_PANEL_PLUGIN_H
+
+#include <QWidget>
+#include <QScrollArea>
+#include <QMouseEvent>
+
+#include <LuminaXDG.h>
+
+namespace Ui{
+ class StartMenu;
+};
+
+class StartMenu : public QWidget{
+ Q_OBJECT
+public:
+ StartMenu(QWidget *parent = 0);
+ ~StartMenu();
+
+public slots:
+ void UpdateAll(); //for re-translation/icon changes
+ void UpdateMenu(bool forceall = false); //for item changes
+
+ void ReLoadQuickLaunch();
+ void UpdateQuickLaunch(QString, bool);
+
+private:
+ Ui::StartMenu *ui;
+ QHash<QString, QList<XDGDesktop> > *sysapps;
+ QStringList favs;
+ QString CCat; //current category
+
+ //Simple utility functions
+ void ClearScrollArea(QScrollArea *area);
+ void SortScrollArea(QScrollArea *area);
+
+private slots:
+ void LaunchItem(QString path, bool fix = true);
+
+ //Application/Favorite Listings
+ void ChangeCategory(QString cat);
+ void UpdateApps();
+ void UpdateFavs();
+
+ // Page update routines
+ void on_stackedWidget_currentChanged(int); //page changed
+ void catViewChanged(); //application categorization view mode changed
+
+ //Page Change Buttons
+ void on_tool_goto_apps_clicked();
+ void on_tool_goto_settings_clicked();
+ void on_tool_goto_logout_clicked();
+ void on_tool_back_clicked();
+
+ //Launch Buttons
+ void on_tool_launch_controlpanel_clicked();
+ void on_tool_launch_fm_clicked();
+ void on_tool_launch_store_clicked();
+ void on_tool_launch_desksettings_clicked();
+ void on_tool_launch_deskinfo_clicked();
+
+ //Logout Buttons
+ void on_tool_lock_clicked();
+ void on_tool_logout_clicked();
+ void on_tool_restart_clicked();
+ void on_tool_shutdown_clicked();
+ void on_tool_suspend_clicked();
+
+ //Audio Volume
+ void on_slider_volume_valueChanged(int);
+ void on_tool_launch_mixer_clicked();
+ void on_tool_mute_audio_clicked();
+
+ //Screen Brightness
+ void on_slider_bright_valueChanged(int);
+
+ //Workspace
+ void on_tool_set_nextwkspace_clicked();
+ void on_tool_set_prevwkspace_clicked();
+
+ //Locale
+ void on_combo_locale_currentIndexChanged(int);
+
+ //Search
+ void on_line_search_editingFinished();
+
+signals:
+ void CloseMenu();
+ void UpdateQuickLaunch(QStringList);
+
+};
+
+#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.ui b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.ui
new file mode 100644
index 00000000..896f1c8b
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.ui
@@ -0,0 +1,1127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>StartMenu</class>
+ <widget class="QWidget" name="StartMenu">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>181</width>
+ <height>405</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">QScrollArea{background: transparent; border: none; }</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="leftMargin">
+ <number>1</number>
+ </property>
+ <property name="topMargin">
+ <number>1</number>
+ </property>
+ <property name="rightMargin">
+ <number>1</number>
+ </property>
+ <property name="bottomMargin">
+ <number>1</number>
+ </property>
+ <item>
+ <widget class="QLineEdit" name="line_search">
+ <property name="placeholderText">
+ <string>Type to search</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QStackedWidget" name="stackedWidget">
+ <property name="currentIndex">
+ <number>2</number>
+ </property>
+ <widget class="QWidget" name="page_main">
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="label_status_battery">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string notr="true">bat%</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_status_network">
+ <property name="text">
+ <string notr="true">netstat</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_status">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="Line" name="line_14">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QScrollArea" name="scroll_favs">
+ <property name="contextMenuPolicy">
+ <enum>Qt::CustomContextMenu</enum>
+ </property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="verticalScrollBarPolicy">
+ <enum>Qt::ScrollBarAsNeeded</enum>
+ </property>
+ <property name="horizontalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOff</enum>
+ </property>
+ <property name="sizeAdjustPolicy">
+ <enum>QAbstractScrollArea::AdjustToContents</enum>
+ </property>
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <widget class="QWidget" name="scrollAreaWidgetContents">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>179</width>
+ <height>169</height>
+ </rect>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_launch_fm">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>Browse Files</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_goto_apps">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>Browse Applications</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_launch_controlpanel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>Control Panel</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_goto_settings">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>Preferences</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </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="Line" name="line_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_6">
+ <item>
+ <widget class="QToolButton" name="tool_goto_logout">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">QToolButton::menu-arrow{ image: rightarrow-icon; }</string>
+ </property>
+ <property name="text">
+ <string>Leave</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="popupMode">
+ <enum>QToolButton::DelayedPopup</enum>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ <property name="arrowType">
+ <enum>Qt::NoArrow</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_lock">
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string notr="true">lock</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_apps">
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="tool_launch_store">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>Manage Applications</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_15">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="check_apps_showcats">
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>Show Categories</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="tristate">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QScrollArea" name="scroll_apps">
+ <property name="horizontalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOff</enum>
+ </property>
+ <property name="sizeAdjustPolicy">
+ <enum>QAbstractScrollArea::AdjustToContents</enum>
+ </property>
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="scrollAreaWidgetContents_2">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>179</width>
+ <height>280</height>
+ </rect>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_5">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_settings">
+ <layout class="QVBoxLayout" name="verticalLayout_9">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_7">
+ <item>
+ <widget class="QToolButton" name="tool_launch_desksettings">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>Configure Desktop</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_launch_deskinfo">
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string notr="true">info</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="Line" name="line_8">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame_audio">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_8">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_5">
+ <item>
+ <widget class="QToolButton" name="tool_mute_audio">
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_11">
+ <item>
+ <widget class="QSlider" name="slider_volume">
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_vol">
+ <property name="text">
+ <string notr="true">vol%</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_launch_mixer">
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="autoRaise">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="Line" name="line_7">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame_bright">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_7">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QLabel" name="label_bright_icon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="slider_bright">
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="minimum">
+ <number>10</number>
+ </property>
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_bright">
+ <property name="text">
+ <string notr="true">br%</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="Line" name="line_9">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame_wkspace">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QToolButton" name="tool_set_prevwkspace">
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string notr="true">prev</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_wkspace">
+ <property name="text">
+ <string notr="true">workspace #</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_set_nextwkspace">
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string notr="true">next</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="Line" name="line_10">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame_locale">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_locale_icon">
+ <property name="text">
+ <string notr="true">Locale:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="combo_locale">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>161</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="Line" name="line_6">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="page_leave">
+ <layout class="QVBoxLayout" name="verticalLayout_6">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>185</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame_leave_suspend">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_10">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="tool_suspend">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>Suspend System</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_11">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame_leave_system">
+ <property name="styleSheet">
+ <string notr="true">QFrame#frame_leave_system{border: none; background: transparent; }</string>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_5">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="tool_restart">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>Restart System</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_shutdown">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>Power Off System</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_updating">
+ <property name="text">
+ <string>(System Performing Updates)</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_13">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_logout">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>Sign Out User</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_12">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_back">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>Qt::NoFocus</enum>
+ </property>
+ <property name="text">
+ <string>Back</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ <property name="arrowType">
+ <enum>Qt::NoArrow</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemtray/LSysTray.cpp b/src-qt5/core/lumina-desktop/panel-plugins/systemtray/LSysTray.cpp
new file mode 100644
index 00000000..b6af4451
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemtray/LSysTray.cpp
@@ -0,0 +1,164 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LSysTray.h"
+#include "../../LSession.h"
+
+LSysTray::LSysTray(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){
+ frame = new QFrame(this);
+ frame->setContentsMargins(0,0,0,0);
+ //frame->setStyleSheet("QFrame{ background: transparent; border: 1px solid transparent; border-radius: 3px; }");
+ LI = new QBoxLayout( this->layout()->direction());
+ frame->setLayout(LI);
+ LI->setAlignment(Qt::AlignCenter);
+ LI->setSpacing(0);
+ LI->setContentsMargins(0,0,0,0);
+ this->layout()->addWidget(frame);
+ this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+ //TrayID=0;
+ upTimer = new QTimer(this);
+ upTimer->setInterval(300000); //maximum time between refreshes is 5 minutes
+ connect(upTimer, SIGNAL(timeout()), this, SLOT(checkAll()) );
+ isRunning = false; stopping = false; checking = false; pending = false;
+ QTimer::singleShot(100, this, SLOT(start()) );
+ //Also do one extra check a minute or so after startup (just in case something got missed in the initial flood of registrations)
+ QTimer::singleShot(90000,this, SLOT(checkAll()) );
+ connect(LSession::handle(), SIGNAL(TrayListChanged()), this, SLOT(checkAll()) );
+ connect(LSession::handle(), SIGNAL(TrayIconChanged(WId)), this, SLOT(UpdateTrayWindow(WId)) );
+ connect(LSession::handle(), SIGNAL(VisualTrayAvailable()), this, SLOT(start()) );
+}
+
+LSysTray::~LSysTray(){
+ if(isRunning){
+ this->stop();
+ }
+}
+
+void LSysTray::start(){
+ if(isRunning || stopping){ return; } //already running
+ isRunning = LSession::handle()->registerVisualTray(this->winId());
+ qDebug() << "Visual Tray Started:" << this->type() << isRunning;
+ if(isRunning){
+ //upTimer->start();
+ QTimer::singleShot(0,this, SLOT(checkAll()) );
+ }
+}
+
+void LSysTray::stop(){
+ if(!isRunning){ return; }
+ stopping = true;
+ upTimer->stop();
+ //Now close down the system tray registry
+ qDebug() << "Stop visual system tray:" << this->type();
+ //LX11::closeSystemTray(TrayID);
+ //TrayID = 0;
+ disconnect(this); //remove any signals/slots
+ isRunning = false;
+ //Release all the tray applications and delete the containers
+ if( !LSession::handle()->currentTrayApps(this->winId()).isEmpty() ){
+ qDebug() << " - Remove tray applications";
+ //This overall system tray is not closed down - go ahead and release them here
+ for(int i=(trayIcons.length()-1); i>=0; i--){
+ trayIcons[i]->detachApp();
+ TrayIcon *cont = trayIcons.takeAt(i);
+ LI->removeWidget(cont);
+ cont->deleteLater();
+ }
+ }
+ //Now let some other visual tray take over
+ LSession::handle()->unregisterVisualTray(this->winId());
+ qDebug() << "Done stopping visual tray";
+}
+
+// ========================
+// PRIVATE FUNCTIONS
+// ========================
+void LSysTray::checkAll(){
+ if(!isRunning || stopping || checking){ pending = true; return; } //Don't check if not running at the moment
+ checking = true;
+ pending = false;
+ //Make sure this tray should handle the windows (was not disabled in the backend)
+ bool TrayRunning = LSession::handle()->registerVisualTray(this->winId());
+ //qDebug() << "System Tray: Check tray apps";
+ QList<WId> wins = LSession::handle()->currentTrayApps(this->winId());
+ for(int i=0; i<trayIcons.length(); i++){
+ int index = wins.indexOf(trayIcons[i]->appID());
+ if(index < 0){
+ //Tray Icon no longer exists: remove it
+ qDebug() << " - Visual System Tray: Remove Icon:" << trayIcons[i]->appID();
+ TrayIcon *cont = trayIcons.takeAt(i);
+ cont->cleanup();
+ LI->removeWidget(cont);
+ cont->deleteLater();
+ i--; //List size changed
+ //Re-adjust the maximum widget size to account for what is left
+ if(this->layout()->direction()==QBoxLayout::LeftToRight){
+ this->setMaximumSize( trayIcons.length()*this->height(), 10000);
+ }else{
+ this->setMaximumSize(10000, trayIcons.length()*this->width());
+ }
+ }else{
+ //Tray Icon already exists
+ //qDebug() << " - SysTray: Update Icon";
+ trayIcons[i]->update();
+ wins.removeAt(index); //Already found - remove from the list
+ }
+ }
+ //Now go through any remaining windows and add them
+ for(int i=0; i<wins.length() && TrayRunning; i++){
+ qDebug() << " - Visual System Tray: Add Icon:" << wins[i];
+ TrayIcon *cont = new TrayIcon(this);
+ connect(cont, SIGNAL(BadIcon()), this, SLOT(checkAll()) );
+ //LSession::processEvents();
+ trayIcons << cont;
+ LI->addWidget(cont);
+ //qDebug() << " - Update tray layout";
+ if(this->layout()->direction()==QBoxLayout::LeftToRight){
+ cont->setSizeSquare(this->height()-2-2*frame->frameWidth()); //horizontal tray
+ this->setMaximumSize( trayIcons.length()*this->height(), 10000);
+ }else{
+ cont->setSizeSquare(this->width()-2-2*frame->frameWidth()); //vertical tray
+ this->setMaximumSize(10000, trayIcons.length()*this->width());
+ }
+ //LSession::processEvents();
+ //qDebug() << " - Attach tray app";
+ cont->attachApp(wins[i]);
+ if(cont->appID()==0){
+ //could not attach window - remove the widget
+ qDebug() << " - Invalid Tray App: Could Not Embed:";
+ trayIcons.takeAt(trayIcons.length()-1); //Always at the end
+ LI->removeWidget(cont);
+ cont->deleteLater();
+ continue;
+ }
+ LI->update(); //make sure there is no blank space in the layout
+ }
+ /*if(listChanged){
+ //Icons got moved around: be sure to re-draw all of them to fix visuals
+ for(int i=0; i<trayIcons.length(); i++){
+ trayIcons[i]->update();
+ }
+ }*/
+ //qDebug() << " - System Tray: check done";
+ checking = false;
+ if(pending){ QTimer::singleShot(0,this, SLOT(checkAll()) ); }
+}
+
+void LSysTray::UpdateTrayWindow(WId win){
+ if(!isRunning || stopping || checking){ return; }
+ for(int i=0; i<trayIcons.length(); i++){
+ if(trayIcons[i]->appID()==win){
+ //qDebug() << "System Tray: Update Window " << win;
+ trayIcons[i]->repaint(); //don't use update() because we need an instant repaint (not a cached version)
+ return; //finished now
+ }
+ }
+ //Could not find tray in the list, run the checkall routine to make sure we are not missing any
+ //qDebug() << "System Tray: Missing Window - check all";
+ QTimer::singleShot(0,this, SLOT(checkAll()) );
+}
+
+
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemtray/LSysTray.h b/src-qt5/core/lumina-desktop/panel-plugins/systemtray/LSysTray.h
new file mode 100644
index 00000000..84cde5c9
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemtray/LSysTray.h
@@ -0,0 +1,73 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_SYSTRAY_H
+#define _LUMINA_DESKTOP_SYSTRAY_H
+
+//Qt includes
+#include <QFrame>
+#include <QHBoxLayout>
+#include <QDebug>
+#include <QX11Info>
+#include <QCoreApplication>
+
+//Local includes
+#include "../LPPlugin.h"
+#include "TrayIcon.h"
+
+//SYSTEM TRAY STANDARD DEFINITIONS
+#define SYSTEM_TRAY_REQUEST_DOCK 0
+#define SYSTEM_TRAY_BEGIN_MESSAGE 1
+#define SYSTEM_TRAY_CANCEL_MESSAGE 2
+
+class LSysTray : public LPPlugin{
+ Q_OBJECT
+public:
+ LSysTray(QWidget *parent = 0, QString id="systemtray", bool horizontal=true);
+ ~LSysTray();
+
+ virtual void AboutToClose(){
+ this->stop();
+ }
+
+private:
+ bool isRunning, stopping, checking, pending;
+ QList<TrayIcon*> trayIcons;
+ QFrame *frame;
+ QBoxLayout *LI; //layout items
+ QTimer *upTimer; //manual timer to force refresh of all items
+
+private slots:
+ void checkAll();
+ void UpdateTrayWindow(WId win);
+
+ //void removeTrayIcon(WId win);
+
+public slots:
+ void start();
+ void stop();
+
+ virtual void OrientationChange(){
+ //make sure the internal layout has the same orientation as the main widget
+ LI->setDirection( this->layout()->direction() );
+ //Re-adjust the maximum widget size
+ int sz;
+ if(this->layout()->direction()==QBoxLayout::LeftToRight){
+ this->setMaximumSize( trayIcons.length()*this->height(), 10000);
+ sz = this->height()-2*frame->frameWidth();
+ }else{
+ this->setMaximumSize(10000, trayIcons.length()*this->width());
+ sz = this->width()-2*frame->frameWidth();
+ }
+ for(int i=0; i<trayIcons.length(); i++){
+ trayIcons[i]->setSizeSquare(sz);
+ trayIcons[i]->repaint();
+ }
+ }
+
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemtray/TrayIcon.cpp b/src-qt5/core/lumina-desktop/panel-plugins/systemtray/TrayIcon.cpp
new file mode 100644
index 00000000..9fdbce50
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemtray/TrayIcon.cpp
@@ -0,0 +1,128 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "TrayIcon.h"
+
+#include <LSession.h>
+#include <QScreen>
+#include <LuminaX11.h>
+
+TrayIcon::TrayIcon(QWidget *parent) : QWidget(parent){
+ AID = 0; //nothing yet
+ IID = 0;
+ dmgID = 0;
+ badpaints = 0;
+ //this->setLayout(new QHBoxLayout);
+ //this->layout()->setContentsMargins(0,0,0,0);
+}
+
+TrayIcon::~TrayIcon(){
+}
+
+void TrayIcon::cleanup(){
+ AID = IID = 0;
+}
+
+WId TrayIcon::appID(){
+ return AID;
+}
+
+void TrayIcon::attachApp(WId id){
+ if(id==0){ return; } //nothing to attach
+ else if(AID!=0){ qWarning() << "Tray Icon is already attached to a window!"; return; }
+ AID = id;
+ //WIN = QWindow::fromWinId(AID);
+ //connect(WIN, SIGNAL(
+ //this->layout()->addWidget( QWidget::createWindowContainer(WIN, this) );
+ IID = this->winId(); //embed directly into this widget
+ dmgID = LSession::handle()->XCB->EmbedWindow(AID, IID);
+ if( dmgID != 0 ){
+ LSession::handle()->XCB->RestoreWindow(AID); //make it visible
+ //qDebug() << "New System Tray App:" << AID;
+ QTimer::singleShot(1000, this, SLOT(updateIcon()) );
+ }else{
+ //qWarning() << "Could not Embed Tray Application:" << AID;
+ IID = 0;
+ AID = 0;
+ }
+}
+
+void TrayIcon::setSizeSquare(int side){
+ //qDebug() << " Set Fixed Systray size:" << side;
+ this->setFixedSize( QSize(side, side) );
+}
+
+// ==============
+// PUBLIC SLOTS
+// ==============
+void TrayIcon::detachApp(){
+ if(AID==0){ return; } //already detached
+ //qDebug() << "Detach App:" << AID;
+ //Temporarily move the AID, so that internal slots do not auto-run
+ WId tmp = AID;
+ AID = 0;
+ //Now detach the application window and clean up
+ //qDebug() << " - Unembed";
+ //WIN->setParent(0); //Reset parentage back to the main stack
+ LSession::handle()->XCB->UnembedWindow(tmp);
+ //qDebug() << " - finished app:" << tmp;
+ IID = 0;
+}
+
+// ==============
+// PRIVATE SLOTS
+// ==============
+void TrayIcon::updateIcon(){
+ if(AID==0){ return; }
+ //Make sure the icon is square
+ QSize icosize = this->size();
+ LSession::handle()->XCB->ResizeWindow(AID, icosize.width(), icosize.height());
+ QTimer::singleShot(500, this, SLOT(update()) ); //make sure to re-draw the window in a moment
+}
+
+// =============
+// PROTECTED
+// =============
+void TrayIcon::paintEvent(QPaintEvent *event){
+ QWidget::paintEvent(event); //make sure the background is already painted
+ if(AID!=0){
+ //Update the background on the tray app
+ //qDebug() << "Paint Tray Background";
+ //LSession::handle()->XCB->SetWindowBackground(this, this->geometry(), AID);
+ //qDebug() << "Paint Tray:" << AID;
+ QPainter painter(this);
+ //Now paint the tray app on top of the background
+ //qDebug() << " - Draw tray:" << AID << IID << this->winId();
+ //qDebug() << " - - " << event->rect().x() << event->rect().y() << event->rect().width() << event->rect().height();
+ //qDebug() << " - Get image:" << AID;
+ QPixmap pix = LSession::handle()->XCB->TrayImage(AID); //= WIN->icon().pixmap(this->size());
+
+ //qDebug() << " - Pix size:" << pix.size().width() << pix.size().height();
+ //qDebug() << " - Geom:" << this->geometry().x() << this->geometry().y() << this->geometry().width() << this->geometry().height();
+ if(!pix.isNull()){
+ if(this->size() != pix.size()){ QTimer::singleShot(10, this, SLOT(updateIcon())); }
+ painter.drawPixmap(0,0,this->width(), this->height(), pix.scaled(this->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation) );
+ badpaints = 0; //good paint
+ }else{
+ badpaints++;
+ if(badpaints>5){
+ qWarning() << " - - No Tray Icon/Image found!" << "ID:" << AID;
+ AID = 0; //reset back to nothing
+ IID = 0;
+ emit BadIcon(); //removed/destroyed in some non-valid way?
+ }
+ }
+ //qDebug() << " - Done";
+ }
+}
+
+void TrayIcon::resizeEvent(QResizeEvent *event){
+ //qDebug() << "Resize Event:" << event->size().width() << event->size().height();
+ if(AID!=0){
+ LSession::handle()->XCB->ResizeWindow(AID, event->size());
+ QTimer::singleShot(500, this, SLOT(update()) ); //make sure to re-draw the window in a moment
+ }
+}
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemtray/TrayIcon.h b/src-qt5/core/lumina-desktop/panel-plugins/systemtray/TrayIcon.h
new file mode 100644
index 00000000..5d072cc1
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemtray/TrayIcon.h
@@ -0,0 +1,55 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// Note: The basic idea behind this class that that it puts the app window
+// in the same spot as the tray icon (to directly pass mouse events and such),
+// while keeping the tray icon visual in sync with the app window
+//===========================================
+#ifndef _LUMINA_PANEL_PLUGIN_SYSTEM_TRAY_ICON_H
+#define _LUMINA_PANEL_PLUGIN_SYSTEM_TRAY_ICON_H
+
+//Qt includes
+#include <QWidget>
+#include <QTimer>
+#include <QPaintEvent>
+#include <QMoveEvent>
+#include <QResizeEvent>
+#include <QPainter>
+#include <QPixmap>
+#include <QImage>
+//#include <QWindow>
+// libLumina includes
+//#include <LuminaX11.h>
+
+class TrayIcon : public QWidget{
+ Q_OBJECT
+public:
+ TrayIcon(QWidget* parent = 0);
+ ~TrayIcon();
+
+ void cleanup(); //about to be removed after window was detroyed
+
+ WId appID(); //the ID for the attached application
+ void attachApp(WId id);
+ void setSizeSquare(int side);
+
+public slots:
+ void detachApp();
+ void updateIcon();
+
+private:
+ WId IID, AID; //icon ID and app ID
+ int badpaints;
+ uint dmgID;
+
+protected:
+ void paintEvent(QPaintEvent *event);
+ void resizeEvent(QResizeEvent *event);
+
+signals:
+ void BadIcon();
+};
+#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskButton.cpp b/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskButton.cpp
new file mode 100644
index 00000000..a67ef5d6
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskButton.cpp
@@ -0,0 +1,238 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LTaskButton.h"
+#include "LSession.h"
+
+#ifndef DEBUG
+#define DEBUG 0
+#endif
+
+LTaskButton::LTaskButton(QWidget *parent, bool smallDisplay) : LTBWidget(parent){
+ actMenu = new QMenu(this);
+ winMenu = new QMenu(this);
+ UpdateMenus();
+ showText = !smallDisplay;
+ this->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+ this->setAutoRaise(false); //make sure these always look like buttons
+ this->setContextMenuPolicy(Qt::CustomContextMenu);
+ this->setFocusPolicy(Qt::NoFocus);
+ this->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
+ winMenu->setContextMenuPolicy(Qt::CustomContextMenu);
+ connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(openActionMenu()) );
+ connect(this, SIGNAL(clicked()), this, SLOT(buttonClicked()) );
+ connect(winMenu, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(openActionMenu()) );
+ connect(winMenu, SIGNAL(triggered(QAction*)), this, SLOT(winClicked(QAction*)) );
+ connect(winMenu, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed()));
+ connect(actMenu, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed()));
+}
+
+LTaskButton::~LTaskButton(){
+
+}
+
+//===========
+// PUBLIC
+//===========
+QList<WId> LTaskButton::windows(){
+ QList<WId> list;
+ for(int i=0; i<WINLIST.length(); i++){
+ list << WINLIST[i].windowID();
+ }
+ return list;
+}
+
+QString LTaskButton::classname(){
+ return cname;
+}
+
+bool LTaskButton::isActive(){
+ return cstate == LXCB::ACTIVE;
+}
+
+void LTaskButton::addWindow(WId win){
+ WINLIST << LWinInfo(win);
+ UpdateButton();
+}
+
+void LTaskButton::rmWindow(WId win){
+ for(int i=0; i<WINLIST.length(); i++){
+ if(WINLIST[i].windowID() == win){
+ WINLIST.removeAt(i);
+ break;
+ }
+ }
+ UpdateButton();
+}
+
+//==========
+// PRIVATE
+//==========
+LWinInfo LTaskButton::currentWindow(){
+ if(WINLIST.length() == 1 || cWin.windowID()==0){
+ return WINLIST[0]; //only 1 window - this must be it
+ }else{
+ return cWin;
+ }
+}
+
+//=============
+// PUBLIC SLOTS
+//=============
+void LTaskButton::UpdateButton(){
+ if(winMenu->isVisible()){ return; } //skip this if the window menu is currently visible for now
+ bool statusOnly = (WINLIST.length() == LWINLIST.length());
+ LWINLIST = WINLIST;
+
+ winMenu->clear();
+ LXCB::WINDOWVISIBILITY showstate = LXCB::IGNORE;
+ for(int i=0; i<WINLIST.length(); i++){
+ if(WINLIST[i].windowID() == 0){
+ WINLIST.removeAt(i);
+ i--;
+ continue;
+ }
+ if(i==0 && !statusOnly){
+ //Update the button visuals from the first window
+ this->setIcon(WINLIST[i].icon(noicon));
+ cname = WINLIST[i].Class();
+ if(cname.isEmpty()){
+ //Special case (chrome/chromium does not register *any* information with X except window title)
+ cname = WINLIST[i].text();
+ if(cname.contains(" - ")){ cname = cname.section(" - ",-1); }
+ }
+ this->setToolTip(cname);
+ }
+ bool junk;
+ QAction *tmp = winMenu->addAction( WINLIST[i].icon(junk), WINLIST[i].text() );
+ tmp->setData(i); //save which number in the WINLIST this entry is for
+ LXCB::WINDOWVISIBILITY stat = WINLIST[i].status(true); //update the saved state for the window
+ if(stat<LXCB::ACTIVE && WINLIST[i].windowID() == LSession::handle()->activeWindow()){ stat = LXCB::ACTIVE; }
+ if(stat > showstate){ showstate = stat; } //higher priority
+ }
+ //Now setup the button appropriately
+ // - visibility
+ if(showstate == LXCB::IGNORE || WINLIST.length() < 1){ this->setVisible(false); }
+ else{ this->setVisible(true); }
+ // - functionality
+ if(WINLIST.length() == 1){
+ //single window
+ this->setPopupMode(QToolButton::DelayedPopup);
+ this->setMenu(actMenu);
+ if(showText){ this->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); this->setText( WINLIST[0].text()); }
+ else if(noicon){ this->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); this->setText( cname ); }
+ else{ this->setToolButtonStyle(Qt::ToolButtonIconOnly); this->setText(""); }
+ this->setToolTip(WINLIST[0].text());
+ }else if(WINLIST.length() > 1){
+ //multiple windows
+ this->setPopupMode(QToolButton::InstantPopup);
+ this->setMenu(winMenu);
+ this->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+ if(noicon || showText){ "("+QString::number(WINLIST.length())+") "+cname; }
+ else{ this->setText("("+QString::number(WINLIST.length())+")"); }
+ }
+ this->setState(showstate); //Make sure this is after the button setup so that it properly sets the margins/etc
+ cstate = showstate; //save this for later
+}
+
+void LTaskButton::UpdateMenus(){
+ //Action menu should be auto-created for the state of the current window (cWin/cstate)
+ actMenu->clear();
+ if(cstate!=LXCB::ACTIVE){
+ actMenu->addAction( LXDG::findIcon("edit-select",""), tr("Activate Window"), this, SLOT(triggerWindow()) );
+ }
+ if(cstate!=LXCB::INVISIBLE){
+ actMenu->addAction( LXDG::findIcon("view-close",""), tr("Minimize Window"), this, SLOT(minimizeWindow()) );
+ if(LSession::handle()->XCB->WindowIsMaximized(cWin.windowID()) ){
+ actMenu->addAction( LXDG::findIcon("view-restore",""), tr("Restore Window"), this, SLOT(maximizeWindow()) );
+ }else{
+ actMenu->addAction( LXDG::findIcon("view-fullscreen",""), tr("Maximize Window"), this, SLOT(maximizeWindow()) );
+ }
+ }
+ actMenu->addAction( LXDG::findIcon("window-close",""), tr("Close Window"), this, SLOT(closeWindow()) );
+}
+
+//=============
+// PRIVATE SLOTS
+//=============
+void LTaskButton::buttonClicked(){
+ if(WINLIST.length() > 1){
+ winMenu->popup(QCursor::pos());
+ }else{
+ triggerWindow();
+ }
+}
+
+void LTaskButton::closeWindow(){
+ if(DEBUG){ qDebug() << "Close Window:" << this->text(); }
+ if(winMenu->isVisible()){ winMenu->hide(); }
+ LWinInfo win = currentWindow();
+ LSession::handle()->XCB->CloseWindow(win.windowID());
+ cWin = LWinInfo(); //clear the current
+}
+
+void LTaskButton::maximizeWindow(){
+ if(DEBUG){ qDebug() << "Maximize Window:" << this->text(); }
+ if(winMenu->isVisible()){ winMenu->hide(); }
+ LWinInfo win = currentWindow();
+ LSession::handle()->XCB->MaximizeWindow(win.windowID());
+ //LSession::handle()->adjustWindowGeom(win.windowID(), true); //run this for now until the WM works properly
+ cWin = LWinInfo(); //clear the current
+}
+
+void LTaskButton::minimizeWindow(){
+ if(DEBUG){ qDebug() << "Minimize Window:" << this->text(); }
+ if(winMenu->isVisible()){ winMenu->hide(); }
+ LWinInfo win = currentWindow();
+ LSession::handle()->XCB->MinimizeWindow(win.windowID());
+ cWin = LWinInfo(); //clear the current
+ QTimer::singleShot(100, this, SLOT(UpdateButton()) ); //make sure to update this button if losing active status
+}
+
+void LTaskButton::triggerWindow(){
+ LWinInfo win = currentWindow();
+ //Check which state the window is currently in and flip it to the other
+ //LXCB::WINDOWSTATE state = cstate;
+ //if(DEBUG){ qDebug() << "Window State: " << state; }
+ if(cstate == LXCB::ACTIVE){
+ if(DEBUG){ qDebug() << "Minimize Window:" << this->text(); }
+ LSession::handle()->XCB->MinimizeWindow(win.windowID());
+ QTimer::singleShot(100, this, SLOT(UpdateButton()) ); //make sure to update this button if losing active status
+ }else{
+ if(DEBUG){ qDebug() << "Activate Window:" << this->text(); }
+ LSession::handle()->XCB->ActivateWindow(win.windowID());
+ }
+ cWin = LWinInfo(); //clear the current
+}
+
+void LTaskButton::winClicked(QAction* act){
+ //Get the window from the action
+ if(act->data().toInt() < WINLIST.length()){
+ cWin = WINLIST[act->data().toInt()];
+ cstate = cWin.status();
+ }else{ cWin = LWinInfo(); } //clear it
+ //Now trigger the window
+ triggerWindow();
+}
+
+void LTaskButton::openActionMenu(){
+ //Get the Window the mouse is currently over
+ QPoint curpos = QCursor::pos();
+ QAction *act = winMenu->actionAt(winMenu->mapFromGlobal(curpos));
+ //qDebug() << "Button Context Menu:" << curpos.x() << curpos.y() << winMenu->geometry().x() << winMenu->geometry().y() << winMenu->geometry().width() << winMenu->geometry().height();
+ cWin = WINLIST[0]; //default to the first window
+ if( act != 0 && winMenu->isVisible() ){
+ //Get the window from the action
+ //qDebug() << "Found Action:" << act->data().toInt();
+ if(act->data().toInt() < WINLIST.length()){
+ cWin = WINLIST[act->data().toInt()];
+ }
+ }
+ cstate = cWin.status();
+ //Now show the action menu
+ UpdateMenus();
+ actMenu->popup(QCursor::pos());
+}
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskButton.h b/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskButton.h
new file mode 100644
index 00000000..43dbaa90
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskButton.h
@@ -0,0 +1,70 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_TASK_BUTTON_H
+#define _LUMINA_DESKTOP_TASK_BUTTON_H
+
+// Qt includes
+#include <QWidget>
+#include <QList>
+#include <QIcon>
+#include <QCursor>
+#include <QMenu>
+#include <QEvent>
+#include <QAction>
+
+// libLumina includes
+#include <LuminaXDG.h>
+#include <LuminaX11.h>
+
+// Local includes
+#include "../../LWinInfo.h"
+#include "../LTBWidget.h"
+
+class LTaskButton : public LTBWidget{
+ Q_OBJECT
+public:
+ LTaskButton(QWidget *parent=0, bool smallDisplay = true);
+ ~LTaskButton();
+
+ //Window Information
+ QList<WId> windows();
+ QString classname();
+ bool isActive();
+
+ //Window Management
+ void addWindow(WId win); //Add a window to this button
+ void rmWindow(WId win); //Remove a window from this button
+
+private:
+ QList<LWinInfo> WINLIST;
+ QList<LWinInfo> LWINLIST;
+ QMenu *actMenu; // action menu (custom context menu)
+ QMenu *winMenu; // window menu (if more than 1)
+ LWinInfo cWin;
+ QString cname; //class name for the entire button
+ bool noicon, showText;
+
+ LWinInfo currentWindow(); //For getting the currently-active window
+ LXCB::WINDOWVISIBILITY cstate; //current state of the button
+
+public slots:
+ void UpdateButton(); //re-sync the current window infomation
+ void UpdateMenus(); //re-create the menus (text + icons)
+
+private slots:
+ void buttonClicked();
+ void closeWindow(); //send the signal to close a window
+ void maximizeWindow(); //send the signal to maximize/restore a window
+ void minimizeWindow(); //send the signal to minimize a window (iconify)
+ void triggerWindow(); //change b/w visible and invisible
+ void winClicked(QAction*);
+ void openActionMenu();
+
+signals:
+ void MenuClosed();
+};
+#endif
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskManagerPlugin.cpp b/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskManagerPlugin.cpp
new file mode 100644
index 00000000..3e31a534
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskManagerPlugin.cpp
@@ -0,0 +1,129 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LTaskManagerPlugin.h"
+#include "../../LSession.h"
+
+LTaskManagerPlugin::LTaskManagerPlugin(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){
+ timer = new QTimer(this);
+ timer->setSingleShot(true);
+ timer->setInterval(10); // 1/100 second
+ connect(timer, SIGNAL(timeout()), this, SLOT(UpdateButtons()) );
+ usegroups = true; //backwards-compatible default value
+ if(id.contains("-nogroups")){ usegroups = false; }
+ connect(LSession::handle(), SIGNAL(WindowListEvent()), this, SLOT(checkWindows()) );
+ connect(LSession::handle(), SIGNAL(WindowListEvent(WId)), this, SLOT(UpdateButton(WId)) );
+ this->layout()->setContentsMargins(0,0,0,0);
+ QTimer::singleShot(0,this, SLOT(UpdateButtons()) ); //perform an initial sync
+ //QTimer::singleShot(100,this, SLOT(OrientationChange()) ); //perform an initial sync
+}
+
+LTaskManagerPlugin::~LTaskManagerPlugin(){
+
+}
+
+//==============
+// PRIVATE SLOTS
+//==============
+void LTaskManagerPlugin::UpdateButtons(){
+ updating = QDateTime::currentDateTime(); //global time stamp
+ QDateTime ctime = updating; //current thread time stamp
+
+ //Get the current window list
+ QList<WId> winlist = LSession::handle()->XCB->WindowList();
+ //Do not change the status of the previously active window if it just changed to a non-visible window
+ //WId activeWin = LSession::handle()->XCB->ActiveWindow();
+ //bool skipActive = !winlist.contains(activeWin);
+ //qDebug() << "Update Buttons:" << winlist;
+ if(updating > ctime){ return; } //another thread kicked off already - stop this one
+ //Now go through all the current buttons first
+ for(int i=0; i<BUTTONS.length(); i++){
+ //Get the windows managed in this button
+ QList<WId> WI = BUTTONS[i]->windows();
+ bool updated=false;
+ if(updating > ctime){ return; } //another thread kicked off already - stop this one
+ //Loop over all the windows for this button
+ for(int w=0; w<WI.length(); w++){
+ if(updating > ctime){ return; } //another thread kicked off already - stop this one
+ if( winlist.contains( WI[w] ) ){
+ //Still current window - update it later
+ winlist.removeAll(WI[w] ); //remove this window from the list since it is done
+ }else{
+ //Window was closed - remove it
+ if(WI.length()==1){
+ //Remove the entire button
+ //qDebug() << "Window Closed: Remove Button" ;
+ this->layout()->takeAt(i); //remove from the layout
+ BUTTONS.takeAt(i)->deleteLater();
+ i--;
+ updated = true; //prevent updating a removed button
+ break; //break out of the button->window loop
+ }else{
+ //qDebug() << "Window Closed: Remove from button:" << WI[w].windowID() << "Button:" << w;
+ BUTTONS[i]->rmWindow(WI[w]); // one of the multiple windows for the button
+ WI.removeAt(w); //remove this window from the list
+ w--;
+ }
+ updated=true; //button already changed
+ }
+ if(updating > ctime){ return; } //another thread kicked off already - stop this one
+ }
+ if(!updated){
+ //qDebug() << "Update Button:" << i;
+ if(updating > ctime){ return; } //another thread kicked off already - stop this one
+ //if(!skipActive || !BUTTONS[i]->isActive()){
+ QTimer::singleShot(1,BUTTONS[i], SLOT(UpdateButton()) ); //keep moving on
+ //}
+ }
+ }
+ //Now go through the remaining windows
+ for(int i=0; i<winlist.length(); i++){
+ //New windows, create buttons for each (add grouping later)
+ if(updating > ctime){ return; } //another thread kicked off already - stop this one
+ //Check for a button that this can just be added to
+ QString ctxt = LSession::handle()->XCB->WindowClass(winlist[i]);
+ bool found = false;
+ for(int b=0; b<BUTTONS.length(); b++){
+ if(updating > ctime){ return; } //another thread kicked off already - stop this one
+ if(BUTTONS[b]->classname()== ctxt && usegroups){
+ //This adds a window to an existing group
+ found = true;
+ //qDebug() << "Add Window to Button:" << b;
+ BUTTONS[b]->addWindow(winlist[i]);
+ break;
+ }
+ }
+ if(!found){
+ if(updating > ctime){ return; } //another thread kicked off already - stop this one
+ //No group, create a new button
+ //qDebug() << "New Button";
+ LTaskButton *but = new LTaskButton(this, usegroups);
+ but->addWindow( winlist[i] );
+ if(this->layout()->direction()==QBoxLayout::LeftToRight){
+ but->setIconSize(QSize(this->height(), this->height()));
+ }else{
+ but->setIconSize(QSize(this->width(), this->width()));
+ }
+ this->layout()->addWidget(but);
+ connect(but, SIGNAL(MenuClosed()), this, SIGNAL(MenuClosed()));
+ BUTTONS << but;
+ }
+ }
+}
+
+void LTaskManagerPlugin::UpdateButton(WId win){
+ for(int i=0; i<BUTTONS.length(); i++){
+ if(BUTTONS[i]->windows().contains(win)){
+ qDebug() << "Update Task Manager Button (single window ping)";
+ QTimer::singleShot(0,BUTTONS[i], SLOT(UpdateButton()) );
+ break;
+ }
+ }
+}
+
+void LTaskManagerPlugin::checkWindows(){
+ timer->start();
+}
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskManagerPlugin.h b/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskManagerPlugin.h
new file mode 100644
index 00000000..e6371f34
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskManagerPlugin.h
@@ -0,0 +1,71 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_TASK_MANAGER_PLUGIN_H
+#define _LUMINA_DESKTOP_TASK_MANAGER_PLUGIN_H
+
+// Qt includes
+#include <QWidget>
+#include <QList>
+#include <QString>
+#include <QDebug>
+#include <QTimer>
+#include <QEvent>
+#include <QDateTime>
+
+// libLumina includes
+#include <LuminaX11.h>
+
+// Local includes
+#include "LTaskButton.h"
+#include "LWinInfo.h"
+#include "../LPPlugin.h"
+
+class LTaskManagerPlugin : public LPPlugin{
+ Q_OBJECT
+public:
+ LTaskManagerPlugin(QWidget *parent=0, QString id="taskmanager", bool horizontal=true);
+ ~LTaskManagerPlugin();
+
+private:
+ QList<LTaskButton*> BUTTONS; //to keep track of the current buttons
+ QTimer *timer;
+ QDateTime updating; //quick flag for if it is currently working
+ bool usegroups;
+
+private slots:
+ void UpdateButtons();
+ void UpdateButton(WId win);
+ void checkWindows();
+
+public slots:
+ void LocaleChange(){
+ UpdateButtons();
+ }
+ void ThemeChange(){
+ UpdateButtons();
+ }
+ void OrientationChange(){
+ if(this->layout()->direction()==QBoxLayout::LeftToRight){ //horizontal
+ this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ this->layout()->setAlignment(Qt::AlignLeft);
+ QSize sz(this->height(), this->height());
+ for(int i=0; i<BUTTONS.length(); i++){
+ BUTTONS[i]->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+ BUTTONS[i]->setIconSize(sz);
+ }
+ }else{ //vertical
+ this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
+ this->layout()->setAlignment(Qt::AlignTop);
+ QSize sz(this->width(), this->width());
+ for(int i=0; i<BUTTONS.length(); i++){
+ BUTTONS[i]->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
+ BUTTONS[i]->setIconSize(sz);
+ }
+ }
+ }
+};
+#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/userbutton/LUserButton.cpp b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/LUserButton.cpp
new file mode 100644
index 00000000..1fefa304
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/LUserButton.cpp
@@ -0,0 +1,57 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LUserButton.h"
+#include "../../LSession.h"
+
+LUserButtonPlugin::LUserButtonPlugin(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){
+ button = new QToolButton(this);
+ button->setAutoRaise(true);
+ button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+ button->setPopupMode(QToolButton::DelayedPopup); //make sure it runs the update routine first
+ connect(button, SIGNAL(clicked()), this, SLOT(openMenu()));
+ this->layout()->setContentsMargins(0,0,0,0);
+ this->layout()->addWidget(button);
+ menu = new QMenu(this);
+ menu->setContentsMargins(1,1,1,1);
+ connect(menu, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed()));
+ usermenu = new UserWidget(this);
+ connect(usermenu, SIGNAL(CloseMenu()), this, SLOT(closeMenu()) );
+ mact = new QWidgetAction(this);
+ mact->setDefaultWidget(usermenu);
+ menu->addAction(mact);
+
+ button->setMenu(menu);
+ connect(menu, SIGNAL(aboutToHide()), this, SLOT(updateButtonVisuals()) );
+ QTimer::singleShot(0,this, SLOT(OrientationChange())); //Update icons/sizes
+}
+
+LUserButtonPlugin::~LUserButtonPlugin(){
+
+}
+
+void LUserButtonPlugin::updateButtonVisuals(){
+ button->setToolTip(tr("Quickly launch applications or open files"));
+ button->setText( SYSTEM::user() );
+ if( QFile::exists(QDir::homePath()+"/.loginIcon.png") ){
+ button->setIcon( QIcon(QDir::homePath()+"/.loginIcon.png") );
+ }else{
+ button->setIcon( LXDG::findIcon("user-identity", ":/images/default-user.png") ); //force icon refresh
+ }
+}
+
+// ========================
+// PRIVATE FUNCTIONS
+// ========================
+void LUserButtonPlugin::openMenu(){
+ usermenu->UpdateMenu();
+ button->showMenu();
+}
+
+void LUserButtonPlugin::closeMenu(){
+ menu->hide();
+}
+
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/userbutton/LUserButton.h b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/LUserButton.h
new file mode 100644
index 00000000..ca835bfe
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/LUserButton.h
@@ -0,0 +1,74 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This panel plugin is the main button that allow the user to run
+// applications or logout of the desktop
+//===========================================
+#ifndef _LUMINA_DESKTOP_USER_MENU_PLUGIN_H
+#define _LUMINA_DESKTOP_USER_MENU_PLUGIN_H
+
+// Qt includes
+#include <QMenu>
+#include <QWidgetAction>
+#include <QToolButton>
+#include <QString>
+#include <QWidget>
+
+
+// Lumina-desktop includes
+//#include "../../Globals.h"
+#include "../LPPlugin.h" //main plugin widget
+
+// libLumina includes
+#include "LuminaXDG.h"
+
+#include "UserWidget.h"
+
+// PANEL PLUGIN BUTTON
+class LUserButtonPlugin : public LPPlugin{
+ Q_OBJECT
+
+public:
+ LUserButtonPlugin(QWidget *parent = 0, QString id = "userbutton", bool horizontal=true);
+ ~LUserButtonPlugin();
+
+private:
+ QMenu *menu;
+ QWidgetAction *mact;
+ UserWidget *usermenu;
+ QToolButton *button;
+
+private slots:
+ void openMenu();
+ void closeMenu();
+
+ void updateButtonVisuals();
+
+public slots:
+ void OrientationChange(){
+ if(this->layout()->direction()==QBoxLayout::LeftToRight){
+ this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
+ button->setIconSize( QSize(this->height(), this->height()) );
+ }else{
+ this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
+ button->setIconSize( QSize(this->width(), this->width()) );
+ }
+ this->layout()->update();
+ updateButtonVisuals();
+ }
+
+ void LocaleChange(){
+ updateButtonVisuals();
+ usermenu->UpdateAll();
+ }
+
+ void ThemeChange(){
+ updateButtonVisuals();
+ usermenu->UpdateAll();
+ }
+};
+
+#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserItemWidget.cpp b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserItemWidget.cpp
new file mode 100644
index 00000000..1d32440a
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserItemWidget.cpp
@@ -0,0 +1,204 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "UserItemWidget.h"
+#include <LuminaUtils.h>
+#include <QMenu>
+
+#define TEXTCUTOFF 165
+UserItemWidget::UserItemWidget(QWidget *parent, QString itemPath, QString type, bool goback) : QFrame(parent){
+ createWidget();
+ //Now fill it appropriately
+ bool inHome = type.endsWith("-home"); //internal code
+ if(inHome){ type = type.remove("-home"); }
+ if(itemPath.endsWith(".desktop") || type=="app"){
+ bool ok = false;
+ XDGDesktop item = LXDG::loadDesktopFile(itemPath, ok);
+ if(ok && LXDG::checkValidity(item) ){
+ icon->setPixmap( LXDG::findIcon(item.icon, "preferences-system-windows-actions").pixmap(32,32) );
+ name->setText( this->fontMetrics().elidedText(item.name, Qt::ElideRight, TEXTCUTOFF) );
+ setupActions(item);
+ }else{
+ gooditem = false;
+ return;
+ }
+ }else if(type=="dir"){
+ actButton->setVisible(false);
+ if(itemPath.endsWith("/")){ itemPath.chop(1); }
+ if(goback){
+ icon->setPixmap( LXDG::findIcon("go-previous","").pixmap(32,32) );
+ name->setText( tr("Go Back") );
+ }else{
+ icon->setPixmap( LXDG::findIcon("folder","").pixmap(32,32) );
+ name->setText( this->fontMetrics().elidedText(itemPath.section("/",-1), Qt::ElideRight, TEXTCUTOFF) );
+ }
+ }else{
+ actButton->setVisible(false);
+ if(itemPath.endsWith("/")){ itemPath.chop(1); }
+ if(QFileInfo(itemPath).isDir()){
+ type = "dir";
+ icon->setPixmap( LXDG::findIcon("folder","").pixmap(32,32) );
+ }else if(LUtils::imageExtensions().contains(itemPath.section("/",-1).section(".",-1).toLower()) ){
+ icon->setPixmap( QIcon(itemPath).pixmap(32,32) );
+ }else{
+ icon->setPixmap( LXDG::findMimeIcon(itemPath.section("/",-1)).pixmap(32,32) );
+ }
+ name->setText( this->fontMetrics().elidedText(itemPath.section("/",-1), Qt::ElideRight, TEXTCUTOFF) );
+ }
+ icon->setWhatsThis(itemPath);
+ if(!goback){ this->setWhatsThis(name->text()); }
+ isDirectory = (type=="dir"); //save this for later
+ if(LUtils::isFavorite(itemPath)){
+ linkPath = itemPath;
+ isShortcut=true;
+ }else if( inHome ){//|| itemPath.section("/",0,-2)==QDir::homePath()+"/Desktop" ){
+ isShortcut = true;
+ }else{
+ isShortcut = false;
+ }
+ //Now setup the button appropriately
+ setupButton(goback);
+}
+
+UserItemWidget::UserItemWidget(QWidget *parent, XDGDesktop item) : QFrame(parent){
+ createWidget();
+ isDirectory = false;
+ if(LUtils::isFavorite(item.filePath)){
+ linkPath = item.filePath;
+ isShortcut=true;
+ }else if( item.filePath.section("/",0,-2)==QDir::homePath()+"/Desktop" ){
+ isShortcut = true;
+ }else{
+ isShortcut = false;
+ }
+ //Now fill it appropriately
+ icon->setPixmap( LXDG::findIcon(item.icon,"preferences-system-windows-actions").pixmap(32,32) );
+ name->setText( this->fontMetrics().elidedText(item.name, Qt::ElideRight, TEXTCUTOFF) );
+ this->setWhatsThis(name->text());
+ icon->setWhatsThis(item.filePath);
+ //Now setup the buttons appropriately
+ setupButton();
+ setupActions(item);
+}
+
+UserItemWidget::~UserItemWidget(){
+ delete button;
+ delete icon;
+ delete name;
+}
+
+
+void UserItemWidget::createWidget(){
+ //Initialize the widgets
+ gooditem = true;
+ menuopen = false;
+ menureset = new QTimer(this);
+ menureset->setSingleShot(true);
+ menureset->setInterval(1000); //1 second
+ this->setContentsMargins(0,0,0,0);
+ button = new QToolButton(this);
+ button->setIconSize( QSize(14,14) );
+ button->setAutoRaise(true);
+ actButton = new QToolButton(this);
+ actButton->setPopupMode(QToolButton::InstantPopup);
+ actButton->setFixedSize( QSize(17,34) );
+ actButton->setArrowType(Qt::DownArrow);
+ icon = new QLabel(this);
+ icon->setFixedSize( QSize(34,34) );
+ name = new QLabel(this);
+ //Add them to the layout
+ this->setLayout(new QHBoxLayout());
+ this->layout()->setContentsMargins(1,1,1,1);
+ this->layout()->addWidget(icon);
+ this->layout()->addWidget(actButton);
+ this->layout()->addWidget(name);
+ this->layout()->addWidget(button);
+ //Set a custom object name so this can be tied into the Lumina Theme stylesheets
+ this->setObjectName("LuminaUserItemWidget");
+ //Install the stylesheet
+ //this->setStyleSheet("UserItemWidget{ background: transparent; border-radius: 5px;} UserItemWidget::hover{ background: rgba(255,255,255,200); border-radius: 5px; }");
+}
+
+void UserItemWidget::setupButton(bool disable){
+ //if(isDirectory){ qDebug() << "Directory Entry:" << isShortcut << linkPath << icon->whatsThis(); }
+
+ if(disable){
+ button->setVisible(false);
+ }else if(isShortcut && !linkPath.isEmpty()){ //Favorite Item - can always remove this
+ button->setWhatsThis("remove");
+ button->setIcon( LXDG::findIcon("list-remove","") );
+ button->setToolTip(tr("Remove Shortcut"));
+ connect(button, SIGNAL(clicked()), this, SLOT(buttonClicked()) );
+ }else if(isShortcut){ //Physical File/Dir - can remove
+ button->setWhatsThis("remove");
+ button->setIcon( LXDG::findIcon("user-trash","") );
+ button->setToolTip(tr("Delete File"));
+ connect(button, SIGNAL(clicked()), this, SLOT(buttonClicked()) );
+ }else if(!isShortcut){// if( !QFile::exists( QDir::homePath()+"/Desktop/"+icon->whatsThis().section("/",-1) ) && !LUtils::isFavorite(icon->whatsThis() ) ){
+ //This file does not have a shortcut yet -- allow the user to add it
+ button->setWhatsThis("add");
+ button->setIcon( LXDG::findIcon("bookmark-toolbar","") );
+ button->setToolTip(tr("Create Shortcut"));
+ connect(button, SIGNAL(clicked()), this, SLOT(buttonClicked()) );
+ }else{
+ //This already has a desktop shortcut -- no special actions
+ button->setVisible(false);
+ }
+ if(isShortcut){
+ name->setToolTip(icon->whatsThis()); //also allow the user to see the full shortcut path
+ }
+}
+
+void UserItemWidget::setupActions(XDGDesktop app){
+ if(app.actions.isEmpty()){ actButton->setVisible(false); return; }
+ //Actions Available - go ahead and list them all
+ actButton->setMenu( new QMenu(this) );
+ for(int i=0; i<app.actions.length(); i++){
+ QAction *act = new QAction(LXDG::findIcon(app.actions[i].icon, app.icon), app.actions[i].name, this);
+ act->setToolTip(app.actions[i].ID);
+ act->setWhatsThis(app.actions[i].ID);
+ actButton->menu()->addAction(act);
+ }
+ connect(actButton->menu(), SIGNAL(triggered(QAction*)), this, SLOT(actionClicked(QAction*)) );
+ connect(actButton->menu(), SIGNAL(aboutToShow()), this, SLOT(actionMenuOpen()) );
+ connect(actButton->menu(), SIGNAL(aboutToHide()), this, SLOT(actionMenuClosed()) );
+ connect(menureset, SIGNAL(timeout()), this, SLOT(resetmenuflag()) );
+}
+
+void UserItemWidget::buttonClicked(){
+ button->setVisible(false);
+ if(button->whatsThis()=="add"){
+ LUtils::addFavorite(icon->whatsThis());
+ //QFile::link(icon->whatsThis(), QDir::homePath()+"/.lumina/favorites/"+icon->whatsThis().section("/",-1) );
+ emit NewShortcut();
+ }else if(button->whatsThis()=="remove"){
+ if(linkPath.isEmpty()){
+ //This is a desktop file
+ if(isDirectory){
+ QProcess::startDetached("rm -r \""+icon->whatsThis()+"\"");
+ }else{
+ QFile::remove(icon->whatsThis());
+ }
+ //Don't emit the RemovedShortcut signal here - the automatic ~/Desktop watcher will see the change when finished
+ }else{
+ LUtils::removeFavorite(icon->whatsThis()); //This is a favorite
+ emit RemovedShortcut();
+ }
+ }
+}
+
+void UserItemWidget::ItemClicked(){
+ if(!linkPath.isEmpty()){ emit RunItem(linkPath); }
+ else{ emit RunItem(icon->whatsThis()); }
+}
+
+void UserItemWidget::actionClicked(QAction *act){
+ actButton->menu()->hide();
+ QString cmd = "lumina-open -action \""+act->whatsThis()+"\" \"%1\"";
+ if(!linkPath.isEmpty()){ cmd = cmd.arg(linkPath); }
+ else{ cmd = cmd.arg(icon->whatsThis()); }
+ emit RunItem(cmd);
+} \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserItemWidget.h b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserItemWidget.h
new file mode 100644
index 00000000..2251344c
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserItemWidget.h
@@ -0,0 +1,72 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This item widget manages a single file/directory
+//===========================================
+#ifndef _LUMINA_PANEL_USER_ITEM_WIDGET_H
+#define _LUMINA_PANEL_USER_ITEM_WIDGET_H
+
+#include <QFrame>
+#include <QLabel>
+#include <QToolButton>
+#include <QString>
+#include <QHBoxLayout>
+#include <QSize>
+#include <QDir>
+#include <QFile>
+#include <QMouseEvent>
+#include <QAction>
+#include <QMenu>
+#include <QTimer>
+
+#include <LuminaXDG.h>
+
+class UserItemWidget : public QFrame{
+ Q_OBJECT
+public:
+ UserItemWidget(QWidget *parent=0, QString itemPath="", QString type="unknown", bool goback=false);
+ UserItemWidget(QWidget *parent=0, XDGDesktop item= XDGDesktop());
+ ~UserItemWidget();
+
+ bool gooditem;
+private:
+ QToolButton *button, *actButton;
+ QLabel *icon, *name;
+ bool isDirectory, isShortcut, menuopen;
+ QString linkPath;
+ QTimer *menureset;
+
+ void createWidget();
+ void setupButton(bool disable = false);
+ void setupActions(XDGDesktop);
+
+private slots:
+ void buttonClicked();
+ void ItemClicked();
+ void actionClicked(QAction*);
+ //Functions to fix the submenu open/close issues
+ void actionMenuOpen(){
+ if(menureset->isActive()){ menureset->stop(); }
+ menuopen = true;
+ }
+ void resetmenuflag(){ menuopen = false; } //tied to the "menureset" timer
+ void actionMenuClosed(){ menureset->start(); }
+
+
+protected:
+ void mouseReleaseEvent(QMouseEvent *event){
+ if(menuopen){ resetmenuflag(); } //skip this event if a submenu was open
+ else if(event->button() != Qt::NoButton){ ItemClicked(); }
+ }
+
+signals:
+ void NewShortcut();
+ void RemovedShortcut();
+ void RunItem(QString cmd);
+
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.cpp b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.cpp
new file mode 100644
index 00000000..f1f9d03e
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.cpp
@@ -0,0 +1,385 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014-2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "UserWidget.h"
+#include "ui_UserWidget.h"
+#include "../../LSession.h"
+#include "../../AppMenu.h"
+
+UserWidget::UserWidget(QWidget* parent) : QTabWidget(parent), ui(new Ui::UserWidget){
+ ui->setupUi(this);
+ updatingfavs = false;
+ if(parent!=0){ parent->setMouseTracking(true); }
+ this->setMouseTracking(true);
+ sysapps = LSession::handle()->applicationMenu()->currentAppHash(); //get the raw info
+
+ //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()) );
+ connect(ui->combo_app_cats, SIGNAL(currentIndexChanged(int)), this, SLOT(updateApps()) );
+ connect(ui->tool_home_gohome, SIGNAL(clicked()), this, SLOT(slotGoHome()) );
+ connect(ui->tool_home_browse, SIGNAL(clicked()), this, SLOT(slotOpenDir()) );
+ connect(ui->tool_home_search, SIGNAL(clicked()), this, SLOT(slotOpenSearch()) );
+ connect(ui->tool_config_about, SIGNAL(clicked()), this, SLOT(openLuminaInfo()) );
+
+ //Setup the special buttons
+ connect(ui->tool_app_store, SIGNAL(clicked()), this, SLOT(openStore()) );
+ connect(ui->tool_controlpanel, SIGNAL(clicked()), this, SLOT(openControlPanel()) );
+ //connect(ui->tool_qtconfig, SIGNAL(clicked()), this, SLOT(openQtConfig()) );
+
+ lastUpdate = QDateTime(); //make sure it refreshes
+
+ connect(LSession::handle()->applicationMenu(), SIGNAL(AppMenuUpdated()), this, SLOT(UpdateMenu()) );
+ connect(QApplication::instance(), SIGNAL(DesktopFilesChanged()), this, SLOT(updateFavItems()) );
+ QTimer::singleShot(10,this, SLOT(UpdateAll())); //make sure to load this once after initialization
+}
+
+UserWidget::~UserWidget(){
+}
+
+//===========
+// PRIVATE
+//===========
+void UserWidget::ClearScrollArea(QScrollArea *area){
+ QWidget *wgt = area->takeWidget();
+ delete wgt; //delete the widget and all children
+ area->setWidget( new QWidget() ); //create a new widget in the scroll area
+ area->widget()->setContentsMargins(0,0,0,0);
+ QVBoxLayout *layout = new QVBoxLayout;
+ layout->setSpacing(2);
+ layout->setContentsMargins(3,1,3,1);
+ layout->setDirection(QBoxLayout::TopToBottom);
+ layout->setAlignment(Qt::AlignTop);
+ area->widget()->setLayout(layout);
+}
+
+void UserWidget::SortScrollArea(QScrollArea *area){
+ //qDebug() << "Sorting Scroll Area:";
+ //Sort all the items in the scroll area alphabetically
+ QLayout *lay = area->widget()->layout();
+ QStringList items;
+ for(int i=0; i<lay->count(); i++){
+ items << lay->itemAt(i)->widget()->whatsThis().toLower();
+ }
+
+ items.sort();
+ //qDebug() << " - Sorted Items:" << items;
+ for(int i=0; i<items.length(); i++){
+ if(items[i].isEmpty()){ continue; }
+ //QLayouts are weird in that they can only add items to the end - need to re-insert almost every item
+ for(int j=0; j<lay->count(); j++){
+ //Find this item
+ if(lay->itemAt(j)->widget()->whatsThis().toLower()==items[i]){
+ //Found it - now move it if necessary
+ //qDebug() << "Found Item:" << items[i] << i << j;
+ lay->addItem( lay->takeAt(j) );
+ break;
+ }
+ }
+ }
+
+}
+
+QIcon UserWidget::rotateIcon(QIcon ico){
+ //Rotate the given icon to appear vertical in the tab widget
+ QPixmap pix = ico.pixmap(32,32);
+ QTransform tran;
+ tran.rotate(+90); //For tabs on the left/West
+ pix = pix.transformed(tran);
+ ico = QIcon(pix);
+ return ico;
+}
+
+//============
+// PRIVATE SLOTS
+//============
+void UserWidget::UpdateAll(){
+ ui->retranslateUi(this);
+ //Setup the Icons
+ // - favorites tab
+ this->setTabIcon(0, rotateIcon(LXDG::findIcon("folder-favorites","")) );
+ this->setTabText(0,"");
+ // - apps tab
+ this->setTabIcon(1, rotateIcon(LXDG::findIcon("system-run","")) );
+ this->setTabText(1,"");
+ // - home tab
+ this->setTabIcon(2, rotateIcon(LXDG::findIcon("user-home","")) );
+ this->setTabText(2,"");
+ // - config tab
+ this->setTabIcon(3, rotateIcon(LXDG::findIcon("preferences-system","")) );
+ this->setTabText(3,"");
+ ui->tool_fav_apps->setIcon( LXDG::findIcon("system-run","") );
+ ui->tool_fav_dirs->setIcon( LXDG::findIcon("folder","") );
+ 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_home_search->setIcon( LXDG::findIcon("system-search","") );
+ ui->tool_config_about->setIcon( LXDG::findIcon("lumina","") );
+
+ //Setup the special buttons
+ QString APPSTORE = LOS::AppStoreShortcut();
+ if(QFile::exists(APPSTORE) && !APPSTORE.isEmpty()){
+ //Now load the info
+ bool ok = false;
+ XDGDesktop store = LXDG::loadDesktopFile(APPSTORE, ok);
+ if(ok){
+ ui->tool_app_store->setIcon( LXDG::findIcon(store.icon, "") );
+ ui->tool_app_store->setText( store.name );
+ }
+ ui->tool_app_store->setVisible(ok); //availability
+ }else{
+ ui->tool_app_store->setVisible(false); //not available
+ }
+ QString CONTROLPANEL = LOS::ControlPanelShortcut();
+ if(QFile::exists(CONTROLPANEL) && !CONTROLPANEL.isEmpty()){
+ //Now load the info
+ bool ok = false;
+ XDGDesktop cpan = LXDG::loadDesktopFile(CONTROLPANEL, ok);
+ if(ok){
+ ui->tool_controlpanel->setIcon( LXDG::findIcon(cpan.icon, "") );
+ }
+ ui->tool_controlpanel->setVisible(ok); //availability
+ }else{
+ ui->tool_controlpanel->setVisible(false); //not available
+ }
+ /*QString QTCONFIG = LOS::QtConfigShortcut();
+ if(QFile::exists(QTCONFIG) && !QTCONFIG.isEmpty()){
+ ui->tool_qtconfig->setVisible(true);
+ ui->tool_qtconfig->setIcon( LXDG::findIcon("preferences-desktop-theme","") );
+ }else{
+ ui->tool_qtconfig->setVisible(false);
+ }*/
+ //Now update the menus
+ UpdateMenu();
+}
+
+void UserWidget::UpdateMenu(bool forceall){
+ this->setCurrentWidget(ui->tab_fav);
+ ui->tool_fav_apps->setChecked(true);
+ ui->tool_fav_dirs->setChecked(false);
+ ui->tool_fav_files->setChecked(false);
+ cfav = 0; //favorite apps
+ updateFavItems();
+ QString cdir = ui->label_home_dir->whatsThis();
+ if(cdir.isEmpty() || !QFile::exists(cdir)){
+ //Directory deleted or nothing loaded yet
+ ui->label_home_dir->setWhatsThis(QDir::homePath());
+ QTimer::singleShot(0,this, SLOT(updateHome()) );
+ }else if( lastUpdate < QFileInfo(cdir).lastModified() || forceall){
+ //Directory contents changed - reload it
+ QTimer::singleShot(0,this, SLOT(updateHome()) );
+ }
+ if(lastUpdate < LSession::handle()->applicationMenu()->lastHashUpdate || lastUpdate.isNull() || forceall){
+ updateAppCategories();
+ QTimer::singleShot(0,this, SLOT(updateApps()) );
+ }
+ lastUpdate = QDateTime::currentDateTime();
+}
+
+void UserWidget::LaunchItem(QString path, bool fix){
+ if(!path.isEmpty()){
+ qDebug() << "Launch Application:" << path;
+ if( fix && !path.startsWith("lumina-open") ){ LSession::LaunchApplication("lumina-open \""+path+"\""); }
+ else{ LSession::LaunchApplication(path); }
+ emit CloseMenu(); //so the menu container will close
+ }
+}
+
+void UserWidget::FavChanged(){
+ //uncheck the current item for a moment
+ int oldfav = cfav;
+ if(cfav==0){ ui->tool_fav_apps->setChecked(false); }
+ else if(cfav==1){ ui->tool_fav_dirs->setChecked(false); }
+ if(cfav==2){ ui->tool_fav_files->setChecked(false); }
+ //Now check what other item is now the only one checked
+ if(ui->tool_fav_apps->isChecked() && !ui->tool_fav_dirs->isChecked() && !ui->tool_fav_files->isChecked() ){
+ cfav = 0;
+ }else if(!ui->tool_fav_apps->isChecked() && ui->tool_fav_dirs->isChecked() && !ui->tool_fav_files->isChecked() ){
+ cfav = 1;
+ }else if(!ui->tool_fav_apps->isChecked() && !ui->tool_fav_dirs->isChecked() && ui->tool_fav_files->isChecked() ){
+ cfav = 2;
+ }else{
+ //Re-check the old item (something invalid)
+ ui->tool_fav_apps->setChecked(cfav==0);
+ ui->tool_fav_dirs->setChecked(cfav==1);
+ ui->tool_fav_files->setChecked(cfav==2);
+ }
+ updateFavItems(oldfav!=cfav);
+}
+
+void UserWidget::updateFavItems(bool newfilter){
+ if(updatingfavs){ return; }
+ updatingfavs = true;
+ //qDebug() << "Updating User Favorite Items";
+ QStringList newfavs = LUtils::listFavorites();
+ //qDebug() << "Favorites:" << newfavs;
+ if(lastHomeUpdate.isNull() || (QFileInfo(QDir::homePath()+"/Desktop").lastModified() > lastHomeUpdate) || newfavs!=favs ){
+ favs = newfavs;
+
+ homefiles = LSession::handle()->DesktopFiles();
+ lastHomeUpdate = QDateTime::currentDateTime();
+ }else if(!newfilter){ updatingfavs = false; return; } //nothing new to change - stop now
+ //qDebug() << " - Passed Smoke Test...";
+ QStringList favitems;
+ //Remember for format for favorites: <name>::::[app/dir/<mimetype>]::::<full path>
+ if(ui->tool_fav_apps->isChecked()){
+ favitems = favs.filter("::::app::::");
+ for(int i=0; i<homefiles.length(); i++){
+ if(homefiles[i].fileName().endsWith(".desktop")){
+ favitems << homefiles[i].fileName()+"::::app-home::::"+homefiles[i].absoluteFilePath();
+ }
+ }
+ }else if(ui->tool_fav_dirs->isChecked()){
+ favitems = favs.filter("::::dir::::");
+ for(int i=0; i<homefiles.length(); i++){
+ if(homefiles[i].isDir()){
+ favitems << homefiles[i].fileName()+"::::dir-home::::"+homefiles[i].absoluteFilePath();
+ }
+ }
+ }else{
+ //Files
+ for(int i=0; i<favs.length(); i++){
+ QString type = favs[i].section("::::",1,1);
+ if(type != "app" && type !="dir"){
+ favitems << favs[i];
+ }
+ }
+ for(int i=0; i<homefiles.length(); i++){
+ if(!homefiles[i].isDir() && !homefiles[i].fileName().endsWith(".desktop") ){
+ favitems << homefiles[i].fileName()+"::::"+LXDG::findAppMimeForFile(homefiles[i].fileName())+"-home::::"+homefiles[i].absoluteFilePath();
+ }
+ }
+ }
+ ClearScrollArea(ui->scroll_fav);
+ //qDebug() << " - Sorting Items";
+ favitems.sort(); //sort them alphabetically
+ //qDebug() << " - Creating Items:" << favitems;
+ for(int i=0; i<favitems.length(); i++){
+ UserItemWidget *it = new UserItemWidget(ui->scroll_fav->widget(), favitems[i].section("::::",2,50), favitems[i].section("::::",1,1) );
+ if(!it->gooditem){ continue; }
+ ui->scroll_fav->widget()->layout()->addWidget(it);
+ connect(it, SIGNAL(RunItem(QString)), this, SLOT(LaunchItem(QString)) );
+ connect(it, SIGNAL(NewShortcut()), this, SLOT(updateFavItems()) );
+ connect(it, SIGNAL(RemovedShortcut()), this, SLOT(updateFavItems()) );
+ QApplication::processEvents(); //keep the UI snappy - might be a number of these
+ }
+ SortScrollArea(ui->scroll_fav);
+ updatingfavs = false;
+ //qDebug() << " - Done";
+}
+
+//Apps Tab
+void UserWidget::updateAppCategories(){
+ ui->combo_app_cats->clear();
+ QStringList cats = sysapps->keys();
+ cats.sort();
+ for(int i=0; i<cats.length(); i++){
+ QString name, icon;
+ if(cats[i] == "All"){ name = tr("All"); icon = "application-x-executable"; }
+ else if(cats[i] == "Multimedia"){ name = tr("Multimedia"); icon = "applications-multimedia"; }
+ else if(cats[i] == "Development"){ name = tr("Development"); icon = "applications-development"; }
+ else if(cats[i] == "Education"){ name = tr("Education"); icon = "applications-education"; }
+ else if(cats[i] == "Game"){ name = tr("Games"); icon = "applications-games"; }
+ else if(cats[i] == "Graphics"){ name = tr("Graphics"); icon = "applications-graphics"; }
+ else if(cats[i] == "Network"){ name = tr("Network"); icon = "applications-internet"; }
+ else if(cats[i] == "Office"){ name = tr("Office"); icon = "applications-office"; }
+ else if(cats[i] == "Science"){ name = tr("Science"); icon = "applications-science"; }
+ else if(cats[i] == "Settings"){ name = tr("Settings"); icon = "preferences-system"; }
+ else if(cats[i] == "System"){ name = tr("System"); icon = "applications-system"; }
+ else if(cats[i] == "Utility"){ name = tr("Utilities"); icon = "applications-utilities"; }
+ else if(cats[i] == "Wine"){ name = tr("Wine"); icon = "wine"; }
+ else{ name = tr("Unsorted"); icon = "applications-other"; }
+ ui->combo_app_cats->addItem( LXDG::findIcon(icon,""), name, cats[i] );
+ }
+}
+
+void UserWidget::updateApps(){
+ if(ui->combo_app_cats->currentIndex() < 0){ return; } //no cat
+ QString cat = ui->combo_app_cats->itemData( ui->combo_app_cats->currentIndex() ).toString();
+ QList<XDGDesktop> items = sysapps->value(cat);
+ ClearScrollArea(ui->scroll_apps);
+ for(int i=0; i<items.length(); i++){
+ UserItemWidget *it = new UserItemWidget(ui->scroll_apps->widget(), items[i]);
+ ui->scroll_apps->widget()->layout()->addWidget(it);
+ connect(it, SIGNAL(RunItem(QString)), this, SLOT(LaunchItem(QString)) );
+ connect(it, SIGNAL(NewShortcut()), this, SLOT(updateFavItems()) );
+ connect(it, SIGNAL(RemovedShortcut()), this, SLOT(updateFavItems()) );
+ QApplication::processEvents(); //keep the UI snappy - might be a number of these
+ }
+}
+
+//Home Tab
+void UserWidget::updateHome(){
+ ClearScrollArea(ui->scroll_home);
+ QDir homedir(ui->label_home_dir->whatsThis());
+ QStringList items;
+ if(QDir::homePath() == homedir.absolutePath()){
+ ui->label_home_dir->setText(tr("Home"));
+ ui->tool_home_gohome->setVisible(false);
+ }else{
+ ui->tool_home_gohome->setVisible(true);
+ ui->label_home_dir->setText( this->fontMetrics().elidedText(homedir.dirName(), Qt::ElideRight, ui->label_home_dir->width()));
+ //Now make sure to put a "go back" button at the top of the list
+ QString dir = ui->label_home_dir->whatsThis();
+ if(dir.endsWith("/")){ dir.chop(1); }
+ dir.chop( dir.section("/",-1).length() );
+ items << dir;
+ }
+ ui->label_home_dir->setToolTip(ui->label_home_dir->whatsThis());
+ items << homedir.entryList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot, QDir::Name | QDir::DirsFirst);
+ QString type = "";
+ if(homedir.absolutePath() == QDir::homePath()+"/Desktop"){ type.append("-home"); }//internal code
+ for(int i=0; i<items.length(); i++){
+ //qDebug() << "New Home subdir:" << homedir.absoluteFilePath(items[i]);
+ UserItemWidget *it;
+ if(items[i].startsWith("/")){ it = new UserItemWidget(ui->scroll_home->widget(), items[i], "dir", true); } //go-back button
+ else{ it = new UserItemWidget(ui->scroll_home->widget(), homedir.absoluteFilePath(items[i]), type, false); }
+ ui->scroll_home->widget()->layout()->addWidget(it);
+ connect(it, SIGNAL(RunItem(QString)), this, SLOT(slotGoToDir(QString)) );
+ connect(it, SIGNAL(NewShortcut()), this, SLOT(updateFavItems()) );
+ connect(it, SIGNAL(RemovedShortcut()), this, SLOT(updateFavItems()) );
+ QApplication::processEvents(); //keep the UI snappy - may be a lot of these to load
+ }
+}
+
+void UserWidget::slotGoToDir(QString dir){
+ if(!QFileInfo(dir).isDir()){
+ LaunchItem(dir);
+ }else{
+ ui->label_home_dir->setWhatsThis(dir);
+ updateHome();
+ }
+}
+
+void UserWidget::slotGoHome(){
+ slotGoToDir(QDir::homePath());
+}
+
+void UserWidget::slotOpenDir(){
+ LaunchItem(ui->label_home_dir->whatsThis());
+}
+
+void UserWidget::slotOpenSearch(){
+ LaunchItem("lumina-search -dir \""+ui->label_home_dir->whatsThis()+"\"", false); //use command as-is
+}
+
+void UserWidget::mouseMoveEvent( QMouseEvent *event){
+ QTabBar *wid = tabBar();
+ if(wid==0){ return; } //invalid widget found
+ QPoint relpos = wid->mapFromGlobal( this->mapToGlobal(event->pos()) );
+ //qDebug() << "Mouse Move Event: " << event->pos().x() << event->pos().y() << relpos.x() << relpos.y() << wid->width() << wid->height();
+ if(wid && wid->tabAt(relpos) != -1){
+ qDebug() << " - Mouse over tab";
+ this->setCurrentIndex( wid->tabAt(relpos) );
+ }
+}
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.h b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.h
new file mode 100644
index 00000000..af9408dd
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.h
@@ -0,0 +1,101 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2014, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This panel plugin allows the user to quickly access user favorites and applications
+//===========================================
+#ifndef _LUMINA_PANEL_USER_BUTTON_WIDGET_H
+#define _LUMINA_PANEL_USER_BUTTON_WIDGET_H
+
+#include <QWidget>
+#include <QString>
+#include <QList>
+#include <QHash>
+#include <QVBoxLayout>
+#include <QScrollArea>
+#include <QDateTime>
+#include <QTransform>
+#include <QMouseEvent>
+#include <QTabWidget>
+
+#include <LuminaXDG.h>
+#include <LuminaOS.h>
+#include "UserItemWidget.h"
+
+#define SSAVER QString("xscreensaver-demo")
+
+namespace Ui{
+ class UserWidget;
+};
+
+class UserWidget : public QTabWidget{
+ Q_OBJECT
+public:
+ UserWidget(QWidget *parent=0);
+ ~UserWidget();
+
+public slots:
+ void UpdateAll(); //for re-translation/icon changes
+ void UpdateMenu(bool forceall = false); //for item changes
+
+private:
+ Ui::UserWidget *ui;
+ QHash<QString, QList<XDGDesktop> > *sysapps;
+ QDateTime lastUpdate, lastHomeUpdate;
+ QStringList favs;
+ QFileInfoList homefiles;
+ int cfav; //current favorite category
+ void ClearScrollArea(QScrollArea *area);
+ void SortScrollArea(QScrollArea *area);
+ QIcon rotateIcon(QIcon);
+ bool updatingfavs;
+
+private slots:
+ void LaunchItem(QString path, bool fix = true);
+
+ //Favorites Tab
+ void FavChanged(); //for ensuring radio-button-like behaviour
+ void updateFavItems(bool newfilter = true); //if false, will only update if filesystem changes
+
+ //Apps Tab
+ void updateAppCategories();
+ void updateApps();
+
+ //Home Tab
+ void updateHome();
+ void slotGoToDir(QString dir);
+ void slotGoHome();
+ void slotOpenDir();
+ void slotOpenSearch();
+
+ //Slots for the special buttons
+ void openStore(){
+ LaunchItem(LOS::AppStoreShortcut());
+ }
+ void openControlPanel(){
+ LaunchItem(LOS::ControlPanelShortcut());
+ }
+ void openDeskSettings(){
+ LaunchItem("lumina-config", false);
+ }
+ void openScreenSaverConfig(){
+ LaunchItem(SSAVER, false);
+ }
+ void openScreenConfig(){
+ LaunchItem("lumina-xconfig",false);
+ }
+ void openLuminaInfo(){
+ LaunchItem("lumina-info",false);
+ }
+
+protected:
+ void mouseMoveEvent( QMouseEvent *event);
+
+signals:
+ void CloseMenu();
+
+};
+
+#endif
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.ui b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.ui
new file mode 100644
index 00000000..9ef5af7e
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/panel-plugins/userbutton/UserWidget.ui
@@ -0,0 +1,593 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>UserWidget</class>
+ <widget class="QTabWidget" name="UserWidget">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>294</width>
+ <height>289</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>UserWidget</string>
+ </property>
+ <property name="tabPosition">
+ <enum>QTabWidget::West</enum>
+ </property>
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab_fav">
+ <attribute name="title">
+ <string>Favorites</string>
+ </attribute>
+ <attribute name="toolTip">
+ <string>Favorites</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="leftMargin">
+ <number>1</number>
+ </property>
+ <property name="topMargin">
+ <number>1</number>
+ </property>
+ <property name="rightMargin">
+ <number>1</number>
+ </property>
+ <property name="bottomMargin">
+ <number>1</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QToolButton" name="tool_fav_apps">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="cursor">
+ <cursorShape>ArrowCursor</cursorShape>
+ </property>
+ <property name="toolTip">
+ <string>Favorite Applications</string>
+ </property>
+ <property name="text">
+ <string>Applications</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_fav_dirs">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Favorite Directories</string>
+ </property>
+ <property name="text">
+ <string>Places</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_fav_files">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Favorite FIles</string>
+ </property>
+ <property name="text">
+ <string>Files</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QScrollArea" name="scroll_fav">
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="scrollAreaWidgetContents">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>259</width>
+ <height>247</height>
+ </rect>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_apps">
+ <attribute name="title">
+ <string>Apps</string>
+ </attribute>
+ <attribute name="toolTip">
+ <string>Applications</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="leftMargin">
+ <number>1</number>
+ </property>
+ <property name="topMargin">
+ <number>1</number>
+ </property>
+ <property name="rightMargin">
+ <number>1</number>
+ </property>
+ <property name="bottomMargin">
+ <number>1</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QComboBox" name="combo_app_cats">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="maxVisibleItems">
+ <number>12</number>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </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="QToolButton" name="tool_app_store">
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QScrollArea" name="scroll_apps">
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="scrollAreaWidgetContents_2">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>98</width>
+ <height>28</height>
+ </rect>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_home">
+ <attribute name="title">
+ <string>Home</string>
+ </attribute>
+ <attribute name="toolTip">
+ <string>Home Directory</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <property name="leftMargin">
+ <number>1</number>
+ </property>
+ <property name="topMargin">
+ <number>1</number>
+ </property>
+ <property name="rightMargin">
+ <number>1</number>
+ </property>
+ <property name="bottomMargin">
+ <number>1</number>
+ </property>
+ <item>
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="horizontalSpacing">
+ <number>4</number>
+ </property>
+ <property name="verticalSpacing">
+ <number>1</number>
+ </property>
+ <item row="0" column="3">
+ <widget class="QToolButton" name="tool_home_search">
+ <property name="toolTip">
+ <string>Search this Directory</string>
+ </property>
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QToolButton" name="tool_home_browse">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Open Directory</string>
+ </property>
+ <property name="text">
+ <string notr="true">Browse</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonIconOnly</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QToolButton" name="tool_home_gohome">
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Go back to home directory</string>
+ </property>
+ <property name="text">
+ <string notr="true">home</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_home_dir">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text">
+ <string notr="true">&lt;current dir&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="indent">
+ <number>0</number>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::NoTextInteraction</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QScrollArea" name="scroll_home">
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="scrollAreaWidgetContents_3">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>98</width>
+ <height>28</height>
+ </rect>
+ </property>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_config">
+ <attribute name="title">
+ <string>Config</string>
+ </attribute>
+ <attribute name="toolTip">
+ <string>Desktop Preferences</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <item>
+ <widget class="QToolButton" name="tool_controlpanel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Control Panel</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_desktopsettings">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Desktop Appearance/Plugins</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_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_config_screensaver">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Screensaver Settings</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>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>243</width>
+ <height>162</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_config_about">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>About the Lumina Desktop</string>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_blue-grey-zoom.jpg b/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_blue-grey-zoom.jpg
new file mode 100644
index 00000000..481ca438
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_blue-grey-zoom.jpg
Binary files differ
diff --git a/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_blue-grey.jpg b/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_blue-grey.jpg
new file mode 100644
index 00000000..9da67596
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_blue-grey.jpg
Binary files differ
diff --git a/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_gold.jpg b/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_gold.jpg
new file mode 100644
index 00000000..cba03cee
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_gold.jpg
Binary files differ
diff --git a/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_green.jpg b/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_green.jpg
new file mode 100644
index 00000000..80b0d3e3
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_green.jpg
Binary files differ
diff --git a/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_grey-blue-zoom.jpg b/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_grey-blue-zoom.jpg
new file mode 100644
index 00000000..4f753ed5
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_grey-blue-zoom.jpg
Binary files differ
diff --git a/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_grey-blue.jpg b/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_grey-blue.jpg
new file mode 100644
index 00000000..c214cd78
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_grey-blue.jpg
Binary files differ
diff --git a/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_purple.jpg b/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_purple.jpg
new file mode 100644
index 00000000..e4c3d7a8
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_purple.jpg
Binary files differ
diff --git a/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_red.jpg b/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_red.jpg
new file mode 100644
index 00000000..a092f636
--- /dev/null
+++ b/src-qt5/core/lumina-desktop/wallpapers/Lumina_Wispy_red.jpg
Binary files differ
bgstack15