Imported Upstream version 0.10.0

ubuntu/cosmic
ChangZhuo Chen (陳昌倬) 9 years ago
parent 807ac41c09
commit d944a7d80c

1
.gitignore vendored

@ -0,0 +1 @@
build

@ -7,7 +7,7 @@ Copyright:
Copyright (c) 2012-2014 LXQt team
License: GPL-2 and LGPL-2.1+
The full text of the licenses can be found in the 'COPYING' file.
The full text of the licenses can be found in the 'LICENSE' file.
The lxqt-config-cursor component is based on the "qt-xcurtheme" project
and is licensed under GPL 2, GPL 3, LGPL-2, LGPL-2.1 and WTFPL 2.

@ -1,9 +1,8 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@ -23,8 +22,7 @@ specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations
below.
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
@ -89,9 +87,9 @@ libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it
becomes a de-facto standard. To achieve this, non-free programs must
be allowed to use the library. A more frequent case is that a free
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
@ -138,8 +136,8 @@ included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control
compilation and installation of the library.
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
@ -305,10 +303,10 @@ of these things:
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least
three years, to give the same user the materials specified in
Subsection 6a, above, for a charge no more than the cost of
performing this distribution.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
@ -386,10 +384,9 @@ all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply, and the section as a whole is intended to apply in other
circumstances.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
@ -407,11 +404,11 @@ be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License
may add an explicit geographical distribution limitation excluding those
countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.

@ -20,7 +20,7 @@
</message>
<message>
<source>&amp;Set Theme</source>
<translation>Ε&amp;πιλογή θέματος</translation>
<translation type="vanished">Ε&amp;πιλογή θέματος</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
@ -29,7 +29,7 @@
</message>
<message>
<source>&amp;Close</source>
<translation>&amp;Κλείσιμο</translation>
<translation type="vanished">&amp;Κλείσιμο</translation>
</message>
<message>
<location filename="../selectwnd.cpp" line="208"/>

@ -149,32 +149,32 @@
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation>نماذج ايقونات</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">واجهة ريزر المخصَّصة</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">واجهة ريزر المخصَّصة</translation>
<translation>واجهة ريزر المخصَّصة</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>تهيئة مظهر ريزر</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>نماذج ايقونات</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>واجهة ريزر المخصَّصة</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation>Téma ikon</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">Motiv LXQt</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">Motiv LXQt</translation>
<translation>Motiv LXQt</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Nastavení vzhledu</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Téma ikon</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>Motiv LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation>Téma ikon</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">Motiv LXQt</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">Motiv LXQt</translation>
<translation>Motiv LXQt</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Nastavení vzhledu</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Téma ikon</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>Motiv LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation>Ikontema</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">LXQt Tema</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">LXQt Tema</translation>
<translation>LXQt Tema</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>LXQt Indstillinger for Udseende</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Ikontema</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>LXQt Tema</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation>Ikontema</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">LXQt Tema</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">LXQt Tema</translation>
<translation>LXQt Tema</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>LXQt Indstillinger for Udseende</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Ikontema</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>LXQt Tema</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -149,32 +149,32 @@
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>LXQt Erscheinungsbild-Konfiguration</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation>Stil der Bedienelemente</translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Symboldesign</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>LXQt-Design</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation>Schriftart</translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation>Mauszeiger</translation>
</message>

@ -138,13 +138,6 @@
<translation>Θέμα εικονιδίων</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation>Θέμα του LXQt</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
@ -156,32 +149,32 @@
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Διαμόρφωση της εμφάνισης του LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation>Στιλ συστατικού</translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Θέμα εικονιδίων</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>Θέμα LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation>Γραμματοσειρά</translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation>Δρομέας</translation>
</message>

@ -138,50 +138,43 @@
<translation>Etoso de piktogramoj</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">Etoso de LXQt</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">Etoso de LXQt</translation>
<translation>Etoso de LXQt</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Agordoj de apero de LXQto</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Etoso de piktogramoj</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>Etoso de LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation>Tema de iconos</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">Tema de LXQt</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">Tema de LXQt</translation>
<translation>Tema de LXQt</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Configuración de apariencia de LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Tema de iconos</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>Tema de LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation>Tema de iconos</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">Tema LXQt</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">Tema LXQt</translation>
<translation>Tema LXQt</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Configuración de apariencia de LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Tema de iconos</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>Tema LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation>Ikonoen gaia</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">LXQt gaia</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">LXQt gaia</translation>
<translation>LXQt gaia</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>LXQt itxuraren konfigurazioa</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Ikonoen gaia</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>LXQt gaia</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation>Kuvaketeema</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">LXQt-teema</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">LXQt-teema</translation>
<translation>LXQt-teema</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>LXQtin ulkoasun hallinta</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Kuvaketeema</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>LXQt-teema</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation>Thème d&apos;icones</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">Thème de LXQt</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">Thème de LXQt</translation>
<translation>Thème de LXQt</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Configuration de l&apos;apparence de LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Thème d&apos;icones</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>Thème de LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,13 +138,6 @@
<translation>Ikontéma</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">LXQt téma</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
@ -156,32 +149,32 @@
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>LXQt megjelenésbeállító</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation>Bigyótéma</translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Ikontéma</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>LXQt téma</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation>Betű</translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation>Kurzor</translation>
</message>

@ -160,32 +160,32 @@
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>LXQt megjelenésbeállító</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation>Bigyótéma</translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Ikontémák</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>LXQT téma</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation>Betű</translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation>Kurzor</translation>
</message>

@ -149,32 +149,32 @@
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -149,32 +149,32 @@
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Konfigurasi Penampilan LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Tema Ikon</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -150,32 +150,32 @@
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Centro di Configurazione LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation>Stile degli elementi</translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Tema delle icone</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>Tema di LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation>Caratteri</translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation>Cursore</translation>
</message>

@ -149,32 +149,32 @@
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation></translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation></translation>
</message>

@ -149,32 +149,32 @@
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation>Piktogramų tema</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">LXQt apipavidalinimas</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">LXQt apipavidalinimas</translation>
<translation>LXQt apipavidalinimas</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>LXQt išvaizdos nustatymai</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Piktogramų tema</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>LXQt apipavidalinimas</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation>Pictogram Thema</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">LXQt Thema</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">LXQt Thema</translation>
<translation>LXQt Thema</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>LXQt Uiterlijk Configuratie</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Pictogram Thema</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>LXQt Thema</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -149,32 +149,32 @@
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Menu</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,13 +138,6 @@
<translation>Motyw ikon</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">Motyw LXQt</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
@ -156,32 +149,32 @@
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Konfiguracja wyglądu LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation>Widżety</translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Motyw ikon</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>Motyw LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation>Czcionka</translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation>Kursor</translation>
</message>

@ -138,50 +138,43 @@
<translation>Tema de ícones</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">Tema LXQt</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">Tema LXQt</translation>
<translation>Tema LXQt</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Configuração da aparência do LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Tema de ícones</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>Tema LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation>Tema de ícones</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">Tema do LXQt</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">Tema do LXQt</translation>
<translation>Tema do LXQt</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Configuração da aparência do LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Tema de ícones</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>Tema do LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation>Temă pictograme</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">Temă LXQt</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">Temă LXQt</translation>
<translation>Temă LXQt</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Părăsește</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Temă pictograme</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>Temă LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -149,32 +149,32 @@
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Настройка внешнего вида LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Тема иконок</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>LXQt темы</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation>Стиль виджетов</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation>Шрифт</translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation>Курсор</translation>
</message>

@ -149,32 +149,32 @@
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Настройка внешнего вида LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Тема иконок</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>LXQt темы</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation>Стиль виджетов</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation>Шрифт</translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation>Курсор</translation>
</message>

@ -160,32 +160,32 @@
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation type="unfinished">Nastavenie vzhľadu prostredia LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation type="unfinished">Téma ikon</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation>Tema ikon</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">Tema za LXQt</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">Tema za LXQt</translation>
<translation>Tema za LXQt</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Nastavitev videza za LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Tema ikon</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>Tema za LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -149,32 +149,32 @@
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Automatsko suspendovanje</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -160,32 +160,32 @@
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation type="unfinished">Подешавање изгледа Рејзора</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation type="unfinished">Тема икона</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -160,32 +160,32 @@
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation type="unfinished">Подешавање изгледа Рејзора</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation type="unfinished">Тема икона</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation></translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished"> LXQt</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished"> LXQt</translation>
<translation> LXQt</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation> LXQt </translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation></translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation> LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation>Simge Teması</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">LXQt Teması</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">LXQt Teması</translation>
<translation>LXQt Teması</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>LXQt Görünüm Ayarları</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Simge Teması</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>LXQt Teması</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation>Тема значків</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">Тема LXQt</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">Тема LXQt</translation>
<translation>Тема LXQt</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>Налаштування вигляду LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation>Тема значків</translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>Тема LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation></translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">LXQt </translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">LXQt </translation>
<translation>LXQt </translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>LXQt </translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation></translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>LXQt </translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -138,50 +138,43 @@
<translation></translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<source>LXQt Theme</source>
<translation type="vanished">LXQt</translation>
</message>
</context>
<context>
<name>LXQtThemeConfig</name>
<message>
<location filename="../lxqtthemeconfig.ui" line="23"/>
<source>LXQt Theme</source>
<translation type="unfinished">LXQt</translation>
<translation>LXQt</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="45"/>
<location filename="../main.cpp" line="46"/>
<source>LXQt Appearance Configuration</source>
<translation>LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="51"/>
<location filename="../main.cpp" line="52"/>
<source>Widget Style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="55"/>
<location filename="../main.cpp" line="56"/>
<source>Icons Theme</source>
<translation></translation>
</message>
<message>
<location filename="../main.cpp" line="59"/>
<location filename="../main.cpp" line="60"/>
<source>LXQt Theme</source>
<translation>LXQt</translation>
</message>
<message>
<location filename="../main.cpp" line="63"/>
<location filename="../main.cpp" line="64"/>
<source>Font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="68"/>
<location filename="../main.cpp" line="69"/>
<source>Cursor</source>
<translation type="unfinished"></translation>
</message>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished">0</translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation>0</translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation>0</translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished">0</translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished">0</translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished">0</translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished">0</translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished">0</translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished">0</translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation></translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished">0</translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation>0</translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation>0</translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished">0</translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation>0</translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished">0</translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished">0</translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished">0</translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -66,6 +66,11 @@
<source>0</source>
<translation type="unfinished">0</translation>
</message>
<message>
<location filename="../keyboardconfig.ui" line="167"/>
<source>Turn on NumLock after login</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>KeyboardLayoutConfig</name>

