diff options
Diffstat (limited to 'src-qt5/core')
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'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'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'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 'try'.</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'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'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'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'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 'try'.</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'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><a href="https://github.com/beanpole135">Ken Moore</a></source> - <translation><a href="https://github.com/beanpole135"> Ken Moore</a></translation> + <source><a href="https://github.com/beanpole135">Ken Moore</a></source> + <translation><a href="https://github.com/beanpole135">Ken Moore</a></translation> </message> <message> <location filename="../MainUI.ui" line="353"/> @@ -85,8 +85,8 @@ </message> <message> <location filename="../MainUI.ui" line="428"/> - <source><a href="https://github.com/pcbsd/lumina/graphs/contributors">Open in web browser<a></source> - <translation><a href="https://github.com/pcbsd/lumina/graphs/contributors">Åben i en web browser<a></translation> + <source><a href="https://github.com/pcbsd/lumina/graphs/contributors">Open in web browser<a></source> + <translation><a href="https://github.com/pcbsd/lumina/graphs/contributors">Åbn i en webbrowser<a></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><a href="https://github.com/beanpole135">Ken Moore</a></source> - <translation><a href="https://github.com/beanpole135">Ken Moore</a></translation> + <source><a href="https://github.com/beanpole135">Ken Moore</a></source> + <translation><a href="https://github.com/beanpole135">Ken Moore</a></translation> </message> <message> <location filename="../MainUI.ui" line="353"/> @@ -85,8 +85,8 @@ </message> <message> <location filename="../MainUI.ui" line="428"/> - <source><a href="https://github.com/pcbsd/lumina/graphs/contributors">Open in web browser<a></source> - <translation><a href="https://github.com/pcbsd/lumina/graphs/contributors">Otwórz w przeglądarce internetowej<a></translation> + <source><a href="https://github.com/pcbsd/lumina/graphs/contributors">Open in web browser<a></source> + <translation><a href="https://github.com/pcbsd/lumina/graphs/contributors">Otwórz w przeglądarce internetowej<a></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'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 "%1". Please ensure it is installed first.</source> - <translation>Kunne ikke finde "%1". 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 "%1". Please ensure it is installed first.</source> - <translation>Konnte "%1" 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 "%1". Please ensure it is installed first.</source> - <translation>Nepavyko rasti "%1". 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> |