aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/core
diff options
context:
space:
mode:
Diffstat (limited to 'src-qt5/core')
-rw-r--r--src-qt5/core/libLumina/ExternalProcess.h26
-rw-r--r--src-qt5/core/libLumina/LuminaRandR-X11.cpp206
-rw-r--r--src-qt5/core/libLumina/LuminaRandR.cpp1
-rw-r--r--src-qt5/core/libLumina/LuminaRandR.h51
-rw-r--r--src-qt5/core/libLumina/LuminaRandR.pri12
-rw-r--r--src-qt5/core/libLumina/LuminaX11.cpp30
-rw-r--r--src-qt5/core/libLumina/LuminaX11.h13
-rw-r--r--src-qt5/core/libLumina/LuminaXDG.cpp5
-rw-r--r--src-qt5/core/libLumina/NativeWindow.cpp37
-rw-r--r--src-qt5/core/libLumina/NativeWindow.h81
-rw-r--r--src-qt5/core/libLumina/NativeWindow.pri8
-rw-r--r--src-qt5/core/libLumina/NativeWindowSystem.cpp221
-rw-r--r--src-qt5/core/libLumina/NativeWindowSystem.h92
-rw-r--r--src-qt5/core/libLumina/RootSubWindow.cpp110
-rw-r--r--src-qt5/core/libLumina/RootSubWindow.h51
-rw-r--r--src-qt5/core/libLumina/RootWindow.cpp23
-rw-r--r--src-qt5/core/libLumina/RootWindow.h12
-rw-r--r--src-qt5/core/libLumina/RootWindow.pri10
-rw-r--r--src-qt5/core/libLumina/test/main.cpp13
-rw-r--r--src-qt5/core/libLumina/test/test.pro7
-rw-r--r--src-qt5/core/lumina-desktop-unified/LSession.cpp11
-rw-r--r--src-qt5/core/lumina-desktop-unified/global-includes.h2
-rw-r--r--src-qt5/core/lumina-desktop-unified/lumina-desktop.pro1
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.cpp7
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.h1
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-events/LXcbEventFilter.cpp129
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-events/LXcbEventFilter.h20
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.cpp3
-rw-r--r--src-qt5/core/lumina-desktop/LDesktop.cpp11
-rw-r--r--src-qt5/core/lumina-desktop/LDesktopPluginSpace.cpp5
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp4
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_da.ts266
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_de.ts76
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_it.ts2
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_lt.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_pl.ts96
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskButton.cpp10
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskManagerPlugin.cpp2
-rw-r--r--src-qt5/core/lumina-info/i18n/lumina-info_da.ts20
-rw-r--r--src-qt5/core/lumina-info/i18n/lumina-info_pl.ts14
-rw-r--r--src-qt5/core/lumina-open/LFileDialog.cpp8
-rw-r--r--src-qt5/core/lumina-open/i18n/lumina-open_da.ts24
-rw-r--r--src-qt5/core/lumina-open/i18n/lumina-open_de.ts12
-rw-r--r--src-qt5/core/lumina-open/i18n/lumina-open_it.ts2
-rw-r--r--src-qt5/core/lumina-open/i18n/lumina-open_lt.ts6
-rw-r--r--src-qt5/core/lumina-session/main.cpp4
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_da.ts14
47 files changed, 1443 insertions, 342 deletions
diff --git a/src-qt5/core/libLumina/ExternalProcess.h b/src-qt5/core/libLumina/ExternalProcess.h
index 1325247f..8329c361 100644
--- a/src-qt5/core/libLumina/ExternalProcess.h
+++ b/src-qt5/core/libLumina/ExternalProcess.h
@@ -13,17 +13,40 @@
#include <QProcess>
#include <QString>
+#include <QTimer>
+#include <QApplication>
class ExternalProcess : public QProcess{
Q_OBJECT
+private:
+ bool cursorRestored;
+
private slots:
+ void resetCursor(){
+ if(!cursorRestored){
+ QApplication::restoreOverrideCursor();
+ cursorRestored = true;
+ }
+ }
+ void processStarting(){
+ if(!cursorRestored){
+ QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) );
+ QTimer::singleShot(15000, this, SLOT(resetCursor()) );
+ }
+ }
void processFinished(){
+ if(!cursorRestored){
+ QApplication::restoreOverrideCursor();
+ cursorRestored = true;
+ }
//Clean up this object
this->deleteLater();
}
+
public:
- ExternalProcess(QString logfile = "") : QProcess(){
+ ExternalProcess(QString logfile = "", bool manageCursors = true) : QProcess(){
this->setProcessChannelMode(QProcess::MergedChannels);
+ cursorRestored = !manageCursors;
if(logfile.isEmpty()){
this->setStandardOutputFile(QProcess::nullDevice());
}else{
@@ -32,6 +55,7 @@ public:
//Setup the connection for automatic cleanup
connect(this, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(processFinished()) );
}
+
~ExternalProcess(){
/*if(this->state() == QProcess::Running){
this->detach(); //about to close down the QProcess - detach the other program so it can continue functioning normally.
diff --git a/src-qt5/core/libLumina/LuminaRandR-X11.cpp b/src-qt5/core/libLumina/LuminaRandR-X11.cpp
new file mode 100644
index 00000000..85251b64
--- /dev/null
+++ b/src-qt5/core/libLumina/LuminaRandR-X11.cpp
@@ -0,0 +1,206 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2017, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LuminaRandR.h"
+
+#include "xcb/randr.h"
+#include "xcb/xcb_atom.h"
+
+#include <QDebug>
+#include <QX11Info>
+
+static QString atomToName(xcb_atom_t atom){
+ xcb_get_atom_name_reply_t *nreply = xcb_get_atom_name_reply(QX11Info::connection(), xcb_get_atom_name_unchecked(QX11Info::connection(), atom), NULL);
+ QString name = QString::fromLocal8Bit(xcb_get_atom_name_name(nreply), xcb_get_atom_name_name_length(nreply));
+ free(nreply);
+ return name;
+};
+
+//More efficient method for converting lots of atoms to strings
+static QStringList atomsToNames(xcb_atom_t *atoms, unsigned int num){
+ //qDebug() << "atomsToNames:" << num;
+ QList< xcb_get_atom_name_cookie_t > cookies;
+ //qDebug() << " - Get cookies";
+ for(unsigned int i=0; i<num; i++){ cookies << xcb_get_atom_name_unchecked(QX11Info::connection(), atoms[i]); }
+ QStringList names;
+ //qDebug() << " - Get names";
+ for(int i=0; i<cookies.length(); i++){
+ xcb_get_atom_name_reply_t *nreply = xcb_get_atom_name_reply(QX11Info::connection(), cookies[i], NULL);
+ if(nreply==0){ continue; }
+ names << QString::fromLocal8Bit(xcb_get_atom_name_name(nreply), xcb_get_atom_name_name_length(nreply));
+ free(nreply);
+ }
+ return names;
+};
+
+class OutputDevice::p_objects{
+public:
+ xcb_atom_t monitor_atom;
+ QList<xcb_randr_output_t> outputs; //the actual output devices used by the monitor
+
+};
+
+//Global Listing of Devices
+QList<OutputDevice> OutputDevice::availableMonitors(){
+ QList<OutputDevice> list;
+ //Get the list of monitors
+ xcb_randr_get_monitors_cookie_t cookie = xcb_randr_get_monitors_unchecked(QX11Info::connection(), QX11Info::appRootWindow(), 1);
+ xcb_randr_get_monitors_reply_t *reply = xcb_randr_get_monitors_reply(QX11Info::connection(), cookie, NULL);
+ if(reply==0){
+ qDebug() << "Could not get monitor list";
+ return list;
+ }
+ xcb_randr_monitor_info_iterator_t iter = xcb_randr_get_monitors_monitors_iterator(reply);
+ qDebug() << "Number of Monitors:" << xcb_randr_get_monitors_monitors_length(reply);
+ while(iter.rem>0){
+ qDebug() << "Found Monitor:";
+ //qDebug() << " Index:" << iter.index << "Rem:" << iter.rem;
+ QString name = atomToName(iter.data->name);
+ /*xcb_get_atom_name_reply_t *nreply = xcb_get_atom_name_reply(QX11Info::connection(), xcb_get_atom_name_unchecked(QX11Info::connection(), iter.data->name), NULL);
+ QString name = QString::fromLocal8Bit(xcb_get_atom_name_name(nreply), xcb_get_atom_name_name_length(nreply));
+ free(nreply);*/
+
+ qDebug() << " - Name:" << iter.data->name << name;
+ qDebug() << " - Primary:" << (iter.data->primary == 1);
+ qDebug() << " - Automatic:" << (iter.data->automatic == 1);
+ qDebug() << " - nOutput:" << iter.data->nOutput;
+ qDebug() << " - Geometry:" << QRect(iter.data->x, iter.data->y, iter.data->width, iter.data->height);
+ qDebug() << " - Physical Size (mm):" << iter.data->width_in_millimeters << "x" << iter.data->height_in_millimeters;
+ qDebug() << " - Number of outputs:" << xcb_randr_monitor_info_outputs_length(iter.data);
+ xcb_randr_monitor_info_next(&iter);
+ }
+
+ //Free up any objects we are done with
+ free(reply);
+ //Return the list
+ return list;
+}
+
+//FUNCTIONS (do not use directly - use the static list function instead)
+OutputDevice::OutputDevice(){
+ enabled = false;
+ p_obj = new p_objects();
+ p_obj->monitor_atom = 0;
+}
+
+OutputDevice::~OutputDevice(){
+
+}
+
+//Modification
+bool OutputDevice::setAsPrimary(){
+ if(isPrimary){ return true; }
+ if( !p_obj->outputs.isEmpty() ){
+ xcb_randr_set_output_primary (QX11Info::connection(), QX11Info::appRootWindow(), p_obj->outputs[0]);
+ isPrimary = true;
+ }
+ return isPrimary;
+}
+
+bool OutputDevice::disable(){
+ if(p_obj->monitor_atom!=0){
+ xcb_randr_delete_monitor(QX11Info::connection(), QX11Info::appRootWindow(), p_obj->monitor_atom);
+ p_obj->monitor_atom = 0;
+ return true;
+ }
+ return false;
+}
+
+void OutputDevice::enable(QRect geom){
+ //if no geom provided, will add as the right-most screen at optimal resolution
+ if(p_obj->monitor_atom!=0){ return; }
+ qDebug() << "Enable Monitor:" << geom;
+
+}
+
+void OutputDevice::changeResolution(QSize){
+
+}
+
+OutputDeviceList::OutputDeviceList(){
+ xcb_randr_get_screen_resources_reply_t *reply = xcb_randr_get_screen_resources_reply(QX11Info::connection(),
+ xcb_randr_get_screen_resources_unchecked(QX11Info::connection(), QX11Info::appRootWindow()),
+ NULL);
+ int outputnum = xcb_randr_get_screen_resources_outputs_length(reply);
+ qDebug() << "Probing Screen Resources:";
+ qDebug() << " - Number of Outputs:" << outputnum;
+ qDebug() << " - Number of CRTC's:" << xcb_randr_get_screen_resources_crtcs_length(reply);
+ int mode_len =xcb_randr_get_screen_resources_modes_length(reply);
+ qDebug() << " - Modes:" << mode_len;
+ for(int m=0; m<mode_len; m++){
+ xcb_randr_mode_info_t mode = xcb_randr_get_screen_resources_modes(reply)[m];
+ qDebug() << " -- Mode:" << mode.id;
+ qDebug() << " - Size:" << mode.width <<"x"<<mode.height;
+ }
+ //qDebug() << " -- " << atomsToNames( (xcb_atom_t*) xcb_randr_get_screen_resources_modes(reply), xcb_randr_get_screen_resources_modes_length(reply) );
+ qDebug() << " - Names:" << xcb_randr_get_screen_resources_names_length(reply);
+ //qDebug() << " -- " << atomsToNames( (xcb_atom_t*) xcb_randr_get_screen_resources_names(reply), xcb_randr_get_screen_resources_names_length(reply));
+ for(int i=0; i<outputnum; i++){
+ xcb_randr_output_t output = xcb_randr_get_screen_resources_outputs(reply)[i];
+ //Now display the info about this output
+ xcb_randr_get_output_info_reply_t *info = xcb_randr_get_output_info_reply(QX11Info::connection(),
+ xcb_randr_get_output_info_unchecked(QX11Info::connection(), output, QX11Info::appTime()),
+ NULL);
+ qDebug() << "==== Output Information #"+QString::number(i);
+
+ //Modes
+ qDebug() << "Number of Modes:" << xcb_randr_get_output_info_modes_length(info);
+
+
+ //Clones
+ qDebug() << "Number of Clones:" << xcb_randr_get_output_info_clones_length(info);
+
+ //Names
+ int name_len = xcb_randr_get_output_info_name_length(info);
+ qDebug() << "Names:" << atomsToNames( (xcb_atom_t*) xcb_randr_get_output_info_name(info), name_len);
+ for(int n=0; n<name_len; n++){
+ QString name = atomToName( xcb_randr_get_output_info_name(info)[n] );
+ qDebug() << " -- " << name;
+ }
+
+ //Properties
+ xcb_randr_list_output_properties_reply_t *pinfo = xcb_randr_list_output_properties_reply(QX11Info::connection(),
+ xcb_randr_list_output_properties_unchecked(QX11Info::connection(), output),
+ NULL);
+ int pinfo_len = xcb_randr_list_output_properties_atoms_length(pinfo);
+ qDebug() << "Properties:" << pinfo_len;
+ for(int p=0; p<pinfo_len; p++){
+ xcb_atom_t atom = xcb_randr_list_output_properties_atoms(pinfo)[p];
+ //Property Name
+ QString name = atomToName(atom);
+ //Property Value
+ xcb_randr_query_output_property_reply_t *pvalue = xcb_randr_query_output_property_reply(QX11Info::connection(),
+ xcb_randr_query_output_property_unchecked(QX11Info::connection(), output, atom),
+ NULL);
+ QStringList values = atomsToNames ( (xcb_atom_t*) xcb_randr_query_output_property_valid_values(pvalue), xcb_randr_query_output_property_valid_values_length(pvalue) ); //need to read values
+ /*for(int v=0; v<xcb_randr_query_output_property_valid_values_length(pvalue); v++){
+ //values << QString::number(xcb_randr_query_output_property_valid_values(pvalue)[v] );
+ values << atomToName( xcb_randr_query_output_property_valid_values(pvalue)[v] );
+ }*/
+ free(pvalue);
+ qDebug() << " -- " << name << "=" << values;
+
+ }
+ free(pinfo);
+
+ free(info);
+ }
+
+ free(reply);
+}
+
+OutputDeviceList::~OutputDeviceList(){
+
+}
+
+//Simplification functions for dealing with multiple monitors
+void OutputDeviceList::setPrimaryMonitor(QString id){
+
+}
+
+void OutputDeviceList::disableMonitor(QString id){
+
+}
diff --git a/src-qt5/core/libLumina/LuminaRandR.cpp b/src-qt5/core/libLumina/LuminaRandR.cpp
deleted file mode 100644
index eefc5aa8..00000000
--- a/src-qt5/core/libLumina/LuminaRandR.cpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "LuminaRandR.h"
diff --git a/src-qt5/core/libLumina/LuminaRandR.h b/src-qt5/core/libLumina/LuminaRandR.h
index 3cdff651..448c676d 100644
--- a/src-qt5/core/libLumina/LuminaRandR.h
+++ b/src-qt5/core/libLumina/LuminaRandR.h
@@ -1,35 +1,70 @@
//===========================================
// Lumina-DE source code
-// Copyright (c) 2016, Ken Moore
+// Copyright (c) 2017, Ken Moore
// Available under the 3-clause BSD license
// See the LICENSE file for full details
//===========================================
// This class governs all the xcb/randr interactions
// and provides simpler Qt-based functions for use elsewhere
//===========================================
+#ifndef _LUMINA_LIBRARY_RANDR_MONITORS_H
+#define _LUMINA_LIBRARY_RANDR_MONITORS_H
//Qt includes
#include <QSize>
+#include <QString>
+#include <QPoint>
+#include <QRect>
+#include <QList>
-#include "xcb/randr.h"
-class outputDevice{
+class OutputDevice{
public:
QString id; //output ID
bool enabled;
+ bool isPrimary;
//Monitor Geometry
QPoint geom; //geometry of monitor within session
//Monitor Resolution
QSize cRes; //current resolution of the monitor (could be different from geom.size() if panning is enabled)
QList<QSize> availRes; //available resolutions supported by the monitor
//Refresh Rate
- int cHz; //current refresh rate
- QList<int> availHz; //available refresh rates
+ //int cHz; //current refresh rate
+ //QList<int> availHz; //available refresh rates
//Expand this later to include:
// panning (current/possible)
// rotation (current/possible)
- //FUNCTIONS
-
- //Modification
+ //Global Listing of Devices
+ static QList<OutputDevice> availableMonitors();
+
+ //FUNCTIONS (do not use directly - use the static list function instead)
+ OutputDevice();
+ ~OutputDevice();
+
+ //Modification
+ bool setAsPrimary();
+ bool disable();
+ void enable(QRect geom = QRect()); //if no geom provided, will add as the right-most screen at optimal resolution
+ void changeResolution(QSize);
+
+ //Now define a simple public_objects class so that each implementation
+ // has a storage container for placing private objects as needed
+ class p_objects;
+ p_objects* p_obj;
+};
+
+class OutputDeviceList : public QList<OutputDevice>{
+public:
+ OutputDeviceList();
+ ~OutputDeviceList();
+
+ //Simplification functions for dealing with multiple monitors
+ void setPrimaryMonitor(QString id);
+ void disableMonitor(QString id);
+ //void enableMonitor(QString id,
+
+private:
+
};
+#endif
diff --git a/src-qt5/core/libLumina/LuminaRandR.pri b/src-qt5/core/libLumina/LuminaRandR.pri
new file mode 100644
index 00000000..0812819f
--- /dev/null
+++ b/src-qt5/core/libLumina/LuminaRandR.pri
@@ -0,0 +1,12 @@
+#include("$${PWD}/../../OS-detect.pri")
+
+QT *= x11extras
+
+#X11/XCB includes
+LIBS *= -lxcb -lxcb-randr
+SOURCES *= $${PWD}/LuminaRandR-X11.cpp
+
+#General API/Header
+HEADERS *= $${PWD}/LuminaRandR.h
+
+INCLUDEPATH *= ${PWD}
diff --git a/src-qt5/core/libLumina/LuminaX11.cpp b/src-qt5/core/libLumina/LuminaX11.cpp
index a8016460..e9eb4b7c 100644
--- a/src-qt5/core/libLumina/LuminaX11.cpp
+++ b/src-qt5/core/libLumina/LuminaX11.cpp
@@ -1470,7 +1470,17 @@ void LXCB::WM_ICCCM_SetProtocols(WId win, LXCB::ICCCM_PROTOCOLS flags){
// _NET_SUPPORTED (Root)
void LXCB::WM_Set_Root_Supported(){
//NET_WM standards (ICCCM implied - no standard way to list those)
- xcb_atom_t list[] = {};
+ xcb_atom_t list[] = {EWMH._NET_WM_NAME,
+ EWMH._NET_WM_ICON,
+ EWMH._NET_WM_ICON_NAME,
+ EWMH._NET_WM_DESKTOP,
+ /*_NET_WINDOW_TYPE (and all the various types)*/
+ EWMH._NET_WM_WINDOW_TYPE, EWMH._NET_WM_WINDOW_TYPE_DESKTOP, EWMH._NET_WM_WINDOW_TYPE_DOCK,
+ EWMH._NET_WM_WINDOW_TYPE_TOOLBAR, EWMH._NET_WM_WINDOW_TYPE_MENU, EWMH._NET_WM_WINDOW_TYPE_UTILITY,
+ EWMH._NET_WM_WINDOW_TYPE_SPLASH, EWMH._NET_WM_WINDOW_TYPE_DIALOG, EWMH._NET_WM_WINDOW_TYPE_NORMAL,
+ EWMH._NET_WM_WINDOW_TYPE_DROPDOWN_MENU, EWMH._NET_WM_WINDOW_TYPE_POPUP_MENU, EWMH._NET_WM_WINDOW_TYPE_TOOLTIP,
+ EWMH._NET_WM_WINDOW_TYPE_NOTIFICATION, EWMH._NET_WM_WINDOW_TYPE_COMBO, EWMH._NET_WM_WINDOW_TYPE_DND,
+ };
xcb_ewmh_set_supported(&EWMH, QX11Info::appScreen(), 0,list);
}
@@ -1609,7 +1619,23 @@ WId LXCB::WM_Get_Active_Window(){
}
void LXCB::WM_Set_Active_Window(WId win){
- xcb_ewmh_set_active_window(&EWMH, QX11Info::appScreen(), win);
+ xcb_ewmh_set_active_window(&EWMH, QX11Info::appScreen(), win);
+ //Also send the active window a message to take input focus
+ //Send the window a WM_TAKE_FOCUS message
+ if(atoms.isEmpty()){ createWMAtoms(); } //need these atoms
+ xcb_client_message_event_t event;
+ event.response_type = XCB_CLIENT_MESSAGE;
+ event.format = 32;
+ event.window = win;
+ event.type = ATOMS[atoms.indexOf("WM_PROTOCOLS")];
+ event.data.data32[0] = ATOMS[atoms.indexOf("WM_TAKE_FOCUS")];
+ event.data.data32[1] = XCB_TIME_CURRENT_TIME; //CurrentTime;
+ event.data.data32[2] = 0;
+ event.data.data32[3] = 0;
+ event.data.data32[4] = 0;
+
+ xcb_send_event(QX11Info::connection(), 0, win, XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *) &event);
+ xcb_flush(QX11Info::connection());
}
// _NET_WORKAREA
diff --git a/src-qt5/core/libLumina/LuminaX11.h b/src-qt5/core/libLumina/LuminaX11.h
index 2c741111..2f66ce06 100644
--- a/src-qt5/core/libLumina/LuminaX11.h
+++ b/src-qt5/core/libLumina/LuminaX11.h
@@ -23,7 +23,6 @@
#include <QObject>
#include <QFlags>
-
#include <xcb/xcb_ewmh.h>
//SYSTEM TRAY STANDARD DEFINITIONS
@@ -67,6 +66,18 @@ public:
|| width_inc>=0 || height_inc>=0 || min_aspect_num>=0 || min_aspect_den>=0 || max_aspect_num>=0 || max_aspect_den>=0 \
|| base_width>=0 || base_height>=0 || win_gravity>0 );
}
+ bool validMaxSize(){
+ return (max_width>0 && max_width>=min_width) && (max_height>0 && max_height>=min_height);
+ }
+ bool validMinSize(){
+ return (min_width>0 && min_height>0);
+ }
+ bool validBaseSize(){
+ return (base_width>0 && base_height>0);
+ }
+ bool validSize(){ //only check this if the base sizes are invalid (this is the old spec and should not be used any more)
+ return (x>0 && y>0);
+ }
};
//simple data structure for passing around the XRANDR information
diff --git a/src-qt5/core/libLumina/LuminaXDG.cpp b/src-qt5/core/libLumina/LuminaXDG.cpp
index d92285c5..38128fc7 100644
--- a/src-qt5/core/libLumina/LuminaXDG.cpp
+++ b/src-qt5/core/libLumina/LuminaXDG.cpp
@@ -127,9 +127,8 @@ void XDGDesktop::sync(){
else if(var=="Type" && insection){
if(val.toLower()=="application"){ type = XDGDesktop::APP; }
else if(val.toLower()=="link"){ type = XDGDesktop::LINK; }
- else if(val.toLower()=="dir"){ type = XDGDesktop::DIR; }
+ else if(val.toLower().startsWith("dir")){ type = XDGDesktop::DIR; } //older specs are "Dir", newer specs are "Directory"
else{ type = XDGDesktop::BAD; } //Unknown type
- //hasType = true;
}
} //end reading file
file.clear(); //done with contents of file
@@ -176,7 +175,7 @@ bool XDGDesktop::isValid(bool showAll){
//if(DEBUG && !ok){ qDebug() << " - Link with missing URL"; }
break;
case XDGDesktop::DIR:
- ok = !path.isEmpty();
+ ok = !path.isEmpty() && QFile::exists(path);
//if(DEBUG && !ok){ qDebug() << " - Dir with missing path"; }
break;
default:
diff --git a/src-qt5/core/libLumina/NativeWindow.cpp b/src-qt5/core/libLumina/NativeWindow.cpp
new file mode 100644
index 00000000..bd42ecaa
--- /dev/null
+++ b/src-qt5/core/libLumina/NativeWindow.cpp
@@ -0,0 +1,37 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2017, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "NativeWindow.h"
+
+// === PUBLIC ===
+NativeWindow::NativeWindow(WId id) : QObject(){
+ winid = id;
+ WIN = QWindow::fromWinId(winid);
+}
+
+NativeWindow::~NativeWindow(){
+ hash.clear();
+ //WIN->deleteLater(); //This class only deals with Native windows which were created outside the app - they need to be cleaned up outside the app too
+}
+
+WId NativeWindow::id(){
+ return winid;
+}
+
+QWindow* NativeWindow::window(){
+ return WIN;
+}
+
+QVariant NativeWindow::property(NativeWindow::Property prop){
+ if(hash.contains(prop)){ return hash.value(prop); }
+ return QVariant(); //null variant
+}
+
+void NativeWindow::setProperty(NativeWindow::Property prop, QVariant val){
+ if(prop == NativeWindow::None){ return; }
+ hash.insert(prop, val);
+ emit PropertyChanged(prop, val);
+}
diff --git a/src-qt5/core/libLumina/NativeWindow.h b/src-qt5/core/libLumina/NativeWindow.h
new file mode 100644
index 00000000..59b955c3
--- /dev/null
+++ b/src-qt5/core/libLumina/NativeWindow.h
@@ -0,0 +1,81 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2017, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This is a container object for setting/announcing changes
+// in a native window's properties.
+// The WM will usually run the "setProperty" function on this object,
+// and any other classes/widgets which watch this window can act appropriatly after-the-fact
+// Non-WM classes should use the "Request" signals to ask the WM to do something, and listen for changes later
+//===========================================
+#ifndef _LUMINA_DESKTOP_NATIVE_WINDOW_H
+#define _LUMINA_DESKTOP_NATIVE_WINDOW_H
+
+#include <QString>
+#include <QRect>
+#include <QSize>
+#include <QObject>
+#include <QWindow>
+#include <QHash>
+#include <QVariant>
+
+class NativeWindow : public QObject{
+ Q_OBJECT
+public:
+ enum State{ S_MODAL, S_STICKY, S_MAX_VERT, S_MAX_HORZ, S_SHADED, S_SKIP_TASKBAR, S_SKIP_PAGER, S_HIDDEN, S_FULLSCREEN, S_ABOVE, S_BELOW, S_ATTENTION };
+ enum Type{T_DESKTOP, T_DOCK, T_TOOLBAR, T_MENU, T_UTILITY, T_SPLASH, T_DIALOG, T_DROPDOWN_MENU, T_POPUP_MENU, T_TOOLTIP, T_NOTIFICATION, T_COMBO, T_DND, T_NORMAL };
+ enum Action {A_MOVE, A_RESIZE, A_MINIMIZE, A_SHADE, A_STICK, A_MAX_VERT, A_MAX_HORZ, A_FULLSCREEN, A_CHANGE_DESKTOP, A_CLOSE, A_ABOVE, A_BELOW};
+
+ enum Property{ /*QVariant Type*/
+ None, /*null*/
+ MinSize, /*QSize*/
+ MaxSize, /*QSize*/
+ Size, /*QSize*/
+ GlobalPos, /*QPoint*/
+ Title, /*QString*/
+ ShortTitle, /*QString*/
+ Icon, /*QIcon*/
+ Name, /*QString*/
+ Workspace, /*int*/
+ States, /*QList<NativeWindow::State> : Current state of the window */
+ WinTypes, /*QList<NativeWindow::Type> : Current type of window (typically does not change)*/
+ WinActions, /*QList<NativeWindow::Action> : Current actions that the window allows (Managed/set by the WM)*/
+ Active, /*bool*/
+ Visible /*bool*/
+ };
+
+
+ NativeWindow(WId id);
+ ~NativeWindow();
+
+ WId id();
+ QWindow* window();
+
+ QVariant property(NativeWindow::Property);
+ void setProperty(NativeWindow::Property, QVariant);
+
+private:
+ QHash <NativeWindow::Property, QVariant> hash;
+ QWindow *WIN;
+ WId winid;
+
+signals:
+ //General Notifications
+ void PropertyChanged(NativeWindow::Property, QVariant);
+ void WindowClosed(WId);
+
+ //Action Requests (not automatically emitted - typically used to ask the WM to do something)
+ //Note: "WId" should be the NativeWindow id()
+ void RequestActivate(WId); //Activate the window
+ void RequestClose(WId); //Close the window
+ void RequestSetVisible(WId, bool); //Minimize/restore visiblility
+ void RequestSetGeometry(WId, QRect); //Register the location/size of the window
+ void RequestSetFrameExtents(WId, QList<int>); //Register the size of the frame around the window [Left,Right, Top,Bottom] in pixels
+
+ // System Tray Icon Embed/Unembed Requests
+ //void RequestEmbed(WId, QWidget*);
+ //void RequestUnEmbed(WId, QWidget*);
+};
+#endif
diff --git a/src-qt5/core/libLumina/NativeWindow.pri b/src-qt5/core/libLumina/NativeWindow.pri
new file mode 100644
index 00000000..4a585a06
--- /dev/null
+++ b/src-qt5/core/libLumina/NativeWindow.pri
@@ -0,0 +1,8 @@
+
+# Files
+SOURCES *= $${PWD}/NativeWindow.cpp
+
+HEADERS *= $${PWD}/NativeWindow.h
+
+INCLUDEPATH *= ${PWD}
+
diff --git a/src-qt5/core/libLumina/NativeWindowSystem.cpp b/src-qt5/core/libLumina/NativeWindowSystem.cpp
new file mode 100644
index 00000000..c8e6d483
--- /dev/null
+++ b/src-qt5/core/libLumina/NativeWindowSystem.cpp
@@ -0,0 +1,221 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2017, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This is the XCB version of the NativeWindowSystem class,
+// used for interacting with the X11 display system on BSD/Linux/Unix systems
+//===========================================
+#include "NativeWindowSystem.h"
+
+//Additional Qt includes
+#include <QX11Info>
+#include <QDebug>
+
+//XCB Library functions
+#include <xcb/xcb_ewmh.h>
+
+//XCB Library includes
+#include <xcb/xcb.h>
+#include <xcb/xcb_atom.h>
+#include <xcb/xproto.h>
+#include <xcb/xcb_ewmh.h>
+#include <xcb/xcb_icccm.h>
+#include <xcb/xcb_image.h>
+#include <xcb/xcb_aux.h>
+#include <xcb/composite.h>
+#include <xcb/damage.h>
+
+//XLib includes (XCB Damage lib does not appear to register for damage events properly)
+#include <X11/extensions/Xdamage.h>
+
+//SYSTEM TRAY STANDARD DEFINITIONS
+#define _NET_SYSTEM_TRAY_ORIENTATION_HORZ 0
+#define _NET_SYSTEM_TRAY_ORIENTATION_VERT 1
+#define SYSTEM_TRAY_REQUEST_DOCK 0
+#define SYSTEM_TRAY_BEGIN_MESSAGE 1
+#define SYSTEM_TRAY_CANCEL_MESSAGE 2
+
+#define URGENCYHINT (1L << 8) //For window urgency detection
+
+#define ROOT_WIN_EVENT_MASK (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | \
+ XCB_EVENT_MASK_BUTTON_PRESS | \
+ XCB_EVENT_MASK_STRUCTURE_NOTIFY | \
+ XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | \
+ XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | \
+ XCB_EVENT_MASK_POINTER_MOTION | \
+ XCB_EVENT_MASK_PROPERTY_CHANGE | \
+ XCB_EVENT_MASK_FOCUS_CHANGE | \
+ XCB_EVENT_MASK_ENTER_WINDOW)
+
+//Internal XCB private objects class
+class NativeWindowSystem::p_objects{
+public:
+ xcb_ewmh_connection_t EWMH; //This is where all the screen info and atoms are located
+ QHash<QString, xcb_atom_t> ATOMS;
+ xcb_screen_t *root_screen;
+ xcb_window_t root_window, wm_window, tray_window;
+
+ //Functions for setting up these objects as needed
+ bool init_ATOMS(){
+ QStringList atoms;
+ atoms << "WM_TAKE_FOCUS" << "WM_DELETE_WINDOW" << "WM_PROTOCOLS" << "WM_CHANGE_STATE" << "_NET_SYSTEM_TRAY_OPCODE" << "_NET_SYSTEM_TRAY_ORIENTATION" << "_NET_SYSTEM_TRAY_VISUAL" << QString("_NET_SYSTEM_TRAY_S%1").arg(QString::number(QX11Info::appScreen()));
+ //Create all the requests for the atoms
+ QList<xcb_intern_atom_reply_t*> reply;
+ for(int i=0; i<atoms.length(); i++){
+ reply << xcb_intern_atom_reply(QX11Info::connection(), \
+ xcb_intern_atom(QX11Info::connection(), 0, atoms[i].length(), atoms[i].toLocal8Bit()), NULL);
+ }
+ //Now evaluate all the requests and save the atoms
+ for(int i=0; i<reply.length(); i++){ //NOTE: this will always be the same length as the "atoms" list
+ if(reply[i]!=0){
+ obj->ATOMS.insert(atoms[i], reply[i]->atom);
+ free(reply[i]); //done with this reply
+ }else{
+ //Invalid atom - could not be created
+ qDebug() << "Could not initialize XCB atom:" << atoms[i];
+ }
+ } //loop over reply
+ return (obj->ATOMS.keys.length() == atoms.length());
+ }
+
+ bool register_wm(){
+ uint32_t value_list[1] = {ROOT_WIN_EVENT_MASK};
+ xcb_generic_error_t *status = xcb_request_check( QX11Info::connection(), xcb_change_window_attributes_checked(QX11Info::connection(), root_window, XCB_CW_EVENT_MASK, value_list));
+ if(status!=0){ return false; }
+ uint32_t params[] = {1};
+ wm_window = xcb_generate_id(QX11Info::connection()); //need a new ID
+ xcb_create_window(QX11Info::connection(), root_screen->root_depth, \
+ win, root_window, -1, -1, 1, 1, 0, \
+ XCB_WINDOW_CLASS_INPUT_OUTPUT, root_screen->root_visual, \
+ XCB_CW_OVERRIDE_REDIRECT, params);
+ if(wm_window==0){ return false; }
+ //Set the _NET_SUPPORTING_WM property on the root window first
+ xcb_ewmh_set_supporting_wm_check(&EWMH, root_window, wm_window);
+ //Also set this property on the child window (pointing to itself)
+ xcb_ewmh_set_supporting_wm_check(&EWMH, wm_window, wm_window);
+ //Now also setup the root event mask on the wm_window
+ status = xcb_request_check( QX11Info::connection(), xcb_change_window_attributes_checked(QX11Info::connection(), wm_window, XCB_CW_EVENT_MASK, value_list));
+ if(status!=0){ return false; }
+ return true;
+ }
+
+ bool startSystemTray{
+ xcb_atom_t _NET_SYSTEM_TRAY_S = ATOMS.value(QString("_NET_SYSTEM_TRAY_S%1").arg(QString::number(QX11Info::appScreen())) );
+ //Make sure that there is no other system tray running
+ xcb_get_selection_owner_reply_t *ownreply = xcb_get_selection_owner_reply(QX11Info::connection(), \
+ xcb_get_selection_owner_unchecked(QX11Info::connection(), _NET_SYSTEM_TRAY_S), NULL);
+ if(ownreply==0){
+ qWarning() << " - Could not get owner selection reply";
+ return false;
+ }else if(ownreply->owner != 0){
+ free(ownreply);
+ qWarning() << " - An alternate system tray is currently in use";
+ return false;
+ }
+ free(ownreply);
+ //Now create the window to use (just offscreen)
+ //TODO
+ }
+
+}; //end private objects class
+
+
+//inline functions for setting up the internal objects
+
+
+// === PUBLIC ===
+NativeWindowSystem::NativeWindowSystem() : QObject(){
+ obj = 0;
+}
+
+NativeWindowSystem::~NativeWindowSystem(){
+ xcb_ewmh_connection_wipe(obj->EWMH);
+ free(obj);
+}
+
+//Overarching start/stop functions
+bool NativeWindowSystem::start(){
+ //Initialize the XCB/EWMH objects
+ if(obj==0){
+ obj = new p_objects(); } //instantiate the private objects
+ obj->wm_window = 0;
+ obj->tray_window = 0;
+ xcb_intern_atom_cookie_t *cookie = xcb_ewmh_init_atoms(QX11Info::connection(), &obj->EWMH);
+ if(!xcb_ewmh_init_atoms_replies(&obj->EWMH, cookie, NULL) ){
+ qDebug() << "Error with XCB atom initializations";
+ return false;
+ }
+ obj->root_screen = xcb_aux_get_screen(QX11Info::connection(), QX11Info::appScreen());
+ obj->root_window = obj->root_screen->root; //simplification for later - minor duplication of memory (unsigned int)
+ //Initialize all the extra atoms that the EWMH object does not have
+ if( !obj->init_ATOMS() ){ return false; }
+ } //Done with private object init
+
+ return true;
+}
+
+void NativeWindowSystem::stop(){
+
+}
+
+// === PRIVATE ===
+void NativeWindowSystem::UpdateWindowProperties(NativeWindow* win, QList< NativeWindow::Property > props){
+
+}
+
+// === PUBLIC SLOTS ===
+//These are the slots which are only used by the desktop system itself or the NativeWindowEventFilter
+void NativeWindowSystem::RegisterVirtualRoot(WId){
+
+}
+
+//NativeWindowEventFilter interactions
+void NativeWindowSystem::NewWindowDetected(WId){
+
+}
+
+void NativeWindowSystem::WindowCloseDetected(WId){
+
+}
+
+void NativeWindowSystem::WindowPropertyChanged(WId, NativeWindow::Property){
+
+}
+
+void NativeWindowSystem::NewKeyPress(int keycode){
+
+}
+
+void NativeWindowSystem::NewKeyRelease(int keycode){
+
+}
+
+void NativeWindowSystem::NewMousePress(int buttoncode){
+
+}
+
+void NativeWindowSystem::NewMouseRelease(int buttoncode){
+
+}
+
+// === PRIVATE SLOTS ===
+//These are the slots which are built-in and automatically connected when a new NativeWindow is created
+void NativeWindowSystem::RequestActivate(WId){
+
+}
+void NativeWindowSystem::RequestClose(WId){
+
+}
+
+void NativeWindowSystem::RequestSetVisible(WId, bool){
+
+}
+void NativeWindowSystem::RequestSetGeometry(WId, QRect){
+
+}
+void NativeWindowSystem::RequestSetFrameExtents(WId, QList<int>){
+ //[Left,Top,Right,Bottom] in pixels
+
+}
diff --git a/src-qt5/core/libLumina/NativeWindowSystem.h b/src-qt5/core/libLumina/NativeWindowSystem.h
new file mode 100644
index 00000000..ef169059
--- /dev/null
+++ b/src-qt5/core/libLumina/NativeWindowSystem.h
@@ -0,0 +1,92 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2017, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This is a Qt5/Lumina wrapper around native graphics system calls
+// It is primarily designed around the creation/modification of instances of
+// the "NativeWindow" class for passing information around
+//===========================================
+#ifndef _LUMINA_NATIVE_WINDOW_SYSTEM_H
+#define _LUMINA_NATIVE_WINDOW_SYSTEM_H
+
+#include "NativeWindow.h"
+
+class NativeWindowSystem : public QObject{
+ Q_OBJECT
+private:
+ QList<NativeWindow*> NWindows;
+ QList<NativeWindow*> TWindows;
+
+ //Simplifications to find an already-created window object
+ NativeWindow* findWindow(WId id){
+ for(int i=0; i<NWindows.length(); i++){
+ if(id==NWindows[i]->id()){ return NWindows[i]; }
+ }
+ }
+
+ NativeWindow* findTrayWindow(WId id){
+ for(int i=0; i<TWindows.length(); i++){
+ if(id==TWindows[i]->id()){ return TWindows[i]; }
+ }
+ }
+
+ //Now define a simple private_objects class so that each implementation
+ // has a storage container for placing private objects as needed
+ class p_objects;
+ p_objects* obj;
+
+ // Since some properties may be easier to update in bulk
+ // let the native system interaction do them in whatever logical groups are best
+ void UpdateWindowProperties(NativeWindow* win, QList< NativeWindow::Property > props);
+
+public:
+ NativeWindowSystem();
+ ~NativeWindowSystem();
+
+ //Overarching start/stop functions
+ bool start();
+ void stop();
+
+ //General-purpose listing functions
+ QList<NativeWindow*> currentWindows(){ return NWindows; }
+
+public slots:
+ //These are the slots which are typically only used by the desktop system itself or the NativeWindowEventFilter
+
+ //RootWindow interactions
+ void RegisterVirtualRoot(WId);
+ //void GoToWorkspace(int);
+ //void RegisterWorkspaces(QStringList); //Names of workspaces, in ascending order
+ //void RegisterKnownInteractions();
+
+
+ //NativeWindowEventFilter interactions
+ void NewWindowDetected(WId); //will automatically create the new NativeWindow object
+ void WindowCloseDetected(WId); //will update the lists and make changes if needed
+ void WindowPropertyChanged(WId, NativeWindow::Property); //will rescan the window and update the object as needed
+ void NewKeyPress(int keycode);
+ void NewKeyRelease(int keycode);
+ void NewMousePress(int buttoncode);
+ void NewMouseRelease(int buttoncode);
+ void CheckDamageID(WId);
+
+private slots:
+ //These are the slots which are built-in and automatically connected when a new NativeWindow is created
+ void RequestActivate(WId);
+ void RequestClose(WId);
+ void RequestSetVisible(WId, bool);
+ void RequestSetGeometry(WId, QRect);
+ void RequestSetFrameExtents(WId, QList<int>); //[Left,Right,Top,Bottom] in pixels
+
+signals:
+ void NewWindowAvailable(NativeWindow*);
+ void NewInputEvent(); //a mouse or keypress was detected (lock-state independent);
+ void NewKeyPress(int); //only emitted if lockstate = false
+ void NewKeyRelease(int); //only emitted if lockstate = false
+ void NewMousePress(Qt::MouseButton); //only emitted if lockstate = false
+
+};
+
+#endif
diff --git a/src-qt5/core/libLumina/RootSubWindow.cpp b/src-qt5/core/libLumina/RootSubWindow.cpp
new file mode 100644
index 00000000..7be89f48
--- /dev/null
+++ b/src-qt5/core/libLumina/RootSubWindow.cpp
@@ -0,0 +1,110 @@
+//===========================================
+// Lumina Desktop source code
+// Copyright (c) 2017, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "RootSubWindow.h"
+#include <QDebug>
+
+// === PUBLIC ===
+RootSubWindow::RootSubWindow(QMdiArea *root, NativeWindow *win) : QMdiSubWindow(0){
+ this->setAttribute(Qt::WA_DeleteOnClose);
+ //Create the QWindow and QWidget containers for the window
+ WIN = win;
+ closing = false;
+ WinWidget = QWidget::createWindowContainer( WIN->window(), this);
+ this->setWidget(WinWidget);
+ LoadProperties( QList< NativeWindow::Property>() << NativeWindow::WindowFlags << NativeWindow::Title << NativeWindow::Icon \
+ << NativeWindow::MinSize << NativeWindow::MaxSize << NativeWindow::Size );
+ //Hookup the signals/slots
+ connect(this, SIGNAL(aboutToActivate()), this, SLOT(aboutToActivate()) );
+ connect(WIN, SIGNAL(PropertyChanged(NativeWindow::Property, QVariant)), this, SLOT(propertyChanged(NativeWindow::Property, QVariant)));
+ //Now add this window to the root QMdiArea
+ root->addSubWindow(this);
+ //Make sure the visibily property only gets loaded after it is added to the root area
+ propertyChanged(NativeWindow::Visible, WIN->property(NativeWindow::Visible));
+}
+
+RootSubWindow::~RootSubWindow(){
+
+}
+
+WId RootSubWindow::id(){
+ return WIN->id();
+}
+
+// === PRIVATE ===
+void RootSubWindow::LoadProperties( QList< NativeWindow::Property> list){
+ for(int i=0; i<list.length(); i++){
+ propertyChanged( list[i], WIN->property(list[i]) );
+ }
+}
+
+// === PUBLIC SLOTS ===
+void RootSubWindow::clientClosed(){
+ qDebug() << "Client Closed";
+ closing = true;
+ this->close();
+}
+
+void RootSubWindow::clientHidden(){
+ qDebug() << "Client Hidden";
+ this->hide();
+}
+
+void RootSubWindow::clientShown(){
+ qDebug() << "Client Shown";
+ this->show();
+}
+
+// === PRIVATE SLOTS ===
+void RootSubWindow::aboutToActivate(){
+ WIN->emit RequestActivate(WIN->id());
+}
+
+void RootSubWindow::propertyChanged(NativeWindow::Property prop, QVariant val){
+ if(val.isNull()){ return; } //not the same as a default/empty value - the property has just not been set yet
+ qDebug() << "Set Window Property:" << prop << val;
+ switch(prop){
+ case NativeWindow::Visible:
+ if(val.toBool()){ clientShown(); }
+ else{ clientHidden(); }
+ break;
+ case NativeWindow::Title:
+ this->setWindowTitle(val.toString());
+ break;
+ case NativeWindow::Icon:
+ this->setWindowIcon(val.value< QIcon>());
+ break;
+ case NativeWindow::Size:
+ this->resize(val.toSize());
+ break;
+ case NativeWindow::MinSize:
+ this->setMinimumSize(val.toSize());
+ break;
+ case NativeWindow::MaxSize:
+ this->setMaximumSize(val.toSize());
+ break;
+ case NativeWindow::Active:
+ if(val.toBool()){ this->mdiArea()->setActiveSubWindow(this); }
+ break;
+ case NativeWindow::WindowFlags:
+ this->setWindowFlags( val.value< Qt::WindowFlags >() );
+ break;
+ default:
+ qDebug() << "Window Property Unused:" << prop << val;
+ }
+}
+
+// === PROTECTED ===
+void RootSubWindow::closeEvent(QCloseEvent *ev){
+ if(!closing){
+ //qDebug() << "Close Window By Button:" << WIN->id();
+ ev->ignore();
+ WIN->emit RequestClose(WIN->id());
+ }else{
+ QMdiSubWindow::closeEvent(ev);
+ }
+
+}
diff --git a/src-qt5/core/libLumina/RootSubWindow.h b/src-qt5/core/libLumina/RootSubWindow.h
new file mode 100644
index 00000000..c56f3c96
--- /dev/null
+++ b/src-qt5/core/libLumina/RootSubWindow.h
@@ -0,0 +1,51 @@
+//===========================================
+// Lumina Desktop source code
+// Copyright (c) 2017, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This class embeds a native window
+// within the RootWindow area
+//===========================================
+#ifndef _LUMINA_ROOT_WINDOW_SUB_WINDOW_H
+#define _LUMINA_ROOT_WINDOW_SUB_WINDOW_H
+
+#include <QMdiArea>
+#include <QMdiSubWindow>
+#include <QWindow>
+#include <QWidget>
+#include <QCloseEvent>
+
+#include <NativeWindow.h>
+
+class RootSubWindow : public QMdiSubWindow{
+ Q_OBJECT
+public:
+ RootSubWindow(QMdiArea *root, NativeWindow *win);
+ ~RootSubWindow();
+
+ WId id();
+
+private:
+ NativeWindow *WIN;
+ QWidget *WinWidget;
+ bool closing;
+
+ void LoadProperties( QList< NativeWindow::Property> list);
+
+public slots:
+ void clientClosed();
+
+private slots:
+ void clientHidden();
+ void clientShown();
+ void aboutToActivate();
+ void propertyChanged(NativeWindow::Property, QVariant);
+
+
+protected:
+ void closeEvent(QCloseEvent*);
+
+};
+
+#endif
diff --git a/src-qt5/core/libLumina/RootWindow.cpp b/src-qt5/core/libLumina/RootWindow.cpp
index aa5957b5..0758653b 100644
--- a/src-qt5/core/libLumina/RootWindow.cpp
+++ b/src-qt5/core/libLumina/RootWindow.cpp
@@ -11,7 +11,7 @@
#include <QDebug>
// === PUBLIC ===
-RootWindow::RootWindow() : QWidget(0, Qt::Window | Qt::BypassWindowManagerHint | Qt::WindowStaysOnBottomHint){
+RootWindow::RootWindow() : QMdiArea(0){ //QWidget(0, Qt::Window | Qt::BypassWindowManagerHint | Qt::WindowStaysOnBottomHint){
qRegisterMetaType<WId>("WId");
autoResizeTimer = 0;
}
@@ -166,13 +166,32 @@ void RootWindow::ChangeWallpaper(QString id, RootWindow::ScaleType scale, QStrin
}
+void RootWindow::NewWindow(NativeWindow *win){
+ RootSubWindow *subwin = 0;
+ for(int i=0; i<WINDOWS.length() && subwin==0; i++){
+ if(WINDOWS[i]->id() == win->id()){ subwin = WINDOWS[i]; }
+ }
+ if(subwin==0){
+ subwin = new RootSubWindow(this, win);
+ connect(win, SIGNAL(WindowClosed(WId)), this, SLOT(CloseWindow(WId)) );
+ WINDOWS << subwin;
+ }
+ //subwin->show();
+}
+
+void RootWindow::CloseWindow(WId win){
+ for(int i=0; i<WINDOWS.length(); i++){
+ if(WINDOWS[i]->id() == win){ WINDOWS.takeAt(i)->clientClosed(); break; }
+ }
+}
+
// === PRIVATE SLOTS ===
// === PROTECTED ===
void RootWindow::paintEvent(QPaintEvent *ev){
//qDebug() << "RootWindow: PaintEvent:" << ev->rect(); //<< QDateTime::currentDateTime()->toString(QDateTime::ShortDate);
bool found = false;
- QPainter painter(this);
+ QPainter painter(this->viewport());
for(int i=0; i<WALLPAPERS.length(); i++){
if(WALLPAPERS[i].area.intersects(ev->rect()) ){
found = true;
diff --git a/src-qt5/core/libLumina/RootWindow.h b/src-qt5/core/libLumina/RootWindow.h
index b371d239..5d3bc963 100644
--- a/src-qt5/core/libLumina/RootWindow.h
+++ b/src-qt5/core/libLumina/RootWindow.h
@@ -18,8 +18,12 @@
#include <QTimer>
#include <QApplication>
#include <QPaintEvent>
+#include <QMdiArea>
-class RootWindow : public QWidget{
+#include "RootSubWindow.h"
+#include "NativeWindow.h"
+
+class RootWindow : public QMdiArea{
Q_OBJECT
public:
enum ScaleType{ SolidColor, Stretch, Full, Fit, Center, Tile, BottomLeft, BottomRight, BottomCenter, \
@@ -43,11 +47,17 @@ private:
QList<screeninfo> WALLPAPERS;
void updateScreenPixmap(screeninfo *info); //used for recalculating the wallpaper pixmap based on file/area/scale as needed
+ //Window Management
+ QList<RootSubWindow*> WINDOWS;
+
public slots:
void ResizeRoot();
void ChangeWallpaper(QString id, RootWindow::ScaleType scale, QString file);
//Note: for "SingleColor" scaling the "file" variable should be "rgb(R,G,B)" or "#hexcode"
+ void NewWindow(NativeWindow*);
+ void CloseWindow(WId); //automatically connected for any new native window
+
private slots:
protected:
diff --git a/src-qt5/core/libLumina/RootWindow.pri b/src-qt5/core/libLumina/RootWindow.pri
index 7ef3efb0..35e0e770 100644
--- a/src-qt5/core/libLumina/RootWindow.pri
+++ b/src-qt5/core/libLumina/RootWindow.pri
@@ -1,9 +1,13 @@
# Files
-SOURCES *= $${PWD}/RootWindow.cpp
-HEADERS *= $${PWD}/RootWindow.h
+SOURCES *= $${PWD}/RootWindow.cpp \
+ $${PWD}/RootSubWindow.cpp
+
+HEADERS *= $${PWD}/RootWindow.h \
+ $${PWD}/RootSubWindow.h
INCLUDEPATH *= ${PWD}
-# include LUtils and LuminaX11
+# include other library dependencies
include(LUtils.pri)
+include(NativeWindow.pri);
diff --git a/src-qt5/core/libLumina/test/main.cpp b/src-qt5/core/libLumina/test/main.cpp
new file mode 100644
index 00000000..309fb938
--- /dev/null
+++ b/src-qt5/core/libLumina/test/main.cpp
@@ -0,0 +1,13 @@
+
+#include "../LuminaRandR.h"
+#include <QDebug>
+#include <QApplication>
+
+int main(int argc, char** argv){
+ QApplication A(argc, argv);
+ qDebug() << "Starting monitor scan...";
+ QList<OutputDevice> outputs = OutputDevice::availableMonitors();
+ qDebug() << "Finished monitor Scan";
+ OutputDeviceList();
+ return 0;
+}
diff --git a/src-qt5/core/libLumina/test/test.pro b/src-qt5/core/libLumina/test/test.pro
new file mode 100644
index 00000000..9674801b
--- /dev/null
+++ b/src-qt5/core/libLumina/test/test.pro
@@ -0,0 +1,7 @@
+QT = core gui widgets
+
+TARGET = test
+
+SOURCES += main.cpp
+
+include(../LuminaRandR.pri)
diff --git a/src-qt5/core/lumina-desktop-unified/LSession.cpp b/src-qt5/core/lumina-desktop-unified/LSession.cpp
index cb0144d5..1c8d3c45 100644
--- a/src-qt5/core/lumina-desktop-unified/LSession.cpp
+++ b/src-qt5/core/lumina-desktop-unified/LSession.cpp
@@ -24,11 +24,12 @@ RootWindow* Lumina::ROOTWIN = 0;
XDGDesktopList* Lumina::APPLIST = 0;
LShortcutEvents* Lumina::SHORTCUTS = 0;
-LSession::LSession(int &argc, char ** argv) : LSingleApplication(argc, argv, "lumina-desktop"){
+LSession::LSession(int &argc, char ** argv) : LSingleApplication(argc, argv, "lumina-desktop-unified"){
//Initialize the global objects to null pointers
mediaObj = 0; //private object used for playing login/logout chimes
if(this->isPrimaryProcess()){
//Setup the global registrations
+ qsrand(QDateTime::currentMSecsSinceEpoch());
this->setApplicationName("Lumina Desktop Environment");
this->setApplicationVersion( LDesktopUtils::LuminaDesktopVersion() );
this->setOrganizationName("LuminaDesktopEnvironment");
@@ -41,7 +42,7 @@ LSession::LSession(int &argc, char ** argv) : LSingleApplication(argc, argv, "lu
//this->setAttribute(Qt::AA_UseHighDpiPixmaps); //allow pixmaps to be scaled up as well as down
//Now initialize the global objects (but do not start them yet)
- Lumina::EFILTER = new EventFilter(); //Need the XCB Event filter
+ Lumina::EFILTER = new EventFilter(); //Need the XCB Event filter first
Lumina::SETTINGS = new DesktopSettings();
Lumina::SS = new LScreenSaver();
//Lumina::WM = new LWindowManager();
@@ -60,7 +61,7 @@ LSession::LSession(int &argc, char ** argv) : LSingleApplication(argc, argv, "lu
//Setup the various connections between the global classes
// NOTE: Most of these connections will only become "active" as the global objects get started during the setupSession routine
connect(Lumina::ROOTWIN, SIGNAL(RegisterVirtualRoot(WId)), Lumina::EFILTER, SLOT(RegisterVirtualRoot(WId)) );
-
+ connect(Lumina::EFILTER, SIGNAL(WindowCreated(NativeWindow*)), Lumina::ROOTWIN, SLOT(NewWindow(NativeWindow*)) );
} //end check for primary process
}
@@ -176,7 +177,7 @@ void LSession::setupSession(){
Lumina::SHORTCUTS->start(); //Startup the shortcut handler now
//for(int i=0; i<4; i++){ LSession::processEvents(); } //Again, just a few event loops here so thing can settle before we close the splash screen
//launchStartupApps();
- //QTimer::singleShot(500, this, SLOT(launchStartupApps()) );
+ QTimer::singleShot(500, this, SLOT(launchStartupApps()) );
splash.hide();
LSession::processEvents();
splash.close();
@@ -279,7 +280,7 @@ void LSession::launchStartupApps(){
LOS::setScreenBrightness( tmp );
qDebug() << " - - Screen Brightness:" << QString::number(tmp)+"%";
}
- QProcess::startDetached("nice lumina-open -autostart-apps");
+ //ExternalProcess::launch("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
diff --git a/src-qt5/core/lumina-desktop-unified/global-includes.h b/src-qt5/core/lumina-desktop-unified/global-includes.h
index 6a753cd1..867076db 100644
--- a/src-qt5/core/lumina-desktop-unified/global-includes.h
+++ b/src-qt5/core/lumina-desktop-unified/global-includes.h
@@ -57,6 +57,8 @@
#include <LuminaSingleApplication.h>
#include <DesktopSettings.h>
#include <RootWindow.h>
+#include <ExternalProcess.h>
+#include <NativeWindow.h>
// Standard C includes
#include <unistd.h>
diff --git a/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro b/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro
index 497ce635..1de8308d 100644
--- a/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro
+++ b/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro
@@ -17,6 +17,7 @@ include(../libLumina/LuminaSingleApplication.pri)
include(../libLumina/LuminaThemes.pri)
include(../libLumina/DesktopSettings.pri)
include(../libLumina/RootWindow.pri)
+include(../libLumina/ExternalProcess.pri)
#include all the main individual source groups
include(src-screensaver/screensaver.pri)
diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.cpp
index fa4af5ba..e363af01 100644
--- a/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.cpp
+++ b/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.cpp
@@ -24,7 +24,7 @@ void DesktopContextMenu::UpdateMenu(){
for(int i=0; i<items.length(); i++){
if(items[i]=="terminal"){ this->addAction(LXDG::findIcon("utilities-terminal",""), tr("Terminal"))->setWhatsThis("lumina-open -terminal"); }
else if(items[i]=="lockdesktop"){ this->addAction(LXDG::findIcon("system-lock-screen",""), tr("Lock Session"), this, SIGNAL(LockSession()) ); }
- else if(items[i]=="filemanager"){ this->addAction( LXDG::findIcon("user-home",""), tr("Browse Files"))->setWhatsThis("lumina-open ~"); }
+ else if(items[i]=="filemanager"){ this->addAction( LXDG::findIcon("user-home",""), tr("Browse Files"))->setWhatsThis("lumina-open \""+QDir::homePath()+"\""); }
//else if(items[i]=="applications"){ this->addMenu( LSession::handle()->applicationMenu() ); }
else if(items[i]=="line"){ this->addSeparator(); }
//else if(items[i]=="settings"){ this->addMenu( LSession::handle()->settingsMenu() ); }
@@ -34,7 +34,7 @@ void DesktopContextMenu::UpdateMenu(){
QString file = items[i].section("::::",1,1).simplified();
XDGDesktop xdgf(file);// = LXDG::loadDesktopFile(file, ok);
if(xdgf.type!=XDGDesktop::BAD){
- this->addAction( LXDG::findIcon(xdgf.icon,""), xdgf.name)->setWhatsThis(file);
+ this->addAction( LXDG::findIcon(xdgf.icon,""), xdgf.name)->setWhatsThis("lumina-open \""+file+"\"");
}else{
qDebug() << "Could not load application file:" << file;
}
@@ -86,8 +86,9 @@ void DesktopContextMenu::start(){
// === PRIVATE SLOTS ===
void DesktopContextMenu::LaunchAction(QAction *act){
if(act->whatsThis().isEmpty() || act->parent()!=this ){ return; }
+ qDebug() << "Launch Menu Action:" << act->whatsThis();
QString cmd = act->whatsThis();
- emit LaunchApplication(cmd);
+ ExternalProcess::launch(cmd);
}
void DesktopContextMenu::showMenu(const QPoint &pt){
diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.h b/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.h
index 1a4befc9..8b0509fb 100644
--- a/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.h
+++ b/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.h
@@ -30,7 +30,6 @@ private slots:
void showMenu(const QPoint&);
signals:
- void LaunchApplication(QString); //cmd to run
void LockSession();
void showLeaveDialog();
};
diff --git a/src-qt5/core/lumina-desktop-unified/src-events/LXcbEventFilter.cpp b/src-qt5/core/lumina-desktop-unified/src-events/LXcbEventFilter.cpp
index 4a192aa4..7031f3df 100644
--- a/src-qt5/core/lumina-desktop-unified/src-events/LXcbEventFilter.cpp
+++ b/src-qt5/core/lumina-desktop-unified/src-events/LXcbEventFilter.cpp
@@ -53,6 +53,7 @@ void EventFilter::start(){
XCB->setupEventsForRoot(WMFlag);
XCB->WM_Set_Supporting_WM(WMFlag);
+ XCB->WM_Set_Root_Supported(); //announce all the various options that the WM supports
static_cast<XCBEventFilter*>(EF)->startSystemTray();
QCoreApplication::instance()->flush();
@@ -71,11 +72,22 @@ unsigned int EventFilter::currentWorkspace(){
return XCB->CurrentWorkspace();
}
+QList<NativeWindow*> EventFilter::currentWindows(){
+ return static_cast<XCBEventFilter*>(EF)->windowList();
+}
+
// === PUBLIC SLOTS ===
void EventFilter::RegisterVirtualRoot(WId id){
XCB->WM_Set_Virtual_Roots( QList<WId>() << id );
}
+void EventFilter::TryCloseWindow(WId id){
+ XCB->WM_CloseWindow(id, false); //do not force close
+}
+
+void EventFilter::TryActivateWindow(WId id){
+ XCB->WM_Set_Active_Window(id);
+}
//=============================
// XCBEventFilter Class
//=============================
@@ -132,13 +144,13 @@ bool XCBEventFilter::nativeEventFilter(const QByteArray &eventType, void *messag
//==============================
case XCB_KEY_PRESS:
//This is a keyboard key press
- qDebug() << "Key Press Event";
+ //qDebug() << "Key Press Event";
stopevent = BlockInputEvent( ((xcb_key_press_event_t *) ev)->root ); //use the main "root" window - not the child widget
if(!stopevent){ obj->emit KeyPressed( InputWindow(((xcb_key_press_event_t *) ev)->root), ((xcb_key_press_event_t *) ev)->detail ); }
break;
case XCB_KEY_RELEASE:
//This is a keyboard key release
- qDebug() << "Key Release Event";
+ //qDebug() << "Key Release Event";
stopevent = BlockInputEvent( ((xcb_key_release_event_t *) ev)->root ); //use the main "root" window - not the child widget
if(!stopevent){ obj->emit KeyReleased( InputWindow(((xcb_key_release_event_t *) ev)->root), ((xcb_key_release_event_t *) ev)->detail ); }
break;
@@ -183,25 +195,42 @@ bool XCBEventFilter::nativeEventFilter(const QByteArray &eventType, void *messag
break;
//==============================
case XCB_MAP_NOTIFY:
+ //qDebug() << "Window Map Event:" << ((xcb_map_notify_event_t *)ev)->window;
+ if(Lumina::SS->isLocked()){ waitingToShow << ((xcb_map_notify_event_t *)ev)->window ; }
+ else{
+ for(int i=0; i<windows.length(); i++){
+ if(windows[i]->id() == ((xcb_map_notify_event_t *)ev)->window){ windows[i]->setProperty(NativeWindow::Visible, true); break; }
+ }
+ }
break; //This is just a notification that a window was mapped - nothing needs to change here
case XCB_MAP_REQUEST:
- qDebug() << "Window Map Request Event";
- obj->emit ModifyWindow( ((xcb_map_request_event_t *) ev)->window, Lumina::Show);
+ //qDebug() << "Window Map Request Event";
+ SetupNewWindow( ((xcb_map_request_event_t *) ev) );
break;
//==============================
case XCB_CREATE_NOTIFY:
- qDebug() << "Window Create Event";
+ //qDebug() << "Window Create Event";
break;
//==============================
case XCB_UNMAP_NOTIFY:
- qDebug() << "Window Unmap Event";
- obj->emit ModifyWindow( ((xcb_unmap_notify_event_t *)ev)->window, Lumina::Hide);
+ //qDebug() << "Window Unmap Event:" << ((xcb_unmap_notify_event_t *)ev)->window;
+ if(waitingToShow.contains(((xcb_unmap_notify_event_t *)ev)->window)){ waitingToShow.removeAll(((xcb_unmap_notify_event_t *)ev)->window); }
+ for(int i=0; i<windows.length(); i++){
+ if(windows[i]->id() == ((xcb_unmap_notify_event_t *)ev)->window){ windows[i]->setProperty(NativeWindow::Visible, false); break; }
+ }
break;
//==============================
case XCB_DESTROY_NOTIFY:
- qDebug() << "Window Closed Event";
+ //qDebug() << "Window Closed Event:" << ((xcb_destroy_notify_event_t *)ev)->window;
if( !rmTrayApp( ((xcb_destroy_notify_event_t *) ev)->window ) ){
- obj->emit WindowClosed( ((xcb_destroy_notify_event_t *) ev)->window );
+ //qDebug() <<" - Non-tray window";
+ for(int i=0; i<windows.length(); i++){
+ if(windows[i]->id() == ((xcb_destroy_notify_event_t *)ev)->window){
+ windows[i]->emit WindowClosed(windows[i]->id());
+ QTimer::singleShot(500, windows.takeAt(i), SLOT(deleteLater()) ); //give a few moments first, then clean up the object
+ break;
+ }
+ }
}
break;
//==============================
@@ -215,7 +244,7 @@ bool XCBEventFilter::nativeEventFilter(const QByteArray &eventType, void *messag
//==============================
case XCB_PROPERTY_NOTIFY:
//qDebug() << "Property Notify Event:";
- //qDebug() << " - Given Window:" << ((xcb_property_notify_event_t*)ev)->window;
+ ParsePropertyEvent((xcb_property_notify_event_t*)ev);
break;
//==============================
case XCB_CLIENT_MESSAGE:
@@ -305,6 +334,10 @@ bool XCBEventFilter::stopSystemTray(){
return true;
}
+QList<NativeWindow*> XCBEventFilter::windowList(){
+ return windows;
+}
+
//=========
// PRIVATE
//=========
@@ -389,3 +422,79 @@ void XCBEventFilter::checkDamageID(WId id){
//Could check for window damage ID's - but we should not need this
}
}
+
+// WINDOW HANDLING FUNCTIONS
+void XCBEventFilter::SetupNewWindow(xcb_map_request_event_t *ev){
+ WId win = ev->window;
+
+ bool ok = obj->XCB->WM_ManageWindow(win, true);
+ //Quick check if this is a transient window if we could not manage it directly
+ if(!ok){
+ WId tran = obj->XCB->WM_ICCCM_GetTransientFor(win);
+ if(tran!=win && tran!=0){
+ win = tran;
+ ok = obj->XCB->WM_ManageWindow(win);
+ }
+ }
+ qDebug() << "New Window:" << win << obj->XCB->WM_ICCCM_GetClass(win) << " Managed:" << ok;
+ obj->XCB->WM_Set_Active_Window(win);
+ //Determing the requested geometry/location/management within the event,
+ NativeWindow *nwin = new NativeWindow(win);
+ QObject::connect(nwin, SIGNAL(RequestClose(WId)), obj, SLOT(TryCloseWindow(WId)) );
+ QObject::connect(nwin, SIGNAL(RequestActivate(WId)), obj, SLOT(TryActivateWindow(WId)) );
+ windows << nwin;
+ bool show_now = !Lumina::SS->isLocked();
+ if(!show_now){ waitingToShow << win; } //add to the list to get set visible later
+ //populate the native window settings as they are right now
+ nwin->setProperty(NativeWindow::Active, true);
+ nwin->setProperty(NativeWindow::Visible, show_now);
+ nwin->setProperty(NativeWindow::Workspace, obj->XCB->CurrentWorkspace());
+ icccm_size_hints hints = obj->XCB->WM_ICCCM_GetNormalHints(win);
+ if(!hints.isValid()){ hints = obj->XCB->WM_ICCCM_GetSizeHints(win); }
+ if(hints.validMinSize()){ nwin->setProperty(NativeWindow::MinSize, QSize(hints.min_width,hints.min_height)); }
+ if(hints.validMaxSize()){ nwin->setProperty(NativeWindow::MaxSize, QSize(hints.max_width,hints.max_height)); }
+ if(hints.validBaseSize()){ nwin->setProperty(NativeWindow::Size, QSize(hints.base_width,hints.base_height)); }
+ else if(hints.validSize()){ nwin->setProperty(NativeWindow::Size, QSize(hints.width, hints.height)); }
+ nwin->setProperty(NativeWindow::Icon, obj->XCB->WM_Get_Icon(win));
+ QString title = obj->XCB->WM_Get_Name(win);
+ if(title.isEmpty()){ title = obj->XCB->WM_Get_Visible_Name(win); }
+ if(title.isEmpty()){ title = obj->XCB->WM_ICCCM_GetName(win); }
+ nwin->setProperty(NativeWindow::Title, title);
+ title = obj->XCB->WM_Get_Icon_Name(win);
+ if(title.isEmpty()){ title = obj->XCB->WM_Get_Visible_Icon_Name(win); }
+ if(title.isEmpty()){ title = obj->XCB->WM_ICCCM_GetIconName(win); }
+ nwin->setProperty(NativeWindow::ShortTitle, title);
+
+ obj->emit WindowCreated(nwin);
+}
+
+void XCBEventFilter::ParsePropertyEvent(xcb_property_notify_event_t *ev){
+ //First find the NativeWindow associated with the event
+ NativeWindow *nwin = 0;
+ for(int i=0; i<windows.length() && nwin==0; i++){
+ if(windows[i]->id() == ev->window){ nwin = windows[i]; }
+ }
+ if(nwin==0){ return; } //unmanaged window - ignore this event
+ qDebug() << "Got Property Event:" << ev->window << ev->atom;
+ //Now determine which properties are getting changed, and update the native window as appropriate
+ if(ev->atom == obj->XCB->EWMH._NET_WM_NAME){
+ qDebug() << " - Found _NET_WM_NAME atom";
+ nwin->setProperty(NativeWindow::Title, obj->XCB->WM_Get_Name(nwin->id()));
+ }else if(ev->atom == obj->XCB->EWMH._NET_WM_ICON){
+ qDebug() << " - Found _NET_WM_ICON atom";
+ nwin->setProperty(NativeWindow::Icon, obj->XCB->WM_Get_Icon(nwin->id()));
+ }else if(ev->atom == obj->XCB->EWMH._NET_WM_ICON_NAME){
+ qDebug() << " - Found _NET_WM_ICON_NAME atom";
+ nwin->setProperty(NativeWindow::ShortTitle, obj->XCB->WM_Get_Icon_Name(nwin->id()));
+ }else if(ev->atom == obj->XCB->EWMH._NET_WM_DESKTOP){
+ qDebug() << " - Found _NET_WM_DESKTOP atom";
+ nwin->setProperty(NativeWindow::Workspace, obj->XCB->WM_Get_Desktop(nwin->id()));
+ }else if(ev->atom == obj->XCB->EWMH._NET_WM_WINDOW_TYPE ){
+ qDebug() << " - Found _NET_WM_WINDOW_TYPE atom";
+
+ }else if( ev->atom == obj->XCB->EWMH._NET_WM_STATE){
+ qDebug() << " - Found _NET_WM_STATE atom";
+
+ }
+
+}
diff --git a/src-qt5/core/lumina-desktop-unified/src-events/LXcbEventFilter.h b/src-qt5/core/lumina-desktop-unified/src-events/LXcbEventFilter.h
index 9e76ba53..9f2530e8 100644
--- a/src-qt5/core/lumina-desktop-unified/src-events/LXcbEventFilter.h
+++ b/src-qt5/core/lumina-desktop-unified/src-events/LXcbEventFilter.h
@@ -60,18 +60,21 @@ public:
//Public Session Interaction Functions
unsigned int currentWorkspace();
+
+ //Public Window Management Lists
+ QList<NativeWindow*> currentWindows(); //always returned in creation-order (oldest first)
//Variables/Functions needed by the XCBEventFilter class only (not really needed by anything else)
LXCB *XCB; //used to interact with the X11 graphics subsystem
public slots:
void RegisterVirtualRoot(WId);
+ void TryCloseWindow(WId);
+ void TryActivateWindow(WId);
signals:
void NewInputEvent();
- void NewManagedWindow(WId);
- void WindowClosed(WId);
- void ModifyWindow(WId win, Lumina::WindowAction);
+ void WindowCreated(NativeWindow*);
// Session Signals
void WorkspaceChanged(unsigned int);
@@ -99,6 +102,9 @@ public:
bool startSystemTray();
bool stopSystemTray();
+ //Window List Functions
+ QList<NativeWindow*> windowList();
+
private:
EventFilter *obj;
QList<xcb_atom_t> WinNotifyAtoms, SysNotifyAtoms;
@@ -119,13 +125,19 @@ private:
bool rmTrayApp(WId); //returns "true" if the tray app was found and removed
void checkDamageID(WId);
+ //Window List Variables
+ QList<NativeWindow*> windows;
+ QList<WId> waitingToShow;
+
//Longer Event handling functions
+ void SetupNewWindow(xcb_map_request_event_t *ev);
+
//bool ParseKeyPressEvent();
//bool ParseKeyReleaseEvent();
//bool ParseButtonPressEvent();
//bool ParseButtonReleaseEvent();
//bool ParseMotionEvent();
- //bool ParsePropertyEvent();
+ void ParsePropertyEvent(xcb_property_notify_event_t *ev);
//bool ParseClientMessageEvent();
//bool ParseDestroyEvent();
//bool ParseConfigureEvent();
diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.cpp b/src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.cpp
index 83b82ff8..9ad31f5c 100644
--- a/src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.cpp
+++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.cpp
@@ -19,6 +19,7 @@ SSBaseWidget::SSBaseWidget(QWidget *parent, QSettings *set) : QWidget(parent){
this->setObjectName("LuminaBaseSSWidget");
ANIM = 0;
this->setMouseTracking(true);
+ plugType="none";
}
SSBaseWidget::~SSBaseWidget(){
@@ -51,7 +52,7 @@ void SSBaseWidget::startPainting(){
//Now list all the various plugins and start them appropriately
QString style;
if(cplug=="none"){
- style = "background: transparent;"; //show the underlying black parent widget
+ style = "background: black;"; //show the underlying black parent widget
}else{
style = "background: black;";
}
diff --git a/src-qt5/core/lumina-desktop/LDesktop.cpp b/src-qt5/core/lumina-desktop/LDesktop.cpp
index d4ebaa7f..73ed6d47 100644
--- a/src-qt5/core/lumina-desktop/LDesktop.cpp
+++ b/src-qt5/core/lumina-desktop/LDesktop.cpp
@@ -265,7 +265,7 @@ void LDesktop::SettingsChanged(){
UpdatePanels();
UpdateMenu();
issyncing = false;
- QTimer::singleShot(100, this, SLOT(UnlockSettings()) ); //give it a few moments to settle before performing another sync
+ QTimer::singleShot(50, this, SLOT(UnlockSettings()) ); //give it a few moments to settle before performing another sync
}
void LDesktop::LocaleChanged(){
@@ -376,11 +376,11 @@ void LDesktop::UpdateDesktop(){
}
//Also show anything available in the /media directory
QDir media("/media");
- QStringList mediadirs = media.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name);
+ QStringList mediadirs = media.entryList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot, QDir::Name);
for(int i=0; i<mediadirs.length(); i++){
filelist << media.absoluteFilePath(mediadirs[i]);
}
- qDebug() << "Found media Dirs:" << mediadirs;
+ //qDebug() << "Found media Dirs:" << mediadirs;
UpdateDesktopPluginArea();
bgDesktop->LoadItems(plugins, filelist);
}
@@ -456,7 +456,7 @@ void LDesktop::UpdatePanels(){
}
}
//Give it a 1/2 second before ensuring that the visible desktop area is correct
- QTimer::singleShot(500, this, SLOT(UpdateDesktopPluginArea()) );
+ QTimer::singleShot(1500, this, SLOT(UpdateDesktopPluginArea()) );
}
void LDesktop::UpdateDesktopPluginArea(){
@@ -484,7 +484,8 @@ void LDesktop::UpdateDesktopPluginArea(){
}
//Now make sure the desktop plugin area is only the visible area
QRect rec = visReg.boundingRect();
- //qDebug() << " - DPArea: Panel-Adjusted rectangle:" << rec;
+// QRect rec = LSession::desktop()->availableGeometry(Screen());
+ qDebug() << " - DPArea: Panel-Adjusted rectangle:" << rec;
//LSession::handle()->XCB->SetScreenWorkArea((unsigned int) Screen(), rec);
//Now remove the X offset to place it on the current screen (needs widget-coords, not global)
globalWorkRect = rec; //save this for later
diff --git a/src-qt5/core/lumina-desktop/LDesktopPluginSpace.cpp b/src-qt5/core/lumina-desktop/LDesktopPluginSpace.cpp
index 18126dfa..75e4affc 100644
--- a/src-qt5/core/lumina-desktop/LDesktopPluginSpace.cpp
+++ b/src-qt5/core/lumina-desktop/LDesktopPluginSpace.cpp
@@ -325,8 +325,9 @@ void LDesktopPluginSpace::reloadPlugins(bool ForceIconUpdate ){
void LDesktopPluginSpace::paintEvent(QPaintEvent*ev){
if(!wallpaper.isNull()){
QPainter painter(this);
- painter.setBrush(wallpaper);
- painter.drawRect(ev->rect().adjusted(-1,-1,2,2));
+ //painter.setBrush(wallpaper);
+ //painter.drawRect(ev->rect().adjusted(-1,-1,2,2));
+ painter.drawPixmap(ev->rect(), wallpaper, ev->rect() );
}else{
QWidget::paintEvent(ev);
}
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp
index c8ecf2c8..76b27787 100644
--- a/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp
@@ -38,6 +38,7 @@ void AppLauncherPlugin::loadButton(){
int icosize = this->height()-4 - 2.2*button->fontMetrics().height();
button->setFixedSize( this->width()-4, this->height()-4);
button->setIconSize( QSize(icosize,icosize) );
+ button->setToolTip("");
QString txt;
if(path.endsWith(".desktop") && ok){
XDGDesktop file(path);
@@ -50,6 +51,7 @@ void AppLauncherPlugin::loadButton(){
}else{
button->setWhatsThis(file.filePath);
button->setIcon( QIcon(LXDG::findIcon(file.icon,"system-run").pixmap(QSize(icosize,icosize)).scaledToHeight(icosize, Qt::SmoothTransformation) ) );
+ if(!file.comment.isEmpty()){button->setWhatsThis(file.comment); }
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
@@ -90,7 +92,7 @@ void AppLauncherPlugin::loadButton(){
button->setIcon( QIcon(QPixmap::fromImage(img)) );
}
//Now adjust the visible text as necessary based on font/grid sizing
- button->setToolTip(txt);
+ if(button->toolTip().isEmpty()){ 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
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_da.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_da.ts
index b4ec953f..1d042180 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_da.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_da.ts
@@ -35,7 +35,7 @@
<location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="48"/>
<location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="76"/>
<source>Click to Set</source>
- <translation>Klik for at vælge</translation>
+ <translation>Klik for at sætte</translation>
</message>
<message>
<location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="137"/>
@@ -58,7 +58,7 @@
<message>
<location filename="../AppMenu.cpp" line="82"/>
<source>Manage Applications</source>
- <translation>Håndtér Programmer</translation>
+ <translation>Håndtér programmer</translation>
</message>
<message>
<location filename="../AppMenu.cpp" line="87"/>
@@ -123,7 +123,7 @@
<message>
<location filename="../AppMenu.cpp" line="108"/>
<source>Wine</source>
- <translation></translation>
+ <translation>Wine</translation>
</message>
<message>
<location filename="../AppMenu.cpp" line="109"/>
@@ -146,242 +146,242 @@
<message>
<location filename="../BootSplash.ui" line="94"/>
<source>Starting the Lumina Desktop...</source>
- <translation type="unfinished"></translation>
+ <translation>Starter Lumina-skrivebordet...</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="15"/>
<source>Version %1</source>
- <translation type="unfinished"></translation>
+ <translation>Version %1</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="39"/>
<source>This desktop is powered by coffee, coffee, and more coffee.</source>
- <translation type="unfinished"></translation>
+ <translation>Dette skrivebord er drevet af kaffe, kaffe og mere kaffe.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="41"/>
<source>Keep up with desktop news!</source>
- <translation type="unfinished"></translation>
+ <translation>Hold dig opdateret med skrivebordsnyheder!</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="43"/>
<source>There is a full handbook of information about the desktop available online.</source>
- <translation type="unfinished"></translation>
+ <translation>Der er en hel håndbog af information om skrivebordet online.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="45"/>
<source>Want to change the interface? Everything is customizable in the desktop configuration!</source>
- <translation type="unfinished"></translation>
+ <translation>Vil du ændre brugerfladen? Alt kan tilpasses i skrivebordskonfigurationen!</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="47"/>
<source>Lumina can easily reproduce the interface from most other desktop environments.</source>
- <translation type="unfinished"></translation>
+ <translation>Lumina kan nemt efterligne brugerfladen fra de fleste andre skrivebordsmiljøer.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="49"/>
<source>This desktop is generously sponsored by iXsystems</source>
- <translation type="unfinished"></translation>
+ <translation>Dette skrivebord er generøst sponsoreret af iXsystems</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="51"/>
<source>I have never been hurt by what I have not said</source>
- <translation type="unfinished"></translation>
+ <translation>Jeg har aldrig taget skade af det jeg aldrig har sagt</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="53"/>
<source>Gotta have more cowbell!</source>
- <translation type="unfinished"></translation>
+ <translation>Mere koklokke tak!</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="55"/>
<source>Everything has its beauty but not everyone sees it.</source>
- <translation type="unfinished"></translation>
+ <translation>Alt har sin skønhed, men alle ser det ikke.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="57"/>
<source>Before God we are all equally wise - and equally foolish.</source>
- <translation type="unfinished"></translation>
+ <translation>Før gud er vi alle lige kloge - og lige dumme.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="59"/>
<source>We cannot do everything at once, but we can do something at once.</source>
- <translation type="unfinished"></translation>
+ <translation>Vi kan ikke gøre alt på samme tid, men vi kan gøre noget på en gang.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="61"/>
<source>One with the law is a majority.</source>
- <translation type="unfinished"></translation>
+ <translation>En med loven er et flertal.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="63"/>
- <source>Don&apos;t expect to build up the weak by pulling down the strong.</source>
- <translation type="unfinished"></translation>
+ <source>Don't expect to build up the weak by pulling down the strong.</source>
+ <translation>Forvent ikke at opbygge det svage ved at nedrive det stærke.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="65"/>
- <source>You can&apos;t know too much, but you can say too much.</source>
- <translation type="unfinished"></translation>
+ <source>You can't know too much, but you can say too much.</source>
+ <translation>Du kan ikke vide hvor meget, men du kan sige for meget.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="67"/>
<source>Duty is not collective; it is personal.</source>
- <translation type="unfinished"></translation>
+ <translation>Pligt er ikke kollektivt; det er personligt.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="69"/>
<source>Any society that would give up a little liberty to gain a little security will deserve neither and lose both.</source>
- <translation type="unfinished"></translation>
+ <translation>Et samfund som ville opgive en smule frihed for at gå en smule sikkerhed vil ikke gøre sig fortjent til noget af det og miste begge.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="71"/>
<source>Never trust a computer you can’t throw out a window.</source>
- <translation type="unfinished"></translation>
+ <translation>Stol aldrig på en computer du ikke kan smide ud af et vindue.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="73"/>
<source>Study the past if you would define the future.</source>
- <translation type="unfinished"></translation>
+ <translation>Lær fortiden af kende hvis du definere fremtiden.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="75"/>
<source>The way to get started is to quit talking and begin doing.</source>
- <translation type="unfinished"></translation>
+ <translation>Måden at komme i gang, er at holde op med at snakke og begynde at gøre.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="77"/>
<source>Ask and it will be given to you; search, and you will find; knock and the door will be opened for you.</source>
- <translation type="unfinished"></translation>
+ <translation>Spørg, og det vil blive givet til dig; søg, og du vil finde; bank på, og døren vil blive åbnet for dig.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="79"/>
<source>Start where you are. Use what you have. Do what you can.</source>
- <translation type="unfinished"></translation>
+ <translation>Start hvor du er. Brug hvad du har. Gør hvad du kan.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="81"/>
<source>A person who never made a mistake never tried anything new.</source>
- <translation type="unfinished"></translation>
+ <translation>En person der aldrig har lavet fejl, har aldrig prøvet noget nyt.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="83"/>
<source>It does not matter how slowly you go as long as you do not stop.</source>
- <translation type="unfinished"></translation>
+ <translation>Det har ikke betydning hvor hurtigt du går, så længe du ikke stopper.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="85"/>
<source>Do what you can, where you are, with what you have.</source>
- <translation type="unfinished"></translation>
+ <translation>Gør hvad du kan, der hvor du er, med det du har.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="87"/>
<source>Remember no one can make you feel inferior without your consent.</source>
- <translation type="unfinished"></translation>
+ <translation>Husk, at ingen kan få dig til at føle dig underlegen, uden dit samtykke.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="89"/>
<source>It’s not the years in your life that count. It’s the life in your years.</source>
- <translation type="unfinished"></translation>
+ <translation>Det er ikke årene i dit liv der tæller. Det er livet i dine år.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="91"/>
<source>Either write something worth reading or do something worth writing.</source>
- <translation type="unfinished"></translation>
+ <translation>Skriv enten noget som er værd at læse, eller noget som er værd at skrive.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="93"/>
<source>The only way to do great work is to love what you do.</source>
- <translation type="unfinished"></translation>
+ <translation>Den eneste måde at udføre godt arbejde, er ved at elske det du gør.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="95"/>
<source>Political correctness is tyranny with manners.</source>
- <translation type="unfinished"></translation>
+ <translation>Politisk korrekthed er tyranni uden manerer.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="97"/>
- <source>Only two things are infinite, the universe and human stupidity, and I&apos;m not sure about the former.</source>
- <translation type="unfinished"></translation>
+ <source>Only two things are infinite, the universe and human stupidity, and I'm not sure about the former.</source>
+ <translation>Kun to ting er uendelige, universet og menneskelig dumhed, og jeg er ikke sikker på det sidste.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="99"/>
<source>I find that the harder I work, the more luck I seem to have.</source>
- <translation type="unfinished"></translation>
+ <translation>Jeg oplever at jo hårdere jeg arbejder, jo mere heldig ser jeg ud til at være.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="101"/>
- <source>Do, or do not. There is no &apos;try&apos;.</source>
- <translation type="unfinished"></translation>
+ <source>Do, or do not. There is no 'try'.</source>
+ <translation>Gør, eller gør ikke. Der er ikke noget "prøv".</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="103"/>
<source>A mathematician is a device for turning coffee into theorems.</source>
- <translation type="unfinished"></translation>
+ <translation>En matematiker er en enhed som omdanner kaffe til matematiske sætninger.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="105"/>
<source>Good people do not need laws to tell them to act responsibly, while bad people will find a way around the laws.</source>
- <translation type="unfinished"></translation>
+ <translation>Gode mennesker behøver ikke love til at fortælle dem at de skal opføre sig ordentligt, mens dårlige mennesker vil finde en vej omkring lovene.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="107"/>
<source>Black holes are where God divided by zero.</source>
- <translation type="unfinished"></translation>
+ <translation>Sorte huller er når gud dividere med nul.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="109"/>
- <source>It&apos;s kind of fun to do the impossible.</source>
- <translation type="unfinished"></translation>
+ <source>It's kind of fun to do the impossible.</source>
+ <translation>Det er egentligt sjovt at gøre det umulige.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="111"/>
<source>Knowledge speaks, but wisdom listens.</source>
- <translation type="unfinished"></translation>
+ <translation>Viden taler, men klogskab lytter.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="113"/>
<source>A witty saying proves nothing.</source>
- <translation type="unfinished"></translation>
+ <translation>En vittig udtalelse beviser intet.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="115"/>
<source>Success usually comes to those who are too busy to be looking for it.</source>
- <translation type="unfinished"></translation>
+ <translation>Succes kommer typisk til dem der ikke har travlt med at lede efter det.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="117"/>
<source>Well-timed silence hath more eloquence than speech.</source>
- <translation type="unfinished"></translation>
+ <translation>Godt timet stilhed havde mere elokvens end tale.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="119"/>
<source>I have never let my schooling interfere with my education.</source>
- <translation type="unfinished"></translation>
+ <translation>Jeg har aldrig ladet min skolegang blande sig i min uddannelse.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="121"/>
<source>The best way to predict the future is to invent it.</source>
- <translation type="unfinished"></translation>
+ <translation>Den bedste måde at forudse fremtiden er ved at opfinde den.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="123"/>
<source>Well done is better than well said.</source>
- <translation type="unfinished"></translation>
+ <translation>Vel gjort eller bedre end vel sagt.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="125"/>
<source>Sometimes it is not enough that we do our best; we must do what is required.</source>
- <translation type="unfinished"></translation>
+ <translation>Nogen gange er det ikke nok at gøre vores bedst; vi må gøre hvad der er krævet.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="127"/>
<source>The truth is more important than the facts.</source>
- <translation type="unfinished"></translation>
+ <translation>Sandheden er vigtigere end fakta.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="129"/>
<source>Better to remain silent and be thought a fool than to speak out and remove all doubt.</source>
- <translation type="unfinished"></translation>
+ <translation>Bedre at forblive stille og blive tænkt som værende et fjols, end at tale og fjerne al tvivl.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="140"/>
@@ -396,7 +396,7 @@
<message>
<location filename="../BootSplash.cpp" line="146"/>
<source>Loading User Preferences …</source>
- <translation>Indlæser brugerindstillinger …</translation>
+ <translation>Indlæser brugerpræferencer …</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="149"/>
@@ -431,7 +431,7 @@
<message>
<location filename="../BootSplash.cpp" line="167"/>
<source>Starting App: %1</source>
- <translation>Starter Progr: %1</translation>
+ <translation>Starter program: %1</translation>
</message>
</context>
<context>
@@ -497,12 +497,12 @@
<message>
<location filename="../panel-plugins/systemstart/ItemWidget.cpp" line="188"/>
<source>Remove from Quicklaunch</source>
- <translation>Fjern fra Kvikbar</translation>
+ <translation>Fjern fra hurtigstart</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/ItemWidget.cpp" line="191"/>
<source>Add to Quicklaunch</source>
- <translation>Tilføj til Kvikbar</translation>
+ <translation>Føj til hurtigstart</translation>
</message>
</context>
<context>
@@ -518,7 +518,7 @@
<message>
<location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="37"/>
<source>Quickly launch applications or open files</source>
- <translation>Hurtigt kør programmer eller åbne filer</translation>
+ <translation>Start hurtigt programmer eller åbne filer</translation>
</message>
<message>
<location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="38"/>
@@ -598,7 +598,7 @@
<message>
<location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="101"/>
<source>Wine</source>
- <translation></translation>
+ <translation>Wine</translation>
</message>
<message>
<location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="102"/>
@@ -608,7 +608,7 @@
<message>
<location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="139"/>
<source>Leave</source>
- <translation>Forlad</translation>
+ <translation>Ud</translation>
</message>
</context>
<context>
@@ -616,12 +616,12 @@
<message>
<location filename="../panel-plugins/battery/LBattery.cpp" line="92"/>
<source>%1 % (Charging)</source>
- <translation>%1 % (Oplader)</translation>
+ <translation>%1 % (lader)</translation>
</message>
<message>
<location filename="../panel-plugins/battery/LBattery.cpp" line="93"/>
<source>%1 % (%2 Remaining)</source>
- <translation>%1 % (%2 Tilbage)</translation>
+ <translation>%1 % (%2 tilbage)</translation>
</message>
</context>
<context>
@@ -634,7 +634,7 @@
<message>
<location filename="../panel-plugins/clock/LClock.cpp" line="157"/>
<source>Use System Time</source>
- <translation>Brug Systemtid</translation>
+ <translation>Brug systemtid</translation>
</message>
</context>
<context>
@@ -642,7 +642,7 @@
<message>
<location filename="../desktop-plugins/LDPlugin.cpp" line="38"/>
<source>Launch Item</source>
- <translation type="unfinished"></translation>
+ <translation>Start post</translation>
</message>
<message>
<location filename="../desktop-plugins/LDPlugin.cpp" line="42"/>
@@ -675,7 +675,7 @@
<message>
<location filename="../panel-plugins/desktopbar/LDeskBar.cpp" line="192"/>
<source>Favorite Applications</source>
- <translation>Farvoritprogrammer</translation>
+ <translation>Favoritprogrammer</translation>
</message>
<message>
<location filename="../panel-plugins/desktopbar/LDeskBar.cpp" line="194"/>
@@ -723,7 +723,7 @@
<message>
<location filename="../LDesktop.cpp" line="280"/>
<source>Lumina Desktop</source>
- <translation>Lumina Skrivebord</translation>
+ <translation>Lumina-skrivebord</translation>
</message>
<message>
<location filename="../LDesktop.cpp" line="281"/>
@@ -733,12 +733,12 @@
<message>
<location filename="../LDesktop.cpp" line="291"/>
<source>Terminal</source>
- <translation></translation>
+ <translation>Terminal</translation>
</message>
<message>
<location filename="../LDesktop.cpp" line="292"/>
<source>Lock Session</source>
- <translation type="unfinished"></translation>
+ <translation>Lås session</translation>
</message>
<message>
<location filename="../LDesktop.cpp" line="293"/>
@@ -748,7 +748,7 @@
<message>
<location filename="../LDesktop.cpp" line="322"/>
<source>Leave</source>
- <translation>Forlad</translation>
+ <translation>Ud</translation>
</message>
</context>
<context>
@@ -765,7 +765,7 @@
<message>
<location filename="../panel-plugins/systemstart/LStartButton.h" line="52"/>
<source>Remove from Quicklaunch</source>
- <translation>Fjern fra kvikstart</translation>
+ <translation>Fjern fra hurtigstart</translation>
</message>
</context>
<context>
@@ -782,7 +782,7 @@
<message>
<location filename="../panel-plugins/systemdashboard/LSysDashboard.cpp" line="43"/>
<source>System Dashboard</source>
- <translation>Systemets instrumentpanel</translation>
+ <translation>Systemets instrumentbræt</translation>
</message>
</context>
<context>
@@ -795,12 +795,12 @@
<message>
<location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="50"/>
<source>System Volume</source>
- <translation>Systemdrev</translation>
+ <translation>Systemlydstyrke</translation>
</message>
<message>
<location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="111"/>
<source>Launch Audio Mixer</source>
- <translation>Kør Lyd Mixer</translation>
+ <translation>Start lydmikser</translation>
</message>
<message>
<location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="156"/>
@@ -888,7 +888,7 @@
<message>
<location filename="../panel-plugins/userbutton/LUserButton.cpp" line="41"/>
<source>Quickly launch applications or open files</source>
- <translation>Hurtigt kør programmer eller åbne filer</translation>
+ <translation>Start hurtigt programmer eller åbne filer</translation>
</message>
</context>
<context>
@@ -901,7 +901,7 @@
<message>
<location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="36"/>
<source>Summary</source>
- <translation>Oversigt</translation>
+ <translation>Sammendrag</translation>
</message>
<message>
<location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="42"/>
@@ -911,12 +911,12 @@
<message>
<location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="56"/>
<source>CPU Usage:</source>
- <translation>CPU brug:</translation>
+ <translation>CPU-forbrug:</translation>
</message>
<message>
<location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="70"/>
<source>Mem Usage:</source>
- <translation>Hukommelsesbrug:</translation>
+ <translation>Hukommelsesforbrug:</translation>
</message>
<message>
<location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="85"/>
@@ -929,7 +929,7 @@
<message>
<location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="98"/>
<source>Note Files (*.note)</source>
- <translation>Note Filer (*.note)</translation>
+ <translation>Note-filer (*.note)</translation>
</message>
<message>
<location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="98"/>
@@ -949,17 +949,17 @@
<message>
<location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="138"/>
<source>Invalid Note Name: Try Again</source>
- <translation>Forkert Note Navn: Prøv Igen</translation>
+ <translation>Ugyldigt notenavn: Prøv igen</translation>
</message>
<message>
<location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="139"/>
<source>Select a Note Name</source>
- <translation>Vælg et Notenavn</translation>
+ <translation>Vælg et notenavn</translation>
</message>
<message>
<location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="166"/>
<source>Open Text File</source>
- <translation>Åbn Tekstfil</translation>
+ <translation>Åbn tekstfil</translation>
</message>
<message>
<location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="167"/>
@@ -982,57 +982,57 @@
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.ui" line="14"/>
<source>Form</source>
- <translation type="unfinished">Formular</translation>
+ <translation>Formular</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="69"/>
<source>Clear Playlist</source>
- <translation type="unfinished">Ryd spilleliste</translation>
+ <translation>Ryd spilleliste</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="70"/>
<source>Shuffle Playlist</source>
- <translation type="unfinished">Bland spilleliste</translation>
+ <translation>Bland spilleliste</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="72"/>
<source>Add Files</source>
- <translation type="unfinished">Tilføj filer</translation>
+ <translation>Tilføj filer</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="73"/>
<source>Add Directory</source>
- <translation type="unfinished">Tilføj mappe</translation>
+ <translation>Tilføj mappe</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="74"/>
<source>Add URL</source>
- <translation type="unfinished">Tilføj URL</translation>
+ <translation>Tilføj URL</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="102"/>
<source>Multimedia Files</source>
- <translation type="unfinished">Mediefiler</translation>
+ <translation>Multimediefiler</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="103"/>
<source>Select Multimedia Files</source>
- <translation type="unfinished">Vælg mediefiler</translation>
+ <translation>Vælg multimediefiler</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="130"/>
<source>Select Multimedia Directory</source>
- <translation type="unfinished">Vælg Medie Mappe</translation>
+ <translation>Vælg multimediemappe</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="159"/>
<source>Enter a valid URL for a multimedia file or stream:</source>
- <translation type="unfinished">Indtast en korrekt URL til mediefil eller stream:</translation>
+ <translation>Indtast en gyldig URL til en multimediefil eller strøm:</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="161"/>
<source>Multimedia URL</source>
- <translation type="unfinished">Medie URL</translation>
+ <translation>Multimedie-URL</translation>
</message>
</context>
<context>
@@ -1070,27 +1070,27 @@
<message>
<location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="102"/>
<source>Multimedia Files</source>
- <translation>Mediefiler</translation>
+ <translation>Multimediefiler</translation>
</message>
<message>
<location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="103"/>
<source>Select Multimedia Files</source>
- <translation>Vælg mediefiler</translation>
+ <translation>Vælg multimediefiler</translation>
</message>
<message>
<location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="130"/>
<source>Select Multimedia Directory</source>
- <translation>Vælg Medie Mappe</translation>
+ <translation>Vælg multimediemappe</translation>
</message>
<message>
<location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="159"/>
<source>Enter a valid URL for a multimedia file or stream:</source>
- <translation>Indtast en korrekt URL til mediefil eller stream:</translation>
+ <translation>Indtast en gyldig URL til en multimediefil eller strøm:</translation>
</message>
<message>
<location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="161"/>
<source>Multimedia URL</source>
- <translation>Medie URL</translation>
+ <translation>Multimedie-URL</translation>
</message>
</context>
<context>
@@ -1135,12 +1135,12 @@
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="263"/>
<source>New Feed Subscription</source>
- <translation>Abonner på nyt RSS-feed</translation>
+ <translation>Abonner på nyt feed</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="287"/>
<source>RSS URL</source>
- <translation>RSS URL</translation>
+ <translation>RSS-URL</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="302"/>
@@ -1150,7 +1150,7 @@
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="332"/>
<source>Add to Feeds</source>
- <translation>Tilføj til RSS-feeds</translation>
+ <translation>Tilføj til feeds</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="409"/>
@@ -1160,7 +1160,7 @@
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="430"/>
<source>Manual Sync Only</source>
- <translation>Udelukkende manuel synkronisering</translation>
+ <translation>Kun manuel synkronisering</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="437"/>
@@ -1170,7 +1170,7 @@
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="440"/>
<source>Default Sync Interval</source>
- <translation>Standard synkroniseringsinterval</translation>
+ <translation>Standardsynkroniseringsinterval</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="471"/>
@@ -1216,7 +1216,7 @@
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="143"/>
<source>Feed URL: %1</source>
- <translation>RSS-feed URL: %1</translation>
+ <translation>Feed-URL: %1</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="144"/>
@@ -1254,27 +1254,27 @@
<message>
<location filename="../SettingsMenu.cpp" line="30"/>
<source>Screensaver</source>
- <translation>Skærmskåner</translation>
+ <translation>Pauseskærm</translation>
</message>
<message>
<location filename="../SettingsMenu.cpp" line="26"/>
<source>Preferences</source>
- <translation>Indstillinger</translation>
+ <translation>Præferencer</translation>
</message>
<message>
<location filename="../SettingsMenu.cpp" line="33"/>
<source>Wallpaper</source>
- <translation type="unfinished"></translation>
+ <translation>Tapet</translation>
</message>
<message>
<location filename="../SettingsMenu.cpp" line="36"/>
<source>Display</source>
- <translation>Fremvis</translation>
+ <translation>Skærm</translation>
</message>
<message>
<location filename="../SettingsMenu.cpp" line="39"/>
<source>All Desktop Settings</source>
- <translation type="unfinished"></translation>
+ <translation>Alle skrivebordsindstillinger</translation>
</message>
<message>
<location filename="../SettingsMenu.cpp" line="54"/>
@@ -1307,7 +1307,7 @@
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="199"/>
<source>Browse Applications</source>
- <translation>Gennemse Programmer</translation>
+ <translation>Gennemse programmer</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="234"/>
@@ -1317,12 +1317,12 @@
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="305"/>
<source>Leave</source>
- <translation>Forlad</translation>
+ <translation>Ud</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="379"/>
<source>Manage Applications</source>
- <translation>Håndtér Programmer</translation>
+ <translation>Håndtér programmer</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="408"/>
@@ -1332,12 +1332,12 @@
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="488"/>
<source>Configure Desktop</source>
- <translation>Indstil skrivebordsmiljø</translation>
+ <translation>Konfigurer skrivebord</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="1065"/>
<source>Sign Out User</source>
- <translation>Log Bruger Ud</translation>
+ <translation>Log bruger ud</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="989"/>
@@ -1347,22 +1347,22 @@
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="262"/>
<source>Preferences</source>
- <translation>Indstillinger</translation>
+ <translation>Præferencer</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="1017"/>
<source>Power Off System</source>
- <translation>Sluk System</translation>
+ <translation>Sluk system</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="1036"/>
<source>(System Performing Updates)</source>
- <translation>(System Udfører Opdateringer)</translation>
+ <translation>(systemet udfører opdateringer)</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="924"/>
<source>Suspend System</source>
- <translation>Systemdvale</translation>
+ <translation>Sæt system i hvile</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="1125"/>
@@ -1382,17 +1382,17 @@
<message>
<location filename="../panel-plugins/systemstart/StartMenu.cpp" line="500"/>
<source>%1% (Plugged In)</source>
- <translation>%1% (Indsat)</translation>
+ <translation>%1% (tilsluttet)</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.cpp" line="504"/>
<source>%1% (%2 Estimated)</source>
- <translation>%1% (%2 Estimeret)</translation>
+ <translation>%1% (%2 estimeret)</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.cpp" line="505"/>
<source>%1% Remaining</source>
- <translation>%1% Tilbage</translation>
+ <translation>%1% tilbage</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.cpp" line="521"/>
@@ -1407,7 +1407,7 @@
<message>
<location filename="../SystemWindow.ui" line="14"/>
<source>System Options</source>
- <translation>Systemindstillinger</translation>
+ <translation>Systemvalgmuligheder</translation>
</message>
<message>
<location filename="../SystemWindow.ui" line="55"/>
@@ -1427,7 +1427,7 @@
<message>
<location filename="../SystemWindow.ui" line="127"/>
<source>Cancel</source>
- <translation>Annullér</translation>
+ <translation>Annuller</translation>
</message>
<message>
<location filename="../SystemWindow.ui" line="156"/>
@@ -1478,7 +1478,7 @@
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="14"/>
<source>UserWidget</source>
- <translation>Bruger Widget</translation>
+ <translation>Brugerwidget</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="24"/>
@@ -1489,7 +1489,7 @@
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="65"/>
<source>Favorite Applications</source>
- <translation>Farvoritprogrammer</translation>
+ <translation>Favoritprogrammer</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="68"/>
@@ -1556,7 +1556,7 @@
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="461"/>
<source>Desktop Preferences</source>
- <translation>Skrivebordsindstillinger</translation>
+ <translation>Skrivebordspræferencer</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="473"/>
@@ -1566,12 +1566,12 @@
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="495"/>
<source>Desktop Appearance/Plugins</source>
- <translation>Skrivebord Udseende/Plugins</translation>
+ <translation>Skrivebord udseende/plugins</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="517"/>
<source>Screen Configuration</source>
- <translation>Skærm Indstillinger</translation>
+ <translation>Skærmkonfiguration</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="539"/>
@@ -1581,7 +1581,7 @@
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="581"/>
<source>About the Lumina Desktop</source>
- <translation>Om Lumina Skrivebordet</translation>
+ <translation>Om Lumina-skrivebordet</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.cpp" line="289"/>
@@ -1641,12 +1641,12 @@
<message>
<location filename="../panel-plugins/userbutton/UserWidget.cpp" line="300"/>
<source>Utilities</source>
- <translation>Hjælpeværktøjer</translation>
+ <translation>Redskaber</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.cpp" line="301"/>
<source>Wine</source>
- <translation></translation>
+ <translation>Wine</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.cpp" line="302"/>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_de.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_de.ts
index b9d1e7c5..2935b900 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_de.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_de.ts
@@ -6,7 +6,7 @@
<message>
<location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="37"/>
<source>Click to assign an application</source>
- <translation>Klicke um Programm zuzuweisen</translation>
+ <translation>Klicken Sie, um eine Anwendung zuzuweisen</translation>
</message>
<message>
<location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="42"/>
@@ -16,7 +16,7 @@
<message>
<location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="49"/>
<source>Open %1</source>
- <translation>Öffne %1</translation>
+ <translation>%1 öffnen</translation>
</message>
<message>
<location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="67"/>
@@ -146,17 +146,17 @@
<message>
<location filename="../BootSplash.ui" line="94"/>
<source>Starting the Lumina Desktop...</source>
- <translation type="unfinished"></translation>
+ <translation>Lumina-Arbeitsfläche wird gestartet...</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="15"/>
<source>Version %1</source>
- <translation type="unfinished"></translation>
+ <translation>Version %1</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="39"/>
<source>This desktop is powered by coffee, coffee, and more coffee.</source>
- <translation type="unfinished"></translation>
+ <translation>Diese Arbeitsfläche wird durch Kaffee, Kaffee und mehr Kaffee angetrieben.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="41"/>
@@ -181,12 +181,12 @@
<message>
<location filename="../BootSplash.cpp" line="49"/>
<source>This desktop is generously sponsored by iXsystems</source>
- <translation type="unfinished"></translation>
+ <translation>Diese Arbeitsfläche wird großzügig von iXsystems gesponsert</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="51"/>
<source>I have never been hurt by what I have not said</source>
- <translation type="unfinished"></translation>
+ <translation>Ich bin niemals durch das verletzt worden, was ich nicht gesagt habe</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="53"/>
@@ -196,17 +196,17 @@
<message>
<location filename="../BootSplash.cpp" line="55"/>
<source>Everything has its beauty but not everyone sees it.</source>
- <translation type="unfinished"></translation>
+ <translation>Alles hat seine Schönheit, aber nicht jeder sieht es.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="57"/>
<source>Before God we are all equally wise - and equally foolish.</source>
- <translation type="unfinished"></translation>
+ <translation>Vor Gott sind wir alle gleich weise - und gleich dumm.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="59"/>
<source>We cannot do everything at once, but we can do something at once.</source>
- <translation type="unfinished"></translation>
+ <translation>Wir können nicht alles auf einmal machen, aber wir können etwas auf einmal machen.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="61"/>
@@ -215,13 +215,13 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="63"/>
- <source>Don&apos;t expect to build up the weak by pulling down the strong.</source>
+ <source>Don't expect to build up the weak by pulling down the strong.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="65"/>
- <source>You can&apos;t know too much, but you can say too much.</source>
- <translation type="unfinished"></translation>
+ <source>You can't know too much, but you can say too much.</source>
+ <translation>Sie können nicht zu viel wissen, aber Sie können zu viel sagen.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="67"/>
@@ -236,12 +236,12 @@
<message>
<location filename="../BootSplash.cpp" line="71"/>
<source>Never trust a computer you can’t throw out a window.</source>
- <translation type="unfinished"></translation>
+ <translation>Trauen Sie niemals einem Computer, den Sie nicht aus einem Fenster werfen können.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="73"/>
<source>Study the past if you would define the future.</source>
- <translation type="unfinished"></translation>
+ <translation>Studieren Sie die Vergangenheit, wenn Sie die Zukunft bestimmen würden.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="75"/>
@@ -261,12 +261,12 @@
<message>
<location filename="../BootSplash.cpp" line="81"/>
<source>A person who never made a mistake never tried anything new.</source>
- <translation type="unfinished"></translation>
+ <translation>Eine Person, die nie einen Fehler gemacht hat, hat nie etwas Neues versucht.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="83"/>
<source>It does not matter how slowly you go as long as you do not stop.</source>
- <translation type="unfinished"></translation>
+ <translation>Es spielt keine Rolle, wie langsam Sie gehen, solange Sie nicht aufhören.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="85"/>
@@ -291,17 +291,17 @@
<message>
<location filename="../BootSplash.cpp" line="93"/>
<source>The only way to do great work is to love what you do.</source>
- <translation type="unfinished"></translation>
+ <translation>Der einzige Weg großartige Arbeit zu verrichten, ist zu lieben, was Sie machen.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="95"/>
<source>Political correctness is tyranny with manners.</source>
- <translation type="unfinished"></translation>
+ <translation>Politische Korrektheit ist Tyrannei mit Manieren.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="97"/>
- <source>Only two things are infinite, the universe and human stupidity, and I&apos;m not sure about the former.</source>
- <translation type="unfinished"></translation>
+ <source>Only two things are infinite, the universe and human stupidity, and I'm not sure about the former.</source>
+ <translation>Nur zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber beim ersten bin ich mir nicht sicher.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="99"/>
@@ -310,13 +310,13 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="101"/>
- <source>Do, or do not. There is no &apos;try&apos;.</source>
- <translation type="unfinished"></translation>
+ <source>Do, or do not. There is no 'try'.</source>
+ <translation>Machen oder nicht machen. Es gibt kein "Versuchen".</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="103"/>
<source>A mathematician is a device for turning coffee into theorems.</source>
- <translation type="unfinished"></translation>
+ <translation>Ein Mathematiker ist ein Gerät, um Kaffee in Theoreme umzuwandeln.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="105"/>
@@ -326,22 +326,22 @@
<message>
<location filename="../BootSplash.cpp" line="107"/>
<source>Black holes are where God divided by zero.</source>
- <translation type="unfinished"></translation>
+ <translation>Schwarze Löcher sind, wo Gott durch Null geteilt hat.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="109"/>
- <source>It&apos;s kind of fun to do the impossible.</source>
- <translation type="unfinished"></translation>
+ <source>It's kind of fun to do the impossible.</source>
+ <translation>Es macht Spaß, das Unmögliche zu tun.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="111"/>
<source>Knowledge speaks, but wisdom listens.</source>
- <translation type="unfinished"></translation>
+ <translation>Wissen spricht, aber Weisheit hört zu.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="113"/>
<source>A witty saying proves nothing.</source>
- <translation type="unfinished"></translation>
+ <translation>Ein witziges Sprichwort beweist nichts.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="115"/>
@@ -351,7 +351,7 @@
<message>
<location filename="../BootSplash.cpp" line="117"/>
<source>Well-timed silence hath more eloquence than speech.</source>
- <translation type="unfinished"></translation>
+ <translation>Zeitlich gut angesetzte Stille hat mehr Sprachfertigkeit als eine Rede.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="119"/>
@@ -361,12 +361,12 @@
<message>
<location filename="../BootSplash.cpp" line="121"/>
<source>The best way to predict the future is to invent it.</source>
- <translation type="unfinished"></translation>
+ <translation>Der beste Weg, die Zukunft vorauszusagen, ist, sie zu erfinden.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="123"/>
<source>Well done is better than well said.</source>
- <translation type="unfinished"></translation>
+ <translation>Gut gemacht ist besser als gut gesagt.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="125"/>
@@ -376,7 +376,7 @@
<message>
<location filename="../BootSplash.cpp" line="127"/>
<source>The truth is more important than the facts.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Wahrheit ist wichtiger als die Fakten.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="129"/>
@@ -642,7 +642,7 @@
<message>
<location filename="../desktop-plugins/LDPlugin.cpp" line="38"/>
<source>Launch Item</source>
- <translation type="unfinished"></translation>
+ <translation>Element starten</translation>
</message>
<message>
<location filename="../desktop-plugins/LDPlugin.cpp" line="42"/>
@@ -738,7 +738,7 @@
<message>
<location filename="../LDesktop.cpp" line="292"/>
<source>Lock Session</source>
- <translation type="unfinished"></translation>
+ <translation>Sitzung sperren</translation>
</message>
<message>
<location filename="../LDesktop.cpp" line="293"/>
@@ -982,7 +982,7 @@
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.ui" line="14"/>
<source>Form</source>
- <translation type="unfinished"></translation>
+ <translation>Formular</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="69"/>
@@ -1264,7 +1264,7 @@
<message>
<location filename="../SettingsMenu.cpp" line="33"/>
<source>Wallpaper</source>
- <translation type="unfinished"></translation>
+ <translation>Hintergrundbild</translation>
</message>
<message>
<location filename="../SettingsMenu.cpp" line="36"/>
@@ -1274,7 +1274,7 @@
<message>
<location filename="../SettingsMenu.cpp" line="39"/>
<source>All Desktop Settings</source>
- <translation type="unfinished"></translation>
+ <translation>Alle Arbeitsflächeneinstellungen</translation>
</message>
<message>
<location filename="../SettingsMenu.cpp" line="54"/>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_it.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_it.ts
index 26c14237..8dac2274 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_it.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_it.ts
@@ -221,7 +221,7 @@
<message>
<location filename="../BootSplash.cpp" line="65"/>
<source>You can't know too much, but you can say too much.</source>
- <translation type="unfinished"></translation>
+ <translation>Non puoi sapere troppo, ma puoi dire troppo.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="67"/>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lt.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lt.ts
index a4a5ff5c..6e97229f 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lt.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lt.ts
@@ -156,12 +156,12 @@
<message>
<location filename="../BootSplash.cpp" line="39"/>
<source>This desktop is powered by coffee, coffee, and more coffee.</source>
- <translation type="unfinished"></translation>
+ <translation>Šis darbalaukis veikia su kava, kava ir dar daugiau kavos.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="41"/>
<source>Keep up with desktop news!</source>
- <translation type="unfinished"></translation>
+ <translation>Sekite darbalaukio naujienas!</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="43"/>
@@ -246,7 +246,7 @@
<message>
<location filename="../BootSplash.cpp" line="75"/>
<source>The way to get started is to quit talking and begin doing.</source>
- <translation type="unfinished"></translation>
+ <translation>Darbo pradžios paslaptis yra nustoti kalbėti ir pradėti daryti.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="77"/>
@@ -306,7 +306,7 @@
<message>
<location filename="../BootSplash.cpp" line="99"/>
<source>I find that the harder I work, the more luck I seem to have.</source>
- <translation type="unfinished"></translation>
+ <translation>Aš suprantu, kad kuo daugiau aš dirbu, tuo labiau man sekasi.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="101"/>
@@ -331,7 +331,7 @@
<message>
<location filename="../BootSplash.cpp" line="109"/>
<source>It's kind of fun to do the impossible.</source>
- <translation type="unfinished"></translation>
+ <translation>Smagu yra daryti tai, kas neįmanoma.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="111"/>
@@ -346,7 +346,7 @@
<message>
<location filename="../BootSplash.cpp" line="115"/>
<source>Success usually comes to those who are too busy to be looking for it.</source>
- <translation type="unfinished"></translation>
+ <translation>Sėkmė, dažniausiai, nusišypso tiems, kas yra pernelyg užsiėmę, kad jos ieškotų.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="117"/>
@@ -361,7 +361,7 @@
<message>
<location filename="../BootSplash.cpp" line="121"/>
<source>The best way to predict the future is to invent it.</source>
- <translation type="unfinished"></translation>
+ <translation>Geriausiai būdas išpranašauti ateitį yra ją išrasti.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="123"/>
@@ -371,7 +371,7 @@
<message>
<location filename="../BootSplash.cpp" line="125"/>
<source>Sometimes it is not enough that we do our best; we must do what is required.</source>
- <translation type="unfinished"></translation>
+ <translation>Kartais, mums nepakanka daryti tai, kas geriausia; privalome daryti tai, kas reikalinga.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="127"/>
@@ -982,7 +982,7 @@
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.ui" line="14"/>
<source>Form</source>
- <translation type="unfinished">Forma</translation>
+ <translation>Forma</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="69"/>
@@ -1017,22 +1017,22 @@
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="103"/>
<source>Select Multimedia Files</source>
- <translation type="unfinished">Pasirinkti multimedijos failus</translation>
+ <translation>Pasirinkti multimedijos failus</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="130"/>
<source>Select Multimedia Directory</source>
- <translation type="unfinished">Pasirinkti multimedijos katalogą</translation>
+ <translation>Pasirinkti multimedijos katalogą</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="159"/>
<source>Enter a valid URL for a multimedia file or stream:</source>
- <translation type="unfinished">Įveskite taisyklingą multimedijos failo ar srauto URL:</translation>
+ <translation>Įveskite taisyklingą multimedijos failo ar srauto URL:</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="161"/>
<source>Multimedia URL</source>
- <translation type="unfinished">Multimedijos URL</translation>
+ <translation>Multimedijos URL</translation>
</message>
</context>
<context>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pl.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pl.ts
index 8ce06739..806b46f3 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pl.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pl.ts
@@ -231,157 +231,157 @@
<message>
<location filename="../BootSplash.cpp" line="69"/>
<source>Any society that would give up a little liberty to gain a little security will deserve neither and lose both.</source>
- <translation type="unfinished"></translation>
+ <translation>Any society that would give up a little liberty to gain a little security will deserve neither and lose both.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="71"/>
<source>Never trust a computer you can’t throw out a window.</source>
- <translation type="unfinished"></translation>
+ <translation>Never trust a computer you can’t throw out a window.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="73"/>
<source>Study the past if you would define the future.</source>
- <translation type="unfinished"></translation>
+ <translation>Study the past if you would define the future.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="75"/>
<source>The way to get started is to quit talking and begin doing.</source>
- <translation type="unfinished"></translation>
+ <translation>The way to get started is to quit talking and begin doing.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="77"/>
<source>Ask and it will be given to you; search, and you will find; knock and the door will be opened for you.</source>
- <translation type="unfinished"></translation>
+ <translation>Ask and it will be given to you; search, and you will find; knock and the door will be opened for you.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="79"/>
<source>Start where you are. Use what you have. Do what you can.</source>
- <translation type="unfinished"></translation>
+ <translation>Start where you are. Use what you have. Do what you can.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="81"/>
<source>A person who never made a mistake never tried anything new.</source>
- <translation type="unfinished"></translation>
+ <translation>A person who never made a mistake never tried anything new.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="83"/>
<source>It does not matter how slowly you go as long as you do not stop.</source>
- <translation type="unfinished"></translation>
+ <translation>It does not matter how slowly you go as long as you do not stop.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="85"/>
<source>Do what you can, where you are, with what you have.</source>
- <translation type="unfinished"></translation>
+ <translation>Do what you can, where you are, with what you have.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="87"/>
<source>Remember no one can make you feel inferior without your consent.</source>
- <translation type="unfinished"></translation>
+ <translation>Remember no one can make you feel inferior without your consent.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="89"/>
<source>It’s not the years in your life that count. It’s the life in your years.</source>
- <translation type="unfinished"></translation>
+ <translation>It’s not the years in your life that count. It’s the life in your years.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="91"/>
<source>Either write something worth reading or do something worth writing.</source>
- <translation type="unfinished"></translation>
+ <translation>Either write something worth reading or do something worth writing.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="93"/>
<source>The only way to do great work is to love what you do.</source>
- <translation type="unfinished"></translation>
+ <translation>The only way to do great work is to love what you do.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="95"/>
<source>Political correctness is tyranny with manners.</source>
- <translation type="unfinished"></translation>
+ <translation>Political correctness is tyranny with manners.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="97"/>
<source>Only two things are infinite, the universe and human stupidity, and I'm not sure about the former.</source>
- <translation type="unfinished"></translation>
+ <translation>Only two things are infinite, the universe and human stupidity, and I'm not sure about the former.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="99"/>
<source>I find that the harder I work, the more luck I seem to have.</source>
- <translation type="unfinished"></translation>
+ <translation>I find that the harder I work, the more luck I seem to have.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="101"/>
<source>Do, or do not. There is no 'try'.</source>
- <translation type="unfinished"></translation>
+ <translation>Do, or do not. There is no 'try'.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="103"/>
<source>A mathematician is a device for turning coffee into theorems.</source>
- <translation type="unfinished"></translation>
+ <translation>A mathematician is a device for turning coffee into theorems.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="105"/>
<source>Good people do not need laws to tell them to act responsibly, while bad people will find a way around the laws.</source>
- <translation type="unfinished"></translation>
+ <translation>Good people do not need laws to tell them to act responsibly, while bad people will find a way around the laws.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="107"/>
<source>Black holes are where God divided by zero.</source>
- <translation type="unfinished"></translation>
+ <translation>Black holes are where God divided by zero.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="109"/>
<source>It's kind of fun to do the impossible.</source>
- <translation type="unfinished"></translation>
+ <translation>It's kind of fun to do the impossible.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="111"/>
<source>Knowledge speaks, but wisdom listens.</source>
- <translation type="unfinished"></translation>
+ <translation>Knowledge speaks, but wisdom listens.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="113"/>
<source>A witty saying proves nothing.</source>
- <translation type="unfinished"></translation>
+ <translation>A witty saying proves nothing.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="115"/>
<source>Success usually comes to those who are too busy to be looking for it.</source>
- <translation type="unfinished"></translation>
+ <translation>Success usually comes to those who are too busy to be looking for it.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="117"/>
<source>Well-timed silence hath more eloquence than speech.</source>
- <translation type="unfinished"></translation>
+ <translation>Well-timed silence hath more eloquence than speech.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="119"/>
<source>I have never let my schooling interfere with my education.</source>
- <translation type="unfinished"></translation>
+ <translation>I have never let my schooling interfere with my education.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="121"/>
<source>The best way to predict the future is to invent it.</source>
- <translation type="unfinished"></translation>
+ <translation>The best way to predict the future is to invent it.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="123"/>
<source>Well done is better than well said.</source>
- <translation type="unfinished"></translation>
+ <translation>Well done is better than well said.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="125"/>
<source>Sometimes it is not enough that we do our best; we must do what is required.</source>
- <translation type="unfinished"></translation>
+ <translation>Sometimes it is not enough that we do our best; we must do what is required.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="127"/>
<source>The truth is more important than the facts.</source>
- <translation type="unfinished"></translation>
+ <translation>The truth is more important than the facts.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="129"/>
<source>Better to remain silent and be thought a fool than to speak out and remove all doubt.</source>
- <translation type="unfinished"></translation>
+ <translation>Better to remain silent and be thought a fool than to speak out and remove all doubt.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="140"/>
@@ -642,17 +642,17 @@
<message>
<location filename="../desktop-plugins/LDPlugin.cpp" line="38"/>
<source>Launch Item</source>
- <translation type="unfinished"></translation>
+ <translation>Uruchom</translation>
</message>
<message>
<location filename="../desktop-plugins/LDPlugin.cpp" line="42"/>
<source>Start Moving Item</source>
- <translation>Zacznij przesuwać element</translation>
+ <translation>Przesuń element</translation>
</message>
<message>
<location filename="../desktop-plugins/LDPlugin.cpp" line="43"/>
<source>Start Resizing Item</source>
- <translation>Zacznij zmieniać rozmiar elementu</translation>
+ <translation>Zmień rozmiar elementu</translation>
</message>
<message>
<location filename="../desktop-plugins/LDPlugin.cpp" line="45"/>
@@ -738,7 +738,7 @@
<message>
<location filename="../LDesktop.cpp" line="292"/>
<source>Lock Session</source>
- <translation type="unfinished"></translation>
+ <translation>Zablokuj sesję</translation>
</message>
<message>
<location filename="../LDesktop.cpp" line="293"/>
@@ -982,57 +982,57 @@
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.ui" line="14"/>
<source>Form</source>
- <translation type="unfinished">Formularz</translation>
+ <translation>Formularz</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="69"/>
<source>Clear Playlist</source>
- <translation type="unfinished">Wyczyść listę odtwarzania</translation>
+ <translation>Wyczyść listę odtwarzania</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="70"/>
<source>Shuffle Playlist</source>
- <translation type="unfinished">Odtwarzanie losowe</translation>
+ <translation>Odtwarzanie losowe</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="72"/>
<source>Add Files</source>
- <translation type="unfinished">Dodaj pliki</translation>
+ <translation>Dodaj pliki</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="73"/>
<source>Add Directory</source>
- <translation type="unfinished">Dodaj katalog</translation>
+ <translation>Dodaj katalog</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="74"/>
<source>Add URL</source>
- <translation type="unfinished">Dodaj URL</translation>
+ <translation>Dodaj URL</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="102"/>
<source>Multimedia Files</source>
- <translation type="unfinished">Pliki multimedialne</translation>
+ <translation>Pliki multimedialne</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="103"/>
<source>Select Multimedia Files</source>
- <translation type="unfinished">Wybierz pliki multimedialne</translation>
+ <translation>Wybierz pliki multimedialne</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="130"/>
<source>Select Multimedia Directory</source>
- <translation type="unfinished">Wybierz katalog z multimediami</translation>
+ <translation>Wybierz katalog z multimediami</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="159"/>
<source>Enter a valid URL for a multimedia file or stream:</source>
- <translation type="unfinished">Podaj adres URL pliku lub strumienia multimedialnego:</translation>
+ <translation>Podaj adres URL pliku lub strumienia multimedialnego:</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="161"/>
<source>Multimedia URL</source>
- <translation type="unfinished">Adres URL multimediów</translation>
+ <translation>Adres URL multimediów</translation>
</message>
</context>
<context>
@@ -1264,7 +1264,7 @@
<message>
<location filename="../SettingsMenu.cpp" line="33"/>
<source>Wallpaper</source>
- <translation type="unfinished"></translation>
+ <translation>Tapeta</translation>
</message>
<message>
<location filename="../SettingsMenu.cpp" line="36"/>
@@ -1274,7 +1274,7 @@
<message>
<location filename="../SettingsMenu.cpp" line="39"/>
<source>All Desktop Settings</source>
- <translation type="unfinished"></translation>
+ <translation>Ustawienia pulpitu</translation>
</message>
<message>
<location filename="../SettingsMenu.cpp" line="54"/>
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskButton.cpp b/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskButton.cpp
index 0dd68bb0..ab4e786f 100644
--- a/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskButton.cpp
+++ b/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskButton.cpp
@@ -16,7 +16,6 @@ LTaskButton::LTaskButton(QWidget *parent, bool smallDisplay) : LTBWidget(parent)
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);
@@ -126,16 +125,15 @@ void LTaskButton::UpdateButton(){
QString txt = WINLIST[0].text();
if(txt.length()>30){ txt.truncate(27); txt.append("..."); }
else if(txt.length()<30){ txt = txt.leftJustified(30, ' '); }
- this->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); this->setText(txt);
- }else if(noicon){ this->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); this->setText( cname ); }
- else{ this->setToolButtonStyle(Qt::ToolButtonIconOnly); this->setText(""); }
+ this->setText(txt);
+ }else if(noicon){ this->setText( cname ); }
+ else{ 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; }
+ if(noicon || showText){ this->setText("("+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
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskManagerPlugin.cpp b/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskManagerPlugin.cpp
index 79c5dd36..c8e24702 100644
--- a/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskManagerPlugin.cpp
+++ b/src-qt5/core/lumina-desktop/panel-plugins/taskmanager/LTaskManagerPlugin.cpp
@@ -116,8 +116,10 @@ void LTaskManagerPlugin::UpdateButtons(){
but->addWindow( winlist[i] );
if(this->layout()->direction()==QBoxLayout::LeftToRight){
but->setIconSize(QSize(this->height(), this->height()));
+ but->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
}else{
but->setIconSize(QSize(this->width(), this->width()));
+ but->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
}
this->layout()->addWidget(but);
connect(but, SIGNAL(MenuClosed()), this, SIGNAL(MenuClosed()));
diff --git a/src-qt5/core/lumina-info/i18n/lumina-info_da.ts b/src-qt5/core/lumina-info/i18n/lumina-info_da.ts
index 97caa513..894a0dc0 100644
--- a/src-qt5/core/lumina-info/i18n/lumina-info_da.ts
+++ b/src-qt5/core/lumina-info/i18n/lumina-info_da.ts
@@ -6,7 +6,7 @@
<message>
<location filename="../MainUI.ui" line="14"/>
<source>Lumina Desktop Information</source>
- <translation>Lumina Skrivebords Information</translation>
+ <translation>Lumina-skrivebordsinformation</translation>
</message>
<message>
<location filename="../MainUI.ui" line="60"/>
@@ -21,7 +21,7 @@
<message>
<location filename="../MainUI.ui" line="124"/>
<source>Lumina Website</source>
- <translation>Hjemmeside for Lumina</translation>
+ <translation>Lumina-websted</translation>
</message>
<message>
<location filename="../MainUI.ui" line="152"/>
@@ -31,17 +31,17 @@
<message>
<location filename="../MainUI.ui" line="179"/>
<source>Desktop Version:</source>
- <translation>Skrivebords Version:</translation>
+ <translation>Skrivebordsversion:</translation>
</message>
<message>
<location filename="../MainUI.ui" line="202"/>
<source>OS Build:</source>
- <translation></translation>
+ <translation>OS-byg:</translation>
</message>
<message>
<location filename="../MainUI.ui" line="218"/>
<source>Qt Version:</source>
- <translation>Qt Version:</translation>
+ <translation>Qt version:</translation>
</message>
<message>
<location filename="../MainUI.ui" line="276"/>
@@ -51,7 +51,7 @@
<message>
<location filename="../MainUI.ui" line="233"/>
<source>View Information</source>
- <translation>Se Information</translation>
+ <translation>Vis information</translation>
</message>
<message>
<location filename="../MainUI.ui" line="298"/>
@@ -70,8 +70,8 @@
</message>
<message>
<location filename="../MainUI.ui" line="340"/>
- <source>&lt;a href=&quot;https://github.com/beanpole135&quot;&gt;Ken Moore&lt;/a&gt;</source>
- <translation>&lt;a href=&quot;https://github.com/beanpole135&quot;&gt; Ken Moore&lt;/a&gt;</translation>
+ <source>&lt;a href="https://github.com/beanpole135"&gt;Ken Moore&lt;/a&gt;</source>
+ <translation>&lt;a href="https://github.com/beanpole135"&gt;Ken Moore&lt;/a&gt;</translation>
</message>
<message>
<location filename="../MainUI.ui" line="353"/>
@@ -85,8 +85,8 @@
</message>
<message>
<location filename="../MainUI.ui" line="428"/>
- <source>&lt;a href=&quot;https://github.com/pcbsd/lumina/graphs/contributors&quot;&gt;Open in web browser&lt;a&gt;</source>
- <translation>&lt;a href=&quot;https://github.com/pcbsd/lumina/graphs/contributors&quot;&gt;Åben i en web browser&lt;a&gt;</translation>
+ <source>&lt;a href="https://github.com/pcbsd/lumina/graphs/contributors"&gt;Open in web browser&lt;a&gt;</source>
+ <translation>&lt;a href="https://github.com/pcbsd/lumina/graphs/contributors"&gt;Åbn i en webbrowser&lt;a&gt;</translation>
</message>
<message>
<location filename="../MainUI.ui" line="454"/>
diff --git a/src-qt5/core/lumina-info/i18n/lumina-info_pl.ts b/src-qt5/core/lumina-info/i18n/lumina-info_pl.ts
index 6ff00c18..0bc77338 100644
--- a/src-qt5/core/lumina-info/i18n/lumina-info_pl.ts
+++ b/src-qt5/core/lumina-info/i18n/lumina-info_pl.ts
@@ -16,7 +16,7 @@
<message>
<location filename="../MainUI.ui" line="89"/>
<source>Source Repository</source>
- <translation>Repozytorium Żródłowe</translation>
+ <translation>Repozytorium źródłowe</translation>
</message>
<message>
<location filename="../MainUI.ui" line="124"/>
@@ -26,7 +26,7 @@
<message>
<location filename="../MainUI.ui" line="152"/>
<source>Bug Reports</source>
- <translation>Zgłaszanie Błędów</translation>
+ <translation>Zgłaszanie błędów</translation>
</message>
<message>
<location filename="../MainUI.ui" line="179"/>
@@ -46,7 +46,7 @@
<message>
<location filename="../MainUI.ui" line="276"/>
<source>Ask the Community</source>
- <translation type="unfinished">Zadaj Pytanie</translation>
+ <translation>Zapytaj Społeczność</translation>
</message>
<message>
<location filename="../MainUI.ui" line="233"/>
@@ -70,8 +70,8 @@
</message>
<message>
<location filename="../MainUI.ui" line="340"/>
- <source>&lt;a href=&quot;https://github.com/beanpole135&quot;&gt;Ken Moore&lt;/a&gt;</source>
- <translation>&lt;a href=&quot;https://github.com/beanpole135&quot;&gt;Ken Moore&lt;/a&gt;</translation>
+ <source>&lt;a href="https://github.com/beanpole135"&gt;Ken Moore&lt;/a&gt;</source>
+ <translation>&lt;a href="https://github.com/beanpole135"&gt;Ken Moore&lt;/a&gt;</translation>
</message>
<message>
<location filename="../MainUI.ui" line="353"/>
@@ -85,8 +85,8 @@
</message>
<message>
<location filename="../MainUI.ui" line="428"/>
- <source>&lt;a href=&quot;https://github.com/pcbsd/lumina/graphs/contributors&quot;&gt;Open in web browser&lt;a&gt;</source>
- <translation>&lt;a href=&quot;https://github.com/pcbsd/lumina/graphs/contributors&quot;&gt;Otwórz w przeglądarce internetowej&lt;a&gt;</translation>
+ <source>&lt;a href="https://github.com/pcbsd/lumina/graphs/contributors"&gt;Open in web browser&lt;a&gt;</source>
+ <translation>&lt;a href="https://github.com/pcbsd/lumina/graphs/contributors"&gt;Otwórz w przeglądarce internetowej&lt;a&gt;</translation>
</message>
<message>
<location filename="../MainUI.ui" line="454"/>
diff --git a/src-qt5/core/lumina-open/LFileDialog.cpp b/src-qt5/core/lumina-open/LFileDialog.cpp
index a0fef17c..a400c60b 100644
--- a/src-qt5/core/lumina-open/LFileDialog.cpp
+++ b/src-qt5/core/lumina-open/LFileDialog.cpp
@@ -161,11 +161,13 @@ void LFileDialog::generateAppList(bool shownetwork){
XDGDesktopList applist;
applist.updateList();
PREFAPPS = getPreferredApplications();
- //qDebug() << "Preferred Apps:" << PREFAPPS;
+ qDebug() << "Preferred Apps:" << PREFAPPS;
ui->combo_rec->clear();
//Now get the application mimetype for the file extension (if available)
QStringList mimetypes = LXDG::findAppMimeForFile(filePath, true).split("::::"); //use all mimetypes
mimetypes.removeDuplicates();
+ QString defapp = getDefaultApp(mimetypes.first()); //default application
+ if(!defapp.isEmpty() && !PREFAPPS.contains(defapp) ){ PREFAPPS << defapp; } //ensure this is listed in the preferred apps list
//Now add all the detected applications
QHash< QString, QList<XDGDesktop*> > hash = LXDG::sortDesktopCats( applist.apps(false,true) );
QStringList cat = hash.keys();
@@ -205,7 +207,9 @@ void LFileDialog::generateAppList(bool shownetwork){
for(int i=0; i<PREFAPPS.length(); i++){
XDGDesktop dFile(PREFAPPS[i]);
if( dFile.isValid() ){
- ui->combo_rec->addItem( LXDG::findIcon(dFile.icon, "application-x-desktop"), dFile.name);
+ QString txt = dFile.name;
+ if(PREFAPPS[i] == defapp){ txt.prepend( tr("[default] ") ); }
+ ui->combo_rec->addItem( LXDG::findIcon(dFile.icon, "application-x-desktop"), txt);
if(i==0){ ui->combo_rec->setCurrentIndex(0); } //make sure the first item is selected
}else{
PREFAPPS.removeAt(i); //invalid app
diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_da.ts b/src-qt5/core/lumina-open/i18n/lumina-open_da.ts
index 757d5128..4f6d82c2 100644
--- a/src-qt5/core/lumina-open/i18n/lumina-open_da.ts
+++ b/src-qt5/core/lumina-open/i18n/lumina-open_da.ts
@@ -31,7 +31,7 @@
<message>
<location filename="../LFileDialog.ui" line="138"/>
<source>Find</source>
- <translation>Søg</translation>
+ <translation>Find</translation>
</message>
<message>
<location filename="../LFileDialog.ui" line="199"/>
@@ -41,22 +41,22 @@
<message>
<location filename="../LFileDialog.ui" line="221"/>
<source>OK</source>
- <translation>Ok</translation>
+ <translation>OK</translation>
</message>
<message>
<location filename="../LFileDialog.ui" line="235"/>
<source>Cancel</source>
- <translation>Annullér</translation>
+ <translation>Annuller</translation>
</message>
<message>
<location filename="../LFileDialog.cpp" line="40"/>
<source>(Email Link)</source>
- <translation>Email henvisning</translation>
+ <translation>(e-maillink)</translation>
</message>
<message>
<location filename="../LFileDialog.cpp" line="41"/>
<source>(Internet URL - %1)</source>
- <translation>(Internet URL - %1)</translation>
+ <translation>(Internet-URL - %1)</translation>
</message>
<message>
<location filename="../LFileDialog.cpp" line="114"/>
@@ -121,7 +121,7 @@
<message>
<location filename="../LFileDialog.cpp" line="126"/>
<source>Utilities</source>
- <translation>Værktøjer</translation>
+ <translation>Redskaber</translation>
</message>
<message>
<location filename="../LFileDialog.cpp" line="127"/>
@@ -145,13 +145,13 @@
<location filename="../main.cpp" line="188"/>
<location filename="../main.cpp" line="194"/>
<source>Audio Volume %1%</source>
- <translation>Lyd Volume %1%</translation>
+ <translation>Lydstyrke %1%</translation>
</message>
<message>
<location filename="../main.cpp" line="202"/>
<location filename="../main.cpp" line="211"/>
<source>Screen Brightness %1%</source>
- <translation>skærm-lysstyrke %1%</translation>
+ <translation>Skærm-lysstyrke %1%</translation>
</message>
<message>
<location filename="../main.cpp" line="243"/>
@@ -161,7 +161,7 @@
<message>
<location filename="../main.cpp" line="264"/>
<source>Application entry is invalid: %1</source>
- <translation type="unfinished"></translation>
+ <translation>Programpost er ugyldig: %1</translation>
</message>
<message>
<location filename="../main.cpp" line="273"/>
@@ -171,7 +171,7 @@
<message>
<location filename="../main.cpp" line="284"/>
<source>URL shortcut is missing the URL: %1</source>
- <translation>URL genvej mangler URL&apos;en: %1</translation>
+ <translation>URL genvej mangler URL'en: %1</translation>
</message>
<message>
<location filename="../main.cpp" line="295"/>
@@ -190,8 +190,8 @@
</message>
<message>
<location filename="../main.cpp" line="363"/>
- <source>Could not find &quot;%1&quot;. Please ensure it is installed first.</source>
- <translation>Kunne ikke finde &quot;%1&quot;. Sørg for at programmet er installeret først.</translation>
+ <source>Could not find "%1". Please ensure it is installed first.</source>
+ <translation>Kunne ikke finde "%1". Sørg for at programmet er installeret først.</translation>
</message>
<message>
<location filename="../main.cpp" line="413"/>
diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_de.ts b/src-qt5/core/lumina-open/i18n/lumina-open_de.ts
index 8af30d78..08e0bb7e 100644
--- a/src-qt5/core/lumina-open/i18n/lumina-open_de.ts
+++ b/src-qt5/core/lumina-open/i18n/lumina-open_de.ts
@@ -161,7 +161,7 @@
<message>
<location filename="../main.cpp" line="264"/>
<source>Application entry is invalid: %1</source>
- <translation type="unfinished"></translation>
+ <translation>Anwendungseintrag ist ungültig: %1</translation>
</message>
<message>
<location filename="../main.cpp" line="273"/>
@@ -171,17 +171,17 @@
<message>
<location filename="../main.cpp" line="284"/>
<source>URL shortcut is missing the URL: %1</source>
- <translation>fehlende URL für URL: %1</translation>
+ <translation>URL-Verknüpfung fehlt die URL: %1</translation>
</message>
<message>
<location filename="../main.cpp" line="295"/>
<source>Directory shortcut is missing the path to the directory: %1</source>
- <translation>fehlender Pfad zum Verzeichnis der Verknüpfung: %1</translation>
+ <translation>Verzeichnisverknüpfung fehlt der Pfad zum Verzeichnis: %1</translation>
</message>
<message>
<location filename="../main.cpp" line="300"/>
<source>Unknown type of shortcut : %1</source>
- <translation>unbekannter Typ für Vernüpfung: %1</translation>
+ <translation>Unbekannter Typ für Vernüpfung: %1</translation>
</message>
<message>
<location filename="../main.cpp" line="363"/>
@@ -190,8 +190,8 @@
</message>
<message>
<location filename="../main.cpp" line="363"/>
- <source>Could not find &quot;%1&quot;. Please ensure it is installed first.</source>
- <translation>Konnte &quot;%1&quot; nicht finden. Bitte stellen Sie zuerst sicher, dass es installiert ist.</translation>
+ <source>Could not find "%1". Please ensure it is installed first.</source>
+ <translation>Konnte "%1" nicht finden. Bitte stellen Sie zuerst sicher, dass es installiert ist.</translation>
</message>
<message>
<location filename="../main.cpp" line="413"/>
diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_it.ts b/src-qt5/core/lumina-open/i18n/lumina-open_it.ts
index 341374d2..415476ca 100644
--- a/src-qt5/core/lumina-open/i18n/lumina-open_it.ts
+++ b/src-qt5/core/lumina-open/i18n/lumina-open_it.ts
@@ -26,7 +26,7 @@
<message>
<location filename="../LFileDialog.ui" line="131"/>
<source>Binary Location</source>
- <translation type="unfinished">Posizione codice binario</translation>
+ <translation>Posizione codice binario</translation>
</message>
<message>
<location filename="../LFileDialog.ui" line="138"/>
diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_lt.ts b/src-qt5/core/lumina-open/i18n/lumina-open_lt.ts
index acb59691..fce7de40 100644
--- a/src-qt5/core/lumina-open/i18n/lumina-open_lt.ts
+++ b/src-qt5/core/lumina-open/i18n/lumina-open_lt.ts
@@ -161,7 +161,7 @@
<message>
<location filename="../main.cpp" line="264"/>
<source>Application entry is invalid: %1</source>
- <translation type="unfinished"></translation>
+ <translation>Programos įrašas yra neteisingas: %1</translation>
</message>
<message>
<location filename="../main.cpp" line="273"/>
@@ -190,8 +190,8 @@
</message>
<message>
<location filename="../main.cpp" line="363"/>
- <source>Could not find &quot;%1&quot;. Please ensure it is installed first.</source>
- <translation>Nepavyko rasti &quot;%1&quot;. Iš pradžių, įsitikinkite ar ji įdiegta.</translation>
+ <source>Could not find "%1". Please ensure it is installed first.</source>
+ <translation>Nepavyko rasti "%1". Iš pradžių, įsitikinkite ar ji įdiegta.</translation>
</message>
<message>
<location filename="../main.cpp" line="413"/>
diff --git a/src-qt5/core/lumina-session/main.cpp b/src-qt5/core/lumina-session/main.cpp
index ed391e04..3696ed20 100644
--- a/src-qt5/core/lumina-session/main.cpp
+++ b/src-qt5/core/lumina-session/main.cpp
@@ -61,7 +61,9 @@ int main(int argc, char ** argv)
//Check for any stale desktop lock files and clean them up
QString cfile = QDir::tempPath()+"/.LSingleApp-%1-%2-%3";
- cfile = cfile.arg( QString(getlogin()), "lumina-desktop", QString::number(QX11Info::appScreen()) );
+ QString desk = "lumina-desktop";
+ if(unified){ desk.append("-unified"); }
+ cfile = cfile.arg( QString(getlogin()), desk, QString::number(QX11Info::appScreen()) );
if(QFile::exists(cfile)){
qDebug() << "Found Desktop Lock for X session:" << disp;
qDebug() << " - Disabling Lock and starting new desktop session";
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_da.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_da.ts
index 4a8aaca2..0edee8df 100644
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_da.ts
+++ b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_da.ts
@@ -6,37 +6,37 @@
<message>
<location filename="../LLockScreen.ui" line="14"/>
<source>Form</source>
- <translation type="unfinished"></translation>
+ <translation>Formular</translation>
</message>
<message>
<location filename="../LLockScreen.ui" line="114"/>
<source>Password</source>
- <translation type="unfinished"></translation>
+ <translation>Adgangskode</translation>
</message>
<message>
<location filename="../LLockScreen.ui" line="126"/>
<source>Unlock Session</source>
- <translation type="unfinished"></translation>
+ <translation>Lås session op</translation>
</message>
<message>
<location filename="../LLockScreen.cpp" line="39"/>
<source>Locked by: %1</source>
- <translation type="unfinished"></translation>
+ <translation>Låst af: %1</translation>
</message>
<message>
<location filename="../LLockScreen.cpp" line="76"/>
<source>Too Many Failures</source>
- <translation type="unfinished"></translation>
+ <translation>For mange mislykkedes forsøg</translation>
</message>
<message>
<location filename="../LLockScreen.cpp" line="76"/>
<source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
+ <translation>Vent %1 minutter</translation>
</message>
<message>
<location filename="../LLockScreen.cpp" line="77"/>
<source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
+ <translation>Mislykkede forsøg: %1</translation>
</message>
</context>
</TS>
bgstack15