@ -33,8 +33,8 @@
int main (int argc, char **argv)
{
LXQt::SingleApplication app(argc, argv);
LXQt::Settings settings("LXQt-config-locale");
LXQt::Settings session_settings("LXQt-session");
LXQt::Settings settings("lxqt-config-locale");
LXQt::Settings session_settings("session");
LXQt::ConfigDialog* dialog = new LXQt::ConfigDialog(QObject::tr("LXQt Locale Configuration"), &settings);
app.setActivationWindow(dialog);

@ -64,32 +64,32 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../localeconfig.cpp" line="118"/>
<location filename="../localeconfig.cpp" line="119"/>
<source>No change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../localeconfig.cpp" line="306"/>
<location filename="../localeconfig.cpp" line="308"/>
<source>Format Settings Changed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../localeconfig.cpp" line="307"/>
<location filename="../localeconfig.cpp" line="309"/>
<source>Save the settings ? (they will take effect the next time you log in)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../localeconfig.cpp" line="428"/>
<location filename="../localeconfig.cpp" line="430"/>
<source>Imperial UK</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../localeconfig.cpp" line="432"/>
<location filename="../localeconfig.cpp" line="434"/>
<source>Imperial US</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../localeconfig.cpp" line="436"/>
<location filename="../localeconfig.cpp" line="438"/>
<source>Metric</source>
<translation type="unfinished"></translation>
</message>

@ -1,73 +1,65 @@
project(lxqt-config-monitor)
find_package(KF5Screen REQUIRED)
find_package(Qt5Svg REQUIRED)
set(H_FILES
main.h
set(HEADERS
monitorsettingsdialog.h
monitor.h
monitorwidget.h
xrandr.h
monitorpicture.h
quickoptions.h
savesettings.h
loadsettings.h
settingsdialog.h
)
set(CPP_FILES
set(SOURCES
main.cpp
monitorsettingsdialog.cpp
xrandr.cpp
monitor.cpp
monitorwidget.cpp
timeoutdialog.cpp
monitorpicture.cpp
quickoptions.cpp
savesettings.cpp
loadsettings.cpp
settingsdialog.cpp
)
set(UI_FILES
mainwindow.ui
set(UIS
monitorsettingsdialog.ui
monitorwidget.ui
timeoutdialog.ui
monitorpicture.ui
quickoptions.ui
savesettings.ui
)
set(ICON_FILES
set(ICONS
icons/monitor.svg
icons/extended.svg
icons/monitor1onmonitor2ff.svg
icons/unified.svg
icons/monitor1offmonitor2on.svg
)
# Config file
configure_file ( configure.in configure.h )
configure_file(resources/configure.in configure.h)
# Translations **********************************
lxqt_translate_ts(QM_FILES
UPDATE_TRANSLATIONS
${UPDATE_TRANSLATIONS}
SOURCES
${H_FILES}
${CPP_FILES}
${UI_FILES}
${HEADERS}
${SOURCES}
${UIS}
INSTALL_DIR
"${LXQT_TRANSLATIONS_DIR}/${PROJECT_NAME}"
)
lxqt_app_translation_loader(QM_LOADER ${PROJECT_NAME})
lxqt_translate_desktop(DESKTOP_FILES SOURCES ${PROJECT_NAME}.desktop.in)
lxqt_translate_desktop(DESKTOP_FILES SOURCES "resources/${PROJECT_NAME}.desktop.in")
#************************************************
add_executable(${PROJECT_NAME}
${CPP_FILES}
${SOURCES}
${RESOURCES}
${QRC_SOURCES}
${QM_FILES}
${DESKTOP_FILES}
${QM_FILES}
${QM_LOADER}
)
@ -75,21 +67,10 @@ target_link_libraries(${PROJECT_NAME}
Qt5::Widgets
Qt5::X11Extras
Qt5::Svg
KF5::Screen
lxqt
)
install(TARGETS
${PROJECT_NAME}
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
COMPONENT Runtime
)
install(FILES
${DESKTOP_FILES}
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications"
COMPONENT Runtime
)
install(FILES
${ICON_FILES}
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/lxqt/icons"
COMPONENT Runtime
)
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR})
install(FILES ${DESKTOP_FILES} DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/applications")
install(FILES ${ICON_FILES} DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/lxqt/icons")

@ -1,4 +1,4 @@
lxqt-config-monitor
===================
This tool lets you change monitor settings. It is based on lxrandr-qt.
This tool lets you change monitor settings. It was based on lxrandr-qt but now uses libkscreen.

@ -1,557 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<!-- Made by Dmitry Chestnykh (http://www.codingrobots.com) on Feb 25, 2009 -->
<!-- Public Domain: feel free to do everything you want with this drawing -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2"
sodipodi:docname="extended.svg"
viewBox="0 0 1400 398.84"
version="1.0"
inkscape:version="0.91 r13725"
width="1400"
height="398.84">
<sodipodi:namedview
id="namedview59"
bordercolor="#666666"
inkscape:pageshadow="2"
guidetolerance="10"
pagecolor="#ffffff"
gridtolerance="10"
inkscape:window-maximized="0"
inkscape:zoom="0.3284502"
objecttolerance="10"
borderopacity="1"
inkscape:current-layer="layer1"
inkscape:cx="505.40679"
inkscape:cy="106.39877"
inkscape:window-y="0"
inkscape:window-x="0"
inkscape:window-width="1160"
showgrid="false"
inkscape:pageopacity="0"
inkscape:window-height="720" />
<defs
id="defs4">
<linearGradient
id="linearGradient3291">
<stop
id="stop3293"
style="stop-color:#676767"
offset="0" />
<stop
id="stop3299"
style="stop-color:#ffffff"
offset=".02" />
<stop
id="stop3297"
style="stop-color:#dfdfe1"
offset=".04" />
<stop
id="stop3303"
style="stop-color:#efeff0"
offset="0.96" />
<stop
id="stop3301"
style="stop-color:#ffffff"
offset="0.98" />
<stop
id="stop3295"
style="stop-color:#676767"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3231">
<stop
id="stop3233"
style="stop-color:#ffffff"
offset="0" />
<stop
id="stop3235"
style="stop-color:#000000;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3237"
y2="423.04001"
xlink:href="#linearGradient3231"
gradientUnits="userSpaceOnUse"
x2="656.59998"
gradientTransform="matrix(1.0092,0,0,1.0058,-9.9652,2.1515)"
y1="97.767998"
x1="525.28003" />
<radialGradient
id="radialGradient3257"
xlink:href="#linearGradient3231"
gradientUnits="userSpaceOnUse"
cy="101.43"
cx="368.78"
gradientTransform="matrix(1,0,0,0.95,0,5.0362)"
r="3.4688001" />
<linearGradient
id="linearGradient3289"
y2="438.17001"
xlink:href="#linearGradient3291"
gradientUnits="userSpaceOnUse"
x2="724.58002"
gradientTransform="matrix(1.0028,0,0,0.9632,-1.0442,36.361)"
y1="438.17001"
x1="19.122999" />
<linearGradient
id="linearGradient3321"
y2="267.47"
gradientUnits="userSpaceOnUse"
x2="611.14001"
gradientTransform="matrix(1,0,0,0.99361,0,0.72801)"
y1="267.47"
x1="130.31">
<stop
id="stop3315"
style="stop-color:#9c5da6"
offset="0" />
<stop
id="stop3317"
style="stop-color:#5b325b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3339"
y2="472.51999"
gradientUnits="userSpaceOnUse"
x2="359.07999"
gradientTransform="matrix(0.99992,0,0,1.0177,1.2423,-21.78)"
y1="465.67001"
x1="359.07999">
<stop
id="stop3335"
style="stop-color:#e5e6e8"
offset="0" />
<stop
id="stop3337"
style="stop-color:#4c5252"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3415"
y2="459.79999"
xlink:href="#linearGradient3291"
gradientUnits="userSpaceOnUse"
x2="725.56"
gradientTransform="matrix(1.0001,0,0,0.88472,-0.03056,51.617)"
y1="459.79999"
x1="18.142" />
<linearGradient
id="linearGradient3447"
y2="478.26999"
gradientUnits="userSpaceOnUse"
x2="695.5"
gradientTransform="matrix(1.0083,0,0,1,-3.098,-2.7751)"
y1="484.17001"
x1="700.01001">
<stop
id="stop3391"
style="stop-color:#000000"
offset="0" />
<stop
id="stop3393"
style="stop-color:#fbfcff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3453"
y2="485.26999"
gradientUnits="userSpaceOnUse"
x2="329.66"
gradientTransform="matrix(1.0127,0,0,1,-6.2255,-2.7751)"
y1="473.48999"
x1="329.66">
<stop
id="stop3372"
style="stop-color:#8f9091"
offset="0" />
<stop
id="stop3374"
style="stop-color:#323b3b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3466"
y2="485.04001"
gradientUnits="userSpaceOnUse"
x2="334.45001"
gradientTransform="matrix(1.0083,0,0,0.95399,-3.098,19.287)"
y1="470.29999"
x1="334.45001">
<stop
id="stop3356"
style="stop-color:#d3d5d7"
offset="0" />
<stop
id="stop3483"
style="stop-color:#86898a"
offset=".5" />
<stop
id="stop3358"
style="stop-color:#171b1b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3471"
y2="473.95001"
gradientUnits="userSpaceOnUse"
x2="43.948002"
gradientTransform="matrix(1.0578,0,0,1.0104,-4.9081,-7.6835)"
y1="479.5"
x1="38.150002">
<stop
id="stop3475"
style="stop-color:#000000;stop-opacity:.30348"
offset="0" />
<stop
id="stop3477"
style="stop-color:#fbfcff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3339-2"
y2="472.51999"
gradientUnits="userSpaceOnUse"
x2="359.07999"
gradientTransform="matrix(0.99992,0,0,1.0177,697.91983,-23.304213)"
y1="465.67001"
x1="359.07999">
<stop
id="stop3335-0"
style="stop-color:#e5e6e8"
offset="0" />
<stop
id="stop3337-1"
style="stop-color:#4c5252"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3471-1"
y2="473.95001"
gradientUnits="userSpaceOnUse"
x2="43.948002"
gradientTransform="matrix(1.0578,0,0,1.0104,691.76943,-9.2077128)"
y1="479.5"
x1="38.150002">
<stop
id="stop3475-6"
style="stop-color:#000000;stop-opacity:.30348"
offset="0" />
<stop
id="stop3477-8"
style="stop-color:#fbfcff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3289-9"
y2="438.17001"
xlink:href="#linearGradient3291"
gradientUnits="userSpaceOnUse"
x2="724.58002"
gradientTransform="matrix(1.0028,0,0,0.9632,695.63333,34.836787)"
y1="438.17001"
x1="19.122999" />
<linearGradient
id="linearGradient3415-2"
y2="459.79999"
xlink:href="#linearGradient3291"
gradientUnits="userSpaceOnUse"
x2="725.56"
gradientTransform="matrix(1.0001,0,0,0.88472,696.64703,50.092787)"
y1="459.79999"
x1="18.142" />
<radialGradient
id="radialGradient3257-3"
xlink:href="#linearGradient3231"
gradientUnits="userSpaceOnUse"
cy="101.43"
cx="368.78"
gradientTransform="matrix(1.2563,0,0,1.193485,602.11753,-21.152233)"
r="3.4688001" />
<linearGradient
id="linearGradient3237-0"
y2="423.04001"
xlink:href="#linearGradient3231"
gradientUnits="userSpaceOnUse"
x2="656.59998"
gradientTransform="matrix(1.0092,0,0,1.0058,686.71233,0.62728715)"
y1="97.767998"
x1="525.28003" />
<linearGradient
id="linearGradient3321-4"
y2="267.47"
gradientUnits="userSpaceOnUse"
x2="611.14001"
gradientTransform="matrix(1,0,0,0.99361,696.67753,-0.79620285)"
y1="267.47"
x1="130.31">
<stop
id="stop3315-8"
style="stop-color:#9c5da6"
offset="0" />
<stop
id="stop3317-9"
style="stop-color:#5b325b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3447-1"
y2="478.26999"
gradientUnits="userSpaceOnUse"
x2="695.5"
gradientTransform="matrix(1.0083,0,0,1,693.57953,-4.2993128)"
y1="484.17001"
x1="700.01001">
<stop
id="stop3391-4"
style="stop-color:#000000"
offset="0" />
<stop
id="stop3393-4"
style="stop-color:#fbfcff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3466-6"
y2="485.04001"
gradientUnits="userSpaceOnUse"
x2="334.45001"
gradientTransform="matrix(1.0083,0,0,0.95399,693.57953,17.762787)"
y1="470.29999"
x1="334.45001">
<stop
id="stop3356-4"
style="stop-color:#d3d5d7"
offset="0" />
<stop
id="stop3483-4"
style="stop-color:#86898a"
offset=".5" />
<stop
id="stop3358-6"
style="stop-color:#171b1b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3453-6"
y2="485.26999"
gradientUnits="userSpaceOnUse"
x2="329.66"
gradientTransform="matrix(1.0127,0,0,1,690.45203,-4.2993128)"
y1="473.48999"
x1="329.66">
<stop
id="stop3372-5"
style="stop-color:#8f9091"
offset="0" />
<stop
id="stop3374-6"
style="stop-color:#323b3b"
offset="1" />
</linearGradient>
</defs>
<g
id="layer1"
transform="translate(-18.142,-83.649)">
<path
id="rect3343"
style="fill:url(#linearGradient3453)"
d="m 50.343,458.94 642.03,0 c 10.97,0 19.8,4.6 19.8,10.31 l 2.11,5.71 c -7.73,4.32 -10.94,7.53 -21.91,7.53 l -642.03,0 c -10.968,0 -22.769,-7.05 -25.49,-11.28 l 7.667,-1.23 c 0,-5.7 6.855,-11.04 17.826,-11.04 z"
inkscape:connector-curvature="0" />
<path
id="rect3341"
style="fill:url(#linearGradient3466)"
d="m 35.312,447.96 c -7.029,0 -13.166,2.66 -16.656,6.67 l 0,13.87 c 0,0.49 -0.03,0.97 -0.062,1.46 3.479,4.05 9.647,6.76 16.718,6.76 l 672.1,0 c 7.65,0 14.22,-3.18 17.5,-7.81 -0.22,-1.12 -0.35,-2.27 -0.35,-3.45 l 0,-10.23 c -3.38,-4.35 -9.78,-7.27 -17.15,-7.27 l -672.1,0 z"
inkscape:connector-curvature="0" />
<path
id="path3377"
style="opacity:0.28358017;fill:url(#linearGradient3447);fill-rule:evenodd"
d="m 699.43,482.26 9.62,-4.86 c 10.84,-2.08 15.56,-8.32 15.56,-8.32 l -30.78,-0.18 -15.21,13.19 20.81,0.17 z"
inkscape:connector-curvature="0" />
<rect
id="rect2453"
style="fill:#d0d0d2;stroke:#b3b7b7;stroke-width:2;stroke-linecap:round;stroke-linejoin:bevel"
rx="19.999001"
ry="21.165001"
height="384.84"
width="542.42999"
y="84.649002"
x="101.03" />
<rect
id="rect3225"
style="fill:#000000;stroke:#000000;stroke-width:1.00880003;stroke-linecap:round;stroke-linejoin:bevel"
rx="17"
ry="17"
height="376.78"
width="535.76001"
y="88.265999"
x="103.91" />
<rect
id="rect3227"
style="opacity:0.87064999;fill:url(#linearGradient3321)"
height="305.12"
width="480.82999"
y="113.93"
x="130.31" />
<path
id="path3229"
style="opacity:0.26368001;fill:url(#linearGradient3237);fill-rule:evenodd"
d="m 533.41,88.935 -198.8,364.08 303.8,1.02 c 0,0 0.98,-330.92 0.57,-345.69 C 638.55,92.876 632.01,89.321 618.5,89.151 604.3,88.972 533.41,88.93 533.41,88.93 Z"
inkscape:connector-curvature="0" />
<path
id="path3241"
style="opacity:0.16418002;fill:url(#radialGradient3257)"
d="m 372.25,100.72 a 3.47,3.29654 0 1 1 -6.94,0 3.47,3.29654 0 1 1 6.94,0 z"
transform="matrix(1.2563,0,0,1.2563,-94.56,-25.955)"
inkscape:connector-curvature="0" />
<rect
id="rect3279"
style="fill:url(#linearGradient3289);stroke:url(#linearGradient3415);stroke-width:0.9199;stroke-linecap:round;stroke-linejoin:bevel"
height="20.851999"
width="706.5"
y="447.98001"
x="18.601999" />
<path
id="path3379"
style="opacity:0.77612;fill:url(#linearGradient3471);fill-rule:evenodd"
d="m 18.57,469.25 15.782,0.35 16.658,4.21 13.576,6.66 -22.162,0.7 -11.741,-4.56 c -9.907,-2.8 -12.113,-7.36 -12.113,-7.36 z"
inkscape:connector-curvature="0" />
<path
id="rect3323"
style="opacity:0.87064999;fill:url(#linearGradient3339);stroke:#707575;stroke-width:0.94420999;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:0.51256002"
d="m 315.17,447.12 0,1.81 c 0,5.64 4.46,10.18 10,10.18 l 86.93,0 c 5.54,0 10,-4.54 10,-10.18 l 0,-1.81 -106.93,0 z"
inkscape:connector-curvature="0" />
<rect
id="rect3479"
style="opacity:0.86567;fill:#000000;stroke:#999c9c;stroke-linecap:round;stroke-linejoin:bevel"
height="2.6981001"
width="25.754999"
y="457.29999"
x="657.10999" />
<rect
id="rect3481"
style="fill:#595c5c"
height="0.83490002"
width="536.71002"
y="446.67001"
x="103.41" />
<text
id="text3485"
y="436.30844"
x="344.03226"
xml:space="preserve"
style="font-size:74.73600006px;font-family:Futura;opacity:0.56218998;fill:#000000"><tspan
id="tspan3487"
y="436.30844"
x="344.03226"
style="font-size:9.11419964px;font-family:'Lucida Grande';fill:#ffffff">MoonBook</tspan></text>
<rect
id="rect2453-1"
style="fill:#d0d0d2;stroke:#b3b7b7;stroke-width:2;stroke-linecap:round;stroke-linejoin:bevel"
rx="19.999001"
ry="21.165001"
height="384.84"
width="542.42999"
y="83.124794"
x="797.70752" />
<rect
id="rect3225-3"
style="fill:#000000;stroke:#000000;stroke-width:1.00880003;stroke-linecap:round;stroke-linejoin:bevel"
rx="17"
ry="17"
height="376.78"
width="535.76001"
y="86.741798"
x="800.58752" />
<rect
id="rect3227-6"
style="opacity:0.87064999;fill:url(#linearGradient3321-4)"
height="305.12"
width="480.82999"
y="112.4058"
x="826.98755" />
<path
id="path3229-3"
style="opacity:0.26368001;fill:url(#linearGradient3237-0);fill-rule:evenodd"
d="m 1230.0875,87.410787 -198.8,364.080003 303.8,1.02 c 0,0 0.98,-330.92 0.57,-345.69 -0.43,-15.469003 -6.97,-19.024003 -20.48,-19.194003 -14.2,-0.179 -85.09,-0.221 -85.09,-0.221 z"
inkscape:connector-curvature="0" />
<path
id="path3241-5"
style="opacity:0.16418002;fill:url(#radialGradient3257-3)"
d="m 1069.7752,99.055317 a 4.359365,4.141447 0 0 1 -8.7187,0 4.359365,4.141447 0 1 1 8.7187,0 z"
inkscape:connector-curvature="0" />
<rect
style="fill:#00aa80;fill-opacity:0.27979276"
id="rect3409"
width="133.96246"
height="143.09627"
x="471.78766"
y="196.29645" />
<rect
style="fill:#00aa80;fill-opacity:0.27843137"
id="rect3409-0"
width="155.27469"
height="143.09627"
x="823.43921"
y="200.86334" />
</g>
<metadata
id="metadata54">
<rdf:RDF>
<cc:Work>
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<cc:license
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
<dc:publisher>
<cc:Agent
rdf:about="http://openclipart.org/">
<dc:title>Openclipart</dc:title>
</cc:Agent>
</dc:publisher>
<dc:title></dc:title>
<dc:date>2011-09-06T14:48:13</dc:date>
<dc:description>Aluminum unibody laptop computer with glare screen.</dc:description>
<dc:source>https://openclipart.org/detail/159331/moonbook-laptop-by-dchest</dc:source>
<dc:creator>
<cc:Agent>
<dc:title>dchest</dc:title>
</cc:Agent>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>computer</rdf:li>
<rdf:li>laptop</rdf:li>
<rdf:li>mac</rdf:li>
<rdf:li>macbook</rdf:li>
<rdf:li>notebook</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

@ -1,543 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<!-- Made by Dmitry Chestnykh (http://www.codingrobots.com) on Feb 25, 2009 -->
<!-- Public Domain: feel free to do everything you want with this drawing -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2"
sodipodi:docname="monitor1offmonitor2on.svg"
viewBox="0 0 1400 398.84"
version="1.0"
inkscape:version="0.91 r13725"
width="1400"
height="398.84">
<sodipodi:namedview
id="namedview59"
bordercolor="#666666"
inkscape:pageshadow="2"
guidetolerance="10"
pagecolor="#ffffff"
gridtolerance="10"
inkscape:window-maximized="0"
inkscape:zoom="0.3284502"
objecttolerance="10"
borderopacity="1"
inkscape:current-layer="layer1"
inkscape:cx="505.40679"
inkscape:cy="106.39877"
inkscape:window-y="0"
inkscape:window-x="0"
inkscape:window-width="1160"
showgrid="false"
inkscape:pageopacity="0"
inkscape:window-height="720" />
<defs
id="defs4">
<linearGradient
id="linearGradient3291">
<stop
id="stop3293"
style="stop-color:#676767"
offset="0" />
<stop
id="stop3299"
style="stop-color:#ffffff"
offset=".02" />
<stop
id="stop3297"
style="stop-color:#dfdfe1"
offset=".04" />
<stop
id="stop3303"
style="stop-color:#efeff0"
offset="0.96" />
<stop
id="stop3301"
style="stop-color:#ffffff"
offset="0.98" />
<stop
id="stop3295"
style="stop-color:#676767"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3231">
<stop
id="stop3233"
style="stop-color:#ffffff"
offset="0" />
<stop
id="stop3235"
style="stop-color:#000000;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3237"
y2="423.04001"
xlink:href="#linearGradient3231"
gradientUnits="userSpaceOnUse"
x2="656.59998"
gradientTransform="matrix(1.0092,0,0,1.0058,-9.9652,2.1515)"
y1="97.767998"
x1="525.28003" />
<radialGradient
id="radialGradient3257"
xlink:href="#linearGradient3231"
gradientUnits="userSpaceOnUse"
cy="101.43"
cx="368.78"
gradientTransform="matrix(1,0,0,0.95,0,5.0362)"
r="3.4688001" />
<linearGradient
id="linearGradient3289"
y2="438.17001"
xlink:href="#linearGradient3291"
gradientUnits="userSpaceOnUse"
x2="724.58002"
gradientTransform="matrix(1.0028,0,0,0.9632,-1.0442,36.361)"
y1="438.17001"
x1="19.122999" />
<linearGradient
id="linearGradient3321"
y2="267.47"
gradientUnits="userSpaceOnUse"
x2="611.14001"
gradientTransform="matrix(1,0,0,0.99361,0,0.72801)"
y1="267.47"
x1="130.31">
<stop
id="stop3315"
style="stop-color:#9c5da6"
offset="0" />
<stop
id="stop3317"
style="stop-color:#5b325b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3339"
y2="472.51999"
gradientUnits="userSpaceOnUse"
x2="359.07999"
gradientTransform="matrix(0.99992,0,0,1.0177,1.2423,-21.78)"
y1="465.67001"
x1="359.07999">
<stop
id="stop3335"
style="stop-color:#e5e6e8"
offset="0" />
<stop
id="stop3337"
style="stop-color:#4c5252"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3415"
y2="459.79999"
xlink:href="#linearGradient3291"
gradientUnits="userSpaceOnUse"
x2="725.56"
gradientTransform="matrix(1.0001,0,0,0.88472,-0.03056,51.617)"
y1="459.79999"
x1="18.142" />
<linearGradient
id="linearGradient3447"
y2="478.26999"
gradientUnits="userSpaceOnUse"
x2="695.5"
gradientTransform="matrix(1.0083,0,0,1,-3.098,-2.7751)"
y1="484.17001"
x1="700.01001">
<stop
id="stop3391"
style="stop-color:#000000"
offset="0" />
<stop
id="stop3393"
style="stop-color:#fbfcff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3453"
y2="485.26999"
gradientUnits="userSpaceOnUse"
x2="329.66"
gradientTransform="matrix(1.0127,0,0,1,-6.2255,-2.7751)"
y1="473.48999"
x1="329.66">
<stop
id="stop3372"
style="stop-color:#8f9091"
offset="0" />
<stop
id="stop3374"
style="stop-color:#323b3b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3466"
y2="485.04001"
gradientUnits="userSpaceOnUse"
x2="334.45001"
gradientTransform="matrix(1.0083,0,0,0.95399,-3.098,19.287)"
y1="470.29999"
x1="334.45001">
<stop
id="stop3356"
style="stop-color:#d3d5d7"
offset="0" />
<stop
id="stop3483"
style="stop-color:#86898a"
offset=".5" />
<stop
id="stop3358"
style="stop-color:#171b1b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3471"
y2="473.95001"
gradientUnits="userSpaceOnUse"
x2="43.948002"
gradientTransform="matrix(1.0578,0,0,1.0104,-4.9081,-7.6835)"
y1="479.5"
x1="38.150002">
<stop
id="stop3475"
style="stop-color:#000000;stop-opacity:.30348"
offset="0" />
<stop
id="stop3477"
style="stop-color:#fbfcff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3339-2"
y2="472.51999"
gradientUnits="userSpaceOnUse"
x2="359.07999"
gradientTransform="matrix(0.99992,0,0,1.0177,697.91983,-23.304213)"
y1="465.67001"
x1="359.07999">
<stop
id="stop3335-0"
style="stop-color:#e5e6e8"
offset="0" />
<stop
id="stop3337-1"
style="stop-color:#4c5252"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3471-1"
y2="473.95001"
gradientUnits="userSpaceOnUse"
x2="43.948002"
gradientTransform="matrix(1.0578,0,0,1.0104,691.76943,-9.2077128)"
y1="479.5"
x1="38.150002">
<stop
id="stop3475-6"
style="stop-color:#000000;stop-opacity:.30348"
offset="0" />
<stop
id="stop3477-8"
style="stop-color:#fbfcff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3289-9"
y2="438.17001"
xlink:href="#linearGradient3291"
gradientUnits="userSpaceOnUse"
x2="724.58002"
gradientTransform="matrix(1.0028,0,0,0.9632,695.63333,34.836787)"
y1="438.17001"
x1="19.122999" />
<linearGradient
id="linearGradient3415-2"
y2="459.79999"
xlink:href="#linearGradient3291"
gradientUnits="userSpaceOnUse"
x2="725.56"
gradientTransform="matrix(1.0001,0,0,0.88472,696.64703,50.092787)"
y1="459.79999"
x1="18.142" />
<radialGradient
id="radialGradient3257-3"
xlink:href="#linearGradient3231"
gradientUnits="userSpaceOnUse"
cy="101.43"
cx="368.78"
gradientTransform="matrix(1.2563,0,0,1.193485,602.11753,-21.152233)"
r="3.4688001" />
<linearGradient
id="linearGradient3237-0"
y2="423.04001"
xlink:href="#linearGradient3231"
gradientUnits="userSpaceOnUse"
x2="656.59998"
gradientTransform="matrix(1.0092,0,0,1.0058,686.71233,0.62728715)"
y1="97.767998"
x1="525.28003" />
<linearGradient
id="linearGradient3321-4"
y2="267.47"
gradientUnits="userSpaceOnUse"
x2="611.14001"
gradientTransform="matrix(1,0,0,0.99361,696.67753,-0.79620285)"
y1="267.47"
x1="130.31">
<stop
id="stop3315-8"
style="stop-color:#9c5da6"
offset="0" />
<stop
id="stop3317-9"
style="stop-color:#5b325b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3447-1"
y2="478.26999"
gradientUnits="userSpaceOnUse"
x2="695.5"
gradientTransform="matrix(1.0083,0,0,1,693.57953,-4.2993128)"
y1="484.17001"
x1="700.01001">
<stop
id="stop3391-4"
style="stop-color:#000000"
offset="0" />
<stop
id="stop3393-4"
style="stop-color:#fbfcff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3466-6"
y2="485.04001"
gradientUnits="userSpaceOnUse"
x2="334.45001"
gradientTransform="matrix(1.0083,0,0,0.95399,693.57953,17.762787)"
y1="470.29999"
x1="334.45001">
<stop
id="stop3356-4"
style="stop-color:#d3d5d7"
offset="0" />
<stop
id="stop3483-4"
style="stop-color:#86898a"
offset=".5" />
<stop
id="stop3358-6"
style="stop-color:#171b1b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3453-6"
y2="485.26999"
gradientUnits="userSpaceOnUse"
x2="329.66"
gradientTransform="matrix(1.0127,0,0,1,690.45203,-4.2993128)"
y1="473.48999"
x1="329.66">
<stop
id="stop3372-5"
style="stop-color:#8f9091"
offset="0" />
<stop
id="stop3374-6"
style="stop-color:#323b3b"
offset="1" />
</linearGradient>
</defs>
<g
id="layer1"
transform="translate(-18.142,-83.649)">
<path
id="rect3343"
style="fill:url(#linearGradient3453)"
d="m 50.343,458.94 642.03,0 c 10.97,0 19.8,4.6 19.8,10.31 l 2.11,5.71 c -7.73,4.32 -10.94,7.53 -21.91,7.53 l -642.03,0 c -10.968,0 -22.769,-7.05 -25.49,-11.28 l 7.667,-1.23 c 0,-5.7 6.855,-11.04 17.826,-11.04 z"
inkscape:connector-curvature="0" />
<path
id="rect3341"
style="fill:url(#linearGradient3466)"
d="m 35.312,447.96 c -7.029,0 -13.166,2.66 -16.656,6.67 l 0,13.87 c 0,0.49 -0.03,0.97 -0.062,1.46 3.479,4.05 9.647,6.76 16.718,6.76 l 672.1,0 c 7.65,0 14.22,-3.18 17.5,-7.81 -0.22,-1.12 -0.35,-2.27 -0.35,-3.45 l 0,-10.23 c -3.38,-4.35 -9.78,-7.27 -17.15,-7.27 l -672.1,0 z"
inkscape:connector-curvature="0" />
<path
id="path3377"
style="opacity:0.28358017;fill:url(#linearGradient3447);fill-rule:evenodd"
d="m 699.43,482.26 9.62,-4.86 c 10.84,-2.08 15.56,-8.32 15.56,-8.32 l -30.78,-0.18 -15.21,13.19 20.81,0.17 z"
inkscape:connector-curvature="0" />
<rect
id="rect2453"
style="fill:#d0d0d2;stroke:#b3b7b7;stroke-width:2;stroke-linecap:round;stroke-linejoin:bevel"
rx="19.999001"
ry="21.165001"
height="384.84"
width="542.42999"
y="84.649002"
x="101.03" />
<rect
id="rect3225"
style="fill:#000000;stroke:#000000;stroke-width:1.00880003;stroke-linecap:round;stroke-linejoin:bevel"
rx="17"
ry="17"
height="376.78"
width="535.76001"
y="88.265999"
x="103.91" />
<rect
id="rect3227"
style="opacity:0.87064999;fill:none"
height="305.12"
width="480.82999"
y="113.93"
x="130.31" />
<path
id="path3229"
style="opacity:0.26368001;fill:url(#linearGradient3237);fill-rule:evenodd"
d="m 533.41,88.935 -198.8,364.08 303.8,1.02 c 0,0 0.98,-330.92 0.57,-345.69 C 638.55,92.876 632.01,89.321 618.5,89.151 604.3,88.972 533.41,88.93 533.41,88.93 Z"
inkscape:connector-curvature="0" />
<path
id="path3241"
style="opacity:0.16418002;fill:url(#radialGradient3257)"
d="m 372.25,100.72 a 3.47,3.29654 0 1 1 -6.94,0 3.47,3.29654 0 1 1 6.94,0 z"
transform="matrix(1.2563,0,0,1.2563,-94.56,-25.955)"
inkscape:connector-curvature="0" />
<rect
id="rect3279"
style="fill:url(#linearGradient3289);stroke:url(#linearGradient3415);stroke-width:0.9199;stroke-linecap:round;stroke-linejoin:bevel"
height="20.851999"
width="706.5"
y="447.98001"
x="18.601999" />
<path
id="path3379"
style="opacity:0.77612;fill:url(#linearGradient3471);fill-rule:evenodd"
d="m 18.57,469.25 15.782,0.35 16.658,4.21 13.576,6.66 -22.162,0.7 -11.741,-4.56 c -9.907,-2.8 -12.113,-7.36 -12.113,-7.36 z"
inkscape:connector-curvature="0" />
<path
id="rect3323"
style="opacity:0.87064999;fill:url(#linearGradient3339);stroke:#707575;stroke-width:0.94420999;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:0.51256002"
d="m 315.17,447.12 0,1.81 c 0,5.64 4.46,10.18 10,10.18 l 86.93,0 c 5.54,0 10,-4.54 10,-10.18 l 0,-1.81 -106.93,0 z"
inkscape:connector-curvature="0" />
<rect
id="rect3479"
style="opacity:0.86567;fill:#000000;stroke:#999c9c;stroke-linecap:round;stroke-linejoin:bevel"
height="2.6981001"
width="25.754999"
y="457.29999"
x="657.10999" />
<rect
id="rect3481"
style="fill:#595c5c"
height="0.83490002"
width="536.71002"
y="446.67001"
x="103.41" />
<text
id="text3485"
y="436.30844"
x="344.03226"
xml:space="preserve"
style="font-size:74.73600006px;font-family:Futura;opacity:0.56218998;fill:#000000"><tspan
id="tspan3487"
y="436.30844"
x="344.03226"
style="font-size:9.11419964px;font-family:'Lucida Grande';fill:#ffffff">MoonBook</tspan></text>
<rect
id="rect2453-1"
style="fill:#d0d0d2;stroke:#b3b7b7;stroke-width:2;stroke-linecap:round;stroke-linejoin:bevel"
rx="19.999001"
ry="21.165001"
height="384.84"
width="542.42999"
y="83.124794"
x="797.70752" />
<rect
id="rect3225-3"
style="fill:#000000;stroke:#000000;stroke-width:1.00880003;stroke-linecap:round;stroke-linejoin:bevel"
rx="17"
ry="17"
height="376.78"
width="535.76001"
y="86.741798"
x="800.58752" />
<rect
id="rect3227-6"
style="opacity:0.87064999;fill:url(#linearGradient3321-4)"
height="305.12"
width="480.82999"
y="112.4058"
x="826.98755" />
<path
id="path3229-3"
style="opacity:0.26368001;fill:url(#linearGradient3237-0);fill-rule:evenodd"
d="m 1230.0875,87.410787 -198.8,364.080003 303.8,1.02 c 0,0 0.98,-330.92 0.57,-345.69 -0.43,-15.469003 -6.97,-19.024003 -20.48,-19.194003 -14.2,-0.179 -85.09,-0.221 -85.09,-0.221 z"
inkscape:connector-curvature="0" />
<path
id="path3241-5"
style="opacity:0.16418002;fill:url(#radialGradient3257-3)"
d="m 1069.7752,99.055317 a 4.359365,4.141447 0 0 1 -8.7187,0 4.359365,4.141447 0 1 1 8.7187,0 z"
inkscape:connector-curvature="0" />
</g>
<metadata
id="metadata54">
<rdf:RDF>
<cc:Work>
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<cc:license
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
<dc:publisher>
<cc:Agent
rdf:about="http://openclipart.org/">
<dc:title>Openclipart</dc:title>
</cc:Agent>
</dc:publisher>
<dc:title></dc:title>
<dc:date>2011-09-06T14:48:13</dc:date>
<dc:description>Aluminum unibody laptop computer with glare screen.</dc:description>
<dc:source>https://openclipart.org/detail/159331/moonbook-laptop-by-dchest</dc:source>
<dc:creator>
<cc:Agent>
<dc:title>dchest</dc:title>
</cc:Agent>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>computer</rdf:li>
<rdf:li>laptop</rdf:li>
<rdf:li>mac</rdf:li>
<rdf:li>macbook</rdf:li>
<rdf:li>notebook</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

@ -1,543 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<!-- Made by Dmitry Chestnykh (http://www.codingrobots.com) on Feb 25, 2009 -->
<!-- Public Domain: feel free to do everything you want with this drawing -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2"
sodipodi:docname="monitor1onmonitor2ff.svg"
viewBox="0 0 1400 398.84"
version="1.0"
inkscape:version="0.91 r13725"
width="1400"
height="398.84">
<sodipodi:namedview
id="namedview59"
bordercolor="#666666"
inkscape:pageshadow="2"
guidetolerance="10"
pagecolor="#ffffff"
gridtolerance="10"
inkscape:window-maximized="0"
inkscape:zoom="0.3284502"
objecttolerance="10"
borderopacity="1"
inkscape:current-layer="layer1"
inkscape:cx="505.40679"
inkscape:cy="106.39877"
inkscape:window-y="0"
inkscape:window-x="0"
inkscape:window-width="1160"
showgrid="false"
inkscape:pageopacity="0"
inkscape:window-height="720" />
<defs
id="defs4">
<linearGradient
id="linearGradient3291">
<stop
id="stop3293"
style="stop-color:#676767"
offset="0" />
<stop
id="stop3299"
style="stop-color:#ffffff"
offset=".02" />
<stop
id="stop3297"
style="stop-color:#dfdfe1"
offset=".04" />
<stop
id="stop3303"
style="stop-color:#efeff0"
offset="0.96" />
<stop
id="stop3301"
style="stop-color:#ffffff"
offset="0.98" />
<stop
id="stop3295"
style="stop-color:#676767"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3231">
<stop
id="stop3233"
style="stop-color:#ffffff"
offset="0" />
<stop
id="stop3235"
style="stop-color:#000000;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3237"
y2="423.04001"
xlink:href="#linearGradient3231"
gradientUnits="userSpaceOnUse"
x2="656.59998"
gradientTransform="matrix(1.0092,0,0,1.0058,-9.9652,2.1515)"
y1="97.767998"
x1="525.28003" />
<radialGradient
id="radialGradient3257"
xlink:href="#linearGradient3231"
gradientUnits="userSpaceOnUse"
cy="101.43"
cx="368.78"
gradientTransform="matrix(1,0,0,0.95,0,5.0362)"
r="3.4688001" />
<linearGradient
id="linearGradient3289"
y2="438.17001"
xlink:href="#linearGradient3291"
gradientUnits="userSpaceOnUse"
x2="724.58002"
gradientTransform="matrix(1.0028,0,0,0.9632,-1.0442,36.361)"
y1="438.17001"
x1="19.122999" />
<linearGradient
id="linearGradient3321"
y2="267.47"
gradientUnits="userSpaceOnUse"
x2="611.14001"
gradientTransform="matrix(1,0,0,0.99361,0,0.72801)"
y1="267.47"
x1="130.31">
<stop
id="stop3315"
style="stop-color:#9c5da6"
offset="0" />
<stop
id="stop3317"
style="stop-color:#5b325b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3339"
y2="472.51999"
gradientUnits="userSpaceOnUse"
x2="359.07999"
gradientTransform="matrix(0.99992,0,0,1.0177,1.2423,-21.78)"
y1="465.67001"
x1="359.07999">
<stop
id="stop3335"
style="stop-color:#e5e6e8"
offset="0" />
<stop
id="stop3337"
style="stop-color:#4c5252"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3415"
y2="459.79999"
xlink:href="#linearGradient3291"
gradientUnits="userSpaceOnUse"
x2="725.56"
gradientTransform="matrix(1.0001,0,0,0.88472,-0.03056,51.617)"
y1="459.79999"
x1="18.142" />
<linearGradient
id="linearGradient3447"
y2="478.26999"
gradientUnits="userSpaceOnUse"
x2="695.5"
gradientTransform="matrix(1.0083,0,0,1,-3.098,-2.7751)"
y1="484.17001"
x1="700.01001">
<stop
id="stop3391"
style="stop-color:#000000"
offset="0" />
<stop
id="stop3393"
style="stop-color:#fbfcff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3453"
y2="485.26999"
gradientUnits="userSpaceOnUse"
x2="329.66"
gradientTransform="matrix(1.0127,0,0,1,-6.2255,-2.7751)"
y1="473.48999"
x1="329.66">
<stop
id="stop3372"
style="stop-color:#8f9091"
offset="0" />
<stop
id="stop3374"
style="stop-color:#323b3b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3466"
y2="485.04001"
gradientUnits="userSpaceOnUse"
x2="334.45001"
gradientTransform="matrix(1.0083,0,0,0.95399,-3.098,19.287)"
y1="470.29999"
x1="334.45001">
<stop
id="stop3356"
style="stop-color:#d3d5d7"
offset="0" />
<stop
id="stop3483"
style="stop-color:#86898a"
offset=".5" />
<stop
id="stop3358"
style="stop-color:#171b1b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3471"
y2="473.95001"
gradientUnits="userSpaceOnUse"
x2="43.948002"
gradientTransform="matrix(1.0578,0,0,1.0104,-4.9081,-7.6835)"
y1="479.5"
x1="38.150002">
<stop
id="stop3475"
style="stop-color:#000000;stop-opacity:.30348"
offset="0" />
<stop
id="stop3477"
style="stop-color:#fbfcff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3339-2"
y2="472.51999"
gradientUnits="userSpaceOnUse"
x2="359.07999"
gradientTransform="matrix(0.99992,0,0,1.0177,697.91983,-23.304213)"
y1="465.67001"
x1="359.07999">
<stop
id="stop3335-0"
style="stop-color:#e5e6e8"
offset="0" />
<stop
id="stop3337-1"
style="stop-color:#4c5252"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3471-1"
y2="473.95001"
gradientUnits="userSpaceOnUse"
x2="43.948002"
gradientTransform="matrix(1.0578,0,0,1.0104,691.76943,-9.2077128)"
y1="479.5"
x1="38.150002">
<stop
id="stop3475-6"
style="stop-color:#000000;stop-opacity:.30348"
offset="0" />
<stop
id="stop3477-8"
style="stop-color:#fbfcff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3289-9"
y2="438.17001"
xlink:href="#linearGradient3291"
gradientUnits="userSpaceOnUse"
x2="724.58002"
gradientTransform="matrix(1.0028,0,0,0.9632,695.63333,34.836787)"
y1="438.17001"
x1="19.122999" />
<linearGradient
id="linearGradient3415-2"
y2="459.79999"
xlink:href="#linearGradient3291"
gradientUnits="userSpaceOnUse"
x2="725.56"
gradientTransform="matrix(1.0001,0,0,0.88472,696.64703,50.092787)"
y1="459.79999"
x1="18.142" />
<radialGradient
id="radialGradient3257-3"
xlink:href="#linearGradient3231"
gradientUnits="userSpaceOnUse"
cy="101.43"
cx="368.78"
gradientTransform="matrix(1.2563,0,0,1.193485,602.11753,-21.152233)"
r="3.4688001" />
<linearGradient
id="linearGradient3237-0"
y2="423.04001"
xlink:href="#linearGradient3231"
gradientUnits="userSpaceOnUse"
x2="656.59998"
gradientTransform="matrix(1.0092,0,0,1.0058,686.71233,0.62728715)"
y1="97.767998"
x1="525.28003" />
<linearGradient
id="linearGradient3321-4"
y2="267.47"
gradientUnits="userSpaceOnUse"
x2="611.14001"
gradientTransform="matrix(1,0,0,0.99361,696.67753,-0.79620285)"
y1="267.47"
x1="130.31">
<stop
id="stop3315-8"
style="stop-color:#9c5da6"
offset="0" />
<stop
id="stop3317-9"
style="stop-color:#5b325b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3447-1"
y2="478.26999"
gradientUnits="userSpaceOnUse"
x2="695.5"
gradientTransform="matrix(1.0083,0,0,1,693.57953,-4.2993128)"
y1="484.17001"
x1="700.01001">
<stop
id="stop3391-4"
style="stop-color:#000000"
offset="0" />
<stop
id="stop3393-4"
style="stop-color:#fbfcff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3466-6"
y2="485.04001"
gradientUnits="userSpaceOnUse"
x2="334.45001"
gradientTransform="matrix(1.0083,0,0,0.95399,693.57953,17.762787)"
y1="470.29999"
x1="334.45001">
<stop
id="stop3356-4"
style="stop-color:#d3d5d7"
offset="0" />
<stop
id="stop3483-4"
style="stop-color:#86898a"
offset=".5" />
<stop
id="stop3358-6"
style="stop-color:#171b1b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3453-6"
y2="485.26999"
gradientUnits="userSpaceOnUse"
x2="329.66"
gradientTransform="matrix(1.0127,0,0,1,690.45203,-4.2993128)"
y1="473.48999"
x1="329.66">
<stop
id="stop3372-5"
style="stop-color:#8f9091"
offset="0" />
<stop
id="stop3374-6"
style="stop-color:#323b3b"
offset="1" />
</linearGradient>
</defs>
<g
id="layer1"
transform="translate(-18.142,-83.649)">
<path
id="rect3343"
style="fill:url(#linearGradient3453)"
d="m 50.343,458.94 642.03,0 c 10.97,0 19.8,4.6 19.8,10.31 l 2.11,5.71 c -7.73,4.32 -10.94,7.53 -21.91,7.53 l -642.03,0 c -10.968,0 -22.769,-7.05 -25.49,-11.28 l 7.667,-1.23 c 0,-5.7 6.855,-11.04 17.826,-11.04 z"
inkscape:connector-curvature="0" />
<path
id="rect3341"
style="fill:url(#linearGradient3466)"
d="m 35.312,447.96 c -7.029,0 -13.166,2.66 -16.656,6.67 l 0,13.87 c 0,0.49 -0.03,0.97 -0.062,1.46 3.479,4.05 9.647,6.76 16.718,6.76 l 672.1,0 c 7.65,0 14.22,-3.18 17.5,-7.81 -0.22,-1.12 -0.35,-2.27 -0.35,-3.45 l 0,-10.23 c -3.38,-4.35 -9.78,-7.27 -17.15,-7.27 l -672.1,0 z"
inkscape:connector-curvature="0" />
<path
id="path3377"
style="opacity:0.28358017;fill:url(#linearGradient3447);fill-rule:evenodd"
d="m 699.43,482.26 9.62,-4.86 c 10.84,-2.08 15.56,-8.32 15.56,-8.32 l -30.78,-0.18 -15.21,13.19 20.81,0.17 z"
inkscape:connector-curvature="0" />
<rect
id="rect2453"
style="fill:#d0d0d2;stroke:#b3b7b7;stroke-width:2;stroke-linecap:round;stroke-linejoin:bevel"
rx="19.999001"
ry="21.165001"
height="384.84"
width="542.42999"
y="84.649002"
x="101.03" />
<rect
id="rect3225"
style="fill:#000000;stroke:#000000;stroke-width:1.00880003;stroke-linecap:round;stroke-linejoin:bevel"
rx="17"
ry="17"
height="376.78"
width="535.76001"
y="88.265999"
x="103.91" />
<rect
id="rect3227"
style="opacity:0.87064999;fill:url(#linearGradient3321)"
height="305.12"
width="480.82999"
y="113.93"
x="130.31" />
<path
id="path3229"
style="opacity:0.26368001;fill:url(#linearGradient3237);fill-rule:evenodd"
d="m 533.41,88.935 -198.8,364.08 303.8,1.02 c 0,0 0.98,-330.92 0.57,-345.69 C 638.55,92.876 632.01,89.321 618.5,89.151 604.3,88.972 533.41,88.93 533.41,88.93 Z"
inkscape:connector-curvature="0" />
<path
id="path3241"
style="opacity:0.16418002;fill:url(#radialGradient3257)"
d="m 372.25,100.72 a 3.47,3.29654 0 1 1 -6.94,0 3.47,3.29654 0 1 1 6.94,0 z"
transform="matrix(1.2563,0,0,1.2563,-94.56,-25.955)"
inkscape:connector-curvature="0" />
<rect
id="rect3279"
style="fill:url(#linearGradient3289);stroke:url(#linearGradient3415);stroke-width:0.9199;stroke-linecap:round;stroke-linejoin:bevel"
height="20.851999"
width="706.5"
y="447.98001"
x="18.601999" />
<path
id="path3379"
style="opacity:0.77612;fill:url(#linearGradient3471);fill-rule:evenodd"
d="m 18.57,469.25 15.782,0.35 16.658,4.21 13.576,6.66 -22.162,0.7 -11.741,-4.56 c -9.907,-2.8 -12.113,-7.36 -12.113,-7.36 z"
inkscape:connector-curvature="0" />
<path
id="rect3323"
style="opacity:0.87064999;fill:url(#linearGradient3339);stroke:#707575;stroke-width:0.94420999;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:0.51256002"
d="m 315.17,447.12 0,1.81 c 0,5.64 4.46,10.18 10,10.18 l 86.93,0 c 5.54,0 10,-4.54 10,-10.18 l 0,-1.81 -106.93,0 z"
inkscape:connector-curvature="0" />
<rect
id="rect3479"
style="opacity:0.86567;fill:#000000;stroke:#999c9c;stroke-linecap:round;stroke-linejoin:bevel"
height="2.6981001"
width="25.754999"
y="457.29999"
x="657.10999" />
<rect
id="rect3481"
style="fill:#595c5c"
height="0.83490002"
width="536.71002"
y="446.67001"
x="103.41" />
<text
id="text3485"
y="436.30844"
x="344.03226"
xml:space="preserve"
style="font-size:74.73600006px;font-family:Futura;opacity:0.56218998;fill:#000000"><tspan
id="tspan3487"
y="436.30844"
x="344.03226"
style="font-size:9.11419964px;font-family:'Lucida Grande';fill:#ffffff">MoonBook</tspan></text>
<rect
id="rect2453-1"
style="fill:#d0d0d2;stroke:#b3b7b7;stroke-width:2;stroke-linecap:round;stroke-linejoin:bevel"
rx="19.999001"
ry="21.165001"
height="384.84"
width="542.42999"
y="83.124794"
x="797.70752" />
<rect
id="rect3225-3"
style="fill:#000000;stroke:#000000;stroke-width:1.00880003;stroke-linecap:round;stroke-linejoin:bevel"
rx="17"
ry="17"
height="376.78"
width="535.76001"
y="86.741798"
x="800.58752" />
<rect
id="rect3227-6"
style="opacity:0.87064999;fill:none"
height="305.12"
width="480.82999"
y="112.4058"
x="826.98755" />
<path
id="path3229-3"
style="opacity:0.26368001;fill:url(#linearGradient3237-0);fill-rule:evenodd"
d="m 1230.0875,87.410787 -198.8,364.080003 303.8,1.02 c 0,0 0.98,-330.92 0.57,-345.69 -0.43,-15.469003 -6.97,-19.024003 -20.48,-19.194003 -14.2,-0.179 -85.09,-0.221 -85.09,-0.221 z"
inkscape:connector-curvature="0" />
<path
id="path3241-5"
style="opacity:0.16418002;fill:url(#radialGradient3257-3)"
d="m 1069.7752,99.055317 a 4.359365,4.141447 0 0 1 -8.7187,0 4.359365,4.141447 0 1 1 8.7187,0 z"
inkscape:connector-curvature="0" />
</g>
<metadata
id="metadata54">
<rdf:RDF>
<cc:Work>
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<cc:license
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
<dc:publisher>
<cc:Agent
rdf:about="http://openclipart.org/">
<dc:title>Openclipart</dc:title>
</cc:Agent>
</dc:publisher>
<dc:title></dc:title>
<dc:date>2011-09-06T14:48:13</dc:date>
<dc:description>Aluminum unibody laptop computer with glare screen.</dc:description>
<dc:source>https://openclipart.org/detail/159331/moonbook-laptop-by-dchest</dc:source>
<dc:creator>
<cc:Agent>
<dc:title>dchest</dc:title>
</cc:Agent>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>computer</rdf:li>
<rdf:li>laptop</rdf:li>
<rdf:li>mac</rdf:li>
<rdf:li>macbook</rdf:li>
<rdf:li>notebook</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

@ -1,557 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<!-- Made by Dmitry Chestnykh (http://www.codingrobots.com) on Feb 25, 2009 -->
<!-- Public Domain: feel free to do everything you want with this drawing -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2"
sodipodi:docname="unified.svg"
viewBox="0 0 1400 398.84"
version="1.0"
inkscape:version="0.91 r13725"
width="1400"
height="398.84">
<sodipodi:namedview
id="namedview59"
bordercolor="#666666"
inkscape:pageshadow="2"
guidetolerance="10"
pagecolor="#ffffff"
gridtolerance="10"
inkscape:window-maximized="0"
inkscape:zoom="0.3284502"
objecttolerance="10"
borderopacity="1"
inkscape:current-layer="layer1"
inkscape:cx="505.40679"
inkscape:cy="106.39877"
inkscape:window-y="0"
inkscape:window-x="0"
inkscape:window-width="1160"
showgrid="false"
inkscape:pageopacity="0"
inkscape:window-height="720" />
<defs
id="defs4">
<linearGradient
id="linearGradient3291">
<stop
id="stop3293"
style="stop-color:#676767"
offset="0" />
<stop
id="stop3299"
style="stop-color:#ffffff"
offset=".02" />
<stop
id="stop3297"
style="stop-color:#dfdfe1"
offset=".04" />
<stop
id="stop3303"
style="stop-color:#efeff0"
offset="0.96" />
<stop
id="stop3301"
style="stop-color:#ffffff"
offset="0.98" />
<stop
id="stop3295"
style="stop-color:#676767"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3231">
<stop
id="stop3233"
style="stop-color:#ffffff"
offset="0" />
<stop
id="stop3235"
style="stop-color:#000000;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3237"
y2="423.04001"
xlink:href="#linearGradient3231"
gradientUnits="userSpaceOnUse"
x2="656.59998"
gradientTransform="matrix(1.0092,0,0,1.0058,-9.9652,2.1515)"
y1="97.767998"
x1="525.28003" />
<radialGradient
id="radialGradient3257"
xlink:href="#linearGradient3231"
gradientUnits="userSpaceOnUse"
cy="101.43"
cx="368.78"
gradientTransform="matrix(1,0,0,0.95,0,5.0362)"
r="3.4688001" />
<linearGradient
id="linearGradient3289"
y2="438.17001"
xlink:href="#linearGradient3291"
gradientUnits="userSpaceOnUse"
x2="724.58002"
gradientTransform="matrix(1.0028,0,0,0.9632,-1.0442,36.361)"
y1="438.17001"
x1="19.122999" />
<linearGradient
id="linearGradient3321"
y2="267.47"
gradientUnits="userSpaceOnUse"
x2="611.14001"
gradientTransform="matrix(1,0,0,0.99361,0,0.72801)"
y1="267.47"
x1="130.31">
<stop
id="stop3315"
style="stop-color:#9c5da6"
offset="0" />
<stop
id="stop3317"
style="stop-color:#5b325b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3339"
y2="472.51999"
gradientUnits="userSpaceOnUse"
x2="359.07999"
gradientTransform="matrix(0.99992,0,0,1.0177,1.2423,-21.78)"
y1="465.67001"
x1="359.07999">
<stop
id="stop3335"
style="stop-color:#e5e6e8"
offset="0" />
<stop
id="stop3337"
style="stop-color:#4c5252"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3415"
y2="459.79999"
xlink:href="#linearGradient3291"
gradientUnits="userSpaceOnUse"
x2="725.56"
gradientTransform="matrix(1.0001,0,0,0.88472,-0.03056,51.617)"
y1="459.79999"
x1="18.142" />
<linearGradient
id="linearGradient3447"
y2="478.26999"
gradientUnits="userSpaceOnUse"
x2="695.5"
gradientTransform="matrix(1.0083,0,0,1,-3.098,-2.7751)"
y1="484.17001"
x1="700.01001">
<stop
id="stop3391"
style="stop-color:#000000"
offset="0" />
<stop
id="stop3393"
style="stop-color:#fbfcff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3453"
y2="485.26999"
gradientUnits="userSpaceOnUse"
x2="329.66"
gradientTransform="matrix(1.0127,0,0,1,-6.2255,-2.7751)"
y1="473.48999"
x1="329.66">
<stop
id="stop3372"
style="stop-color:#8f9091"
offset="0" />
<stop
id="stop3374"
style="stop-color:#323b3b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3466"
y2="485.04001"
gradientUnits="userSpaceOnUse"
x2="334.45001"
gradientTransform="matrix(1.0083,0,0,0.95399,-3.098,19.287)"
y1="470.29999"
x1="334.45001">
<stop
id="stop3356"
style="stop-color:#d3d5d7"
offset="0" />
<stop
id="stop3483"
style="stop-color:#86898a"
offset=".5" />
<stop
id="stop3358"
style="stop-color:#171b1b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3471"
y2="473.95001"
gradientUnits="userSpaceOnUse"
x2="43.948002"
gradientTransform="matrix(1.0578,0,0,1.0104,-4.9081,-7.6835)"
y1="479.5"
x1="38.150002">
<stop
id="stop3475"
style="stop-color:#000000;stop-opacity:.30348"
offset="0" />
<stop
id="stop3477"
style="stop-color:#fbfcff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3339-2"
y2="472.51999"
gradientUnits="userSpaceOnUse"
x2="359.07999"
gradientTransform="matrix(0.99992,0,0,1.0177,697.91983,-23.304213)"
y1="465.67001"
x1="359.07999">
<stop
id="stop3335-0"
style="stop-color:#e5e6e8"
offset="0" />
<stop
id="stop3337-1"
style="stop-color:#4c5252"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3471-1"
y2="473.95001"
gradientUnits="userSpaceOnUse"
x2="43.948002"
gradientTransform="matrix(1.0578,0,0,1.0104,691.76943,-9.2077128)"
y1="479.5"
x1="38.150002">
<stop
id="stop3475-6"
style="stop-color:#000000;stop-opacity:.30348"
offset="0" />
<stop
id="stop3477-8"
style="stop-color:#fbfcff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3289-9"
y2="438.17001"
xlink:href="#linearGradient3291"
gradientUnits="userSpaceOnUse"
x2="724.58002"
gradientTransform="matrix(1.0028,0,0,0.9632,695.63333,34.836787)"
y1="438.17001"
x1="19.122999" />
<linearGradient
id="linearGradient3415-2"
y2="459.79999"
xlink:href="#linearGradient3291"
gradientUnits="userSpaceOnUse"
x2="725.56"
gradientTransform="matrix(1.0001,0,0,0.88472,696.64703,50.092787)"
y1="459.79999"
x1="18.142" />
<radialGradient
id="radialGradient3257-3"
xlink:href="#linearGradient3231"
gradientUnits="userSpaceOnUse"
cy="101.43"
cx="368.78"
gradientTransform="matrix(1.2563,0,0,1.193485,602.11753,-21.152233)"
r="3.4688001" />
<linearGradient
id="linearGradient3237-0"
y2="423.04001"
xlink:href="#linearGradient3231"
gradientUnits="userSpaceOnUse"
x2="656.59998"
gradientTransform="matrix(1.0092,0,0,1.0058,686.71233,0.62728715)"
y1="97.767998"
x1="525.28003" />
<linearGradient
id="linearGradient3321-4"
y2="267.47"
gradientUnits="userSpaceOnUse"
x2="611.14001"
gradientTransform="matrix(1,0,0,0.99361,696.67753,-0.79620285)"
y1="267.47"
x1="130.31">
<stop
id="stop3315-8"
style="stop-color:#9c5da6"
offset="0" />
<stop
id="stop3317-9"
style="stop-color:#5b325b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3447-1"
y2="478.26999"
gradientUnits="userSpaceOnUse"
x2="695.5"
gradientTransform="matrix(1.0083,0,0,1,693.57953,-4.2993128)"
y1="484.17001"
x1="700.01001">
<stop
id="stop3391-4"
style="stop-color:#000000"
offset="0" />
<stop
id="stop3393-4"
style="stop-color:#fbfcff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3466-6"
y2="485.04001"
gradientUnits="userSpaceOnUse"
x2="334.45001"
gradientTransform="matrix(1.0083,0,0,0.95399,693.57953,17.762787)"
y1="470.29999"
x1="334.45001">
<stop
id="stop3356-4"
style="stop-color:#d3d5d7"
offset="0" />
<stop
id="stop3483-4"
style="stop-color:#86898a"
offset=".5" />
<stop
id="stop3358-6"
style="stop-color:#171b1b"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3453-6"
y2="485.26999"
gradientUnits="userSpaceOnUse"
x2="329.66"
gradientTransform="matrix(1.0127,0,0,1,690.45203,-4.2993128)"
y1="473.48999"
x1="329.66">
<stop
id="stop3372-5"
style="stop-color:#8f9091"
offset="0" />
<stop
id="stop3374-6"
style="stop-color:#323b3b"
offset="1" />
</linearGradient>
</defs>
<g
id="layer1"
transform="translate(-18.142,-83.649)">
<path
id="rect3343"
style="fill:url(#linearGradient3453)"
d="m 50.343,458.94 642.03,0 c 10.97,0 19.8,4.6 19.8,10.31 l 2.11,5.71 c -7.73,4.32 -10.94,7.53 -21.91,7.53 l -642.03,0 c -10.968,0 -22.769,-7.05 -25.49,-11.28 l 7.667,-1.23 c 0,-5.7 6.855,-11.04 17.826,-11.04 z"
inkscape:connector-curvature="0" />
<path
id="rect3341"
style="fill:url(#linearGradient3466)"
d="m 35.312,447.96 c -7.029,0 -13.166,2.66 -16.656,6.67 l 0,13.87 c 0,0.49 -0.03,0.97 -0.062,1.46 3.479,4.05 9.647,6.76 16.718,6.76 l 672.1,0 c 7.65,0 14.22,-3.18 17.5,-7.81 -0.22,-1.12 -0.35,-2.27 -0.35,-3.45 l 0,-10.23 c -3.38,-4.35 -9.78,-7.27 -17.15,-7.27 l -672.1,0 z"
inkscape:connector-curvature="0" />
<path
id="path3377"
style="opacity:0.28358017;fill:url(#linearGradient3447);fill-rule:evenodd"
d="m 699.43,482.26 9.62,-4.86 c 10.84,-2.08 15.56,-8.32 15.56,-8.32 l -30.78,-0.18 -15.21,13.19 20.81,0.17 z"
inkscape:connector-curvature="0" />
<rect
id="rect2453"
style="fill:#d0d0d2;stroke:#b3b7b7;stroke-width:2;stroke-linecap:round;stroke-linejoin:bevel"
rx="19.999001"
ry="21.165001"
height="384.84"
width="542.42999"
y="84.649002"
x="101.03" />
<rect
id="rect3225"
style="fill:#000000;stroke:#000000;stroke-width:1.00880003;stroke-linecap:round;stroke-linejoin:bevel"
rx="17"
ry="17"
height="376.78"
width="535.76001"
y="88.265999"
x="103.91" />
<rect
id="rect3227"
style="opacity:0.87064999;fill:url(#linearGradient3321)"
height="305.12"
width="480.82999"
y="113.93"
x="130.31" />
<path
id="path3229"
style="opacity:0.26368001;fill:url(#linearGradient3237);fill-rule:evenodd"
d="m 533.41,88.935 -198.8,364.08 303.8,1.02 c 0,0 0.98,-330.92 0.57,-345.69 C 638.55,92.876 632.01,89.321 618.5,89.151 604.3,88.972 533.41,88.93 533.41,88.93 Z"
inkscape:connector-curvature="0" />
<path
id="path3241"
style="opacity:0.16418002;fill:url(#radialGradient3257)"
d="m 372.25,100.72 a 3.47,3.29654 0 1 1 -6.94,0 3.47,3.29654 0 1 1 6.94,0 z"
transform="matrix(1.2563,0,0,1.2563,-94.56,-25.955)"
inkscape:connector-curvature="0" />
<rect
id="rect3279"
style="fill:url(#linearGradient3289);stroke:url(#linearGradient3415);stroke-width:0.9199;stroke-linecap:round;stroke-linejoin:bevel"
height="20.851999"
width="706.5"
y="447.98001"
x="18.601999" />
<path
id="path3379"
style="opacity:0.77612;fill:url(#linearGradient3471);fill-rule:evenodd"
d="m 18.57,469.25 15.782,0.35 16.658,4.21 13.576,6.66 -22.162,0.7 -11.741,-4.56 c -9.907,-2.8 -12.113,-7.36 -12.113,-7.36 z"
inkscape:connector-curvature="0" />
<path
id="rect3323"
style="opacity:0.87064999;fill:url(#linearGradient3339);stroke:#707575;stroke-width:0.94420999;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:0.51256002"
d="m 315.17,447.12 0,1.81 c 0,5.64 4.46,10.18 10,10.18 l 86.93,0 c 5.54,0 10,-4.54 10,-10.18 l 0,-1.81 -106.93,0 z"
inkscape:connector-curvature="0" />
<rect
id="rect3479"
style="opacity:0.86567;fill:#000000;stroke:#999c9c;stroke-linecap:round;stroke-linejoin:bevel"
height="2.6981001"
width="25.754999"
y="457.29999"
x="657.10999" />
<rect
id="rect3481"
style="fill:#595c5c"
height="0.83490002"
width="536.71002"
y="446.67001"
x="103.41" />
<text
id="text3485"
y="436.30844"
x="344.03226"
xml:space="preserve"
style="font-size:74.73600006px;font-family:Futura;opacity:0.56218998;fill:#000000"><tspan
id="tspan3487"
y="436.30844"
x="344.03226"
style="font-size:9.11419964px;font-family:'Lucida Grande';fill:#ffffff">MoonBook</tspan></text>
<rect
id="rect2453-1"
style="fill:#d0d0d2;stroke:#b3b7b7;stroke-width:2;stroke-linecap:round;stroke-linejoin:bevel"
rx="19.999001"
ry="21.165001"
height="384.84"
width="542.42999"
y="83.124794"
x="797.70752" />
<rect
id="rect3225-3"
style="fill:#000000;stroke:#000000;stroke-width:1.00880003;stroke-linecap:round;stroke-linejoin:bevel"
rx="17"
ry="17"
height="376.78"
width="535.76001"
y="86.741798"
x="800.58752" />
<rect
id="rect3227-6"
style="opacity:0.87064999;fill:url(#linearGradient3321-4)"
height="305.12"
width="480.82999"
y="112.4058"
x="826.98755" />
<path
id="path3229-3"
style="opacity:0.26368001;fill:url(#linearGradient3237-0);fill-rule:evenodd"
d="m 1230.0875,87.410787 -198.8,364.080003 303.8,1.02 c 0,0 0.98,-330.92 0.57,-345.69 -0.43,-15.469003 -6.97,-19.024003 -20.48,-19.194003 -14.2,-0.179 -85.09,-0.221 -85.09,-0.221 z"
inkscape:connector-curvature="0" />
<path
id="path3241-5"
style="opacity:0.16418002;fill:url(#radialGradient3257-3)"
d="m 1069.7752,99.055317 a 4.359365,4.141447 0 0 1 -8.7187,0 4.359365,4.141447 0 1 1 8.7187,0 z"
inkscape:connector-curvature="0" />
<rect
style="fill:#00aa80;fill-opacity:0.27979276"
id="rect3409"
width="295.32635"
height="143.09627"
x="237.35332"
y="196.29645" />
<rect
style="fill:#00aa80;fill-opacity:0.27843139"
id="rect3409-0"
width="295.32635"
height="143.09627"
x="920.86646"
y="200.86334" />
</g>
<metadata
id="metadata54">
<rdf:RDF>
<cc:Work>
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<cc:license
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
<dc:publisher>
<cc:Agent
rdf:about="http://openclipart.org/">
<dc:title>Openclipart</dc:title>
</cc:Agent>
</dc:publisher>
<dc:title />
<dc:date>2011-09-06T14:48:13</dc:date>
<dc:description>Aluminum unibody laptop computer with glare screen.</dc:description>
<dc:source>https://openclipart.org/detail/159331/moonbook-laptop-by-dchest</dc:source>
<dc:creator>
<cc:Agent>
<dc:title>dchest</dc:title>
</cc:Agent>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>computer</rdf:li>
<rdf:li>laptop</rdf:li>
<rdf:li>mac</rdf:li>
<rdf:li>macbook</rdf:li>
<rdf:li>notebook</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

@ -1,34 +0,0 @@
Info for developers
==============
lxqt-config-monitor has 3 important modules:
- Monitor (monitor.h and monitor.cpp)
- MonitorSettingsDialog (monitorsettingsdialog.h and monitorsettingsdialog.cpp)
- XRandR (xrandr.h and xrandr.cpp)
MonitorSettingsDialog module contains all code related to GUI.
XRandR module contains code related to get or set settings from XRandR X11 driver. XRandR doesn't need MonitorSettingsDialog to work.
Monitor module is a glue between MonitorSettingsDialog and XRandR.
Indeep, XRandR module can be replaced and other modules won't need changes. Example, Wayland or Mir can use other tool for monitor settings. Other module can be added to work with that tool.
Module XRandR
============
Contains an implementation of class Backend. This class has got two methods in order to get or set configs.
This is only a simple implementation. It reads info from a pipe to a xrandr command.
Module Monitor
============
Contains 4 classes:
- Backend: It is an abstract class. It has to be implemented by monitor drivers. In X11 this driver is XRandR
- MonitorInfo: This class contains all information about one monitor. It is obtained from Backend::getMonitorsInfo method.
- MonitorSettings: This class is used by Backend::setMonitorsSettings method. This class contains settings for one monitor.
- Monitor: This class is used by MonitorSettingsDialog in order to store monitor settings.

@ -0,0 +1,89 @@
/*
Copyright (C) 2015 P.L. Lucas <selairi@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "loadsettings.h"
#include <KScreen/Output>
#include <KScreen/Config>
#include <KScreen/GetConfigOperation>
#include <KScreen/SetConfigOperation>
#include <QJsonObject>
#include <QJsonArray>
#include <QSettings>
#include <QJsonDocument>
#include <KScreen/EDID>
LoadSettings::LoadSettings(QObject *parent):QObject(parent)
{
KScreen::GetConfigOperation *operation = new KScreen::GetConfigOperation();
connect(operation, &KScreen::GetConfigOperation::finished, [this, operation] (KScreen::ConfigOperation *op) {
KScreen::GetConfigOperation *configOp = qobject_cast<KScreen::GetConfigOperation *>(op);
if (configOp)
{
loadConfiguration(configOp->config());
operation->deleteLater();
}
});
}
void LoadSettings::loadConfiguration(KScreen::ConfigPtr config)
{
QSettings settings("LXQt", "lxqt-config-monitor");
QJsonDocument document = QJsonDocument::fromJson( settings.value("currentConfig").toByteArray() );
QJsonObject json = document.object();
QJsonArray array = json["outputs"].toArray();
KScreen::OutputList outputs = config->outputs();
for (const KScreen::OutputPtr &output : outputs)
{
qDebug() << "Output: " << output->name();
for(int i=0;i<array.size();i++)
{
QJsonObject monitorSettings = array[i].toObject();
if( monitorSettings["name"] == output->name() )
{
KScreen::Edid* edid = output->edid();
if (edid && edid->isValid())
if( monitorSettings["hash"].toString() != edid->hash() )
{
qDebug() << "Hash: " << monitorSettings["hash"].toString() << "==" << edid->hash();
return exit(1); // Saved settings are from other monitor
}
if( monitorSettings["connected"].toBool() != output->isConnected() )
return exit(2); // Saved settings are from other monitor
if( !output->isConnected() )
continue;
output->setEnabled( monitorSettings["enabled"].toBool() );
output->setPrimary( monitorSettings["primary"].toBool() );
output->setPos( QPoint(monitorSettings["xPos"].toInt(),monitorSettings["yPos"].toInt()) );
output->setCurrentModeId( monitorSettings["currentMode"].toString() );
output->setRotation( (KScreen::Output::Rotation)(monitorSettings["rotation"].toInt()) );
}
}
}
if (KScreen::Config::canBeApplied(config))
KScreen::SetConfigOperation(config).exec();
exit(0);
}

@ -1,5 +1,5 @@
/*
Copyright (C) 2014 P.L. Lucas <selairi@gmail.com>
Copyright (C) 2015 P.L. Lucas <selairi@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -16,21 +16,27 @@
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef _XRANDR_H_
#define _XRANDR_H_
#ifndef __LOADSETTINGS_H__
#define __LOADSETTINGS_H__
#include "monitor.h"
#include <QList>
#include <KScreen/GetConfigOperation>
#include <KScreen/SetConfigOperation>
class LoadSettings : public QObject
{
Q_OBJECT
class XRandRBackend: public MonitorSettingsBackend {
Q_OBJECT
public:
// Execute xrandr command and read its output
QList<MonitorInfo*> getMonitorsInfo();
// Set changes in xrandr
bool setMonitorsSettings(const QList<MonitorSettings*> monitors);
QString getCommand(const QList<MonitorSettings*> monitors);
LoadSettings(QObject *parent = 0);
private Q_SLOTS:
void loadConfiguration(KScreen::ConfigPtr config);
private:
// Configutarions
KScreen::ConfigPtr mConfig;
};
#endif
#endif // __LOADSETTINGS_H__

@ -16,60 +16,56 @@
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "main.h"
#include <LXQt/SingleApplication>
#include <LXQt/ConfigDialog>
#include <LXQt/Settings>
#include <QDebug>
#include <QProcess>
#include <QStandardPaths>
#include <QCommandLineParser>
#include "monitorsettingsdialog.h"
#include "quickoptions.h"
#include "xrandr.h"
#include "savesettings.h"
int main(int argc, char** argv) {
LXQt::SingleApplication app(argc, argv);
#include <QCoreApplication>
#include "loadsettings.h"
QByteArray configName = qgetenv("LXQT_SESSION_CONFIG");
if(configName.isEmpty())
configName = "MonitorSettings";
LXQt::Settings settings(configName);
LXQt::ConfigDialog dlg(QObject::tr("Monitor Settings"), &settings);
dlg.setButtons(QDialogButtonBox::QDialogButtonBox::Apply|QDialogButtonBox::Close);
app.setActivationWindow(&dlg);
dlg.setWindowIcon(QIcon::fromTheme("preferences-desktop-display"));
static bool loadSettingsOk(int argc, char** argv)
{
for(int i=0; i<argc; i++)
{
if(QString(argv[i]) == "-l")
return true;
}
return false;
}
XRandRBackend *xrandr = new XRandRBackend();
MonitorSettingsDialog *monitorSettingsDialog = new MonitorSettingsDialog(xrandr, &settings);
monitorSettingsDialog->connect(&dlg, SIGNAL(clicked(QDialogButtonBox::StandardButton)), SLOT(processClickedFromDialog(QDialogButtonBox::StandardButton)));
{
QList<MonitorInfo*> monitorsInfo = xrandr->getMonitorsInfo();
// If this is a laptop and there is an external monitor, offer quick options
if(monitorsInfo.length() == 2) {
QuickOptions *quickOptions = new QuickOptions();
monitorSettingsDialog->connect(quickOptions->ui.useBoth, SIGNAL(clicked(bool)), SLOT(onUseBoth()));
monitorSettingsDialog->connect(quickOptions->ui.externalOnly, SIGNAL(clicked(bool)), SLOT(onExternalOnly()));
monitorSettingsDialog->connect(quickOptions->ui.laptopOnly, SIGNAL(clicked(bool)), SLOT(onLaptopOnly()));
monitorSettingsDialog->connect(quickOptions->ui.extended, SIGNAL(clicked(bool)), SLOT(onExtended()));
dlg.addPage(quickOptions, QObject::tr("Quick Options"), "format-justify-left");
}
}
int main(int argc, char** argv)
{
if( loadSettingsOk(argc, argv) )
{
// If -l option is provided, settings are loaded and app is closed.
QCoreApplication app(argc, argv);
LoadSettings load;
return app.exec();
}
dlg.addPage(monitorSettingsDialog, QObject::tr("Settings"), "preferences-desktop-display");
LXQt::SingleApplication app(argc, argv);
SaveSettings *saveSettings = new SaveSettings(&settings);
saveSettings->setHardwareIdentifier(monitorSettingsDialog->getHardwareIdentifier());
// monitorSettingsDialog->connect(saveSettings->ui.saveSettings, SIGNAL(clicked(bool)), SLOT(saveSettingsSettings()));
monitorSettingsDialog->connect(saveSettings->ui.save, SIGNAL(clicked(bool)), SLOT(saveSettings()));
saveSettings->connect(monitorSettingsDialog, SIGNAL(settingsSaved()), SLOT(loadSettings()));
// Command line options
QCommandLineParser parser;
QCommandLineOption loadOption(QStringList() << "l" << "loadlast",
app.tr("Load last settings."));
parser.addOption(loadOption);
QCommandLineOption helpOption = parser.addHelpOption();
parser.addOption(loadOption);
parser.addOption(helpOption);
dlg.addPage(saveSettings, QObject::tr("Save settings"), "system-run");
//parser.process(app);
//bool loadLastSettings = parser.isSet(loadOption);
QObject::connect(&dlg, SIGNAL(reset()), &dlg, SLOT(accept()));
MonitorSettingsDialog dlg;
app.setActivationWindow(&dlg);
dlg.setWindowIcon(QIcon::fromTheme("preferences-desktop-display"));
dlg.show();
if(QDialog::Accepted == dlg.exec() ) {
main(argc, argv);
}
return app.exec();
return 0;
}

@ -1,123 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MonitorSettingsDialog</class>
<widget class="QDialog" name="MonitorSettingsDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>527</width>
<height>362</height>
</rect>
</property>
<property name="windowTitle">
<string>Monitor Settings</string>
</property>
<property name="windowIcon">
<iconset theme="preferences-desktop-display">
<normaloff/>
</iconset>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,1">
<item>
<widget class="QListWidget" name="monitorList">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
</widget>
</item>
<item>
<widget class="QStackedWidget" name="stackedWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>1</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QCheckBox" name="unify">
<property name="text">
<string>Unify all monitors</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="positionPushButton">
<property name="text">
<string>Monitor Position</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="primaryLabel">
<property name="text">
<string>Primary monitor:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="primaryCombo">
<item>
<property name="text">
<string/>
</property>
</item>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>monitorList</sender>
<signal>currentRowChanged(int)</signal>
<receiver>stackedWidget</receiver>
<slot>setCurrentIndex(int)</slot>
<hints>
<hint type="sourcelabel">
<x>146</x>
<y>146</y>
</hint>
<hint type="destinationlabel">
<x>394</x>
<y>146</y>
</hint>
</hints>
</connection>
</connections>
</ui>

@ -17,55 +17,57 @@
*/
#include "monitor.h"
#include <QDebug>
bool MonitorInfo::LVDS_Ok = false;
bool MonitorSettingsBackend::isUnified(const QList< MonitorInfo* > monitors) {
Q_FOREACH(MonitorInfo * monitor, monitors) {
if(monitor->position != MonitorSettings::None)
return false;
}
return true;
QSize sizeFromString(QString str)
{
int width = 0;
int height = 0;
int x = str.indexOf('x');
if (x > 0)
{
width = str.left(x).toInt();
height = str.mid(x + 1).toInt();
}
return QSize(width, height);
}
MonitorSettings::MonitorSettings(QObject* parent): QObject(parent) {
position = None;
primaryOk = false;
enabledOk = false;
MonitorSettings::MonitorSettings(QObject* parent) :
QObject(parent)
{
position = None;
primaryOk = false;
enabledOk = false;
}
MonitorInfo::MonitorInfo(QObject* parent): MonitorSettings(parent) {
MonitorInfo::MonitorInfo(QObject* parent) :
MonitorSettings(parent)
{
}
QString MonitorInfo::humanReadableName() {
if(name.startsWith("LVDS"))
return tr("Laptop LCD Monitor");
else if(name.startsWith("VGA") || name.startsWith("Analog"))
return LVDS_Ok ? tr("External VGA Monitor") : tr("VGA Monitor");
else if(name.startsWith("DVI") || name.startsWith("TMDS") || name.startsWith("Digital") || name.startsWith("LVDS"))
return LVDS_Ok ? tr("External DVI Monitor") : tr("DVI Monitor");
else if(name.startsWith("TV") || name.startsWith("S-Video"))
return tr("TV");
else if(name == "default")
return tr("Default Monitor");
return name;
}
QString MonitorInfo::humanReadableName()
{
if (name.startsWith("LVDS"))
return tr("Laptop LCD Monitor");
else if (name.startsWith("VGA") || name.startsWith("Analog"))
return LVDS_Ok ? tr("External VGA Monitor") : tr("VGA Monitor");
else if (name.startsWith("DVI") || name.startsWith("TMDS") || name.startsWith("Digital") || name.startsWith("LVDS"))
return LVDS_Ok ? tr("External DVI Monitor") : tr("DVI Monitor");
else if (name.startsWith("TV") || name.startsWith("S-Video"))
return tr("TV");
else if (name == "default")
return tr("Default Monitor");
return name;
}
MonitorMode::MonitorMode(QString modeName, QObject *parent):QObject(parent) {
mode = modeName;
width = -1;
height = -1;
QSize MonitorSettings::currentSize()
{
return sizeFromString(currentMode);
}
QSize sizeFromString(QString str) {
int width = 0;
int height = 0;
int x = str.indexOf('x');
if(x > 0) {
width = str.left(x).toInt();
height = str.mid(x + 1).toInt();
}
return QSize(width, height);
QRect MonitorSettings::geometry()
{
return QRect(QPoint(xPos, yPos), currentSize());
}

@ -16,7 +16,6 @@
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef _MONITOR_H_
#define _MONITOR_H_
@ -25,69 +24,51 @@
#include <QHash>
#include <QList>
#include <QRect>
#include <KScreen/Config>
//Settings to pass to backend
class MonitorSettings: public QObject {
Q_OBJECT
public:
MonitorSettings(QObject* parent = 0);
QString name;
QString currentMode;
QString currentRate;
QString gamma;
QString brightness;
QString backlight;
QString backlightMin;
QString backlightMax;
int xPos;
int yPos;
bool enabledOk;
enum Position {None = 0, Manual};
Position position;
bool primaryOk;
};
class MonitorSettings : public QObject
{
Q_OBJECT
// Monitor mode and suported rates
class MonitorMode: public QObject {
Q_OBJECT
public:
MonitorMode(QString modeName, QObject *parent = 0);
QString mode;
QStringList modeLines;
int width;
int height;
MonitorSettings(QObject* parent = 0);
QString name;
QString currentMode;
QString currentRate;
QString gamma;
int xPos;
int yPos;
bool enabledOk;
enum Position {None = 0, Manual};
Position position;
bool primaryOk;
QSize currentSize();
QRect geometry();
};
// Monitor information from backend
class MonitorInfo: public MonitorSettings {
Q_OBJECT
public:
MonitorInfo(QObject* parent = 0);
QStringList modes; // Modes of this monitor in order
QHash <QString, MonitorMode*> monitorModes; // Rates suported by each mode
QString preferredMode;
QString preferredRate;
QString edid; // EDID data, not used yet, can be used to detect vendor name of the monitor
QString vendor;
static bool LVDS_Ok; // Is true if LVDS (Laptop monitor) is connected.
QString humanReadableName();
};
class MonitorInfo : public MonitorSettings
{
Q_OBJECT
class MonitorSettingsBackend: public QObject {
Q_OBJECT
public:
virtual QList<MonitorInfo*> getMonitorsInfo() = 0;
virtual bool setMonitorsSettings(const QList<MonitorSettings*> monitors) = 0;
virtual QString getCommand(const QList<MonitorSettings*> monitors) = 0;
virtual bool isUnified(const QList<MonitorInfo*> monitors);
KScreen::ConfigPtr mConfig;
MonitorInfo(QObject* parent = 0);
QStringList modes; // Modes of this monitor in order
QHash<QString, QStringList> modeLines; // Rates suported by each mode
QString preferredMode;
QString preferredRate;
QString edid; // EDID data, not used yet, can be used to detect vendor name of the monitor
QString vendor;
static bool LVDS_Ok; // Is true if LVDS (Laptop monitor) is connected.
QString humanReadableName();
};
/**Gets size from string rate. String rate format is "widthxheight". Example: 800x600*/
// Gets size from string rate. String rate format is "widthxheight". Example: 800x600
QSize sizeFromString(QString str);
#endif // _MONITOR_H_

@ -1,11 +1,20 @@
/*
* Copyright (c) LXQt contributors.
*
* This file is part of the LXQt project. <http://lxqt.org>
* It is distributed under the LGPL 2.1 or later license.
* Please refer to the LICENSE file for a copy of the license, and
* the AUTHORS file for copyright and authorship information.
*/
* Copyright (C) 2014 P.L. Lucas <selairi@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "monitorpicture.h"
@ -16,250 +25,361 @@
#include <QVector2D>
#include "configure.h"
MonitorPictureDialog::MonitorPictureDialog(QWidget * parent, Qt::WindowFlags f): QDialog(parent,f) {
ui.setupUi(this);
MonitorPictureProxy::MonitorPictureProxy(QObject *parent, MonitorPicture *monitorPicture):QObject(parent)
{
this->monitorPicture = monitorPicture;
}
void MonitorPictureProxy::updateSize()
{
KScreen::OutputPtr output = monitorPicture->monitorWidget->output;
QSize size = output->currentMode()->size();
monitorPicture->updateSize(size);
}
void MonitorPictureDialog::setScene(QList<MonitorWidget*> monitors) {
int monitorsWidth = 100.0;
int monitorsHeight = 100.0;
QGraphicsScene *scene = new QGraphicsScene();
Q_FOREACH(MonitorWidget * monitor, monitors) {
MonitorPicture *monitorPicture = new MonitorPicture(NULL, monitor, this);
pictures.append(monitorPicture);
scene->addItem(monitorPicture);
monitorsWidth+=monitorPicture->rect().width();
monitorsHeight+=monitorPicture->rect().height();
}
ui.graphicsView->scale(200.0/(float)monitorsWidth,200.0/(float)monitorsHeight);
ui.graphicsView->setScene(scene);
void MonitorPictureProxy::updatePosition()
{
KScreen::OutputPtr output = monitorPicture->monitorWidget->output;
QPoint pos = output->pos();
//qDebug() << "MonitorPictureProxy:updatePosition]" << pos;
monitorPicture->setMonitorPosition(pos.x(), pos.y());
}
void MonitorPictureDialog::updateScene() {
ui.graphicsView->scene()->update();
MonitorPictureDialog::MonitorPictureDialog(KScreen::ConfigPtr config, QWidget * parent, Qt::WindowFlags f) :
QDialog(parent,f)
{
updatingOk = false;
mConfig = config;
ui.setupUi(this);
}
void MonitorPictureDialog::updateMonitorWidgets(QString primaryMonitor) {
int x0, y0;
x0 = y0 =0;
Q_FOREACH(MonitorPicture * picture, pictures) {
if( picture->monitorWidget->monitorInfo->name == primaryMonitor || primaryMonitor=="") {
x0 = picture->monitorWidget->ui.xPosSpinBox->value() + picture->pos().x();
y0 = picture->monitorWidget->ui.yPosSpinBox->value() + picture->pos().y();
break;
void MonitorPictureDialog::setScene(QList<MonitorWidget *> monitors)
{
int monitorsWidth =0;
int monitorsHeight = 0;
QGraphicsScene *scene = new QGraphicsScene();
for (MonitorWidget *monitor : monitors)
{
MonitorPicture *monitorPicture = new MonitorPicture(nullptr, monitor, this);
pictures.append(monitorPicture);
scene->addItem(monitorPicture);
monitorsWidth += monitorPicture->rect().width();
monitorsHeight += monitorPicture->rect().height();
MonitorPictureProxy *proxy = new MonitorPictureProxy(this, monitorPicture);
proxy->connect(monitor->output.data(), SIGNAL(currentModeIdChanged()), SLOT(updateSize()));
proxy->connect(monitor->output.data(), SIGNAL(posChanged()), SLOT(updatePosition()));
}
}
Q_FOREACH(MonitorPicture * picture, pictures) {
int x = -x0 + picture->monitorWidget->ui.xPosSpinBox->value();
int y = -y0 + picture->monitorWidget->ui.yPosSpinBox->value();
picture->monitorWidget->ui.xPosSpinBox->setValue(x + picture->pos().x());
picture->monitorWidget->ui.yPosSpinBox->setValue(y + picture->pos().y());
}
// The blue rectangle is maximum size of virtual screen (framebuffer)
scene->addRect(0, 0, mConfig->screen()->maxSize().width(), mConfig->screen()->maxSize().height(), QPen(Qt::blue, 20))->setOpacity(0.5);
int minWidgetLength = qMin(ui.graphicsView->size().width(), ui.graphicsView->size().width()) / 1.5;
int maxMonitorSize = qMax(monitorsWidth, monitorsHeight);
ui.graphicsView->scale(minWidgetLength / (float) maxMonitorSize, minWidgetLength / (float) maxMonitorSize);
ui.graphicsView->setScene(scene);
}
void MonitorPictureDialog::updateScene()
{
ui.graphicsView->scene()->update();
}
MonitorPicture::MonitorPicture(QGraphicsItem * parent, MonitorWidget *monitorWidget, MonitorPictureDialog *monitorPictureDialog):QGraphicsRectItem(parent)
void MonitorPictureDialog::updateMonitorWidgets(QString primaryMonitor)
{
this->monitorWidget = monitorWidget;
this->monitorPictureDialog = monitorPictureDialog;
//QString modeName = monitorWidget->ui.resolutionCombo->currentText();
//int currentSizeWidth = monitorWidget->monitorInfo->monitorModes[modeName]->width;
//int currentSizeHeight = monitorWidget->monitorInfo->monitorModes[modeName]->height;
MonitorMode *monitorModeInfo = monitorWidget->ui.resolutionCombo->currentData().value<MonitorMode*>();
int currentSizeWidth = monitorModeInfo->width;
int currentSizeHeight = monitorModeInfo->height;
int x = monitorWidget->ui.xPosSpinBox->value();
int y = monitorWidget->ui.yPosSpinBox->value();
setAcceptedMouseButtons(Qt::LeftButton);
setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemSendsGeometryChanges);
setRect(x, y, currentSizeWidth, currentSizeHeight);
originX = x;
originY = y;
QSvgRenderer *renderer = new QSvgRenderer(QLatin1String(ICON_PATH "monitor.svg"));
svgItem = new QGraphicsSvgItem();
svgItem->setSharedRenderer(renderer);
svgItem->setX(x);
svgItem->setY(y);
svgItem->setOpacity(0.7);
svgItem->setParentItem(this);
textItem = new QGraphicsTextItem(monitorWidget->monitorInfo->name, this);
textItem->setDefaultTextColor(Qt::white);
textItem->setX(x);
textItem->setY(y);
textItem->setParentItem(this);
setPen(QPen(Qt::black, 20));
adjustNameSize();
// This method update spin boxes of position.
// If position is changed when this method is running, position is changed until buffer overflow.
// updatingOk control that this method can not be run twice in the same position change.
if(updatingOk)
return;
updatingOk = true;
int x0, y0;
x0 = y0 = 0;
for (MonitorPicture *picture : pictures)
{
if (picture->monitorWidget->output->name() == primaryMonitor
|| primaryMonitor == QStringLiteral(""))
{
x0 = picture->originX + picture->pos().x();
y0 = picture->originY + picture->pos().y();
break;
}
}
if( primaryMonitor == QStringLiteral("") )
{
for(MonitorPicture *picture: pictures)
{
int x1 = picture->originX + picture->pos().x();
int y1 = picture->originY + picture->pos().y();
x0 = qMin(x0, x1);
y0 = qMin(y0, y1);
}
}
for (MonitorPicture *picture : pictures)
{
int x = picture->originX + picture->pos().x() - x0;
int y = picture->originY + picture->pos().y() - y0;
if( x != picture->monitorWidget->ui.xPosSpinBox->value() )
picture->monitorWidget->ui.xPosSpinBox->setValue(x);
//else
// qDebug() << "x Iguales";
if( y != picture->monitorWidget->ui.yPosSpinBox->value() )
picture->monitorWidget->ui.yPosSpinBox->setValue(y);
//else
// qDebug() << "y Iguales";
//qDebug() << "[MonitorPictureDialog::updateMonitorWidgets]" << x << '=' << picture->monitorWidget->ui.xPosSpinBox->value() << ',' << y << '=' << picture->monitorWidget->ui.yPosSpinBox->value();
}
updatingOk = false;
}
MonitorPicture::MonitorPicture(QGraphicsItem * parent,
MonitorWidget *monitorWidget,
MonitorPictureDialog *monitorPictureDialog) :
QGraphicsRectItem(parent)
{
this->monitorWidget = monitorWidget;
this->monitorPictureDialog = monitorPictureDialog;
QSize currentSize = sizeFromString(monitorWidget->ui.resolutionCombo->currentText());
if( monitorWidget->output->rotation() == KScreen::Output::Left || monitorWidget->output->rotation() == KScreen::Output::Right )
currentSize.transpose();
int x = monitorWidget->ui.xPosSpinBox->value();
int y = monitorWidget->ui.yPosSpinBox->value();
setAcceptedMouseButtons(Qt::LeftButton);
setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemSendsGeometryChanges);
originX = x;
originY = y;
setRect(x, y, currentSize.width(), currentSize.height());
// setPen(QPen(Qt::black, 20));
// textItem = new QGraphicsTextItem(monitorWidget->output->name(), this);
// textItem->setX(x);
// textItem->setY(y);
// textItem->setParentItem(this);
QSvgRenderer *renderer = new QSvgRenderer(QLatin1String(ICON_PATH "monitor.svg"));
svgItem = new QGraphicsSvgItem();
svgItem->setSharedRenderer(renderer);
svgItem->setX(x);
svgItem->setY(y);
svgItem->setOpacity(0.7);
svgItem->setParentItem(this);
textItem = new QGraphicsTextItem(monitorWidget->output->name(), this);
textItem->setDefaultTextColor(Qt::white);
textItem->setX(x);
textItem->setY(y);
textItem->setParentItem(this);
setPen(QPen(Qt::black, 20));
adjustNameSize();
}
void MonitorPicture::adjustNameSize() {
prepareGeometryChange();
qreal fontWidth = QFontMetrics(textItem->font()).width(monitorWidget->monitorInfo->name+" ");
textItem->setScale((qreal)this->rect().width()/fontWidth);
QTransform transform;
qreal width = qAbs(this->rect().width()/svgItem->boundingRect().width());
qreal height = qAbs(this->rect().height()/svgItem->boundingRect().height());
transform.scale(width, height);
svgItem->setTransform(transform);
void MonitorPicture::adjustNameSize()
{
prepareGeometryChange();
qreal fontWidth = QFontMetrics(textItem->font()).width(monitorWidget->output->name() + QStringLiteral(" "));
textItem->setScale((qreal) this->rect().width() / fontWidth);
QTransform transform;
qreal width = qAbs(this->rect().width()/svgItem->boundingRect().width());
qreal height = qAbs(this->rect().height()/svgItem->boundingRect().height());
qDebug() << "Width x Height" << width << "x" << height;
transform.scale(width, height);
svgItem->setTransform(transform);
}
void MonitorPicture::updateSize(QSize currentSize)
{
QRectF r = rect();
r.setSize(currentSize);
setRect(r);
adjustNameSize();
}
QVariant MonitorPicture::itemChange(GraphicsItemChange change, const QVariant & value)
{
//qDebug() << "[MonitorPicture::itemChange]: ";
//if ( change == ItemPositionChange && scene()) {
// value is the new position.
//QPointF newPos = value.toPointF();
//qDebug() << "[MonitorPictureDialog::updateMonitorWidgets]: " << newPos.x() << "x" << newPos.y();
//}
return QGraphicsItem::itemChange(change, value);
//qDebug() << "[MonitorPicture::itemChange]: ";
//if ( change == ItemPositionChange && scene()) {
// value is the new position.
//QPointF newPos = value.toPointF();
//qDebug() << "[MonitorPictureDialog::updateMonitorWidgets]: " << newPos.x() << "x" << newPos.y();
//}
QVariant v = QGraphicsItem::itemChange(change, value);
//monitorPictureDialog->updateMonitorWidgets(QString());
return v;
}
void MonitorPicture::setMonitorPosition(int x, int y)
{
setPos(x,y);
setX( x - originX );
setY( y - originY );
}
void MonitorPicture::mouseReleaseEvent(QGraphicsSceneMouseEvent * event)
{
QGraphicsRectItem::mouseReleaseEvent(event);
monitorPictureDialog->moveMonitorPictureToNearest(this);
QGraphicsRectItem::mouseReleaseEvent(event);
monitorPictureDialog->moveMonitorPictureToNearest(this);
monitorPictureDialog->updateMonitorWidgets(QString());
}
//////////////////////////////////////////////////////////////////////////////////
// Move picture to nearest picture procedure.
// Read magnetic_attraction.html for more info about the algorithm used.
//////////////////////////////////////////////////////////////////////////////////
struct Parameters {
float t1, t2;
QVector2D cutPoint;
float t1, t2;
QVector2D cutPoint;
};
static Parameters segmentsCut(QVector2D p0, QVector2D p1, QVector2D s0, QVector2D s1)
{
Parameters result;
QVector2D v0 = p1 - p0;
QVector2D v1 = s1 - s0;
QVector2D P = s0 - p0;
float det = v0.y()*v1.x() - v0.x()*v1.y();
if( det == 0.0 ) {
result.t1 = result.t2 = -1.0;
}
result.t1 = 1/det * ( -v1.y()*P.x() + v1.x()*P.y() );
result.t2 = 1/det * ( -v0.y()*P.x() + v0.x()*P.y() );
result.cutPoint = v0*result.t1 + p0;
return result;
Parameters result;
QVector2D v0 = p1 - p0;
QVector2D v1 = s1 - s0;
QVector2D P = s0 - p0;
float det = v0.y() * v1.x() - v0.x() * v1.y();
if (det == 0.0)
result.t1 = result.t2 = -1.0;
result.t1 = 1 / det * (-v1.y() * P.x() + v1.x() * P.y());
result.t2 = 1 / det * (-v0.y() * P.x() + v0.x() * P.y());
result.cutPoint = v0 * result.t1 + p0;
return result;
}
static QVector2D computeCenter(MonitorPicture* monitorPicture)
{
float x0 = monitorPicture->x() + monitorPicture->originX;
float y0 = monitorPicture->y() + monitorPicture->originY;
float x1 = x0 + monitorPicture->rect().width();
float y1 = y0 + monitorPicture->rect().height();
QVector2D p0(x0,y0);
QVector2D p1(x1,y1);
QVector2D center = p0 + (p1-p0)*0.5;
return center;
float x0 = monitorPicture->x() + monitorPicture->originX;
float y0 = monitorPicture->y() + monitorPicture->originY;
float x1 = x0 + monitorPicture->rect().width();
float y1 = y0 + monitorPicture->rect().height();
QVector2D p0(x0, y0);
QVector2D p1(x1, y1);
QVector2D center = p0 + (p1 - p0) * 0.5;
return center;
}
struct Result_moveMonitorPictureToNearest
{
bool ok;
QVector2D vector;
bool ok;
QVector2D vector;
};
static Result_moveMonitorPictureToNearest compareTwoMonitors(MonitorPicture* monitorPicture1, MonitorPicture* monitorPicture2)
static Result_moveMonitorPictureToNearest compareTwoMonitors(MonitorPicture* monitorPicture1,
MonitorPicture* monitorPicture2)
{
Result_moveMonitorPictureToNearest result;
QVector2D center1 = computeCenter(monitorPicture1);
QVector2D center2 = computeCenter(monitorPicture2);
float x0 = monitorPicture2->x() + monitorPicture2->originX;
float y0 = monitorPicture2->y() + monitorPicture2->originY;
float x1 = x0 + monitorPicture2->rect().width();
float y1 = y0 + monitorPicture2->rect().height();
QVector2D p0(x0,y0);
QVector2D p1(x1,y1);
QVector2D P1, P2;
float t1=-1.0, t2=-1.0;
Parameters params = segmentsCut(center1, center2, QVector2D(x0,y0), QVector2D(x1,y0));
if(params.t1>=0.0 && params.t1<=1.0 && params.t2>=0.0 && params.t2<=1.0) {
if(t1<0) {t1 = params.t1; P1 = params.cutPoint;}
}
params = segmentsCut(center1, center2, QVector2D(x0,y0), QVector2D(x0,y1));
if(params.t1>=0.0 && params.t1<=1.0 && params.t2>=0.0 && params.t2<=1.0) {
if(t1<0) {t1 = params.t1; P1 = params.cutPoint;}
}
params = segmentsCut(center1, center2, QVector2D(x1,y1), QVector2D(x1,y0));
if(params.t1>=0.0 && params.t1<=1.0 && params.t2>=0.0 && params.t2<=1.0) {
if(t1<0) {t1 = params.t1; P1 = params.cutPoint;}
}
params = segmentsCut(center1, center2, QVector2D(x1,y1), QVector2D(x0,y1));
if(params.t1>=0.0 && params.t1<=1.0 && params.t2>=0.0 && params.t2<=1.0) {
if(t1<0) {t1 = params.t1; P1 = params.cutPoint;}
}
x0 = monitorPicture1->x() + monitorPicture1->originX;
y0 = monitorPicture1->y() + monitorPicture1->originY;
x1 = x0 + monitorPicture1->rect().width();
y1 = y0 + monitorPicture1->rect().height();
p0 = QVector2D(x0,y0);
p1 = QVector2D(x1,y1);
params = segmentsCut(center1, center2, QVector2D(x0,y0), QVector2D(x1,y0));
if(params.t1>=0.0 && params.t1<=1.0 && params.t2>=0.0 && params.t2<=1.0) {
if(t2<0) {t2 = params.t1; P2 = params.cutPoint;}
}
params = segmentsCut(center1, center2, QVector2D(x0,y0), QVector2D(x0,y1));
if(params.t1>=0.0 && params.t1<=1.0 && params.t2>=0.0 && params.t2<=1.0) {
if(t2<0) {t2 = params.t1; P2 = params.cutPoint;}
}
params = segmentsCut(center1, center2, QVector2D(x1,y1), QVector2D(x1,y0));
if(params.t1>=0.0 && params.t1<=1.0 && params.t2>=0.0 && params.t2<=1.0) {
if(t2<0) {t2 = params.t1; P2 = params.cutPoint;}
}
params = segmentsCut(center1, center2, QVector2D(x1,y1), QVector2D(x0,y1));
if(params.t1>=0.0 && params.t1<=1.0 && params.t2>=0.0 && params.t2<=1.0) {
if(t2<0) {t2 = params.t1; P2 = params.cutPoint;}
}
if(t1>t2) { //Monitor outside
result.vector = P1-P2;
result.ok = false;
} else {
result.ok = true;
}
return result;
Result_moveMonitorPictureToNearest result;
QVector2D center1 = computeCenter(monitorPicture1);
QVector2D center2 = computeCenter(monitorPicture2);
float x0 = monitorPicture2->x() + monitorPicture2->originX;
float y0 = monitorPicture2->y() + monitorPicture2->originY;
float x1 = x0 + monitorPicture2->rect().width();
float y1 = y0 + monitorPicture2->rect().height();
QVector2D p0(x0, y0);
QVector2D p1(x1, y1);
QVector2D P1, P2;
float t1 = -1.0, t2 = -1.0;
Parameters params = segmentsCut(center1, center2, QVector2D(x0, y0), QVector2D(x1, y0));
if (params.t1 >= 0.0 && params.t1 <= 1.0 && params.t2 >= 0.0 && params.t2 <= 1.0 && t1 < 0)
{
t1 = params.t1;
P1 = params.cutPoint;
}
params = segmentsCut(center1, center2, QVector2D(x0, y0), QVector2D(x0, y1));
if (params.t1 >= 0.0 && params.t1 <= 1.0 && params.t2 >= 0.0 && params.t2 <= 1.0 && t1 < 0)
{
t1 = params.t1;
P1 = params.cutPoint;
}
params = segmentsCut(center1, center2, QVector2D(x1, y1), QVector2D(x1, y0));
if (params.t1 >= 0.0 && params.t1 <= 1.0 && params.t2 >= 0.0 && params.t2 <= 1.0 && t1 < 0)
{
t1 = params.t1;
P1 = params.cutPoint;
}
params = segmentsCut(center1, center2, QVector2D(x1, y1), QVector2D(x0, y1));
if (params.t1 >= 0.0 && params.t1 <= 1.0 && params.t2 >= 0.0 && params.t2 <= 1.0 && t1 < 0)
{
t1 = params.t1;
P1 = params.cutPoint;
}
x0 = monitorPicture1->x() + monitorPicture1->originX;
y0 = monitorPicture1->y() + monitorPicture1->originY;
x1 = x0 + monitorPicture1->rect().width();
y1 = y0 + monitorPicture1->rect().height();
p0 = QVector2D(x0, y0);
p1 = QVector2D(x1, y1);
params = segmentsCut(center1, center2, QVector2D(x0, y0), QVector2D(x1, y0));
if (params.t1 >= 0.0 && params.t1 <= 1.0 && params.t2 >= 0.0 && params.t2 <= 1.0 && t2 < 0)
{
t2 = params.t1;
P2 = params.cutPoint;
}
params = segmentsCut(center1, center2, QVector2D(x0, y0), QVector2D(x0, y1));
if (params.t1 >= 0.0 && params.t1 <= 1.0 && params.t2 >= 0.0 && params.t2 <= 1.0 && t2 < 0)
{
t2 = params.t1;
P2 = params.cutPoint;
}
params = segmentsCut(center1, center2, QVector2D(x1, y1), QVector2D(x1, y0));
if (params.t1 >= 0.0 && params.t1 <= 1.0 && params.t2 >= 0.0 && params.t2 <= 1.0 && t2 < 0)
{
t2 = params.t1;
P2 = params.cutPoint;
}
params = segmentsCut(center1, center2, QVector2D(x1, y1), QVector2D(x0, y1));
if (params.t1 >= 0.0 && params.t1 <= 1.0 && params.t2 >= 0.0 && params.t2 <= 1.0 && t2 < 0)
{
t2 = params.t1;
P2 = params.cutPoint;
}
// Monitor outside
if (t1 > t2)
{
result.vector = P1 - P2;
result.ok = false;
} else
result.ok = true;
return result;
}
void MonitorPictureDialog::moveMonitorPictureToNearest(MonitorPicture* monitorPicture)
{
if(!ui.magneticCheckBox->isChecked())
return;
QVector2D vector(0,0);
foreach(MonitorPicture* picture, pictures) {
if(picture==monitorPicture) continue;
Result_moveMonitorPictureToNearest result = compareTwoMonitors(monitorPicture, picture);
if(result.ok) {
return;
} else {
if(result.vector.length()<vector.length() || vector.length()==0.0)
vector = result.vector;
if (!ui.magneticCheckBox->isChecked())
return;
QVector2D vector(0, 0);
for (MonitorPicture *picture : pictures)
{
if (picture == monitorPicture)
continue;
Result_moveMonitorPictureToNearest result = compareTwoMonitors(monitorPicture, picture);
if (result.ok)
return;
else if (result.vector.length() < vector.length() || vector.length() == 0.0)
vector = result.vector;
}
}
int x = monitorPicture->x();
int y = monitorPicture->y();
monitorPicture->setX( x + vector.x() );
monitorPicture->setY( y + vector.y() );
int x = monitorPicture->x();
int y = monitorPicture->y();
monitorPicture->setX(x + vector.x());
monitorPicture->setY(y + vector.y());
}

@ -16,53 +16,75 @@
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef _MONITORPICTURE_H_
#define _MONITORPICTURE_H_
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QGraphicsTextItem>
#include <QDialog>
#include <QGraphicsSvgItem>
#include <QSvgRenderer>
#include <QGraphicsSvgItem>
#include <QDialog>
#include "monitor.h"
#include "ui_monitorpicture.h"
#include "monitorwidget.h"
class MonitorPicture;
class MonitorPictureDialog: public QDialog {
Q_OBJECT
class MonitorPictureDialog : public QDialog
{
Q_OBJECT
public:
MonitorPictureDialog(QWidget * parent = 0, Qt::WindowFlags f = 0);
void setScene(QList<MonitorWidget*> monitors);
void updateMonitorWidgets(QString primaryMonitor);
void moveMonitorPictureToNearest(MonitorPicture* monitorPicture);
void updateScene();
MonitorPictureDialog(KScreen::ConfigPtr config, QWidget * parent = 0, Qt::WindowFlags f = 0);
void setScene(QList<MonitorWidget*> monitors);
void updateMonitorWidgets(QString primaryMonitor);
void moveMonitorPictureToNearest(MonitorPicture* monitorPicture);
void updateScene();
private:
Ui::MonitorPictureDialog ui;
QList<MonitorPicture*> pictures;
Ui::MonitorPictureDialog ui;
QList<MonitorPicture*> pictures;
bool updatingOk;
KScreen::ConfigPtr mConfig;
};
class MonitorPicture : public QGraphicsRectItem
{
public:
MonitorPicture(QGraphicsItem *parent,
MonitorWidget *monitorWidget,
MonitorPictureDialog *monitorPictureDialog);
void setMonitorPosition(int x, int y);
void adjustNameSize();
class MonitorPicture: public QGraphicsRectItem {
MonitorWidget *monitorWidget;
int originX, originY;
public:
MonitorPicture(QGraphicsItem * parent, MonitorWidget *monitorWidget, MonitorPictureDialog *monitorPictureDialog);
void setMonitorPosition(int x, int y);
void adjustNameSize();
void updateSize(QSize size);
MonitorWidget *monitorWidget;
int originX, originY;
private:
QGraphicsTextItem *textItem;
QGraphicsSvgItem *svgItem;
MonitorPictureDialog *monitorPictureDialog;
QGraphicsTextItem *textItem;
QGraphicsSvgItem *svgItem;
MonitorPictureDialog *monitorPictureDialog;
protected:
QVariant itemChange(GraphicsItemChange change, const QVariant & value);
void mouseReleaseEvent(QGraphicsSceneMouseEvent * event);
QVariant itemChange(GraphicsItemChange change, const QVariant & value);
void mouseReleaseEvent(QGraphicsSceneMouseEvent * event);
};
class MonitorPictureProxy: public QObject
{
Q_OBJECT
public:
MonitorPictureProxy(QObject *parent, MonitorPicture *monitorPicture);
MonitorPicture *monitorPicture;
public slots:
void updateSize();
void updatePosition();
};

@ -24,58 +24,15 @@
<item>
<widget class="QCheckBox" name="magneticCheckBox">
<property name="text">
<string>Magnetic attraction</string>
<string>Keep monitors attached</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>MonitorPictureDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>MonitorPictureDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
<connections/>
</ui>

@ -17,281 +17,182 @@
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "monitorsettingsdialog.h"
#include <QVBoxLayout>
#include <QFrame>
#include <QLabel>
#include <QComboBox>
#include <QProcess>
#include <QGroupBox>
#include <QMessageBox>
#include <QFile>
#include <QDir>
#include <QTimer>
#include <QProgressBar>
#include <QInputDialog>
#include <QDebug>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonDocument>
#include "monitorwidget.h"
#include "timeoutdialog.h"
#include "xrandr.h"
#include "monitorpicture.h"
#include "settingsdialog.h"
MonitorSettingsDialog::MonitorSettingsDialog(MonitorSettingsBackend* backend, LXQt::Settings *applicationSettings):
QDialog(NULL, 0),
LVDS(NULL) {
timeoutDialog = NULL;
timer = NULL;
this->applicationSettings = applicationSettings;
this->backend = backend;
backend->setParent(this);
setupUi();
}
#include <KScreen/Output>
#include <QJsonObject>
#include <QJsonArray>
#include <QSettings>
#include <QJsonDocument>
#include <KScreen/EDID>
#include <QFile>
#include <QDir>
#include <QFileInfo>
#include <QMessageBox>
MonitorSettingsDialog::~MonitorSettingsDialog() {
MonitorSettingsDialog::MonitorSettingsDialog() :
QDialog(nullptr, 0)
{
ui.setupUi(this);
KScreen::GetConfigOperation *operation = new KScreen::GetConfigOperation();
connect(operation, &KScreen::GetConfigOperation::finished, [this, operation] (KScreen::ConfigOperation *op) {
KScreen::GetConfigOperation *configOp = qobject_cast<KScreen::GetConfigOperation *>(op);
if (configOp)
{
mOldConfig = configOp->config()->clone();
loadConfiguration(configOp->config());
operation->deleteLater();
}
});
connect(ui.buttonBox, &QDialogButtonBox::clicked, [&] (QAbstractButton *button) {
if (ui.buttonBox->standardButton(button) == QDialogButtonBox::Apply)
applyConfiguration(false);
if (ui.buttonBox->standardButton(button) == QDialogButtonBox::Save)
{
applyConfiguration(true);
}
});
ui.settingsButton->hide(); // Hide settings button until daemon works OK.
connect(ui.settingsButton, SIGNAL(clicked()), this, SLOT(showSettingsDialog()));
}
MonitorSettingsDialog::~MonitorSettingsDialog()
{
}
void MonitorSettingsDialog::loadConfiguration(KScreen::ConfigPtr config)
{
if (mConfig == config)
return;
void MonitorSettingsDialog::deleteTimeoutData() {
timeoutDialog = NULL;
Q_FOREACH(MonitorInfo * monitorInfo, timeoutSettings) {
delete monitorInfo;
}
timeoutSettings.clear();
}
mConfig = config;
void MonitorSettingsDialog::onCancelSettings() {
// restore the old settings
QList<MonitorSettings*> settings;
Q_FOREACH(MonitorInfo * monitorInfo, timeoutSettings) {
settings.append((MonitorSettings*)monitorInfo);
}
backend->setMonitorsSettings(settings);
deleteTimeoutData();
}
MonitorPictureDialog *monitorPicture = nullptr;
KScreen::OutputList outputs = mConfig->outputs();
QList<MonitorSettings*> MonitorSettingsDialog::getMonitorsSettings() {
// Build list of monitor and their settings
QList<MonitorSettings*> settings;
Q_FOREACH(MonitorWidget * monitor, monitors) {
MonitorSettings* s = monitor->getSettings();
settings.append(s);
if(ui.primaryCombo->currentText() == monitor->monitorInfo->name)
s->primaryOk = true;
}
if(ui.unify->isChecked()) {
Q_FOREACH(MonitorSettings * s, settings) {
s->position = MonitorSettings::None;
}
}
return settings;
}
void MonitorSettingsDialog::setMonitorsConfig() {
deleteTimeoutData();
timeoutSettings = backend->getMonitorsInfo();
// Show timeout dialog
timeoutDialog = new TimeoutDialog(this);
connect(timeoutDialog, SIGNAL(rejected()), this, SLOT(onCancelSettings()));
connect(timeoutDialog, SIGNAL(finished(int)), timeoutDialog, SLOT(deleteLater()));
// Build list of monitor and their settings
QList<MonitorSettings*> settings = getMonitorsSettings();
backend->setMonitorsSettings(settings);
Q_FOREACH(MonitorSettings * s, settings) {
delete s;
}
timeoutDialog->show();
}
int nMonitors = 0;
for (const KScreen::OutputPtr &output : outputs)
{
if (output->isConnected())
nMonitors++;
// turn on both laptop LCD and the external monitor
void MonitorSettingsDialog::onUseBoth() {
if(monitors.length() == 0)
return;
ui.unify->setChecked(true);
MonitorWidget* monitor = monitors[0];
bool ok;
QString mode;
for(int i = 0; i < monitor->monitorInfo->modes.length(); i++) {
mode = monitor->monitorInfo->modes[i];
ok = true;
Q_FOREACH(MonitorWidget * monitor2, monitors) {
ok = ok && monitor2->monitorInfo->modes.contains(mode);
if (nMonitors > 1)
{
monitorPicture = new MonitorPictureDialog(config, this);
ui.monitorList->addItem(tr("Set position"));
ui.stackedWidget->addWidget(monitorPicture);
break;
}
}
if(ok)
break;
}
qDebug() << "Mode selected" << mode << ok;
Q_FOREACH(MonitorWidget * monitor2, monitors) {
int index = monitor2->monitorInfo->modes.indexOf(mode) + 1;
if(monitor2->ui.resolutionCombo->count() > index)
monitor2->ui.resolutionCombo->setCurrentIndex(index);
else
monitor2->chooseMaxResolution();
monitor2->enableMonitor(true);
qDebug() << "Mode selected index" << index << "Mode" << monitor->ui.resolutionCombo->currentText();
}
setMonitorsConfig();
}
// external monitor only
void MonitorSettingsDialog::onExternalOnly() {
Q_FOREACH(MonitorWidget * monitor, monitors) {
monitor->chooseMaxResolution();
monitor->enableMonitor(monitor != LVDS);
}
setMonitorsConfig();
}
// laptop panel - LVDS only
void MonitorSettingsDialog::onLaptopOnly() {
Q_FOREACH(MonitorWidget * monitor, monitors) {
monitor->chooseMaxResolution();
monitor->enableMonitor(monitor == LVDS);
}
setMonitorsConfig();
}
void MonitorSettingsDialog::onExtended() {
ui.unify->setChecked(false);
int virtualWidth = 0;
Q_FOREACH(MonitorWidget * monitor, monitors) {
monitor->chooseMaxResolution();
monitor->enableMonitor(true);
monitor->disablePositionOption(false);
QString modeName = monitor->ui.resolutionCombo->currentText();
int modeWidth = monitor->monitorInfo->monitorModes[modeName]->width;
monitor->ui.xPosSpinBox->setValue(virtualWidth);
monitor->ui.yPosSpinBox->setValue(0);
virtualWidth+=modeWidth;
}
setMonitorsConfig();
}
void MonitorSettingsDialog::setupUi() {
ui.setupUi(this);
connect(ui.positionPushButton, SIGNAL(clicked()), SLOT(onPositionButtonClicked()));
// Get monitors information
QList<MonitorInfo*> monitorsInfo = backend->getMonitorsInfo();
// Search if LVSD monitor is connected
hardwareIdentifier = "";
Q_FOREACH(MonitorInfo * monitorInfo, monitorsInfo) {
hardwareIdentifier+=monitorInfo->edid;
if(! LVDS && (monitorInfo->name.startsWith("LVDS") || monitorInfo->name.startsWith("PANEL"))) {
MonitorInfo::LVDS_Ok = true;
break;
}
}
int i = 0;
connect(ui.unify, SIGNAL(toggled(bool)), this, SLOT(disablePositionOption(bool)));
Q_FOREACH(MonitorInfo * monitorInfo, monitorsInfo) {
ui.primaryCombo->addItem(monitorInfo->name);
if(monitorInfo->primaryOk)
ui.primaryCombo->setCurrentIndex(ui.primaryCombo->findText(monitorInfo->name));
qDebug() << "Monitor" << monitorInfo->name;
MonitorWidget* monitor = new MonitorWidget(monitorInfo, monitorsInfo, this);
QString title = QString("Monitor %1: %2 (%3) %4")
.arg(i + 1)
.arg(monitor->monitorInfo->name)
.arg(monitor->monitorInfo->humanReadableName())
.arg(monitor->monitorInfo->vendor);
qDebug() << "Monitor" << title;
monitor->setTitle(title);
connect(ui.unify, SIGNAL(toggled(bool)), monitor, SLOT(disablePositionOption(bool)));
monitors.append(monitor);
if(! LVDS && (monitorInfo->name.startsWith("LVDS") || monitorInfo->name.startsWith("PANEL"))) {
LVDS = monitor;
}
ui.stackedWidget->addWidget(monitor);
ui.monitorList->addItem(monitor->monitorInfo->name);
++i;
}
ui.monitorList->setCurrentRow(0);
// set the max width of the list widget to the maximal width of its rows + the width of a vertical scrollbar.
ui.monitorList->setMaximumWidth(ui.monitorList->sizeHintForColumn(0) + style()->pixelMetric(QStyle::PM_ScrollBarExtent) + 40);
// are the monitors unified?
if(monitorsInfo.length() > 1)
ui.unify->setChecked(backend->isUnified(monitorsInfo));
else {// disable the option if we only have one monitor
ui.unify->setEnabled(false);
ui.positionPushButton->setEnabled(false);
}
// If this is a laptop and there is an external monitor, offer quick options
if(monitors.length() == 2) {
// If there is only two monitors,offer quick options
if(! LVDS) {
LVDS = monitors[0];
QList<MonitorWidget*> monitors;
for (const KScreen::OutputPtr &output : outputs)
{
if (output->isConnected())
{
MonitorWidget *monitor = new MonitorWidget(output, mConfig, this);
ui.monitorList->addItem(output->name());
ui.stackedWidget->addWidget(monitor);
monitors.append(monitor);
}
}
}
adjustSize();
}
if (monitorPicture)
monitorPicture->setScene(monitors);
void MonitorSettingsDialog::accept() {
setMonitorsConfig();
QDialog::accept();
ui.monitorList->setCurrentRow(0);
adjustSize();
}
void MonitorSettingsDialog::disablePositionOption(bool disable) {
ui.positionPushButton->setEnabled(!disable);
void MonitorSettingsDialog::applyConfiguration(bool saveConfigOk)
{
if (mConfig && KScreen::Config::canBeApplied(mConfig))
{
KScreen::SetConfigOperation(mConfig).exec();
TimeoutDialog mTimeoutDialog;
if (mTimeoutDialog.exec() == QDialog::Rejected)
KScreen::SetConfigOperation(mOldConfig).exec();
else
{
mOldConfig = mConfig->clone();
if (saveConfigOk)
saveConfiguration(mConfig);
}
}
}
void MonitorSettingsDialog::onPositionButtonClicked() {
MonitorPictureDialog *dialog = new MonitorPictureDialog(this);
dialog->setScene(monitors);
dialog->exec();
dialog->updateMonitorWidgets(ui.primaryCombo->currentText());
delete dialog;
void MonitorSettingsDialog::accept()
{
//applyConfiguration(true);
QDialog::accept();
}
void MonitorSettingsDialog::applySettings() {
setMonitorsConfig();
void MonitorSettingsDialog::reject()
{
QDialog::reject();
}
void MonitorSettingsDialog::saveSettings() {
// Save config and exit
QMessageBox msgBox;
msgBox.setText(tr("Do you want to save changes?"));
msgBox.setInformativeText(tr("Please, check the settings before saving."));
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Cancel);
int ret = msgBox.exec();
if( ret == QMessageBox::Cancel )
return;
bool ok;
QString configName = QInputDialog::getText(this, tr("Name"),
tr("Name:"), QLineEdit::Normal,
tr("Actual"), &ok);
if (!ok || configName.isEmpty())
return;
QList<MonitorSettings*> settings = getMonitorsSettings();
QString cmd = backend->getCommand(settings);
Q_FOREACH(MonitorSettings * s, settings) {
delete s;
void MonitorSettingsDialog::saveConfiguration(KScreen::ConfigPtr config)
{
QJsonObject json;
QJsonArray jsonArray;
KScreen::OutputList outputs = config->outputs();
for (const KScreen::OutputPtr &output : outputs)
{
QJsonObject monitorSettings;
monitorSettings["name"] = output->name();
KScreen::Edid* edid = output->edid();
if (edid && edid->isValid())
monitorSettings["hash"] = edid->hash();
monitorSettings["connected"] = output->isConnected();
if ( output->isConnected() )
{
monitorSettings["enabled"] = output->isEnabled();
monitorSettings["primary"] = output->isPrimary();
monitorSettings["xPos"] = output->pos().x();
monitorSettings["yPos"] = output->pos().y();
monitorSettings["currentMode"] = output->currentMode()->id();
monitorSettings["rotation"] = output->rotation();
}
jsonArray.append(monitorSettings);
}
json["outputs"] = jsonArray;
QSettings settings("LXQt", "lxqt-config-monitor");
settings.setValue("currentConfig", QVariant(QJsonDocument(json).toJson()));
QString desktop = QString("[Desktop Entry]\n"
"Type=Application\n"
"Name=LXQt-config-monitor autostart\n"
"Comment=Autostart monitor settings for LXQt-config-monitor\n"
"Exec=%1\n"
"OnlyShowIn=LXQt\n").arg(cmd);
// Check if ~/.config/autostart/ exists
ok = true;
QFileInfo fileInfo(QDir::homePath() + "/.config/autostart/");
if( ! fileInfo.exists() )
ok = QDir::root().mkpath(QDir::homePath() + "/.config/autostart/");
QFile file(QDir::homePath() + "/.config/autostart/lxqt-config-monitor-autostart.desktop");
"OnlyShowIn=LXQt\n").arg("lxqt-config-monitor -l");
// Check autostart path: $XDG_CONFIG_HOME or ~/.config/autostart
QString autostartPath;
bool ok = true;
if(qEnvironmentVariableIsSet("XDG_CONFIG_HOME"))
autostartPath = QString(qgetenv("XDG_CONFIG_HOME"));
else
{
autostartPath = QDir::homePath() + "/.config/autostart/";
// Check if ~/.config/autostart/ exists
QFileInfo fileInfo(autostartPath);
if( ! fileInfo.exists() )
ok = QDir::root().mkpath(autostartPath);
}
QFile file(autostartPath + "/lxqt-config-monitor-autostart.desktop");
if(ok)
ok = file.open(QIODevice::WriteOnly | QIODevice::Text);
if(!ok) {
@ -303,29 +204,17 @@ void MonitorSettingsDialog::saveSettings() {
out.flush();
file.close();
// Save config in applicationSettings
applicationSettings->beginGroup("configMonitor");
QJsonArray savedConfigs = QJsonDocument::fromJson(applicationSettings->value("saved").toByteArray()).array();
QJsonObject monitorConfig;
monitorConfig["hardwareIdentifier"] = hardwareIdentifier;
monitorConfig["command"] = cmd;
monitorConfig["name"] = configName;
savedConfigs.append(monitorConfig);
applicationSettings->setValue("saved", QVariant(QJsonDocument(savedConfigs).toJson()));
applicationSettings->endGroup();
emit(settingsSaved());
}
#include <QDialogButtonBox>
void MonitorSettingsDialog::processClickedFromDialog(QDialogButtonBox::StandardButton button)
void MonitorSettingsDialog::showSettingsDialog()
{
qDebug() << "[MonitorSettingsDialog::processClickedFromDialog]";
if(button == QDialogButtonBox::Apply)
setMonitorsConfig();
}
QByteArray configName = qgetenv("LXQT_SESSION_CONFIG");
QString MonitorSettingsDialog::getHardwareIdentifier()
{
return hardwareIdentifier;
if (configName.isEmpty())
configName = "MonitorSettings";
LXQt::Settings settings(configName);
SettingsDialog settingsDialog(tr("Advanced settings"), &settings);
settingsDialog.exec();
}

@ -17,70 +17,44 @@
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MONITORSETTINGSDIALOG_H
#define MONITORSETTINGSDIALOG_H
#include <QDialog>
#include <QDialogButtonBox>
#include <LXQt/Settings>
#include "ui_mainwindow.h"
#include "monitor.h"
#include "monitorwidget.h"
#include "ui_monitorsettingsdialog.h"
#include "timeoutdialog.h"
class TimeoutDialog;
class QTimer;
#include <QDialog>
#include <QTimer>
#include <KScreen/GetConfigOperation>
#include <KScreen/SetConfigOperation>
class MonitorSettingsDialog: public QDialog {
Q_OBJECT
class MonitorSettingsDialog : public QDialog
{
Q_OBJECT
public:
MonitorSettingsDialog(MonitorSettingsBackend* backend, LXQt::Settings *applicationSettings);
virtual ~MonitorSettingsDialog();
virtual void accept();
QString getHardwareIdentifier();
public Q_SLOTS:
// quick options
void onUseBoth();
void onExternalOnly();
void onLaptopOnly();
void onExtended();
// applying and saving settings
void applySettings();
void saveSettings();
// Apply settings from ConfigDialog
void processClickedFromDialog(QDialogButtonBox::StandardButton button);
MonitorSettingsDialog();
virtual ~MonitorSettingsDialog();
signals:
void settingsSaved();
virtual void accept();
virtual void reject();
private:
void setMonitorsConfig();
void setupUi();
QList<MonitorSettings*> getMonitorsSettings();
void deleteTimeoutData(); // Used to delete data from TimeoutDialog
void applyConfiguration(bool saveConfigOk);
void cancelConfiguration();
private Q_SLOTS:
// Timeout dialog signals
void onCancelSettings();
void onPositionButtonClicked();
void disablePositionOption(bool disable);
void loadConfiguration(KScreen::ConfigPtr config);
void showSettingsDialog();
private:
Ui::MonitorSettingsDialog ui;
QList<MonitorWidget*> monitors;
MonitorWidget* LVDS;
MonitorSettingsBackend* backend;
// TimeoutDialog data
TimeoutDialog* timeoutDialog;
QTimer* timer;
QList<MonitorInfo*> timeoutSettings;
LXQt::Settings *applicationSettings;
QString hardwareIdentifier;
void saveConfiguration(KScreen::ConfigPtr config);
Ui::MonitorSettingsDialog ui;
// Configutarions
KScreen::ConfigPtr mOldConfig;
KScreen::ConfigPtr mConfig;
};
#endif // MONITORSETTINGSDIALOG_H

@ -0,0 +1,136 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MonitorSettingsDialog</class>
<widget class="QDialog" name="MonitorSettingsDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>510</width>
<height>131</height>
</rect>
</property>
<property name="windowTitle">
<string>Monitor Settings</string>
</property>
<property name="windowIcon">
<iconset theme="preferences-desktop-display">
<normaloff/>
</iconset>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="childrenCollapsible">
<bool>false</bool>
</property>
<widget class="QListWidget" name="monitorList">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>150</width>
<height>0</height>
</size>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="resizeMode">
<enum>QListView::Adjust</enum>
</property>
</widget>
<widget class="QStackedWidget" name="stackedWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>300</width>
<height>0</height>
</size>
</property>
</widget>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QToolButton" name="settingsButton">
<property name="text">
<string>Settings</string>
</property>
<property name="icon">
<iconset theme="preferences-system"/>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
<property name="autoRaise">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Apply|QDialogButtonBox::Close|QDialogButtonBox::Save</set>
</property>
<property name="centerButtons">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>monitorList</sender>
<signal>currentRowChanged(int)</signal>
<receiver>stackedWidget</receiver>
<slot>setCurrentIndex(int)</slot>
<hints>
<hint type="sourcelabel">
<x>126</x>
<y>181</y>
</hint>
<hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>MonitorSettingsDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>338</x>
<y>439</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>257</y>
</hint>
</hints>
</connection>
</connections>
</ui>

@ -19,130 +19,329 @@
#include "monitorwidget.h"
#include "monitor.h"
#include <QDebug>
MonitorWidget::MonitorWidget(MonitorInfo* monitor, const QList<MonitorInfo*> monitorsInfo, QWidget* parent):
QGroupBox(parent) {
ui.enabled = NULL;
monitorInfo = monitor;
monitor->setParent(this); // take the ownership
ui.setupUi(this);
if(monitorsInfo.length() == 1) {
disablePositionOption(true);
// turn off screen is not allowed since there should be at least one monitor available.
ui.enabled->setEnabled(false);
}
ui.xPosSpinBox->setValue(monitor->xPos);
ui.yPosSpinBox->setValue(monitor->yPos);
if(monitor->enabledOk)
ui.enabled->setChecked(true);
connect(ui.resolutionCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onResolutionChanged(int)));
ui.resolutionCombo->addItem(tr("Auto"));
Q_FOREACH(QString _mode_line, monitor->modes) {
QVariant monitorModeInfo = QVariant::fromValue(monitor->monitorModes[_mode_line]);
ui.resolutionCombo->addItem(_mode_line, monitorModeInfo);
}
if(!monitor->currentMode.isEmpty())
ui.resolutionCombo->setCurrentIndex(ui.resolutionCombo->findText(monitor->currentMode));
else
ui.resolutionCombo->setCurrentIndex(0);
if(!monitor->currentRate.isEmpty())
ui.rateCombo->setCurrentIndex(ui.rateCombo->findText(monitor->currentRate));
else
ui.rateCombo->setCurrentIndex(0);
int brightness;
if( !monitorInfo->brightness.isEmpty() )
brightness = monitorInfo->brightness.toFloat()*100;
else
brightness = 100;
ui.brightnessSlider->setValue(brightness);
// Set gamma values
ui.redSpinBox->setSingleStep(0.01);
ui.greenSpinBox->setSingleStep(0.01);
ui.blueSpinBox->setSingleStep(0.01);
if(!monitor->gamma.isEmpty()) {
QStringList gammaValues = monitor->gamma.split(":");
ui.redSpinBox->setValue(gammaValues[0].toFloat());
ui.greenSpinBox->setValue(gammaValues[1].toFloat());
ui.blueSpinBox->setValue(gammaValues[2].toFloat());
}
//Set backlight values
if( !monitor->backlight.isEmpty() ) {
ui.backlightSlider->setMinimum(monitor->backlightMin.toInt());
ui.backlightSlider->setMaximum(monitor->backlightMax.toInt());
ui.backlightSlider->setSingleStep(1);
ui.backlightSlider->setValue(monitor->backlight.toInt());
} else {
ui.backlightSlider->setEnabled(false);
ui.backlightLabel->setEnabled(false);
}
}
void MonitorWidget::onResolutionChanged(int index) {
QComboBox* combo =ui.resolutionCombo;
QComboBox* rateCombo = ui.rateCombo;
QString mode = combo->currentText();
rateCombo->clear();
rateCombo->addItem(tr("Auto"));
if( monitorInfo->monitorModes.contains(mode)) {
QStringList mode_lines = combo->currentData().value<MonitorMode*>()->modeLines;
//QStringList mode_lines = monitorInfo->monitorModes[mode]->modeLines;
Q_FOREACH(QString rate, mode_lines) {
rateCombo->addItem(rate);
#include <QComboBox>
#include <QStringBuilder>
#include <QDialogButtonBox>
#include <KScreen/EDID>
QString modeToString(KScreen::ModePtr mode)
{
// mode->name() can be anything, not just widthxheight. eg if added with cvt.
return QString("%1x%2").arg(mode->size().width()).arg(mode->size().height());
}
KScreen::OutputPtr getOutputById(int id, KScreen::OutputList outputs)
{
for (const KScreen::OutputPtr &output : outputs)
if (output->id() == id)
return output;
return KScreen::OutputPtr(nullptr);
}
KScreen::ModePtr getModeById(QString id, KScreen::ModeList modes)
{
for (const KScreen::ModePtr &mode : modes)
if (mode->id() == id)
return mode;
return KScreen::ModePtr(NULL);
}
static bool sizeBiggerThan(const KScreen::ModePtr &modeA, const KScreen::ModePtr &modeB)
{
QSize sizeA = modeA->size();
QSize sizeB = modeB->size();
return sizeA.width() * sizeA.height() > sizeB.width() * sizeB.height();
}
MonitorWidget::MonitorWidget(KScreen::OutputPtr output, KScreen::ConfigPtr config, QWidget* parent) :
QGroupBox(parent)
{
this->output = output;
this->config = config;
ui.setupUi(this);
ui.enabledCheckbox->setChecked(output->isEnabled());
QList <KScreen::ModePtr> modeList = output->modes().values();
// Remove duplicate sizes
QMap<QString, KScreen::ModePtr> noDuplicateModes;
foreach(const KScreen::ModePtr &mode, modeList)
{
if( noDuplicateModes.keys().contains(modeToString(mode)) )
{
KScreen::ModePtr actual = noDuplicateModes[modeToString(mode)];
bool isActualPreferred = output->preferredModes().contains(actual->id());
bool isModePreferred = output->preferredModes().contains(mode->id());
if( ( mode->refreshRate() > actual->refreshRate() && !isActualPreferred ) || isModePreferred )
noDuplicateModes[modeToString(mode)] = mode;
}
else
noDuplicateModes[modeToString(mode)] = mode;
}
rateCombo->setCurrentIndex(0);
}
}
void MonitorWidget::disablePositionOption(bool disable) {
bool enable = !disable;
ui.xPosSpinBox->setEnabled(enable);
ui.yPosSpinBox->setEnabled(enable);
ui.xPosLabel->setEnabled(enable);
ui.yPosLabel->setEnabled(enable);
ui.positionLabel->setEnabled(enable);
}
MonitorSettings* MonitorWidget::getSettings() {
MonitorSettings* s = new MonitorSettings();
s->name = monitorInfo->name;
s->enabledOk = ui.enabled->isChecked();
s->currentMode = ui.resolutionCombo->currentText();
s->currentRate = ui.rateCombo->currentText();
if( ! ui.xPosSpinBox->isEnabled() ) { // If no unify monitor is selected, then position is disabled.
s->position = MonitorSettings::None;
} else {
s->position = MonitorSettings::Manual;
}
s->xPos=ui.xPosSpinBox->value();
s->yPos=ui.yPosSpinBox->value();
s->brightness = QString("%1").arg((float)(ui.brightnessSlider->value())/100.0);
s->gamma = QString("%1:%2:%3").arg(ui.redSpinBox->value()).arg(ui.greenSpinBox->value()).arg(ui.blueSpinBox->value());
if(ui.backlightSlider->isEnabled()) {
s->backlight = QString("%1").arg(ui.backlightSlider->value());
s->backlightMax = QString("%1").arg(ui.backlightSlider->maximum());
s->backlightMin = QString("%1").arg(ui.backlightSlider->minimum());
}
return s;
}
void MonitorWidget::chooseMaxResolution() {
if(ui.resolutionCombo->count() > 1)
ui.resolutionCombo->setCurrentIndex(1);
}
void MonitorWidget::enableMonitor(bool enable) {
ui.enabled->setChecked(enable);
// Sort modes by size
modeList = noDuplicateModes.values();
qSort(modeList.begin(), modeList.end(), sizeBiggerThan);
// Add each mode to the list
foreach (const KScreen::ModePtr &mode, modeList)
{
ui.resolutionCombo->addItem(modeToString(mode), mode->id());
if(output->preferredModes().contains(mode->id()))
{
// Make bold preferredModes
QFont font = ui.resolutionCombo->font();
font.setBold(true);
ui.resolutionCombo->setItemData(ui.resolutionCombo->count()-1, font, Qt::FontRole);
}
}
connect(ui.resolutionCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onResolutionChanged(int)));
// Select actual mode in list
if (output->currentMode())
{
// Set the current mode in dropdown
int idx = ui.resolutionCombo->findData(output->currentMode()->id());
if (idx < 0)
{
// Select mode with same size
foreach (const KScreen::ModePtr &mode, modeList)
{
if( mode->size() == output->currentMode()->size() )
idx = ui.resolutionCombo->findData(output->currentMode()->id());
}
}
if(idx < 0)
idx = ui.resolutionCombo->findData(output->preferredMode()->id());
if (idx >= 0)
ui.resolutionCombo->setCurrentIndex(idx);
}
updateRefreshRates();
// Update EDID information
// KScreen doesn't make much public but that's ok...
KScreen::Edid* edid = output->edid();
if (edid && edid->isValid())
{
ui.outputInfoLabel->setText(
tr("Name: %1\n").arg(edid->name()) %
tr("Vendor: %1\n").arg(edid->vendor()) %
tr("Serial: %1\n").arg(edid->serial()) %
tr("Display size: %1cm x %2cm\n").arg(edid->width()).arg(edid->height()) %
tr("Serial number: %1\n").arg(edid->serial()) %
tr("EISA device ID: %1\n").arg(edid->eisaId())
);
}
if (config->connectedOutputs().count() == 1)
{
setOnlyMonitor(true);
// There isn't always a primary output. Gross.
output->setPrimary(true);
}
else
{
for (const KScreen::OutputPtr &other : config->connectedOutputs())
{
// We can't clone ourselves, or an output that already clones another
if (other == output)
continue;
ui.clonesCombo->addItem(other->name(), other->id());
ui.relativeScreensCombo->addItem(other->name(), other->id());
}
connect(ui.clonesCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onCloneChanged(int)));
}
ui.xPosSpinBox->setValue(output->pos().x());
ui.yPosSpinBox->setValue(output->pos().y());
// Behavior chooser
if (output->isPrimary())
ui.behaviorCombo->setCurrentIndex(PrimaryDisplay);
else if (!output->clone())
{
// Is this right?
ui.behaviorCombo->setCurrentIndex(CloneDisplay);
int idx = ui.resolutionCombo->findData(output->clone()->id());
ui.clonesCombo->setCurrentIndex(idx);
}
else
ui.behaviorCombo->setCurrentIndex(ExtendDisplay);
// Insert orientations
ui.orientationCombo->addItem(tr("None"), KScreen::Output::None);
ui.orientationCombo->addItem(tr("Left"), KScreen::Output::Left);
ui.orientationCombo->addItem(tr("Right"), KScreen::Output::Right);
ui.orientationCombo->addItem(tr("Inverted"), KScreen::Output::Inverted);
switch(output->rotation())
{
case KScreen::Output::None:
ui.orientationCombo->setCurrentIndex(0);
break;
case KScreen::Output::Left:
ui.orientationCombo->setCurrentIndex(1);
break;
case KScreen::Output::Right:
ui.orientationCombo->setCurrentIndex(2);
break;
case KScreen::Output::Inverted:
ui.orientationCombo->setCurrentIndex(3);
break;
}
connect(ui.enabledCheckbox, SIGNAL(toggled(bool)), this, SLOT(onEnabledChanged(bool)));
connect(ui.behaviorCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onBehaviorChanged(int)));
connect(ui.positioningCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onPositioningChanged(int)));
connect(ui.xPosSpinBox, SIGNAL(valueChanged(int)), this, SLOT(onPositionChanged(int)));
connect(ui.yPosSpinBox, SIGNAL(valueChanged(int)), this, SLOT(onPositionChanged(int)));
connect(ui.orientationCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onOrientationChanged(int)));
// Force update behavior visibility
onBehaviorChanged(ui.behaviorCombo->currentIndex());
}
MonitorWidget::~MonitorWidget()
{
}
void MonitorWidget::onEnabledChanged(bool enabled)
{
output->setEnabled(enabled);
// If we're enabling a disabled output for the first time
if (enabled && !output->currentMode())
{
// order here matters
onResolutionChanged(ui.resolutionCombo->currentIndex());
onOrientationChanged(ui.orientationCombo->currentIndex());
onPositioningChanged(ui.positioningCombo->currentIndex());
onBehaviorChanged(ui.behaviorCombo->currentIndex());
}
}
void MonitorWidget::onOrientationChanged(int idx)
{
output->setRotation((KScreen::Output::Rotation) ui.orientationCombo->currentData().toInt(0));
}
void MonitorWidget::onBehaviorChanged(int idx)
{
// Behavior should match the index of the selected element
ui.positioningCombo->setVisible(idx == ExtendDisplay);
ui.clonesCombo->setVisible(idx == CloneDisplay);
ui.relativeScreensCombo->setVisible(idx == ExtendDisplay);
ui.xPosSpinBox->setVisible(idx == ExtendDisplay);
ui.yPosSpinBox->setVisible(idx == ExtendDisplay);
ui.relativeScreensCombo->setEnabled(true);
if(idx == CloneDisplay)
onCloneChanged(ui.clonesCombo->currentIndex());
output->setPrimary(idx == PrimaryDisplay);
}
void MonitorWidget::onCloneChanged(int idx)
{
KScreen::OutputPtr other = getOutputById(ui.clonesCombo->currentData().toInt(),
config->outputs());
output->setPos( other->pos() );
}
void MonitorWidget::onPositioningChanged(int idx)
{
// Update the x/y spinboxes with the correct values
KScreen::OutputPtr other = getOutputById(ui.relativeScreensCombo->currentData().toInt(),
config->outputs());
// TODO: Figure out what to do here
if (!other->currentMode() || !output->currentMode())
return;
QSize otherSize = other->currentMode()->size();
QSize thisSize = output->currentMode()->size();
int x = other->pos().x();
int y = other->pos().y();
switch (idx) {
case RightOf:
x += otherSize.width();
break;
case LeftOf:
x += thisSize.width();
break;
case Above:
y += otherSize.height();
break;
case Below:
y += thisSize.height();
break;
case Manually:
default:
break;
}
ui.xPosSpinBox->setValue(x);
ui.yPosSpinBox->setValue(y);
// Disable the other screens combo box if we don't need it
ui.relativeScreensCombo->setEnabled(idx && idx != Manually);
}
void MonitorWidget::onPositionChanged(int value)
{
output->setPos(QPoint(ui.xPosSpinBox->value(), ui.yPosSpinBox->value()));
}
void MonitorWidget::onResolutionChanged(int index)
{
output->setCurrentModeId(ui.resolutionCombo->currentData().toString());
updateRefreshRates();
}
void MonitorWidget::onRateChanged(int index)
{
output->setCurrentModeId(ui.rateCombo->currentData().toString());
}
void MonitorWidget::updateRefreshRates()
{
disconnect(ui.rateCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onRateChanged(int)));
ui.rateCombo->clear();
if (output->modes().size() < 0)
return;
KScreen::ModePtr selectedMode = output->currentMode();
if (selectedMode)
{
for (const KScreen::ModePtr &mode : output->modes())
if (mode->size() == selectedMode->size())
ui.rateCombo->addItem(tr("%1 Hz").arg(mode->refreshRate()), mode->id());
int idx = ui.rateCombo->findData(selectedMode->id());
if (idx >= 0)
ui.rateCombo->setCurrentIndex(idx);
}
connect(ui.rateCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onRateChanged(int)));
}
void MonitorWidget::setOnlyMonitor(bool isOnlyMonitor)
{
ui.enabledCheckbox->setEnabled(!isOnlyMonitor);
ui.behaviorCombo->setEnabled(!isOnlyMonitor);
ui.xPosSpinBox->setVisible(!isOnlyMonitor);
ui.yPosSpinBox->setVisible(!isOnlyMonitor);
ui.relativeScreensCombo->setVisible(!isOnlyMonitor);
ui.clonesCombo->setVisible(!isOnlyMonitor);
}

@ -17,37 +17,59 @@
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef _MONITORWIDGET_H_
#define _MONITORWIDGET_H_
#include "ui_monitorwidget.h"
#include <QGroupBox>
#include <QStringList>
#include <QHash>
#include <QList>
#include "ui_monitorwidget.h"
#include <KScreen/Config>
#include <KScreen/Output>
class MonitorInfo;
class MonitorSettings;
#define PrimaryDisplay 0
#define ExtendDisplay 1
#define CloneDisplay 2
// Monitor info
class MonitorWidget : public QGroupBox {
#define RightOf 0
#define LeftOf 1
#define Above 2
#define Below 3
#define Manually 4
class MonitorWidget : public QGroupBox
{
Q_OBJECT
friend class MonitorPicture;
friend class MonitorPictureDialog;
public:
MonitorWidget(MonitorInfo* monitor, const QList< MonitorInfo* > monitorsInfo, QWidget* parent = 0);
MonitorSettings* getSettings();
void chooseMaxResolution();
void enableMonitor(bool enable);
MonitorWidget(KScreen::OutputPtr output, KScreen::ConfigPtr config, QWidget* parent = 0);
~MonitorWidget();
MonitorInfo* monitorInfo;
void updateRefreshRates();
KScreen::OutputPtr output;
KScreen::ConfigPtr config;
Ui::MonitorWidget ui;
public Q_SLOTS:
void disablePositionOption(bool disabled);
void setOnlyMonitor(bool isOnlyMonitor);
private Q_SLOTS:
void onResolutionChanged(int);
void onEnabledChanged(bool);
void onBehaviorChanged(int);
void onPositioningChanged(int);
void onPositionChanged(int);
void onResolutionChanged(int);
void onRateChanged(int);
void onOrientationChanged(int);
void onCloneChanged(int);
private:
Ui::MonitorWidget ui;
};
#endif // _MONITORWIDGET_H_

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save