aboutsummaryrefslogtreecommitdiff
path: root/lumina-desktop
diff options
context:
space:
mode:
Diffstat (limited to 'lumina-desktop')
-rw-r--r--lumina-desktop/LSession.cpp21
-rw-r--r--lumina-desktop/LXcbEventFilter.cpp4
-rw-r--r--lumina-desktop/lumina-desktop.pro7
-rw-r--r--lumina-desktop/main.cpp6
-rw-r--r--lumina-desktop/panel-plugins/NewPP.h3
-rw-r--r--lumina-desktop/panel-plugins/systemstart/ItemWidget.cpp192
-rw-r--r--lumina-desktop/panel-plugins/systemstart/ItemWidget.h80
-rw-r--r--lumina-desktop/panel-plugins/systemstart/LStartButton.cpp52
-rw-r--r--lumina-desktop/panel-plugins/systemstart/LStartButton.h74
-rw-r--r--lumina-desktop/panel-plugins/systemstart/StartMenu.cpp425
-rw-r--r--lumina-desktop/panel-plugins/systemstart/StartMenu.h89
-rw-r--r--lumina-desktop/panel-plugins/systemstart/StartMenu.ui1021
-rw-r--r--lumina-desktop/panel-plugins/systemtray/LSysTray.cpp4
-rw-r--r--lumina-desktop/panel-plugins/systemtray/TrayIcon.cpp8
-rw-r--r--lumina-desktop/panel-plugins/systemtray/TrayIcon.h3
-rw-r--r--lumina-desktop/panel-plugins/userbutton/LUserButton.h2
16 files changed, 1969 insertions, 22 deletions
diff --git a/lumina-desktop/LSession.cpp b/lumina-desktop/LSession.cpp
index 0425b971..bd9ffeaa 100644
--- a/lumina-desktop/LSession.cpp
+++ b/lumina-desktop/LSession.cpp
@@ -19,7 +19,7 @@
#include <unistd.h> //for usleep() usage
#ifndef DEBUG
-#define DEBUG 0
+#define DEBUG 1
#endif
XCBEventFilter *evFilter = 0;
@@ -33,6 +33,7 @@ LSession::LSession(int &argc, char ** argv) : QApplication(argc, argv){
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;
@@ -675,7 +676,7 @@ void LSession::WindowPropertyEvent(){
QList<WId> newapps = XCB->WindowList();
if(RunningApps.length() < newapps.length()){
//New Window found
- qDebug() << "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++){
@@ -695,6 +696,8 @@ void LSession::WindowPropertyEvent(WId win){
if(RunningApps.contains(win)){
if(DEBUG){ qDebug() << "Single-window property event"; }
emit WindowListEvent();
+ }else if(RunningTrayApps.contains(win)){
+ emit TrayIconChanged(win);
}
}
@@ -710,24 +713,18 @@ void LSession::WindowClosedEvent(WId win){
void LSession::WindowConfigureEvent(WId win){
if(TrayStopping){ return; }
- for(int i=0; i<RunningTrayApps.length(); i++){
- if(win==RunningTrayApps[i]){
+ if(RunningTrayApps.contains(win)){
if(DEBUG){ qDebug() << "SysTray: Configure Event"; }
- emit TrayIconChanged(RunningTrayApps[i]); //trigger a repaint event
- break;
+ emit TrayIconChanged(win); //trigger a repaint event
}
- }
}
void LSession::WindowDamageEvent(WId win){
if(TrayStopping){ return; }
- for(int i=0; i<RunningTrayApps.length(); i++){
- if(win==RunningTrayApps[i]){
+ if(RunningTrayApps.contains(win)){
if(DEBUG){ qDebug() << "SysTray: Damage Event"; }
- emit TrayIconChanged(RunningTrayApps[i]); //trigger a repaint event
- break;
+ emit TrayIconChanged(win); //trigger a repaint event
}
- }
}
void LSession::WindowSelectionClearEvent(WId win){
diff --git a/lumina-desktop/LXcbEventFilter.cpp b/lumina-desktop/LXcbEventFilter.cpp
index 32190d55..a3a8147b 100644
--- a/lumina-desktop/LXcbEventFilter.cpp
+++ b/lumina-desktop/LXcbEventFilter.cpp
@@ -95,9 +95,9 @@ bool XCBEventFilter::nativeEventFilter(const QByteArray &eventType, void *messag
//==============================
default:
if(TrayDmgFlag!=0){
- if( (ev->response_type & ~0x80)==TrayDmgFlag){
+ //if( (ev->response_type & ~0x80)==TrayDmgFlag){
session->WindowDamageEvent( ((xcb_damage_notify_event_t*)ev)->drawable );
- }
+ //}
}/*else{
qDebug() << "Default Event:" << (ev->response_type & ~0x80);
}*/
diff --git a/lumina-desktop/lumina-desktop.pro b/lumina-desktop/lumina-desktop.pro
index 533c1631..0d31d60f 100644
--- a/lumina-desktop/lumina-desktop.pro
+++ b/lumina-desktop/lumina-desktop.pro
@@ -52,6 +52,9 @@ SOURCES += main.cpp \
panel-plugins/showdesktop/LHomeButton.cpp \
panel-plugins/appmenu/LAppMenuPlugin.cpp \
panel-plugins/applauncher/AppLaunchButton.cpp \
+ panel-plugins/systemstart/LStartButton.cpp \
+ panel-plugins/systemstart/StartMenu.cpp \
+ panel-plugins/systemstart/ItemWidget.cpp \
desktop-plugins/LDPlugin.cpp \
desktop-plugins/applauncher/AppLauncherPlugin.cpp \
desktop-plugins/desktopview/DesktopViewPlugin.cpp \
@@ -95,6 +98,9 @@ HEADERS += Globals.h \
panel-plugins/showdesktop/LHomeButton.h \
panel-plugins/appmenu/LAppMenuPlugin.h \
panel-plugins/applauncher/AppLaunchButton.h \
+ panel-plugins/systemstart/LStartButton.h \
+ panel-plugins/systemstart/StartMenu.h \
+ panel-plugins/systemstart/ItemWidget.h \
# panel-plugins/quickcontainer/QuickPPlugin.h \
desktop-plugins/SamplePlugin.h \
desktop-plugins/calendar/CalendarPlugin.h \
@@ -110,6 +116,7 @@ FORMS += SystemWindow.ui \
BootSplash.ui \
panel-plugins/userbutton/UserWidget.ui \
panel-plugins/systemdashboard/SysMenuQuick.ui \
+ panel-plugins/systemstart/StartMenu.ui \
desktop-plugins/audioplayer/PlayerWidget.ui \
desktop-plugins/systemmonitor/MonitorWidget.ui
diff --git a/lumina-desktop/main.cpp b/lumina-desktop/main.cpp
index 9415bd62..2feaa4ad 100644
--- a/lumina-desktop/main.cpp
+++ b/lumina-desktop/main.cpp
@@ -35,15 +35,15 @@ void MessageOutput(QtMsgType type, const QMessageLogContext &context, const QStr
break;
case QtWarningMsg:
txt = QString("Warning: %1").arg(msg);
- txt += "Context: "+QString(context.file)+" Line: "+QString(context.line)+" Function: "+QString(context.function);
+ txt += "\nContext: "+QString(context.file)+" Line: "+QString(context.line)+" Function: "+QString(context.function);
break;
case QtCriticalMsg:
txt = QString("CRITICAL: %1").arg(msg);
- txt += "Context: "+QString(context.file)+" Line: "+QString(context.line)+" Function: "+QString(context.function);
+ txt += "\nContext: "+QString(context.file)+" Line: "+QString(context.line)+" Function: "+QString(context.function);
break;
case QtFatalMsg:
txt = QString("FATAL: %1").arg(msg);
- txt += "Context: "+QString(context.file)+" Line: "+QString(context.line)+" Function: "+QString(context.function);
+ txt += "\nContext: "+QString(context.file)+" Line: "+QString(context.line)+" Function: "+QString(context.function);
break;
}
diff --git a/lumina-desktop/panel-plugins/NewPP.h b/lumina-desktop/panel-plugins/NewPP.h
index 2a061a23..f43f8803 100644
--- a/lumina-desktop/panel-plugins/NewPP.h
+++ b/lumina-desktop/panel-plugins/NewPP.h
@@ -24,6 +24,7 @@
#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
@@ -54,6 +55,8 @@ public:
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)) ){
diff --git a/lumina-desktop/panel-plugins/systemstart/ItemWidget.cpp b/lumina-desktop/panel-plugins/systemstart/ItemWidget.cpp
new file mode 100644
index 00000000..94c7bfc6
--- /dev/null
+++ b/lumina-desktop/panel-plugins/systemstart/ItemWidget.cpp
@@ -0,0 +1,192 @@
+//===========================================
+// 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>
+
+#define TEXTCUTOFF 165
+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) );
+ 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;
+ }
+ if(isShortcut){
+ name->setToolTip(icon->whatsThis()); //also allow the user to see the full shortcut path
+ }
+ //Now setup the button appropriately
+ setupContextMenu();
+}
+
+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(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
+ 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()) );
+ /*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);
+ //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()) );
+ }
+}
+
+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::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::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/lumina-desktop/panel-plugins/systemstart/ItemWidget.h b/lumina-desktop/panel-plugins/systemstart/ItemWidget.h
new file mode 100644
index 00000000..6aa8b037
--- /dev/null
+++ b/lumina-desktop/panel-plugins/systemstart/ItemWidget.h
@@ -0,0 +1,80 @@
+//===========================================
+// 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 <LuminaXDG.h>
+
+class ItemWidget : public QFrame{
+ Q_OBJECT
+public:
+ ItemWidget(QWidget *parent=0, QString itemPath="", QString type="unknown", bool goback=false);
+ ItemWidget(QWidget *parent=0, XDGDesktop item= XDGDesktop());
+ ~ItemWidget();
+
+ bool gooditem;
+private:
+ QToolButton *actButton;
+ QMenu *contextMenu;
+ QLabel *icon, *name;
+ bool isDirectory, isShortcut, menuopen;
+ QString linkPath;
+ QTimer *menureset;
+
+ void createWidget();
+ //void setupButton(bool disable = false);
+ void setupContextMenu();
+ void setupActions(XDGDesktop);
+
+private slots:
+ void PinToDesktop();
+ void RemoveFavorite();
+ void AddFavorite();
+ 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){
+ menuopen = true;
+ setupContextMenu();
+ contextMenu->popup(event->globalPos());
+ }else if(event->button() != Qt::NoButton){ ItemClicked(); }
+ }
+
+signals:
+ void NewShortcut();
+ void RemovedShortcut();
+ void RunItem(QString cmd);
+
+};
+
+#endif
diff --git a/lumina-desktop/panel-plugins/systemstart/LStartButton.cpp b/lumina-desktop/panel-plugins/systemstart/LStartButton.cpp
new file mode 100644
index 00000000..cb43b7c3
--- /dev/null
+++ b/lumina-desktop/panel-plugins/systemstart/LStartButton.cpp
@@ -0,0 +1,52 @@
+//===========================================
+// 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"
+
+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 QMenu(this);
+ menu->setContentsMargins(1,1,1,1);
+ startmenu = new StartMenu(this);
+ connect(startmenu, SIGNAL(CloseMenu()), this, SLOT(closeMenu()) );
+ mact = new QWidgetAction(this);
+ mact->setDefaultWidget(startmenu);
+ menu->addAction(mact);
+
+ button->setMenu(menu);
+ connect(menu, SIGNAL(aboutToHide()), this, SLOT(updateButtonVisuals()) );
+ QTimer::singleShot(0,this, SLOT(OrientationChange())); //Update icons/sizes
+}
+
+LStartButtonPlugin::~LStartButtonPlugin(){
+
+}
+
+void LStartButtonPlugin::updateButtonVisuals(){
+ button->setToolTip(tr(""));
+ button->setText( SYSTEM::user() );
+ button->setIcon( LXDG::findIcon("pcbsd","Lumina-DE") ); //force icon refresh
+}
+
+// ========================
+// PRIVATE FUNCTIONS
+// ========================
+void LStartButtonPlugin::openMenu(){
+ startmenu->UpdateMenu();
+ button->showMenu();
+}
+
+void LStartButtonPlugin::closeMenu(){
+ menu->hide();
+}
+
diff --git a/lumina-desktop/panel-plugins/systemstart/LStartButton.h b/lumina-desktop/panel-plugins/systemstart/LStartButton.h
new file mode 100644
index 00000000..61a43731
--- /dev/null
+++ b/lumina-desktop/panel-plugins/systemstart/LStartButton.h
@@ -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
+//===========================================
+// 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>
+
+
+// Lumina-desktop includes
+//#include "../../Globals.h"
+#include "../LPPlugin.h" //main plugin widget
+
+// libLumina includes
+#include "LuminaXDG.h"
+
+#include "StartMenu.h"
+
+// PANEL PLUGIN BUTTON
+class LStartButtonPlugin : public LPPlugin{
+ Q_OBJECT
+
+public:
+ LStartButtonPlugin(QWidget *parent = 0, QString id = "systemstart", bool horizontal=true);
+ ~LStartButtonPlugin();
+
+private:
+ QMenu *menu;
+ QWidgetAction *mact;
+ StartMenu *startmenu;
+ 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();
+ startmenu->UpdateAll();
+ }
+
+ void ThemeChange(){
+ updateButtonVisuals();
+ startmenu->UpdateAll();
+ }
+};
+
+#endif \ No newline at end of file
diff --git a/lumina-desktop/panel-plugins/systemstart/StartMenu.cpp b/lumina-desktop/panel-plugins/systemstart/StartMenu.cpp
new file mode 100644
index 00000000..cc8a55e3
--- /dev/null
+++ b/lumina-desktop/panel-plugins/systemstart/StartMenu.cpp
@@ -0,0 +1,425 @@
+//===========================================
+// 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 <LuminaOS.h>
+#include "../../LSession.h"
+
+#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
+ sysapps = LSession::handle()->applicationMenu()->currentAppHash();
+ connect(LSession::handle()->applicationMenu(), SIGNAL(AppMenuUpdated()), this, SLOT(UpdateApps()) );
+ 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-back",""));
+ ui->tool_launch_deskinfo->setIcon(LXDG::findIcon("system-help",""));
+
+ 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();
+ QLocale curr;
+ for(int i=0; i<locales.length(); i++){
+ QLocale loc(locales[i]);
+ ui->combo_locale->addItem(loc.nativeLanguageName(), 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->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
+ }
+}
+// ==========================
+// PRIVATE FUNCTIONS
+// ==========================
+void StartMenu::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 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){
+ 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
+ }
+}
+
+//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)
+ 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)) );
+ }
+ }
+
+}
+
+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;
+ for(int type = 0; type<3; type++){
+ QStringList tmp;
+ 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
+ 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)) );
+ }
+ 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(val < 10){ ICON="-low"; }
+ else if(val<20){ ICON="-caution"; }
+ else if(val<40){ ICON="-040"; }
+ else if(val<60){ ICON="-060"; }
+ else if(val<80){ ICON="-080"; }
+ else{ ICON="-100"; }
+ if(LOS::batteryIsCharging()){
+ if(val>=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)); }
+ }
+ 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->tool_suspend->setVisible( LOS::systemCanSuspend() );
+ }
+
+}
+
+//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(){
+ LaunchItem("xscreensaver-command -lock", false);
+}
+
+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_launch_mixer->setIcon(LXDG::findIcon("audio-volume-muted","")); }
+ else if(val<33){ ui->tool_launch_mixer->setIcon(LXDG::findIcon("audio-volume-low","")); }
+ else if(val<66){ ui->tool_launch_mixer->setIcon(LXDG::findIcon("audio-volume-medium","")); }
+ else{ ui->tool_launch_mixer->setIcon(LXDG::findIcon("audio-volume-high","")); }
+}
+
+void StartMenu::on_tool_launch_mixer_clicked(){
+ if(LOS::hasMixerUtility()){
+ emit CloseMenu();
+ LOS::startMixerUtility();
+ }
+}
+
+
+//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::handle()->switchLocale(locale);
+}
+
+
+//Search
+void StartMenu::on_line_search_editingFinished(){
+
+}
diff --git a/lumina-desktop/panel-plugins/systemstart/StartMenu.h b/lumina-desktop/panel-plugins/systemstart/StartMenu.h
new file mode 100644
index 00000000..20ed2fb7
--- /dev/null
+++ b/lumina-desktop/panel-plugins/systemstart/StartMenu.h
@@ -0,0 +1,89 @@
+//===========================================
+// 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 <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
+
+private:
+ Ui::StartMenu *ui;
+ QHash<QString, QList<XDGDesktop> > *sysapps;
+ QStringList favs;
+
+ //Simple utility functions
+ void ClearScrollArea(QScrollArea *area);
+ void SortScrollArea(QScrollArea *area);
+
+private slots:
+ void LaunchItem(QString path, bool fix = true);
+
+ //Application/Favorite Listings
+ void UpdateApps();
+ void UpdateFavs();
+
+ // Page update routines
+ void on_stackedWidget_currentChanged(int); //page 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();
+
+ //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();
+};
+
+#endif \ No newline at end of file
diff --git a/lumina-desktop/panel-plugins/systemstart/StartMenu.ui b/lumina-desktop/panel-plugins/systemstart/StartMenu.ui
new file mode 100644
index 00000000..b06771cb
--- /dev/null
+++ b/lumina-desktop/panel-plugins/systemstart/StartMenu.ui
@@ -0,0 +1,1021 @@
+<?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>180</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>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="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>3</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::ScrollBarAlwaysOff</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>100</width>
+ <height>16</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="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="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="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="text">
+ <string>Quick Settings</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="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="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="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_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>87</width>
+ <height>16</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="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="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_launch_mixer">
+ <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>
+ <widget class="QSlider" name="slider_volume">
+ <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::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </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="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="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="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>
+ </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>
+ <widget class="QToolButton" name="tool_logout">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </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_13">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </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="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="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="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="Line" name="line_11">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <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="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>
+ </layout>
+ </widget>
+ </item>
+ <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="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="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/lumina-desktop/panel-plugins/systemtray/LSysTray.cpp b/lumina-desktop/panel-plugins/systemtray/LSysTray.cpp
index d1486371..220c7858 100644
--- a/lumina-desktop/panel-plugins/systemtray/LSysTray.cpp
+++ b/lumina-desktop/panel-plugins/systemtray/LSysTray.cpp
@@ -102,7 +102,7 @@ void LSysTray::checkAll(){
}else{
//Tray Icon already exists
//qDebug() << " - SysTray: Update Icon";
- //trayIcons[i]->update();
+ trayIcons[i]->update();
wins.removeAt(index); //Already found - remove from the list
}
}
@@ -149,7 +149,7 @@ 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;
+ qDebug() << "System Tray: Update Window " << win;
trayIcons[i]->update();
QTimer::singleShot(1000, trayIcons[i], SLOT(update()) );
return; //finished now
diff --git a/lumina-desktop/panel-plugins/systemtray/TrayIcon.cpp b/lumina-desktop/panel-plugins/systemtray/TrayIcon.cpp
index 6f324e7a..3e26683f 100644
--- a/lumina-desktop/panel-plugins/systemtray/TrayIcon.cpp
+++ b/lumina-desktop/panel-plugins/systemtray/TrayIcon.cpp
@@ -14,6 +14,8 @@ TrayIcon::TrayIcon(QWidget *parent) : QWidget(parent){
AID = 0; //nothing yet
IID = 0;
dmgID = 0;
+ //this->setLayout(new QHBoxLayout);
+ //this->layout()->setContentsMargins(0,0,0,0);
}
TrayIcon::~TrayIcon(){
@@ -27,6 +29,9 @@ 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 ){
@@ -55,6 +60,7 @@ void TrayIcon::detachApp(){
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;
@@ -83,7 +89,7 @@ void TrayIcon::paintEvent(QPaintEvent *event){
//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;
+ QPixmap pix; //= WIN->icon().pixmap(this->size());
//Try to grab the window directly with Qt
QList<QScreen*> scrnlist = QApplication::screens();
for(int i=0; i<scrnlist.length(); i++){
diff --git a/lumina-desktop/panel-plugins/systemtray/TrayIcon.h b/lumina-desktop/panel-plugins/systemtray/TrayIcon.h
index 18c51a66..fef3b578 100644
--- a/lumina-desktop/panel-plugins/systemtray/TrayIcon.h
+++ b/lumina-desktop/panel-plugins/systemtray/TrayIcon.h
@@ -20,7 +20,7 @@
#include <QPainter>
#include <QPixmap>
#include <QImage>
-
+//#include <QWindow>
// libLumina includes
//#include <LuminaX11.h>
@@ -40,6 +40,7 @@ public slots:
private:
WId IID, AID; //icon ID and app ID
+ //QWindow *WIN;
uint dmgID;
protected:
diff --git a/lumina-desktop/panel-plugins/userbutton/LUserButton.h b/lumina-desktop/panel-plugins/userbutton/LUserButton.h
index c5612e15..ca835bfe 100644
--- a/lumina-desktop/panel-plugins/userbutton/LUserButton.h
+++ b/lumina-desktop/panel-plugins/userbutton/LUserButton.h
@@ -19,7 +19,7 @@
// Lumina-desktop includes
-#include "../../Globals.h"
+//#include "../../Globals.h"
#include "../LPPlugin.h" //main plugin widget
// libLumina includes
bgstack15